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 9f435b2e1a6fa39c26935eb78c3c78eb9ae4542d..01f6d1172f5b41346b45730e087f98cbc532f659 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
+++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm |
@@ -360,18 +360,9 @@ int H264VideoToolboxEncoder::InitEncode(const VideoCodec* codec_settings, |
size_t max_payload_size) { |
RTC_DCHECK(codec_settings); |
RTC_DCHECK_EQ(codec_settings->codecType, kVideoCodecH264); |
- { |
- rtc::CritScope lock(&quality_scaler_crit_); |
- quality_scaler_.Init(internal::kLowH264QpThreshold, |
- internal::kHighH264QpThreshold, |
- codec_settings->startBitrate, codec_settings->width, |
- codec_settings->height, codec_settings->maxFramerate); |
- QualityScaler::Resolution res = quality_scaler_.GetScaledResolution(); |
- // TODO(tkchin): We may need to enforce width/height dimension restrictions |
- // to match what the encoder supports. |
- width_ = res.width; |
- height_ = res.height; |
- } |
+ |
+ width_ = codec_settings->width; |
+ height_ = codec_settings->height; |
// We can only set average bitrate on the HW encoder. |
target_bitrate_bps_ = codec_settings->startBitrate; |
bitrate_adjuster_.SetTargetBitrateBps(target_bitrate_bps_); |
@@ -386,6 +377,9 @@ int H264VideoToolboxEncoder::Encode( |
const VideoFrame& frame, |
const CodecSpecificInfo* codec_specific_info, |
const std::vector<FrameType>* frame_types) { |
+ // |input_frame| size should always match codec settings. |
+ RTC_DCHECK_EQ(frame.width(), width_); |
+ RTC_DCHECK_EQ(frame.height(), height_); |
RTC_DCHECK(!frame.IsZeroSize()); |
if (!callback_ || !compression_session_) { |
return WEBRTC_VIDEO_CODEC_UNINITIALIZED; |
@@ -399,18 +393,6 @@ int H264VideoToolboxEncoder::Encode( |
#endif |
bool is_keyframe_required = false; |
- quality_scaler_.OnEncodeFrame(frame.width(), frame.height()); |
- const QualityScaler::Resolution scaled_res = |
- quality_scaler_.GetScaledResolution(); |
- |
- if (scaled_res.width != width_ || scaled_res.height != height_) { |
- width_ = scaled_res.width; |
- height_ = scaled_res.height; |
- int ret = ResetCompressionSession(); |
- if (ret < 0) |
- return ret; |
- } |
- |
// Get a pixel buffer from the pool and copy frame data over. |
CVPixelBufferPoolRef pixel_buffer_pool = |
VTCompressionSessionGetPixelBufferPool(compression_session_); |
@@ -457,11 +439,8 @@ int H264VideoToolboxEncoder::Encode( |
if (!pixel_buffer) { |
return WEBRTC_VIDEO_CODEC_ERROR; |
} |
- // TODO(magjed): Optimize by merging scaling and NV12 pixel buffer |
- // conversion once libyuv::MergeUVPlanes is available. |
- rtc::scoped_refptr<VideoFrameBuffer> scaled_i420_buffer = |
- quality_scaler_.GetScaledBuffer(frame.video_frame_buffer()); |
- if (!internal::CopyVideoFrameToPixelBuffer(scaled_i420_buffer, |
+ RTC_DCHECK(pixel_buffer); |
+ if (!internal::CopyVideoFrameToPixelBuffer(frame.video_frame_buffer(), |
pixel_buffer)) { |
LOG(LS_ERROR) << "Failed to copy frame data."; |
CVBufferRelease(pixel_buffer); |
@@ -517,11 +496,6 @@ int H264VideoToolboxEncoder::RegisterEncodeCompleteCallback( |
return WEBRTC_VIDEO_CODEC_OK; |
} |
-void H264VideoToolboxEncoder::OnDroppedFrame() { |
- rtc::CritScope lock(&quality_scaler_crit_); |
- quality_scaler_.ReportDroppedFrame(); |
-} |
- |
int H264VideoToolboxEncoder::SetChannelParameters(uint32_t packet_loss, |
int64_t rtt) { |
// Encoder doesn't know anything about packet loss or rtt so just return. |
@@ -533,10 +507,6 @@ int H264VideoToolboxEncoder::SetRates(uint32_t new_bitrate_kbit, |
target_bitrate_bps_ = 1000 * new_bitrate_kbit; |
bitrate_adjuster_.SetTargetBitrateBps(target_bitrate_bps_); |
SetBitrateBps(bitrate_adjuster_.GetAdjustedBitrateBps()); |
- |
- rtc::CritScope lock(&quality_scaler_crit_); |
- quality_scaler_.ReportFramerate(frame_rate); |
- |
return WEBRTC_VIDEO_CODEC_OK; |
} |
@@ -709,8 +679,6 @@ void H264VideoToolboxEncoder::OnEncodedFrame( |
} |
if (info_flags & kVTEncodeInfo_FrameDropped) { |
LOG(LS_INFO) << "H264 encode dropped frame."; |
- rtc::CritScope lock(&quality_scaler_crit_); |
- quality_scaler_.ReportDroppedFrame(); |
return; |
} |
@@ -752,20 +720,20 @@ void H264VideoToolboxEncoder::OnEncodedFrame( |
frame.rotation_ = rotation; |
h264_bitstream_parser_.ParseBitstream(buffer->data(), buffer->size()); |
- int qp; |
- if (h264_bitstream_parser_.GetLastSliceQp(&qp)) { |
- rtc::CritScope lock(&quality_scaler_crit_); |
- quality_scaler_.ReportQP(qp); |
- frame.qp_ = qp; |
- } |
+ h264_bitstream_parser_.GetLastSliceQp(&frame.qp_); |
- EncodedImageCallback::Result result = |
+ EncodedImageCallback::Result res = |
callback_->OnEncodedImage(frame, &codec_specific_info, header.get()); |
- if (result.error != EncodedImageCallback::Result::OK) { |
- LOG(LS_ERROR) << "Encode callback failed: " << result.error; |
+ if (res.error != EncodedImageCallback::Result::OK) { |
+ LOG(LS_ERROR) << "Encode callback failed: " << res.error; |
return; |
} |
bitrate_adjuster_.Update(frame._size); |
} |
+VideoEncoder::ScalingSettings H264VideoToolboxEncoder::GetScalingSettings() |
+ const { |
+ return VideoEncoder::ScalingSettings(true, internal::kLowH264QpThreshold, |
+ internal::kHighH264QpThreshold); |
+} |
} // namespace webrtc |