RtspSdp.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF 281421,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const RtspSdp_cxx_Version =
  51.     "$Id: RtspSdp.cxx,v 1.18 2001/05/15 20:26:12 bko Exp $";
  52. #include "RtspSdp.hxx"
  53. #include "SdpMedia.hxx"
  54. #include "SdpExceptions.hxx"
  55. #include "cpLog.h"
  56. RtspSdp::RtspSdp()
  57. {
  58.     // TODO trick sdp that it's valid
  59.     mySdpSession.setVersion( 0 );
  60. }
  61. RtspSdp::RtspSdp( const Data& contentData )
  62. {
  63.     decode( contentData );
  64. }
  65. /*
  66. RtspSdp&
  67. RtspSdp::operator=(const RtspSdp& src)
  68. {
  69.     if (&src != this )
  70.     {
  71.         mySdpSession = src.mySdpSession;
  72.     }
  73.     return (*this);
  74. }
  75. */
  76. void
  77. RtspSdp::decode( const Data& contentData )
  78. {
  79.     mySdpSession.decode( contentData );
  80.     if( !mySdpSession.isValidDescriptor() )
  81.     {
  82.         Data content2 = "v=0rno=- 12345 12345 IN IP4 0.0.0.0rns=Vovida RTSP Serverrnt=0 0rn";
  83.         content2 += contentData;
  84.         cpLog( LOG_DEBUG, "Building sdp object from partial contentDatan%s",
  85.                content2.getData() );
  86.         mySdpSession.decode( content2 );
  87.         if( !mySdpSession.isValidDescriptor() )
  88.         {
  89.             cpLog(LOG_ERR, "Sdp data is not valid");
  90.             return;
  91.         }
  92.     }
  93. }
  94. void
  95. RtspSdp::setConnAddress(const Data& connAddr)
  96. {
  97.     SdpConnection sdpConn;
  98.     sdpConn.setUnicast(connAddr);
  99.     mySdpSession.setConnection(sdpConn);
  100. }
  101. void
  102. RtspSdp::setOwnerAddress(const Data& ownerAddr)
  103. {
  104.     mySdpSession.setAddress(ownerAddr.getData());
  105. }
  106. void
  107. RtspSdp::setUserName(const Data& userName)
  108. {
  109.     mySdpSession.setUserName(userName.getData());
  110. }
  111. void
  112. RtspSdp::setSessionName(const Data& sessionName)
  113. {
  114.     mySdpSession.setSessionName(sessionName.getData());
  115. }
  116. void
  117. RtspSdp::addAttribute(const char* attribute, const char* value)
  118. {
  119.     SdpAttributes* attributes = mySdpSession.getAttribute();
  120.     ValueAttribute* attrib = new ValueAttribute();
  121.     attrib->setAttribute( attribute );
  122.     attrib->setValue( value );
  123.     if ( attributes == 0 )
  124.     {
  125.         attributes = new SdpAttributes();
  126.         assert( attributes );
  127.         mySdpSession.setAttribute(attributes);
  128.     }
  129.     attributes->addValueAttribute( attrib );
  130. }
  131. void
  132. RtspSdp::setMediaPort(int port)
  133. {
  134.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  135.     if (mediaList.size() == 0)
  136.     {
  137.         SdpMedia* media = new SdpMedia;
  138.         //due to SdpMedia has default format 0
  139.         media->clearFormatList();
  140.         mySdpSession.addMedia (media);
  141.         mediaList = mySdpSession.getMediaList();
  142.     }
  143.     mediaList[0]->setPort(port);
  144. }
  145. void
  146. RtspSdp::setMediaConnAddress(const Data& connAddr)
  147. {
  148.     SdpConnection sdpConn;
  149.     sdpConn.setUnicast(connAddr);
  150.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  151.     if (mediaList.size() == 0)
  152.     {
  153.         SdpMedia* media = new SdpMedia;
  154.         //due to SdpMedia has default format 0
  155.         media->clearFormatList();
  156.         mySdpSession.addMedia (media);
  157.         mediaList = mySdpSession.getMediaList();
  158.     }
  159.     mediaList[0]->setConnection(sdpConn);
  160. }
  161. void
  162. RtspSdp::addMediaAttribute(const char* attribute, const char* value)
  163. {
  164.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  165.     if (mediaList.size() == 0)
  166.     {
  167.         SdpMedia* media = new SdpMedia;
  168.         //due to SdpMedia has default format 0
  169.         media->clearFormatList();
  170.         mySdpSession.addMedia (media);
  171.         mediaList = mySdpSession.getMediaList();
  172.     }
  173.     ValueAttribute* attrib = new ValueAttribute();
  174.     attrib->setAttribute( attribute );
  175.     attrib->setValue( value );
  176.     MediaAttributes* mediaAttrib = mediaList[0]->getMediaAttributes();
  177.     if ( mediaAttrib == 0 )
  178.     {
  179.         mediaAttrib = new MediaAttributes();
  180.         assert( mediaAttrib );
  181.         mediaList[0]->setMediaAttributes( mediaAttrib );
  182.     }
  183.     mediaAttrib->addValueAttribute( attrib );
  184. }
  185. void
  186. RtspSdp::addMediaFormat(const int payloadType)
  187. {
  188.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  189.     if (mediaList.size() == 0)
  190.     {
  191.         SdpMedia* media = new SdpMedia;
  192.         //due to SdpMedia has default format 0
  193.         media->clearFormatList();
  194.         mySdpSession.addMedia (media);
  195.         mediaList = mySdpSession.getMediaList();
  196.     }
  197.     mediaList[0]->addFormat(payloadType);
  198. }
  199. void
  200. RtspSdp::addRtpmap(const int payloadType,
  201.                                 const Data& encodeName,
  202.                                 const int cloackRate)
  203. {
  204.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  205.     if (mediaList.size() == 0)
  206.     {
  207.         SdpMedia* media = new SdpMedia;
  208.         //due to SdpMedia has default format 0
  209.         media->clearFormatList();
  210.         mySdpSession.addMedia (media);
  211.         mediaList = mySdpSession.getMediaList();
  212.     }
  213.     SdpRtpMapAttribute* rtpMapAttrib = new SdpRtpMapAttribute();
  214.     rtpMapAttrib->setPayloadType( payloadType );
  215.     rtpMapAttrib->setEncodingName( encodeName.getData() );
  216.     rtpMapAttrib->setClockRate( cloackRate );
  217.     MediaAttributes* mediaAttrib = mediaList[0]->getMediaAttributes();
  218.     if ( mediaAttrib == 0 )
  219.     {
  220.         mediaAttrib = new MediaAttributes();
  221.         assert( mediaAttrib );
  222.         mediaList[0]->setMediaAttributes( mediaAttrib );
  223.     }
  224.     mediaAttrib->addmap( rtpMapAttrib );
  225. }
  226. Data
  227. RtspSdp::getConnAddress()
  228. {
  229.     SdpConnection* conn = mySdpSession.getConnection();
  230.     if (conn)
  231.     {
  232.         return Data( conn->getUnicast() );
  233.     }
  234.     
  235.     return "";
  236. }
  237. Data
  238. RtspSdp::getOwnerAddress()
  239. {
  240.     return Data(mySdpSession.getAddress());
  241. }
  242. Data
  243. RtspSdp::getUserName()
  244. {
  245.     return Data(mySdpSession.getUserName());
  246. }
  247. Data
  248. RtspSdp::getSessionName()
  249. {
  250.     return Data(mySdpSession.getSessionName());
  251. }
  252. Data
  253. RtspSdp::getAttributeValue(const char* attribute)
  254. {
  255.     Data value;
  256.     SdpAttributes* attributes = mySdpSession.getAttribute();
  257.     if (attributes != 0)
  258.     {
  259.         vector < ValueAttribute* > * valueAttribList = 
  260.             attributes->getValueAttributes();
  261.     
  262.         if ( valueAttribList->size() == 0 )
  263.         {
  264.             cpLog( LOG_DEBUG, "No value attribute in the sdp session" );
  265.         }
  266.         else
  267.         {
  268.             vector < ValueAttribute* > ::iterator attribIterator = 
  269.                 valueAttribList->begin();
  270.     
  271.             while ( attribIterator != valueAttribList->end() )
  272.             {
  273.                 char* attribName = (*attribIterator)->getAttribute();
  274.                 if ( strcmp( attribName, attribute ) == 0 )
  275.                 {
  276.                     value = Data( (*attribIterator)->getValue() );
  277.                     break;
  278.                 }
  279.                 attribIterator++;
  280.             }
  281.         }
  282.     }
  283.     else
  284.     {
  285.         cpLog( LOG_DEBUG, "No session level attribute in this sdp" );
  286.     }
  287.     return value;
  288. }
  289. int
  290. RtspSdp::getMediaPort()
  291. {
  292.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  293.     if (mediaList.size() == 0)
  294.     {
  295.         cpLog(LOG_DEBUG, "There is no mediaList.");
  296.         return 0;
  297.     }
  298.     return mediaList[0]->getPort();
  299. }
  300. Data
  301. RtspSdp::getMediaConnAddress()
  302. {
  303.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  304.     if (mediaList.size() > 0)
  305.     {
  306.         SdpConnection* conn = mediaList[0]->getConnection();
  307.         if (conn)
  308.         {
  309.             return Data( conn->getUnicast() );
  310.         }
  311.     }
  312.     
  313.     return "";
  314. }
  315. Data
  316. RtspSdp::getMediaAttributeValue(const char* attribute)
  317. {
  318.     Data value;
  319.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  320.     if (mediaList.size() > 0)
  321.     {
  322.         MediaAttributes* mediaAttrib = mediaList[0]->getMediaAttributes();
  323.         if ( mediaAttrib != 0 )
  324.         {
  325.             vector < ValueAttribute* > * valueAttribList = 
  326.                 mediaAttrib->getValueAttributes();
  327.     
  328.             if ( valueAttribList->size() == 0 )
  329.             {
  330.                 cpLog( LOG_DEBUG, "No value attribute in the first media" );
  331.             }
  332.             else
  333.             {
  334.                 vector < ValueAttribute* > ::iterator attribIterator = 
  335.                     valueAttribList->begin();
  336.     
  337.                 while ( attribIterator != valueAttribList->end() )
  338.                 {
  339.                     char* attribName = (*attribIterator)->getAttribute();
  340.                     if ( strcmp( attribName, attribute ) == 0 )
  341.                     {
  342.                         value = Data( (*attribIterator)->getValue() );
  343.                         break;
  344.                     }
  345.                     attribIterator++;
  346.                 }
  347.             }
  348.         }
  349.         else
  350.         {
  351.             cpLog( LOG_DEBUG, "No media attributes in first SdpMedia" );
  352.         }
  353.     }
  354.     else
  355.     {
  356.         cpLog( LOG_DEBUG, "No media in this sdp" );
  357.     }
  358.     return value;
  359. }
  360. vector < int > *
  361. RtspSdp::getMediaFormatList()
  362. {
  363.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  364.     if (mediaList.size() > 0)
  365.     {
  366.         return mediaList[0]->getFormatList();
  367.     }
  368.     else
  369.     {
  370.         cpLog(LOG_DEBUG, "no formatList.");
  371.         return 0;
  372.     }
  373. }
  374. vector < SdpRtpMapAttribute* > *
  375. RtspSdp::getRtpmapList()
  376. {
  377.     vector < SdpMedia* > mediaList = mySdpSession.getMediaList();
  378.     if (mediaList.size() > 0)
  379.     {
  380.         if (mediaList[0]->getMediaAttributes() == 0)
  381.         {
  382.             cpLog(LOG_DEBUG, "media attribute is empty");
  383.             return 0;
  384.         }
  385.         return (mediaList[0]->getMediaAttributes())->getmap();
  386.     }
  387.     else
  388.     {
  389.         cpLog(LOG_DEBUG, "media list is empty");
  390.         return 0;
  391.     }
  392. }
  393. /* Local Variables: */
  394. /* c-file-style: "stroustrup" */
  395. /* indent-tabs-mode: nil */
  396. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  397. /* c-basic-offset: 4 */
  398. /* End: */