diff --git a/webrtc/common_types.h b/webrtc/common_types.h index 4128f13ffa..3a0d6d8cc5 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -548,6 +548,19 @@ struct VideoCodecVP9 { bool flexibleMode; }; +// TODO(magjed): Move this and other H264 related classes out to their own file. +namespace H264 { + +enum Profile { + kProfileConstrainedBaseline, + kProfileBaseline, + kProfileMain, + kProfileConstrainedHigh, + kProfileHigh, +}; + +} // namespace H264 + // H264 specific. struct VideoCodecH264 { bool frameDroppingOn; @@ -557,6 +570,7 @@ struct VideoCodecH264 { size_t spsLen; const uint8_t* ppsData; size_t ppsLen; + H264::Profile profile; }; // Video codec types diff --git a/webrtc/common_video/h264/profile_level_id.h b/webrtc/common_video/h264/profile_level_id.h index bb1c435926..20147bb66e 100644 --- a/webrtc/common_video/h264/profile_level_id.h +++ b/webrtc/common_video/h264/profile_level_id.h @@ -15,6 +15,7 @@ #include #include "webrtc/base/optional.h" +#include "webrtc/common_types.h" namespace webrtc { namespace H264 { @@ -22,14 +23,6 @@ namespace H264 { // Map containting SDP codec parameters. typedef std::map CodecParameterMap; -enum Profile { - kProfileConstrainedBaseline, - kProfileBaseline, - kProfileMain, - kProfileConstrainedHigh, - kProfileHigh, -}; - // All values are equal to ten times the level number, except level 1b which is // special. enum Level { diff --git a/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h index bd3aae72b5..9ba9b51bbb 100644 --- a/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h +++ b/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h @@ -15,6 +15,7 @@ #include #include +#include "webrtc/common_types.h" #include "webrtc/modules/include/module_common_types.h" #include "webrtc/system_wrappers/include/clock.h" #include "webrtc/typedefs.h" @@ -44,7 +45,9 @@ struct AudioPayload { }; struct VideoPayload { - RtpVideoCodecTypes videoCodecType; + RtpVideoCodecTypes videoCodecType; + // The H264 profile only matters if videoCodecType == kRtpVideoH264. + H264::Profile h264_profile; }; union PayloadUnion { diff --git a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc index 7d4afc6e36..4925d3d877 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc @@ -37,7 +37,14 @@ bool PayloadIsCompatible(const RtpUtility::Payload& payload, bool PayloadIsCompatible(const RtpUtility::Payload& payload, const VideoCodec& video_codec) { - return !payload.audio && _stricmp(payload.name, video_codec.plName) == 0; + if (payload.audio || _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; + } + return true; } RtpUtility::Payload CreatePayloadType(const CodecInst& audio_codec) { diff --git a/webrtc/modules/video_coding/codec_database.cc b/webrtc/modules/video_coding/codec_database.cc index 9d8c8f3489..ff7077e569 100644 --- a/webrtc/modules/video_coding/codec_database.cc +++ b/webrtc/modules/video_coding/codec_database.cc @@ -68,6 +68,7 @@ VideoCodecH264 VideoEncoder::GetDefaultH264Settings() { h264_settings.spsLen = 0; h264_settings.ppsData = nullptr; h264_settings.ppsLen = 0; + h264_settings.profile = H264::kProfileConstrainedBaseline; return h264_settings; } diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc index cc14525654..5fd79a7744 100644 --- a/webrtc/video/video_receive_stream.cc +++ b/webrtc/video/video_receive_stream.cc @@ -19,6 +19,7 @@ #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" #include "webrtc/base/optional.h" +#include "webrtc/common_video/h264/profile_level_id.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" #include "webrtc/modules/congestion_controller/include/congestion_controller.h" #include "webrtc/modules/utility/include/process_thread.h" @@ -169,6 +170,8 @@ VideoCodec CreateDecoderVideoCodec(const VideoReceiveStream::Decoder& decoder) { *(codec.VP9()) = VideoEncoder::GetDefaultVp9Settings(); } else if (codec.codecType == kVideoCodecH264) { *(codec.H264()) = VideoEncoder::GetDefaultH264Settings(); + codec.H264()->profile = + H264::ParseSdpProfileLevelId(decoder.codec_params)->profile; } codec.width = 320;