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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef RtspRtpProcessor_hxx
  2. #define RtspRtpProcessor_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 281421,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 RtspRtpProcessor_hxx_version =
  53.     "$Id: RtspRtpProcessor.hxx,v 1.19 2001/05/15 20:26:08 bko Exp $";
  54. #include "RtspSession.hxx"
  55. #include "Sptr.hxx"
  56. #include <set>
  57. /** Processes (play and record) rtp traffic for all the active sessions.<p>
  58.     <b>Play</b> - Timing is controlled by a timer fifo.  When playing is done 
  59.     (reach packet count or end of file reached), RtspRtpProcessor will move
  60.     session into pause state.  Processor also enforces pause points and queued
  61.     play requests for playing sessions.<p>
  62.     <b>Recording</b> - Timing is controlled by a blocking select() on the 
  63.     incoming rtp port.  Processor also enforces pause points.  However, queued
  64.     record requests are not supported.<p>
  65.     Play and record processing are done in seperate independent threads.
  66.     Processor has overload dection mechanism to reject processing new
  67.     sessions if cpu can't handle another session.<p>
  68.  */
  69. class RtspRtpProcessor
  70. {
  71.     public:
  72.         /** create a singelton object */
  73.         static RtspRtpProcessor& instance();
  74.         /** destructor */
  75.         virtual ~RtspRtpProcessor();
  76.         /** frees the memory associated with singelton instance */
  77.         static void destroy();
  78.         /** start rtp processor threads */
  79.         void startThread();
  80.         /** stop rtp processor threads */
  81.         void stopThread();
  82.         /** build the rtp port pool. Ports are not really reserved in rtp stack
  83.             @param low low rtp port range
  84.             @param high high rtp port range
  85.             @return false on falure (ie invalid port range). However, default 
  86.                     values are still set.
  87.          */
  88.         bool buildRtpPortList( const int low, const int high );
  89.         /** allocates a rtp port pair
  90.             @return rtp and rtcp port(rtp+1) allocated, or 0 on no port are
  91.                     available */
  92.         int allocateRtpPort();
  93.         /** deallocate a rtp port pair, false on failure
  94.             @param port rtp port to release
  95.             @return false of port not with high-low range (doesn't check if
  96.                     port was really allocated
  97.          */
  98.         bool deallocateRtpPort( const int port );
  99.         /** add inital rtp processor event.  Processor will place into play or
  100.             record processor.
  101.             @param session session to add to processor
  102.             @return false on failure (ie invalid session state or processor
  103.                     overloaded)
  104.          */
  105.         bool addInitalEvent( Sptr<RtspSession> session );
  106.         /** delete session from rtp processor
  107.             @return false if session in invalud state
  108.          */
  109.         bool delEvent( Sptr<RtspSession> session );
  110.         /** check if play thread is loaded.  This check assumes play requests 
  111.             are spread across time
  112.          */
  113.         bool playThreadLoaded();
  114.         /** check if record thread is loaded.  This check assumes record 
  115.             requests are spread across time
  116.          */
  117.         bool recordThreadLoaded();
  118.     private:
  119.         /** constructor */
  120.         RtspRtpProcessor();
  121.         /** singelton object */
  122.         static RtspRtpProcessor* myInstance;
  123.         // -- processor functions -----------------------
  124.         /** set of free rtp ports */
  125.         set<int> myRtpPortSet;
  126.         /** inital low rtp port range */
  127.         int myRtpPortLow;
  128.         /** inital high rtp port range */
  129.         int myRtpPortHigh;
  130.         // -- play functions ----------------------------
  131.         /** plays a rtp packet for a session */
  132.         bool playRtpPacket( Sptr<RtspSession> );
  133.         /** playing fifo - collection of playing sessions */
  134.         Fifo< Sptr<RtspSession> > myPlayingFifo;
  135.         /** common playing buffer for all sessions */
  136.         char* myPlayBuffer;
  137.         /** size of common playing buffer for all sessions */
  138.         int myPlayBufferMax;
  139.         // -- record functions --------------------------
  140.         /** records a rtp packet for a session */
  141.         void recordRtpPacket( Sptr<RtspSession> );
  142.         /** RecordingList type */
  143.         typedef list< Sptr<RtspSession> > RecordingList;
  144.         /** recording list type - collection of recording session */
  145.         RecordingList myRecordingList;
  146.         /** recording list mutex */
  147.         VMutex myRecordingListMutex;
  148.         /** fd set mutex */
  149.         VMutex myFdSetMutex;
  150.         /** max recording select fd */
  151.         int myMaxRecordFd;
  152.         /** recording select fd */
  153.         fd_set myBaseRecordFd;
  154.         /** recording select load fd */
  155.         fd_set myBaseRecordLoadFd;
  156.         /** previous number of record flags set */
  157.         int myPrevSelectResult;
  158.         /** */
  159.         RtpPacket* myRtpPacket;
  160.         /** */
  161.         char* myRecBuffer;
  162.         /** */
  163.         int myRecBufferMax;
  164.         // -- thread functions --------------------------
  165.         /** */
  166.         static void* playThreadWrapper( void* p );
  167.         /** */
  168.         static void* recordThreadWrapper( void* p );
  169.         /** */
  170.         void* runPlayThread();
  171.         /** */
  172.         void* runRecordThread();
  173.         /** thread for playing RTP traffic */
  174.         VThread myPlayThread;
  175.         /** thread for recording RTP traffic */
  176.         VThread myRecordThread;
  177.         /** */
  178.         VMutex myShutdownMutex;
  179.         /** */
  180.         bool myShutdown;
  181.     protected:
  182.         /** suppress copy constructor */
  183.         RtspRtpProcessor( const RtspRtpProcessor& );
  184.         /** suppress assignment operator */
  185.         RtspRtpProcessor& operator=( const RtspRtpProcessor& );
  186. };
  187. /* Local Variables: */
  188. /* c-file-style: "stroustrup" */
  189. /* indent-tabs-mode: nil */
  190. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  191. /* c-basic-offset: 4 */
  192. /* End: */
  193. #endif