commit fae0f39dcc4a61317b7aa6ad025c9f504d4b5258 parent d7792eb45b0b8d057a8a0781f8f8f812d5da45fc Author: Dan Baker <dbaker@mozilla.com> Date: Mon, 27 Oct 2025 13:29:20 -0600 Bug 1995393 - Vendor libwebrtc from 5b6cc53a2e Upstream commit: https://webrtc.googlesource.com/src/+/5b6cc53a2e4ebccfb94cff4e8ab232d573f8471a clang-tidy: apply modernize-use-designated-initializer to audio/ modules/audio_coding modules/audio_processing split from https://webrtc-review.googlesource.com/c/src/+/404061 see there for full history and manual changes Bug: webrtc:424706384 Change-Id: I113bc2dab317c3b78b79acbffd2c62fad1d85ea0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/405042 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Philipp Hancke <phancke@meta.com> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#45445} Diffstat:
41 files changed, 502 insertions(+), 258 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor @@ -1,4 +1,4 @@ # ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc -libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-27T19:26:57.727641+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-27T19:29:02.897056+00:00. # base of lastest vendoring -b93e2b78f3 +5b6cc53a2e diff --git a/third_party/libwebrtc/audio/audio_receive_stream_unittest.cc b/third_party/libwebrtc/audio/audio_receive_stream_unittest.cc @@ -74,42 +74,47 @@ constexpr double kTotalOutputEnergy = 0.25; constexpr double kTotalOutputDuration = 0.5; constexpr int64_t kPlayoutNtpTimestampMs = 5678; -const ChannelReceiveStatistics kChannelStats = {678, 234, -12, 567, - 78, 890, 123}; +const ChannelReceiveStatistics kChannelStats = { + .packets_lost = 678, + .jitter_ms = 234, + .payload_bytes_received = -12, + .header_and_padding_bytes_received = 567, + .packets_received = 78, + .packets_received_with_ect1 = 890, + .packets_received_with_ce = 123}; const std::pair<int, SdpAudioFormat> kReceiveCodec = { 123, {"codec_name_recv", 96000, 0}}; -const NetworkStatistics kNetworkStats = { - /*currentBufferSize=*/123, - /*preferredBufferSize=*/456, - /*jitterPeaksFound=*/false, - /*totalSamplesReceived=*/789012, - /*concealedSamples=*/3456, - /*silentConcealedSamples=*/123, - /*concealmentEvents=*/456, - /*jitterBufferDelayMs=*/789, - /*jitterBufferEmittedCount=*/543, - /*jitterBufferTargetDelayMs=*/123, - /*jitterBufferMinimumDelayMs=*/222, - /*insertedSamplesForDeceleration=*/432, - /*removedSamplesForAcceleration=*/321, - /*fecPacketsReceived=*/123, - /*fecPacketsDiscarded=*/101, - /*totalProcessingDelayMs=*/154, - /*packetsDiscarded=*/989, - /*currentExpandRate=*/789, - /*currentSpeechExpandRate=*/12, - /*currentPreemptiveRate=*/345, - /*currentAccelerateRate =*/678, - /*currentSecondaryDecodedRate=*/901, - /*currentSecondaryDiscardedRate=*/0, - /*meanWaitingTimeMs=*/-1, - /*maxWaitingTimeMs=*/-1, - /*packetBufferFlushes=*/0, - /*delayedPacketOutageSamples=*/0, - /*relativePacketArrivalDelayMs=*/135, - /*interruptionCount=*/-1, - /*totalInterruptionDurationMs=*/-1}; +const NetworkStatistics kNetworkStats = {.currentBufferSize = 123, + .preferredBufferSize = 456, + .jitterPeaksFound = false, + .totalSamplesReceived = 789012, + .concealedSamples = 3456, + .silentConcealedSamples = 123, + .concealmentEvents = 456, + .jitterBufferDelayMs = 789, + .jitterBufferTargetDelayMs = 543, + .jitterBufferMinimumDelayMs = 123, + .jitterBufferEmittedCount = 222, + .insertedSamplesForDeceleration = 432, + .removedSamplesForAcceleration = 321, + .fecPacketsReceived = 123, + .fecPacketsDiscarded = 101, + .totalProcessingDelayUs = 154, + .packetsDiscarded = 989, + .currentExpandRate = 789, + .currentSpeechExpandRate = 12, + .currentPreemptiveRate = 345, + .currentAccelerateRate = 678, + .currentSecondaryDecodedRate = 901, + .currentSecondaryDiscardedRate = 0, + .meanWaitingTimeMs = -1, + .maxWaitingTimeMs = -1, + .packetBufferFlushes = 0, + .delayedPacketOutageSamples = 0, + .relativePacketArrivalDelayMs = 135, + .interruptionCount = -1, + .totalInterruptionDurationMs = -1}; const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); struct ConfigHelper { diff --git a/third_party/libwebrtc/audio/audio_send_stream.cc b/third_party/libwebrtc/audio/audio_send_stream.cc @@ -847,11 +847,14 @@ void AudioSendStream::ConfigureBitrateObserver() { bitrate_allocator_->AddObserver( this, MediaStreamAllocationConfig{ - constraints->min.bps<uint32_t>(), constraints->max.bps<uint32_t>(), 0, - priority_bitrate.bps(), true, - allocation_settings_.bitrate_priority.value_or( + .min_bitrate_bps = constraints->min.bps<uint32_t>(), + .max_bitrate_bps = constraints->max.bps<uint32_t>(), + .pad_up_bitrate_bps = 0, + .priority_bitrate_bps = priority_bitrate.bps(), + .enforce_min_bitrate = true, + .bitrate_priority = allocation_settings_.bitrate_priority.value_or( config_.bitrate_priority), - TrackRateElasticity::kCanContributeUnusedRate}); + .rate_elasticity = TrackRateElasticity::kCanContributeUnusedRate}); registered_with_allocator_ = true; } @@ -871,8 +874,8 @@ AudioSendStream::GetMinMaxBitrateConstraints() const { return std::nullopt; } TargetAudioBitrateConstraints constraints{ - DataRate::BitsPerSec(config_.min_bitrate_bps), - DataRate::BitsPerSec(config_.max_bitrate_bps)}; + .min = DataRate::BitsPerSec(config_.min_bitrate_bps), + .max = DataRate::BitsPerSec(config_.max_bitrate_bps)}; // If bitrates were explicitly overriden via field trial, use those values. if (allocation_settings_.min_bitrate) diff --git a/third_party/libwebrtc/audio/audio_send_stream_unittest.cc b/third_party/libwebrtc/audio/audio_send_stream_unittest.cc @@ -90,8 +90,11 @@ constexpr double kEchoReturnLoss = -65; constexpr double kEchoReturnLossEnhancement = 101; constexpr double kResidualEchoLikelihood = -1.0f; constexpr double kResidualEchoLikelihoodMax = 23.0f; -constexpr ChannelSendStatistics kChannelStats = {TimeDelta::Millis(112), 12, - 13456, 17890}; +constexpr ChannelSendStatistics kChannelStats = { + .round_trip_time = TimeDelta::Millis(112), + .payload_bytes_sent = 12, + .header_and_padding_bytes_sent = 13456, + .retransmitted_bytes_sent = 17890}; constexpr int kFractionLost = 123; constexpr int kCumulativeLost = 567; constexpr uint32_t kInterarrivalJitter = 132; @@ -104,9 +107,9 @@ const SdpAudioFormat kIsacFormat = {"isac", 16000, 1}; const SdpAudioFormat kOpusFormat = {"opus", 48000, 2}; const SdpAudioFormat kG722Format = {"g722", 8000, 1}; const AudioCodecSpec kCodecSpecs[] = { - {kIsacFormat, {16000, 1, 32000, 10000, 32000}}, - {kOpusFormat, {48000, 1, 32000, 6000, 510000}}, - {kG722Format, {16000, 1, 64000}}}; + {.format = kIsacFormat, .info = {16000, 1, 32000, 10000, 32000}}, + {.format = kOpusFormat, .info = {48000, 1, 32000, 6000, 510000}}, + {.format = kG722Format, .info = {16000, 1, 64000}}}; // TODO(dklee): This mirrors calculation in audio_send_stream.cc, which // should be made more precise in the future. This can be changed when that diff --git a/third_party/libwebrtc/audio/utility/channel_mixing_matrix_unittest.cc b/third_party/libwebrtc/audio/utility/channel_mixing_matrix_unittest.cc @@ -353,9 +353,9 @@ TEST(ChannelMixingMatrixTest, DiscreteToDiscrete) { int input_channels; int output_channels; } test_case[] = { - {2, 2}, - {2, 5}, - {5, 2}, + {.input_channels = 2, .output_channels = 2}, + {.input_channels = 2, .output_channels = 5}, + {.input_channels = 5, .output_channels = 2}, }; for (auto [input_channels, output_channels] : test_case) { diff --git a/third_party/libwebrtc/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/third_party/libwebrtc/modules/audio_coding/acm2/audio_coding_module_unittest.cc @@ -322,19 +322,19 @@ class AudioCodingModuleTestWithComfortNoiseOldApi const struct { int ix; AudioFrameType type; - } expectation[] = {{2, AudioFrameType::kAudioFrameCN}, - {5, AudioFrameType::kEmptyFrame}, - {8, AudioFrameType::kEmptyFrame}, - {11, AudioFrameType::kAudioFrameCN}, - {14, AudioFrameType::kEmptyFrame}, - {17, AudioFrameType::kEmptyFrame}, - {20, AudioFrameType::kAudioFrameCN}, - {23, AudioFrameType::kEmptyFrame}, - {26, AudioFrameType::kEmptyFrame}, - {29, AudioFrameType::kEmptyFrame}, - {32, AudioFrameType::kAudioFrameCN}, - {35, AudioFrameType::kEmptyFrame}, - {38, AudioFrameType::kEmptyFrame}}; + } expectation[] = {{.ix = 2, .type = AudioFrameType::kAudioFrameCN}, + {.ix = 5, .type = AudioFrameType::kEmptyFrame}, + {.ix = 8, .type = AudioFrameType::kEmptyFrame}, + {.ix = 11, .type = AudioFrameType::kAudioFrameCN}, + {.ix = 14, .type = AudioFrameType::kEmptyFrame}, + {.ix = 17, .type = AudioFrameType::kEmptyFrame}, + {.ix = 20, .type = AudioFrameType::kAudioFrameCN}, + {.ix = 23, .type = AudioFrameType::kEmptyFrame}, + {.ix = 26, .type = AudioFrameType::kEmptyFrame}, + {.ix = 29, .type = AudioFrameType::kEmptyFrame}, + {.ix = 32, .type = AudioFrameType::kAudioFrameCN}, + {.ix = 35, .type = AudioFrameType::kEmptyFrame}, + {.ix = 38, .type = AudioFrameType::kEmptyFrame}}; for (int i = 0; i < kLoops; ++i) { int num_calls_before = packet_cb_.num_calls(); EXPECT_EQ(i / blocks_per_packet, num_calls_before); diff --git a/third_party/libwebrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc b/third_party/libwebrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc @@ -46,7 +46,8 @@ LegacyEncodedAudioFrame::Decode(ArrayView<int16_t> decoded) const { if (ret < 0) return std::nullopt; - return DecodeResult{static_cast<size_t>(ret), speech_type}; + return DecodeResult{.num_decoded_samples = static_cast<size_t>(ret), + .speech_type = speech_type}; } std::vector<AudioDecoder::ParseResult> LegacyEncodedAudioFrame::SplitBySamples( diff --git a/third_party/libwebrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc b/third_party/libwebrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc @@ -118,9 +118,13 @@ TEST_P(SplitBySamplesTest, PayloadSizes) { // 40 ms -> 20 + 20 ms // 50 ms -> 25 + 25 ms // 60 ms -> 30 + 30 ms - ExpectedSplit expected_splits[] = {{10, 1, {10}}, {20, 1, {20}}, - {30, 1, {30}}, {40, 2, {20, 20}}, - {50, 2, {25, 25}}, {60, 2, {30, 30}}}; + ExpectedSplit expected_splits[] = { + {.payload_size_ms = 10, .num_frames = 1, .frame_sizes = {10}}, + {.payload_size_ms = 20, .num_frames = 1, .frame_sizes = {20}}, + {.payload_size_ms = 30, .num_frames = 1, .frame_sizes = {30}}, + {.payload_size_ms = 40, .num_frames = 2, .frame_sizes = {20, 20}}, + {.payload_size_ms = 50, .num_frames = 2, .frame_sizes = {25, 25}}, + {.payload_size_ms = 60, .num_frames = 2, .frame_sizes = {30, 30}}}; for (const auto& expected_split : expected_splits) { // The payload values are set to steadily increase (modulo 256), so that the diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/decision_logic_unittest.cc b/third_party/libwebrtc/modules/audio_coding/neteq/decision_logic_unittest.cc @@ -52,7 +52,8 @@ NetEqController::NetEqStatus CreateNetEqStatus(NetEq::Mode last_mode, status.packet_buffer_info.span_samples_wait_time = current_delay_ms * kSamplesPerMs; status.packet_buffer_info.dtx_or_cng = false; - status.next_packet = {status.target_timestamp, false, false}; + status.next_packet = { + .timestamp = status.target_timestamp, .is_dtx = false, .is_cng = false}; status.sync_buffer_samples = 0; return status; } diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc b/third_party/libwebrtc/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc @@ -233,7 +233,8 @@ TestStatistics RunTest(int loss_cadence, auto lifetime_stats = neteq_test.LifetimeStats(); EXPECT_EQ(dec.concealed_samples(), lifetime_stats.concealed_samples); EXPECT_EQ(dec.concealment_events(), lifetime_stats.concealment_events); - return {neteq_test.SimulationStats(), neteq_test.LifetimeStats()}; + return {.network = neteq_test.SimulationStats(), + .lifetime = neteq_test.LifetimeStats()}; } } // namespace diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/neteq_impl.cc b/third_party/libwebrtc/modules/audio_coding/neteq/neteq_impl.cc @@ -397,10 +397,10 @@ std::optional<NetEq::DecoderFormat> NetEqImpl::GetCurrentDecoderFormat() const { return std::nullopt; } return DecoderFormat{ - /*payload_type=*/*current_rtp_payload_type_, - /*sample_rate_hz=*/di->SampleRateHz(), - /*num_channels=*/dchecked_cast<int>(di->GetDecoder()->Channels()), - /*sdp_format=*/di->GetFormat()}; + .payload_type = *current_rtp_payload_type_, + .sample_rate_hz = di->SampleRateHz(), + .num_channels = dchecked_cast<int>(di->GetDecoder()->Channels()), + .sdp_format = di->GetFormat()}; } void NetEqImpl::FlushBuffers() { @@ -1073,8 +1073,9 @@ int NetEqImpl::GetDecision(Operation* operation, status.sync_buffer_samples = sync_buffer_->FutureLength(); if (packet) { status.next_packet = { - packet->timestamp, packet->frame && packet->frame->IsDtxPacket(), - decoder_database_->IsComfortNoise(packet->payload_type)}; + .timestamp = packet->timestamp, + .is_dtx = packet->frame && packet->frame->IsDtxPacket(), + .is_cng = decoder_database_->IsComfortNoise(packet->payload_type)}; } *operation = controller_->GetDecision(status, &reset_decoder_); diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/third_party/libwebrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc @@ -82,7 +82,9 @@ class MockAudioDecoder final : public AudioDecoder { if (decoded.size() >= output_size) { memset(decoded.data(), 0, sizeof(int16_t) * kPacketDuration * num_channels_); - return DecodeResult{kPacketDuration * num_channels_, kSpeech}; + return DecodeResult{ + .num_decoded_samples = kPacketDuration * num_channels_, + .speech_type = kSpeech}; } else { ADD_FAILURE() << "Expected decoded.size() to be >= output_size (" << decoded.size() << " vs. " << output_size << ")"; @@ -276,18 +278,29 @@ class NetEqNetworkStatsTest { void DecodeFecTest() { decoder_->set_fec_enabled(false); - NetEqNetworkStatsCheck expects = {kIgnore, // current_buffer_size_ms - kIgnore, // preferred_buffer_size_ms - kIgnore, // jitter_peaks_found - kEqual, // packet_loss_rate - kEqual, // expand_rate - kEqual, // voice_expand_rate - kIgnore, // preemptive_rate - kEqual, // accelerate_rate - kEqual, // decoded_fec_rate - kEqual, // discarded_fec_rate - kEqual, // added_zero_samples - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + NetEqNetworkStatsCheck expects = { + .current_buffer_size_ms = kIgnore, + .preferred_buffer_size_ms = kIgnore, + .jitter_peaks_found = kIgnore, + .packet_loss_rate = kEqual, + .expand_rate = kEqual, + .speech_expand_rate = kEqual, + .preemptive_rate = kIgnore, + .accelerate_rate = kEqual, + .secondary_decoded_rate = kEqual, + .secondary_discarded_rate = kEqual, + .added_zero_samples = kEqual, + .stats_ref = {.current_buffer_size_ms = 0, + .preferred_buffer_size_ms = 0, + .jitter_peaks_found = 0, + .expand_rate = 0, + .speech_expand_rate = 0, + .preemptive_rate = 0, + .accelerate_rate = 0, + .secondary_decoded_rate = 0, + .secondary_discarded_rate = 0, + .mean_waiting_time_ms = 0, + .median_waiting_time_ms = 0}}; RunTest(50, expects); // Next we introduce packet losses. @@ -306,18 +319,29 @@ class NetEqNetworkStatsTest { } void NoiseExpansionTest() { - NetEqNetworkStatsCheck expects = {kIgnore, // current_buffer_size_ms - kIgnore, // preferred_buffer_size_ms - kIgnore, // jitter_peaks_found - kEqual, // packet_loss_rate - kEqual, // expand_rate - kEqual, // speech_expand_rate - kIgnore, // preemptive_rate - kEqual, // accelerate_rate - kEqual, // decoded_fec_rate - kEqual, // discard_fec_rate - kEqual, // added_zero_samples - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + NetEqNetworkStatsCheck expects = { + .current_buffer_size_ms = kIgnore, + .preferred_buffer_size_ms = kIgnore, + .jitter_peaks_found = kIgnore, + .packet_loss_rate = kEqual, + .expand_rate = kEqual, + .speech_expand_rate = kEqual, + .preemptive_rate = kIgnore, + .accelerate_rate = kEqual, + .secondary_decoded_rate = kEqual, + .secondary_discarded_rate = kEqual, + .added_zero_samples = kEqual, + .stats_ref = {.current_buffer_size_ms = 0, + .preferred_buffer_size_ms = 0, + .jitter_peaks_found = 0, + .expand_rate = 0, + .speech_expand_rate = 0, + .preemptive_rate = 0, + .accelerate_rate = 0, + .secondary_decoded_rate = 0, + .secondary_discarded_rate = 0, + .mean_waiting_time_ms = 0, + .median_waiting_time_ms = 0}}; RunTest(50, expects); SetPacketLossRate(1); diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/packet_buffer_unittest.cc b/third_party/libwebrtc/modules/audio_coding/neteq/packet_buffer_unittest.cc @@ -212,15 +212,96 @@ TEST(PacketBuffer, ExtractOrderRedundancy) { const int kPayloadLength = 10; PacketsToInsert packet_facts[kPackets] = { - {0xFFFD, 0xFFFFFFD7, 0, true, 0}, {0xFFFE, 0xFFFFFFE1, 0, true, 1}, - {0xFFFE, 0xFFFFFFD7, 1, false, -1}, {0xFFFF, 0xFFFFFFEB, 0, true, 2}, - {0xFFFF, 0xFFFFFFE1, 1, false, -1}, {0x0000, 0xFFFFFFF5, 0, true, 3}, - {0x0000, 0xFFFFFFEB, 1, false, -1}, {0x0001, 0xFFFFFFFF, 0, true, 4}, - {0x0001, 0xFFFFFFF5, 1, false, -1}, {0x0002, 0x0000000A, 0, true, 5}, - {0x0002, 0xFFFFFFFF, 1, false, -1}, {0x0003, 0x0000000A, 1, false, -1}, - {0x0004, 0x0000001E, 0, true, 7}, {0x0004, 0x00000014, 1, false, 6}, - {0x0005, 0x0000001E, 0, true, -1}, {0x0005, 0x00000014, 1, false, -1}, - {0x0006, 0x00000028, 0, true, 8}, {0x0006, 0x0000001E, 1, false, -1}, + {.sequence_number = 0xFFFD, + .timestamp = 0xFFFFFFD7, + .payload_type = 0, + .primary = true, + .extract_order = 0}, + {.sequence_number = 0xFFFE, + .timestamp = 0xFFFFFFE1, + .payload_type = 0, + .primary = true, + .extract_order = 1}, + {.sequence_number = 0xFFFE, + .timestamp = 0xFFFFFFD7, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0xFFFF, + .timestamp = 0xFFFFFFEB, + .payload_type = 0, + .primary = true, + .extract_order = 2}, + {.sequence_number = 0xFFFF, + .timestamp = 0xFFFFFFE1, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0000, + .timestamp = 0xFFFFFFF5, + .payload_type = 0, + .primary = true, + .extract_order = 3}, + {.sequence_number = 0x0000, + .timestamp = 0xFFFFFFEB, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0001, + .timestamp = 0xFFFFFFFF, + .payload_type = 0, + .primary = true, + .extract_order = 4}, + {.sequence_number = 0x0001, + .timestamp = 0xFFFFFFF5, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0002, + .timestamp = 0x0000000A, + .payload_type = 0, + .primary = true, + .extract_order = 5}, + {.sequence_number = 0x0002, + .timestamp = 0xFFFFFFFF, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0003, + .timestamp = 0x0000000A, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0004, + .timestamp = 0x0000001E, + .payload_type = 0, + .primary = true, + .extract_order = 7}, + {.sequence_number = 0x0004, + .timestamp = 0x00000014, + .payload_type = 1, + .primary = false, + .extract_order = 6}, + {.sequence_number = 0x0005, + .timestamp = 0x0000001E, + .payload_type = 0, + .primary = true, + .extract_order = -1}, + {.sequence_number = 0x0005, + .timestamp = 0x00000014, + .payload_type = 1, + .primary = false, + .extract_order = -1}, + {.sequence_number = 0x0006, + .timestamp = 0x00000028, + .payload_type = 0, + .primary = true, + .extract_order = 8}, + {.sequence_number = 0x0006, + .timestamp = 0x0000001E, + .payload_type = 1, + .primary = false, + .extract_order = -1}, }; MockDecoderDatabase decoder_database; diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.cc b/third_party/libwebrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.cc @@ -47,11 +47,13 @@ class FakeEncodedFrame : public AudioDecoder::EncodedAudioFrame { ArrayView<int16_t> decoded) const override { if (is_dtx_) { std::fill_n(decoded.data(), duration_, 0); - return DecodeResult{duration_, AudioDecoder::kComfortNoise}; + return DecodeResult{.num_decoded_samples = duration_, + .speech_type = AudioDecoder::kComfortNoise}; } decoder_->ReadFromFile(timestamp_, duration_, decoded.data()); - return DecodeResult{Duration(), AudioDecoder::kSpeech}; + return DecodeResult{.num_decoded_samples = Duration(), + .speech_type = AudioDecoder::kSpeech}; } bool IsDtxPacket() const override { return is_dtx_; } diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/tools/rtp_encode.cc b/third_party/libwebrtc/modules/audio_coding/neteq/tools/rtp_encode.cc @@ -86,14 +86,38 @@ struct CodecTypeAndInfo { const std::map<std::string, CodecTypeAndInfo>& CodecList() { static const auto* const codec_list = new std::map<std::string, CodecTypeAndInfo>{ - {"opus", {CodecType::kOpus, 111, true}}, - {"pcmu", {CodecType::kPcmU, 0, false}}, - {"pcma", {CodecType::kPcmA, 8, false}}, - {"g722", {CodecType::kG722, 9, false}}, - {"pcm16b_8", {CodecType::kPcm16b8, 93, false}}, - {"pcm16b_16", {CodecType::kPcm16b16, 94, false}}, - {"pcm16b_32", {CodecType::kPcm16b32, 95, false}}, - {"pcm16b_48", {CodecType::kPcm16b48, 96, false}}}; + {"opus", + {.type = CodecType::kOpus, + .default_payload_type = 111, + .internal_dtx = true}}, + {"pcmu", + {.type = CodecType::kPcmU, + .default_payload_type = 0, + .internal_dtx = false}}, + {"pcma", + {.type = CodecType::kPcmA, + .default_payload_type = 8, + .internal_dtx = false}}, + {"g722", + {.type = CodecType::kG722, + .default_payload_type = 9, + .internal_dtx = false}}, + {"pcm16b_8", + {.type = CodecType::kPcm16b8, + .default_payload_type = 93, + .internal_dtx = false}}, + {"pcm16b_16", + {.type = CodecType::kPcm16b16, + .default_payload_type = 94, + .internal_dtx = false}}, + {"pcm16b_32", + {.type = CodecType::kPcm16b32, + .default_payload_type = 95, + .internal_dtx = false}}, + {"pcm16b_48", + {.type = CodecType::kPcm16b48, + .default_payload_type = 96, + .internal_dtx = false}}}; return *codec_list; } diff --git a/third_party/libwebrtc/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/third_party/libwebrtc/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc @@ -467,10 +467,22 @@ TEST_P(AdaptiveFirFilterMultiChannel, FilterAndAdapt) { EchoCanceller3Config config; if (num_render_channels == 33) { - config.filter.refined = {13, 0.00005f, 0.0005f, 0.0001f, 2.f, 20075344.f}; - config.filter.coarse = {13, 0.1f, 20075344.f}; - config.filter.refined_initial = {12, 0.005f, 0.5f, 0.001f, 2.f, 20075344.f}; - config.filter.coarse_initial = {12, 0.7f, 20075344.f}; + config.filter.refined = {.length_blocks = 13, + .leakage_converged = 0.00005f, + .leakage_diverged = 0.0005f, + .error_floor = 0.0001f, + .error_ceil = 2.f, + .noise_gate = 20075344.f}; + config.filter.coarse = { + .length_blocks = 13, .rate = 0.1f, .noise_gate = 20075344.f}; + config.filter.refined_initial = {.length_blocks = 12, + .leakage_converged = 0.005f, + .leakage_diverged = 0.5f, + .error_floor = 0.001f, + .error_ceil = 2.f, + .noise_gate = 20075344.f}; + config.filter.coarse_initial = { + .length_blocks = 12, .rate = 0.7f, .noise_gate = 20075344.f}; } AdaptiveFirFilter filter( @@ -512,7 +524,7 @@ TEST_P(AdaptiveFirFilterMultiChannel, FilterAndAdapt) { // [B,A] = butter(2,100/8000,'high') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients = {{ - {{0.97261f, -1.94523f, 0.97261f}, {-1.94448f, 0.94598f}}, + {.b = {0.97261f, -1.94523f, 0.97261f}, .a = {-1.94448f, 0.94598f}}, }}; for (auto& Y2_ch : Y2) { Y2_ch.fill(0.f); diff --git a/third_party/libwebrtc/modules/audio_processing/aec3/coarse_filter_update_gain_unittest.cc b/third_party/libwebrtc/modules/audio_processing/aec3/coarse_filter_update_gain_unittest.cc @@ -150,7 +150,7 @@ TEST(CoarseFilterUpdateGainDeathTest, NullDataOutputGain) { RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); FftData E; const EchoCanceller3Config::Filter::CoarseConfiguration& config = { - 12, 0.5f, 220075344.f}; + .length_blocks = 12, .rate = 0.5f, .noise_gate = 220075344.f}; CoarseFilterUpdateGain gain(config, 250); std::array<float, kFftLengthBy2Plus1> render_power; render_power.fill(0.f); diff --git a/third_party/libwebrtc/modules/audio_processing/aec3/decimator.cc b/third_party/libwebrtc/modules/audio_processing/aec3/decimator.cc @@ -22,28 +22,33 @@ namespace { // signal.ellip(6, 1, 40, 1800/8000, 'lowpass', output='sos') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 3> kLowPassFilterDs4 = {{ - {{0.0180919877f, 0.00320961363f, 0.0180919877f}, - {-1.5183195f, 0.633165865f}}, - {{1.0f, -1.24550459f, 1.0f}, {-1.49784254f, 0.853586692f}}, - {{1.0f, -1.4221681f, 1.0f}, {-1.49791282f, 0.969572384f}}, + {.b = {0.0180919877f, 0.00320961363f, 0.0180919877f}, + .a = {-1.5183195f, 0.633165865f}}, + {.b = {1.0f, -1.24550459f, 1.0f}, .a = {-1.49784254f, 0.853586692f}}, + {.b = {1.0f, -1.4221681f, 1.0f}, .a = {-1.49791282f, 0.969572384f}}, }}; // signal.cheby1(1, 6, [1000/8000, 2000/8000], 'bandpass', output='sos') // repeated 5 times. constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 5> kBandPassFilterDs8 = {{ - {{0.103304783f, 0.0f, -0.103304783f}, {-1.520363f, 0.793390435f}}, - {{0.103304783f, 0.0f, -0.103304783f}, {-1.520363f, 0.793390435f}}, - {{0.103304783f, 0.0f, -0.103304783f}, {-1.520363f, 0.793390435f}}, - {{0.103304783f, 0.0f, -0.103304783f}, {-1.520363f, 0.793390435f}}, - {{0.103304783f, 0.0f, -0.103304783f}, {-1.520363f, 0.793390435f}}, + {.b = {0.103304783f, 0.0f, -0.103304783f}, + .a = {-1.520363f, 0.793390435f}}, + {.b = {0.103304783f, 0.0f, -0.103304783f}, + .a = {-1.520363f, 0.793390435f}}, + {.b = {0.103304783f, 0.0f, -0.103304783f}, + .a = {-1.520363f, 0.793390435f}}, + {.b = {0.103304783f, 0.0f, -0.103304783f}, + .a = {-1.520363f, 0.793390435f}}, + {.b = {0.103304783f, 0.0f, -0.103304783f}, + .a = {-1.520363f, 0.793390435f}}, }}; // signal.butter(2, 1000/8000.0, 'highpass', output='sos') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilter = {{ - {{0.757076375f, -1.51415275f, 0.757076375f}, - {-1.45424359f, 0.574061915f}}, + {.b = {0.757076375f, -1.51415275f, 0.757076375f}, + .a = {-1.45424359f, 0.574061915f}}, }}; constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 0> diff --git a/third_party/libwebrtc/modules/audio_processing/aec3/subtractor_unittest.cc b/third_party/libwebrtc/modules/audio_processing/aec3/subtractor_unittest.cc @@ -100,7 +100,7 @@ std::vector<float> RunSubtractorTest( // [B,A] = butter(2,100/8000,'high') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients = {{ - {{0.97261f, -1.94523f, 0.97261f}, {-1.94448f, 0.94598f}}, + {.b = {0.97261f, -1.94523f, 0.97261f}, .a = {-1.94448f, 0.94598f}}, }}; std::vector<std::unique_ptr<CascadedBiQuadFilter>> x_hp_filter( num_render_channels); diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/biquad_filter_unittest.cc b/third_party/libwebrtc/modules/audio_processing/agc2/biquad_filter_unittest.cc @@ -40,8 +40,8 @@ constexpr FloatArraySequence kBiQuadInputSeq = { // Computed as `scipy.signal.butter(N=2, Wn=60/24000, btype='highpass')`. constexpr BiQuadFilter::Config kBiQuadConfig{ - {0.99446179f, -1.98892358f, 0.99446179f}, - {-1.98889291f, 0.98895425f}}; + .b = {0.99446179f, -1.98892358f, 0.99446179f}, + .a = {-1.98889291f, 0.98895425f}}; // Comparing to scipy. The expected output is generated as follows: // zi = np.float32([0, 0]) @@ -118,16 +118,16 @@ TEST(BiQuadFilterTest, FilterInPlace) { // Checks that different configurations produce different outputs. TEST(BiQuadFilterTest, SetConfigDifferentOutput) { - BiQuadFilter filter(/*config=*/{{0.97803048f, -1.95606096f, 0.97803048f}, - {-1.95557824f, 0.95654368f}}); + BiQuadFilter filter(/*config=*/{.b = {0.97803048f, -1.95606096f, 0.97803048f}, + .a = {-1.95557824f, 0.95654368f}}); std::array<float, kFrameSize> samples1; for (int i = 0; i < kNumFrames; ++i) { filter.Process(kBiQuadInputSeq[i], samples1); } - filter.SetConfig( - {{0.09763107f, 0.19526215f, 0.09763107f}, {-0.94280904f, 0.33333333f}}); + filter.SetConfig({.b = {0.09763107f, 0.19526215f, 0.09763107f}, + .a = {-0.94280904f, 0.33333333f}}); std::array<float, kFrameSize> samples2; for (int i = 0; i < kNumFrames; ++i) { filter.Process(kBiQuadInputSeq[i], samples2); diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc @@ -126,7 +126,8 @@ class ClippingEventPredictor : public ClippingPredictor { peak = std::max(std::fabs(sample), peak); } ch_buffers_[channel]->Push( - {sum_squares / static_cast<float>(samples_per_channel), peak}); + {.average = sum_squares / static_cast<float>(samples_per_channel), + .max = peak}); } } @@ -266,7 +267,8 @@ class ClippingPeakPredictor : public ClippingPredictor { peak = std::max(std::fabs(sample), peak); } ch_buffers_[channel]->Push( - {sum_squares / static_cast<float>(samples_per_channel), peak}); + {.average = sum_squares / static_cast<float>(samples_per_channel), + .max = peak}); } } diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_level_buffer.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_level_buffer.cc @@ -72,7 +72,8 @@ ClippingPredictorLevelBuffer::ComputePartialMetrics(int delay, sum += data_[idx].average; max = std::fmax(data_[idx].max, max); } - return std::optional<Level>({sum / static_cast<float>(num_items), max}); + return std::optional<Level>( + {.average = sum / static_cast<float>(num_items), .max = max}); } } // namespace webrtc diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_level_buffer_unittest.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_level_buffer_unittest.cc @@ -37,7 +37,7 @@ TEST_P(ClippingPredictorLevelBufferParametrization, CheckEmptyBufferSize) { TEST_P(ClippingPredictorLevelBufferParametrization, CheckHalfEmptyBufferSize) { ClippingPredictorLevelBuffer buffer(capacity()); for (int i = 0; i < buffer.Capacity() / 2; ++i) { - buffer.Push({2, 4}); + buffer.Push({.average = 2, .max = 4}); } EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1)); EXPECT_EQ(buffer.Size(), std::max(capacity(), 1) / 2); @@ -46,7 +46,7 @@ TEST_P(ClippingPredictorLevelBufferParametrization, CheckHalfEmptyBufferSize) { TEST_P(ClippingPredictorLevelBufferParametrization, CheckFullBufferSize) { ClippingPredictorLevelBuffer buffer(capacity()); for (int i = 0; i < buffer.Capacity(); ++i) { - buffer.Push({2, 4}); + buffer.Push({.average = 2, .max = 4}); } EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1)); EXPECT_EQ(buffer.Size(), std::max(capacity(), 1)); @@ -55,7 +55,7 @@ TEST_P(ClippingPredictorLevelBufferParametrization, CheckFullBufferSize) { TEST_P(ClippingPredictorLevelBufferParametrization, CheckLargeBufferSize) { ClippingPredictorLevelBuffer buffer(capacity()); for (int i = 0; i < 2 * buffer.Capacity(); ++i) { - buffer.Push({2, 4}); + buffer.Push({.average = 2, .max = 4}); } EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1)); EXPECT_EQ(buffer.Size(), std::max(capacity(), 1)); @@ -63,12 +63,12 @@ TEST_P(ClippingPredictorLevelBufferParametrization, CheckLargeBufferSize) { TEST_P(ClippingPredictorLevelBufferParametrization, CheckSizeAfterReset) { ClippingPredictorLevelBuffer buffer(capacity()); - buffer.Push({1, 1}); - buffer.Push({1, 1}); + buffer.Push({.average = 1, .max = 1}); + buffer.Push({.average = 1, .max = 1}); buffer.Reset(); EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1)); EXPECT_EQ(buffer.Size(), 0); - buffer.Push({1, 1}); + buffer.Push({.average = 1, .max = 1}); EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1)); EXPECT_EQ(buffer.Size(), 1); } @@ -79,8 +79,8 @@ INSTANTIATE_TEST_SUITE_P(ClippingPredictorLevelBufferTest, TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterFullBuffer) { ClippingPredictorLevelBuffer buffer(/*capacity=*/2); - buffer.Push({1, 2}); - buffer.Push({3, 6}); + buffer.Push({.average = 1, .max = 2}); + buffer.Push({.average = 3, .max = 6}); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1), Optional(Eq(ClippingPredictorLevelBuffer::Level{3, 6}))); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1), @@ -91,11 +91,11 @@ TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterFullBuffer) { TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterPushBeyondCapacity) { ClippingPredictorLevelBuffer buffer(/*capacity=*/2); - buffer.Push({1, 1}); - buffer.Push({3, 6}); - buffer.Push({5, 10}); - buffer.Push({7, 14}); - buffer.Push({6, 12}); + buffer.Push({.average = 1, .max = 1}); + buffer.Push({.average = 3, .max = 6}); + buffer.Push({.average = 5, .max = 10}); + buffer.Push({.average = 7, .max = 14}); + buffer.Push({.average = 6, .max = 12}); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1), Optional(Eq(ClippingPredictorLevelBuffer::Level{6, 12}))); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1), @@ -106,8 +106,8 @@ TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterPushBeyondCapacity) { TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterTooFewItems) { ClippingPredictorLevelBuffer buffer(/*capacity=*/4); - buffer.Push({1, 2}); - buffer.Push({3, 6}); + buffer.Push({.average = 1, .max = 2}); + buffer.Push({.average = 3, .max = 6}); EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/3), std::nullopt); EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/2, /*num_items=*/1), @@ -116,10 +116,10 @@ TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterTooFewItems) { TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterReset) { ClippingPredictorLevelBuffer buffer(/*capacity=*/2); - buffer.Push({1, 2}); + buffer.Push({.average = 1, .max = 2}); buffer.Reset(); - buffer.Push({5, 10}); - buffer.Push({7, 14}); + buffer.Push({.average = 5, .max = 10}); + buffer.Push({.average = 7, .max = 14}); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1), Optional(Eq(ClippingPredictorLevelBuffer::Level{7, 14}))); EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2), diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_unittest.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor_unittest.cc @@ -136,7 +136,7 @@ void AnalyzeZeroCrestFactorAudio(int num_calls, TEST(ClippingPeakPredictorTest, NoPredictorCreated) { auto predictor = - CreateClippingPredictor(kNumChannels, /*config=*/{/*enabled=*/false}); + CreateClippingPredictor(kNumChannels, /*config=*/{.enabled = false}); EXPECT_FALSE(predictor); } @@ -144,8 +144,8 @@ TEST(ClippingPeakPredictorTest, ClippingEventPredictionCreated) { // TODO(bugs.webrtc.org/12874): Use designated initializers one fixed. auto predictor = CreateClippingPredictor( kNumChannels, - /*config=*/{/*enabled=*/true, - /*mode=*/ClippingPredictorMode::kClippingEventPrediction}); + /*config=*/{.enabled = true, + .mode = ClippingPredictorMode::kClippingEventPrediction}); EXPECT_TRUE(predictor); } @@ -153,17 +153,18 @@ TEST(ClippingPeakPredictorTest, AdaptiveStepClippingPeakPredictionCreated) { // TODO(bugs.webrtc.org/12874): Use designated initializers one fixed. auto predictor = CreateClippingPredictor( kNumChannels, /*config=*/{ - /*enabled=*/true, - /*mode=*/ClippingPredictorMode::kAdaptiveStepClippingPeakPrediction}); + .enabled = true, + .mode = ClippingPredictorMode::kAdaptiveStepClippingPeakPrediction}); EXPECT_TRUE(predictor); } TEST(ClippingPeakPredictorTest, FixedStepClippingPeakPredictionCreated) { // TODO(bugs.webrtc.org/12874): Use designated initializers one fixed. auto predictor = CreateClippingPredictor( - kNumChannels, /*config=*/{ - /*enabled=*/true, - /*mode=*/ClippingPredictorMode::kFixedStepClippingPeakPrediction}); + kNumChannels, + /*config=*/{ + .enabled = true, + .mode = ClippingPredictorMode::kFixedStepClippingPeakPrediction}); EXPECT_TRUE(predictor); } diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/features_extraction.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/features_extraction.cc @@ -25,8 +25,8 @@ namespace { // Computed as `scipy.signal.butter(N=2, Wn=60/24000, btype='highpass')`. constexpr BiQuadFilter::Config kHpfConfig24k{ - {0.99446179f, -1.98892358f, 0.99446179f}, - {-1.98889291f, 0.98895425f}}; + .b = {0.99446179f, -1.98892358f, 0.99446179f}, + .a = {-1.98889291f, 0.98895425f}}; } // namespace diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/pitch_search_internal.cc @@ -118,9 +118,9 @@ constexpr int kPitchNeighborhoodRadius = 2; // radius. Clipping is applied so that the interval is always valid for a 24 kHz // pitch buffer. Range CreateInvertedLagRange(int inverted_lag) { - return {std::max(inverted_lag - kPitchNeighborhoodRadius, 0), - std::min(inverted_lag + kPitchNeighborhoodRadius, - kInitialNumLags24kHz - 1)}; + return {.min = std::max(inverted_lag - kPitchNeighborhoodRadius, 0), + .max = std::min(inverted_lag + kPitchNeighborhoodRadius, + kInitialNumLags24kHz - 1)}; } constexpr int kNumPitchCandidates = 2; // Best and second best. @@ -344,9 +344,10 @@ CandidatePitchPeriods ComputePitchPeriod12kHz( // A pitch candidate must have positive correlation. if (auto_correlation[inverted_lag] > 0.f) { PitchCandidate candidate{ - inverted_lag, - auto_correlation[inverted_lag] * auto_correlation[inverted_lag], - denominator}; + .period_inverted_lag = inverted_lag, + .strength_numerator = + auto_correlation[inverted_lag] * auto_correlation[inverted_lag], + .strength_denominator = denominator}; if (candidate.HasStrongerPitchThan(second_best)) { if (candidate.HasStrongerPitchThan(best)) { second_best = best; @@ -363,7 +364,8 @@ CandidatePitchPeriods ComputePitchPeriod12kHz( denominator += y_new * y_new; denominator = std::max(0.f, denominator); } - return {best.period_inverted_lag, second_best.period_inverted_lag}; + return {.best = best.period_inverted_lag, + .second_best = second_best.period_inverted_lag}; } int ComputePitchPeriod48kHz( @@ -391,8 +393,8 @@ int ComputePitchPeriod48kHz( VectorMath vector_math(cpu_features); if (r1.max + 1 >= r2.min) { // Overlapping or adjacent ranges. - ComputeAutoCorrelation({r1.min, r2.max}, pitch_buffer, auto_correlation, - inverted_lags_index, vector_math); + ComputeAutoCorrelation({.min = r1.min, .max = r2.max}, pitch_buffer, + auto_correlation, inverted_lags_index, vector_math); } else { // Disjoint ranges. ComputeAutoCorrelation(r1, pitch_buffer, auto_correlation, @@ -438,10 +440,11 @@ PitchInfo ComputeExtendedPitchPeriod48kHz( best_pitch.y_energy = y_energy[kMaxPitch24kHz - best_pitch.period]; best_pitch.strength = pitch_strength(best_pitch.xy, best_pitch.y_energy); // Keep a copy of the initial pitch candidate. - const PitchInfo initial_pitch{best_pitch.period, best_pitch.strength}; + const PitchInfo initial_pitch{.period = best_pitch.period, + .strength = best_pitch.strength}; // 24 kHz version of the last estimated pitch. - const PitchInfo last_pitch{last_pitch_48kHz.period / 2, - last_pitch_48kHz.strength}; + const PitchInfo last_pitch{.period = last_pitch_48kHz.period / 2, + .strength = last_pitch_48kHz.strength}; // Find `max_period_divisor` such that the result of // `GetAlternativePitchPeriod(initial_pitch_period, 1, max_period_divisor)` @@ -486,8 +489,10 @@ PitchInfo ComputeExtendedPitchPeriod48kHz( // Maybe update best period. if (IsAlternativePitchStrongerThanInitial( last_pitch, initial_pitch, alternative_pitch, period_divisor)) { - best_pitch = {alternative_pitch.period, alternative_pitch.strength, xy, - yy}; + best_pitch = {.period = alternative_pitch.period, + .strength = alternative_pitch.strength, + .xy = xy, + .y_energy = yy}; } } @@ -503,7 +508,7 @@ PitchInfo ComputeExtendedPitchPeriod48kHz( kMinPitch48kHz, PitchPseudoInterpolationLagPitchBuf( best_pitch.period, pitch_buffer, vector_math)); - return {final_pitch_period_48kHz, final_pitch_strength}; + return {.period = final_pitch_period_48kHz, .strength = final_pitch_strength}; } } // namespace rnn_vad diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/pitch_search_internal_unittest.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/pitch_search_internal_unittest.cc @@ -123,7 +123,8 @@ TEST_P(PitchCandidatesParametrization, ComputePitchPeriod48kHzOrderDoesNotMatter) { const PitchCandidatesParameters params = GetParam(); const CandidatePitchPeriods swapped_pitch_candidates{ - params.pitch_candidates.second_best, params.pitch_candidates.best}; + .best = params.pitch_candidates.second_best, + .second_best = params.pitch_candidates.best}; PitchTestData test_data; std::vector<float> y_energy(kRefineNumLags24kHz); @@ -141,11 +142,12 @@ TEST_P(PitchCandidatesParametrization, std::vector<PitchCandidatesParameters> CreatePitchCandidatesParameters() { std::vector<PitchCandidatesParameters> v; for (AvailableCpuFeatures cpu_features : GetCpuFeaturesToTest()) { - v.push_back({{0, 2}, cpu_features}); - v.push_back({{260, 284}, cpu_features}); - v.push_back({{280, 284}, cpu_features}); - v.push_back( - {{kInitialNumLags24kHz - 2, kInitialNumLags24kHz - 1}, cpu_features}); + v.push_back({{.best = 0, .second_best = 2}, cpu_features}); + v.push_back({{.best = 260, .second_best = 284}, cpu_features}); + v.push_back({{.best = 280, .second_best = 284}, cpu_features}); + v.push_back({{.best = kInitialNumLags24kHz - 2, + .second_best = kInitialNumLags24kHz - 1}, + cpu_features}); } return v; } @@ -195,14 +197,16 @@ CreateExtendedPitchPeriodSearchParameters() { {kTestPitchPeriodsLow, kTestPitchPeriodsHigh}) { for (float last_pitch_strength : {kTestPitchStrengthLow, kTestPitchStrengthHigh}) { - v.push_back({kTestPitchPeriodsLow, - {last_pitch_period, last_pitch_strength}, - {91, -0.0188608f}, - cpu_features}); - v.push_back({kTestPitchPeriodsHigh, - {last_pitch_period, last_pitch_strength}, - {475, -0.0904344f}, - cpu_features}); + v.push_back( + {kTestPitchPeriodsLow, + {.period = last_pitch_period, .strength = last_pitch_strength}, + {.period = 91, .strength = -0.0188608f}, + cpu_features}); + v.push_back( + {kTestPitchPeriodsHigh, + {.period = last_pitch_period, .strength = last_pitch_strength}, + {.period = 475, .strength = -0.0904344f}, + cpu_features}); } } } diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/test_utils.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/test_utils.cc @@ -107,7 +107,9 @@ ChunksFileReader CreatePitchBuffer24kHzReader() { /*filename=*/test::ResourcePath( "audio_processing/agc2/rnn_vad/pitch_buf_24k", "dat")); const int num_chunks = CheckedDivExact(reader->size(), kBufSize24kHz); - return {/*chunk_size=*/kBufSize24kHz, num_chunks, std::move(reader)}; + return {.chunk_size = kBufSize24kHz, + .num_chunks = num_chunks, + .reader = std::move(reader)}; } ChunksFileReader CreateLpResidualAndPitchInfoReader() { @@ -117,7 +119,9 @@ ChunksFileReader CreateLpResidualAndPitchInfoReader() { /*filename=*/test::ResourcePath( "audio_processing/agc2/rnn_vad/pitch_lp_res", "dat")); const int num_chunks = CheckedDivExact(reader->size(), kChunkSize); - return {kChunkSize, num_chunks, std::move(reader)}; + return {.chunk_size = kChunkSize, + .num_chunks = num_chunks, + .reader = std::move(reader)}; } std::unique_ptr<FileReader> CreateGruInputReader() { diff --git a/third_party/libwebrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/third_party/libwebrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc @@ -166,16 +166,16 @@ struct TestConfig { }; const AllowedApiCallCombinations api_calls[] = { - {RenderApiImpl::ProcessReverseStreamImplInteger, - CaptureApiImpl::ProcessStreamImplInteger}, - {RenderApiImpl::ProcessReverseStreamImplFloat, - CaptureApiImpl::ProcessStreamImplFloat}, - {RenderApiImpl::AnalyzeReverseStreamImplFloat, - CaptureApiImpl::ProcessStreamImplFloat}, - {RenderApiImpl::ProcessReverseStreamImplInteger, - CaptureApiImpl::ProcessStreamImplFloat}, - {RenderApiImpl::ProcessReverseStreamImplFloat, - CaptureApiImpl::ProcessStreamImplInteger}}; + {.render_api = RenderApiImpl::ProcessReverseStreamImplInteger, + .capture_api = CaptureApiImpl::ProcessStreamImplInteger}, + {.render_api = RenderApiImpl::ProcessReverseStreamImplFloat, + .capture_api = CaptureApiImpl::ProcessStreamImplFloat}, + {.render_api = RenderApiImpl::AnalyzeReverseStreamImplFloat, + .capture_api = CaptureApiImpl::ProcessStreamImplFloat}, + {.render_api = RenderApiImpl::ProcessReverseStreamImplInteger, + .capture_api = CaptureApiImpl::ProcessStreamImplFloat}, + {.render_api = RenderApiImpl::ProcessReverseStreamImplFloat, + .capture_api = CaptureApiImpl::ProcessStreamImplInteger}}; std::vector<TestConfig> out; for (auto api_call : api_calls) { test_config.render_api_function = api_call.render_api; diff --git a/third_party/libwebrtc/modules/audio_processing/audio_processing_unittest.cc b/third_party/libwebrtc/modules/audio_processing/audio_processing_unittest.cc @@ -2077,8 +2077,30 @@ TEST_P(AudioProcessingTest, Formats) { int num_reverse_output; }; ChannelFormat cf[] = { - {1, 1, 1, 1}, {1, 1, 2, 1}, {2, 1, 1, 1}, - {2, 1, 2, 1}, {2, 2, 1, 1}, {2, 2, 2, 2}, + {.num_input = 1, + .num_output = 1, + .num_reverse_input = 1, + .num_reverse_output = 1}, + {.num_input = 1, + .num_output = 1, + .num_reverse_input = 2, + .num_reverse_output = 1}, + {.num_input = 2, + .num_output = 1, + .num_reverse_input = 1, + .num_reverse_output = 1}, + {.num_input = 2, + .num_output = 1, + .num_reverse_input = 2, + .num_reverse_output = 1}, + {.num_input = 2, + .num_output = 2, + .num_reverse_input = 1, + .num_reverse_output = 1}, + {.num_input = 2, + .num_output = 2, + .num_reverse_input = 2, + .num_reverse_output = 2}, }; for (auto [num_input, num_output, num_reverse_input, num_reverse_output] : diff --git a/third_party/libwebrtc/modules/audio_processing/gain_controller2.cc b/third_party/libwebrtc/modules/audio_processing/gain_controller2.cc @@ -85,8 +85,8 @@ AudioLevels ComputeAudioLevels(DeinterleavedView<float> frame, rms += x * x; } AudioLevels levels{ - FloatS16ToDbfs(peak), - FloatS16ToDbfs(std::sqrt(rms / frame.samples_per_channel()))}; + .peak_dbfs = FloatS16ToDbfs(peak), + .rms_dbfs = FloatS16ToDbfs(std::sqrt(rms / frame.samples_per_channel()))}; data_dumper.DumpRaw("agc2_input_rms_dbfs", levels.rms_dbfs); data_dumper.DumpRaw("agc2_input_peak_dbfs", levels.peak_dbfs); return levels; diff --git a/third_party/libwebrtc/modules/audio_processing/high_pass_filter.cc b/third_party/libwebrtc/modules/audio_processing/high_pass_filter.cc @@ -25,22 +25,22 @@ namespace { // [B,A] = butter(2,100/8000,'high') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients16kHz = {{ - {{0.972613898f, -1.945227797f, 0.972613898f}, - {-1.944477658f, 0.945977936f}}, + {.b = {0.972613898f, -1.945227797f, 0.972613898f}, + .a = {-1.944477658f, 0.945977936f}}, }}; // [B,A] = butter(2,100/16000,'high') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients32kHz = {{ - {{0.986211925f, -1.972423849f, 0.986211925f}, - {-1.972233729f, 0.972613969f}}, + {.b = {0.986211925f, -1.972423849f, 0.986211925f}, + .a = {-1.972233729f, 0.972613969f}}, }}; // [B,A] = butter(2,100/24000,'high') constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients48kHz = {{ - {{0.990786698f, -1.981573396f, 0.990786698f}, - {-1.981488509f, 0.981658283f}}, + {.b = {0.990786698f, -1.981573396f, 0.990786698f}, + .a = {-1.981488509f, 0.981658283f}}, }}; ArrayView<const CascadedBiQuadFilter::BiQuadCoefficients> ChooseCoefficients( diff --git a/third_party/libwebrtc/modules/audio_processing/post_filter.cc b/third_party/libwebrtc/modules/audio_processing/post_filter.cc @@ -30,10 +30,14 @@ namespace { // 3, 20, ftype='cheby2', output="sos") constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 4> kPostFilterCoefficients48kHz = {{ - {{0.56142156f, 1.11499931f, 0.56142156f}, {1.57914249f, 0.63379496f}}, - {{1.00000000f, 1.88944170f, 1.00000000f}, {1.55130066f, 0.68708719f}}, - {{1.00000000f, 1.76057310f, 1.00000000f}, {1.53001328f, 0.78591224f}}, - {{1.00000000f, 1.67448535f, 1.00000000f}, {1.56506670f, 0.92096576f}}, + {.b = {0.56142156f, 1.11499931f, 0.56142156f}, + .a = {1.57914249f, 0.63379496f}}, + {.b = {1.00000000f, 1.88944170f, 1.00000000f}, + .a = {1.55130066f, 0.68708719f}}, + {.b = {1.00000000f, 1.76057310f, 1.00000000f}, + .a = {1.53001328f, 0.78591224f}}, + {.b = {1.00000000f, 1.67448535f, 1.00000000f}, + .a = {1.56506670f, 0.92096576f}}, }}; } // namespace diff --git a/third_party/libwebrtc/modules/audio_processing/rms_level.cc b/third_party/libwebrtc/modules/audio_processing/rms_level.cc @@ -125,10 +125,12 @@ RmsLevel::Levels RmsLevel::AverageAndPeak() { // Note that block_size_ should by design always be non-empty when // sample_count_ != 0. Also, the * operator of std::optional enforces this // with a DCHECK. - Levels levels = (sample_count_ == 0) - ? Levels{RmsLevel::kMinLevelDb, RmsLevel::kMinLevelDb} - : Levels{ComputeRms(sum_square_ / sample_count_), - ComputeRms(max_sum_square_ / *block_size_)}; + Levels levels = + (sample_count_ == 0) + ? Levels{.average = RmsLevel::kMinLevelDb, + .peak = RmsLevel::kMinLevelDb} + : Levels{.average = ComputeRms(sum_square_ / sample_count_), + .peak = ComputeRms(max_sum_square_ / *block_size_)}; Reset(); return levels; } diff --git a/third_party/libwebrtc/modules/audio_processing/test/aec_dump_based_simulator.cc b/third_party/libwebrtc/modules/audio_processing/test/aec_dump_based_simulator.cc @@ -641,8 +641,8 @@ void AecDumpBasedSimulator::HandleMessage( } else if (msg.has_playout_audio_device_change()) { ap_->SetRuntimeSetting( AudioProcessing::RuntimeSetting::CreatePlayoutAudioDeviceChange( - {msg.playout_audio_device_change().id(), - msg.playout_audio_device_change().max_volume()})); + {.id = msg.playout_audio_device_change().id(), + .max_volume = msg.playout_audio_device_change().max_volume()})); } else if (msg.has_capture_output_used()) { ap_->SetRuntimeSetting( AudioProcessing::RuntimeSetting::CreateCaptureOutputUsedSetting( diff --git a/third_party/libwebrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc b/third_party/libwebrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc @@ -85,12 +85,30 @@ const size_t kNumberOfTurns = kExpectedTiming.size(); constexpr int kDefaultSampleRate = 48000; const std::map<std::string, const MockWavReaderFactory::Params> kDefaultMockWavReaderFactoryParamsMap = { - {"t300", {kDefaultSampleRate, 1u, 14400u}}, // Mono, 0.3 seconds. - {"t500", {kDefaultSampleRate, 1u, 24000u}}, // Mono, 0.5 seconds. - {"t1000", {kDefaultSampleRate, 1u, 48000u}}, // Mono, 1.0 seconds. - {"sr8000", {8000, 1u, 8000u}}, // 8kHz sample rate, mono, 1 second. - {"sr16000", {16000, 1u, 16000u}}, // 16kHz sample rate, mono, 1 second. - {"sr16000_stereo", {16000, 2u, 16000u}}, // Like sr16000, but stereo. + {"t300", + {.sample_rate = kDefaultSampleRate, + .num_channels = 1u, + .num_samples = 14400u}}, // Mono, 0.3 seconds. + {"t500", + {.sample_rate = kDefaultSampleRate, + .num_channels = 1u, + .num_samples = 24000u}}, // Mono, 0.5 seconds. + {"t1000", + {.sample_rate = kDefaultSampleRate, + .num_channels = 1u, + .num_samples = 48000u}}, // Mono, 1.0 seconds. + {"sr8000", + {.sample_rate = 8000, + .num_channels = 1u, + .num_samples = 8000u}}, // 8kHz sample rate, mono, 1 second. + {"sr16000", + {.sample_rate = 16000, + .num_channels = 1u, + .num_samples = 16000u}}, // 16kHz sample rate, mono, 1 second. + {"sr16000_stereo", + {.sample_rate = 16000, + .num_channels = 2u, + .num_samples = 16000u}}, // Like sr16000, but stereo. }; const MockWavReaderFactory::Params& kDefaultMockWavReaderFactoryParams = kDefaultMockWavReaderFactoryParamsMap.at("t500"); @@ -607,13 +625,16 @@ TEST(ConversationalSpeechTest, MultiEndCallWavReaderAdaptorSine) { // Write wav file. const std::size_t num_samples = duration_seconds * sample_rate; - MockWavReaderFactory::Params params = {sample_rate, 1u, num_samples}; + MockWavReaderFactory::Params params = {.sample_rate = sample_rate, + .num_channels = 1u, + .num_samples = num_samples}; CreateSineWavFile(temp_filename, params); // Load wav file and check if params match. WavReaderFactory wav_reader_factory; - MockWavReaderFactory::Params expeted_params = {sample_rate, 1u, - num_samples}; + MockWavReaderFactory::Params expeted_params = {.sample_rate = sample_rate, + .num_channels = 1u, + .num_samples = num_samples}; CheckAudioTrackParams(wav_reader_factory, temp_filename, expeted_params); // Clean up. @@ -636,8 +657,16 @@ TEST(ConversationalSpeechTest, DISABLED_MultiEndCallSimulator) { // Create temporary audio track files. const int sample_rate = 16000; const std::map<std::string, SineAudioTrackParams> sine_tracks_params = { - {"t5000_440.wav", {{sample_rate, 1u, sample_rate * 5}, 440.0}}, - {"t5000_880.wav", {{sample_rate, 1u, sample_rate * 5}, 880.0}}, + {"t5000_440.wav", + {.params = {.sample_rate = sample_rate, + .num_channels = 1u, + .num_samples = sample_rate * 5}, + .frequency = 440.0}}, + {"t5000_880.wav", + {.params = {.sample_rate = sample_rate, + .num_channels = 1u, + .num_samples = sample_rate * 5}, + .frequency = 880.0}}, }; const std::string audiotracks_path_multiend = CreateTemporarySineAudioTracks(sine_tracks_params); @@ -661,7 +690,9 @@ TEST(ConversationalSpeechTest, DISABLED_MultiEndCallSimulator) { // Check the output. WavReaderFactory wav_reader_factory; const MockWavReaderFactory::Params expeted_params = { - sample_rate, 1u, sample_rate * expected_duration_seconds}; + .sample_rate = sample_rate, + .num_channels = 1u, + .num_samples = sample_rate * expected_duration_seconds}; for (const auto& it : *generated_audiotrak_pairs) { RTC_LOG(LS_VERBOSE) << "checking far/near-end for <" << it.first << ">"; CheckAudioTrackParams(wav_reader_factory, it.second.near_end, diff --git a/third_party/libwebrtc/modules/audio_processing/test/conversational_speech/multiend_call.cc b/third_party/libwebrtc/modules/audio_processing/test/conversational_speech/multiend_call.cc @@ -109,8 +109,8 @@ bool MultiEndCall::CheckTiming() { speaking_turns_.clear(); // Begin and end timestamps for the last two turns (unit: number of samples). - Interval second_last_turn = {0, 0}; - Interval last_turn = {0, 0}; + Interval second_last_turn = {.begin = 0, .end = 0}; + Interval last_turn = {.begin = 0, .end = 0}; // Initialize map to store speaking turn indices of each speaker (used to // detect self cross-talk). diff --git a/third_party/libwebrtc/modules/audio_processing/test/echo_canceller3_config_json_unittest.cc b/third_party/libwebrtc/modules/audio_processing/test/echo_canceller3_config_json_unittest.cc @@ -29,8 +29,8 @@ TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) { cfg.echo_model.model_reverb_in_nonlinear_mode = false; cfg.suppressor.normal_tuning.mask_hf.enr_suppress = .5f; cfg.suppressor.subband_nearend_detection.nearend_average_blocks = 3; - cfg.suppressor.subband_nearend_detection.subband1 = {1, 3}; - cfg.suppressor.subband_nearend_detection.subband1 = {4, 5}; + cfg.suppressor.subband_nearend_detection.subband1 = {.low = 1, .high = 3}; + cfg.suppressor.subband_nearend_detection.subband1 = {.low = 4, .high = 5}; cfg.suppressor.subband_nearend_detection.nearend_threshold = 2.f; cfg.suppressor.subband_nearend_detection.snr_threshold = 100.f; cfg.multi_channel.detect_stereo_content = diff --git a/third_party/libwebrtc/modules/audio_processing/test/runtime_setting_util.cc b/third_party/libwebrtc/modules/audio_processing/test/runtime_setting_util.cc @@ -41,8 +41,9 @@ void ReplayRuntimeSetting(AudioProcessing* apm, } else if (setting.has_playout_audio_device_change()) { apm->SetRuntimeSetting( AudioProcessing::RuntimeSetting::CreatePlayoutAudioDeviceChange( - {setting.playout_audio_device_change().id(), - setting.playout_audio_device_change().max_volume()})); + {.id = setting.playout_audio_device_change().id(), + .max_volume = + setting.playout_audio_device_change().max_volume()})); } else if (setting.has_capture_output_used()) { apm->SetRuntimeSetting( AudioProcessing::RuntimeSetting::CreateCaptureOutputUsedSetting( diff --git a/third_party/libwebrtc/modules/audio_processing/utility/cascaded_biquad_filter_unittest.cc b/third_party/libwebrtc/modules/audio_processing/utility/cascaded_biquad_filter_unittest.cc @@ -26,23 +26,23 @@ namespace { // frequency 100 Hz. constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kHighPassFilterCoefficients = {{ - {{0.97261f, -1.94523f, 0.97261f}, {-1.94448f, 0.94598f}}, + {.b = {0.97261f, -1.94523f, 0.97261f}, .a = {-1.94448f, 0.94598f}}, }}; constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kTransparentCoefficients = {{ - {{1.f, 0.f, 0.f}, {0.f, 0.f}}, + {.b = {1.f, 0.f, 0.f}, .a = {0.f, 0.f}}, }}; constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 1> kBlockingCoefficients = {{ - {{0.f, 0.f, 0.f}, {0.f, 0.f}}, + {.b = {0.f, 0.f, 0.f}, .a = {0.f, 0.f}}, }}; constexpr std::array<CascadedBiQuadFilter::BiQuadCoefficients, 2> kCascadedCoefficients = {{ - {{-1.f, 0.f, 0.f}, {0.f, 0.f}}, - {{0.f, 0.f, -1.f}, {0.f, 0.f}}, + {.b = {-1.f, 0.f, 0.f}, .a = {0.f, 0.f}}, + {.b = {0.f, 0.f, -1.f}, .a = {0.f, 0.f}}, }}; std::vector<float> CreateInputWithIncreasingValues(size_t vector_length) { diff --git a/third_party/libwebrtc/moz-patch-stack/s0029.patch b/third_party/libwebrtc/moz-patch-stack/s0029.patch @@ -15,7 +15,7 @@ Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/d380a43d59f4f7cbc 4 files changed, 36 insertions(+) diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc -index a414cc15bb..34ad23d1a7 100644 +index ee85052333..d7028b7116 100644 --- a/audio/audio_send_stream.cc +++ b/audio/audio_send_stream.cc @@ -437,6 +437,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats(