Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(828)

Unified Diff: webrtc/media/engine/webrtcvoiceengine.cc

Issue 2392883002: Multi frequency DTMF support - sender side (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/media/engine/webrtcvoiceengine.cc
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index b2933bb8db3eaf9e6aeb4256b2a3e6bbdf542821..f3f31cd32db01aa6ac46e28e223ddf65a4d333de 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -1274,10 +1274,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
return true;
}
- bool SendTelephoneEvent(int payload_type, int event, int duration_ms) {
+ bool SendTelephoneEvent(int payload_type, int payload_freq, int event,
+ int duration_ms) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
RTC_DCHECK(stream_);
- return stream_->SendTelephoneEvent(payload_type, event, duration_ms);
+ return stream_->SendTelephoneEvent(payload_type, payload_freq, event,
+ duration_ms);
}
void SetSend(bool send) {
@@ -1867,22 +1869,37 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs(
bool WebRtcVoiceMediaChannel::SetSendCodecs(
const std::vector<AudioCodec>& codecs) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
- // TODO(solenberg): Validate input - that payload types don't overlap, are
- // within range, filter out codecs we don't support,
- // redundant codecs etc - the same way it is done for
- // RtpHeaderExtensions.
-
- // Find the DTMF telephone event "codec" payload type.
dtmf_payload_type_ = rtc::Optional<int>();
+
+ // Validate supplied codecs list.
+ for (const AudioCodec& codec : codecs) {
+ // TODO(solenberg): Validate more aspects of input - that payload types
+ // don't overlap, remove redundant/unsupported codecs etc -
+ // the same way it is done for RtpHeaderExtensions.
+ if (codec.id < kMinPayloadType || codec.id > kMaxPayloadType) {
+ LOG(LS_WARNING) << "Codec payload type out of range: " << ToString(codec);
+ return false;
+ }
+ }
+
+ // Find PT of telephone-event codec with lowest clockrate, as a fallback, in
+ // case we don't have a DTMF codec with a rate matching the send codec's, or
+ // if this function returns early.
+ dtmf_payload_freq_ = -1;
+ std::vector<AudioCodec> dtmf_codecs;
for (const AudioCodec& codec : codecs) {
if (IsCodec(codec, kDtmfCodecName)) {
- if (codec.id < kMinPayloadType || codec.id > kMaxPayloadType) {
- return false;
- }
- dtmf_payload_type_ = rtc::Optional<int>(codec.id);
- break;
+ dtmf_codecs.push_back(codec);
}
}
+ if (!dtmf_codecs.empty()) {
+ std::sort(dtmf_codecs.begin(), dtmf_codecs.end(),
+ [](const AudioCodec& a, const AudioCodec& b) {
+ return a.clockrate < b.clockrate;
+ });
stefan-webrtc 2016/11/08 15:05:39 Sorting isn't necessary if you simply keep track o
the sun 2016/11/11 12:07:24 Yeah, thanks. That's more nicer.
+ dtmf_payload_type_ = rtc::Optional<int>(dtmf_codecs[0].id);
+ dtmf_payload_freq_ = dtmf_codecs[0].clockrate;
+ }
// Scan through the list to figure out the codec to use for sending, along
// with the proper configuration for VAD, CNG, NACK and Opus-specific
@@ -1959,6 +1976,15 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
}
}
+ // Find the telephone-event PT exactly matching the preferred send codec.
+ for (const AudioCodec& codec : dtmf_codecs) {
+ if (codec.clockrate == send_codec_spec.codec_inst.plfreq) {
+ dtmf_payload_type_ = rtc::Optional<int>(codec.id);
+ dtmf_payload_freq_ = codec.clockrate;
+ break;
+ }
+ }
+
// Apply new settings to all streams.
if (send_codec_spec_ != send_codec_spec) {
send_codec_spec_ = std::move(send_codec_spec);
@@ -2373,7 +2399,9 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, int event,
LOG(LS_WARNING) << "DTMF event duration " << duration << " out of range.";
return false;
}
- return it->second->SendTelephoneEvent(*dtmf_payload_type_, event, duration);
+ RTC_DCHECK_NE(-1, dtmf_payload_freq_);
+ return it->second->SendTelephoneEvent(*dtmf_payload_type_, dtmf_payload_freq_,
+ event, duration);
}
void WebRtcVoiceMediaChannel::OnPacketReceived(

Powered by Google App Engine
This is Rietveld 408576698