Convert PayloadUnion from a union to a class, step 2

Stop using PayloadUnion's public member variables, since a future CL
will make them private.

BUG=webrtc:8159

Change-Id: Ia3dada56be7ef00ed80f3733209b18c178a36561
Reviewed-on: https://webrtc-review.googlesource.com/4380
Commit-Queue: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20027}
This commit is contained in:
Karl Wiberg
2017-09-28 20:13:59 +02:00
committed by Commit Bot
parent a6368d17c5
commit c856dc2b6b
7 changed files with 51 additions and 45 deletions

View File

@ -24,23 +24,24 @@ namespace {
bool PayloadIsCompatible(const RtpUtility::Payload& payload, bool PayloadIsCompatible(const RtpUtility::Payload& payload,
const CodecInst& audio_codec) { const CodecInst& audio_codec) {
if (!payload.audio) if (!payload.typeSpecific.is_audio())
return false; return false;
if (_stricmp(payload.name, audio_codec.plname) != 0) if (_stricmp(payload.name, audio_codec.plname) != 0)
return false; return false;
const AudioPayload& audio_payload = payload.typeSpecific.Audio; const AudioPayload& audio_payload = payload.typeSpecific.audio_payload();
return audio_payload.frequency == static_cast<uint32_t>(audio_codec.plfreq) && return audio_payload.frequency == static_cast<uint32_t>(audio_codec.plfreq) &&
audio_payload.channels == audio_codec.channels; audio_payload.channels == audio_codec.channels;
} }
bool PayloadIsCompatible(const RtpUtility::Payload& payload, bool PayloadIsCompatible(const RtpUtility::Payload& payload,
const VideoCodec& video_codec) { 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; return false;
// For H264, profiles must match as well. // For H264, profiles must match as well.
if (video_codec.codecType == kVideoCodecH264) { if (video_codec.codecType == kVideoCodecH264) {
return video_codec.H264().profile == return video_codec.H264().profile ==
payload.typeSpecific.Video.h264_profile; payload.typeSpecific.video_payload().h264_profile;
} }
return true; 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 // We already use this payload type. Check if it's the same as we already
// have. If same, ignore sending an error. // have. If same, ignore sending an error.
if (PayloadIsCompatible(it->second, audio_codec)) { if (PayloadIsCompatible(it->second, audio_codec)) {
it->second.typeSpecific.Audio.rate = 0; it->second.typeSpecific.audio_payload().rate = 0;
return 0; return 0;
} }
LOG(LS_ERROR) << "Payload type already registered: " << audio_codec.pltype; LOG(LS_ERROR) << "Payload type already registered: " << audio_codec.pltype;
@ -306,7 +307,8 @@ int RTPPayloadRegistry::GetPayloadTypeFrequency(
return -1; return -1;
} }
rtc::CritScope cs(&crit_sect_); rtc::CritScope cs(&crit_sect_);
return payload->audio ? payload->typeSpecific.Audio.frequency return payload->typeSpecific.is_audio()
? payload->typeSpecific.audio_payload().frequency
: kVideoPayloadTypeFrequency; : kVideoPayloadTypeFrequency;
} }

View File

@ -48,8 +48,9 @@ TEST(RtpPayloadRegistryTest,
// We should get back the corresponding payload that we registered. // We should get back the corresponding payload that we registered.
EXPECT_STREQ("VP8", retrieved_payload->name); EXPECT_STREQ("VP8", retrieved_payload->name);
EXPECT_FALSE(retrieved_payload->audio); EXPECT_TRUE(retrieved_payload->typeSpecific.is_video());
EXPECT_EQ(kRtpVideoVp8, retrieved_payload->typeSpecific.Video.videoCodecType); EXPECT_EQ(kRtpVideoVp8,
retrieved_payload->typeSpecific.video_payload().videoCodecType);
// Now forget about it and verify it's gone. // Now forget about it and verify it's gone.
EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); 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. // We should get back the corresponding payload that we registered.
EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name);
EXPECT_TRUE(retrieved_payload->audio); EXPECT_TRUE(retrieved_payload->typeSpecific.is_audio());
EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); EXPECT_EQ(kTypicalFrequency,
EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); retrieved_payload->typeSpecific.audio_payload().frequency);
EXPECT_EQ(kTypicalChannels,
retrieved_payload->typeSpecific.audio_payload().channels);
// Now forget about it and verify it's gone. // Now forget about it and verify it's gone.
EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type));
@ -105,7 +108,7 @@ TEST(RtpPayloadRegistryTest, AudioRedWorkProperly) {
const auto retrieved_payload = const auto retrieved_payload =
rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType); rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType);
EXPECT_TRUE(retrieved_payload); EXPECT_TRUE(retrieved_payload);
EXPECT_TRUE(retrieved_payload->audio); EXPECT_TRUE(retrieved_payload->typeSpecific.is_audio());
EXPECT_STRCASEEQ("red", retrieved_payload->name); EXPECT_STRCASEEQ("red", retrieved_payload->name);
// Sample rate is correctly registered. // Sample rate is correctly registered.
@ -144,19 +147,21 @@ TEST(RtpPayloadRegistryTest,
rtp_payload_registry.PayloadTypeToPayload(payload_type); rtp_payload_registry.PayloadTypeToPayload(payload_type);
EXPECT_TRUE(retrieved_payload1); EXPECT_TRUE(retrieved_payload1);
EXPECT_STREQ(kTypicalPayloadName, retrieved_payload1->name); EXPECT_STREQ(kTypicalPayloadName, retrieved_payload1->name);
EXPECT_TRUE(retrieved_payload1->audio); EXPECT_TRUE(retrieved_payload1->typeSpecific.is_audio());
EXPECT_EQ(kTypicalFrequency, EXPECT_EQ(kTypicalFrequency,
retrieved_payload1->typeSpecific.Audio.frequency); retrieved_payload1->typeSpecific.audio_payload().frequency);
EXPECT_EQ(kTypicalChannels, retrieved_payload1->typeSpecific.Audio.channels); EXPECT_EQ(kTypicalChannels,
retrieved_payload1->typeSpecific.audio_payload().channels);
const auto retrieved_payload2 = const auto retrieved_payload2 =
rtp_payload_registry.PayloadTypeToPayload(payload_type - 1); rtp_payload_registry.PayloadTypeToPayload(payload_type - 1);
EXPECT_TRUE(retrieved_payload2); EXPECT_TRUE(retrieved_payload2);
EXPECT_STREQ(kTypicalPayloadName, retrieved_payload2->name); EXPECT_STREQ(kTypicalPayloadName, retrieved_payload2->name);
EXPECT_TRUE(retrieved_payload2->audio); EXPECT_TRUE(retrieved_payload2->typeSpecific.is_audio());
EXPECT_EQ(kTypicalFrequency + 1, EXPECT_EQ(kTypicalFrequency + 1,
retrieved_payload2->typeSpecific.Audio.frequency); retrieved_payload2->typeSpecific.audio_payload().frequency);
EXPECT_EQ(kTypicalChannels, retrieved_payload2->typeSpecific.Audio.channels); EXPECT_EQ(kTypicalChannels,
retrieved_payload2->typeSpecific.audio_payload().channels);
// Ok, update the rate for one of the codecs. If either the incoming rate or // 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 // the stored rate is zero it's not really an error to register the same

View File

@ -150,11 +150,8 @@ int32_t RTPReceiverAudio::ParseRtpPacket(WebRtcRTPHeader* rtp_header,
LOG(LS_INFO) << "Received first audio RTP packet"; LOG(LS_INFO) << "Received first audio RTP packet";
} }
return ParseAudioCodecSpecific(rtp_header, return ParseAudioCodecSpecific(rtp_header, payload, payload_length,
payload, specific_payload.audio_payload(), is_red);
payload_length,
specific_payload.Audio,
is_red);
} }
RTPAliveType RTPReceiverAudio::ProcessDeadOrAlive( RTPAliveType RTPReceiverAudio::ProcessDeadOrAlive(
@ -193,10 +190,9 @@ int32_t RTPReceiverAudio::InvokeOnInitializeDecoder(
int8_t payload_type, int8_t payload_type,
const char payload_name[RTP_PAYLOAD_NAME_SIZE], const char payload_name[RTP_PAYLOAD_NAME_SIZE],
const PayloadUnion& specific_payload) const { const PayloadUnion& specific_payload) const {
if (-1 == const auto& ap = specific_payload.audio_payload();
callback->OnInitializeDecoder( if (callback->OnInitializeDecoder(payload_type, payload_name, ap.frequency,
payload_type, payload_name, specific_payload.Audio.frequency, ap.channels, ap.rate) == -1) {
specific_payload.Audio.channels, specific_payload.Audio.rate)) {
LOG(LS_ERROR) << "Failed to create decoder for payload type: " LOG(LS_ERROR) << "Failed to create decoder for payload type: "
<< payload_name << "/" << static_cast<int>(payload_type); << payload_name << "/" << static_cast<int>(payload_type);
return -1; return -1;

View File

@ -279,9 +279,9 @@ void RtpReceiverImpl::CheckSSRCChanged(const RTPHeader& rtp_header) {
} }
payload_name[RTP_PAYLOAD_NAME_SIZE - 1] = 0; payload_name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
strncpy(payload_name, payload->name, RTP_PAYLOAD_NAME_SIZE - 1); strncpy(payload_name, payload->name, RTP_PAYLOAD_NAME_SIZE - 1);
if (payload->audio) { if (payload->typeSpecific.is_audio()) {
channels = payload->typeSpecific.Audio.channels; channels = payload->typeSpecific.audio_payload().channels;
rate = payload->typeSpecific.Audio.rate; 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_->SetLastMediaSpecificPayload(payload->typeSpecific);
rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload); rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload);
if (!payload->audio) { if (!payload->typeSpecific.is_audio()) {
bool media_type_unchanged = bool media_type_unchanged =
rtp_payload_registry_->ReportMediaPayloadType(payload_type); rtp_payload_registry_->ReportMediaPayloadType(payload_type);
if (media_type_unchanged) { if (media_type_unchanged) {

View File

@ -58,7 +58,8 @@ int32_t RTPReceiverVideo::ParseRtpPacket(WebRtcRTPHeader* rtp_header,
TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Video::ParseRtp", TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Video::ParseRtp",
"seqnum", rtp_header->header.sequenceNumber, "timestamp", "seqnum", rtp_header->header.sequenceNumber, "timestamp",
rtp_header->header.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); RTC_DCHECK_GE(payload_length, rtp_header->header.paddingLength);
const size_t payload_data_length = const size_t payload_data_length =

View File

@ -237,15 +237,16 @@ int32_t RTPSender::RegisterPayload(
// Check if it's the same as we already have. // Check if it's the same as we already have.
if (RtpUtility::StringCompare( if (RtpUtility::StringCompare(
payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) { payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) {
if (audio_configured_ && payload->audio && if (audio_configured_ && payload->typeSpecific.is_audio()) {
payload->typeSpecific.Audio.frequency == frequency && auto& p = payload->typeSpecific.audio_payload();
(payload->typeSpecific.Audio.rate == rate || if (p.frequency == frequency &&
payload->typeSpecific.Audio.rate == 0 || rate == 0)) { (p.rate == rate || p.rate == 0 || rate == 0)) {
payload->typeSpecific.Audio.rate = rate; p.rate = rate;
// Ensure that we update the rate if new or old is zero. // Ensure that we update the rate if new or old is zero.
return 0; return 0;
} }
if (!audio_configured_ && !payload->audio) { }
if (!audio_configured_ && !payload->typeSpecific.is_audio()) {
return 0; return 0;
} }
} }
@ -356,9 +357,10 @@ int32_t RTPSender::CheckPayloadType(int8_t payload_type,
SetSendPayloadType(payload_type); SetSendPayloadType(payload_type);
RtpUtility::Payload* payload = it->second; RtpUtility::Payload* payload = it->second;
RTC_DCHECK(payload); RTC_DCHECK(payload);
if (!payload->audio && !audio_configured_) { if (payload->typeSpecific.is_video() && !audio_configured_) {
video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType); video_->SetVideoCodecType(
*video_type = payload->typeSpecific.Video.videoCodecType; payload->typeSpecific.video_payload().videoCodecType);
*video_type = payload->typeSpecific.video_payload().videoCodecType;
} }
return 0; return 0;
} }

View File

@ -500,7 +500,7 @@ void RtpVideoStreamReceiver::NotifyReceiverOfFecPacket(
LOG(LS_WARNING) << "Failed to get payload specifics."; LOG(LS_WARNING) << "Failed to get payload specifics.";
return; 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; rtp_header.type.Video.rotation = kVideoRotation_0;
if (header.extension.hasVideoRotation) { if (header.extension.hasVideoRotation) {
rtp_header.type.Video.rotation = header.extension.videoRotation; rtp_header.type.Video.rotation = header.extension.videoRotation;