• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   *  Copyright (c) 2012 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_MAIN_SOURCE_JITTER_BUFFER_H_
12  #define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_
13  
14  #include <list>
15  #include <map>
16  #include <set>
17  #include <vector>
18  
19  #include "webrtc/base/constructormagic.h"
20  #include "webrtc/modules/interface/module_common_types.h"
21  #include "webrtc/modules/video_coding/main/interface/video_coding.h"
22  #include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
23  #include "webrtc/modules/video_coding/main/source/decoding_state.h"
24  #include "webrtc/modules/video_coding/main/source/inter_frame_delay.h"
25  #include "webrtc/modules/video_coding/main/source/jitter_buffer_common.h"
26  #include "webrtc/modules/video_coding/main/source/jitter_estimator.h"
27  #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
28  #include "webrtc/typedefs.h"
29  
30  namespace webrtc {
31  
32  enum VCMNackMode {
33    kNack,
34    kNoNack
35  };
36  
37  // forward declarations
38  class Clock;
39  class EventFactory;
40  class EventWrapper;
41  class VCMFrameBuffer;
42  class VCMPacket;
43  class VCMEncodedFrame;
44  
45  typedef std::list<VCMFrameBuffer*> UnorderedFrameList;
46  
47  struct VCMJitterSample {
VCMJitterSampleVCMJitterSample48    VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {}
49    uint32_t timestamp;
50    uint32_t frame_size;
51    int64_t latest_packet_time;
52  };
53  
54  class TimestampLessThan {
55   public:
operator()56    bool operator() (const uint32_t& timestamp1,
57                     const uint32_t& timestamp2) const {
58      return IsNewerTimestamp(timestamp2, timestamp1);
59    }
60  };
61  
62  class FrameList
63      : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
64   public:
65    void InsertFrame(VCMFrameBuffer* frame);
66    VCMFrameBuffer* FindFrame(uint32_t timestamp) const;
67    VCMFrameBuffer* PopFrame(uint32_t timestamp);
68    VCMFrameBuffer* Front() const;
69    VCMFrameBuffer* Back() const;
70    int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
71        UnorderedFrameList* free_frames);
72    int CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
73        UnorderedFrameList* free_frames);
74    void Reset(UnorderedFrameList* free_frames);
75  };
76  
77  class VCMJitterBuffer {
78   public:
79    VCMJitterBuffer(Clock* clock,
80                    EventFactory* event_factory);
81    virtual ~VCMJitterBuffer();
82  
83    // Makes |this| a deep copy of |rhs|.
84    void CopyFrom(const VCMJitterBuffer& rhs);
85  
86    // Initializes and starts jitter buffer.
87    void Start();
88  
89    // Signals all internal events and stops the jitter buffer.
90    void Stop();
91  
92    // Returns true if the jitter buffer is running.
93    bool Running() const;
94  
95    // Empty the jitter buffer of all its data.
96    void Flush();
97  
98    // Get the number of received frames, by type, since the jitter buffer
99    // was started.
100    std::map<FrameType, uint32_t> FrameStatistics() const;
101  
102    // The number of packets discarded by the jitter buffer because the decoder
103    // won't be able to decode them.
104    int num_not_decodable_packets() const;
105  
106    // Gets number of packets discarded by the jitter buffer.
107    int num_discarded_packets() const;
108  
109    // Statistics, Calculate frame and bit rates.
110    void IncomingRateStatistics(unsigned int* framerate,
111                                unsigned int* bitrate);
112  
113    // Checks if the packet sequence will be complete if the next frame would be
114    // grabbed for decoding. That is, if a frame has been lost between the
115    // last decoded frame and the next, or if the next frame is missing one
116    // or more packets.
117    bool CompleteSequenceWithNextFrame();
118  
119    // Wait |max_wait_time_ms| for a complete frame to arrive.
120    // The function returns true once such a frame is found, its corresponding
121    // timestamp is returned. Otherwise, returns false.
122    bool NextCompleteTimestamp(uint32_t max_wait_time_ms, uint32_t* timestamp);
123  
124    // Locates a frame for decoding (even an incomplete) without delay.
125    // The function returns true once such a frame is found, its corresponding
126    // timestamp is returned. Otherwise, returns false.
127    bool NextMaybeIncompleteTimestamp(uint32_t* timestamp);
128  
129    // Extract frame corresponding to input timestamp.
130    // Frame will be set to a decoding state.
131    VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp);
132  
133    // Releases a frame returned from the jitter buffer, should be called when
134    // done with decoding.
135    void ReleaseFrame(VCMEncodedFrame* frame);
136  
137    // Returns the time in ms when the latest packet was inserted into the frame.
138    // Retransmitted is set to true if any of the packets belonging to the frame
139    // has been retransmitted.
140    int64_t LastPacketTime(const VCMEncodedFrame* frame,
141                           bool* retransmitted) const;
142  
143    // Inserts a packet into a frame returned from GetFrame().
144    // If the return value is <= 0, |frame| is invalidated and the pointer must
145    // be dropped after this function returns.
146    VCMFrameBufferEnum InsertPacket(const VCMPacket& packet,
147                                    bool* retransmitted);
148  
149    // Returns the estimated jitter in milliseconds.
150    uint32_t EstimatedJitterMs();
151  
152    // Updates the round-trip time estimate.
153    void UpdateRtt(uint32_t rtt_ms);
154  
155    // Set the NACK mode. |highRttNackThreshold| is an RTT threshold in ms above
156    // which NACK will be disabled if the NACK mode is |kNackHybrid|, -1 meaning
157    // that NACK is always enabled in the hybrid mode.
158    // |lowRttNackThreshold| is an RTT threshold in ms below which we expect to
159    // rely on NACK only, and therefore are using larger buffers to have time to
160    // wait for retransmissions.
161    void SetNackMode(VCMNackMode mode, int low_rtt_nack_threshold_ms,
162                     int high_rtt_nack_threshold_ms);
163  
164    void SetNackSettings(size_t max_nack_list_size,
165                         int max_packet_age_to_nack,
166                         int max_incomplete_time_ms);
167  
168    // Returns the current NACK mode.
169    VCMNackMode nack_mode() const;
170  
171    // Returns a list of the sequence numbers currently missing.
172    uint16_t* GetNackList(uint16_t* nack_list_size, bool* request_key_frame);
173  
174    // Set decode error mode - Should not be changed in the middle of the
175    // session. Changes will not influence frames already in the buffer.
176    void SetDecodeErrorMode(VCMDecodeErrorMode error_mode);
177    int64_t LastDecodedTimestamp() const;
decode_error_mode()178    VCMDecodeErrorMode decode_error_mode() const {return decode_error_mode_;}
179  
180    // Used to compute time of complete continuous frames. Returns the timestamps
181    // corresponding to the start and end of the continuous complete buffer.
182    void RenderBufferSize(uint32_t* timestamp_start, uint32_t* timestamp_end);
183  
184   private:
185    class SequenceNumberLessThan {
186     public:
operator()187      bool operator() (const uint16_t& sequence_number1,
188                       const uint16_t& sequence_number2) const {
189        return IsNewerSequenceNumber(sequence_number2, sequence_number1);
190      }
191    };
192    typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
193  
194    // Gets the frame assigned to the timestamp of the packet. May recycle
195    // existing frames if no free frames are available. Returns an error code if
196    // failing, or kNoError on success.
197    VCMFrameBufferEnum GetFrame(const VCMPacket& packet, VCMFrameBuffer** frame);
198    void CopyFrames(FrameList* to_list, const FrameList& from_list);
199    void CopyFrames(FrameList* to_list, const FrameList& from_list, int* index);
200    // Returns true if |frame| is continuous in |decoding_state|, not taking
201    // decodable frames into account.
202    bool IsContinuousInState(const VCMFrameBuffer& frame,
203        const VCMDecodingState& decoding_state) const;
204    // Returns true if |frame| is continuous in the |last_decoded_state_|, taking
205    // all decodable frames into account.
206    bool IsContinuous(const VCMFrameBuffer& frame) const;
207    // Looks for frames in |incomplete_frames_| which are continuous in
208    // |last_decoded_state_| taking all decodable frames into account. Starts
209    // the search from |new_frame|.
210    void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame);
211    VCMFrameBuffer* NextFrame() const;
212    // Returns true if the NACK list was updated to cover sequence numbers up to
213    // |sequence_number|. If false a key frame is needed to get into a state where
214    // we can continue decoding.
215    bool UpdateNackList(uint16_t sequence_number);
216    bool TooLargeNackList() const;
217    // Returns true if the NACK list was reduced without problem. If false a key
218    // frame is needed to get into a state where we can continue decoding.
219    bool HandleTooLargeNackList();
220    bool MissingTooOldPacket(uint16_t latest_sequence_number) const;
221    // Returns true if the too old packets was successfully removed from the NACK
222    // list. If false, a key frame is needed to get into a state where we can
223    // continue decoding.
224    bool HandleTooOldPackets(uint16_t latest_sequence_number);
225    // Drops all packets in the NACK list up until |last_decoded_sequence_number|.
226    void DropPacketsFromNackList(uint16_t last_decoded_sequence_number);
227  
228    void ReleaseFrameIfNotDecoding(VCMFrameBuffer* frame);
229  
230    // Gets an empty frame, creating a new frame if necessary (i.e. increases
231    // jitter buffer size).
232    VCMFrameBuffer* GetEmptyFrame();
233  
234    // Attempts to increase the size of the jitter buffer. Returns true on
235    // success, false otherwise.
236    bool TryToIncreaseJitterBufferSize();
237  
238    // Recycles oldest frames until a key frame is found. Used if jitter buffer is
239    // completely full. Returns true if a key frame was found.
240    bool RecycleFramesUntilKeyFrame();
241  
242    // Updates the frame statistics.
243    // Counts only complete frames, so decodable incomplete frames will not be
244    // counted.
245    void CountFrame(const VCMFrameBuffer& frame);
246  
247    // Update rolling average of packets per frame.
248    void UpdateAveragePacketsPerFrame(int current_number_packets_);
249  
250    // Cleans the frame list in the JB from old/empty frames.
251    // Should only be called prior to actual use.
252    void CleanUpOldOrEmptyFrames();
253  
254    // Returns true if |packet| is likely to have been retransmitted.
255    bool IsPacketRetransmitted(const VCMPacket& packet) const;
256  
257    // The following three functions update the jitter estimate with the
258    // payload size, receive time and RTP timestamp of a frame.
259    void UpdateJitterEstimate(const VCMJitterSample& sample,
260                              bool incomplete_frame);
261    void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame);
262    void UpdateJitterEstimate(int64_t latest_packet_time_ms,
263                              uint32_t timestamp,
264                              unsigned int frame_size,
265                              bool incomplete_frame);
266  
267    // Returns true if we should wait for retransmissions, false otherwise.
268    bool WaitForRetransmissions();
269  
270    int NonContinuousOrIncompleteDuration();
271  
272    uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
273  
274    Clock* clock_;
275    // If we are running (have started) or not.
276    bool running_;
277    CriticalSectionWrapper* crit_sect_;
278    // Event to signal when we have a frame ready for decoder.
279    scoped_ptr<EventWrapper> frame_event_;
280    // Event to signal when we have received a packet.
281    scoped_ptr<EventWrapper> packet_event_;
282    // Number of allocated frames.
283    int max_number_of_frames_;
284    // Array of pointers to the frames in jitter buffer.
285    VCMFrameBuffer* frame_buffers_[kMaxNumberOfFrames];
286    UnorderedFrameList free_frames_;
287    FrameList decodable_frames_;
288    FrameList incomplete_frames_;
289    VCMDecodingState last_decoded_state_;
290    bool first_packet_since_reset_;
291  
292    // Statistics.
293    // Frame counts for each type (key, delta, ...)
294    std::map<FrameType, uint32_t> receive_statistics_;
295    // Latest calculated frame rates of incoming stream.
296    unsigned int incoming_frame_rate_;
297    unsigned int incoming_frame_count_;
298    int64_t time_last_incoming_frame_count_;
299    unsigned int incoming_bit_count_;
300    unsigned int incoming_bit_rate_;
301    unsigned int drop_count_;  // Frame drop counter.
302    // Number of frames in a row that have been too old.
303    int num_consecutive_old_frames_;
304    // Number of packets in a row that have been too old.
305    int num_consecutive_old_packets_;
306    // Number of packets discarded by the jitter buffer.
307    int num_discarded_packets_;
308  
309    // Jitter estimation.
310    // Filter for estimating jitter.
311    VCMJitterEstimator jitter_estimate_;
312    // Calculates network delays used for jitter calculations.
313    VCMInterFrameDelay inter_frame_delay_;
314    VCMJitterSample waiting_for_completion_;
315    uint32_t rtt_ms_;
316  
317    // NACK and retransmissions.
318    VCMNackMode nack_mode_;
319    int low_rtt_nack_threshold_ms_;
320    int high_rtt_nack_threshold_ms_;
321    // Holds the internal NACK list (the missing sequence numbers).
322    SequenceNumberSet missing_sequence_numbers_;
323    uint16_t latest_received_sequence_number_;
324    std::vector<uint16_t> nack_seq_nums_;
325    size_t max_nack_list_size_;
326    int max_packet_age_to_nack_;  // Measured in sequence numbers.
327    int max_incomplete_time_ms_;
328  
329    VCMDecodeErrorMode decode_error_mode_;
330    // Estimated rolling average of packets per frame
331    float average_packets_per_frame_;
332    // average_packets_per_frame converges fast if we have fewer than this many
333    // frames.
334    int frame_counter_;
335    DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer);
336  };
337  }  // namespace webrtc
338  
339  #endif  // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_JITTER_BUFFER_H_
340