Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Unified Diff: webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h ('k') | webrtc/video/overuse_frame_detector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698