Chromium Code Reviews| Index: webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
| diff --git a/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
| index d3ce8208e41d0796babd006252bb298e4ff35afe..bb01b4b3c8dc9f2a3daa62e71d56d2c226946f0e 100644 |
| --- a/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
| +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
| @@ -22,6 +22,7 @@ |
| #include "libyuv/convert_from.h" |
| #include "webrtc/base/checks.h" |
| #include "webrtc/base/logging.h" |
| +#include "webrtc/common_video/h264/profile_level_id.h" |
| #include "webrtc/common_video/include/corevideo_frame_buffer.h" |
| #include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h" |
| #include "webrtc/system_wrappers/include/clock.h" |
| @@ -224,6 +225,69 @@ void VTCompressionOutputCallback(void* encoder, |
| encode_params->rotation); |
| } |
| +// Extract VideoToolbox profile out of the cricket::VideoCodec. If there is no |
| +// specific VideoToolbox profile for the specified level, AutoLevel will be |
| +// returned. The user must initialize the encoder with a resolution and |
| +// framerate conforming to the selected H264 level regardless. |
| +CFStringRef ExtractProfile(const cricket::VideoCodec& codec) { |
| + const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id = |
| + webrtc::H264::ParseSdpProfileLevelId(codec.params); |
| + RTC_DCHECK(profile_level_id); |
| + switch (profile_level_id->profile) { |
| + case webrtc::H264::kProfileConstrainedBaseline: |
| + case webrtc::H264::kProfileBaseline: |
| + switch (profile_level_id->level) { |
| + case webrtc::H264::kLevel4: |
| + return kVTProfileLevel_H264_Baseline_4_0; |
| + case webrtc::H264::kLevel4_2: |
| + return kVTProfileLevel_H264_Baseline_4_2; |
| + case webrtc::H264::kLevel5: |
| + return kVTProfileLevel_H264_Baseline_5_0; |
| + case webrtc::H264::kLevel5_1: |
| + return kVTProfileLevel_H264_Baseline_5_1; |
| + case webrtc::H264::kLevel5_2: |
| + return kVTProfileLevel_H264_Baseline_5_2; |
| + default: |
|
tkchin_webrtc
2016/11/14 18:27:27
usually in iOS code we use compiler error to catch
magjed_webrtc
2016/11/15 17:14:24
Cool, didn't know the compiler would help finding
|
| + return kVTProfileLevel_H264_Baseline_AutoLevel; |
| + } |
| + |
| + case webrtc::H264::kProfileMain: |
| + switch (profile_level_id->level) { |
| + case webrtc::H264::kLevel4_2: |
| + return kVTProfileLevel_H264_Main_4_2; |
| + case webrtc::H264::kLevel5_1: |
| + return kVTProfileLevel_H264_Main_5_1; |
| + case webrtc::H264::kLevel5_2: |
| + return kVTProfileLevel_H264_Main_5_2; |
| + default: |
| + return kVTProfileLevel_H264_Main_AutoLevel; |
| + } |
| + |
| + case webrtc::H264::kProfileConstrainedHigh: |
| + case webrtc::H264::kProfileHigh: |
| + switch (profile_level_id->level) { |
| + case webrtc::H264::kLevel3: |
| + return kVTProfileLevel_H264_High_3_0; |
| + case webrtc::H264::kLevel3_1: |
| + return kVTProfileLevel_H264_High_3_1; |
| + case webrtc::H264::kLevel3_2: |
| + return kVTProfileLevel_H264_High_3_2; |
| + case webrtc::H264::kLevel4: |
| + return kVTProfileLevel_H264_High_4_0; |
| + case webrtc::H264::kLevel4_1: |
| + return kVTProfileLevel_H264_High_4_1; |
| + case webrtc::H264::kLevel4_2: |
| + return kVTProfileLevel_H264_High_4_2; |
| + case webrtc::H264::kLevel5_1: |
| + return kVTProfileLevel_H264_High_5_1; |
| + case webrtc::H264::kLevel5_2: |
| + return kVTProfileLevel_H264_High_5_2; |
| + default: |
| + return kVTProfileLevel_H264_High_AutoLevel; |
| + } |
| + } |
| +} |
| + |
| } // namespace internal |
| namespace webrtc { |
| @@ -235,11 +299,12 @@ namespace webrtc { |
| // drastically reduced bitrate, so we want to avoid that. In steady state |
| // conditions, 0.95 seems to give us better overall bitrate over long periods |
| // of time. |
| -H264VideoToolboxEncoder::H264VideoToolboxEncoder() |
| +H264VideoToolboxEncoder::H264VideoToolboxEncoder( |
| + const cricket::VideoCodec& codec) |
| : callback_(nullptr), |
| compression_session_(nullptr), |
| - bitrate_adjuster_(Clock::GetRealTimeClock(), .5, .95) { |
| -} |
| + bitrate_adjuster_(Clock::GetRealTimeClock(), .5, .95), |
| + profile_(internal::ExtractProfile(codec)) {} |
| H264VideoToolboxEncoder::~H264VideoToolboxEncoder() { |
| DestroyCompressionSession(); |
| @@ -496,7 +561,7 @@ void H264VideoToolboxEncoder::ConfigureCompressionSession() { |
| kVTCompressionPropertyKey_RealTime, true); |
| internal::SetVTSessionProperty(compression_session_, |
| kVTCompressionPropertyKey_ProfileLevel, |
| - kVTProfileLevel_H264_Baseline_AutoLevel); |
| + profile_); |
| internal::SetVTSessionProperty(compression_session_, |
| kVTCompressionPropertyKey_AllowFrameReordering, |
| false); |