blob: 36d5f9525514c64c4f0eff6af236e49405ad9e95 [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
Karl Wiberg895ce822018-10-01 17:26:11 +020016#include "api/audio_codecs/audio_decoder_factory.h"
17#include "api/audio_codecs/audio_encoder_factory.h"
18#include "common_audio/vad/include/vad.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "modules/audio_coding/include/audio_coding_module.h"
20#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/audio_coding/test/Channel.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000022
tina.legrand@webrtc.org554ae1a2011-12-16 10:09:04 +000023namespace webrtc {
24
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000025class ActivityMonitor : public ACMVADCallback {
26 public:
27 ActivityMonitor();
Niels Möller87e2d782019-03-07 10:18:23 +010028 int32_t InFrameType(AudioFrameType frame_type);
tina.legrand@webrtc.orgee92b662013-08-27 07:33:51 +000029 void PrintStatistics();
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000030 void ResetStatistics();
minyue@webrtc.org05617162015-03-03 12:02:30 +000031 void GetStatistics(uint32_t* stats);
Yves Gerey665174f2018-06-19 15:03:05 +020032
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000033 private:
pbos22993e12015-10-19 02:39:06 -070034 // 0 - kEmptyFrame
henrik.lundin@webrtc.orge9217b42015-03-06 07:50:34 +000035 // 1 - kAudioFrameSpeech
36 // 2 - kAudioFrameCN
37 // 3 - kVideoFrameKey (not used by audio)
38 // 4 - kVideoFrameDelta (not used by audio)
39 uint32_t counter_[5];
niklase@google.com470e71d2011-07-07 08:21:25 +000040};
41
minyue@webrtc.org05617162015-03-03 12:02:30 +000042// TestVadDtx is to verify that VAD/DTX perform as they should. It runs through
43// an audio file and check if the occurrence of various packet types follows
44// expectation. TestVadDtx needs its derived class to implement the Perform()
45// to put the test together.
Karl Wiberg3ff52ff2018-10-01 12:31:22 +020046class TestVadDtx {
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000047 public:
minyue@webrtc.org05617162015-03-03 12:02:30 +000048 static const int kOutputFreqHz = 16000;
niklase@google.com470e71d2011-07-07 08:21:25 +000049
minyue@webrtc.org05617162015-03-03 12:02:30 +000050 TestVadDtx();
51
minyue@webrtc.org05617162015-03-03 12:02:30 +000052 protected:
Karl Wiberg895ce822018-10-01 17:26:11 +020053 // Returns true iff CN was added.
54 bool RegisterCodec(const SdpAudioFormat& codec_format,
55 absl::optional<Vad::Aggressiveness> vad_mode);
minyue@webrtc.org05617162015-03-03 12:02:30 +000056
57 // Encoding a file and see if the numbers that various packets occur follow
58 // the expectation. Saves result to a file.
59 // expects[x] means
60 // -1 : do not care,
61 // 0 : there have been no packets of type |x|,
62 // 1 : there have been packets of type |x|,
63 // with |x| indicates the following packet types
pbos22993e12015-10-19 02:39:06 -070064 // 0 - kEmptyFrame
henrik.lundin@webrtc.orge9217b42015-03-06 07:50:34 +000065 // 1 - kAudioFrameSpeech
66 // 2 - kAudioFrameCN
67 // 3 - kVideoFrameKey (not used by audio)
68 // 4 - kVideoFrameDelta (not used by audio)
Yves Gerey665174f2018-06-19 15:03:05 +020069 void Run(std::string in_filename,
70 int frequency,
71 int channels,
72 std::string out_filename,
73 bool append,
74 const int* expects);
minyue@webrtc.org05617162015-03-03 12:02:30 +000075
Karl Wiberg895ce822018-10-01 17:26:11 +020076 const rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
77 const rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
kwiberg37478382016-02-14 20:40:57 -080078 std::unique_ptr<AudioCodingModule> acm_send_;
79 std::unique_ptr<AudioCodingModule> acm_receive_;
80 std::unique_ptr<Channel> channel_;
81 std::unique_ptr<ActivityMonitor> monitor_;
ossu63fb95a2016-07-06 09:34:22 -070082 uint32_t time_stamp_ = 0x12345678;
minyue@webrtc.org05617162015-03-03 12:02:30 +000083};
84
85// TestWebRtcVadDtx is to verify that the WebRTC VAD/DTX perform as they should.
86class TestWebRtcVadDtx final : public TestVadDtx {
87 public:
88 TestWebRtcVadDtx();
89
Karl Wiberg3ff52ff2018-10-01 12:31:22 +020090 void Perform();
minyue@webrtc.org05617162015-03-03 12:02:30 +000091
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +000092 private:
Karl Wiberg895ce822018-10-01 17:26:11 +020093 void RunTestCases(const SdpAudioFormat& codec_format);
94 void Test(bool new_outfile, bool expect_dtx_enabled);
niklase@google.com470e71d2011-07-07 08:21:25 +000095
minyue@webrtc.org05617162015-03-03 12:02:30 +000096 int output_file_num_;
97};
niklase@google.com470e71d2011-07-07 08:21:25 +000098
minyue@webrtc.org05617162015-03-03 12:02:30 +000099// TestOpusDtx is to verify that the Opus DTX performs as it should.
100class TestOpusDtx final : public TestVadDtx {
101 public:
Karl Wiberg3ff52ff2018-10-01 12:31:22 +0200102 void Perform();
niklase@google.com470e71d2011-07-07 08:21:25 +0000103};
104
tina.legrand@webrtc.orgd5726a12013-05-03 07:34:12 +0000105} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200107#endif // MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_