Support opus red in neteq_rtpplay

BUG=webrtc:42221750

Change-Id: I6fc92c454cbe17865c8ef69f1e9fca084493ebfe
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/373642
Commit-Queue: Philipp Hancke <phancke@meta.com>
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43687}
This commit is contained in:
Philipp Hancke 2025-01-06 11:15:41 -08:00 committed by WebRTC LUCI CQ
parent 59b1d32c35
commit d7b4c56d57
4 changed files with 61 additions and 19 deletions

View File

@ -1018,28 +1018,32 @@ if (rtc_include_tests) {
visibility += webrtc_default_visibility
defines = audio_codec_defines
deps = [
":neteq",
":neteq_input_audio_tools",
":neteq_test_tools",
":neteq_tools",
":neteq_tools_minimal",
"../../api:make_ref_counted",
"../../api:rtp_headers",
"../../api:scoped_refptr",
"../../api/audio_codecs:audio_codecs_api",
"../../api/audio_codecs:builtin_audio_decoder_factory",
"../../api/environment:environment",
"../../api/neteq:neteq_api",
"../../logging:rtc_event_log_parser",
"../../rtc_base:checks",
"../../rtc_base:refcount",
"../../test:audio_test_common",
"../../test:field_trial",
"../../test:fileutils",
"../../test:test_support",
"../rtp_rtcp:rtp_rtcp_format",
"//third_party/abseil-cpp/absl/strings:string_view",
]
sources = [
"neteq/tools/neteq_test_factory.cc",
"neteq/tools/neteq_test_factory.h",
]
deps += [
":neteq",
":neteq_test_tools",
"../../api/audio_codecs:builtin_audio_decoder_factory",
"../../api/neteq:neteq_api",
"../../test:audio_test_common",
"../../test:field_trial",
"../../test:test_support",
]
}
}
@ -1052,6 +1056,7 @@ if (rtc_include_tests) {
":neteq_test_factory",
":neteq_test_tools",
":neteq_tools_minimal",
"../../rtc_base:checks",
"../../rtc_base:stringutils",
"../../system_wrappers:field_trial",
"../../test:field_trial",

View File

@ -8,18 +8,26 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <cerrno>
#include <climits>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/strings/string_view.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
#include "modules/audio_coding/neteq/tools/neteq_test_factory.h"
#include "rtc_base/checks.h"
#include "rtc_base/strings/string_builder.h"
#include "system_wrappers/include/field_trial.h"
#include "test/field_trial.h"
using TestConfig = webrtc::test::NetEqTestFactory::Config;
@ -78,7 +86,11 @@ ABSL_FLAG(int,
ABSL_FLAG(int,
red,
TestConfig::default_red(),
"RTP payload type for redundant audio (RED)");
"RTP payload type for redundant audio (RED, 8kHz)");
ABSL_FLAG(int,
opus_red,
TestConfig::default_opus_red(),
"RTP payload type for redundant audio (RED, 48kHz)");
ABSL_FLAG(int,
cn_nb,
TestConfig::default_cn_nb(),
@ -225,7 +237,10 @@ void PrintCodecMapping() {
PrintCodecMappingEntry("AVT/DTMF (16 kHz)", absl::GetFlag(FLAGS_avt_16));
PrintCodecMappingEntry("AVT/DTMF (32 kHz)", absl::GetFlag(FLAGS_avt_32));
PrintCodecMappingEntry("AVT/DTMF (48 kHz)", absl::GetFlag(FLAGS_avt_48));
PrintCodecMappingEntry("redundant audio (RED)", absl::GetFlag(FLAGS_red));
PrintCodecMappingEntry("redundant audio (RED 8khz)",
absl::GetFlag(FLAGS_red));
PrintCodecMappingEntry("redundant audio (RED 48khz)",
absl::GetFlag(FLAGS_opus_red));
PrintCodecMappingEntry("comfort noise (8 kHz)", absl::GetFlag(FLAGS_cn_nb));
PrintCodecMappingEntry("comfort noise (16 kHz)", absl::GetFlag(FLAGS_cn_wb));
PrintCodecMappingEntry("comfort noise (32 kHz)",
@ -325,6 +340,7 @@ int main(int argc, char* argv[]) {
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt_32)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt_48)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_red)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_opus_red)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_nb)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_wb)));
RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_swb32)));
@ -358,6 +374,7 @@ int main(int argc, char* argv[]) {
config.avt_32 = absl::GetFlag(FLAGS_avt_32);
config.avt_48 = absl::GetFlag(FLAGS_avt_48);
config.red = absl::GetFlag(FLAGS_red);
config.opus_red = absl::GetFlag(FLAGS_opus_red);
config.cn_nb = absl::GetFlag(FLAGS_cn_nb);
config.cn_wb = absl::GetFlag(FLAGS_cn_wb);
config.cn_swb32 = absl::GetFlag(FLAGS_cn_swb32);

View File

@ -10,27 +10,39 @@
#include "modules/audio_coding/neteq/tools/neteq_test_factory.h"
#include <errno.h>
#include <limits.h> // For ULONG_MAX returned by strtoul.
#include <stdio.h>
#include <stdlib.h> // For strtoul.
#include <cstdint>
#include <fstream>
#include <iostream>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <utility>
#include "absl/strings/string_view.h"
#include "api/audio_codecs/audio_codec_pair_id.h"
#include "api/audio_codecs/audio_decoder.h"
#include "api/audio_codecs/audio_decoder_factory.h"
#include "api/audio_codecs/audio_format.h"
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/environment/environment.h"
#include "api/make_ref_counted.h"
#include "api/neteq/neteq.h"
#include "api/neteq/neteq_factory.h"
#include "api/rtp_headers.h"
#include "api/scoped_refptr.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "modules/audio_coding/neteq/tools/audio_sink.h"
#include "modules/audio_coding/neteq/tools/fake_decode_from_file.h"
#include "modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.h"
#include "modules/audio_coding/neteq/tools/input_audio_file.h"
#include "modules/audio_coding/neteq/tools/neteq_delay_analyzer.h"
#include "modules/audio_coding/neteq/tools/neteq_event_log_input.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_replacement_input.h"
#include "modules/audio_coding/neteq/tools/neteq_rtp_dump_input.h"
#include "modules/audio_coding/neteq/tools/neteq_stats_getter.h"
@ -39,6 +51,7 @@
#include "modules/audio_coding/neteq/tools/output_audio_file.h"
#include "modules/audio_coding/neteq/tools/output_wav_file.h"
#include "modules/audio_coding/neteq/tools/rtp_file_source.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "rtc_base/checks.h"
#include "test/function_audio_decoder_factory.h"
#include "test/testsupport/file_utils.h"
@ -62,7 +75,8 @@ std::optional<int> CodecSampleRate(
payload_type == config.cn_swb32 || payload_type == config.avt_32)
return 32000;
if (payload_type == config.opus || payload_type == config.pcm16b_swb48 ||
payload_type == config.cn_swb48 || payload_type == config.avt_48)
payload_type == config.cn_swb48 || payload_type == config.avt_48 ||
payload_type == config.opus_red)
return 48000;
if (payload_type == config.red)
return 0;
@ -284,9 +298,9 @@ std::unique_ptr<NetEqTest> NetEqTestFactory::InitializeTest(
std::set<uint8_t> cn_types = std_set_int32_to_uint8(
{config.cn_nb, config.cn_wb, config.cn_swb32, config.cn_swb48});
std::set<uint8_t> forbidden_types =
std_set_int32_to_uint8({config.g722, config.red, config.avt,
config.avt_16, config.avt_32, config.avt_48});
std::set<uint8_t> forbidden_types = std_set_int32_to_uint8(
{config.g722, config.red, config.opus_red, config.avt, config.avt_16,
config.avt_32, config.avt_48});
input.reset(new NetEqReplacementInput(std::move(input), replacement_pt,
cn_types, forbidden_types));

View File

@ -11,11 +11,14 @@
#ifndef MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_TEST_FACTORY_H_
#define MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_TEST_FACTORY_H_
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include "absl/strings/string_view.h"
#include "api/neteq/neteq_factory.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
namespace webrtc {
@ -80,6 +83,9 @@ class NetEqTestFactory {
// RTP payload type for redundant audio (RED).
static constexpr int default_red() { return 117; }
int red = default_red();
static constexpr int default_opus_red() { return 63; }
int opus_red = default_opus_red();
// RTP payload type for comfort noise (8 kHz).
static constexpr int default_cn_nb() { return 13; }
int cn_nb = default_cn_nb();