Reland "Start supporting H264 packetization mode 0."
This is a reland of 3409cfa378e75c0c08d900e0848147929249a62b 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 <deadbeef@webrtc.org> > Reviewed-by: Erik Språng <sprang@webrtc.org> > Reviewed-by: Magnus Jedvert <magjed@webrtc.org> > 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 <danilchap@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Taylor Brandstetter <deadbeef@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23494}
This commit is contained in:

committed by
Commit Bot

parent
6fd5b05ff9
commit
28deb90728
@ -41,11 +41,6 @@ class RTPPayloadRegistry {
|
|||||||
|
|
||||||
int32_t DeRegisterReceivePayload(int8_t payload_type);
|
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;
|
int GetPayloadTypeFrequency(uint8_t payload_type) const;
|
||||||
|
|
||||||
rtc::Optional<RtpUtility::Payload> PayloadTypeToPayload(
|
rtc::Optional<RtpUtility::Payload> PayloadTypeToPayload(
|
||||||
|
@ -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(
|
int RTPPayloadRegistry::GetPayloadTypeFrequency(
|
||||||
uint8_t payload_type) const {
|
uint8_t payload_type) const {
|
||||||
const auto payload = PayloadTypeToPayload(payload_type);
|
const auto payload = PayloadTypeToPayload(payload_type);
|
||||||
|
@ -40,14 +40,17 @@ bool IsH264CodecSupported() {
|
|||||||
#endif
|
#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 =
|
const rtc::Optional<std::string> profile_string =
|
||||||
H264::ProfileLevelIdToString(H264::ProfileLevelId(profile, level));
|
H264::ProfileLevelIdToString(H264::ProfileLevelId(profile, level));
|
||||||
RTC_CHECK(profile_string);
|
RTC_CHECK(profile_string);
|
||||||
return SdpVideoFormat(cricket::kH264CodecName,
|
return SdpVideoFormat(
|
||||||
{{cricket::kH264FmtpProfileLevelId, *profile_string},
|
cricket::kH264CodecName,
|
||||||
{cricket::kH264FmtpLevelAsymmetryAllowed, "1"},
|
{{cricket::kH264FmtpProfileLevelId, *profile_string},
|
||||||
{cricket::kH264FmtpPacketizationMode, "1"}});
|
{cricket::kH264FmtpLevelAsymmetryAllowed, "1"},
|
||||||
|
{cricket::kH264FmtpPacketizationMode, packetization_mode}});
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -67,8 +70,15 @@ std::vector<SdpVideoFormat> SupportedH264Codecs() {
|
|||||||
// decoder for that profile is required to be able to decode CBP. This means
|
// 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
|
// we can encode and send CBP even though we negotiated a potentially
|
||||||
// higher profile. See the H264 spec for more information.
|
// 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(
|
std::unique_ptr<H264Encoder> H264Encoder::Create(
|
||||||
|
@ -171,15 +171,6 @@ bool RtpVideoStreamReceiver::AddReceiveCodec(
|
|||||||
const VideoCodec& video_codec,
|
const VideoCodec& video_codec,
|
||||||
const std::map<std::string, std::string>& codec_params) {
|
const std::map<std::string, std::string>& codec_params) {
|
||||||
pt_codec_params_.insert(make_pair(video_codec.plType, 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;
|
return rtp_payload_registry_.RegisterReceivePayload(video_codec) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,6 @@ class RtpVideoStreamReceiver : public RtpData,
|
|||||||
void RemoveSecondarySink(const RtpPacketSinkInterface* sink);
|
void RemoveSecondarySink(const RtpPacketSinkInterface* sink);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool AddReceiveCodec(const VideoCodec& video_codec);
|
|
||||||
void ReceivePacket(const uint8_t* packet,
|
void ReceivePacket(const uint8_t* packet,
|
||||||
size_t packet_length,
|
size_t packet_length,
|
||||||
const RTPHeader& header);
|
const RTPHeader& header);
|
||||||
|
Reference in New Issue
Block a user