Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: webrtc/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc

Issue 2365653004: AudioCodingModule: Specify decoders using SdpAudioFormat (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <stdio.h> 11 #include <stdio.h>
12 #include <string.h> 12 #include <string.h>
13 #include <memory> 13 #include <memory>
14 #include <vector> 14 #include <vector>
15 15
16 #include "webrtc/base/criticalsection.h" 16 #include "webrtc/base/criticalsection.h"
17 #include "webrtc/base/md5digest.h" 17 #include "webrtc/base/md5digest.h"
18 #include "webrtc/base/platform_thread.h" 18 #include "webrtc/base/platform_thread.h"
19 #include "webrtc/base/thread_annotations.h" 19 #include "webrtc/base/thread_annotations.h"
20 #include "webrtc/modules/audio_coding/acm2/acm_receive_test_oldapi.h" 20 #include "webrtc/modules/audio_coding/acm2/acm_receive_test_oldapi.h"
21 #include "webrtc/modules/audio_coding/acm2/acm_send_test_oldapi.h" 21 #include "webrtc/modules/audio_coding/acm2/acm_send_test_oldapi.h"
22 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
22 #include "webrtc/modules/audio_coding/codecs/audio_encoder.h" 23 #include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
23 #include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h" 24 #include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
24 #include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h" 25 #include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
25 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isa c.h" 26 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isa c.h"
26 #include "webrtc/modules/audio_coding/codecs/mock/mock_audio_encoder.h" 27 #include "webrtc/modules/audio_coding/codecs/mock/mock_audio_encoder.h"
27 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" 28 #include "webrtc/modules/audio_coding/include/audio_coding_module.h"
28 #include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h" 29 #include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
29 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 30 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
30 #include "webrtc/modules/audio_coding/neteq/mock/mock_audio_decoder.h" 31 #include "webrtc/modules/audio_coding/neteq/mock/mock_audio_decoder.h"
31 #include "webrtc/modules/audio_coding/neteq/tools/audio_checksum.h" 32 #include "webrtc/modules/audio_coding/neteq/tools/audio_checksum.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 0, 176 0,
176 input_frame_.samples_per_channel_ * sizeof(input_frame_.data_[0])); 177 input_frame_.samples_per_channel_ * sizeof(input_frame_.data_[0]));
177 178
178 ASSERT_EQ(0, acm_->RegisterTransportCallback(&packet_cb_)); 179 ASSERT_EQ(0, acm_->RegisterTransportCallback(&packet_cb_));
179 180
180 SetUpL16Codec(); 181 SetUpL16Codec();
181 } 182 }
182 183
183 // Set up L16 codec. 184 // Set up L16 codec.
184 virtual void SetUpL16Codec() { 185 virtual void SetUpL16Codec() {
186 audio_format_ =
187 rtc::Optional<SdpAudioFormat>(SdpAudioFormat("L16", kSampleRateHz, 1));
185 ASSERT_EQ(0, AudioCodingModule::Codec("L16", &codec_, kSampleRateHz, 1)); 188 ASSERT_EQ(0, AudioCodingModule::Codec("L16", &codec_, kSampleRateHz, 1));
186 codec_.pltype = kPayloadType; 189 codec_.pltype = kPayloadType;
187 } 190 }
188 191
189 virtual void RegisterCodec() { 192 virtual void RegisterCodec() {
190 ASSERT_EQ(0, acm_->RegisterReceiveCodec(codec_)); 193 EXPECT_EQ(true, acm_->RegisterReceiveCodec(kPayloadType, *audio_format_));
191 ASSERT_EQ(0, acm_->RegisterSendCodec(codec_)); 194 EXPECT_EQ(0, acm_->RegisterSendCodec(codec_));
192 } 195 }
193 196
194 virtual void InsertPacketAndPullAudio() { 197 virtual void InsertPacketAndPullAudio() {
195 InsertPacket(); 198 InsertPacket();
196 PullAudio(); 199 PullAudio();
197 } 200 }
198 201
199 virtual void InsertPacket() { 202 virtual void InsertPacket() {
200 const uint8_t kPayload[kPayloadSizeBytes] = {0}; 203 const uint8_t kPayload[kPayloadSizeBytes] = {0};
201 ASSERT_EQ(0, 204 ASSERT_EQ(0,
(...skipping 23 matching lines...) Expand all
225 InsertAudio(); 228 InsertAudio();
226 VerifyEncoding(); 229 VerifyEncoding();
227 } 230 }
228 231
229 const int id_; 232 const int id_;
230 std::unique_ptr<RtpUtility> rtp_utility_; 233 std::unique_ptr<RtpUtility> rtp_utility_;
231 std::unique_ptr<AudioCodingModule> acm_; 234 std::unique_ptr<AudioCodingModule> acm_;
232 PacketizationCallbackStubOldApi packet_cb_; 235 PacketizationCallbackStubOldApi packet_cb_;
233 WebRtcRTPHeader rtp_header_; 236 WebRtcRTPHeader rtp_header_;
234 AudioFrame input_frame_; 237 AudioFrame input_frame_;
238
239 // These two have to be kept in sync for now. In the future, we'll be able to
240 // eliminate the CodecInst and keep only the SdpAudioFormat.
241 rtc::Optional<SdpAudioFormat> audio_format_;
235 CodecInst codec_; 242 CodecInst codec_;
243
236 Clock* clock_; 244 Clock* clock_;
237 }; 245 };
238 246
239 // Check if the statistics are initialized correctly. Before any call to ACM 247 // Check if the statistics are initialized correctly. Before any call to ACM
240 // all fields have to be zero. 248 // all fields have to be zero.
241 #if defined(WEBRTC_ANDROID) 249 #if defined(WEBRTC_ANDROID)
242 #define MAYBE_InitializedToZero DISABLED_InitializedToZero 250 #define MAYBE_InitializedToZero DISABLED_InitializedToZero
243 #else 251 #else
244 #define MAYBE_InitializedToZero InitializedToZero 252 #define MAYBE_InitializedToZero InitializedToZero
245 #endif 253 #endif
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 392
385 // Introduce this class to set different expectations on the number of encoded 393 // Introduce this class to set different expectations on the number of encoded
386 // bytes. This class expects all encoded packets to be 9 bytes (matching one 394 // bytes. This class expects all encoded packets to be 9 bytes (matching one
387 // CNG SID frame) or 0 bytes. This test depends on |input_frame_| containing 395 // CNG SID frame) or 0 bytes. This test depends on |input_frame_| containing
388 // (near-)zero values. It also introduces a way to register comfort noise with 396 // (near-)zero values. It also introduces a way to register comfort noise with
389 // a custom payload type. 397 // a custom payload type.
390 class AudioCodingModuleTestWithComfortNoiseOldApi 398 class AudioCodingModuleTestWithComfortNoiseOldApi
391 : public AudioCodingModuleTestOldApi { 399 : public AudioCodingModuleTestOldApi {
392 protected: 400 protected:
393 void RegisterCngCodec(int rtp_payload_type) { 401 void RegisterCngCodec(int rtp_payload_type) {
402 EXPECT_EQ(true,
403 acm_->RegisterReceiveCodec(
404 rtp_payload_type, SdpAudioFormat("cn", kSampleRateHz, 1)));
405
394 CodecInst codec; 406 CodecInst codec;
395 AudioCodingModule::Codec("CN", &codec, kSampleRateHz, 1); 407 EXPECT_EQ(0, AudioCodingModule::Codec("CN", &codec, kSampleRateHz, 1));
396 codec.pltype = rtp_payload_type; 408 codec.pltype = rtp_payload_type;
397 ASSERT_EQ(0, acm_->RegisterReceiveCodec(codec)); 409 EXPECT_EQ(0, acm_->RegisterSendCodec(codec));
398 ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
399 } 410 }
400 411
401 void VerifyEncoding() override { 412 void VerifyEncoding() override {
402 int last_length = packet_cb_.last_payload_len_bytes(); 413 int last_length = packet_cb_.last_payload_len_bytes();
403 EXPECT_TRUE(last_length == 9 || last_length == 0) 414 EXPECT_TRUE(last_length == 9 || last_length == 0)
404 << "Last encoded packet was " << last_length << " bytes."; 415 << "Last encoded packet was " << last_length << " bytes.";
405 } 416 }
406 417
407 void DoTest(int blocks_per_packet, int cng_pt) { 418 void DoTest(int blocks_per_packet, int cng_pt) {
408 const int kLoops = 40; 419 const int kLoops = 40;
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 } 655 }
645 // Set |last_packet_number_| to one less that |num_calls| so that the packet 656 // Set |last_packet_number_| to one less that |num_calls| so that the packet
646 // will be fetched in the next InsertPacket() call. 657 // will be fetched in the next InsertPacket() call.
647 last_packet_number_ = packet_cb_.num_calls() - 1; 658 last_packet_number_ = packet_cb_.num_calls() - 1;
648 659
649 StartThreads(); 660 StartThreads();
650 } 661 }
651 662
652 void RegisterCodec() override { 663 void RegisterCodec() override {
653 static_assert(kSampleRateHz == 16000, "test designed for iSAC 16 kHz"); 664 static_assert(kSampleRateHz == 16000, "test designed for iSAC 16 kHz");
665 audio_format_ =
666 rtc::Optional<SdpAudioFormat>(SdpAudioFormat("isac", kSampleRateHz, 1));
654 AudioCodingModule::Codec("ISAC", &codec_, kSampleRateHz, 1); 667 AudioCodingModule::Codec("ISAC", &codec_, kSampleRateHz, 1);
655 codec_.pltype = kPayloadType; 668 codec_.pltype = kPayloadType;
656 669
657 // Register iSAC codec in ACM, effectively unregistering the PCM16B codec 670 // Register iSAC codec in ACM, effectively unregistering the PCM16B codec
658 // registered in AudioCodingModuleTestOldApi::SetUp(); 671 // registered in AudioCodingModuleTestOldApi::SetUp();
659 ASSERT_EQ(0, acm_->RegisterReceiveCodec(codec_)); 672 EXPECT_EQ(true, acm_->RegisterReceiveCodec(kPayloadType, *audio_format_));
660 ASSERT_EQ(0, acm_->RegisterSendCodec(codec_)); 673 EXPECT_EQ(0, acm_->RegisterSendCodec(codec_));
661 } 674 }
662 675
663 void InsertPacket() override { 676 void InsertPacket() override {
664 int num_calls = packet_cb_.num_calls(); // Store locally for thread safety. 677 int num_calls = packet_cb_.num_calls(); // Store locally for thread safety.
665 if (num_calls > last_packet_number_) { 678 if (num_calls > last_packet_number_) {
666 // Get the new payload out from the callback handler. 679 // Get the new payload out from the callback handler.
667 // Note that since we swap buffers here instead of directly inserting 680 // Note that since we swap buffers here instead of directly inserting
668 // a pointer to the data in |packet_cb_|, we avoid locking the callback 681 // a pointer to the data in |packet_cb_|, we avoid locking the callback
669 // for the duration of the IncomingPacket() call. 682 // for the duration of the IncomingPacket() call.
670 packet_cb_.SwapBuffers(&last_payload_vec_); 683 packet_cb_.SwapBuffers(&last_payload_vec_);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 920
908 protected: 921 protected:
909 struct ExternalDecoder { 922 struct ExternalDecoder {
910 int rtp_payload_type; 923 int rtp_payload_type;
911 AudioDecoder* external_decoder; 924 AudioDecoder* external_decoder;
912 int sample_rate_hz; 925 int sample_rate_hz;
913 int num_channels; 926 int num_channels;
914 std::string name; 927 std::string name;
915 }; 928 };
916 929
930 void Run(int output_freq_hz, const std::string& checksum_ref) {
931 Run(output_freq_hz, checksum_ref, CreateBuiltinAudioDecoderFactory(),
932 [](AudioCodingModule*) {});
933 }
934
917 void Run(int output_freq_hz, 935 void Run(int output_freq_hz,
918 const std::string& checksum_ref, 936 const std::string& checksum_ref,
919 const std::vector<ExternalDecoder>& external_decoders) { 937 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
938 rtc::FunctionView<void(AudioCodingModule*)> decoder_reg) {
920 const std::string input_file_name = 939 const std::string input_file_name =
921 webrtc::test::ResourcePath("audio_coding/neteq_universal_new", "rtp"); 940 webrtc::test::ResourcePath("audio_coding/neteq_universal_new", "rtp");
922 std::unique_ptr<test::RtpFileSource> packet_source( 941 std::unique_ptr<test::RtpFileSource> packet_source(
923 test::RtpFileSource::Create(input_file_name)); 942 test::RtpFileSource::Create(input_file_name));
924 #ifdef WEBRTC_ANDROID 943 #ifdef WEBRTC_ANDROID
925 // Filter out iLBC and iSAC-swb since they are not supported on Android. 944 // Filter out iLBC and iSAC-swb since they are not supported on Android.
926 packet_source->FilterOutPayloadType(102); // iLBC. 945 packet_source->FilterOutPayloadType(102); // iLBC.
927 packet_source->FilterOutPayloadType(104); // iSAC-swb. 946 packet_source->FilterOutPayloadType(104); // iSAC-swb.
928 #endif 947 #endif
929 948
930 test::AudioChecksum checksum; 949 test::AudioChecksum checksum;
931 const std::string output_file_name = 950 const std::string output_file_name =
932 webrtc::test::OutputPath() + 951 webrtc::test::OutputPath() +
933 ::testing::UnitTest::GetInstance() 952 ::testing::UnitTest::GetInstance()
934 ->current_test_info() 953 ->current_test_info()
935 ->test_case_name() + 954 ->test_case_name() +
936 "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + 955 "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() +
937 "_output.pcm"; 956 "_output.pcm";
938 test::OutputAudioFile output_file(output_file_name); 957 test::OutputAudioFile output_file(output_file_name);
939 test::AudioSinkFork output(&checksum, &output_file); 958 test::AudioSinkFork output(&checksum, &output_file);
940 959
941 test::AcmReceiveTestOldApi test( 960 test::AcmReceiveTestOldApi test(
942 packet_source.get(), 961 packet_source.get(), &output, output_freq_hz,
943 &output, 962 test::AcmReceiveTestOldApi::kArbitraryChannels,
944 output_freq_hz, 963 std::move(decoder_factory));
945 test::AcmReceiveTestOldApi::kArbitraryChannels);
946 ASSERT_NO_FATAL_FAILURE(test.RegisterNetEqTestCodecs()); 964 ASSERT_NO_FATAL_FAILURE(test.RegisterNetEqTestCodecs());
947 for (const auto& ed : external_decoders) { 965 decoder_reg(test.get_acm());
948 ASSERT_EQ(0, test.RegisterExternalReceiveCodec(
949 ed.rtp_payload_type, ed.external_decoder,
950 ed.sample_rate_hz, ed.num_channels, ed.name));
951 }
952 test.Run(); 966 test.Run();
953 967
954 std::string checksum_string = checksum.Finish(); 968 std::string checksum_string = checksum.Finish();
955 EXPECT_EQ(checksum_ref, checksum_string); 969 EXPECT_EQ(checksum_ref, checksum_string);
956 970
957 // Delete the output file. 971 // Delete the output file.
958 remove(output_file_name.c_str()); 972 remove(output_file_name.c_str());
959 } 973 }
960 }; 974 };
961 975
962 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \ 976 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \
963 defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722) 977 defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722)
964 TEST_F(AcmReceiverBitExactnessOldApi, 8kHzOutput) { 978 TEST_F(AcmReceiverBitExactnessOldApi, 8kHzOutput) {
965 Run(8000, PlatformChecksum("dce4890259e9ded50f472455aa470a6f", 979 Run(8000, PlatformChecksum("dce4890259e9ded50f472455aa470a6f",
966 "1c4ada78b12612147f3026920f8dcc14", 980 "1c4ada78b12612147f3026920f8dcc14",
967 "d804791edf2d00be2bc31c81a47368d4", 981 "d804791edf2d00be2bc31c81a47368d4",
968 "b2611f7323ab1209d5056399d0babbf5"), 982 "b2611f7323ab1209d5056399d0babbf5"));
969 std::vector<ExternalDecoder>());
970 } 983 }
971 984
972 TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) { 985 TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) {
973 Run(16000, PlatformChecksum("27356bddffaa42b5c841b49aa3a070c5", 986 Run(16000, PlatformChecksum("27356bddffaa42b5c841b49aa3a070c5",
974 "5667d1872fc351244092ae995e5a5b32", 987 "5667d1872fc351244092ae995e5a5b32",
975 "53f5dc8088148479ca112c4c6d0e91cb", 988 "53f5dc8088148479ca112c4c6d0e91cb",
976 "4061a876d64d6cec5a38450acf4f245d"), 989 "4061a876d64d6cec5a38450acf4f245d"));
977 std::vector<ExternalDecoder>());
978 } 990 }
979 991
980 TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) { 992 TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) {
981 Run(32000, PlatformChecksum("eb326547e83292305423b0a7ea57fea1", 993 Run(32000, PlatformChecksum("eb326547e83292305423b0a7ea57fea1",
982 "be7fc3140e6b5188c2e5fae0a394543b", 994 "be7fc3140e6b5188c2e5fae0a394543b",
983 "eab9a0bff17320d6457d04f4c56563c6", 995 "eab9a0bff17320d6457d04f4c56563c6",
984 "b60241ef0bac4a75f66eead04e71bb12"), 996 "b60241ef0bac4a75f66eead04e71bb12"));
985 std::vector<ExternalDecoder>());
986 } 997 }
987 998
988 TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) { 999 TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) {
989 Run(48000, PlatformChecksum("7eb79ea39b68472a5b04cf9a56e49cda", 1000 Run(48000, PlatformChecksum("7eb79ea39b68472a5b04cf9a56e49cda",
990 "f8cdd6e018688b2fff25c9b865bebdbb", 1001 "f8cdd6e018688b2fff25c9b865bebdbb",
991 "2d18f0f06e7e2fc63b74d06e3c58067f", 1002 "2d18f0f06e7e2fc63b74d06e3c58067f",
992 "81c3e4d24ebec23ca48f42fbaec4aba0"), 1003 "81c3e4d24ebec23ca48f42fbaec4aba0"));
993 std::vector<ExternalDecoder>());
994 } 1004 }
995 1005
996 TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) { 1006 TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) {
997 // Class intended to forward a call from a mock DecodeInternal to Decode on 1007 class ADFactory : public AudioDecoderFactory {
998 // the real decoder's Decode. DecodeInternal for the real decoder isn't
999 // public.
1000 class DecodeForwarder {
1001 public: 1008 public:
1002 DecodeForwarder(AudioDecoder* decoder) : decoder_(decoder) {} 1009 ADFactory()
1003 int Decode(const uint8_t* encoded, 1010 : mock_decoder_(new MockAudioDecoder()),
1004 size_t encoded_len, 1011 pcmu_decoder_(1),
1005 int sample_rate_hz, 1012 decode_forwarder_(&pcmu_decoder_),
1006 int16_t* decoded, 1013 fact_(CreateBuiltinAudioDecoderFactory()) {
1007 AudioDecoder::SpeechType* speech_type) { 1014 // Set expectations on the mock decoder and also delegate the calls to
1008 return decoder_->Decode(encoded, encoded_len, sample_rate_hz, 1015 // the real decoder.
1009 decoder_->PacketDuration(encoded, encoded_len) * 1016 EXPECT_CALL(*mock_decoder_, IncomingPacket(_, _, _, _, _))
1010 decoder_->Channels() * sizeof(int16_t), 1017 .Times(AtLeast(1))
1011 decoded, speech_type); 1018 .WillRepeatedly(
1019 Invoke(&pcmu_decoder_, &AudioDecoderPcmU::IncomingPacket));
1020 EXPECT_CALL(*mock_decoder_, SampleRateHz())
1021 .Times(AtLeast(1))
1022 .WillRepeatedly(
1023 Invoke(&pcmu_decoder_, &AudioDecoderPcmU::SampleRateHz));
1024 EXPECT_CALL(*mock_decoder_, Channels())
1025 .Times(AtLeast(1))
1026 .WillRepeatedly(Invoke(&pcmu_decoder_, &AudioDecoderPcmU::Channels));
1027 EXPECT_CALL(*mock_decoder_, DecodeInternal(_, _, _, _, _))
1028 .Times(AtLeast(1))
1029 .WillRepeatedly(Invoke(&decode_forwarder_, &DecodeForwarder::Decode));
1030 EXPECT_CALL(*mock_decoder_, HasDecodePlc())
1031 .Times(AtLeast(1))
1032 .WillRepeatedly(
1033 Invoke(&pcmu_decoder_, &AudioDecoderPcmU::HasDecodePlc));
1034 EXPECT_CALL(*mock_decoder_, PacketDuration(_, _))
1035 .Times(AtLeast(1))
1036 .WillRepeatedly(
1037 Invoke(&pcmu_decoder_, &AudioDecoderPcmU::PacketDuration));
1038 EXPECT_CALL(*mock_decoder_, Die());
1039 }
1040 std::vector<AudioCodecSpec> GetSupportedDecoders() override {
1041 return fact_->GetSupportedDecoders();
1042 }
1043 std::unique_ptr<AudioDecoder> MakeAudioDecoder(
1044 const SdpAudioFormat& format) override {
1045 return format.name == "MockPCMu" ? std::move(mock_decoder_)
1046 : fact_->MakeAudioDecoder(format);
1012 } 1047 }
1013 1048
1014 private: 1049 private:
1015 AudioDecoder* const decoder_; 1050 // Class intended to forward a call from a mock DecodeInternal to Decode on
1051 // the real decoder's Decode. DecodeInternal for the real decoder isn't
1052 // public.
1053 class DecodeForwarder {
1054 public:
1055 DecodeForwarder(AudioDecoder* decoder) : decoder_(decoder) {}
1056 int Decode(const uint8_t* encoded,
1057 size_t encoded_len,
1058 int sample_rate_hz,
1059 int16_t* decoded,
1060 AudioDecoder::SpeechType* speech_type) {
1061 return decoder_->Decode(encoded, encoded_len, sample_rate_hz,
1062 decoder_->PacketDuration(encoded, encoded_len) *
1063 decoder_->Channels() * sizeof(int16_t),
1064 decoded, speech_type);
1065 }
1066
1067 private:
1068 AudioDecoder* const decoder_;
1069 };
1070
1071 std::unique_ptr<MockAudioDecoder> mock_decoder_;
1072 AudioDecoderPcmU pcmu_decoder_;
1073 DecodeForwarder decode_forwarder_;
1074 rtc::scoped_refptr<AudioDecoderFactory> fact_; // Fallback factory.
1016 }; 1075 };
1017 1076
1018 AudioDecoderPcmU decoder(1); 1077 rtc::scoped_refptr<rtc::RefCountedObject<ADFactory>> factory(
1019 DecodeForwarder decode_forwarder(&decoder); 1078 new rtc::RefCountedObject<ADFactory>);
1020 MockAudioDecoder mock_decoder;
1021 // Set expectations on the mock decoder and also delegate the calls to the
1022 // real decoder.
1023 EXPECT_CALL(mock_decoder, IncomingPacket(_, _, _, _, _))
1024 .Times(AtLeast(1))
1025 .WillRepeatedly(Invoke(&decoder, &AudioDecoderPcmU::IncomingPacket));
1026 EXPECT_CALL(mock_decoder, SampleRateHz())
1027 .Times(AtLeast(1))
1028 .WillRepeatedly(Invoke(&decoder, &AudioDecoderPcmU::SampleRateHz));
1029 EXPECT_CALL(mock_decoder, Channels())
1030 .Times(AtLeast(1))
1031 .WillRepeatedly(Invoke(&decoder, &AudioDecoderPcmU::Channels));
1032 EXPECT_CALL(mock_decoder, DecodeInternal(_, _, _, _, _))
1033 .Times(AtLeast(1))
1034 .WillRepeatedly(Invoke(&decode_forwarder, &DecodeForwarder::Decode));
1035 EXPECT_CALL(mock_decoder, HasDecodePlc())
1036 .Times(AtLeast(1))
1037 .WillRepeatedly(Invoke(&decoder, &AudioDecoderPcmU::HasDecodePlc));
1038 EXPECT_CALL(mock_decoder, PacketDuration(_, _))
1039 .Times(AtLeast(1))
1040 .WillRepeatedly(Invoke(&decoder, &AudioDecoderPcmU::PacketDuration));
1041 ExternalDecoder ed;
1042 ed.rtp_payload_type = 0;
1043 ed.external_decoder = &mock_decoder;
1044 ed.sample_rate_hz = 8000;
1045 ed.num_channels = 1;
1046 ed.name = "MockPCMU";
1047 std::vector<ExternalDecoder> external_decoders;
1048 external_decoders.push_back(ed);
1049
1050 Run(48000, PlatformChecksum("7eb79ea39b68472a5b04cf9a56e49cda", 1079 Run(48000, PlatformChecksum("7eb79ea39b68472a5b04cf9a56e49cda",
1051 "f8cdd6e018688b2fff25c9b865bebdbb", 1080 "f8cdd6e018688b2fff25c9b865bebdbb",
1052 "2d18f0f06e7e2fc63b74d06e3c58067f", 1081 "2d18f0f06e7e2fc63b74d06e3c58067f",
1053 "81c3e4d24ebec23ca48f42fbaec4aba0"), 1082 "81c3e4d24ebec23ca48f42fbaec4aba0"),
1054 external_decoders); 1083 factory, [](AudioCodingModule* acm) {
1055 1084 acm->RegisterReceiveCodec(0, {"MockPCMu", 8000, 1});
1056 EXPECT_CALL(mock_decoder, Die()); 1085 });
1057 } 1086 }
1058 #endif 1087 #endif
1059 1088
1060 // This test verifies bit exactness for the send-side of ACM. The test setup is 1089 // This test verifies bit exactness for the send-side of ACM. The test setup is
1061 // a chain of three different test classes: 1090 // a chain of three different test classes:
1062 // 1091 //
1063 // test::AcmSendTest -> AcmSenderBitExactness -> test::AcmReceiveTest 1092 // test::AcmSendTest -> AcmSenderBitExactness -> test::AcmReceiveTest
1064 // 1093 //
1065 // The receiver side is driving the test by requesting new packets from 1094 // The receiver side is driving the test by requesting new packets from
1066 // AcmSenderBitExactness::NextPacket(). This method, in turn, asks for the 1095 // AcmSenderBitExactness::NextPacket(). This method, in turn, asks for the
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 webrtc::test::OutputPath() + 1163 webrtc::test::OutputPath() +
1135 ::testing::UnitTest::GetInstance() 1164 ::testing::UnitTest::GetInstance()
1136 ->current_test_info() 1165 ->current_test_info()
1137 ->test_case_name() + 1166 ->test_case_name() +
1138 "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + 1167 "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() +
1139 "_output.pcm"; 1168 "_output.pcm";
1140 test::OutputAudioFile output_file(output_file_name); 1169 test::OutputAudioFile output_file(output_file_name);
1141 // Have the output audio sent both to file and to the checksum calculator. 1170 // Have the output audio sent both to file and to the checksum calculator.
1142 test::AudioSinkFork output(&audio_checksum, &output_file); 1171 test::AudioSinkFork output(&audio_checksum, &output_file);
1143 const int kOutputFreqHz = 8000; 1172 const int kOutputFreqHz = 8000;
1144 test::AcmReceiveTestOldApi receive_test( 1173 test::AcmReceiveTestOldApi receive_test(this, &output, kOutputFreqHz,
1145 this, &output, kOutputFreqHz, expected_channels); 1174 expected_channels,
1175 CreateBuiltinAudioDecoderFactory());
1146 ASSERT_NO_FATAL_FAILURE(receive_test.RegisterDefaultCodecs()); 1176 ASSERT_NO_FATAL_FAILURE(receive_test.RegisterDefaultCodecs());
1147 1177
1148 // This is where the actual test is executed. 1178 // This is where the actual test is executed.
1149 receive_test.Run(); 1179 receive_test.Run();
1150 1180
1151 // Extract and verify the audio checksum. 1181 // Extract and verify the audio checksum.
1152 std::string checksum_string = audio_checksum.Finish(); 1182 std::string checksum_string = audio_checksum.Finish();
1153 EXPECT_EQ(audio_checksum_ref, checksum_string); 1183 EXPECT_EQ(audio_checksum_ref, checksum_string);
1154 1184
1155 // Extract and verify the payload checksum. 1185 // Extract and verify the payload checksum.
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 Run(16000, 8000, 1000); 1835 Run(16000, 8000, 1000);
1806 } 1836 }
1807 1837
1808 TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle8KhzTo16Khz) { 1838 TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle8KhzTo16Khz) {
1809 Run(8000, 16000, 1000); 1839 Run(8000, 16000, 1000);
1810 } 1840 }
1811 1841
1812 #endif 1842 #endif
1813 1843
1814 } // namespace webrtc 1844 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698