| Index: webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
|
| index 63d27920380047d932141dfc1ba30c09a07e631b..bd0edd4cf1671fcb2c6ba3485e419f96a32d1e6e 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
|
| @@ -25,28 +25,11 @@
|
|
|
| namespace webrtc {
|
|
|
| -static const int kDtmfFrequencyHz = 8000;
|
| +static const int kDtmfBaseRateHz = 8000;
|
|
|
| RTPSenderAudio::RTPSenderAudio(Clock* clock, RTPSender* rtp_sender)
|
| : clock_(clock),
|
| - rtp_sender_(rtp_sender),
|
| - packet_size_samples_(160),
|
| - dtmf_event_is_on_(false),
|
| - dtmf_event_first_packet_sent_(false),
|
| - dtmf_payload_type_(-1),
|
| - dtmf_timestamp_(0),
|
| - dtmf_key_(0),
|
| - dtmf_length_samples_(0),
|
| - dtmf_level_(0),
|
| - dtmf_time_last_sent_(0),
|
| - dtmf_timestamp_last_sent_(0),
|
| - inband_vad_active_(false),
|
| - cngnb_payload_type_(-1),
|
| - cngwb_payload_type_(-1),
|
| - cngswb_payload_type_(-1),
|
| - cngfb_payload_type_(-1),
|
| - last_payload_type_(-1),
|
| - audio_level_dbov_(0) {}
|
| + rtp_sender_(rtp_sender) {}
|
|
|
| RTPSenderAudio::~RTPSenderAudio() {}
|
|
|
| @@ -89,8 +72,9 @@ int32_t RTPSenderAudio::RegisterAudioPayload(
|
| // Don't add it to the list
|
| // we dont want to allow send with a DTMF payloadtype
|
| dtmf_payload_type_ = payload_type;
|
| + // Frequency is ignored for DTMF - we're using the same RTP timestamp rate
|
| + // as the audio codec.
|
| return 0;
|
| - // The default timestamp rate is 8000 Hz, but other rates may be defined.
|
| }
|
| *payload = new RtpUtility::Payload;
|
| (*payload)->typeSpecific.Audio.frequency = frequency;
|
| @@ -152,15 +136,11 @@ bool RTPSenderAudio::SendAudio(FrameType frame_type,
|
| size_t payload_size,
|
| const RTPFragmentationHeader* fragmentation) {
|
| // TODO(pwestin) Breakup function in smaller functions.
|
| - uint16_t dtmf_length_ms = 0;
|
| - uint8_t key = 0;
|
| uint8_t audio_level_dbov;
|
| - int8_t dtmf_payload_type;
|
| uint16_t packet_size_samples;
|
| {
|
| rtc::CritScope cs(&send_audio_critsect_);
|
| audio_level_dbov = audio_level_dbov_;
|
| - dtmf_payload_type = dtmf_payload_type_;
|
| packet_size_samples = packet_size_samples_;
|
| }
|
|
|
| @@ -172,10 +152,10 @@ bool RTPSenderAudio::SendAudio(FrameType frame_type,
|
| if (delaySinceLastDTMF > 100) {
|
| // New tone to play
|
| dtmf_timestamp_ = rtp_timestamp;
|
| - if (dtmf_queue_.NextDTMF(&key, &dtmf_length_ms, &dtmf_level_) >= 0) {
|
| + if (dtmf_queue_.NextDTMF(&dtmf_current_event_) >= 0) {
|
| dtmf_event_first_packet_sent_ = false;
|
| - dtmf_key_ = key;
|
| - dtmf_length_samples_ = (kDtmfFrequencyHz / 1000) * dtmf_length_ms;
|
| + dtmf_length_samples_ =
|
| + (kDtmfBaseRateHz / 1000) * dtmf_current_event_.duration_ms;
|
| dtmf_event_is_on_ = true;
|
| }
|
| }
|
| @@ -211,7 +191,7 @@ bool RTPSenderAudio::SendAudio(FrameType frame_type,
|
| if (send) {
|
| if (dtmf_duration_samples > 0xffff) {
|
| // RFC 4733 2.5.2.3 Long-Duration Events
|
| - SendTelephoneEventPacket(ended, dtmf_payload_type, dtmf_timestamp_,
|
| + SendTelephoneEventPacket(ended, dtmf_timestamp_,
|
| static_cast<uint16_t>(0xffff), false);
|
|
|
| // set new timestap for this segment
|
| @@ -219,11 +199,10 @@ bool RTPSenderAudio::SendAudio(FrameType frame_type,
|
| dtmf_duration_samples -= 0xffff;
|
| dtmf_length_samples_ -= 0xffff;
|
|
|
| - return SendTelephoneEventPacket(
|
| - ended, dtmf_payload_type, dtmf_timestamp_,
|
| + return SendTelephoneEventPacket(ended, dtmf_timestamp_,
|
| static_cast<uint16_t>(dtmf_duration_samples), false);
|
| } else {
|
| - if (!SendTelephoneEventPacket(ended, dtmf_payload_type, dtmf_timestamp_,
|
| + if (!SendTelephoneEventPacket(ended, dtmf_timestamp_,
|
| dtmf_duration_samples,
|
| !dtmf_event_first_packet_sent_)) {
|
| return false;
|
| @@ -299,18 +278,22 @@ int32_t RTPSenderAudio::SetAudioLevel(uint8_t level_dbov) {
|
| int32_t RTPSenderAudio::SendTelephoneEvent(uint8_t key,
|
| uint16_t time_ms,
|
| uint8_t level) {
|
| + DTMFQueue::Event event;
|
| {
|
| rtc::CritScope lock(&send_audio_critsect_);
|
| if (dtmf_payload_type_ < 0) {
|
| // TelephoneEvent payloadtype not configured
|
| return -1;
|
| }
|
| + event.payload_type = dtmf_payload_type_;
|
| }
|
| - return dtmf_queue_.AddDTMF(key, time_ms, level);
|
| + event.key = key;
|
| + event.duration_ms = time_ms;
|
| + event.level = level;
|
| + return dtmf_queue_.AddDTMF(event);
|
| }
|
|
|
| bool RTPSenderAudio::SendTelephoneEventPacket(bool ended,
|
| - int8_t dtmf_payload_type,
|
| uint32_t dtmf_timestamp,
|
| uint16_t duration,
|
| bool marker_bit) {
|
| @@ -327,7 +310,7 @@ bool RTPSenderAudio::SendTelephoneEventPacket(bool ended,
|
| constexpr size_t kDtmfSize = 4;
|
| std::unique_ptr<RtpPacketToSend> packet(
|
| new RtpPacketToSend(kNoExtensions, kRtpHeaderSize + kDtmfSize));
|
| - packet->SetPayloadType(dtmf_payload_type);
|
| + packet->SetPayloadType(dtmf_current_event_.payload_type);
|
| packet->SetMarker(marker_bit);
|
| packet->SetSsrc(rtp_sender_->SSRC());
|
| packet->SetTimestamp(dtmf_timestamp);
|
| @@ -347,13 +330,13 @@ bool RTPSenderAudio::SendTelephoneEventPacket(bool ended,
|
| */
|
| // R bit always cleared
|
| uint8_t R = 0x00;
|
| - uint8_t volume = dtmf_level_;
|
| + uint8_t volume = dtmf_current_event_.level;
|
|
|
| // First packet un-ended
|
| uint8_t E = ended ? 0x80 : 0x00;
|
|
|
| // First byte is Event number, equals key number
|
| - dtmfbuffer[0] = dtmf_key_;
|
| + dtmfbuffer[0] = dtmf_current_event_.key;
|
| dtmfbuffer[1] = E | R | volume;
|
| ByteWriter<uint16_t>::WriteBigEndian(dtmfbuffer + 2, duration);
|
|
|
|
|