1 /* 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 11 #ifndef MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_ 12 #define MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include "rtc_base/numerics/exp_filter.h" 18 19 namespace webrtc { 20 21 // 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. 24 class FrameDropper { 25 public: 26 FrameDropper(); 27 ~FrameDropper(); 28 29 // Resets the FrameDropper to its initial state. 30 void Reset(); 31 32 void Enable(bool enable); 33 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. 36 // 37 // Return value : True if we should drop the current frame. 38 bool DropFrame(); 39 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. 43 // 44 // Input: 45 // - framesize_bytes : The size of the latest frame returned 46 // from the encoder. 47 // - delta_frame : True if the encoder returned a key frame. 48 void Fill(size_t framesize_bytes, bool delta_frame); 49 50 void Leak(uint32_t input_framerate); 51 52 // Sets the target bit rate and the frame rate produced by the camera. 53 // 54 // Input: 55 // - bitrate : The target bit rate. 56 void SetRates(float bitrate, float incoming_frame_rate); 57 58 private: 59 void UpdateRatio(); 60 void CapAccumulator(); 61 62 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 }; 91 92 } // namespace webrtc 93 94 #endif // MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_ 95