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
21namespace webrtc {
22class RTPSenderAudio: public DTMFqueue
23{
24public:
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
69protected:
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
78private:
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