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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef RTPRECEIVER_HXX
  2. #define RTPRECEIVER_HXX
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const RtpReceiver_hxx_Version =
  53.     "$Id: RtpReceiver.hxx,v 1.18 2001/05/07 19:12:50 kle Exp $";
  54. #include <sys/types.h>
  55. #include <map>
  56. #include "Sptr.hxx"
  57. #include "Fifo.h"
  58. #include "rtpTypes.h"
  59. #include "UdpStack.hxx"
  60. #include "RtpEvent.hxx"
  61. #include "NtpTime.hxx"
  62. #include "RtpEventReceiver.hxx"
  63. #include "NetworkAddress.h"
  64. class RtpPacket;
  65. class RtcpReceiver;
  66. /// Data structure for RTP Receiver
  67. class RtpReceiver : public RtpEventReceiver
  68. {
  69.     public:
  70.         /// using specified port
  71.         RtpReceiver (int localPort,
  72.                      RtpPayloadType apiFormat = rtpPayloadPCMU,
  73.                      RtpPayloadType networkFormat = rtpPayloadPCMU,
  74.                      int jitterNew = 0);
  75.         /// using port range
  76.         RtpReceiver (int localMinPort, int localMaxPort,
  77.                      RtpPayloadType apiFormat = rtpPayloadPCMU,
  78.                      RtpPayloadType networkFormat = rtpPayloadPCMU,
  79.                      int jitterNew = 0);
  80.         ///Giving UdpStack ptr
  81.         RtpReceiver (UdpStack* udp, RtpPayloadType apiFormat = rtpPayloadPCMU,
  82.                      RtpPayloadType networkFormat = rtpPayloadPCMU,
  83.                      int jitterNew = 0);
  84.         /// consturctor init (don't call this function)
  85.         void constructRtpReceiver (RtpPayloadType apiFormat,
  86.                                    RtpPayloadType networkFormat,
  87.                                    int jitterNew);
  88.         ///
  89.         ~RtpReceiver ();
  90.         /** Receive an RTP packet from buffer.
  91.             Do not delete packet, it's used in next recive call as replacement
  92.             @return NULL if not time to play packet
  93.          **/
  94.         RtpPacket* receive ();
  95.         /** Receives an RTP packet from network into buffer
  96.             @return NULL invalid packet, else packet pointer
  97.          **/
  98.         RtpPacket* getPacket ();
  99.         /** Update souce information
  100.          *  @return 0 not valid, 1 valid
  101.          **/
  102.         int updateSource (RtpPacket* packet);
  103.         /// Initalize source counters
  104.         void initSource (RtpPacket* packet);
  105.         /** Add source to receiver
  106.          *  @return 1 if transmitter on probation
  107.          **/
  108.         int addSource (RtpPacket* packet);
  109.         /// Remove source from receiver
  110.         void removeSource (RtpSrc src, int flag = 0);
  111.         /** Convert from rtp time to ntp time
  112.          *  using inital ntp time and sampleRate
  113.          **/
  114.         NtpTime rtp2ntp (RtpTime time);
  115.         /// Clears out buffer
  116.         //void clearBuffer ();
  117.         /// Prints out the sequencing of buffer
  118.         //void printBuffer ();
  119.         /// Empties pending network packets
  120.         void emptyNetwork ();
  121.         ///
  122.         void setRTCPrecv (RtcpReceiver* rtcpRecv);
  123.         ///
  124.         void setApiFormat (RtpPayloadType type, int no_samples, int packetSize = 0,
  125.                            RtpPacket* p = NULL, bool print = true);
  126.         ///
  127.         int getApiPktSampleSize ()
  128.         {
  129.             return api_pktSampleSize;
  130.         }
  131.         ///
  132.         void setApiPktSize (int size)
  133.         {
  134.             api_pktSampleSize = size;
  135.         }
  136.         ///
  137.         void setNetworkFormat (RtpPayloadType type, int no_samples, int packetSize = 0,
  138.                                RtpPacket* p = NULL, bool print = true);
  139.         ///
  140.         int getNetworkPktSampleSize ()
  141.         {
  142.             return network_pktSampleSize;
  143.         }
  144.         ///
  145.         void setNetworkPktSize (int size)
  146.         {
  147.             network_pktSampleSize = size;
  148.         }
  149.         ///
  150.         int getPacketReceived ()
  151.         {
  152.             return packetReceived;
  153.         }
  154.         ///
  155.         int getPayloadReceived ()
  156.         {
  157.             return payloadReceived;
  158.         }
  159.         ///
  160.         int getJitter ()
  161.         {
  162.             return jitter;
  163.         }
  164.         /// Port this stack is sending its singal
  165.         int getPort ()
  166.         {
  167.             return myStack->getRxPort();
  168.         }
  169.         /// Socket File Descriptor used for select()
  170.         int getSocketFD ()
  171.         {
  172.             return myStack->getSocketFD();
  173.         }
  174.         /// receiver error code;
  175.         RtpReceiverError receiverError;
  176.         /// get ptr of my UdpStack
  177.         UdpStack* getUdpStack()
  178.         {
  179.             return myStack;
  180.         }
  181.     private:
  182.         /// incoming buffer size, including RTP header
  183.         static const int IN_BUFFER_SIZE = 8192;
  184.         /// buffer size for single pkt
  185.         static const int RECV_BUF = 1012;
  186.         /// max misordering tolerated
  187.         static const int MISORDER = 6;
  188.         /// max number of sequental lost packets allowed
  189.         static const int PROB_MAX = 100;
  190.         /// source found flag
  191.         bool sourceSet;
  192.         /// SRC number for this source
  193.         RtpSrc ssrc;
  194.         /// probation set flag
  195.         bool probationSet;
  196.         /// wouldn't listen to this source
  197.         RtpSrc srcProbation;
  198.         /// probation, 0 source valid
  199.         int probation;
  200.         /// inital seqence number
  201.         RtpSeqNumber seedSeq;
  202.         /// inital NTP timestamp
  203.         NtpTime seedNtpTime;
  204.         /// inital RTP timestamp
  205.         RtpTime seedRtpTime;
  206.         /// rtp interval
  207.         RtpTime sampleRate;
  208.         /// payload specific sample rate
  209.         int baseSampleRate;
  210.         /// previous packet
  211.         RtpPacket* prevPacket;
  212.         /// next packet play time
  213.         NtpTime gotime;
  214.         /// number of packets received
  215.         int packetReceived;
  216.         /// number of bytes of payload received
  217.         int payloadReceived;
  218.         /// last packet RtpTime received 
  219.         RtpTime prevPacketRtpTime;
  220.         /// last RtpTime play
  221.         RtpTime prevRtpTime;
  222.         /// last NtpTime play
  223.         NtpTime prevNtpTime;
  224.         /// previous sequence number received
  225.         RtpSeqNumber prevSeqRecv;
  226.         /// previous sequence numer played
  227.         RtpSeqNumber prevSeqPlay;
  228.         /// number of received sequence number cycles
  229.         int recvCycles;
  230.         /// number of played sequence number cycles
  231.         int playCycles;
  232.         /// relative transmission time for prev packet
  233.         int transit;
  234.         /// estimated jitter
  235.         int jitter;
  236.         /// jitter time in ms time
  237.         int jitterTime;
  238.         /// jitter buffer
  239.         //map<RtpSeqNumber, RtpPacket*> jitterBuffer;
  240.         /// additional SDES and RTCP information
  241.         RtcpReceiver* rtcpRecv;
  242.         /// allow RTCP stack to probe for information
  243.         friend class RtcpTransmitter;
  244.         /// allow RTCP stack to probe for information
  245.         friend class RtcpReceiver;
  246.         /// format of payload for stack
  247.         RtpPayloadType apiFormat;
  248.         RtpPayloadType networkFormat;
  249.         /// number of samples per RTP packet on api (typical 160 or 240)
  250.         int api_pktSampleSize;
  251.         int network_pktSampleSize;
  252.         /// number of bytes per sample  (typical 1 or 2, used for endian conversion)
  253.         int apiFormat_perSampleSize;
  254.         int networkFormat_perSampleSize;
  255.         /// payload specific sample rate
  256.         int apiFormat_clockRate;
  257.         int networkFormat_clockRate;
  258.         int apiFormat_payloadSize;   // api_pktSampleSize*apiFormat_perSampleSize
  259.         int networkFormat_payloadSize;   // network_pktSampleSize * networkFormat_perSampleSize
  260.         /// inital jitter size
  261.         int jitterSeed;
  262.         /// silence packet template
  263.         char* silenceCodec;
  264.         /// my UDP stack
  265.         UdpStack* myStack;
  266.         /// should I free my stack?
  267.         bool freeStack;
  268.         /// buffer incoming rtp pkt from network
  269.         char inBuff[8192];
  270.         int inPos;
  271.         int playPos;
  272. };
  273. #endif // RTPRECEIVER_HXX