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 WEBRTC_MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
12 #define WEBRTC_MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
13 
14 #include <cstddef>
15 
16 #include "webrtc/base/exp_filter.h"
17 #include "webrtc/typedefs.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   explicit FrameDropper(float max_time_drops);
~FrameDropper()28   virtual ~FrameDropper() {}
29 
30   // Resets the FrameDropper to its initial state.
31   // This means that the frameRateWeight is set to its
32   // default value as well.
33   virtual void Reset();
34 
35   virtual void Enable(bool enable);
36   // Answers the question if it's time to drop a frame
37   // if we want to reach a given frame rate. Must be
38   // called for every frame.
39   //
40   // Return value     : True if we should drop the current frame
41   virtual bool DropFrame();
42   // Updates the FrameDropper with the size of the latest encoded
43   // frame. The FrameDropper calculates a new drop ratio (can be
44   // seen as the probability to drop a frame) and updates its
45   // internal statistics.
46   //
47   // Input:
48   //          - frameSizeBytes    : The size of the latest frame
49   //                                returned from the encoder.
50   //          - deltaFrame        : True if the encoder returned
51   //                                a key frame.
52   virtual void Fill(size_t frameSizeBytes, bool deltaFrame);
53 
54   virtual void Leak(uint32_t inputFrameRate);
55 
56   void UpdateNack(uint32_t nackBytes);
57 
58   // Sets the target bit rate and the frame rate produced by
59   // the camera.
60   //
61   // Input:
62   //          - bitRate       : The target bit rate
63   virtual void SetRates(float bitRate, float incoming_frame_rate);
64 
65   // Return value     : The current average frame rate produced
66   //                    if the DropFrame() function is used as
67   //                    instruction of when to drop frames.
68   virtual float ActualFrameRate(uint32_t inputFrameRate) const;
69 
70  private:
71   void FillBucket(float inKbits, float outKbits);
72   void UpdateRatio();
73   void CapAccumulator();
74 
75   rtc::ExpFilter _keyFrameSizeAvgKbits;
76   rtc::ExpFilter _keyFrameRatio;
77   float _keyFrameSpreadFrames;
78   int32_t _keyFrameCount;
79   float _accumulator;
80   float _accumulatorMax;
81   float _targetBitRate;
82   bool _dropNext;
83   rtc::ExpFilter _dropRatio;
84   int32_t _dropCount;
85   float _windowSize;
86   float _incoming_frame_rate;
87   bool _wasBelowMax;
88   bool _enabled;
89   bool _fastMode;
90   float _cap_buffer_size;
91   float _max_time_drops;
92 };  // end of VCMFrameDropper class
93 
94 }  // namespace webrtc
95 
96 #endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
97