Chromium Code Reviews

Side by Side Diff: webrtc/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc

Issue 2935643002: Templated AudioEncoderFactory (Closed)
Patch Set: better docs Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2017 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
11 #include "webrtc/api/audio_codecs/audio_encoder_factory_template.h"
12 #include "webrtc/base/ptr_util.h"
13 #include "webrtc/test/gmock.h"
14 #include "webrtc/test/gtest.h"
15 #include "webrtc/test/mock_audio_encoder.h"
16
17 namespace webrtc {
18
19 namespace {
20
21 struct BogusParams {
22 static SdpAudioFormat AudioFormat() { return {"bogus", 8000, 1}; }
23 static AudioCodecInfo CodecInfo() { return {8000, 1, 12345}; }
24 };
25
26 struct ShamParams {
27 static SdpAudioFormat AudioFormat() {
28 return {"sham", 16000, 2, {{"param", "value"}}};
29 }
30 static AudioCodecInfo CodecInfo() { return {16000, 2, 23456}; }
31 };
32
33 struct MyLittleConfig {
34 bool IsOk() const { return true; }
35 SdpAudioFormat audio_format;
36 };
37
38 template <typename Params>
39 struct AudioEncoderFakeApi {
40 static rtc::Optional<MyLittleConfig> SdpToConfig(
41 const SdpAudioFormat& audio_format) {
42 if (Params::AudioFormat() == audio_format) {
43 MyLittleConfig config = {audio_format};
44 return rtc::Optional<MyLittleConfig>(config);
45 } else {
46 return rtc::Optional<MyLittleConfig>();
47 }
48 }
49
50 static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs) {
51 specs->push_back({Params::AudioFormat(), Params::CodecInfo()});
52 }
53
54 static AudioCodecInfo QueryAudioEncoder(const MyLittleConfig&) {
55 return Params::CodecInfo();
56 }
57
58 static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const MyLittleConfig&,
59 int payload_type) {
60 auto enc = rtc::MakeUnique<testing::StrictMock<MockAudioEncoder>>();
61 EXPECT_CALL(*enc, SampleRateHz())
62 .WillOnce(testing::Return(Params::CodecInfo().sample_rate_hz));
63 EXPECT_CALL(*enc, Die());
64 return std::move(enc);
65 }
66 };
67
68 } // namespace
69
70 TEST(AudioEncoderFactoryTemplateTest, NoEncoderTypes) {
71 rtc::scoped_refptr<AudioEncoderFactory> factory(
72 new rtc::RefCountedObject<
73 audio_encoder_factory_template_impl::AudioEncoderFactoryT<>>());
74 EXPECT_THAT(factory->GetSupportedEncoders(), testing::IsEmpty());
75 EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
76 factory->QueryAudioEncoder({"foo", 8000, 1}));
77 EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
78 }
79
80 TEST(AudioEncoderFactoryTemplateTest, OneEncoderType) {
81 auto factory = CreateAudioEncoderFactory<AudioEncoderFakeApi<BogusParams>>();
82 EXPECT_THAT(factory->GetSupportedEncoders(),
83 testing::ElementsAre(
84 AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}}));
85 EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
86 factory->QueryAudioEncoder({"foo", 8000, 1}));
87 EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 12345}),
88 factory->QueryAudioEncoder({"bogus", 8000, 1}));
89 EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
90 auto enc = factory->MakeAudioEncoder(17, {"bogus", 8000, 1});
91 ASSERT_NE(nullptr, enc);
92 EXPECT_EQ(8000, enc->SampleRateHz());
93 }
94
95 TEST(AudioEncoderFactoryTemplateTest, TwoEncoderTypes) {
96 auto factory = CreateAudioEncoderFactory<AudioEncoderFakeApi<BogusParams>,
97 AudioEncoderFakeApi<ShamParams>>();
98 EXPECT_THAT(factory->GetSupportedEncoders(),
99 testing::ElementsAre(
100 AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}},
101 AudioCodecSpec{{"sham", 16000, 2, {{"param", "value"}}},
102 {16000, 2, 23456}}));
103 EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
104 factory->QueryAudioEncoder({"foo", 8000, 1}));
105 EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 12345}),
106 factory->QueryAudioEncoder({"bogus", 8000, 1}));
107 EXPECT_EQ(
108 rtc::Optional<AudioCodecInfo>({16000, 2, 23456}),
109 factory->QueryAudioEncoder({"sham", 16000, 2, {{"param", "value"}}}));
110 EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
111 auto enc1 = factory->MakeAudioEncoder(17, {"bogus", 8000, 1});
112 ASSERT_NE(nullptr, enc1);
113 EXPECT_EQ(8000, enc1->SampleRateHz());
114 EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"sham", 16000, 2}));
115 auto enc2 =
116 factory->MakeAudioEncoder(17, {"sham", 16000, 2, {{"param", "value"}}});
117 ASSERT_NE(nullptr, enc2);
118 EXPECT_EQ(16000, enc2->SampleRateHz());
119 }
120
121 } // namespace webrtc
OLDNEW

Powered by Google App Engine