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

Unified Diff: webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc

Issue 2020593002: Refactor scaling. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Use buffer pool in VPMSpatialResampler. Address some nits. Created 4 years, 7 months 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/modules/video_coding/codecs/vp8/vp8_impl.cc
diff --git a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc
index 4c9a37cbf863aedb51054ef64b689a7857a6e203..1fb7476c572c5cbc6813a6d80614cf366dc39933 100644
--- a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc
+++ b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc
@@ -729,40 +729,40 @@ int VP8EncoderImpl::Encode(const VideoFrame& frame,
if (encoded_complete_callback_ == NULL)
return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
- if (quality_scaler_enabled_)
- quality_scaler_.OnEncodeFrame(frame);
- const VideoFrame& input_image =
- quality_scaler_enabled_ ? quality_scaler_.GetScaledFrame(frame) : frame;
-
- if (quality_scaler_enabled_ && (input_image.width() != codec_.width ||
- input_image.height() != codec_.height)) {
- int ret = UpdateCodecFrameSize(input_image);
- if (ret < 0)
- return ret;
+ rtc::scoped_refptr<VideoFrameBuffer> input_image = frame.video_frame_buffer();
+
+ if (quality_scaler_enabled_) {
+ quality_scaler_.OnEncodeFrame(frame.width(), frame.height());
+ input_image = quality_scaler_.GetScaledFrame(input_image);
+
+ if (input_image->width() != codec_.width ||
+ input_image->height() != codec_.height) {
+ int ret =
+ UpdateCodecFrameSize(input_image->width(), input_image->height());
+ if (ret < 0)
+ return ret;
+ }
}
// Since we are extracting raw pointers from |input_image| to
// |raw_images_[0]|, the resolution of these frames must match. Note that
// |input_image| might be scaled from |frame|. In that case, the resolution of
// |raw_images_[0]| should have been updated in UpdateCodecFrameSize.
- RTC_DCHECK_EQ(input_image.width(), static_cast<int>(raw_images_[0].d_w));
- RTC_DCHECK_EQ(input_image.height(), static_cast<int>(raw_images_[0].d_h));
+ RTC_DCHECK_EQ(input_image->width(), static_cast<int>(raw_images_[0].d_w));
+ RTC_DCHECK_EQ(input_image->height(), static_cast<int>(raw_images_[0].d_h));
// Image in vpx_image_t format.
// Input image is const. VP8's raw image is not defined as const.
raw_images_[0].planes[VPX_PLANE_Y] =
- const_cast<uint8_t*>(input_image.video_frame_buffer()->DataY());
+ const_cast<uint8_t*>(input_image->DataY());
raw_images_[0].planes[VPX_PLANE_U] =
- const_cast<uint8_t*>(input_image.video_frame_buffer()->DataU());
+ const_cast<uint8_t*>(input_image->DataU());
raw_images_[0].planes[VPX_PLANE_V] =
- const_cast<uint8_t*>(input_image.video_frame_buffer()->DataV());
+ const_cast<uint8_t*>(input_image->DataV());
- raw_images_[0].stride[VPX_PLANE_Y] =
- input_image.video_frame_buffer()->StrideY();
- raw_images_[0].stride[VPX_PLANE_U] =
- input_image.video_frame_buffer()->StrideU();
- raw_images_[0].stride[VPX_PLANE_V] =
- input_image.video_frame_buffer()->StrideV();
+ raw_images_[0].stride[VPX_PLANE_Y] = input_image->StrideY();
+ raw_images_[0].stride[VPX_PLANE_U] = input_image->StrideU();
+ raw_images_[0].stride[VPX_PLANE_V] = input_image->StrideV();
for (size_t i = 1; i < encoders_.size(); ++i) {
// Scale the image down a number of times by downsampling factor
@@ -781,7 +781,7 @@ int VP8EncoderImpl::Encode(const VideoFrame& frame,
}
vpx_enc_frame_flags_t flags[kMaxSimulcastStreams];
for (size_t i = 0; i < encoders_.size(); ++i) {
- int ret = temporal_layers_[i]->EncodeFlags(input_image.timestamp());
+ int ret = temporal_layers_[i]->EncodeFlags(frame.timestamp());
if (ret < 0) {
// Drop this frame.
return WEBRTC_VIDEO_CODEC_OK;
@@ -833,11 +833,11 @@ int VP8EncoderImpl::Encode(const VideoFrame& frame,
rps_.ReceivedRPSI(codec_specific_info->codecSpecific.VP8.pictureIdRPSI);
}
if (codec_specific_info->codecSpecific.VP8.hasReceivedSLI) {
- sendRefresh = rps_.ReceivedSLI(input_image.timestamp());
+ sendRefresh = rps_.ReceivedSLI(frame.timestamp());
}
for (size_t i = 0; i < encoders_.size(); ++i) {
flags[i] = rps_.EncodeFlags(picture_id_[i], sendRefresh,
- input_image.timestamp());
+ frame.timestamp());
}
} else {
if (codec_specific_info->codecSpecific.VP8.hasReceivedRPSI) {
@@ -905,17 +905,18 @@ int VP8EncoderImpl::Encode(const VideoFrame& frame,
if (error)
return WEBRTC_VIDEO_CODEC_ERROR;
timestamp_ += duration;
- return GetEncodedPartitions(input_image, only_predict_from_key_frame);
+ // Examines frame timestamps only.
+ return GetEncodedPartitions(frame, only_predict_from_key_frame);
}
// TODO(pbos): Make sure this works for properly for >1 encoders.
-int VP8EncoderImpl::UpdateCodecFrameSize(const VideoFrame& input_image) {
- codec_.width = input_image.width();
- codec_.height = input_image.height();
+int VP8EncoderImpl::UpdateCodecFrameSize(int width, int height) {
+ codec_.width = width;
+ codec_.height = height;
if (codec_.numberOfSimulcastStreams <= 1) {
// For now scaling is only used for single-layer streams.
- codec_.simulcastStream[0].width = input_image.width();
- codec_.simulcastStream[0].height = input_image.height();
+ codec_.simulcastStream[0].width = width;
+ codec_.simulcastStream[0].height = height;
}
// Update the cpu_speed setting for resolution change.
vpx_codec_control(&(encoders_[0]), VP8E_SET_CPUUSED,

Powered by Google App Engine
This is Rietveld 408576698