OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 | 114 |
115 // Initialize receiver, resets codec database etc. | 115 // Initialize receiver, resets codec database etc. |
116 int InitializeReceiver() override; | 116 int InitializeReceiver() override; |
117 | 117 |
118 // Get current receive frequency. | 118 // Get current receive frequency. |
119 int ReceiveFrequency() const override; | 119 int ReceiveFrequency() const override; |
120 | 120 |
121 // Get current playout frequency. | 121 // Get current playout frequency. |
122 int PlayoutFrequency() const override; | 122 int PlayoutFrequency() const override; |
123 | 123 |
| 124 void SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs) override; |
| 125 |
124 bool RegisterReceiveCodec(int rtp_payload_type, | 126 bool RegisterReceiveCodec(int rtp_payload_type, |
125 const SdpAudioFormat& audio_format) override; | 127 const SdpAudioFormat& audio_format) override; |
126 | 128 |
127 int RegisterReceiveCodec(const CodecInst& receive_codec) override; | 129 int RegisterReceiveCodec(const CodecInst& receive_codec) override; |
128 int RegisterReceiveCodec( | 130 int RegisterReceiveCodec( |
129 const CodecInst& receive_codec, | 131 const CodecInst& receive_codec, |
130 rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) override; | 132 rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) override; |
131 | 133 |
132 int RegisterExternalReceiveCodec(int rtp_payload_type, | 134 int RegisterExternalReceiveCodec(int rtp_payload_type, |
133 AudioDecoder* external_decoder, | 135 AudioDecoder* external_decoder, |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 }; | 313 }; |
312 | 314 |
313 // Adds a codec usage sample to the histogram. | 315 // Adds a codec usage sample to the histogram. |
314 void UpdateCodecTypeHistogram(size_t codec_type) { | 316 void UpdateCodecTypeHistogram(size_t codec_type) { |
315 RTC_HISTOGRAM_ENUMERATION( | 317 RTC_HISTOGRAM_ENUMERATION( |
316 "WebRTC.Audio.Encoder.CodecType", static_cast<int>(codec_type), | 318 "WebRTC.Audio.Encoder.CodecType", static_cast<int>(codec_type), |
317 static_cast<int>( | 319 static_cast<int>( |
318 webrtc::AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes)); | 320 webrtc::AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes)); |
319 } | 321 } |
320 | 322 |
321 // TODO(turajs): the same functionality is used in NetEq. If both classes | |
322 // need them, make it a static function in ACMCodecDB. | |
323 bool IsCodecRED(const CodecInst& codec) { | |
324 return (STR_CASE_CMP(codec.plname, "RED") == 0); | |
325 } | |
326 | |
327 bool IsCodecCN(const CodecInst& codec) { | |
328 return (STR_CASE_CMP(codec.plname, "CN") == 0); | |
329 } | |
330 | |
331 // Stereo-to-mono can be used as in-place. | 323 // Stereo-to-mono can be used as in-place. |
332 int DownMix(const AudioFrame& frame, | 324 int DownMix(const AudioFrame& frame, |
333 size_t length_out_buff, | 325 size_t length_out_buff, |
334 int16_t* out_buff) { | 326 int16_t* out_buff) { |
335 if (length_out_buff < frame.samples_per_channel_) { | 327 if (length_out_buff < frame.samples_per_channel_) { |
336 return -1; | 328 return -1; |
337 } | 329 } |
338 for (size_t n = 0; n < frame.samples_per_channel_; ++n) | 330 for (size_t n = 0; n < frame.samples_per_channel_; ++n) |
339 out_buff[n] = (frame.data_[2 * n] + frame.data_[2 * n + 1]) >> 1; | 331 out_buff[n] = (frame.data_[2 * n] + frame.data_[2 * n + 1]) >> 1; |
340 return 0; | 332 return 0; |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 // If the receiver is already initialized then we want to destroy any | 941 // If the receiver is already initialized then we want to destroy any |
950 // existing decoders. After a call to this function, we should have a clean | 942 // existing decoders. After a call to this function, we should have a clean |
951 // start-up. | 943 // start-up. |
952 if (receiver_initialized_) | 944 if (receiver_initialized_) |
953 receiver_.RemoveAllCodecs(); | 945 receiver_.RemoveAllCodecs(); |
954 receiver_.ResetInitialDelay(); | 946 receiver_.ResetInitialDelay(); |
955 receiver_.SetMinimumDelay(0); | 947 receiver_.SetMinimumDelay(0); |
956 receiver_.SetMaximumDelay(0); | 948 receiver_.SetMaximumDelay(0); |
957 receiver_.FlushBuffers(); | 949 receiver_.FlushBuffers(); |
958 | 950 |
959 // Register RED and CN. | |
960 auto db = acm2::RentACodec::Database(); | |
961 for (size_t i = 0; i < db.size(); i++) { | |
962 if (IsCodecRED(db[i]) || IsCodecCN(db[i])) { | |
963 if (receiver_.AddCodec(static_cast<int>(i), | |
964 static_cast<uint8_t>(db[i].pltype), 1, | |
965 db[i].plfreq, nullptr, db[i].plname) < 0) { | |
966 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_, | |
967 "Cannot register master codec."); | |
968 return -1; | |
969 } | |
970 } | |
971 } | |
972 receiver_initialized_ = true; | 951 receiver_initialized_ = true; |
973 return 0; | 952 return 0; |
974 } | 953 } |
975 | 954 |
976 // Get current receive frequency. | 955 // Get current receive frequency. |
977 int AudioCodingModuleImpl::ReceiveFrequency() const { | 956 int AudioCodingModuleImpl::ReceiveFrequency() const { |
978 const auto last_packet_sample_rate = receiver_.last_packet_sample_rate_hz(); | 957 const auto last_packet_sample_rate = receiver_.last_packet_sample_rate_hz(); |
979 return last_packet_sample_rate ? *last_packet_sample_rate | 958 return last_packet_sample_rate ? *last_packet_sample_rate |
980 : receiver_.last_output_sample_rate_hz(); | 959 : receiver_.last_output_sample_rate_hz(); |
981 } | 960 } |
982 | 961 |
983 // Get current playout frequency. | 962 // Get current playout frequency. |
984 int AudioCodingModuleImpl::PlayoutFrequency() const { | 963 int AudioCodingModuleImpl::PlayoutFrequency() const { |
985 WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, id_, | 964 WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, id_, |
986 "PlayoutFrequency()"); | 965 "PlayoutFrequency()"); |
987 return receiver_.last_output_sample_rate_hz(); | 966 return receiver_.last_output_sample_rate_hz(); |
988 } | 967 } |
989 | 968 |
| 969 void AudioCodingModuleImpl::SetReceiveCodecs( |
| 970 const std::map<int, SdpAudioFormat>& codecs) { |
| 971 rtc::CritScope lock(&acm_crit_sect_); |
| 972 receiver_.SetCodecs(codecs); |
| 973 } |
| 974 |
990 bool AudioCodingModuleImpl::RegisterReceiveCodec( | 975 bool AudioCodingModuleImpl::RegisterReceiveCodec( |
991 int rtp_payload_type, | 976 int rtp_payload_type, |
992 const SdpAudioFormat& audio_format) { | 977 const SdpAudioFormat& audio_format) { |
993 rtc::CritScope lock(&acm_crit_sect_); | 978 rtc::CritScope lock(&acm_crit_sect_); |
994 RTC_DCHECK(receiver_initialized_); | 979 RTC_DCHECK(receiver_initialized_); |
995 | 980 |
996 if (!acm2::RentACodec::IsPayloadTypeValid(rtp_payload_type)) { | 981 if (!acm2::RentACodec::IsPayloadTypeValid(rtp_payload_type)) { |
997 LOG_F(LS_ERROR) << "Invalid payload-type " << rtp_payload_type | 982 LOG_F(LS_ERROR) << "Invalid payload-type " << rtp_payload_type |
998 << " for decoder."; | 983 << " for decoder."; |
999 return false; | 984 return false; |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1376 // Checks the validity of the parameters of the given codec | 1361 // Checks the validity of the parameters of the given codec |
1377 bool AudioCodingModule::IsCodecValid(const CodecInst& codec) { | 1362 bool AudioCodingModule::IsCodecValid(const CodecInst& codec) { |
1378 bool valid = acm2::RentACodec::IsCodecValid(codec); | 1363 bool valid = acm2::RentACodec::IsCodecValid(codec); |
1379 if (!valid) | 1364 if (!valid) |
1380 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, -1, | 1365 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, -1, |
1381 "Invalid codec setting"); | 1366 "Invalid codec setting"); |
1382 return valid; | 1367 return valid; |
1383 } | 1368 } |
1384 | 1369 |
1385 } // namespace webrtc | 1370 } // namespace webrtc |
OLD | NEW |