| Index: webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| index 3b81999dbba042d4991042a203f5de4b2076a39e..04338c438cf9a061b8bc0ace1862cb135ea125ff 100644
|
| --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| @@ -16,6 +16,7 @@
|
| #include <algorithm>
|
|
|
| #include "webrtc/base/logging.h"
|
| +#include "webrtc/base/safe_conversions.h"
|
| #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
|
| #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
|
| #include "webrtc/modules/audio_coding/neteq/accelerate.h"
|
| @@ -104,7 +105,7 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config,
|
| }
|
| fs_hz_ = fs;
|
| fs_mult_ = fs / 8000;
|
| - output_size_samples_ = kOutputSizeMs * 8 * fs_mult_;
|
| + output_size_samples_ = static_cast<size_t>(kOutputSizeMs * 8 * fs_mult_);
|
| decoder_frame_length_ = 3 * output_size_samples_;
|
| WebRtcSpl_Init();
|
| if (create_components) {
|
| @@ -154,7 +155,7 @@ int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header,
|
| }
|
|
|
| int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio,
|
| - int* samples_per_channel, int* num_channels,
|
| + size_t* samples_per_channel, int* num_channels,
|
| NetEqOutputType* type) {
|
| CriticalSectionScoped lock(crit_sect_.get());
|
| LOG(LS_VERBOSE) << "GetAudio";
|
| @@ -305,10 +306,10 @@ NetEqPlayoutMode NetEqImpl::PlayoutMode() const {
|
| int NetEqImpl::NetworkStatistics(NetEqNetworkStatistics* stats) {
|
| CriticalSectionScoped lock(crit_sect_.get());
|
| assert(decoder_database_.get());
|
| - const int total_samples_in_buffers =
|
| + const size_t total_samples_in_buffers =
|
| packet_buffer_->NumSamplesInBuffer(decoder_database_.get(),
|
| decoder_frame_length_) +
|
| - static_cast<int>(sync_buffer_->FutureLength());
|
| + sync_buffer_->FutureLength();
|
| assert(delay_manager_.get());
|
| assert(decision_logic_.get());
|
| stats_.GetNetworkStatistics(fs_hz_, total_samples_in_buffers,
|
| @@ -603,7 +604,7 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header,
|
| }
|
|
|
| // Insert packets in buffer.
|
| - int temp_bufsize = packet_buffer_->NumPacketsInBuffer();
|
| + size_t temp_bufsize = packet_buffer_->NumPacketsInBuffer();
|
| ret = packet_buffer_->InsertPacketList(
|
| &packet_list,
|
| *decoder_database_,
|
| @@ -665,7 +666,8 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header,
|
| if ((temp_bufsize > 0) &&
|
| (temp_bufsize != decision_logic_->packet_length_samples())) {
|
| decision_logic_->set_packet_length_samples(temp_bufsize);
|
| - delay_manager_->SetPacketAudioLength((1000 * temp_bufsize) / fs_hz_);
|
| + delay_manager_->SetPacketAudioLength(
|
| + static_cast<int>((1000 * temp_bufsize) / fs_hz_));
|
| }
|
|
|
| // Update statistics.
|
| @@ -688,7 +690,7 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header,
|
|
|
| int NetEqImpl::GetAudioInternal(size_t max_length,
|
| int16_t* output,
|
| - int* samples_per_channel,
|
| + size_t* samples_per_channel,
|
| int* num_channels) {
|
| PacketList packet_list;
|
| DtmfEvent dtmf_event;
|
| @@ -712,7 +714,7 @@ int NetEqImpl::GetAudioInternal(size_t max_length,
|
| assert(vad_.get());
|
| bool sid_frame_available =
|
| (operation == kRfc3389Cng && !packet_list.empty());
|
| - vad_->Update(decoded_buffer_.get(), length, speech_type,
|
| + vad_->Update(decoded_buffer_.get(), static_cast<size_t>(length), speech_type,
|
| sid_frame_available, fs_hz_);
|
|
|
| algorithm_buffer_->Clear();
|
| @@ -811,12 +813,11 @@ int NetEqImpl::GetAudioInternal(size_t max_length,
|
| LOG(LS_WARNING) << "Output array is too short. " << max_length << " < " <<
|
| output_size_samples_ << " * " << sync_buffer_->Channels();
|
| num_output_samples = max_length;
|
| - num_output_samples_per_channel = static_cast<int>(
|
| - max_length / sync_buffer_->Channels());
|
| + num_output_samples_per_channel = max_length / sync_buffer_->Channels();
|
| }
|
| - const int samples_from_sync =
|
| - static_cast<int>(sync_buffer_->GetNextAudioInterleaved(
|
| - num_output_samples_per_channel, output));
|
| + const size_t samples_from_sync =
|
| + sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel,
|
| + output);
|
| *num_channels = static_cast<int>(sync_buffer_->Channels());
|
| LOG(LS_VERBOSE) << "Sync buffer (" << *num_channels << " channel(s)):" <<
|
| " insert " << algorithm_buffer_->Size() << " samples, extract " <<
|
| @@ -922,7 +923,8 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| last_mode_ == kModePreemptiveExpandSuccess ||
|
| last_mode_ == kModePreemptiveExpandLowEnergy) {
|
| // Subtract (samples_left + output_size_samples_) from sampleMemory.
|
| - decision_logic_->AddSampleMemory(-(samples_left + output_size_samples_));
|
| + decision_logic_->AddSampleMemory(
|
| + -(samples_left + rtc::checked_cast<int>(output_size_samples_)));
|
| }
|
|
|
| // Check if it is time to play a DTMF event.
|
| @@ -947,8 +949,10 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| // Check if we already have enough samples in the |sync_buffer_|. If so,
|
| // change decision to normal, unless the decision was merge, accelerate, or
|
| // preemptive expand.
|
| - if (samples_left >= output_size_samples_ && *operation != kMerge &&
|
| - *operation != kAccelerate && *operation != kFastAccelerate &&
|
| + if (samples_left >= rtc::checked_cast<int>(output_size_samples_) &&
|
| + *operation != kMerge &&
|
| + *operation != kAccelerate &&
|
| + *operation != kFastAccelerate &&
|
| *operation != kPreemptiveExpand) {
|
| *operation = kNormal;
|
| return 0;
|
| @@ -996,10 +1000,10 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| stats_.ResetMcu();
|
| }
|
|
|
| - int required_samples = output_size_samples_;
|
| - const int samples_10_ms = 80 * fs_mult_;
|
| - const int samples_20_ms = 2 * samples_10_ms;
|
| - const int samples_30_ms = 3 * samples_10_ms;
|
| + size_t required_samples = output_size_samples_;
|
| + const size_t samples_10_ms = static_cast<size_t>(80 * fs_mult_);
|
| + const size_t samples_20_ms = 2 * samples_10_ms;
|
| + const size_t samples_30_ms = 3 * samples_10_ms;
|
|
|
| switch (*operation) {
|
| case kExpand: {
|
| @@ -1028,17 +1032,17 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| case kAccelerate:
|
| case kFastAccelerate: {
|
| // In order to do an accelerate we need at least 30 ms of audio data.
|
| - if (samples_left >= samples_30_ms) {
|
| + if (samples_left >= static_cast<int>(samples_30_ms)) {
|
| // Already have enough data, so we do not need to extract any more.
|
| decision_logic_->set_sample_memory(samples_left);
|
| decision_logic_->set_prev_time_scale(true);
|
| return 0;
|
| - } else if (samples_left >= samples_10_ms &&
|
| + } else if (samples_left >= static_cast<int>(samples_10_ms) &&
|
| decoder_frame_length_ >= samples_30_ms) {
|
| // Avoid decoding more data as it might overflow the playout buffer.
|
| *operation = kNormal;
|
| return 0;
|
| - } else if (samples_left < samples_20_ms &&
|
| + } else if (samples_left < static_cast<int>(samples_20_ms) &&
|
| decoder_frame_length_ < samples_30_ms) {
|
| // Build up decoded data by decoding at least 20 ms of audio data. Do
|
| // not perform accelerate yet, but wait until we only need to do one
|
| @@ -1056,8 +1060,8 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| case kPreemptiveExpand: {
|
| // In order to do a preemptive expand we need at least 30 ms of decoded
|
| // audio data.
|
| - if ((samples_left >= samples_30_ms) ||
|
| - (samples_left >= samples_10_ms &&
|
| + if ((samples_left >= static_cast<int>(samples_30_ms)) ||
|
| + (samples_left >= static_cast<int>(samples_10_ms) &&
|
| decoder_frame_length_ >= samples_30_ms)) {
|
| // Already have enough data, so we do not need to extract any more.
|
| // Or, avoid decoding more data as it might overflow the playout buffer.
|
| @@ -1066,7 +1070,7 @@ int NetEqImpl::GetDecision(Operations* operation,
|
| decision_logic_->set_prev_time_scale(true);
|
| return 0;
|
| }
|
| - if (samples_left < samples_20_ms &&
|
| + if (samples_left < static_cast<int>(samples_20_ms) &&
|
| decoder_frame_length_ < samples_30_ms) {
|
| // Build up decoded data by decoding at least 20 ms of audio data.
|
| // Still try to perform preemptive expand.
|
| @@ -1123,7 +1127,7 @@ int NetEqImpl::GetDecision(Operations* operation,
|
|
|
| if (*operation == kAccelerate || *operation == kFastAccelerate) {
|
| // Check that we have enough data (30ms) to do accelerate.
|
| - if (extracted_samples + samples_left < samples_30_ms) {
|
| + if (extracted_samples + samples_left < static_cast<int>(samples_30_ms)) {
|
| // TODO(hlundin): Write test for this.
|
| // Not enough, do normal operation instead.
|
| *operation = kNormal;
|
| @@ -1274,7 +1278,7 @@ int NetEqImpl::DecodeLoop(PacketList* packet_list, Operations* operation,
|
| memset(&decoded_buffer_[*decoded_length], 0,
|
| decoder_frame_length_ * decoder->Channels() *
|
| sizeof(decoded_buffer_[0]));
|
| - decode_length = decoder_frame_length_;
|
| + decode_length = rtc::checked_cast<int>(decoder_frame_length_);
|
| } else if (!packet->primary) {
|
| // This is a redundant payload; call the special decoder method.
|
| LOG(LS_VERBOSE) << "Decoding packet (redundant):" <<
|
| @@ -1307,7 +1311,7 @@ int NetEqImpl::DecodeLoop(PacketList* packet_list, Operations* operation,
|
| *decoded_length += decode_length;
|
| // Update |decoder_frame_length_| with number of samples per channel.
|
| decoder_frame_length_ =
|
| - decode_length / static_cast<int>(decoder->Channels());
|
| + static_cast<size_t>(decode_length) / decoder->Channels();
|
| LOG(LS_VERBOSE) << "Decoded " << decode_length << " samples ("
|
| << decoder->Channels() << " channel(s) -> "
|
| << decoder_frame_length_ << " samples per channel)";
|
| @@ -1366,11 +1370,11 @@ void NetEqImpl::DoMerge(int16_t* decoded_buffer, size_t decoded_length,
|
| AudioDecoder::SpeechType speech_type, bool play_dtmf) {
|
| assert(mute_factor_array_.get());
|
| assert(merge_.get());
|
| - int new_length = merge_->Process(decoded_buffer, decoded_length,
|
| - mute_factor_array_.get(),
|
| - algorithm_buffer_.get());
|
| - int expand_length_correction = new_length -
|
| - static_cast<int>(decoded_length / algorithm_buffer_->Channels());
|
| + size_t new_length = merge_->Process(decoded_buffer, decoded_length,
|
| + mute_factor_array_.get(),
|
| + algorithm_buffer_.get());
|
| + size_t expand_length_correction = new_length -
|
| + decoded_length / algorithm_buffer_->Channels();
|
|
|
| // Update in-call and post-call statistics.
|
| if (expand_->MuteFactor(0) == 0) {
|
| @@ -1394,10 +1398,10 @@ void NetEqImpl::DoMerge(int16_t* decoded_buffer, size_t decoded_length,
|
|
|
| int NetEqImpl::DoExpand(bool play_dtmf) {
|
| while ((sync_buffer_->FutureLength() - expand_->overlap_length()) <
|
| - static_cast<size_t>(output_size_samples_)) {
|
| + output_size_samples_) {
|
| algorithm_buffer_->Clear();
|
| int return_value = expand_->Process(algorithm_buffer_.get());
|
| - int length = static_cast<int>(algorithm_buffer_->Size());
|
| + size_t length = algorithm_buffer_->Size();
|
|
|
| // Update in-call and post-call statistics.
|
| if (expand_->MuteFactor(0) == 0) {
|
| @@ -1428,7 +1432,8 @@ int NetEqImpl::DoAccelerate(int16_t* decoded_buffer,
|
| AudioDecoder::SpeechType speech_type,
|
| bool play_dtmf,
|
| bool fast_accelerate) {
|
| - const size_t required_samples = 240 * fs_mult_; // Must have 30 ms.
|
| + const size_t required_samples =
|
| + static_cast<size_t>(240 * fs_mult_); // Must have 30 ms.
|
| size_t borrowed_samples_per_channel = 0;
|
| size_t num_channels = algorithm_buffer_->Channels();
|
| size_t decoded_length_per_channel = decoded_length / num_channels;
|
| @@ -1444,7 +1449,7 @@ int NetEqImpl::DoAccelerate(int16_t* decoded_buffer,
|
| decoded_length = required_samples * num_channels;
|
| }
|
|
|
| - int16_t samples_removed;
|
| + size_t samples_removed;
|
| Accelerate::ReturnCodes return_code =
|
| accelerate_->Process(decoded_buffer, decoded_length, fast_accelerate,
|
| algorithm_buffer_.get(), &samples_removed);
|
| @@ -1501,20 +1506,20 @@ int NetEqImpl::DoPreemptiveExpand(int16_t* decoded_buffer,
|
| size_t decoded_length,
|
| AudioDecoder::SpeechType speech_type,
|
| bool play_dtmf) {
|
| - const size_t required_samples = 240 * fs_mult_; // Must have 30 ms.
|
| + const size_t required_samples =
|
| + static_cast<size_t>(240 * fs_mult_); // Must have 30 ms.
|
| size_t num_channels = algorithm_buffer_->Channels();
|
| - int borrowed_samples_per_channel = 0;
|
| - int old_borrowed_samples_per_channel = 0;
|
| + size_t borrowed_samples_per_channel = 0;
|
| + size_t old_borrowed_samples_per_channel = 0;
|
| size_t decoded_length_per_channel = decoded_length / num_channels;
|
| if (decoded_length_per_channel < required_samples) {
|
| // Must move data from the |sync_buffer_| in order to get 30 ms.
|
| - borrowed_samples_per_channel = static_cast<int>(required_samples -
|
| - decoded_length_per_channel);
|
| + borrowed_samples_per_channel =
|
| + required_samples - decoded_length_per_channel;
|
| // Calculate how many of these were already played out.
|
| - const int future_length = static_cast<int>(sync_buffer_->FutureLength());
|
| old_borrowed_samples_per_channel =
|
| - (borrowed_samples_per_channel > future_length) ?
|
| - (borrowed_samples_per_channel - future_length) : 0;
|
| + (borrowed_samples_per_channel > sync_buffer_->FutureLength()) ?
|
| + (borrowed_samples_per_channel - sync_buffer_->FutureLength()) : 0;
|
| memmove(&decoded_buffer[borrowed_samples_per_channel * num_channels],
|
| decoded_buffer,
|
| sizeof(int16_t) * decoded_length);
|
| @@ -1523,9 +1528,9 @@ int NetEqImpl::DoPreemptiveExpand(int16_t* decoded_buffer,
|
| decoded_length = required_samples * num_channels;
|
| }
|
|
|
| - int16_t samples_added;
|
| + size_t samples_added;
|
| PreemptiveExpand::ReturnCodes return_code = preemptive_expand_->Process(
|
| - decoded_buffer, static_cast<int>(decoded_length),
|
| + decoded_buffer, decoded_length,
|
| old_borrowed_samples_per_channel,
|
| algorithm_buffer_.get(), &samples_added);
|
| stats_.PreemptiveExpandedSamples(samples_added);
|
| @@ -1719,17 +1724,14 @@ int NetEqImpl::DoDtmf(const DtmfEvent& dtmf_event, bool* play_dtmf) {
|
|
|
| void NetEqImpl::DoAlternativePlc(bool increase_timestamp) {
|
| AudioDecoder* decoder = decoder_database_->GetActiveDecoder();
|
| - int length;
|
| + size_t length;
|
| if (decoder && decoder->HasDecodePlc()) {
|
| // Use the decoder's packet-loss concealment.
|
| // TODO(hlundin): Will probably need a longer buffer for multi-channel.
|
| int16_t decoded_buffer[kMaxFrameSize];
|
| length = decoder->DecodePlc(1, decoded_buffer);
|
| - if (length > 0) {
|
| + if (length > 0)
|
| algorithm_buffer_->PushBackInterleaved(decoded_buffer, length);
|
| - } else {
|
| - length = 0;
|
| - }
|
| } else {
|
| // Do simple zero-stuffing.
|
| length = output_size_samples_;
|
| @@ -1746,14 +1748,14 @@ void NetEqImpl::DoAlternativePlc(bool increase_timestamp) {
|
| int NetEqImpl::DtmfOverdub(const DtmfEvent& dtmf_event, size_t num_channels,
|
| int16_t* output) const {
|
| size_t out_index = 0;
|
| - int overdub_length = output_size_samples_; // Default value.
|
| + size_t overdub_length = output_size_samples_; // Default value.
|
|
|
| if (sync_buffer_->dtmf_index() > sync_buffer_->next_index()) {
|
| // Special operation for transition from "DTMF only" to "DTMF overdub".
|
| out_index = std::min(
|
| sync_buffer_->dtmf_index() - sync_buffer_->next_index(),
|
| - static_cast<size_t>(output_size_samples_));
|
| - overdub_length = output_size_samples_ - static_cast<int>(out_index);
|
| + output_size_samples_);
|
| + overdub_length = output_size_samples_ - out_index;
|
| }
|
|
|
| AudioMultiVector dtmf_output(num_channels);
|
| @@ -1765,13 +1767,14 @@ int NetEqImpl::DtmfOverdub(const DtmfEvent& dtmf_event, size_t num_channels,
|
| if (dtmf_return_value == 0) {
|
| dtmf_return_value = dtmf_tone_generator_->Generate(overdub_length,
|
| &dtmf_output);
|
| - assert((size_t) overdub_length == dtmf_output.Size());
|
| + assert(overdub_length == dtmf_output.Size());
|
| }
|
| dtmf_output.ReadInterleaved(overdub_length, &output[out_index]);
|
| return dtmf_return_value < 0 ? dtmf_return_value : 0;
|
| }
|
|
|
| -int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| +int NetEqImpl::ExtractPackets(size_t required_samples,
|
| + PacketList* packet_list) {
|
| bool first_packet = true;
|
| uint8_t prev_payload_type = 0;
|
| uint32_t prev_timestamp = 0;
|
| @@ -1790,7 +1793,7 @@ int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| // Packet extraction loop.
|
| do {
|
| timestamp_ = header->timestamp;
|
| - int discard_count = 0;
|
| + size_t discard_count = 0;
|
| Packet* packet = packet_buffer_->GetNextPacket(&discard_count);
|
| // |header| may be invalid after the |packet_buffer_| operation.
|
| header = NULL;
|
| @@ -1819,7 +1822,7 @@ int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| packet->header.payloadType);
|
| if (decoder) {
|
| if (packet->sync_packet) {
|
| - packet_duration = decoder_frame_length_;
|
| + packet_duration = rtc::checked_cast<int>(decoder_frame_length_);
|
| } else {
|
| if (packet->primary) {
|
| packet_duration = decoder->PacketDuration(packet->payload,
|
| @@ -1838,7 +1841,7 @@ int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| if (packet_duration <= 0) {
|
| // Decoder did not return a packet duration. Assume that the packet
|
| // contains the same number of samples as the previous one.
|
| - packet_duration = decoder_frame_length_;
|
| + packet_duration = rtc::checked_cast<int>(decoder_frame_length_);
|
| }
|
| extracted_samples = packet->header.timestamp - first_timestamp +
|
| packet_duration;
|
| @@ -1848,7 +1851,7 @@ int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| next_packet_available = false;
|
| if (header && prev_payload_type == header->payloadType) {
|
| int16_t seq_no_diff = header->sequenceNumber - prev_sequence_number;
|
| - int32_t ts_diff = header->timestamp - prev_timestamp;
|
| + size_t ts_diff = header->timestamp - prev_timestamp;
|
| if (seq_no_diff == 1 ||
|
| (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) {
|
| // The next sequence number is available, or the next part of a packet
|
| @@ -1857,7 +1860,8 @@ int NetEqImpl::ExtractPackets(int required_samples, PacketList* packet_list) {
|
| }
|
| prev_sequence_number = header->sequenceNumber;
|
| }
|
| - } while (extracted_samples < required_samples && next_packet_available);
|
| + } while (extracted_samples < rtc::checked_cast<int>(required_samples) &&
|
| + next_packet_available);
|
|
|
| if (extracted_samples > 0) {
|
| // Delete old packets only when we are going to decode something. Otherwise,
|
| @@ -1886,7 +1890,7 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) {
|
|
|
| fs_hz_ = fs_hz;
|
| fs_mult_ = fs_hz / 8000;
|
| - output_size_samples_ = kOutputSizeMs * 8 * fs_mult_;
|
| + output_size_samples_ = static_cast<size_t>(kOutputSizeMs * 8 * fs_mult_);
|
| decoder_frame_length_ = 3 * output_size_samples_; // Initialize to 30ms.
|
|
|
| last_mode_ = kModeNormal;
|
| @@ -1931,9 +1935,7 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) {
|
| accelerate_.reset(
|
| accelerate_factory_->Create(fs_hz, channels, *background_noise_));
|
| preemptive_expand_.reset(preemptive_expand_factory_->Create(
|
| - fs_hz, channels,
|
| - *background_noise_,
|
| - static_cast<int>(expand_->overlap_length())));
|
| + fs_hz, channels, *background_noise_, expand_->overlap_length()));
|
|
|
| // Delete ComfortNoise object and create a new one.
|
| comfort_noise_.reset(new ComfortNoise(fs_hz, decoder_database_.get(),
|
|
|