blob: 7176d4966eb46ed93c0506edd061c277d7e3f0e7 [file] [log] [blame]
pbos@webrtc.orga0d78272014-09-12 11:51:47 +00001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
12#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
13
Niels Möller718a7632016-06-13 13:06:01 +020014#include "webrtc/common_video/include/i420_buffer_pool.h"
kjellander@webrtc.orgb7ce9642015-11-18 23:04:10 +010015#include "webrtc/modules/video_coding/utility/moving_average.h"
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000016
17namespace webrtc {
18class QualityScaler {
19 public:
20 struct Resolution {
21 int width;
22 int height;
23 };
24
25 QualityScaler();
Peter Boström17417702015-09-25 17:03:26 +020026 void Init(int low_qp_threshold,
27 int high_qp_threshold,
Alex Glazneva9d08922016-02-19 15:24:06 -080028 int initial_bitrate_kbps,
29 int width,
pboscbac40d2016-04-13 02:51:02 -070030 int height,
31 int fps);
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000032 void ReportFramerate(int framerate);
jackychen98d8cf52015-05-21 11:12:02 -070033 void ReportQP(int qp);
jackychen61b4d512015-04-21 15:30:11 -070034 void ReportDroppedFrame();
Niels Möller718a7632016-06-13 13:06:01 +020035 void OnEncodeFrame(int width, int height);
jackychen6e2ce6e2015-07-13 16:26:33 -070036 Resolution GetScaledResolution() const;
Niels Möller718a7632016-06-13 13:06:01 +020037 rtc::scoped_refptr<VideoFrameBuffer> GetScaledBuffer(
38 const rtc::scoped_refptr<VideoFrameBuffer>& frame);
asapersson4306fc72015-10-19 00:35:21 -070039 int downscale_shift() const { return downscale_shift_; }
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000040
pbos1f534522016-05-13 11:05:35 -070041 // QP is obtained from VP8-bitstream for HW, so the QP corresponds to the
42 // bitstream range of [0, 127] and not the user-level range of [0,63].
43 static const int kLowVp8QpThreshold;
44 static const int kBadVp8QpThreshold;
45
46 // H264 QP is in the range [0, 51].
47 static const int kLowH264QpThreshold;
48 static const int kBadH264QpThreshold;
49
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000050 private:
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000051 void AdjustScale(bool up);
Peter Boström01bcbd02016-03-22 21:44:29 +010052 void UpdateTargetResolution(int frame_width, int frame_height);
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000053 void ClearSamples();
pboscbac40d2016-04-13 02:51:02 -070054 void UpdateSampleCounts();
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000055
Niels Möller718a7632016-06-13 13:06:01 +020056 I420BufferPool pool_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000057
pboscbac40d2016-04-13 02:51:02 -070058 size_t num_samples_downscale_;
59 size_t num_samples_upscale_;
60 int measure_seconds_upscale_;
61 MovingAverage<int> average_qp_upscale_;
62 MovingAverage<int> average_qp_downscale_;
63
jackychen6e2ce6e2015-07-13 16:26:33 -070064 int framerate_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000065 int low_qp_threshold_;
Peter Boström17417702015-09-25 17:03:26 +020066 int high_qp_threshold_;
jackychen61b4d512015-04-21 15:30:11 -070067 MovingAverage<int> framedrop_percent_;
jackychen6e2ce6e2015-07-13 16:26:33 -070068 Resolution res_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000069
70 int downscale_shift_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000071};
72
73} // namespace webrtc
74
75#endif // WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_