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:
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user