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