Skip to content

Commit

Permalink
Reland "Start supporting H264 packetization mode 0."
Browse files Browse the repository at this point in the history
This is a reland of 3409cfa

Needed to change RtpVideoStreamReceiver to stop deregistering a payload
type if two payload types refer to the same codec (which now happens,
with the packetization mode 0/1 payload types). It's not clear why this
was being done in the first place.

Original change's description:
> Start supporting H264 packetization mode 0.
>
> The work was already done to support it, but it wasn't being negotiated
> in SDP.
>
> This means we'll now see 8 H264 payload types instead of 4; one for each
> combination of BP/CBP profiles, packetization modes 0/1, and RTX/non-RTX.
> This could be problematic in the future, since we're starting to run
> out of dynamic payload types (using 25 of 32).
>
> Bug: chromium:600254
> Change-Id: Ief2340db77c796f12980445b547b87e939170fae
> Reviewed-on: https://webrtc-review.googlesource.com/77264
> Commit-Queue: Taylor Brandstetter <[email protected]>
> Reviewed-by: Erik Språng <[email protected]>
> Reviewed-by: Magnus Jedvert <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#23372}

Bug: chromium:600254
Change-Id: Ice1acc05acd1543d9b46e918de2bba0694d86259
Reviewed-on: https://webrtc-review.googlesource.com/78399
Reviewed-by: Danil Chapovalov <[email protected]>
Reviewed-by: Erik Språng <[email protected]>
Reviewed-by: Niels Moller <[email protected]>
Commit-Queue: Taylor Brandstetter <[email protected]>
Cr-Commit-Position: refs/heads/master@{#23494}
  • Loading branch information
Taylor Brandstetter authored and Commit Bot committed Jun 1, 2018
1 parent 6fd5b05 commit 28deb90
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 51 deletions.
5 changes: 0 additions & 5 deletions modules/rtp_rtcp/include/rtp_payload_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ class RTPPayloadRegistry {

int32_t DeRegisterReceivePayload(int8_t payload_type);

int32_t ReceivePayloadType(const SdpAudioFormat& audio_format,
int8_t* payload_type) const;
int32_t ReceivePayloadType(const VideoCodec& video_codec,
int8_t* payload_type) const;

int GetPayloadTypeFrequency(uint8_t payload_type) const;

rtc::Optional<RtpUtility::Payload> PayloadTypeToPayload(
Expand Down
29 changes: 0 additions & 29 deletions modules/rtp_rtcp/source/rtp_payload_registry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -226,35 +226,6 @@ void RTPPayloadRegistry::DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType(
}
}

int32_t RTPPayloadRegistry::ReceivePayloadType(
const SdpAudioFormat& audio_format,
int8_t* payload_type) const {
assert(payload_type);
rtc::CritScope cs(&crit_sect_);

for (const auto& it : payload_type_map_) {
if (PayloadIsCompatible(it.second, audio_format)) {
*payload_type = it.first;
return 0;
}
}
return -1;
}

int32_t RTPPayloadRegistry::ReceivePayloadType(const VideoCodec& video_codec,
int8_t* payload_type) const {
assert(payload_type);
rtc::CritScope cs(&crit_sect_);

for (const auto& it : payload_type_map_) {
if (PayloadIsCompatible(it.second, video_codec)) {
*payload_type = it.first;
return 0;
}
}
return -1;
}

int RTPPayloadRegistry::GetPayloadTypeFrequency(
uint8_t payload_type) const {
const auto payload = PayloadTypeToPayload(payload_type);
Expand Down
24 changes: 17 additions & 7 deletions modules/video_coding/codecs/h264/h264.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,17 @@ bool IsH264CodecSupported() {
#endif
}

SdpVideoFormat CreateH264Format(H264::Profile profile, H264::Level level) {
SdpVideoFormat CreateH264Format(H264::Profile profile,
H264::Level level,
const std::string& packetization_mode) {
const rtc::Optional<std::string> profile_string =
H264::ProfileLevelIdToString(H264::ProfileLevelId(profile, level));
RTC_CHECK(profile_string);
return SdpVideoFormat(cricket::kH264CodecName,
{{cricket::kH264FmtpProfileLevelId, *profile_string},
{cricket::kH264FmtpLevelAsymmetryAllowed, "1"},
{cricket::kH264FmtpPacketizationMode, "1"}});
return SdpVideoFormat(
cricket::kH264CodecName,
{{cricket::kH264FmtpProfileLevelId, *profile_string},
{cricket::kH264FmtpLevelAsymmetryAllowed, "1"},
{cricket::kH264FmtpPacketizationMode, packetization_mode}});
}

} // namespace
Expand All @@ -67,8 +70,15 @@ std::vector<SdpVideoFormat> SupportedH264Codecs() {
// decoder for that profile is required to be able to decode CBP. This means
// we can encode and send CBP even though we negotiated a potentially
// higher profile. See the H264 spec for more information.
return {CreateH264Format(H264::kProfileBaseline, H264::kLevel3_1),
CreateH264Format(H264::kProfileConstrainedBaseline, H264::kLevel3_1)};
//
// We support both packetization modes 0 (mandatory) and 1 (optional,
// preferred).
return {
CreateH264Format(H264::kProfileBaseline, H264::kLevel3_1, "1"),
CreateH264Format(H264::kProfileBaseline, H264::kLevel3_1, "0"),
CreateH264Format(H264::kProfileConstrainedBaseline, H264::kLevel3_1, "1"),
CreateH264Format(H264::kProfileConstrainedBaseline, H264::kLevel3_1,
"0")};
}

std::unique_ptr<H264Encoder> H264Encoder::Create(
Expand Down
9 changes: 0 additions & 9 deletions video/rtp_video_stream_receiver.cc
Original file line number Diff line number Diff line change
Expand Up @@ -171,15 +171,6 @@ bool RtpVideoStreamReceiver::AddReceiveCodec(
const VideoCodec& video_codec,
const std::map<std::string, std::string>& codec_params) {
pt_codec_params_.insert(make_pair(video_codec.plType, codec_params));
return AddReceiveCodec(video_codec);
}

bool RtpVideoStreamReceiver::AddReceiveCodec(const VideoCodec& video_codec) {
int8_t old_pltype = -1;
if (rtp_payload_registry_.ReceivePayloadType(video_codec, &old_pltype) !=
-1) {
rtp_payload_registry_.DeRegisterReceivePayload(old_pltype);
}
return rtp_payload_registry_.RegisterReceivePayload(video_codec) == 0;
}

Expand Down
1 change: 0 additions & 1 deletion video/rtp_video_stream_receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ class RtpVideoStreamReceiver : public RtpData,
void RemoveSecondarySink(const RtpPacketSinkInterface* sink);

private:
bool AddReceiveCodec(const VideoCodec& video_codec);
void ReceivePacket(const uint8_t* packet,
size_t packet_length,
const RTPHeader& header);
Expand Down

0 comments on commit 28deb90

Please sign in to comment.