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
23namespace webrtc {
24
25class CriticalSectionWrapper;
26
27// Handles audio RTP packets. This class is thread-safe.
28class 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_
138