From 3409cfa378e75c0c08d900e0848147929249a62b Mon Sep 17 00:00:00 2001 From: Taylor Brandstetter Date: Wed, 16 May 2018 15:27:41 -0700 Subject: [PATCH] Start supporting H264 packetization mode 0. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Erik Språng Reviewed-by: Magnus Jedvert Cr-Commit-Position: refs/heads/master@{#23372} --- modules/video_coding/codecs/h264/h264.cc | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/video_coding/codecs/h264/h264.cc b/modules/video_coding/codecs/h264/h264.cc index 7771b13a2f..4408fab82a 100644 --- a/modules/video_coding/codecs/h264/h264.cc +++ b/modules/video_coding/codecs/h264/h264.cc @@ -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 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 @@ -67,8 +70,15 @@ std::vector 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::Create(