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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 max_send_bitrate_bps_ = bps; 1276 max_send_bitrate_bps_ = bps;
1277 1277
1278 if (config_.send_codec_spec.codec_inst.rate != *send_rate) { 1278 if (config_.send_codec_spec.codec_inst.rate != *send_rate) {
1279 // Recreate AudioSendStream with new bit rate. 1279 // Recreate AudioSendStream with new bit rate.
1280 config_.send_codec_spec.codec_inst.rate = *send_rate; 1280 config_.send_codec_spec.codec_inst.rate = *send_rate;
1281 RecreateAudioSendStream(); 1281 RecreateAudioSendStream();
1282 } 1282 }
1283 return true; 1283 return true;
1284 } 1284 }
1285 1285
1286 bool SendTelephoneEvent(int payload_type, int event, int duration_ms) { 1286 bool SendTelephoneEvent(int payload_type, int payload_freq, int event,
1287 int duration_ms) {
1287 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 1288 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
1288 RTC_DCHECK(stream_); 1289 RTC_DCHECK(stream_);
1289 return stream_->SendTelephoneEvent(payload_type, event, duration_ms); 1290 return stream_->SendTelephoneEvent(payload_type, payload_freq, event,
1291 duration_ms);
1290 } 1292 }
1291 1293
1292 void SetSend(bool send) { 1294 void SetSend(bool send) {
1293 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 1295 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
1294 send_ = send; 1296 send_ = send;
1295 UpdateSendState(); 1297 UpdateSendState();
1296 } 1298 }
1297 1299
1298 void SetMuted(bool muted) { 1300 void SetMuted(bool muted) {
1299 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 1301 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
1869 } 1871 }
1870 return result; 1872 return result;
1871 } 1873 }
1872 1874
1873 // Utility function called from SetSendParameters() to extract current send 1875 // Utility function called from SetSendParameters() to extract current send
1874 // codec settings from the given list of codecs (originally from SDP). Both send 1876 // codec settings from the given list of codecs (originally from SDP). Both send
1875 // and receive streams may be reconfigured based on the new settings. 1877 // and receive streams may be reconfigured based on the new settings.
1876 bool WebRtcVoiceMediaChannel::SetSendCodecs( 1878 bool WebRtcVoiceMediaChannel::SetSendCodecs(
1877 const std::vector<AudioCodec>& codecs) { 1879 const std::vector<AudioCodec>& codecs) {
1878 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 1880 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
1879 // TODO(solenberg): Validate input - that payload types don't overlap, are 1881 dtmf_payload_type_ = rtc::Optional<int>();
1880 // within range, filter out codecs we don't support, 1882 dtmf_payload_freq_ = -1;
1881 // redundant codecs etc - the same way it is done for
1882 // RtpHeaderExtensions.
1883 1883
1884 // Find the DTMF telephone event "codec" payload type. 1884 // Validate supplied codecs list.
1885 dtmf_payload_type_ = rtc::Optional<int>();
1886 for (const AudioCodec& codec : codecs) { 1885 for (const AudioCodec& codec : codecs) {
1887 if (IsCodec(codec, kDtmfCodecName)) { 1886 // TODO(solenberg): Validate more aspects of input - that payload types
1888 if (codec.id < kMinPayloadType || codec.id > kMaxPayloadType) { 1887 // don't overlap, remove redundant/unsupported codecs etc -
1889 return false; 1888 // the same way it is done for RtpHeaderExtensions.
1890 } 1889 if (codec.id < kMinPayloadType || codec.id > kMaxPayloadType) {
1891 dtmf_payload_type_ = rtc::Optional<int>(codec.id); 1890 LOG(LS_WARNING) << "Codec payload type out of range: " << ToString(codec);
1892 break; 1891 return false;
1893 } 1892 }
1894 } 1893 }
1895 1894
1895 // Find PT of telephone-event codec with lowest clockrate, as a fallback, in
1896 // case we don't have a DTMF codec with a rate matching the send codec's, or
1897 // if this function returns early.
1898 std::vector<AudioCodec> dtmf_codecs;
1899 for (const AudioCodec& codec : codecs) {
1900 if (IsCodec(codec, kDtmfCodecName)) {
1901 dtmf_codecs.push_back(codec);
1902 if (!dtmf_payload_type_ || codec.clockrate < dtmf_payload_freq_) {
1903 dtmf_payload_type_ = rtc::Optional<int>(codec.id);
1904 dtmf_payload_freq_ = codec.clockrate;
1905 }
1906 }
1907 }
1908
1896 // Scan through the list to figure out the codec to use for sending, along 1909 // Scan through the list to figure out the codec to use for sending, along
1897 // with the proper configuration for VAD, CNG, NACK and Opus-specific 1910 // with the proper configuration for VAD, CNG, NACK and Opus-specific
1898 // parameters. 1911 // parameters.
1899 // TODO(solenberg): Refactor this logic once we create AudioEncoders here. 1912 // TODO(solenberg): Refactor this logic once we create AudioEncoders here.
1900 webrtc::AudioSendStream::Config::SendCodecSpec send_codec_spec; 1913 webrtc::AudioSendStream::Config::SendCodecSpec send_codec_spec;
1901 { 1914 {
1902 send_codec_spec.nack_enabled = send_codec_spec_.nack_enabled; 1915 send_codec_spec.nack_enabled = send_codec_spec_.nack_enabled;
1903 1916
1904 // Find send codec (the first non-telephone-event/CN codec). 1917 // Find send codec (the first non-telephone-event/CN codec).
1905 const AudioCodec* codec = WebRtcVoiceCodecs::GetPreferredCodec( 1918 const AudioCodec* codec = WebRtcVoiceCodecs::GetPreferredCodec(
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 default: 1972 default:
1960 LOG(LS_WARNING) << "CN frequency " << codec.clockrate 1973 LOG(LS_WARNING) << "CN frequency " << codec.clockrate
1961 << " not supported."; 1974 << " not supported.";
1962 continue; 1975 continue;
1963 } 1976 }
1964 send_codec_spec.cng_payload_type = codec.id; 1977 send_codec_spec.cng_payload_type = codec.id;
1965 send_codec_spec.cng_plfreq = cng_plfreq; 1978 send_codec_spec.cng_plfreq = cng_plfreq;
1966 break; 1979 break;
1967 } 1980 }
1968 } 1981 }
1982
1983 // Find the telephone-event PT exactly matching the preferred send codec.
1984 for (const AudioCodec& dtmf_codec : dtmf_codecs) {
1985 if (dtmf_codec.clockrate == codec->clockrate) {
1986 dtmf_payload_type_ = rtc::Optional<int>(dtmf_codec.id);
1987 dtmf_payload_freq_ = dtmf_codec.clockrate;
1988 break;
1989 }
1990 }
1969 } 1991 }
1970 1992
1971 // Apply new settings to all streams. 1993 // Apply new settings to all streams.
1972 if (send_codec_spec_ != send_codec_spec) { 1994 if (send_codec_spec_ != send_codec_spec) {
1973 send_codec_spec_ = std::move(send_codec_spec); 1995 send_codec_spec_ = std::move(send_codec_spec);
1974 for (const auto& kv : send_streams_) { 1996 for (const auto& kv : send_streams_) {
1975 kv.second->RecreateAudioSendStream(send_codec_spec_); 1997 kv.second->RecreateAudioSendStream(send_codec_spec_);
1976 } 1998 }
1977 } 1999 }
1978 2000
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
2366 if (event < kMinTelephoneEventCode || 2388 if (event < kMinTelephoneEventCode ||
2367 event > kMaxTelephoneEventCode) { 2389 event > kMaxTelephoneEventCode) {
2368 LOG(LS_WARNING) << "DTMF event code " << event << " out of range."; 2390 LOG(LS_WARNING) << "DTMF event code " << event << " out of range.";
2369 return false; 2391 return false;
2370 } 2392 }
2371 if (duration < kMinTelephoneEventDuration || 2393 if (duration < kMinTelephoneEventDuration ||
2372 duration > kMaxTelephoneEventDuration) { 2394 duration > kMaxTelephoneEventDuration) {
2373 LOG(LS_WARNING) << "DTMF event duration " << duration << " out of range."; 2395 LOG(LS_WARNING) << "DTMF event duration " << duration << " out of range.";
2374 return false; 2396 return false;
2375 } 2397 }
2376 return it->second->SendTelephoneEvent(*dtmf_payload_type_, event, duration); 2398 RTC_DCHECK_NE(-1, dtmf_payload_freq_);
2399 return it->second->SendTelephoneEvent(*dtmf_payload_type_, dtmf_payload_freq_,
2400 event, duration);
2377 } 2401 }
2378 2402
2379 void WebRtcVoiceMediaChannel::OnPacketReceived( 2403 void WebRtcVoiceMediaChannel::OnPacketReceived(
2380 rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) { 2404 rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) {
2381 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 2405 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
2382 2406
2383 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, 2407 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
2384 packet_time.not_before); 2408 packet_time.not_before);
2385 webrtc::PacketReceiver::DeliveryStatus delivery_result = 2409 webrtc::PacketReceiver::DeliveryStatus delivery_result =
2386 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, 2410 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
2603 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 2627 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
2604 const auto it = send_streams_.find(ssrc); 2628 const auto it = send_streams_.find(ssrc);
2605 if (it != send_streams_.end()) { 2629 if (it != send_streams_.end()) {
2606 return it->second->channel(); 2630 return it->second->channel();
2607 } 2631 }
2608 return -1; 2632 return -1;
2609 } 2633 }
2610 } // namespace cricket 2634 } // namespace cricket
2611 2635
2612 #endif // HAVE_WEBRTC_VOICE 2636 #endif // HAVE_WEBRTC_VOICE
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.h ('k') | webrtc/media/engine/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698