diff --git a/modules/rtp_rtcp/source/rtp_payload_registry.cc b/modules/rtp_rtcp/source/rtp_payload_registry.cc index 9effcc291c..de1e232017 100644 --- a/modules/rtp_rtcp/source/rtp_payload_registry.cc +++ b/modules/rtp_rtcp/source/rtp_payload_registry.cc @@ -24,23 +24,24 @@ namespace { bool PayloadIsCompatible(const RtpUtility::Payload& payload, const CodecInst& audio_codec) { - if (!payload.audio) + if (!payload.typeSpecific.is_audio()) return false; if (_stricmp(payload.name, audio_codec.plname) != 0) return false; - const AudioPayload& audio_payload = payload.typeSpecific.Audio; + const AudioPayload& audio_payload = payload.typeSpecific.audio_payload(); return audio_payload.frequency == static_cast(audio_codec.plfreq) && audio_payload.channels == audio_codec.channels; } bool PayloadIsCompatible(const RtpUtility::Payload& payload, const VideoCodec& video_codec) { - if (payload.audio || _stricmp(payload.name, video_codec.plName) != 0) + if (!payload.typeSpecific.is_video() || + _stricmp(payload.name, video_codec.plName) != 0) return false; // For H264, profiles must match as well. if (video_codec.codecType == kVideoCodecH264) { return video_codec.H264().profile == - payload.typeSpecific.Video.h264_profile; + payload.typeSpecific.video_payload().h264_profile; } return true; } @@ -154,7 +155,7 @@ int32_t RTPPayloadRegistry::RegisterReceivePayload(const CodecInst& audio_codec, // We already use this payload type. Check if it's the same as we already // have. If same, ignore sending an error. if (PayloadIsCompatible(it->second, audio_codec)) { - it->second.typeSpecific.Audio.rate = 0; + it->second.typeSpecific.audio_payload().rate = 0; return 0; } LOG(LS_ERROR) << "Payload type already registered: " << audio_codec.pltype; @@ -306,8 +307,9 @@ int RTPPayloadRegistry::GetPayloadTypeFrequency( return -1; } rtc::CritScope cs(&crit_sect_); - return payload->audio ? payload->typeSpecific.Audio.frequency - : kVideoPayloadTypeFrequency; + return payload->typeSpecific.is_audio() + ? payload->typeSpecific.audio_payload().frequency + : kVideoPayloadTypeFrequency; } rtc::Optional RTPPayloadRegistry::PayloadTypeToPayload( diff --git a/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc b/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc index 8a1db7ab95..3da6967884 100644 --- a/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc @@ -48,8 +48,9 @@ TEST(RtpPayloadRegistryTest, // We should get back the corresponding payload that we registered. EXPECT_STREQ("VP8", retrieved_payload->name); - EXPECT_FALSE(retrieved_payload->audio); - EXPECT_EQ(kRtpVideoVp8, retrieved_payload->typeSpecific.Video.videoCodecType); + EXPECT_TRUE(retrieved_payload->typeSpecific.is_video()); + EXPECT_EQ(kRtpVideoVp8, + retrieved_payload->typeSpecific.video_payload().videoCodecType); // Now forget about it and verify it's gone. EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); @@ -74,9 +75,11 @@ TEST(RtpPayloadRegistryTest, // We should get back the corresponding payload that we registered. EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); - EXPECT_TRUE(retrieved_payload->audio); - EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); - EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); + EXPECT_TRUE(retrieved_payload->typeSpecific.is_audio()); + EXPECT_EQ(kTypicalFrequency, + retrieved_payload->typeSpecific.audio_payload().frequency); + EXPECT_EQ(kTypicalChannels, + retrieved_payload->typeSpecific.audio_payload().channels); // Now forget about it and verify it's gone. EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); @@ -105,7 +108,7 @@ TEST(RtpPayloadRegistryTest, AudioRedWorkProperly) { const auto retrieved_payload = rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType); EXPECT_TRUE(retrieved_payload); - EXPECT_TRUE(retrieved_payload->audio); + EXPECT_TRUE(retrieved_payload->typeSpecific.is_audio()); EXPECT_STRCASEEQ("red", retrieved_payload->name); // Sample rate is correctly registered. @@ -144,19 +147,21 @@ TEST(RtpPayloadRegistryTest, rtp_payload_registry.PayloadTypeToPayload(payload_type); EXPECT_TRUE(retrieved_payload1); EXPECT_STREQ(kTypicalPayloadName, retrieved_payload1->name); - EXPECT_TRUE(retrieved_payload1->audio); + EXPECT_TRUE(retrieved_payload1->typeSpecific.is_audio()); EXPECT_EQ(kTypicalFrequency, - retrieved_payload1->typeSpecific.Audio.frequency); - EXPECT_EQ(kTypicalChannels, retrieved_payload1->typeSpecific.Audio.channels); + retrieved_payload1->typeSpecific.audio_payload().frequency); + EXPECT_EQ(kTypicalChannels, + retrieved_payload1->typeSpecific.audio_payload().channels); const auto retrieved_payload2 = rtp_payload_registry.PayloadTypeToPayload(payload_type - 1); EXPECT_TRUE(retrieved_payload2); EXPECT_STREQ(kTypicalPayloadName, retrieved_payload2->name); - EXPECT_TRUE(retrieved_payload2->audio); + EXPECT_TRUE(retrieved_payload2->typeSpecific.is_audio()); EXPECT_EQ(kTypicalFrequency + 1, - retrieved_payload2->typeSpecific.Audio.frequency); - EXPECT_EQ(kTypicalChannels, retrieved_payload2->typeSpecific.Audio.channels); + retrieved_payload2->typeSpecific.audio_payload().frequency); + EXPECT_EQ(kTypicalChannels, + retrieved_payload2->typeSpecific.audio_payload().channels); // Ok, update the rate for one of the codecs. If either the incoming rate or // the stored rate is zero it's not really an error to register the same diff --git a/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/modules/rtp_rtcp/source/rtp_receiver_audio.cc index 9ccc3ec44b..3c50578d23 100644 --- a/modules/rtp_rtcp/source/rtp_receiver_audio.cc +++ b/modules/rtp_rtcp/source/rtp_receiver_audio.cc @@ -150,11 +150,8 @@ int32_t RTPReceiverAudio::ParseRtpPacket(WebRtcRTPHeader* rtp_header, LOG(LS_INFO) << "Received first audio RTP packet"; } - return ParseAudioCodecSpecific(rtp_header, - payload, - payload_length, - specific_payload.Audio, - is_red); + return ParseAudioCodecSpecific(rtp_header, payload, payload_length, + specific_payload.audio_payload(), is_red); } RTPAliveType RTPReceiverAudio::ProcessDeadOrAlive( @@ -193,10 +190,9 @@ int32_t RTPReceiverAudio::InvokeOnInitializeDecoder( int8_t payload_type, const char payload_name[RTP_PAYLOAD_NAME_SIZE], const PayloadUnion& specific_payload) const { - if (-1 == - callback->OnInitializeDecoder( - payload_type, payload_name, specific_payload.Audio.frequency, - specific_payload.Audio.channels, specific_payload.Audio.rate)) { + const auto& ap = specific_payload.audio_payload(); + if (callback->OnInitializeDecoder(payload_type, payload_name, ap.frequency, + ap.channels, ap.rate) == -1) { LOG(LS_ERROR) << "Failed to create decoder for payload type: " << payload_name << "/" << static_cast(payload_type); return -1; diff --git a/modules/rtp_rtcp/source/rtp_receiver_impl.cc b/modules/rtp_rtcp/source/rtp_receiver_impl.cc index c200c1f398..8a8669ef75 100644 --- a/modules/rtp_rtcp/source/rtp_receiver_impl.cc +++ b/modules/rtp_rtcp/source/rtp_receiver_impl.cc @@ -279,9 +279,9 @@ void RtpReceiverImpl::CheckSSRCChanged(const RTPHeader& rtp_header) { } payload_name[RTP_PAYLOAD_NAME_SIZE - 1] = 0; strncpy(payload_name, payload->name, RTP_PAYLOAD_NAME_SIZE - 1); - if (payload->audio) { - channels = payload->typeSpecific.Audio.channels; - rate = payload->typeSpecific.Audio.rate; + if (payload->typeSpecific.is_audio()) { + channels = payload->typeSpecific.audio_payload().channels; + rate = payload->typeSpecific.audio_payload().rate; } } } @@ -376,7 +376,7 @@ int32_t RtpReceiverImpl::CheckPayloadChanged(const RTPHeader& rtp_header, rtp_media_receiver_->SetLastMediaSpecificPayload(payload->typeSpecific); rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload); - if (!payload->audio) { + if (!payload->typeSpecific.is_audio()) { bool media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(payload_type); if (media_type_unchanged) { diff --git a/modules/rtp_rtcp/source/rtp_receiver_video.cc b/modules/rtp_rtcp/source/rtp_receiver_video.cc index 5cd2137a47..35820afca2 100644 --- a/modules/rtp_rtcp/source/rtp_receiver_video.cc +++ b/modules/rtp_rtcp/source/rtp_receiver_video.cc @@ -58,7 +58,8 @@ int32_t RTPReceiverVideo::ParseRtpPacket(WebRtcRTPHeader* rtp_header, TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Video::ParseRtp", "seqnum", rtp_header->header.sequenceNumber, "timestamp", rtp_header->header.timestamp); - rtp_header->type.Video.codec = specific_payload.Video.videoCodecType; + rtp_header->type.Video.codec = + specific_payload.video_payload().videoCodecType; RTC_DCHECK_GE(payload_length, rtp_header->header.paddingLength); const size_t payload_data_length = diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc index de9bf73c67..1a47d97ece 100644 --- a/modules/rtp_rtcp/source/rtp_sender.cc +++ b/modules/rtp_rtcp/source/rtp_sender.cc @@ -237,15 +237,16 @@ int32_t RTPSender::RegisterPayload( // Check if it's the same as we already have. if (RtpUtility::StringCompare( payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) { - if (audio_configured_ && payload->audio && - payload->typeSpecific.Audio.frequency == frequency && - (payload->typeSpecific.Audio.rate == rate || - payload->typeSpecific.Audio.rate == 0 || rate == 0)) { - payload->typeSpecific.Audio.rate = rate; - // Ensure that we update the rate if new or old is zero. - return 0; + if (audio_configured_ && payload->typeSpecific.is_audio()) { + auto& p = payload->typeSpecific.audio_payload(); + if (p.frequency == frequency && + (p.rate == rate || p.rate == 0 || rate == 0)) { + p.rate = rate; + // Ensure that we update the rate if new or old is zero. + return 0; + } } - if (!audio_configured_ && !payload->audio) { + if (!audio_configured_ && !payload->typeSpecific.is_audio()) { return 0; } } @@ -356,9 +357,10 @@ int32_t RTPSender::CheckPayloadType(int8_t payload_type, SetSendPayloadType(payload_type); RtpUtility::Payload* payload = it->second; RTC_DCHECK(payload); - if (!payload->audio && !audio_configured_) { - video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); - *video_type = payload->typeSpecific.Video.videoCodecType; + if (payload->typeSpecific.is_video() && !audio_configured_) { + video_->SetVideoCodecType( + payload->typeSpecific.video_payload().videoCodecType); + *video_type = payload->typeSpecific.video_payload().videoCodecType; } return 0; } diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc index c5483e91b4..f061bd6302 100644 --- a/video/rtp_video_stream_receiver.cc +++ b/video/rtp_video_stream_receiver.cc @@ -500,7 +500,7 @@ void RtpVideoStreamReceiver::NotifyReceiverOfFecPacket( LOG(LS_WARNING) << "Failed to get payload specifics."; return; } - rtp_header.type.Video.codec = pl->typeSpecific.Video.videoCodecType; + rtp_header.type.Video.codec = pl->typeSpecific.video_payload().videoCodecType; rtp_header.type.Video.rotation = kVideoRotation_0; if (header.extension.hasVideoRotation) { rtp_header.type.Video.rotation = header.extension.videoRotation;