• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_INCLUDE_FRAME_DROPPER_H_
12 #define WEBRTC_MODULES_VIDEO_CODING_UTILITY_INCLUDE_FRAME_DROPPER_H_
13 
14 #include "webrtc/base/exp_filter.h"
15 #include "webrtc/typedefs.h"
16 
17 namespace webrtc
18 {
19 
20 // The Frame Dropper implements a variant of the leaky bucket algorithm
21 // for keeping track of when to drop frames to avoid bit rate
22 // over use when the encoder can't keep its bit rate.
23 class FrameDropper
24 {
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(uint32_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_INCLUDE_FRAME_DROPPER_H_
97