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

流媒体/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 $1,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 RtpPacket_cxx_Version =
  51.     "$Id: RtpPacket.cxx,v 1.8 2001/03/21 21:14:56 kimle Exp $";
  52. #include <iostream>
  53. #include <stdlib.h>
  54. #include <stdio.h>
  55. #include <time.h>
  56. #include <assert.h>
  57. #include <sys/types.h>
  58. #include "vtypes.h"
  59. #include <unistd.h>
  60. #include <string.h>
  61. //#include <map>
  62. //#include <utility>                     // pair
  63. // error handling
  64. //#include <errno.h>
  65. // network socket
  66. //#include <netinet/in.h>                // struct socketaddr_in
  67. //#include <sys/socket.h>
  68. //#include <netdb.h>
  69. #include "cpLog.h"
  70. #include "vsock.hxx"
  71. #include "NetworkAddress.h"
  72. #include "NtpTime.hxx"
  73. #include "rtpTypes.h"
  74. #include "rtpTools.hxx"
  75. #include "Rtp.hxx"
  76. #include "Rtcp.hxx"
  77. #include "rtpCodec.h"
  78. /* ----------------------------------------------------------------- */
  79. /* --- RtpPacket Constructor --------------------------------------- */
  80. /* ----------------------------------------------------------------- */
  81. RtpPacket::RtpPacket (int newpayloadSize, int npadSize, int csrc_count)
  82. {
  83.     packetData = NULL;
  84.     header = NULL;
  85.     // check given paramters
  86.     assert (csrc_count >= 0);
  87.     assert (csrc_count <= 15);
  88.     assert (newpayloadSize >= 0);
  89.     assert (npadSize >= 0);
  90.     // create memory allocation
  91.     packetAlloc = sizeof(RtpHeader) - sizeof(RtpSrc)
  92.                   + csrc_count * sizeof(RtpSrc) + newpayloadSize + npadSize;
  93.     assert (packetAlloc < RTP_MTU);
  94.     packetData = new char[packetAlloc];
  95.     assert (packetData);
  96.     memset (packetData, 0, packetAlloc);
  97.     // set private variables
  98.     header = reinterpret_cast < RtpHeader* > (packetData);
  99.     setPadbyteSize (npadSize);
  100.     setPayloadUsage (0);
  101.     assert (unusedSize == newpayloadSize);
  102.     // set rtp header values
  103.     header->version = RTP_VERSION;
  104.     header->padding = (npadSize > 0) ? 1 : 0;
  105.     header->extension = 0;
  106.     header->count = csrc_count;
  107.     header->marker = 0;
  108.     header->type = rtpPayloadUndefined;
  109.     header->sequence = 0;
  110.     header->timestamp = 0;
  111.     // set flags
  112.     sequenceSet = false;
  113.     timestampSet = false;
  114. }
  115. /*
  116. RtpPacket::RtpPacket (char* memory, int size) 
  117. {
  118.     packetData = NULL;
  119.     header = NULL;
  120.  
  121.     // check given paramters
  122.     assert (memory);
  123.     assert (size >= 12);
  124.  
  125.     // memory allocation
  126.     packetData = memory;
  127.  
  128.     // set private variables
  129.     header = reinterpret_cast<RtpHeader*>(packetData);
  130.     packetAlloc = size;
  131.     setPayloadUsage (getPayloadSize());
  132.     assert (unusedSize == 0);
  133. }
  134. */
  135. // clones the rtp header
  136. RtpPacket::RtpPacket (RtpPacket* clone, int newpayloadSize)
  137. {
  138.     packetData = NULL;
  139.     header = NULL;
  140.     // create memory allocation
  141.     packetAlloc = sizeof(RtpHeader) - sizeof(RtpSrc)
  142.                   + clone->getCSRCcount() * sizeof(RtpSrc)
  143.                   + newpayloadSize + clone->getPadbyteSize();
  144.     assert (packetAlloc < RTP_MTU);
  145.     packetData = new char[packetAlloc];
  146.     assert (packetData);
  147.     memset (packetData, 0, packetAlloc);
  148.     // set private variables
  149.     header = reinterpret_cast < RtpHeader* > (packetData);
  150.     setPadbyteSize (clone->getPadbyteSize());
  151.     setPayloadUsage (0);
  152.     assert (unusedSize == newpayloadSize);
  153.     // clone header
  154.     setVersion (clone->getVersion());
  155.     setPaddingFlag (clone->getPaddingFlag());
  156.     setExtFlag (clone->getExtFlag());
  157.     setCSRCcount (clone->getCSRCcount());
  158.     setMarkerFlag (clone->getMarkerFlag());
  159.     setPayloadType (clone->getPayloadType());
  160.     setSequence (clone->getSequence());
  161.     setRtpTime (clone->getRtpTime());
  162.     assert (getSequence() == clone->getSequence());
  163.     // set flags
  164.     sequenceSet = false;
  165.     timestampSet = false;
  166. }
  167. RtpPacket::~RtpPacket ()
  168. {
  169.     if (packetData != NULL)
  170.     {
  171.         delete []packetData; packetData = NULL;
  172.     }
  173.     header = NULL;
  174. }
  175. /* --- Size and Locations ------------------------------------------ */
  176. /*     payload          */
  177. char* RtpPacket::getPayloadLoc ()
  178. {
  179.     assert (header);
  180.     return (packetData + sizeof(RtpHeader) - sizeof(RtpSrc)
  181.             + (header->count)*sizeof(RtpSrc));
  182. }
  183. int RtpPacket::getPayloadSize ()
  184. {
  185.     assert (header);
  186.     return (packetAlloc - sizeof(RtpHeader) + sizeof(RtpSrc)
  187.             - (header->count)*sizeof(RtpSrc) - getPadbyteSize());
  188. }
  189. void RtpPacket::setPayloadUsage (int size)
  190. {
  191.     if (!(size <= getPayloadSize()))
  192.         cerr << "ERR" << size << " " << getPayloadSize();
  193.     assert (size <= getPayloadSize());
  194.     unusedSize = getPayloadSize() - size;
  195. }
  196. int RtpPacket::getPayloadUsage ()
  197. {
  198.     return getPayloadSize() - unusedSize;
  199. }
  200. /*     padbyte          */
  201. char* RtpPacket::getPadbyteLoc ()
  202. {
  203.     return getPayloadLoc() + getPayloadSize();
  204. }
  205. void RtpPacket::setPadbyteSize (int size)
  206. {
  207.     // future: not implemented
  208.     // ? write size to last octlet of packetData
  209. }
  210. int RtpPacket::getPadbyteSize ()
  211. {
  212.     // future: not implemented
  213.     // ? read last octlet of packetData
  214.     return 0;
  215. }
  216. /* --- Packet Information ------------------------------------------ */
  217. /*     payload type     */
  218. void RtpPacket::setPayloadType (RtpPayloadType type)
  219. {
  220.     assert (type >= 0);
  221.     assert (type <= 127);
  222.     header->type = type;
  223. }
  224. RtpPayloadType RtpPacket::getPayloadType ()
  225. {
  226.     return static_cast < RtpPayloadType > (header->type);
  227. }
  228. /*     sequence number  */
  229. void RtpPacket::setSequence (RtpSeqNumber nseq)
  230. {
  231.     assert (header);
  232.     sequenceSet = true;
  233.     header->sequence = htons(nseq);
  234. }
  235. RtpSeqNumber RtpPacket::getSequence ()
  236. {
  237.     assert (header);
  238.     return ntohs(header->sequence);
  239. }
  240. /*     timestamp        */
  241. void RtpPacket::setRtpTime (RtpTime time)
  242. {
  243.     assert (header);
  244.     timestampSet = true;
  245.     header->timestamp = htonl(time);
  246. }
  247. RtpTime RtpPacket::getRtpTime ()
  248. {
  249.     assert (header);
  250.     return ntohl(header->timestamp);
  251. }
  252. /*     ssrc             */
  253. void RtpPacket::setSSRC (RtpSrc src)
  254. {
  255.     assert (header);
  256.     header->ssrc = htonl(src);
  257. }
  258. RtpSrc RtpPacket::getSSRC ()
  259. {
  260.     assert (header);
  261.     return ntohl(header->ssrc);
  262. }
  263. /*     csrc             */
  264. int RtpPacket::getCSRCcount ()
  265. {
  266.     assert (header);
  267.     return header->count;
  268. }
  269. // use with caution
  270. void RtpPacket::setCSRCcount (int i)
  271. {
  272.     assert (header);
  273.     header->count = i;
  274. }
  275. void RtpPacket::setCSRC (RtpSrc src, unsigned int i)
  276. {
  277.     assert (header);
  278.     assert (i >= 1);
  279.     assert (i <= header->count);
  280.     RtpSrc* srcPtr = &(header->startOfCsrc);
  281.     *(srcPtr + i - 1) = htonl(src);
  282. }
  283. RtpSrc RtpPacket::getCSRC (unsigned int i)
  284. {
  285.     assert (header);
  286.     assert (i >= 1);
  287.     assert (i <= header->count);
  288.     RtpSrc* srcPtr = &(header->startOfCsrc);
  289.     return ntohl(*(srcPtr + i - 1));
  290. }
  291. bool RtpPacket::isValid()
  292. {
  293.     // check packet size
  294.     if( getTotalUsage() <= 0 )
  295.         return false;
  296.     // check version
  297.     if( getVersion() != RTP_VERSION )
  298.     {
  299.         cpLog( LOG_DEBUG_STACK, "Wrong RTP version" );
  300.         return false;
  301.     }
  302.     // modify known payload types
  303.     switch( getPayloadType() )
  304.     {
  305.         case( 13 ):
  306.         {
  307.             setPayloadType( rtpPayloadPCMU );
  308.             break;
  309.         }
  310.         default:
  311.             break;
  312.     }
  313.     return true;
  314. }
  315. void RtpPacket::printPacket ()
  316. {
  317.     //printBits (packetData, getTotalUsage());
  318.     cerr << "n-----------------------------------n";
  319.     cerr << "PacketAlloc: " << getPacketAlloc() << "  ";
  320.     cerr << "PayloadSize: " << getPayloadSize() << "  ";
  321.     cerr << "PayloadUsage: " << getPayloadUsage() << "  ";
  322.     cerr << endl;
  323.     cerr << "Unused: " << getUnused() << "  ";
  324.     cerr << "TotalUsage: " << getTotalUsage();
  325.     cerr << "n-----------------------------------n";
  326.     cerr << getVersion() << " " << getPaddingFlag() << " " << getExtFlag() << " ";
  327.     cerr << getCSRCcount() << " " << getMarkerFlag() << " ";
  328.     cerr << (unsigned int)getPayloadType() << " ";
  329.     cerr << getSequence() << "  " << getRtpTime() << "  " << getSSRC();
  330.     cerr << "n-----------------------------------n";
  331.     return ;
  332. }