diff options
author | Johannes Kron <kron@webrtc.org> | 2020-03-29 22:17:00 +0200 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-29 21:03:27 +0000 |
commit | 3e98368ec5f8161fff9c02148675256a81a235fd (patch) | |
tree | daeae1bb99ed550efa76b803d3c63001fa5f9be9 /media | |
parent | 8e1824a0d12f6a9806fed9e99b1138cb3ea19eb6 (diff) | |
download | webrtc-3e98368ec5f8161fff9c02148675256a81a235fd.tar.gz |
Reland "Distinguish between send and receive codecs"
This reverts commit 8e8b36a94a7a7a1fd0f8093979a406afa56e18c1.
Reason for revert: The CL has been improved with the following changes,
- Fixed negotiation of send/receive only clients.
- Handles the implicit assumption that any H264 decoder also can
decode H264 constraint baseline.
Original change's description:
> Distinguish between send and receive codecs
>
> Even though send and receive codecs may be the same, they might have
> different support in HW. Distinguish between send and receive codecs
> to be able to keep track of which codecs have HW support.
>
> Bug: chromium:1029737
> Change-Id: Id119560becadfe0aaf861c892a6485f1c2eb378d
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165763
> Commit-Queue: Johannes Kron <kron@webrtc.org>
> Reviewed-by: Steve Anton <steveanton@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#30284}
Change-Id: I834ed48ee78d04922c73e2836165e476925e1cc5
Bug: chromium:1029737
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168605
Commit-Queue: Johannes Kron <kron@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Johannes Kron <kron@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30932}
Diffstat (limited to 'media')
-rw-r--r-- | media/BUILD.gn | 2 | ||||
-rw-r--r-- | media/base/codec.cc | 51 | ||||
-rw-r--r-- | media/base/codec.h | 3 | ||||
-rw-r--r-- | media/base/codec_unittest.cc | 66 | ||||
-rw-r--r-- | media/base/fake_media_engine.cc | 24 | ||||
-rw-r--r-- | media/base/fake_media_engine.h | 9 | ||||
-rw-r--r-- | media/base/media_channel.h | 4 | ||||
-rw-r--r-- | media/base/media_engine.h | 3 | ||||
-rw-r--r-- | media/engine/fake_webrtc_video_engine.cc | 7 | ||||
-rw-r--r-- | media/engine/fake_webrtc_video_engine.h | 2 | ||||
-rw-r--r-- | media/engine/null_webrtc_video_engine.h | 6 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine.cc | 76 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine.h | 3 | ||||
-rw-r--r-- | media/engine/webrtc_video_engine_unittest.cc | 164 |
14 files changed, 307 insertions, 113 deletions
diff --git a/media/BUILD.gn b/media/BUILD.gn index 7e116cbf7e..705378022e 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -566,6 +566,7 @@ if (rtc_include_tests) { "../audio", "../call:call_interfaces", "../common_video", + "../media:rtc_h264_profile_id", "../modules/audio_device:mock_audio_device", "../modules/audio_processing", "../modules/audio_processing:api", @@ -573,6 +574,7 @@ if (rtc_include_tests) { "../modules/rtp_rtcp", "../modules/video_coding:simulcast_test_fixture_impl", "../modules/video_coding:video_codec_interface", + "../modules/video_coding:webrtc_h264", "../modules/video_coding:webrtc_vp8", "../modules/video_coding/codecs/av1:libaom_av1_decoder", "../p2p:p2p_test_utils", diff --git a/media/base/codec.cc b/media/base/codec.cc index 168e7a7829..6b9a052da3 100644 --- a/media/base/codec.cc +++ b/media/base/codec.cc @@ -57,6 +57,18 @@ bool IsSameCodecSpecific(const std::string& name1, return true; } +bool IsCodecInList( + const webrtc::SdpVideoFormat& format, + const std::vector<webrtc::SdpVideoFormat>& existing_formats) { + for (auto existing_format : existing_formats) { + if (IsSameCodec(format.name, format.parameters, existing_format.name, + existing_format.parameters)) { + return true; + } + } + return false; +} + } // namespace FeedbackParams::FeedbackParams() = default; @@ -423,4 +435,43 @@ bool IsSameCodec(const std::string& name1, IsSameCodecSpecific(name1, params1, name2, params2); } +// If a decoder supports any H264 profile, it is implicitly assumed to also +// support constrained base line even though it's not explicitly listed. +void AddH264ConstrainedBaselineProfileToSupportedFormats( + std::vector<webrtc::SdpVideoFormat>* supported_formats) { + std::vector<webrtc::SdpVideoFormat> cbr_supported_formats; + + // For any H264 supported profile, add the corresponding constrained baseline + // profile. + for (auto it = supported_formats->cbegin(); it != supported_formats->cend(); + ++it) { + if (it->name == cricket::kH264CodecName) { + const absl::optional<webrtc::H264::ProfileLevelId> profile_level_id = + webrtc::H264::ParseSdpProfileLevelId(it->parameters); + if (profile_level_id && profile_level_id->profile != + webrtc::H264::kProfileConstrainedBaseline) { + webrtc::SdpVideoFormat cbp_format = *it; + webrtc::H264::ProfileLevelId cbp_profile = *profile_level_id; + cbp_profile.profile = webrtc::H264::kProfileConstrainedBaseline; + cbp_format.parameters[cricket::kH264FmtpProfileLevelId] = + *webrtc::H264::ProfileLevelIdToString(cbp_profile); + cbr_supported_formats.push_back(cbp_format); + } + } + } + + size_t original_size = supported_formats->size(); + // ...if it's not already in the list. + std::copy_if(cbr_supported_formats.begin(), cbr_supported_formats.end(), + std::back_inserter(*supported_formats), + [supported_formats](const webrtc::SdpVideoFormat& format) { + return !IsCodecInList(format, *supported_formats); + }); + + if (supported_formats->size() > original_size) { + RTC_LOG(LS_WARNING) << "Explicitly added H264 constrained baseline to list " + "of supported formats."; + } +} + } // namespace cricket diff --git a/media/base/codec.h b/media/base/codec.h index f327199484..fd8a97c5e4 100644 --- a/media/base/codec.h +++ b/media/base/codec.h @@ -243,6 +243,9 @@ RTC_EXPORT bool IsSameCodec(const std::string& name1, const std::string& name2, const CodecParameterMap& params2); +RTC_EXPORT void AddH264ConstrainedBaselineProfileToSupportedFormats( + std::vector<webrtc::SdpVideoFormat>* supported_formats); + } // namespace cricket #endif // MEDIA_BASE_CODEC_H_ diff --git a/media/base/codec_unittest.cc b/media/base/codec_unittest.cc index 62968e0005..04130e1642 100644 --- a/media/base/codec_unittest.cc +++ b/media/base/codec_unittest.cc @@ -12,7 +12,10 @@ #include <tuple> +#include "common_types.h" // NOLINT(build/include) +#include "media/base/h264_profile_level_id.h" #include "media/base/vp9_profile.h" +#include "modules/video_coding/codecs/h264/include/h264.h" #include "rtc_base/gunit.h" using cricket::AudioCodec; @@ -438,6 +441,69 @@ TEST(CodecTest, TestToCodecParameters) { EXPECT_EQ("a1", codec_params_2.parameters.begin()->second); } +TEST(CodecTest, H264CostrainedBaselineIsAddedIfH264IsSupported) { + const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = { + webrtc::CreateH264Format(webrtc::H264::kProfileBaseline, + webrtc::H264::kLevel3_1, "1"), + webrtc::CreateH264Format(webrtc::H264::kProfileBaseline, + webrtc::H264::kLevel3_1, "0")}; + + std::vector<webrtc::SdpVideoFormat> supported_formats = + kExplicitlySupportedFormats; + cricket::AddH264ConstrainedBaselineProfileToSupportedFormats( + &supported_formats); + + const webrtc::SdpVideoFormat kH264ConstrainedBasedlinePacketization1 = + webrtc::CreateH264Format(webrtc::H264::kProfileConstrainedBaseline, + webrtc::H264::kLevel3_1, "1"); + const webrtc::SdpVideoFormat kH264ConstrainedBasedlinePacketization0 = + webrtc::CreateH264Format(webrtc::H264::kProfileConstrainedBaseline, + webrtc::H264::kLevel3_1, "0"); + + EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]); + EXPECT_EQ(supported_formats[1], kExplicitlySupportedFormats[1]); + EXPECT_EQ(supported_formats[2], kH264ConstrainedBasedlinePacketization1); + EXPECT_EQ(supported_formats[3], kH264ConstrainedBasedlinePacketization0); +} + +TEST(CodecTest, H264CostrainedBaselineIsNotAddedIfH264IsUnsupported) { + const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = { + {cricket::kVp9CodecName, + {{webrtc::kVP9FmtpProfileId, + VP9ProfileToString(webrtc::VP9Profile::kProfile0)}}}}; + + std::vector<webrtc::SdpVideoFormat> supported_formats = + kExplicitlySupportedFormats; + cricket::AddH264ConstrainedBaselineProfileToSupportedFormats( + &supported_formats); + + EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]); + EXPECT_EQ(supported_formats.size(), kExplicitlySupportedFormats.size()); +} + +TEST(CodecTest, H264CostrainedBaselineNotAddedIfAlreadySpecified) { + const std::vector<webrtc::SdpVideoFormat> kExplicitlySupportedFormats = { + webrtc::CreateH264Format(webrtc::H264::kProfileBaseline, + webrtc::H264::kLevel3_1, "1"), + webrtc::CreateH264Format(webrtc::H264::kProfileBaseline, + webrtc::H264::kLevel3_1, "0"), + webrtc::CreateH264Format(webrtc::H264::kProfileConstrainedBaseline, + webrtc::H264::kLevel3_1, "1"), + webrtc::CreateH264Format(webrtc::H264::kProfileConstrainedBaseline, + webrtc::H264::kLevel3_1, "0")}; + + std::vector<webrtc::SdpVideoFormat> supported_formats = + kExplicitlySupportedFormats; + cricket::AddH264ConstrainedBaselineProfileToSupportedFormats( + &supported_formats); + + EXPECT_EQ(supported_formats[0], kExplicitlySupportedFormats[0]); + EXPECT_EQ(supported_formats[1], kExplicitlySupportedFormats[1]); + EXPECT_EQ(supported_formats[2], kExplicitlySupportedFormats[2]); + EXPECT_EQ(supported_formats[3], kExplicitlySupportedFormats[3]); + EXPECT_EQ(supported_formats.size(), kExplicitlySupportedFormats.size()); +} + // Tests that the helper IsSameCodec returns the correct value for codecs that // must also be matched on particular parameter values. using IsSameCodecParamsTestCase = diff --git a/media/base/fake_media_engine.cc b/media/base/fake_media_engine.cc index e4d8917ea4..1040757f8e 100644 --- a/media/base/fake_media_engine.cc +++ b/media/base/fake_media_engine.cc @@ -575,7 +575,8 @@ FakeVideoEngine::FakeVideoEngine() : capture_(false), fail_create_channel_(false) { // Add a fake video codec. Note that the name must not be "" as there are // sanity checks against that. - codecs_.push_back(VideoCodec(0, "fake_video_codec")); + send_codecs_.push_back(VideoCodec(0, "fake_video_codec")); + recv_codecs_.push_back(VideoCodec(0, "fake_video_codec")); } bool FakeVideoEngine::SetOptions(const VideoOptions& options) { options_ = options; @@ -603,12 +604,22 @@ void FakeVideoEngine::UnregisterChannel(VideoMediaChannel* channel) { RTC_DCHECK(it != channels_.end()); channels_.erase(it); } -std::vector<VideoCodec> FakeVideoEngine::codecs() const { - return codecs_; +std::vector<VideoCodec> FakeVideoEngine::send_codecs() const { + return send_codecs_; +} + +std::vector<VideoCodec> FakeVideoEngine::recv_codecs() const { + return recv_codecs_; +} + +void FakeVideoEngine::SetSendCodecs(const std::vector<VideoCodec>& codecs) { + send_codecs_ = codecs; } -void FakeVideoEngine::SetCodecs(const std::vector<VideoCodec> codecs) { - codecs_ = codecs; + +void FakeVideoEngine::SetRecvCodecs(const std::vector<VideoCodec>& codecs) { + recv_codecs_ = codecs; } + bool FakeVideoEngine::SetCapture(bool capture) { capture_ = capture; return true; @@ -640,7 +651,8 @@ void FakeMediaEngine::SetAudioSendCodecs( voice_->SetSendCodecs(codecs); } void FakeMediaEngine::SetVideoCodecs(const std::vector<VideoCodec>& codecs) { - video_->SetCodecs(codecs); + video_->SetSendCodecs(codecs); + video_->SetRecvCodecs(codecs); } FakeVoiceMediaChannel* FakeMediaEngine::GetVoiceChannel(size_t index) { diff --git a/media/base/fake_media_engine.h b/media/base/fake_media_engine.h index 10dd546b3e..338c329aa1 100644 --- a/media/base/fake_media_engine.h +++ b/media/base/fake_media_engine.h @@ -563,8 +563,10 @@ class FakeVideoEngine : public VideoEngineInterface { override; FakeVideoMediaChannel* GetChannel(size_t index); void UnregisterChannel(VideoMediaChannel* channel); - std::vector<VideoCodec> codecs() const override; - void SetCodecs(const std::vector<VideoCodec> codecs); + std::vector<VideoCodec> send_codecs() const override; + std::vector<VideoCodec> recv_codecs() const override; + void SetSendCodecs(const std::vector<VideoCodec>& codecs); + void SetRecvCodecs(const std::vector<VideoCodec>& codecs); bool SetCapture(bool capture); std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions() const override; @@ -573,7 +575,8 @@ class FakeVideoEngine : public VideoEngineInterface { private: std::vector<FakeVideoMediaChannel*> channels_; - std::vector<VideoCodec> codecs_; + std::vector<VideoCodec> send_codecs_; + std::vector<VideoCodec> recv_codecs_; bool capture_; VideoOptions options_; bool fail_create_channel_; diff --git a/media/base/media_channel.h b/media/base/media_channel.h index 7ca6002404..c2c1b56aab 100644 --- a/media/base/media_channel.h +++ b/media/base/media_channel.h @@ -749,6 +749,10 @@ struct RtpParameters { std::vector<Codec> codecs; std::vector<webrtc::RtpExtension> extensions; + // For a send stream this is true if we've neogtiated a send direction, + // for a receive stream this is true if we've negotiated a receive direction. + bool is_stream_active = true; + // TODO(pthatcher): Add streams. RtcpParameters rtcp; diff --git a/media/base/media_engine.h b/media/base/media_engine.h index 713afcc24e..be0ae59a04 100644 --- a/media/base/media_engine.h +++ b/media/base/media_engine.h @@ -108,7 +108,8 @@ class VideoEngineInterface : public RtpHeaderExtensionQueryInterface { webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory) = 0; - virtual std::vector<VideoCodec> codecs() const = 0; + virtual std::vector<VideoCodec> send_codecs() const = 0; + virtual std::vector<VideoCodec> recv_codecs() const = 0; }; // MediaEngineInterface is an abstraction of a media engine which can be diff --git a/media/engine/fake_webrtc_video_engine.cc b/media/engine/fake_webrtc_video_engine.cc index 0ee2bcc54f..91f7e53956 100644 --- a/media/engine/fake_webrtc_video_engine.cc +++ b/media/engine/fake_webrtc_video_engine.cc @@ -113,8 +113,11 @@ void FakeWebRtcVideoDecoderFactory::DecoderDestroyed( } void FakeWebRtcVideoDecoderFactory::AddSupportedVideoCodecType( - const webrtc::SdpVideoFormat& format) { - supported_codec_formats_.push_back(format); + const std::string& name) { + // This is to match the default H264 params of cricket::VideoCodec. + cricket::VideoCodec video_codec(name); + supported_codec_formats_.push_back( + webrtc::SdpVideoFormat(video_codec.name, video_codec.params)); } int FakeWebRtcVideoDecoderFactory::GetNumCreatedDecoders() { diff --git a/media/engine/fake_webrtc_video_engine.h b/media/engine/fake_webrtc_video_engine.h index 7b32ac86cf..28dc4fe99b 100644 --- a/media/engine/fake_webrtc_video_engine.h +++ b/media/engine/fake_webrtc_video_engine.h @@ -67,7 +67,7 @@ class FakeWebRtcVideoDecoderFactory : public webrtc::VideoDecoderFactory { const webrtc::SdpVideoFormat& format) override; void DecoderDestroyed(FakeWebRtcVideoDecoder* decoder); - void AddSupportedVideoCodecType(const webrtc::SdpVideoFormat& format); + void AddSupportedVideoCodecType(const std::string& name); int GetNumCreatedDecoders(); const std::vector<FakeWebRtcVideoDecoder*>& decoders(); diff --git a/media/engine/null_webrtc_video_engine.h b/media/engine/null_webrtc_video_engine.h index fc556f6084..a914af954b 100644 --- a/media/engine/null_webrtc_video_engine.h +++ b/media/engine/null_webrtc_video_engine.h @@ -30,7 +30,11 @@ class VideoMediaChannel; // CompositeMediaEngine. class NullWebRtcVideoEngine : public VideoEngineInterface { public: - std::vector<VideoCodec> codecs() const override { + std::vector<VideoCodec> send_codecs() const override { + return std::vector<VideoCodec>(); + } + + std::vector<VideoCodec> recv_codecs() const override { return std::vector<VideoCodec>(); } diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index 9a8ee88bb2..5ecd221dd2 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -140,11 +140,25 @@ std::vector<VideoCodec> AssignPayloadTypesAndDefaultCodecs( return output_codecs; } -std::vector<VideoCodec> AssignPayloadTypesAndDefaultCodecs( - const webrtc::VideoEncoderFactory* encoder_factory) { - return encoder_factory ? AssignPayloadTypesAndDefaultCodecs( - encoder_factory->GetSupportedFormats()) - : std::vector<VideoCodec>(); +// is_decoder_factory is needed to keep track of the implict assumption that any +// H264 decoder also supports constrained base line profile. +// TODO(kron): Perhaps it better to move the implcit knowledge to the place +// where codecs are negotiated. +template <class T> +std::vector<VideoCodec> GetPayloadTypesAndDefaultCodecs( + const T* factory, + bool is_decoder_factory) { + if (!factory) { + return {}; + } + + std::vector<webrtc::SdpVideoFormat> supported_formats = + factory->GetSupportedFormats(); + if (is_decoder_factory) { + AddH264ConstrainedBaselineProfileToSupportedFormats(&supported_formats); + } + + return AssignPayloadTypesAndDefaultCodecs(std::move(supported_formats)); } bool IsTemporalLayersSupported(const std::string& codec_name) { @@ -553,8 +567,14 @@ VideoMediaChannel* WebRtcVideoEngine::CreateMediaChannel( encoder_factory_.get(), decoder_factory_.get(), video_bitrate_allocator_factory); } -std::vector<VideoCodec> WebRtcVideoEngine::codecs() const { - return AssignPayloadTypesAndDefaultCodecs(encoder_factory_.get()); +std::vector<VideoCodec> WebRtcVideoEngine::send_codecs() const { + return GetPayloadTypesAndDefaultCodecs(encoder_factory_.get(), + /*is_decoder_factory=*/false); +} + +std::vector<VideoCodec> WebRtcVideoEngine::recv_codecs() const { + return GetPayloadTypesAndDefaultCodecs(decoder_factory_.get(), + /*is_decoder_factory=*/true); } std::vector<webrtc::RtpHeaderExtensionCapability> @@ -612,9 +632,10 @@ WebRtcVideoChannel::WebRtcVideoChannel( rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; sending_ = false; - recv_codecs_ = - MapCodecs(AssignPayloadTypesAndDefaultCodecs(encoder_factory_)); - recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type; + recv_codecs_ = MapCodecs(GetPayloadTypesAndDefaultCodecs( + decoder_factory_, /*is_decoder_factory=*/true)); + recv_flexfec_payload_type_ = + recv_codecs_.empty() ? 0 : recv_codecs_.front().flexfec_payload_type; } WebRtcVideoChannel::~WebRtcVideoChannel() { @@ -628,7 +649,8 @@ std::vector<WebRtcVideoChannel::VideoCodecSettings> WebRtcVideoChannel::SelectSendVideoCodecs( const std::vector<VideoCodecSettings>& remote_mapped_codecs) const { std::vector<webrtc::SdpVideoFormat> sdp_formats = - encoder_factory_->GetImplementations(); + encoder_factory_ ? encoder_factory_->GetImplementations() + : std::vector<webrtc::SdpVideoFormat>(); // The returned vector holds the VideoCodecSettings in term of preference. // They are orderd by receive codec preference first and local implementation @@ -698,7 +720,8 @@ bool WebRtcVideoChannel::GetChangedSendParameters( std::vector<VideoCodecSettings> negotiated_codecs = SelectSendVideoCodecs(MapCodecs(params.codecs)); - if (negotiated_codecs.empty()) { + // We should only fail here if send direction is enabled. + if (params.is_stream_active && negotiated_codecs.empty()) { RTC_LOG(LS_ERROR) << "No video codecs supported."; return false; } @@ -711,7 +734,9 @@ bool WebRtcVideoChannel::GetChangedSendParameters( } if (negotiated_codecs_ != negotiated_codecs) { - if (send_codec_ != negotiated_codecs.front()) { + if (negotiated_codecs.empty()) { + changed_params->send_codec = absl::nullopt; + } else if (send_codec_ != negotiated_codecs.front()) { changed_params->send_codec = negotiated_codecs.front(); } changed_params->negotiated_codecs = std::move(negotiated_codecs); @@ -878,8 +903,6 @@ bool WebRtcVideoChannel::ApplyChangedParams( if (changed_params.send_codec) send_codec_ = changed_params.send_codec; - RTC_DCHECK(send_codec_); - if (changed_params.extmap_allow_mixed) { SetExtmapAllowMixed(*changed_params.extmap_allow_mixed); } @@ -1073,14 +1096,17 @@ bool WebRtcVideoChannel::GetChangedRecvParameters( } // Verify that every mapped codec is supported locally. - const std::vector<VideoCodec> local_supported_codecs = - AssignPayloadTypesAndDefaultCodecs(encoder_factory_); - for (const VideoCodecSettings& mapped_codec : mapped_codecs) { - if (!FindMatchingCodec(local_supported_codecs, mapped_codec.codec)) { - RTC_LOG(LS_ERROR) - << "SetRecvParameters called with unsupported video codec: " - << mapped_codec.codec.ToString(); - return false; + if (params.is_stream_active) { + const std::vector<VideoCodec> local_supported_codecs = + GetPayloadTypesAndDefaultCodecs(decoder_factory_, + /*is_decoder_factory=*/true); + for (const VideoCodecSettings& mapped_codec : mapped_codecs) { + if (!FindMatchingCodec(local_supported_codecs, mapped_codec.codec)) { + RTC_LOG(LS_ERROR) + << "SetRecvParameters called with unsupported video codec: " + << mapped_codec.codec.ToString(); + return false; + } } } @@ -3041,7 +3067,9 @@ bool WebRtcVideoChannel::VideoCodecSettings::operator!=( std::vector<WebRtcVideoChannel::VideoCodecSettings> WebRtcVideoChannel::MapCodecs(const std::vector<VideoCodec>& codecs) { - RTC_DCHECK(!codecs.empty()); + if (codecs.empty()) { + return {}; + } std::vector<VideoCodecSettings> video_codecs; std::map<int, VideoCodec::CodecType> payload_codec_type; diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h index 4eade6f670..323eaa96ff 100644 --- a/media/engine/webrtc_video_engine.h +++ b/media/engine/webrtc_video_engine.h @@ -110,7 +110,8 @@ class WebRtcVideoEngine : public VideoEngineInterface { webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory) override; - std::vector<VideoCodec> codecs() const override; + std::vector<VideoCodec> send_codecs() const override; + std::vector<VideoCodec> recv_codecs() const override; std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions() const override; diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc index bc2f5f28bb..395d38ac1a 100644 --- a/media/engine/webrtc_video_engine_unittest.cc +++ b/media/engine/webrtc_video_engine_unittest.cc @@ -271,7 +271,7 @@ class WebRtcVideoEngineTest : public ::testing::Test { // Find the codec in the engine with the given name. The codec must be // present. cricket::VideoCodec GetEngineCodec(const std::string& name) const; - + void AddSupportedVideoCodecType(const std::string& name); VideoMediaChannel* SetSendParamsWithAllSupportedCodecs(); VideoMediaChannel* SetRecvParamsWithSupportedCodecs( @@ -302,7 +302,7 @@ TEST_F(WebRtcVideoEngineTest, DefaultRtxCodecHasAssociatedPayloadTypeSet) { encoder_factory_->AddSupportedVideoCodecType("VP8"); AssignDefaultCodec(); - std::vector<VideoCodec> engine_codecs = engine_.codecs(); + std::vector<VideoCodec> engine_codecs = engine_.send_codecs(); for (size_t i = 0; i < engine_codecs.size(); ++i) { if (engine_codecs[i].name != kRtxCodecName) continue; @@ -372,7 +372,7 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) { // dtor is called. ::testing::NiceMock<MockVideoSource> video_source; - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -409,7 +409,7 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { // dtor is called. ::testing::NiceMock<MockVideoSource> video_source; - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -432,8 +432,8 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { ::testing::NiceMock<MockVideoSource> video_source; - encoder_factory_->AddSupportedVideoCodecType("VP8"); - encoder_factory_->AddSupportedVideoCodecType("VP9"); + AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP9"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -474,7 +474,7 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { } TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel( call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), @@ -489,7 +489,7 @@ TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { } TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel( call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), @@ -500,7 +500,7 @@ TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) { } TEST_F(WebRtcVideoEngineTest, UseFactoryForVp8WhenSupported) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -560,7 +560,7 @@ TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForH264Codec) { encoder_factory_->AddSupportedVideoCodec(h264_high); // First figure out what payload types the test codecs got assigned. - const std::vector<cricket::VideoCodec> codecs = engine_.codecs(); + const std::vector<cricket::VideoCodec> codecs = engine_.send_codecs(); // Now search for RTX codecs for them. Expect that they all have associated // RTX codecs. EXPECT_TRUE(HasRtxCodec( @@ -577,7 +577,7 @@ TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForH264Codec) { #if defined(RTC_ENABLE_VP9) TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { - encoder_factory_->AddSupportedVideoCodecType("VP9"); + AddSupportedVideoCodecType("VP9"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -588,7 +588,7 @@ TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { #endif // defined(RTC_ENABLE_VP9) TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); FakeCall* fake_call = new FakeCall(); call_.reset(fake_call); std::unique_ptr<VideoMediaChannel> channel( @@ -642,7 +642,7 @@ TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) { } void WebRtcVideoEngineTest::AssignDefaultAptRtxTypes() { - std::vector<VideoCodec> engine_codecs = engine_.codecs(); + std::vector<VideoCodec> engine_codecs = engine_.send_codecs(); RTC_DCHECK(!engine_codecs.empty()); for (const cricket::VideoCodec& codec : engine_codecs) { if (codec.name == "rtx") { @@ -656,7 +656,7 @@ void WebRtcVideoEngineTest::AssignDefaultAptRtxTypes() { } void WebRtcVideoEngineTest::AssignDefaultCodec() { - std::vector<VideoCodec> engine_codecs = engine_.codecs(); + std::vector<VideoCodec> engine_codecs = engine_.send_codecs(); RTC_DCHECK(!engine_codecs.empty()); bool codec_set = false; for (const cricket::VideoCodec& codec : engine_codecs) { @@ -672,7 +672,7 @@ void WebRtcVideoEngineTest::AssignDefaultCodec() { size_t WebRtcVideoEngineTest::GetEngineCodecIndex( const std::string& name) const { - const std::vector<cricket::VideoCodec> codecs = engine_.codecs(); + const std::vector<cricket::VideoCodec> codecs = engine_.send_codecs(); for (size_t i = 0; i < codecs.size(); ++i) { const cricket::VideoCodec engine_codec = codecs[i]; if (!absl::EqualsIgnoreCase(name, engine_codec.name)) @@ -696,7 +696,13 @@ size_t WebRtcVideoEngineTest::GetEngineCodecIndex( cricket::VideoCodec WebRtcVideoEngineTest::GetEngineCodec( const std::string& name) const { - return engine_.codecs()[GetEngineCodecIndex(name)]; + return engine_.send_codecs()[GetEngineCodecIndex(name)]; +} + +void WebRtcVideoEngineTest::AddSupportedVideoCodecType( + const std::string& name) { + encoder_factory_->AddSupportedVideoCodecType(name); + decoder_factory_->AddSupportedVideoCodecType(name); } VideoMediaChannel* @@ -743,7 +749,7 @@ void WebRtcVideoEngineTest::ExpectRtpCapabilitySupport(const char* uri, } TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP8"); std::unique_ptr<VideoMediaChannel> channel( SetSendParamsWithAllSupportedCodecs()); @@ -780,8 +786,8 @@ TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { } TEST_F(WebRtcVideoEngineTest, ChannelWithH264CanChangeToVp8) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); - encoder_factory_->AddSupportedVideoCodecType("H264"); + AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("H264"); // Frame source. webrtc::test::FrameForwarder frame_forwarder; @@ -815,8 +821,8 @@ TEST_F(WebRtcVideoEngineTest, ChannelWithH264CanChangeToVp8) { TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); - encoder_factory_->AddSupportedVideoCodecType("H264"); + AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("H264"); std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel( call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), @@ -851,8 +857,8 @@ TEST_F(WebRtcVideoEngineTest, TEST_F(WebRtcVideoEngineTest, DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); - encoder_factory_->AddSupportedVideoCodecType("H264"); + AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("H264"); std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel( call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), @@ -885,7 +891,7 @@ TEST_F(WebRtcVideoEngineTest, SimulcastEnabledForH264BehindFieldTrial) { RTC_DCHECK(!override_field_trials_); override_field_trials_ = std::make_unique<webrtc::test::ScopedFieldTrials>( "WebRTC-H264Simulcast/Enabled/"); - encoder_factory_->AddSupportedVideoCodecType("H264"); + AddSupportedVideoCodecType("H264"); std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel( call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), @@ -925,13 +931,13 @@ TEST_F(WebRtcVideoEngineTest, auto flexfec = Field("name", &VideoCodec::name, "flexfec-03"); // FlexFEC is not active without field trial. - EXPECT_THAT(engine_.codecs(), Not(Contains(flexfec))); + EXPECT_THAT(engine_.send_codecs(), Not(Contains(flexfec))); // FlexFEC is active with field trial. RTC_DCHECK(!override_field_trials_); override_field_trials_ = std::make_unique<webrtc::test::ScopedFieldTrials>( "WebRTC-FlexFEC-03-Advertised/Enabled/"); - EXPECT_THAT(engine_.codecs(), Contains(flexfec)); + EXPECT_THAT(engine_.send_codecs(), Contains(flexfec)); } // Test that codecs are added in the order they are reported from the factory. @@ -955,11 +961,11 @@ TEST_F(WebRtcVideoEngineTest, ReportSupportedAddedCodec) { // Set up external encoder factory with first codec, and initialize engine. encoder_factory_->AddSupportedVideoCodecType(kFakeExternalCodecName1); - std::vector<cricket::VideoCodec> codecs_before(engine_.codecs()); + std::vector<cricket::VideoCodec> codecs_before(engine_.send_codecs()); // Add second codec. encoder_factory_->AddSupportedVideoCodecType(kFakeExternalCodecName2); - std::vector<cricket::VideoCodec> codecs_after(engine_.codecs()); + std::vector<cricket::VideoCodec> codecs_after(engine_.send_codecs()); // The codec itself and RTX should have been added. EXPECT_EQ(codecs_before.size() + 2, codecs_after.size()); @@ -975,12 +981,11 @@ TEST_F(WebRtcVideoEngineTest, ReportRtxForExternalCodec) { encoder_factory_->AddSupportedVideoCodecType(kFakeCodecName); const size_t fake_codec_index = GetEngineCodecIndex(kFakeCodecName); - EXPECT_EQ("rtx", engine_.codecs().at(fake_codec_index + 1).name); + EXPECT_EQ("rtx", engine_.send_codecs().at(fake_codec_index + 1).name); } TEST_F(WebRtcVideoEngineTest, RegisterDecodersIfSupported) { - encoder_factory_->AddSupportedVideoCodecType("VP8"); - decoder_factory_->AddSupportedVideoCodecType(webrtc::SdpVideoFormat("VP8")); + AddSupportedVideoCodecType("VP8"); cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); @@ -1006,10 +1011,7 @@ TEST_F(WebRtcVideoEngineTest, RegisterH264DecoderIfSupported) { // can't even query the WebRtcVideoDecoderFactory for supported codecs. // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported // codecs. - encoder_factory_->AddSupportedVideoCodecType("H264"); - webrtc::SdpVideoFormat supported_h264("H264"); - supported_h264.parameters[kH264FmtpPacketizationMode] = "1"; - decoder_factory_->AddSupportedVideoCodecType(supported_h264); + AddSupportedVideoCodecType("H264"); std::vector<cricket::VideoCodec> codecs; codecs.push_back(GetEngineCodec("H264")); @@ -1025,8 +1027,7 @@ TEST_F(WebRtcVideoEngineTest, RegisterH264DecoderIfSupported) { // empty list of RtpSource without crashing. TEST_F(WebRtcVideoEngineTest, GetSourcesWithNonExistingSsrc) { // Setup an recv stream with |kSsrc|. - encoder_factory_->AddSupportedVideoCodecType("VP8"); - decoder_factory_->AddSupportedVideoCodecType(webrtc::SdpVideoFormat("VP8")); + AddSupportedVideoCodecType("VP8"); cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); std::unique_ptr<VideoMediaChannel> channel( @@ -1045,7 +1046,8 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, NullFactories) { std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory; WebRtcVideoEngine engine(std::move(encoder_factory), std::move(decoder_factory)); - EXPECT_EQ(0u, engine.codecs().size()); + EXPECT_EQ(0u, engine.send_codecs().size()); + EXPECT_EQ(0u, engine.recv_codecs().size()); } TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, EmptyFactories) { @@ -1057,8 +1059,11 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, EmptyFactories) { WebRtcVideoEngine engine( (std::unique_ptr<webrtc::VideoEncoderFactory>(encoder_factory)), (std::unique_ptr<webrtc::VideoDecoderFactory>(decoder_factory))); - EXPECT_CALL(*encoder_factory, GetSupportedFormats()); - EXPECT_EQ(0u, engine.codecs().size()); + // TODO(kron): Change to Times(1) once send and receive codecs are changed + // to be treated independently. + EXPECT_CALL(*encoder_factory, GetSupportedFormats()).Times(1); + EXPECT_EQ(0u, engine.send_codecs().size()); + EXPECT_EQ(0u, engine.recv_codecs().size()); EXPECT_CALL(*encoder_factory, Die()); EXPECT_CALL(*decoder_factory, Die()); } @@ -1087,9 +1092,11 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) { const std::vector<webrtc::SdpVideoFormat> supported_formats = {vp8_format}; EXPECT_CALL(*encoder_factory, GetSupportedFormats()) .WillRepeatedly(Return(supported_formats)); + EXPECT_CALL(*decoder_factory, GetSupportedFormats()) + .WillRepeatedly(Return(supported_formats)); // Verify the codecs from the engine. - const std::vector<VideoCodec> engine_codecs = engine.codecs(); + const std::vector<VideoCodec> engine_codecs = engine.send_codecs(); // Verify default codecs has been added correctly. EXPECT_EQ(5u, engine_codecs.size()); EXPECT_EQ("VP8", engine_codecs.at(0).name); @@ -1222,12 +1229,14 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, NullDecoder) { const auto call = absl::WrapUnique(webrtc::Call::Create(call_config)); // Create recv channel. + EXPECT_CALL(*decoder_factory, GetSupportedFormats()) + .WillRepeatedly(::testing::Return(supported_formats)); const int recv_ssrc = 321; std::unique_ptr<VideoMediaChannel> recv_channel(engine.CreateMediaChannel( call.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), rate_allocator_factory.get())); cricket::VideoRecvParameters recv_parameters; - recv_parameters.codecs.push_back(engine.codecs().front()); + recv_parameters.codecs.push_back(engine.recv_codecs().front()); EXPECT_TRUE(recv_channel->SetRecvParameters(recv_parameters)); EXPECT_TRUE(recv_channel->AddRecvStream( cricket::StreamParams::CreateLegacy(recv_ssrc))); @@ -1315,9 +1324,9 @@ class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test { webrtc::CreateBuiltinVideoBitrateAllocatorFactory()), engine_( webrtc::CreateBuiltinVideoEncoderFactory(), - std::make_unique<webrtc::test::FunctionVideoDecoderFactory>([]() { - return std::make_unique<webrtc::test::FakeDecoder>(); - })), + std::make_unique<webrtc::test::FunctionVideoDecoderFactory>( + []() { return std::make_unique<webrtc::test::FakeDecoder>(); }, + kSdpVideoFormats)), channel_(absl::WrapUnique(static_cast<cricket::WebRtcVideoChannel*>( engine_.CreateMediaChannel( call_.get(), @@ -1328,7 +1337,7 @@ class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test { network_interface_.SetDestination(channel_.get()); channel_->SetInterface(&network_interface_, webrtc::MediaTransportConfig()); cricket::VideoRecvParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.recv_codecs(); channel_->SetRecvParameters(parameters); } @@ -1352,6 +1361,7 @@ class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test { EXPECT_EQ(0, renderer_.errors()); } + static const std::vector<webrtc::SdpVideoFormat> kSdpVideoFormats; webrtc::FieldTrialBasedConfig field_trials_; webrtc::RtcEventLogNull event_log_; std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_; @@ -1364,6 +1374,10 @@ class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test { cricket::FakeVideoRenderer renderer_; }; +const std::vector<webrtc::SdpVideoFormat> + WebRtcVideoChannelEncodedFrameCallbackTest::kSdpVideoFormats = { + webrtc::SdpVideoFormat("VP8")}; + TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, SetEncodedFrameBufferFunction_DefaultStream) { testing::MockFunction<void(const webrtc::RecordableEncodedFrame&)> callback; @@ -1469,7 +1483,7 @@ class WebRtcVideoChannelBaseTest : public ::testing::Test { network_interface_.SetDestination(channel_.get()); channel_->SetInterface(&network_interface_, webrtc::MediaTransportConfig()); cricket::VideoRecvParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); channel_->SetRecvParameters(parameters); EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams())); frame_forwarder_ = std::make_unique<webrtc::test::FrameForwarder>(); @@ -1617,7 +1631,7 @@ class WebRtcVideoChannelBaseTest : public ::testing::Test { } cricket::VideoCodec GetEngineCodec(const std::string& name) { - for (const cricket::VideoCodec& engine_codec : engine_.codecs()) { + for (const cricket::VideoCodec& engine_codec : engine_.send_codecs()) { if (absl::EqualsIgnoreCase(name, engine_codec.name)) return engine_codec; } @@ -2394,10 +2408,10 @@ class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { frame_source_(1280, 720, rtc::kNumMicrosecsPerSec / 30), last_ssrc_(0) {} void SetUp() override { - encoder_factory_->AddSupportedVideoCodecType("VP8"); - encoder_factory_->AddSupportedVideoCodecType("VP9"); + AddSupportedVideoCodecType("VP8"); + AddSupportedVideoCodecType("VP9"); #if defined(WEBRTC_USE_H264) - encoder_factory_->AddSupportedVideoCodecType("H264"); + AddSupportedVideoCodecType("H264"); #endif fake_call_.reset(new FakeCall()); @@ -2406,8 +2420,8 @@ class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get())); channel_->OnReadyToSend(true); last_ssrc_ = 123; - send_parameters_.codecs = engine_.codecs(); - recv_parameters_.codecs = engine_.codecs(); + send_parameters_.codecs = engine_.send_codecs(); + recv_parameters_.codecs = engine_.recv_codecs(); ASSERT_TRUE(channel_->SetSendParameters(send_parameters_)); } @@ -2579,7 +2593,7 @@ class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { VerifyCodecHasDefaultFeedbackParams(default_codec_, expect_lntf_enabled); cricket::VideoSendParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->SetSend(true)); @@ -2724,7 +2738,7 @@ TEST_F(WebRtcVideoChannelTest, SetsSyncGroupFromSyncLabel) { TEST_F(WebRtcVideoChannelTest, RecvStreamWithSimAndRtx) { cricket::VideoSendParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->SetSend(true)); parameters.conference_mode = true; @@ -3037,7 +3051,7 @@ TEST_F(WebRtcVideoChannelTest, TransportCcCanBeEnabledAndDisabled) { // Verify that transport cc feedback is turned on when setting default codecs // since the default codecs have transport cc feedback enabled. - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_TRUE(stream->GetConfig().rtp.transport_cc); @@ -3066,7 +3080,7 @@ TEST_F(WebRtcVideoChannelTest, LossNotificationCanBeEnabledAndDisabled) { { cricket::VideoSendParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->SetSend(true)); } @@ -3090,7 +3104,7 @@ TEST_F(WebRtcVideoChannelTest, LossNotificationCanBeEnabledAndDisabled) { EXPECT_FALSE(send_stream->GetConfig().rtp.lntf.enabled); // Setting the default codecs again, including VP8, turns LNTF back on. - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); recv_stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_TRUE(recv_stream->GetConfig().rtp.lntf.enabled); @@ -3103,7 +3117,7 @@ TEST_F(WebRtcVideoChannelTest, NackIsEnabledByDefault) { VerifyCodecHasDefaultFeedbackParams(default_codec_, false); cricket::VideoSendParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); EXPECT_TRUE(channel_->SetSend(true)); @@ -3141,7 +3155,7 @@ TEST_F(WebRtcVideoChannelTest, NackCanBeEnabledAndDisabled) { // Verify that NACK is turned on when setting default codecs since the // default codecs have NACK enabled. - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.send_codecs(); EXPECT_TRUE(channel_->SetSendParameters(parameters)); recv_stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0); @@ -3879,7 +3893,7 @@ TEST_F(WebRtcVideoChannelTest, SetDefaultSendCodecs) { VideoCodec codec; EXPECT_TRUE(channel_->GetSendCodec(&codec)); - EXPECT_TRUE(codec.Matches(engine_.codecs()[0])); + EXPECT_TRUE(codec.Matches(engine_.send_codecs()[0])); // Using a RTX setup to verify that the default RTX payload type is good. const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); @@ -4227,7 +4241,7 @@ TEST_F(WebRtcVideoChannelFlexfecRecvTest, TEST_F(WebRtcVideoChannelTest, SetSendCodecRejectsRtxWithoutAssociatedPayloadType) { const int kUnusedPayloadType = 127; - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType)); + EXPECT_FALSE(FindCodecById(engine_.send_codecs(), kUnusedPayloadType)); cricket::VideoSendParameters parameters; cricket::VideoCodec rtx_codec(kUnusedPayloadType, "rtx"); @@ -4240,8 +4254,8 @@ TEST_F(WebRtcVideoChannelTest, SetSendCodecRejectsRtxWithoutMatchingVideoCodec) { const int kUnusedPayloadType1 = 126; const int kUnusedPayloadType2 = 127; - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1)); - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2)); + EXPECT_FALSE(FindCodecById(engine_.send_codecs(), kUnusedPayloadType1)); + EXPECT_FALSE(FindCodecById(engine_.send_codecs(), kUnusedPayloadType2)); { cricket::VideoCodec rtx_codec = cricket::VideoCodec::CreateRtxCodec( kUnusedPayloadType1, GetEngineCodec("VP8").id); @@ -4264,8 +4278,8 @@ TEST_F(WebRtcVideoChannelTest, TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithChangedRtxPayloadType) { const int kUnusedPayloadType1 = 126; const int kUnusedPayloadType2 = 127; - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1)); - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2)); + EXPECT_FALSE(FindCodecById(engine_.send_codecs(), kUnusedPayloadType1)); + EXPECT_FALSE(FindCodecById(engine_.send_codecs(), kUnusedPayloadType2)); // SSRCs for RTX. cricket::StreamParams params = @@ -4666,8 +4680,8 @@ TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithOnlyVp8) { TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithRtx) { const int kUnusedPayloadType1 = 126; const int kUnusedPayloadType2 = 127; - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1)); - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType1)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType2)); cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); @@ -4765,8 +4779,8 @@ TEST_F(WebRtcVideoChannelTest, DuplicateRedCodecIsDropped) { TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithChangedRtxPayloadType) { const int kUnusedPayloadType1 = 126; const int kUnusedPayloadType2 = 127; - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1)); - EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType1)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType2)); // SSRCs for RTX. cricket::StreamParams params = @@ -4814,13 +4828,14 @@ TEST_F(WebRtcVideoChannelTest, SetRecvCodecsDifferentPayloadType) { TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptDefaultCodecs) { cricket::VideoRecvParameters parameters; - parameters.codecs = engine_.codecs(); + parameters.codecs = engine_.recv_codecs(); EXPECT_TRUE(channel_->SetRecvParameters(parameters)); FakeVideoReceiveStream* stream = AddRecvStream(); const webrtc::VideoReceiveStream::Config& config = stream->GetConfig(); - EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].video_format.name); - EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type); + EXPECT_EQ(engine_.recv_codecs()[0].name, + config.decoders[0].video_format.name); + EXPECT_EQ(engine_.recv_codecs()[0].id, config.decoders[0].payload_type); } TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectUnsupportedCodec) { @@ -5884,7 +5899,7 @@ void WebRtcVideoChannelTest::TestReceiveUnsignaledSsrcPacket( uint8_t payload_type, bool expect_created_receive_stream) { // kRedRtxPayloadType must currently be unused. - EXPECT_FALSE(FindCodecById(engine_.codecs(), kRedRtxPayloadType)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kRedRtxPayloadType)); // Add a RED RTX codec. VideoCodec red_rtx_codec = @@ -7718,6 +7733,7 @@ class WebRtcVideoChannelSimulcastTest : public ::testing::Test { void SetUp() override { encoder_factory_->AddSupportedVideoCodecType("VP8"); + decoder_factory_->AddSupportedVideoCodecType("VP8"); channel_.reset(engine_.CreateMediaChannel( &fake_call_, GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(), mock_rate_allocator_factory_.get())); |