diff --git a/call/bitrate_estimator_tests.cc b/call/bitrate_estimator_tests.cc index 1dcac63569..af0e4c9f22 100644 --- a/call/bitrate_estimator_tests.cc +++ b/call/bitrate_estimator_tests.cc @@ -187,7 +187,8 @@ class BitrateEstimatorTest : public test::CallTest { VideoReceiveStream::Decoder decoder; decoder.decoder = &fake_decoder_; decoder.payload_type = test_->GetVideoSendConfig()->rtp.payload_type; - decoder.payload_name = test_->GetVideoSendConfig()->rtp.payload_name; + decoder.video_format = + SdpVideoFormat(test_->GetVideoSendConfig()->rtp.payload_name); test_->receive_config_.decoders.clear(); test_->receive_config_.decoders.push_back(decoder); test_->receive_config_.rtp.remote_ssrc = diff --git a/call/call.cc b/call/call.cc index be5bb1d6c4..6e9a57805e 100644 --- a/call/call.cc +++ b/call/call.cc @@ -114,7 +114,7 @@ std::unique_ptr CreateRtcLogStreamConfig( for (const auto& d : config.decoders) { const int* search = FindKeyByValue(config.rtp.rtx_associated_payload_types, d.payload_type); - rtclog_config->codecs.emplace_back(d.payload_name, d.payload_type, + rtclog_config->codecs.emplace_back(d.video_format.name, d.payload_type, search ? *search : 0); } return rtclog_config; diff --git a/call/rampup_tests.cc b/call/rampup_tests.cc index 17b729629a..8eb451ac04 100644 --- a/call/rampup_tests.cc +++ b/call/rampup_tests.cc @@ -208,7 +208,8 @@ void RampUpTester::ModifyVideoConfigs( recv_config.rtp.extensions = send_config->rtp.extensions; recv_config.decoders.reserve(1); recv_config.decoders[0].payload_type = send_config->rtp.payload_type; - recv_config.decoders[0].payload_name = send_config->rtp.payload_name; + recv_config.decoders[0].video_format = + SdpVideoFormat(send_config->rtp.payload_name); recv_config.rtp.remote_ssrc = video_ssrcs_[i]; recv_config.rtp.nack.rtp_history_ms = send_config->rtp.nack.rtp_history_ms; diff --git a/call/video_receive_stream.cc b/call/video_receive_stream.cc index 7662afff72..c4cdd49277 100644 --- a/call/video_receive_stream.cc +++ b/call/video_receive_stream.cc @@ -13,7 +13,7 @@ namespace webrtc { -VideoReceiveStream::Decoder::Decoder() = default; +VideoReceiveStream::Decoder::Decoder() : video_format("Unset") {} VideoReceiveStream::Decoder::Decoder(const Decoder&) = default; VideoReceiveStream::Decoder::~Decoder() = default; @@ -22,9 +22,9 @@ std::string VideoReceiveStream::Decoder::ToString() const { rtc::SimpleStringBuilder ss(buf); ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr"); ss << ", payload_type: " << payload_type; - ss << ", payload_name: " << payload_name; + ss << ", name: " << video_format.name; ss << ", codec_params: {"; - for (const auto& it : codec_params) + for (const auto& it : video_format.parameters) ss << it.first << ": " << it.second; ss << '}'; ss << '}'; diff --git a/call/video_receive_stream.h b/call/video_receive_stream.h index 5009ddb43f..395a3d2673 100644 --- a/call/video_receive_stream.h +++ b/call/video_receive_stream.h @@ -22,6 +22,7 @@ #include "api/video/video_content_type.h" #include "api/video/video_sink_interface.h" #include "api/video/video_timing.h" +#include "api/video_codecs/sdp_video_format.h" #include "call/rtp_config.h" #include "common_types.h" // NOLINT(build/include) #include "common_video/include/frame_callback.h" @@ -45,19 +46,11 @@ class VideoReceiveStream { // The actual decoder instance. VideoDecoder* decoder = nullptr; + SdpVideoFormat video_format; // Received RTP packets with this payload type will be sent to this decoder // instance. int payload_type = 0; - - // Name of the decoded payload (such as VP8). Maps back to the depacketizer - // used to unpack incoming packets. - std::string payload_name; - - // This map contains the codec specific parameters from SDP, i.e. the "fmtp" - // parameters. It is the same as cricket::CodecParameterMap used in - // cricket::VideoCodec. - std::map codec_params; }; struct Stats { diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc index 317b63efc4..69173842cd 100644 --- a/media/engine/webrtcvideoengine.cc +++ b/media/engine/webrtcvideoengine.cc @@ -2246,8 +2246,8 @@ void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( webrtc::VideoReceiveStream::Decoder decoder; decoder.decoder = new_decoder.get(); decoder.payload_type = recv_codec.codec.id; - decoder.payload_name = recv_codec.codec.name; - decoder.codec_params = recv_codec.codec.params; + decoder.video_format = + webrtc::SdpVideoFormat(recv_codec.codec.name, recv_codec.codec.params); config_.decoders.push_back(decoder); config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] = recv_codec.codec.id; @@ -2440,7 +2440,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::GetCodecNameFromPayloadType( int payload_type) { for (const webrtc::VideoReceiveStream::Decoder& decoder : config_.decoders) { if (decoder.payload_type == payload_type) { - return decoder.payload_name; + return decoder.video_format.name; } } return ""; diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc index 41b68c98d2..74c9c16eca 100644 --- a/media/engine/webrtcvideoengine_unittest.cc +++ b/media/engine/webrtcvideoengine_unittest.cc @@ -4330,7 +4330,7 @@ TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptDefaultCodecs) { FakeVideoReceiveStream* stream = AddRecvStream(); const webrtc::VideoReceiveStream::Config& config = stream->GetConfig(); - EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name); + EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].video_format.name); EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type); } @@ -6198,17 +6198,17 @@ TEST_F(WebRtcVideoChannelTest, DISABLED_GetRtpReceiveFmtpSprop) { EXPECT_EQ(kH264sprop1.ToCodecParameters(), rtp_parameters.codecs[0]); ASSERT_EQ(2u, cfg.decoders.size()); EXPECT_EQ(101, cfg.decoders[0].payload_type); - EXPECT_EQ("H264", cfg.decoders[0].payload_name); + EXPECT_EQ("H264", cfg.decoders[0].video_format.name); const auto it0 = - cfg.decoders[0].codec_params.find(kH264FmtpSpropParameterSets); - ASSERT_TRUE(it0 != cfg.decoders[0].codec_params.end()); + cfg.decoders[0].video_format.parameters.find(kH264FmtpSpropParameterSets); + ASSERT_TRUE(it0 != cfg.decoders[0].video_format.parameters.end()); EXPECT_EQ("uvw", it0->second); EXPECT_EQ(102, cfg.decoders[1].payload_type); - EXPECT_EQ("H264", cfg.decoders[1].payload_name); + EXPECT_EQ("H264", cfg.decoders[1].video_format.name); const auto it1 = - cfg.decoders[1].codec_params.find(kH264FmtpSpropParameterSets); - ASSERT_TRUE(it1 != cfg.decoders[1].codec_params.end()); + cfg.decoders[1].video_format.parameters.find(kH264FmtpSpropParameterSets); + ASSERT_TRUE(it1 != cfg.decoders[1].video_format.parameters.end()); EXPECT_EQ("xyz", it1->second); } diff --git a/test/call_test.cc b/test/call_test.cc index 3b609c300f..f7828a4c3f 100644 --- a/test/call_test.cc +++ b/test/call_test.cc @@ -366,7 +366,7 @@ void CallTest::AddMatchingVideoReceiveConfigs( } else { decoder.decoder = new test::FakeDecoder(); decoder.payload_type = video_send_config.rtp.payload_type; - decoder.payload_name = video_send_config.rtp.payload_name; + decoder.video_format = SdpVideoFormat(video_send_config.rtp.payload_name); } allocated_decoders_.emplace_back(decoder.decoder); video_recv_config.decoders.push_back(decoder); diff --git a/test/encoder_settings.cc b/test/encoder_settings.cc index 8e21598c2d..1013433917 100644 --- a/test/encoder_settings.cc +++ b/test/encoder_settings.cc @@ -127,7 +127,7 @@ VideoReceiveStream::Decoder CreateMatchingDecoder( const std::string& payload_name) { VideoReceiveStream::Decoder decoder; decoder.payload_type = payload_type; - decoder.payload_name = payload_name; + decoder.video_format = SdpVideoFormat(payload_name); if (payload_name == "H264") { decoder.decoder = H264Decoder::Create().release(); } else if (payload_name == "VP8") { diff --git a/video/end_to_end_tests/codec_tests.cc b/video/end_to_end_tests/codec_tests.cc index f97483a2d2..31742ee3cd 100644 --- a/video/end_to_end_tests/codec_tests.cc +++ b/video/end_to_end_tests/codec_tests.cc @@ -64,8 +64,8 @@ class CodecObserver : public test::EndToEndTest, (*receive_configs)[0].decoders.resize(1); (*receive_configs)[0].decoders[0].payload_type = send_config->rtp.payload_type; - (*receive_configs)[0].decoders[0].payload_name = - send_config->rtp.payload_name; + (*receive_configs)[0].decoders[0].video_format = + SdpVideoFormat(send_config->rtp.payload_name); (*receive_configs)[0].decoders[0].decoder = decoder_.get(); } diff --git a/video/end_to_end_tests/extended_reports_tests.cc b/video/end_to_end_tests/extended_reports_tests.cc index f90f828220..ba5ca693f2 100644 --- a/video/end_to_end_tests/extended_reports_tests.cc +++ b/video/end_to_end_tests/extended_reports_tests.cc @@ -141,8 +141,8 @@ class RtcpXrObserver : public test::EndToEndTest { (*receive_configs)[0].decoders.resize(1); (*receive_configs)[0].decoders[0].payload_type = send_config->rtp.payload_type; - (*receive_configs)[0].decoders[0].payload_name = - send_config->rtp.payload_name; + (*receive_configs)[0].decoders[0].video_format = + SdpVideoFormat(send_config->rtp.payload_name); } if (enable_target_bitrate_) { // TargetBitrate only signaled for screensharing. diff --git a/video/end_to_end_tests/fec_tests.cc b/video/end_to_end_tests/fec_tests.cc index 048376e926..000f6d7e26 100644 --- a/video/end_to_end_tests/fec_tests.cc +++ b/video/end_to_end_tests/fec_tests.cc @@ -459,8 +459,8 @@ TEST_F(FecEndToEndTest, ReceivedUlpfecPacketsNotNacked) { (*receive_configs)[0].decoders.resize(1); (*receive_configs)[0].decoders[0].payload_type = send_config->rtp.payload_type; - (*receive_configs)[0].decoders[0].payload_name = - send_config->rtp.payload_name; + (*receive_configs)[0].decoders[0].video_format = + SdpVideoFormat(send_config->rtp.payload_name); (*receive_configs)[0].decoders[0].decoder = decoder_.get(); } diff --git a/video/end_to_end_tests/histogram_tests.cc b/video/end_to_end_tests/histogram_tests.cc index 04255a826c..4b5ffe931a 100644 --- a/video/end_to_end_tests/histogram_tests.cc +++ b/video/end_to_end_tests/histogram_tests.cc @@ -88,7 +88,7 @@ void HistogramTest::VerifyHistogramStats(bool use_rtx, send_config->encoder_settings.encoder_factory = &encoder_factory_; send_config->rtp.payload_name = "VP8"; encoder_config->codec_type = kVideoCodecVP8; - (*receive_configs)[0].decoders[0].payload_name = "VP8"; + (*receive_configs)[0].decoders[0].video_format = SdpVideoFormat("VP8"); (*receive_configs)[0].rtp.red_payload_type = kRedPayloadType; (*receive_configs)[0].rtp.ulpfec_payload_type = kUlpfecPayloadType; } diff --git a/video/end_to_end_tests/log_tests.cc b/video/end_to_end_tests/log_tests.cc index 557aab05ba..aa62383240 100644 --- a/video/end_to_end_tests/log_tests.cc +++ b/video/end_to_end_tests/log_tests.cc @@ -76,8 +76,8 @@ TEST_F(LogEndToEndTest, LogsEncodedFramesWhenRequested) { (*receive_configs)[0].decoders.resize(1); (*receive_configs)[0].decoders[0].payload_type = send_config->rtp.payload_type; - (*receive_configs)[0].decoders[0].payload_name = - send_config->rtp.payload_name; + (*receive_configs)[0].decoders[0].video_format = + SdpVideoFormat(send_config->rtp.payload_name); (*receive_configs)[0].decoders[0].decoder = decoder_.get(); } diff --git a/video/end_to_end_tests/retransmission_tests.cc b/video/end_to_end_tests/retransmission_tests.cc index a8c1c4e48f..73a5585e74 100644 --- a/video/end_to_end_tests/retransmission_tests.cc +++ b/video/end_to_end_tests/retransmission_tests.cc @@ -432,7 +432,7 @@ void RetransmissionEndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, send_config->encoder_settings.encoder_factory = &encoder_factory_; send_config->rtp.payload_name = "VP8"; encoder_config->codec_type = kVideoCodecVP8; - (*receive_configs)[0].decoders[0].payload_name = "VP8"; + (*receive_configs)[0].decoders[0].video_format = SdpVideoFormat("VP8"); } void OnFrameGeneratorCapturerCreated( diff --git a/video/replay.cc b/video/replay.cc index 44cefd1077..a5eafae4e7 100644 --- a/video/replay.cc +++ b/video/replay.cc @@ -241,12 +241,14 @@ class VideoReceiveStreamConfigDeserializer final { auto receive_config = VideoReceiveStream::Config(transport); for (const auto decoder_json : json["decoders"]) { VideoReceiveStream::Decoder decoder; - decoder.payload_name = decoder_json["payload_name"].asString(); + decoder.video_format = + SdpVideoFormat(decoder_json["payload_name"].asString()); decoder.payload_type = decoder_json["payload_type"].asInt64(); for (const auto& params_json : decoder_json["codec_params"]) { std::vector members = params_json.getMemberNames(); RTC_CHECK_EQ(members.size(), 1); - decoder.codec_params[members[0]] = params_json[members[0]].asString(); + decoder.video_format.parameters[members[0]] = + params_json[members[0]].asString(); } receive_config.decoders.push_back(decoder); } @@ -356,7 +358,7 @@ class RtpReplayer final { // Instantiate the underlying decoder. for (auto& decoder : receive_config.decoders) { decoder.decoder = test::CreateMatchingDecoder(decoder.payload_type, - decoder.payload_name) + decoder.video_format.name) .decoder; } // Create a window for this config. diff --git a/video/video_receive_stream.cc b/video/video_receive_stream.cc index 20dc9fb4f9..b8f28963ea 100644 --- a/video/video_receive_stream.cc +++ b/video/video_receive_stream.cc @@ -48,7 +48,7 @@ VideoCodec CreateDecoderVideoCodec(const VideoReceiveStream::Decoder& decoder) { memset(&codec, 0, sizeof(codec)); codec.plType = decoder.payload_type; - codec.codecType = PayloadStringToCodecType(decoder.payload_name); + codec.codecType = PayloadStringToCodecType(decoder.video_format.name); if (codec.codecType == kVideoCodecVP8) { *(codec.VP8()) = VideoEncoder::GetDefaultVp8Settings(); @@ -57,10 +57,11 @@ VideoCodec CreateDecoderVideoCodec(const VideoReceiveStream::Decoder& decoder) { } else if (codec.codecType == kVideoCodecH264) { *(codec.H264()) = VideoEncoder::GetDefaultH264Settings(); codec.H264()->profile = - H264::ParseSdpProfileLevelId(decoder.codec_params)->profile; + H264::ParseSdpProfileLevelId(decoder.video_format.parameters)->profile; } else if (codec.codecType == kVideoCodecMultiplex) { VideoReceiveStream::Decoder associated_decoder = decoder; - associated_decoder.payload_name = CodecTypeToPayloadString(kVideoCodecVP9); + associated_decoder.video_format = + SdpVideoFormat(CodecTypeToPayloadString(kVideoCodecVP9)); VideoCodec associated_codec = CreateDecoderVideoCodec(associated_decoder); associated_codec.codecType = kVideoCodecMultiplex; return associated_codec; @@ -205,7 +206,8 @@ void VideoReceiveStream::Start() { video_receiver_.RegisterExternalDecoder(decoder.decoder, decoder.payload_type); VideoCodec codec = CreateDecoderVideoCodec(decoder); - rtp_video_stream_receiver_.AddReceiveCodec(codec, decoder.codec_params); + rtp_video_stream_receiver_.AddReceiveCodec(codec, + decoder.video_format.parameters); RTC_CHECK_EQ(VCM_OK, video_receiver_.RegisterReceiveCodec( &codec, num_cpu_cores_, false)); } diff --git a/video/video_receive_stream_unittest.cc b/video/video_receive_stream_unittest.cc index 5ae1364fa0..4b433d28e8 100644 --- a/video/video_receive_stream_unittest.cc +++ b/video/video_receive_stream_unittest.cc @@ -74,14 +74,14 @@ class VideoReceiveStreamTest : public testing::Test { config_.renderer = &fake_renderer_; VideoReceiveStream::Decoder h264_decoder; h264_decoder.payload_type = 99; - h264_decoder.payload_name = "H264"; - h264_decoder.codec_params.insert( + h264_decoder.video_format = SdpVideoFormat("H264"); + h264_decoder.video_format.parameters.insert( {"sprop-parameter-sets", "Z0IACpZTBYmI,aMljiA=="}); h264_decoder.decoder = &mock_h264_video_decoder_; config_.decoders.push_back(h264_decoder); VideoReceiveStream::Decoder null_decoder; null_decoder.payload_type = 98; - null_decoder.payload_name = "null"; + null_decoder.video_format = SdpVideoFormat("null"); null_decoder.decoder = &mock_null_video_decoder_; config_.decoders.push_back(null_decoder);