// Copyright (c) 2016 The WebM 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 LIBWEBM_COMMON_VP9_HEADER_PARSER_H_ #define LIBWEBM_COMMON_VP9_HEADER_PARSER_H_ #include #include namespace vp9_parser { const int kVp9FrameMarker = 2; const int kMinTileWidthB64 = 4; const int kMaxTileWidthB64 = 64; const int kRefFrames = 8; const int kRefsPerFrame = 3; const int kRefFrames_LOG2 = 3; const int kVpxCsBt601 = 1; const int kVpxCsSrgb = 7; const int kVpxCrStudioRange = 0; const int kVpxCrFullRange = 1; const int kMiSizeLog2 = 3; // Class to parse the header of a VP9 frame. class Vp9HeaderParser { public: Vp9HeaderParser() : frame_(NULL), frame_size_(0), bit_offset_(0), profile_(-1), show_existing_frame_(0), key_(0), altref_(0), error_resilient_mode_(0), intra_only_(0), reset_frame_context_(0), bit_depth_(0), color_space_(0), color_range_(0), subsampling_x_(0), subsampling_y_(0), refresh_frame_flags_(0), width_(0), height_(0), row_tiles_(0), column_tiles_(0), frame_parallel_mode_(0) {} // Parse the VP9 uncompressed header. The return values of the remaining // functions are only valid on success. bool ParseUncompressedHeader(const uint8_t* frame, size_t length); size_t frame_size() const { return frame_size_; } int profile() const { return profile_; } int key() const { return key_; } int altref() const { return altref_; } int error_resilient_mode() const { return error_resilient_mode_; } int bit_depth() const { return bit_depth_; } int color_space() const { return color_space_; } int width() const { return width_; } int height() const { return height_; } int refresh_frame_flags() const { return refresh_frame_flags_; } int row_tiles() const { return row_tiles_; } int column_tiles() const { return column_tiles_; } int frame_parallel_mode() const { return frame_parallel_mode_; } private: // Set the compressed VP9 frame. bool SetFrame(const uint8_t* frame, size_t length); // Returns the next bit of the frame. int ReadBit(); // Returns the next |bits| of the frame. int VpxReadLiteral(int bits); // Returns true if the vp9 sync code is valid. bool ValidateVp9SyncCode(); // Parses bit_depth_, color_space_, subsampling_x_, subsampling_y_, and // color_range_. void ParseColorSpace(); // Parses width and height of the frame. void ParseFrameResolution(); // Parses frame_parallel_mode_. This function skips over some features. void ParseFrameParallelMode(); // Parses row and column tiles. This function skips over some features. void ParseTileInfo(); void SkipDeltaQ(); int AlignPowerOfTwo(int value, int n); const uint8_t* frame_; size_t frame_size_; size_t bit_offset_; int profile_; int show_existing_frame_; int key_; int altref_; int error_resilient_mode_; int intra_only_; int reset_frame_context_; int bit_depth_; int color_space_; int color_range_; int subsampling_x_; int subsampling_y_; int refresh_frame_flags_; int width_; int height_; int row_tiles_; int column_tiles_; int frame_parallel_mode_; }; } // namespace vp9_parser #endif // LIBWEBM_COMMON_VP9_HEADER_PARSER_H_