Add H264 profile to webrtc::VideoCodecH264 and webrtc::VideoPayload

It's necessary to check H264 profile information as well as payload name
in PayloadIsCompatible in RTPPayloadRegistry.

BUG=webrtc:6743

Review-Url: https://codereview.webrtc.org/2525693003
Cr-Commit-Position: refs/heads/master@{#15248}
This commit is contained in:
magjed 2016-11-25 07:14:23 -08:00 committed by Commit bot
parent 1da1a09bf5
commit bdbc4b7ef5
6 changed files with 31 additions and 10 deletions

View File

@ -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

View File

@ -15,6 +15,7 @@
#include <string>
#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<std::string, std::string> 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 {

View File

@ -15,6 +15,7 @@
#include <list>
#include <vector>
#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 {

View File

@ -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) {

View File

@ -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;
}

View File

@ -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;