blob: 50a8d58e66785c80abf1851570b8327297d7544f [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
12#define MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Niels Möllera12c42a2018-07-25 16:05:48 +020014#include <stddef.h>
15#include <stdint.h>
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/numerics/exp_filter.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000018
kjellander@webrtc.orgb7ce9642015-11-18 23:04:10 +010019namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000020
niklase@google.com470e71d2011-07-07 08:21:25 +000021// The Frame Dropper implements a variant of the leaky bucket algorithm
22// for keeping track of when to drop frames to avoid bit rate
23// over use when the encoder can't keep its bit rate.
kjellander@webrtc.orgb7ce9642015-11-18 23:04:10 +010024class FrameDropper {
25 public:
philipel5908c712015-12-21 08:23:20 -080026 FrameDropper();
Rasmus Brandt260182d2018-09-03 12:59:51 +020027 ~FrameDropper();
stefan@webrtc.orgeb917922013-02-18 14:40:18 +000028
philipel5908c712015-12-21 08:23:20 -080029 // Resets the FrameDropper to its initial state.
Rasmus Brandt260182d2018-09-03 12:59:51 +020030 void Reset();
niklase@google.com470e71d2011-07-07 08:21:25 +000031
Rasmus Brandt260182d2018-09-03 12:59:51 +020032 void Enable(bool enable);
Åsa Perssonb52a4d92017-11-08 11:33:37 +010033
34 // Answers the question if it's time to drop a frame if we want to reach a
35 // given frame rate. Must be called for every frame.
philipel5908c712015-12-21 08:23:20 -080036 //
Åsa Perssonb52a4d92017-11-08 11:33:37 +010037 // Return value : True if we should drop the current frame.
Rasmus Brandt260182d2018-09-03 12:59:51 +020038 bool DropFrame();
Åsa Perssonb52a4d92017-11-08 11:33:37 +010039
40 // Updates the FrameDropper with the size of the latest encoded frame.
41 // The FrameDropper calculates a new drop ratio (can be seen as the
42 // probability to drop a frame) and updates its internal statistics.
philipel5908c712015-12-21 08:23:20 -080043 //
44 // Input:
Åsa Perssonb52a4d92017-11-08 11:33:37 +010045 // - framesize_bytes : The size of the latest frame returned
46 // from the encoder.
47 // - delta_frame : True if the encoder returned a key frame.
Rasmus Brandt260182d2018-09-03 12:59:51 +020048 void Fill(size_t framesize_bytes, bool delta_frame);
niklase@google.com470e71d2011-07-07 08:21:25 +000049
Rasmus Brandt260182d2018-09-03 12:59:51 +020050 void Leak(uint32_t input_framerate);
niklase@google.com470e71d2011-07-07 08:21:25 +000051
Åsa Perssonb52a4d92017-11-08 11:33:37 +010052 // Sets the target bit rate and the frame rate produced by the camera.
philipel5908c712015-12-21 08:23:20 -080053 //
54 // Input:
Åsa Perssonb52a4d92017-11-08 11:33:37 +010055 // - bitrate : The target bit rate.
Rasmus Brandt260182d2018-09-03 12:59:51 +020056 void SetRates(float bitrate, float incoming_frame_rate);
niklase@google.com470e71d2011-07-07 08:21:25 +000057
kjellander@webrtc.orgb7ce9642015-11-18 23:04:10 +010058 private:
philipel5908c712015-12-21 08:23:20 -080059 void UpdateRatio();
60 void CapAccumulator();
niklase@google.com470e71d2011-07-07 08:21:25 +000061
isheriff7620be82016-03-06 23:22:33 -080062 rtc::ExpFilter key_frame_ratio_;
63 rtc::ExpFilter delta_frame_size_avg_kbits_;
64
65 // Key frames and large delta frames are not immediately accumulated in the
66 // bucket since they can immediately overflow the bucket leading to large
67 // drops on the following packets that may be much smaller. Instead these
68 // large frames are accumulated over several frames when the bucket leaks.
69
70 // |large_frame_accumulation_spread_| represents the number of frames over
71 // which a large frame is accumulated.
72 float large_frame_accumulation_spread_;
73 // |large_frame_accumulation_count_| represents the number of frames left
74 // to finish accumulating a large frame.
75 int large_frame_accumulation_count_;
76 // |large_frame_accumulation_chunk_size_| represents the size of a single
77 // chunk for large frame accumulation.
78 float large_frame_accumulation_chunk_size_;
79
80 float accumulator_;
81 float accumulator_max_;
82 float target_bitrate_;
83 bool drop_next_;
84 rtc::ExpFilter drop_ratio_;
85 int drop_count_;
86 float incoming_frame_rate_;
87 bool was_below_max_;
88 bool enabled_;
89 const float max_drop_duration_secs_;
90};
niklase@google.com470e71d2011-07-07 08:21:25 +000091
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000092} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000093
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020094#endif // MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_