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,
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<uint32_t>(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,7 +307,8 @@ int RTPPayloadRegistry::GetPayloadTypeFrequency(
return -1;
}
rtc::CritScope cs(&crit_sect_);
return payload->audio ? payload->typeSpecific.Audio.frequency
return payload->typeSpecific.is_audio()
? payload->typeSpecific.audio_payload().frequency
: kVideoPayloadTypeFrequency;
}

View File

@ -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

View File

@ -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<int>(payload_type);
return -1;

View File

@ -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) {

View File

@ -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 =

View File

@ -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;
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;
}

View File

@ -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;