Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / rtp_rtcp / source / rtp_receiver_audio.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_AUDIO_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_AUDIO_H_
13
14 #include <set>
15
16 #include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
17 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
18 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
19 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
20 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
21 #include "webrtc/typedefs.h"
22
23 namespace webrtc {
24
25 class CriticalSectionWrapper;
26
27 // Handles audio RTP packets. This class is thread-safe.
28 class RTPReceiverAudio : public RTPReceiverStrategy,
29                          public TelephoneEventHandler {
30  public:
31   RTPReceiverAudio(const int32_t id,
32                    RtpData* data_callback,
33                    RtpAudioFeedback* incoming_messages_callback);
34   virtual ~RTPReceiverAudio() {}
35
36   // The following three methods implement the TelephoneEventHandler interface.
37   // Forward DTMFs to decoder for playout.
38   void SetTelephoneEventForwardToDecoder(bool forward_to_decoder);
39
40   // Is forwarding of outband telephone events turned on/off?
41   bool TelephoneEventForwardToDecoder() const;
42
43   // Is TelephoneEvent configured with payload type payload_type
44   bool TelephoneEventPayloadType(const int8_t payload_type) const;
45
46   TelephoneEventHandler* GetTelephoneEventHandler() {
47     return this;
48   }
49
50   // Returns true if CNG is configured with payload type payload_type. If so,
51   // the frequency and cng_payload_type_has_changed are filled in.
52   bool CNGPayloadType(const int8_t payload_type,
53                       uint32_t* frequency,
54                       bool* cng_payload_type_has_changed);
55
56   int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
57                          const PayloadUnion& specific_payload,
58                          bool is_red,
59                          const uint8_t* packet,
60                          uint16_t packet_length,
61                          int64_t timestamp_ms,
62                          bool is_first_packet);
63
64   int GetPayloadTypeFrequency() const OVERRIDE;
65
66   virtual RTPAliveType ProcessDeadOrAlive(uint16_t last_payload_length) const
67       OVERRIDE;
68
69   virtual bool ShouldReportCsrcChanges(uint8_t payload_type) const OVERRIDE;
70
71   virtual int32_t OnNewPayloadTypeCreated(
72       const char payload_name[RTP_PAYLOAD_NAME_SIZE],
73       int8_t payload_type,
74       uint32_t frequency) OVERRIDE;
75
76   virtual int32_t InvokeOnInitializeDecoder(
77       RtpFeedback* callback,
78       int32_t id,
79       int8_t payload_type,
80       const char payload_name[RTP_PAYLOAD_NAME_SIZE],
81       const PayloadUnion& specific_payload) const OVERRIDE;
82
83   // We do not allow codecs to have multiple payload types for audio, so we
84   // need to override the default behavior (which is to do nothing).
85   void PossiblyRemoveExistingPayloadType(
86       RtpUtility::PayloadTypeMap* payload_type_map,
87       const char payload_name[RTP_PAYLOAD_NAME_SIZE],
88       size_t payload_name_length,
89       uint32_t frequency,
90       uint8_t channels,
91       uint32_t rate) const;
92
93   // We need to look out for special payload types here and sometimes reset
94   // statistics. In addition we sometimes need to tweak the frequency.
95   void CheckPayloadChanged(int8_t payload_type,
96                            PayloadUnion* specific_payload,
97                            bool* should_reset_statistics,
98                            bool* should_discard_changes) OVERRIDE;
99
100   int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const OVERRIDE;
101
102  private:
103
104   int32_t ParseAudioCodecSpecific(
105       WebRtcRTPHeader* rtp_header,
106       const uint8_t* payload_data,
107       uint16_t payload_length,
108       const AudioPayload& audio_specific,
109       bool is_red);
110
111   int32_t id_;
112
113   uint32_t last_received_frequency_;
114
115   bool telephone_event_forward_to_decoder_;
116   int8_t telephone_event_payload_type_;
117   std::set<uint8_t> telephone_event_reported_;
118
119   int8_t cng_nb_payload_type_;
120   int8_t cng_wb_payload_type_;
121   int8_t cng_swb_payload_type_;
122   int8_t cng_fb_payload_type_;
123   int8_t cng_payload_type_;
124
125   // G722 is special since it use the wrong number of RTP samples in timestamp
126   // VS. number of samples in the frame
127   int8_t g722_payload_type_;
128   bool last_received_g722_;
129
130   uint8_t num_energy_;
131   uint8_t current_remote_energy_[kRtpCsrcSize];
132
133   RtpAudioFeedback* cb_audio_feedback_;
134 };
135 }  // namespace webrtc
136
137 #endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_AUDIO_H_