diff options
Diffstat (limited to 'webrtc/modules/video_coding/decoding_state.h')
-rw-r--r-- | webrtc/modules/video_coding/decoding_state.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/webrtc/modules/video_coding/decoding_state.h b/webrtc/modules/video_coding/decoding_state.h new file mode 100644 index 0000000000..f4ea8ae081 --- /dev/null +++ b/webrtc/modules/video_coding/decoding_state.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_MODULES_VIDEO_CODING_DECODING_STATE_H_ +#define WEBRTC_MODULES_VIDEO_CODING_DECODING_STATE_H_ + +#include "webrtc/typedefs.h" + +namespace webrtc { + +// Forward declarations +class VCMFrameBuffer; +class VCMPacket; + +class VCMDecodingState { + public: + // The max number of bits used to reference back + // to a previous frame when using flexible mode. + static const uint16_t kNumRefBits = 7; + static const uint16_t kFrameDecodedLength = 1 << kNumRefBits; + + VCMDecodingState(); + ~VCMDecodingState(); + // Check for old frame + bool IsOldFrame(const VCMFrameBuffer* frame) const; + // Check for old packet + bool IsOldPacket(const VCMPacket* packet) const; + // Check for frame continuity based on current decoded state. Use best method + // possible, i.e. temporal info, picture ID or sequence number. + bool ContinuousFrame(const VCMFrameBuffer* frame) const; + void SetState(const VCMFrameBuffer* frame); + void CopyFrom(const VCMDecodingState& state); + bool UpdateEmptyFrame(const VCMFrameBuffer* frame); + // Update the sequence number if the timestamp matches current state and the + // sequence number is higher than the current one. This accounts for packets + // arriving late. + void UpdateOldPacket(const VCMPacket* packet); + void SetSeqNum(uint16_t new_seq_num); + void Reset(); + uint32_t time_stamp() const; + uint16_t sequence_num() const; + // Return true if at initial state. + bool in_initial_state() const; + // Return true when sync is on - decode all layers. + bool full_sync() const; + + private: + void UpdateSyncState(const VCMFrameBuffer* frame); + // Designated continuity functions + bool ContinuousPictureId(int picture_id) const; + bool ContinuousSeqNum(uint16_t seq_num) const; + bool ContinuousLayer(int temporal_id, int tl0_pic_id) const; + bool ContinuousFrameRefs(const VCMFrameBuffer* frame) const; + bool UsingPictureId(const VCMFrameBuffer* frame) const; + bool UsingFlexibleMode(const VCMFrameBuffer* frame) const; + bool AheadOfFramesDecodedClearedTo(uint16_t index) const; + + // Keep state of last decoded frame. + // TODO(mikhal/stefan): create designated classes to handle these types. + uint16_t sequence_num_; + uint32_t time_stamp_; + int picture_id_; + int temporal_id_; + int tl0_pic_id_; + bool full_sync_; // Sync flag when temporal layers are used. + bool in_initial_state_; + + // Used to check references in flexible mode. + bool frame_decoded_[kFrameDecodedLength]; + uint16_t frame_decoded_cleared_to_; +}; + +} // namespace webrtc + +#endif // WEBRTC_MODULES_VIDEO_CODING_DECODING_STATE_H_ |