blob: 17b3f4185d788b645bba31eaf629381229b6c2fe [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_
12#define MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
kwiberg37478382016-02-14 20:40:57 -080014#include <memory>
minyue@webrtc.org05617162015-03-03 12:02:30 +000015
Ali Tofigh714e3cb2022-07-20 12:53:07 +020016#include "absl/strings/string_view.h"
Karl Wiberg895ce822018-10-01 17:26:11 +020017#include "api/audio_codecs/audio_decoder_factory.h"
18#include "api/audio_codecs/audio_encoder_factory.h"
19#include "common_audio/vad/include/vad.h"
Henrik Lundin84f75692023-02-01 12:07:10 +000020#include "modules/audio_coding/acm2/acm_receiver.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/audio_coding/include/audio_coding_module.h"
22#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "modules/audio_coding/test/Channel.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000024
tina.legrand@webrtc.org554ae1a2011-12-16 10:09:04 +000025namespace webrtc {
26
Niels Möller3bdc5e92020-03-10 09:28:33 +010027// This class records the frame type, and delegates actual sending to the
Artem Titovd00ce742021-07-28 20:00:17 +020028// `next_` AudioPacketizationCallback.
Niels Möller3bdc5e92020-03-10 09:28:33 +010029class MonitoringAudioPacketizationCallback : public AudioPacketizationCallback {
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000030 public:
Niels Möller3bdc5e92020-03-10 09:28:33 +010031 explicit MonitoringAudioPacketizationCallback(
32 AudioPacketizationCallback* next);
33
34 int32_t SendData(AudioFrameType frame_type,
35 uint8_t payload_type,
36 uint32_t timestamp,
37 const uint8_t* payload_data,
38 size_t payload_len_bytes,
39 int64_t absolute_capture_timestamp_ms) override;
40
tina.legrand@webrtc.orgee92b662013-08-27 07:33:51 +000041 void PrintStatistics();
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000042 void ResetStatistics();
minyue@webrtc.org05617162015-03-03 12:02:30 +000043 void GetStatistics(uint32_t* stats);
Yves Gerey665174f2018-06-19 15:03:05 +020044
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000045 private:
pbos22993e12015-10-19 02:39:06 -070046 // 0 - kEmptyFrame
henrik.lundin@webrtc.orge9217b42015-03-06 07:50:34 +000047 // 1 - kAudioFrameSpeech
48 // 2 - kAudioFrameCN
Niels Möllerc936cb62019-03-19 14:10:16 +010049 uint32_t counter_[3];
Niels Möller3bdc5e92020-03-10 09:28:33 +010050 AudioPacketizationCallback* const next_;
niklase@google.com470e71d2011-07-07 08:21:25 +000051};
52
minyue@webrtc.org05617162015-03-03 12:02:30 +000053// TestVadDtx is to verify that VAD/DTX perform as they should. It runs through
54// an audio file and check if the occurrence of various packet types follows
55// expectation. TestVadDtx needs its derived class to implement the Perform()
56// to put the test together.
Karl Wiberg3ff52ff2018-10-01 12:31:22 +020057class TestVadDtx {
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000058 public:
minyue@webrtc.org05617162015-03-03 12:02:30 +000059 static const int kOutputFreqHz = 16000;
niklase@google.com470e71d2011-07-07 08:21:25 +000060
minyue@webrtc.org05617162015-03-03 12:02:30 +000061 TestVadDtx();
62
minyue@webrtc.org05617162015-03-03 12:02:30 +000063 protected:
Karl Wiberg895ce822018-10-01 17:26:11 +020064 // Returns true iff CN was added.
65 bool RegisterCodec(const SdpAudioFormat& codec_format,
66 absl::optional<Vad::Aggressiveness> vad_mode);
minyue@webrtc.org05617162015-03-03 12:02:30 +000067
68 // Encoding a file and see if the numbers that various packets occur follow
69 // the expectation. Saves result to a file.
70 // expects[x] means
71 // -1 : do not care,
Artem Titovd00ce742021-07-28 20:00:17 +020072 // 0 : there have been no packets of type `x`,
73 // 1 : there have been packets of type `x`,
74 // with `x` indicates the following packet types
pbos22993e12015-10-19 02:39:06 -070075 // 0 - kEmptyFrame
henrik.lundin@webrtc.orge9217b42015-03-06 07:50:34 +000076 // 1 - kAudioFrameSpeech
77 // 2 - kAudioFrameCN
Ali Tofigh714e3cb2022-07-20 12:53:07 +020078 void Run(absl::string_view in_filename,
Yves Gerey665174f2018-06-19 15:03:05 +020079 int frequency,
80 int channels,
Ali Tofigh714e3cb2022-07-20 12:53:07 +020081 absl::string_view out_filename,
Yves Gerey665174f2018-06-19 15:03:05 +020082 bool append,
83 const int* expects);
minyue@webrtc.org05617162015-03-03 12:02:30 +000084
Karl Wiberg895ce822018-10-01 17:26:11 +020085 const rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
86 const rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
kwiberg37478382016-02-14 20:40:57 -080087 std::unique_ptr<AudioCodingModule> acm_send_;
Henrik Lundin84f75692023-02-01 12:07:10 +000088 std::unique_ptr<acm2::AcmReceiver> acm_receive_;
kwiberg37478382016-02-14 20:40:57 -080089 std::unique_ptr<Channel> channel_;
Niels Möller3bdc5e92020-03-10 09:28:33 +010090 std::unique_ptr<MonitoringAudioPacketizationCallback> packetization_callback_;
ossu63fb95a2016-07-06 09:34:22 -070091 uint32_t time_stamp_ = 0x12345678;
minyue@webrtc.org05617162015-03-03 12:02:30 +000092};
93
94// TestWebRtcVadDtx is to verify that the WebRTC VAD/DTX perform as they should.
95class TestWebRtcVadDtx final : public TestVadDtx {
96 public:
97 TestWebRtcVadDtx();
98
Karl Wiberg3ff52ff2018-10-01 12:31:22 +020099 void Perform();
minyue@webrtc.org05617162015-03-03 12:02:30 +0000100
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +0000101 private:
Karl Wiberg895ce822018-10-01 17:26:11 +0200102 void RunTestCases(const SdpAudioFormat& codec_format);
103 void Test(bool new_outfile, bool expect_dtx_enabled);
niklase@google.com470e71d2011-07-07 08:21:25 +0000104
minyue@webrtc.org05617162015-03-03 12:02:30 +0000105 int output_file_num_;
106};
niklase@google.com470e71d2011-07-07 08:21:25 +0000107
minyue@webrtc.org05617162015-03-03 12:02:30 +0000108// TestOpusDtx is to verify that the Opus DTX performs as it should.
109class TestOpusDtx final : public TestVadDtx {
110 public:
Karl Wiberg3ff52ff2018-10-01 12:31:22 +0200111 void Perform();
niklase@google.com470e71d2011-07-07 08:21:25 +0000112};
113
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +0000114} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000115
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200116#endif // MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_