henrik.lundin@webrtc.org | d94659d | 2013-01-29 12:09:21 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 | * |
| 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 |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
Ivo Creusen | f81b0f1 | 2018-09-11 10:30:58 +0200 | [diff] [blame] | 11 | #include <iostream> |
| 12 | #include <string> |
henrik.lundin@webrtc.org | d94659d | 2013-01-29 12:09:21 +0000 | [diff] [blame] | 13 | |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 14 | #include "absl/flags/flag.h" |
| 15 | #include "absl/flags/parse.h" |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 16 | #include "absl/strings/string_view.h" |
| 17 | #include "absl/types/optional.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 18 | #include "modules/audio_coding/neteq/tools/neteq_test.h" |
Ivo Creusen | 55de08e | 2018-09-03 11:49:27 +0200 | [diff] [blame] | 19 | #include "modules/audio_coding/neteq/tools/neteq_test_factory.h" |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 20 | #include "rtc_base/strings/string_builder.h" |
Mirko Bonadei | 17f4878 | 2018-09-28 08:51:10 +0200 | [diff] [blame] | 21 | #include "system_wrappers/include/field_trial.h" |
Ivo Creusen | f81b0f1 | 2018-09-11 10:30:58 +0200 | [diff] [blame] | 22 | #include "test/field_trial.h" |
| 23 | |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 24 | using TestConfig = webrtc::test::NetEqTestFactory::Config; |
| 25 | |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 26 | ABSL_FLAG(bool, |
| 27 | codec_map, |
| 28 | false, |
| 29 | "Prints the mapping between RTP payload type and " |
| 30 | "codec"); |
| 31 | ABSL_FLAG(std::string, |
| 32 | force_fieldtrials, |
| 33 | "", |
| 34 | "Field trials control experimental feature code which can be forced. " |
| 35 | "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/" |
| 36 | " will assign the group Enable to field trial WebRTC-FooFeature."); |
| 37 | ABSL_FLAG(int, pcmu, TestConfig::default_pcmu(), "RTP payload type for PCM-u"); |
| 38 | ABSL_FLAG(int, pcma, TestConfig::default_pcma(), "RTP payload type for PCM-a"); |
| 39 | ABSL_FLAG(int, ilbc, TestConfig::default_ilbc(), "RTP payload type for iLBC"); |
| 40 | ABSL_FLAG(int, isac, TestConfig::default_isac(), "RTP payload type for iSAC"); |
| 41 | ABSL_FLAG(int, |
| 42 | isac_swb, |
| 43 | TestConfig::default_isac_swb(), |
| 44 | "RTP payload type for iSAC-swb (32 kHz)"); |
| 45 | ABSL_FLAG(int, opus, TestConfig::default_opus(), "RTP payload type for Opus"); |
| 46 | ABSL_FLAG(int, |
| 47 | pcm16b, |
| 48 | TestConfig::default_pcm16b(), |
| 49 | "RTP payload type for PCM16b-nb (8 kHz)"); |
| 50 | ABSL_FLAG(int, |
| 51 | pcm16b_wb, |
| 52 | TestConfig::default_pcm16b_wb(), |
| 53 | "RTP payload type for PCM16b-wb (16 kHz)"); |
| 54 | ABSL_FLAG(int, |
| 55 | pcm16b_swb32, |
| 56 | TestConfig::default_pcm16b_swb32(), |
| 57 | "RTP payload type for PCM16b-swb32 (32 kHz)"); |
| 58 | ABSL_FLAG(int, |
| 59 | pcm16b_swb48, |
| 60 | TestConfig::default_pcm16b_swb48(), |
| 61 | "RTP payload type for PCM16b-swb48 (48 kHz)"); |
| 62 | ABSL_FLAG(int, g722, TestConfig::default_g722(), "RTP payload type for G.722"); |
| 63 | ABSL_FLAG(int, |
| 64 | avt, |
| 65 | TestConfig::default_avt(), |
| 66 | "RTP payload type for AVT/DTMF (8 kHz)"); |
| 67 | ABSL_FLAG(int, |
| 68 | avt_16, |
| 69 | TestConfig::default_avt_16(), |
| 70 | "RTP payload type for AVT/DTMF (16 kHz)"); |
| 71 | ABSL_FLAG(int, |
| 72 | avt_32, |
| 73 | TestConfig::default_avt_32(), |
| 74 | "RTP payload type for AVT/DTMF (32 kHz)"); |
| 75 | ABSL_FLAG(int, |
| 76 | avt_48, |
| 77 | TestConfig::default_avt_48(), |
| 78 | "RTP payload type for AVT/DTMF (48 kHz)"); |
| 79 | ABSL_FLAG(int, |
| 80 | red, |
| 81 | TestConfig::default_red(), |
| 82 | "RTP payload type for redundant audio (RED)"); |
| 83 | ABSL_FLAG(int, |
| 84 | cn_nb, |
| 85 | TestConfig::default_cn_nb(), |
| 86 | "RTP payload type for comfort noise (8 kHz)"); |
| 87 | ABSL_FLAG(int, |
| 88 | cn_wb, |
| 89 | TestConfig::default_cn_wb(), |
| 90 | "RTP payload type for comfort noise (16 kHz)"); |
| 91 | ABSL_FLAG(int, |
| 92 | cn_swb32, |
| 93 | TestConfig::default_cn_swb32(), |
| 94 | "RTP payload type for comfort noise (32 kHz)"); |
| 95 | ABSL_FLAG(int, |
| 96 | cn_swb48, |
| 97 | TestConfig::default_cn_swb48(), |
| 98 | "RTP payload type for comfort noise (48 kHz)"); |
| 99 | ABSL_FLAG(std::string, |
| 100 | replacement_audio_file, |
| 101 | "", |
| 102 | "A PCM file that will be used to populate dummy" |
| 103 | " RTP packets"); |
| 104 | ABSL_FLAG(std::string, |
| 105 | ssrc, |
| 106 | "", |
| 107 | "Only use packets with this SSRC (decimal or hex, the latter " |
| 108 | "starting with 0x)"); |
| 109 | ABSL_FLAG(int, |
| 110 | audio_level, |
| 111 | TestConfig::default_audio_level(), |
| 112 | "Extension ID for audio level (RFC 6464)"); |
| 113 | ABSL_FLAG(int, |
| 114 | abs_send_time, |
| 115 | TestConfig::default_abs_send_time(), |
| 116 | "Extension ID for absolute sender time"); |
| 117 | ABSL_FLAG(int, |
| 118 | transport_seq_no, |
| 119 | TestConfig::default_transport_seq_no(), |
| 120 | "Extension ID for transport sequence number"); |
| 121 | ABSL_FLAG(int, |
| 122 | video_content_type, |
| 123 | TestConfig::default_video_content_type(), |
| 124 | "Extension ID for video content type"); |
| 125 | ABSL_FLAG(int, |
| 126 | video_timing, |
| 127 | TestConfig::default_video_timing(), |
| 128 | "Extension ID for video timing"); |
| 129 | ABSL_FLAG(std::string, |
| 130 | output_files_base_name, |
| 131 | "", |
| 132 | "Custom path used as prefix for the output files - i.e., " |
| 133 | "matlab plot, python plot, text log."); |
| 134 | ABSL_FLAG(bool, |
| 135 | matlabplot, |
| 136 | false, |
| 137 | "Generates a matlab script for plotting the delay profile"); |
| 138 | ABSL_FLAG(bool, |
| 139 | pythonplot, |
| 140 | false, |
| 141 | "Generates a python script for plotting the delay profile"); |
| 142 | ABSL_FLAG(bool, |
| 143 | textlog, |
| 144 | false, |
| 145 | "Generates a text log describing the simulation on a " |
| 146 | "step-by-step basis."); |
| 147 | ABSL_FLAG(bool, concealment_events, false, "Prints concealment events"); |
| 148 | ABSL_FLAG(int, |
| 149 | max_nr_packets_in_buffer, |
| 150 | TestConfig::default_max_nr_packets_in_buffer(), |
| 151 | "Maximum allowed number of packets in the buffer"); |
| 152 | ABSL_FLAG(bool, |
| 153 | enable_fast_accelerate, |
| 154 | false, |
| 155 | "Enables jitter buffer fast accelerate"); |
| 156 | |
| 157 | namespace { |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 158 | |
| 159 | // Parses the input string for a valid SSRC (at the start of the string). If a |
| 160 | // valid SSRC is found, it is written to the output variable |ssrc|, and true is |
| 161 | // returned. Otherwise, false is returned. |
| 162 | bool ParseSsrc(const std::string& str, uint32_t* ssrc) { |
| 163 | if (str.empty()) |
| 164 | return true; |
| 165 | int base = 10; |
| 166 | // Look for "0x" or "0X" at the start and change base to 16 if found. |
| 167 | if ((str.compare(0, 2, "0x") == 0) || (str.compare(0, 2, "0X") == 0)) |
| 168 | base = 16; |
| 169 | errno = 0; |
| 170 | char* end_ptr; |
| 171 | unsigned long value = strtoul(str.c_str(), &end_ptr, base); // NOLINT |
| 172 | if (value == ULONG_MAX && errno == ERANGE) |
| 173 | return false; // Value out of range for unsigned long. |
| 174 | if (sizeof(unsigned long) > sizeof(uint32_t) && value > 0xFFFFFFFF) // NOLINT |
| 175 | return false; // Value out of range for uint32_t. |
| 176 | if (end_ptr - str.c_str() < static_cast<ptrdiff_t>(str.length())) |
| 177 | return false; // Part of the string was not parsed. |
| 178 | *ssrc = static_cast<uint32_t>(value); |
| 179 | return true; |
| 180 | } |
| 181 | |
| 182 | static bool ValidateExtensionId(int value) { |
| 183 | if (value > 0 && value <= 255) // Value is ok. |
| 184 | return true; |
| 185 | printf("Extension ID must be between 1 and 255, not %d\n", |
| 186 | static_cast<int>(value)); |
| 187 | return false; |
| 188 | } |
| 189 | |
| 190 | // Flag validators. |
| 191 | bool ValidatePayloadType(int value) { |
| 192 | if (value >= 0 && value <= 127) // Value is ok. |
| 193 | return true; |
| 194 | printf("Payload type must be between 0 and 127, not %d\n", |
| 195 | static_cast<int>(value)); |
| 196 | return false; |
| 197 | } |
| 198 | |
| 199 | bool ValidateSsrcValue(const std::string& str) { |
| 200 | uint32_t dummy_ssrc; |
| 201 | if (ParseSsrc(str, &dummy_ssrc)) // Value is ok. |
| 202 | return true; |
| 203 | printf("Invalid SSRC: %s\n", str.c_str()); |
| 204 | return false; |
| 205 | } |
| 206 | |
| 207 | void PrintCodecMappingEntry(const char* codec, int flag) { |
| 208 | std::cout << codec << ": " << flag << std::endl; |
| 209 | } |
| 210 | |
| 211 | void PrintCodecMapping() { |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 212 | PrintCodecMappingEntry("PCM-u", absl::GetFlag(FLAGS_pcmu)); |
| 213 | PrintCodecMappingEntry("PCM-a", absl::GetFlag(FLAGS_pcma)); |
| 214 | PrintCodecMappingEntry("iLBC", absl::GetFlag(FLAGS_ilbc)); |
| 215 | PrintCodecMappingEntry("iSAC", absl::GetFlag(FLAGS_isac)); |
| 216 | PrintCodecMappingEntry("iSAC-swb (32 kHz)", absl::GetFlag(FLAGS_isac_swb)); |
| 217 | PrintCodecMappingEntry("Opus", absl::GetFlag(FLAGS_opus)); |
| 218 | PrintCodecMappingEntry("PCM16b-nb (8 kHz)", absl::GetFlag(FLAGS_pcm16b)); |
| 219 | PrintCodecMappingEntry("PCM16b-wb (16 kHz)", absl::GetFlag(FLAGS_pcm16b_wb)); |
| 220 | PrintCodecMappingEntry("PCM16b-swb32 (32 kHz)", |
| 221 | absl::GetFlag(FLAGS_pcm16b_swb32)); |
| 222 | PrintCodecMappingEntry("PCM16b-swb48 (48 kHz)", |
| 223 | absl::GetFlag(FLAGS_pcm16b_swb48)); |
| 224 | PrintCodecMappingEntry("G.722", absl::GetFlag(FLAGS_g722)); |
| 225 | PrintCodecMappingEntry("AVT/DTMF (8 kHz)", absl::GetFlag(FLAGS_avt)); |
| 226 | PrintCodecMappingEntry("AVT/DTMF (16 kHz)", absl::GetFlag(FLAGS_avt_16)); |
| 227 | PrintCodecMappingEntry("AVT/DTMF (32 kHz)", absl::GetFlag(FLAGS_avt_32)); |
| 228 | PrintCodecMappingEntry("AVT/DTMF (48 kHz)", absl::GetFlag(FLAGS_avt_48)); |
| 229 | PrintCodecMappingEntry("redundant audio (RED)", absl::GetFlag(FLAGS_red)); |
| 230 | PrintCodecMappingEntry("comfort noise (8 kHz)", absl::GetFlag(FLAGS_cn_nb)); |
| 231 | PrintCodecMappingEntry("comfort noise (16 kHz)", absl::GetFlag(FLAGS_cn_wb)); |
| 232 | PrintCodecMappingEntry("comfort noise (32 kHz)", |
| 233 | absl::GetFlag(FLAGS_cn_swb32)); |
| 234 | PrintCodecMappingEntry("comfort noise (48 kHz)", |
| 235 | absl::GetFlag(FLAGS_cn_swb48)); |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 236 | } |
| 237 | |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 238 | bool ValidateOutputFilesOptions(bool textlog, |
| 239 | bool plotting, |
| 240 | absl::string_view output_files_base_name, |
| 241 | absl::string_view output_audio_filename) { |
| 242 | bool output_files_base_name_specified = !output_files_base_name.empty(); |
| 243 | if (!textlog && !plotting && output_files_base_name_specified) { |
| 244 | std::cout << "Error: --output_files_base_name cannot be used without at " |
| 245 | << "least one of the following flags: --textlog, --matlabplot, " |
| 246 | << "--pythonplot." << std::endl; |
| 247 | return false; |
| 248 | } |
| 249 | // Without |output_audio_filename|, |output_files_base_name| is required when |
| 250 | // one or more output files must be generated (in order to form a valid output |
| 251 | // file name). |
| 252 | if (output_audio_filename.empty() && (textlog || plotting) && |
| 253 | !output_files_base_name_specified) { |
| 254 | std::cout << "Error: when no output audio file is specified and --textlog, " |
| 255 | << "--matlabplot and/or --pythonplot are used, " |
| 256 | << "--output_files_base_name must be also used." << std::endl; |
| 257 | return false; |
| 258 | } |
| 259 | return true; |
| 260 | } |
| 261 | |
| 262 | absl::optional<std::string> CreateOptionalOutputFileName( |
| 263 | bool output_requested, |
| 264 | absl::string_view basename, |
| 265 | absl::string_view output_audio_filename, |
| 266 | absl::string_view suffix) { |
| 267 | if (!output_requested) { |
| 268 | return absl::nullopt; |
| 269 | } |
| 270 | if (!basename.empty()) { |
| 271 | // Override the automatic assignment. |
| 272 | rtc::StringBuilder sb(basename); |
| 273 | sb << suffix; |
| 274 | return sb.str(); |
| 275 | } |
| 276 | if (!output_audio_filename.empty()) { |
| 277 | // Automatically assign name. |
| 278 | rtc::StringBuilder sb(output_audio_filename); |
| 279 | sb << suffix; |
| 280 | return sb.str(); |
| 281 | } |
| 282 | std::cout << "Error: invalid text log file parameters."; |
| 283 | return absl::nullopt; |
| 284 | } |
| 285 | |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 286 | } // namespace |
henrik.lundin | 303d3e1 | 2016-05-26 05:56:03 -0700 | [diff] [blame] | 287 | |
| 288 | int main(int argc, char* argv[]) { |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 289 | std::vector<char*> args = absl::ParseCommandLine(argc, argv); |
Ivo Creusen | 55de08e | 2018-09-03 11:49:27 +0200 | [diff] [blame] | 290 | webrtc::test::NetEqTestFactory factory; |
Ivo Creusen | f81b0f1 | 2018-09-11 10:30:58 +0200 | [diff] [blame] | 291 | std::string usage = |
| 292 | "Tool for decoding an RTP dump file using NetEq.\n" |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 293 | "Example usage:\n" |
| 294 | "./neteq_rtpplay input.rtp [output.{pcm, wav}]\n"; |
| 295 | if (absl::GetFlag(FLAGS_codec_map)) { |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 296 | PrintCodecMapping(); |
| 297 | exit(0); |
Ivo Creusen | f81b0f1 | 2018-09-11 10:30:58 +0200 | [diff] [blame] | 298 | } |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 299 | if (args.size() != 2 && |
| 300 | args.size() != 3) { // The output audio file is optional. |
Ivo Creusen | f81b0f1 | 2018-09-11 10:30:58 +0200 | [diff] [blame] | 301 | // Print usage information. |
| 302 | std::cout << usage; |
| 303 | exit(0); |
| 304 | } |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 305 | const std::string output_audio_filename((args.size() == 3) ? args[2] : ""); |
| 306 | const std::string output_files_base_name( |
| 307 | absl::GetFlag(FLAGS_output_files_base_name)); |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 308 | RTC_CHECK(ValidateOutputFilesOptions( |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 309 | absl::GetFlag(FLAGS_textlog), |
| 310 | absl::GetFlag(FLAGS_matlabplot) || absl::GetFlag(FLAGS_pythonplot), |
| 311 | output_files_base_name, output_audio_filename)); |
| 312 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcmu))); |
| 313 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcma))); |
| 314 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_ilbc))); |
| 315 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_isac))); |
| 316 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_isac_swb))); |
| 317 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_opus))); |
| 318 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcm16b))); |
| 319 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcm16b_wb))); |
| 320 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcm16b_swb32))); |
| 321 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_pcm16b_swb48))); |
| 322 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_g722))); |
| 323 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt))); |
| 324 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt_16))); |
| 325 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt_32))); |
| 326 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_avt_48))); |
| 327 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_red))); |
| 328 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_nb))); |
| 329 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_wb))); |
| 330 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_swb32))); |
| 331 | RTC_CHECK(ValidatePayloadType(absl::GetFlag(FLAGS_cn_swb48))); |
| 332 | RTC_CHECK(ValidateSsrcValue(absl::GetFlag(FLAGS_ssrc))); |
| 333 | RTC_CHECK(ValidateExtensionId(absl::GetFlag(FLAGS_audio_level))); |
| 334 | RTC_CHECK(ValidateExtensionId(absl::GetFlag(FLAGS_abs_send_time))); |
| 335 | RTC_CHECK(ValidateExtensionId(absl::GetFlag(FLAGS_transport_seq_no))); |
| 336 | RTC_CHECK(ValidateExtensionId(absl::GetFlag(FLAGS_video_content_type))); |
| 337 | RTC_CHECK(ValidateExtensionId(absl::GetFlag(FLAGS_video_timing))); |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 338 | |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 339 | webrtc::field_trial::InitFieldTrialsFromString( |
| 340 | absl::GetFlag(FLAGS_force_fieldtrials).c_str()); |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 341 | webrtc::test::NetEqTestFactory::Config config; |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 342 | config.pcmu = absl::GetFlag(FLAGS_pcmu); |
| 343 | config.pcma = absl::GetFlag(FLAGS_pcma); |
| 344 | config.ilbc = absl::GetFlag(FLAGS_ilbc); |
| 345 | config.isac = absl::GetFlag(FLAGS_isac); |
| 346 | config.isac_swb = absl::GetFlag(FLAGS_isac_swb); |
| 347 | config.opus = absl::GetFlag(FLAGS_opus); |
| 348 | config.pcm16b = absl::GetFlag(FLAGS_pcm16b); |
| 349 | config.pcm16b_wb = absl::GetFlag(FLAGS_pcm16b_wb); |
| 350 | config.pcm16b_swb32 = absl::GetFlag(FLAGS_pcm16b_swb32); |
| 351 | config.pcm16b_swb48 = absl::GetFlag(FLAGS_pcm16b_swb48); |
| 352 | config.g722 = absl::GetFlag(FLAGS_g722); |
| 353 | config.avt = absl::GetFlag(FLAGS_avt); |
| 354 | config.avt_16 = absl::GetFlag(FLAGS_avt_16); |
| 355 | config.avt_32 = absl::GetFlag(FLAGS_avt_32); |
| 356 | config.avt_48 = absl::GetFlag(FLAGS_avt_48); |
| 357 | config.red = absl::GetFlag(FLAGS_red); |
| 358 | config.cn_nb = absl::GetFlag(FLAGS_cn_nb); |
| 359 | config.cn_wb = absl::GetFlag(FLAGS_cn_wb); |
| 360 | config.cn_swb32 = absl::GetFlag(FLAGS_cn_swb32); |
| 361 | config.cn_swb48 = absl::GetFlag(FLAGS_cn_swb48); |
| 362 | config.replacement_audio_file = absl::GetFlag(FLAGS_replacement_audio_file); |
| 363 | config.audio_level = absl::GetFlag(FLAGS_audio_level); |
| 364 | config.abs_send_time = absl::GetFlag(FLAGS_abs_send_time); |
| 365 | config.transport_seq_no = absl::GetFlag(FLAGS_transport_seq_no); |
| 366 | config.video_content_type = absl::GetFlag(FLAGS_video_content_type); |
| 367 | config.video_timing = absl::GetFlag(FLAGS_video_timing); |
| 368 | config.matlabplot = absl::GetFlag(FLAGS_matlabplot); |
| 369 | config.pythonplot = absl::GetFlag(FLAGS_pythonplot); |
| 370 | config.concealment_events = absl::GetFlag(FLAGS_concealment_events); |
| 371 | config.max_nr_packets_in_buffer = |
| 372 | absl::GetFlag(FLAGS_max_nr_packets_in_buffer); |
| 373 | config.enable_fast_accelerate = absl::GetFlag(FLAGS_enable_fast_accelerate); |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 374 | if (!output_audio_filename.empty()) { |
| 375 | config.output_audio_filename = output_audio_filename; |
| 376 | } |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 377 | config.textlog_filename = CreateOptionalOutputFileName( |
| 378 | absl::GetFlag(FLAGS_textlog), output_files_base_name, |
| 379 | output_audio_filename, ".text_log.txt"); |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 380 | config.plot_scripts_basename = CreateOptionalOutputFileName( |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 381 | absl::GetFlag(FLAGS_matlabplot) || absl::GetFlag(FLAGS_pythonplot), |
| 382 | output_files_base_name, output_audio_filename, ""); |
Alessio Bazzica | 5ad789c | 2019-03-13 11:51:44 +0100 | [diff] [blame] | 383 | |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 384 | // Check if an SSRC value was provided. |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 385 | if (absl::GetFlag(FLAGS_ssrc).size() > 0) { |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 386 | uint32_t ssrc; |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 387 | RTC_CHECK(ParseSsrc(absl::GetFlag(FLAGS_ssrc), &ssrc)) |
| 388 | << "Flag verification has failed."; |
Ivo Creusen | ba7886b | 2019-02-26 13:03:21 +0100 | [diff] [blame] | 389 | config.ssrc_filter = absl::make_optional(ssrc); |
| 390 | } |
| 391 | |
Ivo Creusen | 5ec6156 | 2019-03-20 10:52:18 +0100 | [diff] [blame] | 392 | std::unique_ptr<webrtc::test::NetEqTest> test = |
Mirko Bonadei | 14be799 | 2019-06-27 15:59:09 +0200 | [diff] [blame^] | 393 | factory.InitializeTestFromFile(/*input_filename=*/args[1], config); |
Ivo Creusen | ab9735f | 2019-03-20 18:01:51 +0100 | [diff] [blame] | 394 | RTC_CHECK(test) << "ERROR: Unable to run test"; |
Ivo Creusen | 55de08e | 2018-09-03 11:49:27 +0200 | [diff] [blame] | 395 | test->Run(); |
| 396 | return 0; |
henrik.lundin | 303d3e1 | 2016-05-26 05:56:03 -0700 | [diff] [blame] | 397 | } |