| Index: webrtc/modules/video_coding/utility/quality_scaler.cc
|
| diff --git a/webrtc/modules/video_coding/utility/quality_scaler.cc b/webrtc/modules/video_coding/utility/quality_scaler.cc
|
| index bb60ee036e381dc9762e3b9a030acd257582eed5..541d0d431fb413944ca42ffdc03f3a2b2b7f4766 100644
|
| --- a/webrtc/modules/video_coding/utility/quality_scaler.cc
|
| +++ b/webrtc/modules/video_coding/utility/quality_scaler.cc
|
| @@ -7,6 +7,7 @@
|
| * in the file PATENTS. All contributing project authors may
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
| +
|
| #include "webrtc/modules/video_coding/utility/quality_scaler.h"
|
|
|
| namespace webrtc {
|
| @@ -94,11 +95,11 @@ void QualityScaler::ReportDroppedFrame() {
|
| framedrop_percent_.AddSample(100);
|
| }
|
|
|
| -void QualityScaler::OnEncodeFrame(const VideoFrame& frame) {
|
| +void QualityScaler::OnEncodeFrame(int width, int height) {
|
| // Should be set through InitEncode -> Should be set by now.
|
| - assert(low_qp_threshold_ >= 0);
|
| - assert(num_samples_upscale_ > 0);
|
| - assert(num_samples_downscale_ > 0);
|
| + RTC_DCHECK_GE(low_qp_threshold_, 0);
|
| + RTC_DCHECK_GT(num_samples_upscale_, 0u);
|
| + RTC_DCHECK_GT(num_samples_downscale_, 0u);
|
|
|
| // Update scale factor.
|
| int avg_drop = 0;
|
| @@ -113,38 +114,31 @@ void QualityScaler::OnEncodeFrame(const VideoFrame& frame) {
|
| avg_qp <= low_qp_threshold_) {
|
| AdjustScale(true);
|
| }
|
| - UpdateTargetResolution(frame.width(), frame.height());
|
| + UpdateTargetResolution(width, height);
|
| }
|
|
|
| QualityScaler::Resolution QualityScaler::GetScaledResolution() const {
|
| return res_;
|
| }
|
|
|
| -const VideoFrame& QualityScaler::GetScaledFrame(const VideoFrame& frame) {
|
| +rtc::scoped_refptr<VideoFrameBuffer> QualityScaler::GetScaledBuffer(
|
| + const rtc::scoped_refptr<VideoFrameBuffer>& frame) {
|
| Resolution res = GetScaledResolution();
|
| - if (res.width == frame.width())
|
| - return frame;
|
| + int src_width = frame->width();
|
| + int src_height = frame->height();
|
|
|
| - scaler_.Set(frame.width(), frame.height(), res.width, res.height, kI420,
|
| - kI420, kScaleBox);
|
| - if (scaler_.Scale(frame, &scaled_frame_) != 0)
|
| + if (res.width == src_width && res.height == src_height)
|
| return frame;
|
| + rtc::scoped_refptr<I420Buffer> scaled_buffer =
|
| + pool_.CreateBuffer(res.width, res.height);
|
| +
|
| + scaled_buffer->ScaleFrom(frame);
|
|
|
| - // TODO(perkj): Refactor the scaler to not own |scaled_frame|. VideoFrame are
|
| - // just thin wrappers so instead the scaler should return a
|
| - // rtc::scoped_refptr<VideoFrameBuffer> and a new VideoFrame be created with
|
| - // the meta data from |frame|. That way we would not have to set all these
|
| - // meta data.
|
| - scaled_frame_.set_ntp_time_ms(frame.ntp_time_ms());
|
| - scaled_frame_.set_timestamp(frame.timestamp());
|
| - scaled_frame_.set_render_time_ms(frame.render_time_ms());
|
| - scaled_frame_.set_rotation(frame.rotation());
|
| -
|
| - return scaled_frame_;
|
| + return scaled_buffer;
|
| }
|
|
|
| void QualityScaler::UpdateTargetResolution(int frame_width, int frame_height) {
|
| - assert(downscale_shift_ >= 0);
|
| + RTC_DCHECK_GE(downscale_shift_, 0);
|
| int shifts_performed = 0;
|
| for (int shift = downscale_shift_;
|
| shift > 0 && (frame_width / 2 >= kMinDownscaleDimension) &&
|
|
|