blob: 4a2c207af62844628b5181ab9d2ee917d14d709f [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
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000014#include "webrtc/common_video/libyuv/include/scaler.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:
Peter Boström6a688f52015-06-22 08:02:58 +020020 static const int kDefaultLowQpDenominator;
21 static const int kDefaultMinDownscaleDimension;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000022 struct Resolution {
23 int width;
24 int height;
25 };
26
27 QualityScaler();
Peter Boström17417702015-09-25 17:03:26 +020028 void Init(int low_qp_threshold,
29 int high_qp_threshold,
Alex Glazneva9d08922016-02-19 15:24:06 -080030 bool use_framerate_reduction,
31 int initial_bitrate_kbps,
32 int width,
33 int height);
jackychen61b4d512015-04-21 15:30:11 -070034 void SetMinResolution(int min_width, int min_height);
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000035 void ReportFramerate(int framerate);
jackychen98d8cf52015-05-21 11:12:02 -070036 void ReportQP(int qp);
jackychen61b4d512015-04-21 15:30:11 -070037 void ReportDroppedFrame();
38 void Reset(int framerate, int bitrate, int width, int height);
jackychen6e2ce6e2015-07-13 16:26:33 -070039 void OnEncodeFrame(const VideoFrame& frame);
40 Resolution GetScaledResolution() const;
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070041 const VideoFrame& GetScaledFrame(const VideoFrame& frame);
jackychen6e2ce6e2015-07-13 16:26:33 -070042 int GetTargetFramerate() const;
asapersson4306fc72015-10-19 00:35:21 -070043 int downscale_shift() const { return downscale_shift_; }
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000044
45 private:
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000046 void AdjustScale(bool up);
47 void ClearSamples();
48
49 Scaler scaler_;
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070050 VideoFrame scaled_frame_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000051
52 size_t num_samples_;
jackychen6e2ce6e2015-07-13 16:26:33 -070053 int framerate_;
54 int target_framerate_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000055 int low_qp_threshold_;
Peter Boström17417702015-09-25 17:03:26 +020056 int high_qp_threshold_;
jackychen61b4d512015-04-21 15:30:11 -070057 MovingAverage<int> framedrop_percent_;
jackychen98d8cf52015-05-21 11:12:02 -070058 MovingAverage<int> average_qp_;
jackychen6e2ce6e2015-07-13 16:26:33 -070059 Resolution res_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000060
61 int downscale_shift_;
jackychen6e2ce6e2015-07-13 16:26:33 -070062 int framerate_down_;
63 bool use_framerate_reduction_;
jackychen61b4d512015-04-21 15:30:11 -070064 int min_width_;
65 int min_height_;
pbos@webrtc.orga0d78272014-09-12 11:51:47 +000066};
67
68} // namespace webrtc
69
70#endif // WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_