blob: 060cd893ffe23152613e0219ee87dd11d9590e13 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org8fe03af2012-01-23 14:56:14 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#ifndef WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPTIMIZATION_H_
12#define WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPTIMIZATION_H_
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000013
14#include <list>
kwiberg3f55dea2016-02-29 05:51:59 -080015#include <memory>
niklase@google.com470e71d2011-07-07 08:21:25 +000016
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010017#include "webrtc/modules/include/module_common_types.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010018#include "webrtc/modules/video_coding/include/video_coding.h"
19#include "webrtc/modules/video_coding/media_opt_util.h"
20#include "webrtc/modules/video_coding/qm_select.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010021#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000022
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000023namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000024
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000025// Forward declarations.
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +000026class Clock;
stefan@webrtc.orgeb917922013-02-18 14:40:18 +000027class FrameDropper;
niklase@google.com470e71d2011-07-07 08:21:25 +000028class VCMContentMetricsProcessing;
niklase@google.com470e71d2011-07-07 08:21:25 +000029
stefan@webrtc.orga64300a2013-03-04 15:24:40 +000030namespace media_optimization {
31
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000032class MediaOptimization {
33 public:
stefan@webrtc.org34c5da62014-04-11 14:08:35 +000034 explicit MediaOptimization(Clock* clock);
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000035 ~MediaOptimization();
niklase@google.com470e71d2011-07-07 08:21:25 +000036
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000037 // TODO(andresp): Can Reset and SetEncodingData be done at construction time
38 // only?
39 void Reset();
40
41 // Informs media optimization of initial encoding state.
42 void SetEncodingData(VideoCodecType send_codec_type,
43 int32_t max_bit_rate,
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000044 uint32_t bit_rate,
45 uint16_t width,
46 uint16_t height,
Peter Boströmdf664532015-05-12 12:22:14 +020047 uint32_t frame_rate,
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000048 int num_temporal_layers,
49 int32_t mtu);
niklase@google.com470e71d2011-07-07 08:21:25 +000050
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000051 // Sets target rates for the encoder given the channel parameters.
52 // Inputs: target bitrate - the encoder target bitrate in bits/s.
53 // fraction_lost - packet loss rate in % in the network.
54 // round_trip_time_ms - round trip time in milliseconds.
55 // min_bit_rate - the bit rate of the end-point with lowest rate.
56 // max_bit_rate - the bit rate of the end-point with highest rate.
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000057 // TODO(andresp): Find if the callbacks can be triggered only after releasing
58 // an internal critical section.
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000059 uint32_t SetTargetRates(uint32_t target_bitrate,
60 uint8_t fraction_lost,
pkasting@chromium.org16825b12015-01-12 21:51:21 +000061 int64_t round_trip_time_ms,
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000062 VCMProtectionCallback* protection_callback,
63 VCMQMSettingsCallback* qmsettings_callback);
niklase@google.com470e71d2011-07-07 08:21:25 +000064
pbosba8c15b2015-07-14 09:36:34 -070065 void SetProtectionMethod(VCMProtectionMethodEnum method);
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000066 void EnableQM(bool enable);
67 void EnableFrameDropper(bool enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000068
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000069 // Lets the sender suspend video when the rate drops below
70 // |threshold_bps|, and turns back on when the rate goes back up above
71 // |threshold_bps| + |window_bps|.
72 void SuspendBelowMinBitrate(int threshold_bps, int window_bps);
73 bool IsVideoSuspended() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000074
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000075 bool DropFrame();
niklase@google.com470e71d2011-07-07 08:21:25 +000076
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000077 void UpdateContentData(const VideoContentMetrics* content_metrics);
niklase@google.com470e71d2011-07-07 08:21:25 +000078
pbos@webrtc.org273a4142014-12-01 15:23:21 +000079 // Informs Media Optimization of encoded output.
80 int32_t UpdateWithEncodedData(const EncodedImage& encoded_image);
mikhal@google.comb29d9402011-08-01 16:39:20 +000081
Erik Språng66a641a2015-06-11 14:20:07 +020082 // InputFrameRate 0 = no frame rate estimate available.
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000083 uint32_t InputFrameRate();
84 uint32_t SentFrameRate();
85 uint32_t SentBitRate();
niklase@google.com470e71d2011-07-07 08:21:25 +000086
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +000087 private:
philipel9d3ab612015-12-21 04:12:39 -080088 enum { kFrameCountHistorySize = 90 };
89 enum { kFrameHistoryWinMs = 2000 };
90 enum { kBitrateAverageWinMs = 1000 };
niklase@google.com470e71d2011-07-07 08:21:25 +000091
andresp@webrtc.orge682aa52013-12-19 10:59:48 +000092 struct EncodedFrameSample;
93 typedef std::list<EncodedFrameSample> FrameSampleList;
niklase@google.com470e71d2011-07-07 08:21:25 +000094
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +000095 void UpdateIncomingFrameRate() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
96 void PurgeOldFrameSamples(int64_t now_ms)
97 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
98 void UpdateSentBitrate(int64_t now_ms) EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
99 void UpdateSentFramerate() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000100
andresp@webrtc.orge682aa52013-12-19 10:59:48 +0000101 // Computes new Quality Mode.
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000102 int32_t SelectQuality(VCMQMSettingsCallback* qmsettings_callback)
103 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
andresp@webrtc.orge682aa52013-12-19 10:59:48 +0000104
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +0000105 // Verifies if QM settings differ from default, i.e. if an update is required.
106 // Computes actual values, as will be sent to the encoder.
andresp@webrtc.orge682aa52013-12-19 10:59:48 +0000107 bool QMUpdate(VCMResolutionScale* qm,
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000108 VCMQMSettingsCallback* qmsettings_callback)
109 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000110
henrik.lundin@webrtc.orgbec11ef2013-09-23 19:54:25 +0000111 // Checks if we should make a QM change. Return true if yes, false otherwise.
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000112 bool CheckStatusForQMchange() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000113
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000114 void ProcessIncomingFrameRate(int64_t now)
115 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
niklase@google.com470e71d2011-07-07 08:21:25 +0000116
henrik.lundin@webrtc.orgce8e0932013-11-18 12:18:43 +0000117 // Checks conditions for suspending the video. The method compares
pbos73674632015-10-29 15:45:00 -0700118 // |video_target_bitrate_| with the threshold values for suspension, and
119 // changes the state of |video_suspended_| accordingly.
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000120 void CheckSuspendConditions() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
henrik.lundin@webrtc.org544b17c2013-09-26 12:05:15 +0000121
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000122 void SetEncodingDataInternal(VideoCodecType send_codec_type,
123 int32_t max_bit_rate,
124 uint32_t frame_rate,
125 uint32_t bit_rate,
126 uint16_t width,
127 uint16_t height,
128 int num_temporal_layers,
129 int32_t mtu)
130 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
131
132 uint32_t InputFrameRateInternal() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
133
134 uint32_t SentFrameRateInternal() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
135
136 // Protect all members.
kwiberg3f55dea2016-02-29 05:51:59 -0800137 std::unique_ptr<CriticalSectionWrapper> crit_sect_;
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000138
139 Clock* clock_ GUARDED_BY(crit_sect_);
140 int32_t max_bit_rate_ GUARDED_BY(crit_sect_);
141 VideoCodecType send_codec_type_ GUARDED_BY(crit_sect_);
142 uint16_t codec_width_ GUARDED_BY(crit_sect_);
143 uint16_t codec_height_ GUARDED_BY(crit_sect_);
144 float user_frame_rate_ GUARDED_BY(crit_sect_);
kwiberg3f55dea2016-02-29 05:51:59 -0800145 std::unique_ptr<FrameDropper> frame_dropper_ GUARDED_BY(crit_sect_);
146 std::unique_ptr<VCMLossProtectionLogic> loss_prot_logic_
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000147 GUARDED_BY(crit_sect_);
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000148 uint8_t fraction_lost_ GUARDED_BY(crit_sect_);
149 uint32_t send_statistics_[4] GUARDED_BY(crit_sect_);
150 uint32_t send_statistics_zero_encode_ GUARDED_BY(crit_sect_);
151 int32_t max_payload_size_ GUARDED_BY(crit_sect_);
pbos73674632015-10-29 15:45:00 -0700152 int video_target_bitrate_ GUARDED_BY(crit_sect_);
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000153 float incoming_frame_rate_ GUARDED_BY(crit_sect_);
154 int64_t incoming_frame_times_[kFrameCountHistorySize] GUARDED_BY(crit_sect_);
155 bool enable_qm_ GUARDED_BY(crit_sect_);
156 std::list<EncodedFrameSample> encoded_frame_samples_ GUARDED_BY(crit_sect_);
157 uint32_t avg_sent_bit_rate_bps_ GUARDED_BY(crit_sect_);
158 uint32_t avg_sent_framerate_ GUARDED_BY(crit_sect_);
159 uint32_t key_frame_cnt_ GUARDED_BY(crit_sect_);
160 uint32_t delta_frame_cnt_ GUARDED_BY(crit_sect_);
kwiberg3f55dea2016-02-29 05:51:59 -0800161 std::unique_ptr<VCMContentMetricsProcessing> content_ GUARDED_BY(crit_sect_);
162 std::unique_ptr<VCMQmResolution> qm_resolution_ GUARDED_BY(crit_sect_);
wuchengli@chromium.orgae7cfd72014-06-30 08:01:47 +0000163 int64_t last_qm_update_time_ GUARDED_BY(crit_sect_);
164 int64_t last_change_time_ GUARDED_BY(crit_sect_); // Content/user triggered.
165 int num_layers_ GUARDED_BY(crit_sect_);
166 bool suspension_enabled_ GUARDED_BY(crit_sect_);
167 bool video_suspended_ GUARDED_BY(crit_sect_);
168 int suspension_threshold_bps_ GUARDED_BY(crit_sect_);
169 int suspension_window_bps_ GUARDED_BY(crit_sect_);
andresp@webrtc.orge682aa52013-12-19 10:59:48 +0000170};
stefan@webrtc.orga64300a2013-03-04 15:24:40 +0000171} // namespace media_optimization
172} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000173
Henrik Kjellander2557b862015-11-18 22:00:21 +0100174#endif // WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPTIMIZATION_H_