Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / rtp_rtcp / source / rtp_receiver_strategy.h
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/modules/rtp_rtcp/interface/rtp_rtcp.h"
15 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
16 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
17 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
18 #include "webrtc/system_wrappers/interface/scoped_ptr.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       int32_t id, 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                                  uint16_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       int32_t id,
74       int8_t payload_type,
75       const char payload_name[RTP_PAYLOAD_NAME_SIZE],
76       const PayloadUnion& specific_payload) const = 0;
77
78   // Checks if the payload type has changed, and returns whether we should
79   // reset statistics and/or discard this packet.
80   virtual void CheckPayloadChanged(int8_t payload_type,
81                                    PayloadUnion* specific_payload,
82                                    bool* should_reset_statistics,
83                                    bool* should_discard_changes);
84
85   virtual int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const;
86
87   // Stores / retrieves the last media specific payload for later reference.
88   void GetLastMediaSpecificPayload(PayloadUnion* payload) const;
89   void SetLastMediaSpecificPayload(const PayloadUnion& payload);
90
91  protected:
92   // The data callback is where we should send received payload data.
93   // See ParseRtpPacket. This class does not claim ownership of the callback.
94   // Implementations must NOT hold any critical sections while calling the
95   // callback.
96   //
97   // Note: Implementations may call the callback for other reasons than calls
98   // to ParseRtpPacket, for instance if the implementation somehow recovers a
99   // packet.
100   RTPReceiverStrategy(RtpData* data_callback);
101
102   scoped_ptr<CriticalSectionWrapper> crit_sect_;
103   PayloadUnion last_payload_;
104   RtpData* data_callback_;
105 };
106 }  // namespace webrtc
107
108 #endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_