From 5bdc82a60fd7231eed16b2467d0e7c3d09ef3c81 Mon Sep 17 00:00:00 2001 From: Karl Wiberg Date: Thu, 22 Mar 2018 00:07:39 +0100 Subject: [PATCH] Test for audio codec pair ID assignment We want to ensure that encoders and decoders actually get IDs with the desired properties. Bug: webrtc:8941 Change-Id: Ie64b67c2e9cb67171725d27f92e954afd1b77834 Reviewed-on: https://webrtc-review.googlesource.com/63300 Commit-Queue: Karl Wiberg Reviewed-by: Oskar Sundbom Cr-Commit-Position: refs/heads/master@{#22547} --- pc/peerconnectionendtoend_unittest.cc | 118 +++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 13 deletions(-) diff --git a/pc/peerconnectionendtoend_unittest.cc b/pc/peerconnectionendtoend_unittest.cc index 51ce29f7f2..2ac3580ae9 100644 --- a/pc/peerconnectionendtoend_unittest.cc +++ b/pc/peerconnectionendtoend_unittest.cc @@ -76,15 +76,18 @@ class PeerConnectionEndToEndBaseTest : public sigslot::has_slots<>, #endif } - void CreatePcs(const MediaConstraintsInterface* pc_constraints, - const rtc::scoped_refptr& - audio_encoder_factory, - const rtc::scoped_refptr& - audio_decoder_factory) { - EXPECT_TRUE(caller_->CreatePc( - pc_constraints, config_, audio_encoder_factory, audio_decoder_factory)); - EXPECT_TRUE(callee_->CreatePc( - pc_constraints, config_, audio_encoder_factory, audio_decoder_factory)); + void CreatePcs( + const MediaConstraintsInterface* pc_constraints, + rtc::scoped_refptr audio_encoder_factory1, + rtc::scoped_refptr audio_decoder_factory1, + rtc::scoped_refptr audio_encoder_factory2, + rtc::scoped_refptr audio_decoder_factory2) { + EXPECT_TRUE(caller_->CreatePc(pc_constraints, config_, + audio_encoder_factory1, + audio_decoder_factory1)); + EXPECT_TRUE(callee_->CreatePc(pc_constraints, config_, + audio_encoder_factory2, + audio_decoder_factory2)); PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get()); caller_->SignalOnDataChannel.connect( @@ -93,6 +96,14 @@ class PeerConnectionEndToEndBaseTest : public sigslot::has_slots<>, this, &PeerConnectionEndToEndBaseTest::OnCalleeAddedDataChannel); } + void CreatePcs( + const MediaConstraintsInterface* pc_constraints, + rtc::scoped_refptr audio_encoder_factory, + rtc::scoped_refptr audio_decoder_factory) { + CreatePcs(pc_constraints, audio_encoder_factory, audio_decoder_factory, + audio_encoder_factory, audio_decoder_factory); + } + void GetAndAddUserMedia() { FakeConstraints audio_constraints; FakeConstraints video_constraints; @@ -381,13 +392,94 @@ TEST_P(PeerConnectionEndToEndTest, CallWithLegacySdp) { #endif // !defined(ADDRESS_SANITIZER) TEST_P(PeerConnectionEndToEndTest, CallWithCustomCodec) { - CreatePcs( - nullptr, - webrtc::CreateAudioEncoderFactory(), - webrtc::CreateAudioDecoderFactory()); + class IdLoggingAudioEncoderFactory : public webrtc::AudioEncoderFactory { + public: + IdLoggingAudioEncoderFactory( + rtc::scoped_refptr real_factory, + std::vector* const codec_ids) + : fact_(real_factory), codec_ids_(codec_ids) {} + std::vector GetSupportedEncoders() override { + return fact_->GetSupportedEncoders(); + } + rtc::Optional QueryAudioEncoder( + const webrtc::SdpAudioFormat& format) override { + return fact_->QueryAudioEncoder(format); + } + std::unique_ptr MakeAudioEncoder( + int payload_type, + const webrtc::SdpAudioFormat& format, + rtc::Optional codec_pair_id) override { + EXPECT_TRUE(codec_pair_id.has_value()); + codec_ids_->push_back(*codec_pair_id); + return fact_->MakeAudioEncoder(payload_type, format, codec_pair_id); + } + + private: + const rtc::scoped_refptr fact_; + std::vector* const codec_ids_; + }; + + class IdLoggingAudioDecoderFactory : public webrtc::AudioDecoderFactory { + public: + IdLoggingAudioDecoderFactory( + rtc::scoped_refptr real_factory, + std::vector* const codec_ids) + : fact_(real_factory), codec_ids_(codec_ids) {} + std::vector GetSupportedDecoders() override { + return fact_->GetSupportedDecoders(); + } + bool IsSupportedDecoder(const webrtc::SdpAudioFormat& format) override { + return fact_->IsSupportedDecoder(format); + } + std::unique_ptr MakeAudioDecoder( + const webrtc::SdpAudioFormat& format, + rtc::Optional codec_pair_id) override { + EXPECT_TRUE(codec_pair_id.has_value()); + codec_ids_->push_back(*codec_pair_id); + return fact_->MakeAudioDecoder(format, codec_pair_id); + } + + private: + const rtc::scoped_refptr fact_; + std::vector* const codec_ids_; + }; + + std::vector encoder_id1, encoder_id2, decoder_id1, + decoder_id2; + CreatePcs(nullptr, + rtc::scoped_refptr( + new rtc::RefCountedObject( + webrtc::CreateAudioEncoderFactory< + AudioEncoderUnicornSparklesRainbow>(), + &encoder_id1)), + rtc::scoped_refptr( + new rtc::RefCountedObject( + webrtc::CreateAudioDecoderFactory< + AudioDecoderUnicornSparklesRainbow>(), + &decoder_id1)), + rtc::scoped_refptr( + new rtc::RefCountedObject( + webrtc::CreateAudioEncoderFactory< + AudioEncoderUnicornSparklesRainbow>(), + &encoder_id2)), + rtc::scoped_refptr( + new rtc::RefCountedObject( + webrtc::CreateAudioDecoderFactory< + AudioDecoderUnicornSparklesRainbow>(), + &decoder_id2))); GetAndAddUserMedia(); Negotiate(); WaitForCallEstablished(); + + // Each codec factory has been used to create one codec. The first pair got + // the same ID because they were passed to the same PeerConnectionFactory, + // and the second pair got the same ID---but these two IDs are not equal, + // because each PeerConnectionFactory has its own ID. + EXPECT_EQ(1, encoder_id1.size()); + EXPECT_EQ(1, encoder_id2.size()); + EXPECT_EQ(encoder_id1, decoder_id1); + EXPECT_EQ(encoder_id2, decoder_id2); + EXPECT_NE(encoder_id1, encoder_id2); } #ifdef HAVE_SCTP