Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
     12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
     13 
     14 #include "webrtc/base/scoped_ptr.h"
     15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
     16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     17 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
     18 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
     19 #include "webrtc/typedefs.h"
     20 
     21 namespace webrtc {
     22 
     23 class TelephoneEventHandler;
     24 
     25 // This strategy deals with media-specific RTP packet processing.
     26 // This class is not thread-safe and must be protected by its caller.
     27 class RTPReceiverStrategy {
     28  public:
     29   static RTPReceiverStrategy* CreateVideoStrategy(RtpData* data_callback);
     30   static RTPReceiverStrategy* CreateAudioStrategy(
     31       RtpData* data_callback,
     32       RtpAudioFeedback* incoming_messages_callback);
     33 
     34   virtual ~RTPReceiverStrategy() {}
     35 
     36   // Parses the RTP packet and calls the data callback with the payload data.
     37   // Implementations are encouraged to use the provided packet buffer and RTP
     38   // header as arguments to the callback; implementations are also allowed to
     39   // make changes in the data as necessary. The specific_payload argument
     40   // provides audio or video-specific data. The is_first_packet argument is true
     41   // if this packet is either the first packet ever or the first in its frame.
     42   virtual int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
     43                                  const PayloadUnion& specific_payload,
     44                                  bool is_red,
     45                                  const uint8_t* payload,
     46                                  size_t payload_length,
     47                                  int64_t timestamp_ms,
     48                                  bool is_first_packet) = 0;
     49 
     50   virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0;
     51 
     52   // Retrieves the last known applicable frequency.
     53   virtual int GetPayloadTypeFrequency() const = 0;
     54 
     55   // Computes the current dead-or-alive state.
     56   virtual RTPAliveType ProcessDeadOrAlive(
     57       uint16_t last_payload_length) const = 0;
     58 
     59   // Returns true if we should report CSRC changes for this payload type.
     60   // TODO(phoglund): should move out of here along with other payload stuff.
     61   virtual bool ShouldReportCsrcChanges(uint8_t payload_type) const = 0;
     62 
     63   // Notifies the strategy that we have created a new non-RED payload type in
     64   // the payload registry.
     65   virtual int32_t OnNewPayloadTypeCreated(
     66       const char payloadName[RTP_PAYLOAD_NAME_SIZE],
     67       int8_t payloadType,
     68       uint32_t frequency) = 0;
     69 
     70   // Invokes the OnInitializeDecoder callback in a media-specific way.
     71   virtual int32_t InvokeOnInitializeDecoder(
     72       RtpFeedback* callback,
     73       int8_t payload_type,
     74       const char payload_name[RTP_PAYLOAD_NAME_SIZE],
     75       const PayloadUnion& specific_payload) const = 0;
     76 
     77   // Checks if the payload type has changed, and returns whether we should
     78   // reset statistics and/or discard this packet.
     79   virtual void CheckPayloadChanged(int8_t payload_type,
     80                                    PayloadUnion* specific_payload,
     81                                    bool* should_discard_changes);
     82 
     83   virtual int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const;
     84 
     85   // Stores / retrieves the last media specific payload for later reference.
     86   void GetLastMediaSpecificPayload(PayloadUnion* payload) const;
     87   void SetLastMediaSpecificPayload(const PayloadUnion& payload);
     88 
     89  protected:
     90   // The data callback is where we should send received payload data.
     91   // See ParseRtpPacket. This class does not claim ownership of the callback.
     92   // Implementations must NOT hold any critical sections while calling the
     93   // callback.
     94   //
     95   // Note: Implementations may call the callback for other reasons than calls
     96   // to ParseRtpPacket, for instance if the implementation somehow recovers a
     97   // packet.
     98   explicit RTPReceiverStrategy(RtpData* data_callback);
     99 
    100   rtc::scoped_ptr<CriticalSectionWrapper> crit_sect_;
    101   PayloadUnion last_payload_;
    102   RtpData* data_callback_;
    103 };
    104 }  // namespace webrtc
    105 
    106 #endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
    107