| 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 26 matching lines...) Expand all Loading... |
| 37 #include "webrtc/modules/audio_coding/neteq/nack.h" | 37 #include "webrtc/modules/audio_coding/neteq/nack.h" |
| 38 #include "webrtc/modules/audio_coding/neteq/normal.h" | 38 #include "webrtc/modules/audio_coding/neteq/normal.h" |
| 39 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h" | 39 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h" |
| 40 #include "webrtc/modules/audio_coding/neteq/packet.h" | 40 #include "webrtc/modules/audio_coding/neteq/packet.h" |
| 41 #include "webrtc/modules/audio_coding/neteq/payload_splitter.h" | 41 #include "webrtc/modules/audio_coding/neteq/payload_splitter.h" |
| 42 #include "webrtc/modules/audio_coding/neteq/post_decode_vad.h" | 42 #include "webrtc/modules/audio_coding/neteq/post_decode_vad.h" |
| 43 #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h" | 43 #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h" |
| 44 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h" | 44 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h" |
| 45 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h" | 45 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h" |
| 46 #include "webrtc/modules/include/module_common_types.h" | 46 #include "webrtc/modules/include/module_common_types.h" |
| 47 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | |
| 48 | 47 |
| 49 // Modify the code to obtain backwards bit-exactness. Once bit-exactness is no | 48 // Modify the code to obtain backwards bit-exactness. Once bit-exactness is no |
| 50 // longer required, this #define should be removed (and the code that it | 49 // longer required, this #define should be removed (and the code that it |
| 51 // enables). | 50 // enables). |
| 52 #define LEGACY_BITEXACT | 51 #define LEGACY_BITEXACT |
| 53 | 52 |
| 54 namespace webrtc { | 53 namespace webrtc { |
| 55 | 54 |
| 56 NetEqImpl::NetEqImpl(const NetEq::Config& config, | 55 NetEqImpl::NetEqImpl(const NetEq::Config& config, |
| 57 BufferLevelFilter* buffer_level_filter, | 56 BufferLevelFilter* buffer_level_filter, |
| 58 DecoderDatabase* decoder_database, | 57 DecoderDatabase* decoder_database, |
| 59 DelayManager* delay_manager, | 58 DelayManager* delay_manager, |
| 60 DelayPeakDetector* delay_peak_detector, | 59 DelayPeakDetector* delay_peak_detector, |
| 61 DtmfBuffer* dtmf_buffer, | 60 DtmfBuffer* dtmf_buffer, |
| 62 DtmfToneGenerator* dtmf_tone_generator, | 61 DtmfToneGenerator* dtmf_tone_generator, |
| 63 PacketBuffer* packet_buffer, | 62 PacketBuffer* packet_buffer, |
| 64 PayloadSplitter* payload_splitter, | 63 PayloadSplitter* payload_splitter, |
| 65 TimestampScaler* timestamp_scaler, | 64 TimestampScaler* timestamp_scaler, |
| 66 AccelerateFactory* accelerate_factory, | 65 AccelerateFactory* accelerate_factory, |
| 67 ExpandFactory* expand_factory, | 66 ExpandFactory* expand_factory, |
| 68 PreemptiveExpandFactory* preemptive_expand_factory, | 67 PreemptiveExpandFactory* preemptive_expand_factory, |
| 69 bool create_components) | 68 bool create_components) |
| 70 : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), | 69 : buffer_level_filter_(buffer_level_filter), |
| 71 buffer_level_filter_(buffer_level_filter), | |
| 72 decoder_database_(decoder_database), | 70 decoder_database_(decoder_database), |
| 73 delay_manager_(delay_manager), | 71 delay_manager_(delay_manager), |
| 74 delay_peak_detector_(delay_peak_detector), | 72 delay_peak_detector_(delay_peak_detector), |
| 75 dtmf_buffer_(dtmf_buffer), | 73 dtmf_buffer_(dtmf_buffer), |
| 76 dtmf_tone_generator_(dtmf_tone_generator), | 74 dtmf_tone_generator_(dtmf_tone_generator), |
| 77 packet_buffer_(packet_buffer), | 75 packet_buffer_(packet_buffer), |
| 78 payload_splitter_(payload_splitter), | 76 payload_splitter_(payload_splitter), |
| 79 timestamp_scaler_(timestamp_scaler), | 77 timestamp_scaler_(timestamp_scaler), |
| 80 vad_(new PostDecodeVad()), | 78 vad_(new PostDecodeVad()), |
| 81 expand_factory_(expand_factory), | 79 expand_factory_(expand_factory), |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 vad_->Enable(); | 117 vad_->Enable(); |
| 120 } | 118 } |
| 121 } | 119 } |
| 122 | 120 |
| 123 NetEqImpl::~NetEqImpl() = default; | 121 NetEqImpl::~NetEqImpl() = default; |
| 124 | 122 |
| 125 int NetEqImpl::InsertPacket(const WebRtcRTPHeader& rtp_header, | 123 int NetEqImpl::InsertPacket(const WebRtcRTPHeader& rtp_header, |
| 126 rtc::ArrayView<const uint8_t> payload, | 124 rtc::ArrayView<const uint8_t> payload, |
| 127 uint32_t receive_timestamp) { | 125 uint32_t receive_timestamp) { |
| 128 TRACE_EVENT0("webrtc", "NetEqImpl::InsertPacket"); | 126 TRACE_EVENT0("webrtc", "NetEqImpl::InsertPacket"); |
| 129 CriticalSectionScoped lock(crit_sect_.get()); | 127 rtc::CritScope lock(&crit_sect_); |
| 130 int error = | 128 int error = |
| 131 InsertPacketInternal(rtp_header, payload, receive_timestamp, false); | 129 InsertPacketInternal(rtp_header, payload, receive_timestamp, false); |
| 132 if (error != 0) { | 130 if (error != 0) { |
| 133 error_code_ = error; | 131 error_code_ = error; |
| 134 return kFail; | 132 return kFail; |
| 135 } | 133 } |
| 136 return kOK; | 134 return kOK; |
| 137 } | 135 } |
| 138 | 136 |
| 139 int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header, | 137 int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header, |
| 140 uint32_t receive_timestamp) { | 138 uint32_t receive_timestamp) { |
| 141 CriticalSectionScoped lock(crit_sect_.get()); | 139 rtc::CritScope lock(&crit_sect_); |
| 142 const uint8_t kSyncPayload[] = { 's', 'y', 'n', 'c' }; | 140 const uint8_t kSyncPayload[] = { 's', 'y', 'n', 'c' }; |
| 143 int error = | 141 int error = |
| 144 InsertPacketInternal(rtp_header, kSyncPayload, receive_timestamp, true); | 142 InsertPacketInternal(rtp_header, kSyncPayload, receive_timestamp, true); |
| 145 | 143 |
| 146 if (error != 0) { | 144 if (error != 0) { |
| 147 error_code_ = error; | 145 error_code_ = error; |
| 148 return kFail; | 146 return kFail; |
| 149 } | 147 } |
| 150 return kOK; | 148 return kOK; |
| 151 } | 149 } |
| 152 | 150 |
| 153 int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio, | 151 int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio, |
| 154 size_t* samples_per_channel, size_t* num_channels, | 152 size_t* samples_per_channel, size_t* num_channels, |
| 155 NetEqOutputType* type) { | 153 NetEqOutputType* type) { |
| 156 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); | 154 TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio"); |
| 157 CriticalSectionScoped lock(crit_sect_.get()); | 155 rtc::CritScope lock(&crit_sect_); |
| 158 int error = GetAudioInternal(max_length, output_audio, samples_per_channel, | 156 int error = GetAudioInternal(max_length, output_audio, samples_per_channel, |
| 159 num_channels); | 157 num_channels); |
| 160 if (error != 0) { | 158 if (error != 0) { |
| 161 error_code_ = error; | 159 error_code_ = error; |
| 162 return kFail; | 160 return kFail; |
| 163 } | 161 } |
| 164 if (type) { | 162 if (type) { |
| 165 *type = LastOutputType(); | 163 *type = LastOutputType(); |
| 166 } | 164 } |
| 167 last_output_sample_rate_hz_ = | 165 last_output_sample_rate_hz_ = |
| 168 rtc::checked_cast<int>(*samples_per_channel * 100); | 166 rtc::checked_cast<int>(*samples_per_channel * 100); |
| 169 RTC_DCHECK(last_output_sample_rate_hz_ == 8000 || | 167 RTC_DCHECK(last_output_sample_rate_hz_ == 8000 || |
| 170 last_output_sample_rate_hz_ == 16000 || | 168 last_output_sample_rate_hz_ == 16000 || |
| 171 last_output_sample_rate_hz_ == 32000 || | 169 last_output_sample_rate_hz_ == 32000 || |
| 172 last_output_sample_rate_hz_ == 48000) | 170 last_output_sample_rate_hz_ == 48000) |
| 173 << "Unexpected sample rate " << last_output_sample_rate_hz_; | 171 << "Unexpected sample rate " << last_output_sample_rate_hz_; |
| 174 return kOK; | 172 return kOK; |
| 175 } | 173 } |
| 176 | 174 |
| 177 int NetEqImpl::RegisterPayloadType(NetEqDecoder codec, | 175 int NetEqImpl::RegisterPayloadType(NetEqDecoder codec, |
| 178 const std::string& name, | 176 const std::string& name, |
| 179 uint8_t rtp_payload_type) { | 177 uint8_t rtp_payload_type) { |
| 180 CriticalSectionScoped lock(crit_sect_.get()); | 178 rtc::CritScope lock(&crit_sect_); |
| 181 LOG(LS_VERBOSE) << "RegisterPayloadType " | 179 LOG(LS_VERBOSE) << "RegisterPayloadType " |
| 182 << static_cast<int>(rtp_payload_type) << " " | 180 << static_cast<int>(rtp_payload_type) << " " |
| 183 << static_cast<int>(codec); | 181 << static_cast<int>(codec); |
| 184 int ret = decoder_database_->RegisterPayload(rtp_payload_type, codec, name); | 182 int ret = decoder_database_->RegisterPayload(rtp_payload_type, codec, name); |
| 185 if (ret != DecoderDatabase::kOK) { | 183 if (ret != DecoderDatabase::kOK) { |
| 186 switch (ret) { | 184 switch (ret) { |
| 187 case DecoderDatabase::kInvalidRtpPayloadType: | 185 case DecoderDatabase::kInvalidRtpPayloadType: |
| 188 error_code_ = kInvalidRtpPayloadType; | 186 error_code_ = kInvalidRtpPayloadType; |
| 189 break; | 187 break; |
| 190 case DecoderDatabase::kCodecNotSupported: | 188 case DecoderDatabase::kCodecNotSupported: |
| 191 error_code_ = kCodecNotSupported; | 189 error_code_ = kCodecNotSupported; |
| 192 break; | 190 break; |
| 193 case DecoderDatabase::kDecoderExists: | 191 case DecoderDatabase::kDecoderExists: |
| 194 error_code_ = kDecoderExists; | 192 error_code_ = kDecoderExists; |
| 195 break; | 193 break; |
| 196 default: | 194 default: |
| 197 error_code_ = kOtherError; | 195 error_code_ = kOtherError; |
| 198 } | 196 } |
| 199 return kFail; | 197 return kFail; |
| 200 } | 198 } |
| 201 return kOK; | 199 return kOK; |
| 202 } | 200 } |
| 203 | 201 |
| 204 int NetEqImpl::RegisterExternalDecoder(AudioDecoder* decoder, | 202 int NetEqImpl::RegisterExternalDecoder(AudioDecoder* decoder, |
| 205 NetEqDecoder codec, | 203 NetEqDecoder codec, |
| 206 const std::string& codec_name, | 204 const std::string& codec_name, |
| 207 uint8_t rtp_payload_type, | 205 uint8_t rtp_payload_type, |
| 208 int sample_rate_hz) { | 206 int sample_rate_hz) { |
| 209 CriticalSectionScoped lock(crit_sect_.get()); | 207 rtc::CritScope lock(&crit_sect_); |
| 210 LOG(LS_VERBOSE) << "RegisterExternalDecoder " | 208 LOG(LS_VERBOSE) << "RegisterExternalDecoder " |
| 211 << static_cast<int>(rtp_payload_type) << " " | 209 << static_cast<int>(rtp_payload_type) << " " |
| 212 << static_cast<int>(codec); | 210 << static_cast<int>(codec); |
| 213 if (!decoder) { | 211 if (!decoder) { |
| 214 LOG(LS_ERROR) << "Cannot register external decoder with NULL pointer"; | 212 LOG(LS_ERROR) << "Cannot register external decoder with NULL pointer"; |
| 215 assert(false); | 213 assert(false); |
| 216 return kFail; | 214 return kFail; |
| 217 } | 215 } |
| 218 int ret = decoder_database_->InsertExternal( | 216 int ret = decoder_database_->InsertExternal( |
| 219 rtp_payload_type, codec, codec_name, sample_rate_hz, decoder); | 217 rtp_payload_type, codec, codec_name, sample_rate_hz, decoder); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 236 break; | 234 break; |
| 237 default: | 235 default: |
| 238 error_code_ = kOtherError; | 236 error_code_ = kOtherError; |
| 239 } | 237 } |
| 240 return kFail; | 238 return kFail; |
| 241 } | 239 } |
| 242 return kOK; | 240 return kOK; |
| 243 } | 241 } |
| 244 | 242 |
| 245 int NetEqImpl::RemovePayloadType(uint8_t rtp_payload_type) { | 243 int NetEqImpl::RemovePayloadType(uint8_t rtp_payload_type) { |
| 246 CriticalSectionScoped lock(crit_sect_.get()); | 244 rtc::CritScope lock(&crit_sect_); |
| 247 int ret = decoder_database_->Remove(rtp_payload_type); | 245 int ret = decoder_database_->Remove(rtp_payload_type); |
| 248 if (ret == DecoderDatabase::kOK) { | 246 if (ret == DecoderDatabase::kOK) { |
| 249 return kOK; | 247 return kOK; |
| 250 } else if (ret == DecoderDatabase::kDecoderNotFound) { | 248 } else if (ret == DecoderDatabase::kDecoderNotFound) { |
| 251 error_code_ = kDecoderNotFound; | 249 error_code_ = kDecoderNotFound; |
| 252 } else { | 250 } else { |
| 253 error_code_ = kOtherError; | 251 error_code_ = kOtherError; |
| 254 } | 252 } |
| 255 return kFail; | 253 return kFail; |
| 256 } | 254 } |
| 257 | 255 |
| 258 bool NetEqImpl::SetMinimumDelay(int delay_ms) { | 256 bool NetEqImpl::SetMinimumDelay(int delay_ms) { |
| 259 CriticalSectionScoped lock(crit_sect_.get()); | 257 rtc::CritScope lock(&crit_sect_); |
| 260 if (delay_ms >= 0 && delay_ms < 10000) { | 258 if (delay_ms >= 0 && delay_ms < 10000) { |
| 261 assert(delay_manager_.get()); | 259 assert(delay_manager_.get()); |
| 262 return delay_manager_->SetMinimumDelay(delay_ms); | 260 return delay_manager_->SetMinimumDelay(delay_ms); |
| 263 } | 261 } |
| 264 return false; | 262 return false; |
| 265 } | 263 } |
| 266 | 264 |
| 267 bool NetEqImpl::SetMaximumDelay(int delay_ms) { | 265 bool NetEqImpl::SetMaximumDelay(int delay_ms) { |
| 268 CriticalSectionScoped lock(crit_sect_.get()); | 266 rtc::CritScope lock(&crit_sect_); |
| 269 if (delay_ms >= 0 && delay_ms < 10000) { | 267 if (delay_ms >= 0 && delay_ms < 10000) { |
| 270 assert(delay_manager_.get()); | 268 assert(delay_manager_.get()); |
| 271 return delay_manager_->SetMaximumDelay(delay_ms); | 269 return delay_manager_->SetMaximumDelay(delay_ms); |
| 272 } | 270 } |
| 273 return false; | 271 return false; |
| 274 } | 272 } |
| 275 | 273 |
| 276 int NetEqImpl::LeastRequiredDelayMs() const { | 274 int NetEqImpl::LeastRequiredDelayMs() const { |
| 277 CriticalSectionScoped lock(crit_sect_.get()); | 275 rtc::CritScope lock(&crit_sect_); |
| 278 assert(delay_manager_.get()); | 276 assert(delay_manager_.get()); |
| 279 return delay_manager_->least_required_delay_ms(); | 277 return delay_manager_->least_required_delay_ms(); |
| 280 } | 278 } |
| 281 | 279 |
| 282 int NetEqImpl::SetTargetDelay() { | 280 int NetEqImpl::SetTargetDelay() { |
| 283 return kNotImplemented; | 281 return kNotImplemented; |
| 284 } | 282 } |
| 285 | 283 |
| 286 int NetEqImpl::TargetDelay() { | 284 int NetEqImpl::TargetDelay() { |
| 287 return kNotImplemented; | 285 return kNotImplemented; |
| 288 } | 286 } |
| 289 | 287 |
| 290 int NetEqImpl::CurrentDelayMs() const { | 288 int NetEqImpl::CurrentDelayMs() const { |
| 291 CriticalSectionScoped lock(crit_sect_.get()); | 289 rtc::CritScope lock(&crit_sect_); |
| 292 if (fs_hz_ == 0) | 290 if (fs_hz_ == 0) |
| 293 return 0; | 291 return 0; |
| 294 // Sum up the samples in the packet buffer with the future length of the sync | 292 // Sum up the samples in the packet buffer with the future length of the sync |
| 295 // buffer, and divide the sum by the sample rate. | 293 // buffer, and divide the sum by the sample rate. |
| 296 const size_t delay_samples = | 294 const size_t delay_samples = |
| 297 packet_buffer_->NumSamplesInBuffer(decoder_database_.get(), | 295 packet_buffer_->NumSamplesInBuffer(decoder_database_.get(), |
| 298 decoder_frame_length_) + | 296 decoder_frame_length_) + |
| 299 sync_buffer_->FutureLength(); | 297 sync_buffer_->FutureLength(); |
| 300 // The division below will truncate. | 298 // The division below will truncate. |
| 301 const int delay_ms = | 299 const int delay_ms = |
| 302 static_cast<int>(delay_samples) / rtc::CheckedDivExact(fs_hz_, 1000); | 300 static_cast<int>(delay_samples) / rtc::CheckedDivExact(fs_hz_, 1000); |
| 303 return delay_ms; | 301 return delay_ms; |
| 304 } | 302 } |
| 305 | 303 |
| 306 // Deprecated. | 304 // Deprecated. |
| 307 // TODO(henrik.lundin) Delete. | 305 // TODO(henrik.lundin) Delete. |
| 308 void NetEqImpl::SetPlayoutMode(NetEqPlayoutMode mode) { | 306 void NetEqImpl::SetPlayoutMode(NetEqPlayoutMode mode) { |
| 309 CriticalSectionScoped lock(crit_sect_.get()); | 307 rtc::CritScope lock(&crit_sect_); |
| 310 if (mode != playout_mode_) { | 308 if (mode != playout_mode_) { |
| 311 playout_mode_ = mode; | 309 playout_mode_ = mode; |
| 312 CreateDecisionLogic(); | 310 CreateDecisionLogic(); |
| 313 } | 311 } |
| 314 } | 312 } |
| 315 | 313 |
| 316 // Deprecated. | 314 // Deprecated. |
| 317 // TODO(henrik.lundin) Delete. | 315 // TODO(henrik.lundin) Delete. |
| 318 NetEqPlayoutMode NetEqImpl::PlayoutMode() const { | 316 NetEqPlayoutMode NetEqImpl::PlayoutMode() const { |
| 319 CriticalSectionScoped lock(crit_sect_.get()); | 317 rtc::CritScope lock(&crit_sect_); |
| 320 return playout_mode_; | 318 return playout_mode_; |
| 321 } | 319 } |
| 322 | 320 |
| 323 int NetEqImpl::NetworkStatistics(NetEqNetworkStatistics* stats) { | 321 int NetEqImpl::NetworkStatistics(NetEqNetworkStatistics* stats) { |
| 324 CriticalSectionScoped lock(crit_sect_.get()); | 322 rtc::CritScope lock(&crit_sect_); |
| 325 assert(decoder_database_.get()); | 323 assert(decoder_database_.get()); |
| 326 const size_t total_samples_in_buffers = | 324 const size_t total_samples_in_buffers = |
| 327 packet_buffer_->NumSamplesInBuffer(decoder_database_.get(), | 325 packet_buffer_->NumSamplesInBuffer(decoder_database_.get(), |
| 328 decoder_frame_length_) + | 326 decoder_frame_length_) + |
| 329 sync_buffer_->FutureLength(); | 327 sync_buffer_->FutureLength(); |
| 330 assert(delay_manager_.get()); | 328 assert(delay_manager_.get()); |
| 331 assert(decision_logic_.get()); | 329 assert(decision_logic_.get()); |
| 332 stats_.GetNetworkStatistics(fs_hz_, total_samples_in_buffers, | 330 stats_.GetNetworkStatistics(fs_hz_, total_samples_in_buffers, |
| 333 decoder_frame_length_, *delay_manager_.get(), | 331 decoder_frame_length_, *delay_manager_.get(), |
| 334 *decision_logic_.get(), stats); | 332 *decision_logic_.get(), stats); |
| 335 return 0; | 333 return 0; |
| 336 } | 334 } |
| 337 | 335 |
| 338 void NetEqImpl::GetRtcpStatistics(RtcpStatistics* stats) { | 336 void NetEqImpl::GetRtcpStatistics(RtcpStatistics* stats) { |
| 339 CriticalSectionScoped lock(crit_sect_.get()); | 337 rtc::CritScope lock(&crit_sect_); |
| 340 if (stats) { | 338 if (stats) { |
| 341 rtcp_.GetStatistics(false, stats); | 339 rtcp_.GetStatistics(false, stats); |
| 342 } | 340 } |
| 343 } | 341 } |
| 344 | 342 |
| 345 void NetEqImpl::GetRtcpStatisticsNoReset(RtcpStatistics* stats) { | 343 void NetEqImpl::GetRtcpStatisticsNoReset(RtcpStatistics* stats) { |
| 346 CriticalSectionScoped lock(crit_sect_.get()); | 344 rtc::CritScope lock(&crit_sect_); |
| 347 if (stats) { | 345 if (stats) { |
| 348 rtcp_.GetStatistics(true, stats); | 346 rtcp_.GetStatistics(true, stats); |
| 349 } | 347 } |
| 350 } | 348 } |
| 351 | 349 |
| 352 void NetEqImpl::EnableVad() { | 350 void NetEqImpl::EnableVad() { |
| 353 CriticalSectionScoped lock(crit_sect_.get()); | 351 rtc::CritScope lock(&crit_sect_); |
| 354 assert(vad_.get()); | 352 assert(vad_.get()); |
| 355 vad_->Enable(); | 353 vad_->Enable(); |
| 356 } | 354 } |
| 357 | 355 |
| 358 void NetEqImpl::DisableVad() { | 356 void NetEqImpl::DisableVad() { |
| 359 CriticalSectionScoped lock(crit_sect_.get()); | 357 rtc::CritScope lock(&crit_sect_); |
| 360 assert(vad_.get()); | 358 assert(vad_.get()); |
| 361 vad_->Disable(); | 359 vad_->Disable(); |
| 362 } | 360 } |
| 363 | 361 |
| 364 bool NetEqImpl::GetPlayoutTimestamp(uint32_t* timestamp) { | 362 bool NetEqImpl::GetPlayoutTimestamp(uint32_t* timestamp) { |
| 365 CriticalSectionScoped lock(crit_sect_.get()); | 363 rtc::CritScope lock(&crit_sect_); |
| 366 if (first_packet_) { | 364 if (first_packet_) { |
| 367 // We don't have a valid RTP timestamp until we have decoded our first | 365 // We don't have a valid RTP timestamp until we have decoded our first |
| 368 // RTP packet. | 366 // RTP packet. |
| 369 return false; | 367 return false; |
| 370 } | 368 } |
| 371 *timestamp = timestamp_scaler_->ToExternal(playout_timestamp_); | 369 *timestamp = timestamp_scaler_->ToExternal(playout_timestamp_); |
| 372 return true; | 370 return true; |
| 373 } | 371 } |
| 374 | 372 |
| 375 int NetEqImpl::last_output_sample_rate_hz() const { | 373 int NetEqImpl::last_output_sample_rate_hz() const { |
| 376 CriticalSectionScoped lock(crit_sect_.get()); | 374 rtc::CritScope lock(&crit_sect_); |
| 377 return last_output_sample_rate_hz_; | 375 return last_output_sample_rate_hz_; |
| 378 } | 376 } |
| 379 | 377 |
| 380 int NetEqImpl::SetTargetNumberOfChannels() { | 378 int NetEqImpl::SetTargetNumberOfChannels() { |
| 381 return kNotImplemented; | 379 return kNotImplemented; |
| 382 } | 380 } |
| 383 | 381 |
| 384 int NetEqImpl::SetTargetSampleRate() { | 382 int NetEqImpl::SetTargetSampleRate() { |
| 385 return kNotImplemented; | 383 return kNotImplemented; |
| 386 } | 384 } |
| 387 | 385 |
| 388 int NetEqImpl::LastError() const { | 386 int NetEqImpl::LastError() const { |
| 389 CriticalSectionScoped lock(crit_sect_.get()); | 387 rtc::CritScope lock(&crit_sect_); |
| 390 return error_code_; | 388 return error_code_; |
| 391 } | 389 } |
| 392 | 390 |
| 393 int NetEqImpl::LastDecoderError() { | 391 int NetEqImpl::LastDecoderError() { |
| 394 CriticalSectionScoped lock(crit_sect_.get()); | 392 rtc::CritScope lock(&crit_sect_); |
| 395 return decoder_error_code_; | 393 return decoder_error_code_; |
| 396 } | 394 } |
| 397 | 395 |
| 398 void NetEqImpl::FlushBuffers() { | 396 void NetEqImpl::FlushBuffers() { |
| 399 CriticalSectionScoped lock(crit_sect_.get()); | 397 rtc::CritScope lock(&crit_sect_); |
| 400 LOG(LS_VERBOSE) << "FlushBuffers"; | 398 LOG(LS_VERBOSE) << "FlushBuffers"; |
| 401 packet_buffer_->Flush(); | 399 packet_buffer_->Flush(); |
| 402 assert(sync_buffer_.get()); | 400 assert(sync_buffer_.get()); |
| 403 assert(expand_.get()); | 401 assert(expand_.get()); |
| 404 sync_buffer_->Flush(); | 402 sync_buffer_->Flush(); |
| 405 sync_buffer_->set_next_index(sync_buffer_->next_index() - | 403 sync_buffer_->set_next_index(sync_buffer_->next_index() - |
| 406 expand_->overlap_length()); | 404 expand_->overlap_length()); |
| 407 // Set to wait for new codec. | 405 // Set to wait for new codec. |
| 408 first_packet_ = true; | 406 first_packet_ = true; |
| 409 } | 407 } |
| 410 | 408 |
| 411 void NetEqImpl::PacketBufferStatistics(int* current_num_packets, | 409 void NetEqImpl::PacketBufferStatistics(int* current_num_packets, |
| 412 int* max_num_packets) const { | 410 int* max_num_packets) const { |
| 413 CriticalSectionScoped lock(crit_sect_.get()); | 411 rtc::CritScope lock(&crit_sect_); |
| 414 packet_buffer_->BufferStat(current_num_packets, max_num_packets); | 412 packet_buffer_->BufferStat(current_num_packets, max_num_packets); |
| 415 } | 413 } |
| 416 | 414 |
| 417 void NetEqImpl::EnableNack(size_t max_nack_list_size) { | 415 void NetEqImpl::EnableNack(size_t max_nack_list_size) { |
| 418 CriticalSectionScoped lock(crit_sect_.get()); | 416 rtc::CritScope lock(&crit_sect_); |
| 419 if (!nack_enabled_) { | 417 if (!nack_enabled_) { |
| 420 const int kNackThresholdPackets = 2; | 418 const int kNackThresholdPackets = 2; |
| 421 nack_.reset(Nack::Create(kNackThresholdPackets)); | 419 nack_.reset(Nack::Create(kNackThresholdPackets)); |
| 422 nack_enabled_ = true; | 420 nack_enabled_ = true; |
| 423 nack_->UpdateSampleRate(fs_hz_); | 421 nack_->UpdateSampleRate(fs_hz_); |
| 424 } | 422 } |
| 425 nack_->SetMaxNackListSize(max_nack_list_size); | 423 nack_->SetMaxNackListSize(max_nack_list_size); |
| 426 } | 424 } |
| 427 | 425 |
| 428 void NetEqImpl::DisableNack() { | 426 void NetEqImpl::DisableNack() { |
| 429 CriticalSectionScoped lock(crit_sect_.get()); | 427 rtc::CritScope lock(&crit_sect_); |
| 430 nack_.reset(); | 428 nack_.reset(); |
| 431 nack_enabled_ = false; | 429 nack_enabled_ = false; |
| 432 } | 430 } |
| 433 | 431 |
| 434 std::vector<uint16_t> NetEqImpl::GetNackList(int64_t round_trip_time_ms) const { | 432 std::vector<uint16_t> NetEqImpl::GetNackList(int64_t round_trip_time_ms) const { |
| 435 CriticalSectionScoped lock(crit_sect_.get()); | 433 rtc::CritScope lock(&crit_sect_); |
| 436 if (!nack_enabled_) { | 434 if (!nack_enabled_) { |
| 437 return std::vector<uint16_t>(); | 435 return std::vector<uint16_t>(); |
| 438 } | 436 } |
| 439 RTC_DCHECK(nack_.get()); | 437 RTC_DCHECK(nack_.get()); |
| 440 return nack_->GetNackList(round_trip_time_ms); | 438 return nack_->GetNackList(round_trip_time_ms); |
| 441 } | 439 } |
| 442 | 440 |
| 443 const SyncBuffer* NetEqImpl::sync_buffer_for_test() const { | 441 const SyncBuffer* NetEqImpl::sync_buffer_for_test() const { |
| 444 CriticalSectionScoped lock(crit_sect_.get()); | 442 rtc::CritScope lock(&crit_sect_); |
| 445 return sync_buffer_.get(); | 443 return sync_buffer_.get(); |
| 446 } | 444 } |
| 447 | 445 |
| 448 // Methods below this line are private. | 446 // Methods below this line are private. |
| 449 | 447 |
| 450 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, | 448 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
| 451 rtc::ArrayView<const uint8_t> payload, | 449 rtc::ArrayView<const uint8_t> payload, |
| 452 uint32_t receive_timestamp, | 450 uint32_t receive_timestamp, |
| 453 bool is_sync_packet) { | 451 bool is_sync_packet) { |
| 454 if (payload.empty()) { | 452 if (payload.empty()) { |
| (...skipping 1590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2045 | 2043 |
| 2046 void NetEqImpl::CreateDecisionLogic() { | 2044 void NetEqImpl::CreateDecisionLogic() { |
| 2047 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, | 2045 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, |
| 2048 playout_mode_, | 2046 playout_mode_, |
| 2049 decoder_database_.get(), | 2047 decoder_database_.get(), |
| 2050 *packet_buffer_.get(), | 2048 *packet_buffer_.get(), |
| 2051 delay_manager_.get(), | 2049 delay_manager_.get(), |
| 2052 buffer_level_filter_.get())); | 2050 buffer_level_filter_.get())); |
| 2053 } | 2051 } |
| 2054 } // namespace webrtc | 2052 } // namespace webrtc |
| OLD | NEW |