• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_SENDER_AUDIO_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
13 
14 #include "webrtc/common_types.h"
15 #include "webrtc/modules/rtp_rtcp/source/dtmf_queue.h"
16 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
18 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
19 #include "webrtc/typedefs.h"
20 
21 namespace webrtc {
22 class RTPSenderAudio: public DTMFqueue
23 {
24 public:
25     RTPSenderAudio(const int32_t id, Clock* clock,
26                    RTPSender* rtpSender);
27     virtual ~RTPSenderAudio();
28 
29     int32_t RegisterAudioPayload(const char payloadName[RTP_PAYLOAD_NAME_SIZE],
30                                  const int8_t payloadType,
31                                  const uint32_t frequency,
32                                  const uint8_t channels,
33                                  const uint32_t rate,
34                                  RtpUtility::Payload*& payload);
35 
36     int32_t SendAudio(const FrameType frameType,
37                       const int8_t payloadType,
38                       const uint32_t captureTimeStamp,
39                       const uint8_t* payloadData,
40                       const uint32_t payloadSize,
41                       const RTPFragmentationHeader* fragmentation);
42 
43     // set audio packet size, used to determine when it's time to send a DTMF packet in silence (CNG)
44     int32_t SetAudioPacketSize(const uint16_t packetSizeSamples);
45 
46     // Store the audio level in dBov for header-extension-for-audio-level-indication.
47     // Valid range is [0,100]. Actual value is negative.
48     int32_t SetAudioLevel(const uint8_t level_dBov);
49 
50     // Send a DTMF tone using RFC 2833 (4733)
51       int32_t SendTelephoneEvent(const uint8_t key,
52                                  const uint16_t time_ms,
53                                  const uint8_t level);
54 
55     bool SendTelephoneEventActive(int8_t& telephoneEvent) const;
56 
57     void SetAudioFrequency(const uint32_t f);
58 
59     int AudioFrequency() const;
60 
61     // Set payload type for Redundant Audio Data RFC 2198
62     int32_t SetRED(const int8_t payloadType);
63 
64     // Get payload type for Redundant Audio Data RFC 2198
65     int32_t RED(int8_t& payloadType) const;
66 
67     int32_t RegisterAudioCallback(RtpAudioFeedback* messagesCallback);
68 
69 protected:
70     int32_t SendTelephoneEventPacket(const bool ended,
71                                      const uint32_t dtmfTimeStamp,
72                                      const uint16_t duration,
73                                      const bool markerBit); // set on first packet in talk burst
74 
75     bool MarkerBit(const FrameType frameType,
76                    const int8_t payloadType);
77 
78 private:
79     int32_t             _id;
80     Clock*                    _clock;
81     RTPSender*       _rtpSender;
82     CriticalSectionWrapper*   _audioFeedbackCritsect;
83     RtpAudioFeedback*         _audioFeedback;
84 
85     CriticalSectionWrapper*   _sendAudioCritsect;
86 
87     uint32_t            _frequency;
88     uint16_t            _packetSizeSamples;
89 
90     // DTMF
91     bool              _dtmfEventIsOn;
92     bool              _dtmfEventFirstPacketSent;
93     int8_t      _dtmfPayloadType;
94     uint32_t    _dtmfTimestamp;
95     uint8_t     _dtmfKey;
96     uint32_t    _dtmfLengthSamples;
97     uint8_t     _dtmfLevel;
98     int64_t     _dtmfTimeLastSent;
99     uint32_t    _dtmfTimestampLastSent;
100 
101     int8_t      _REDPayloadType;
102 
103     // VAD detection, used for markerbit
104     bool              _inbandVADactive;
105     int8_t      _cngNBPayloadType;
106     int8_t      _cngWBPayloadType;
107     int8_t      _cngSWBPayloadType;
108     int8_t      _cngFBPayloadType;
109     int8_t      _lastPayloadType;
110 
111     // Audio level indication (https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/)
112     uint8_t     _audioLevel_dBov;
113 };
114 }  // namespace webrtc
115 
116 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
117