|  | /* | 
|  | *  Copyright (c) 2017 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 MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_ | 
|  | #define MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <array> | 
|  | #include <bitset> | 
|  | #include <string> | 
|  |  | 
|  | #include "absl/types/optional.h" | 
|  | #include "api/array_view.h" | 
|  | #include "modules/video_coding/utility/vp9_constants.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | namespace vp9 { | 
|  |  | 
|  | // Gets the QP, QP range: [0, 255]. | 
|  | // Returns true on success, false otherwise. | 
|  | bool GetQp(const uint8_t* buf, size_t length, int* qp); | 
|  |  | 
|  | }  // namespace vp9 | 
|  |  | 
|  | // Bit depth per channel. Support varies by profile. | 
|  | enum class Vp9BitDept : uint8_t { | 
|  | k8Bit = 8, | 
|  | k10Bit = 10, | 
|  | k12Bit = 12, | 
|  | }; | 
|  |  | 
|  | enum class Vp9ColorSpace : uint8_t { | 
|  | CS_UNKNOWN = 0,    // Unknown (in this case the color space must be signaled | 
|  | // outside the VP9 bitstream). | 
|  | CS_BT_601 = 1,     // CS_BT_601 Rec. ITU-R BT.601-7 | 
|  | CS_BT_709 = 2,     // Rec. ITU-R BT.709-6 | 
|  | CS_SMPTE_170 = 3,  // SMPTE-170 | 
|  | CS_SMPTE_240 = 4,  // SMPTE-240 | 
|  | CS_BT_2020 = 5,    // Rec. ITU-R BT.2020-2 | 
|  | CS_RESERVED = 6,   // Reserved | 
|  | CS_RGB = 7,        // sRGB (IEC 61966-2-1) | 
|  | }; | 
|  |  | 
|  | enum class Vp9ColorRange { | 
|  | kStudio,  // Studio swing: | 
|  | // For BitDepth equals 8: | 
|  | //     Y is between 16 and 235 inclusive. | 
|  | //     U and V are between 16 and 240 inclusive. | 
|  | // For BitDepth equals 10: | 
|  | //     Y is between 64 and 940 inclusive. | 
|  | //     U and V are between 64 and 960 inclusive. | 
|  | // For BitDepth equals 12: | 
|  | //     Y is between 256 and 3760. | 
|  | //     U and V are between 256 and 3840 inclusive. | 
|  | kFull     // Full swing; no restriction on Y, U, V values. | 
|  | }; | 
|  |  | 
|  | enum class Vp9YuvSubsampling { | 
|  | k444, | 
|  | k440, | 
|  | k422, | 
|  | k420, | 
|  | }; | 
|  |  | 
|  | enum Vp9ReferenceFrame : int { | 
|  | kNone = -1, | 
|  | kIntra = 0, | 
|  | kLast = 1, | 
|  | kGolden = 2, | 
|  | kAltref = 3, | 
|  | }; | 
|  |  | 
|  | enum class Vp9InterpolationFilter : uint8_t { | 
|  | kEightTap = 0, | 
|  | kEightTapSmooth = 1, | 
|  | kEightTapSharp = 2, | 
|  | kBilinear = 3, | 
|  | kSwitchable = 4 | 
|  | }; | 
|  |  | 
|  | struct Vp9UncompressedHeader { | 
|  | int profile = 0;  // Profiles 0-3 are valid. | 
|  | absl::optional<uint8_t> show_existing_frame; | 
|  | bool is_keyframe = false; | 
|  | bool show_frame = false; | 
|  | bool error_resilient = false; | 
|  | Vp9BitDept bit_detph = Vp9BitDept::k8Bit; | 
|  | absl::optional<Vp9ColorSpace> color_space; | 
|  | absl::optional<Vp9ColorRange> color_range; | 
|  | absl::optional<Vp9YuvSubsampling> sub_sampling; | 
|  | int frame_width = 0; | 
|  | int frame_height = 0; | 
|  | int render_width = 0; | 
|  | int render_height = 0; | 
|  | // Width/height of the tiles used (in units of 8x8 blocks). | 
|  | size_t tile_cols_log2 = 0;  // tile_cols = 1 << tile_cols_log2 | 
|  | size_t tile_rows_log2 = 0;  // tile_rows = 1 << tile_rows_log2 | 
|  | absl::optional<size_t> render_size_offset_bits; | 
|  | Vp9InterpolationFilter interpolation_filter = | 
|  | Vp9InterpolationFilter::kEightTap; | 
|  | bool allow_high_precision_mv = false; | 
|  | int base_qp = 0; | 
|  | bool is_lossless = false; | 
|  | uint8_t frame_context_idx = 0; | 
|  |  | 
|  | bool segmentation_enabled = false; | 
|  | absl::optional<std::array<uint8_t, 7>> segmentation_tree_probs; | 
|  | absl::optional<std::array<uint8_t, 3>> segmentation_pred_prob; | 
|  | bool segmentation_is_delta = false; | 
|  | std::array<std::array<absl::optional<int>, kVp9SegLvlMax>, kVp9MaxSegments> | 
|  | segmentation_features; | 
|  |  | 
|  | // Which of the 8 reference buffers may be used as references for this frame. | 
|  | // -1 indicates not used (e.g. {-1, -1, -1} for intra-only frames). | 
|  | std::array<int, kVp9RefsPerFrame> reference_buffers = {-1, -1, -1}; | 
|  | // Sign bias corresponding to reference buffers, where the index is a | 
|  | // ReferenceFrame. | 
|  | // false/0 indidate backwards reference, true/1 indicate forwards reference). | 
|  | std::bitset<kVp9MaxRefFrames> reference_buffers_sign_bias = 0; | 
|  |  | 
|  | // Indicates which reference buffer [0,7] to infer the frame size from. | 
|  | absl::optional<int> infer_size_from_reference; | 
|  | // Which of the 8 reference buffers are updated by this frame. | 
|  | std::bitset<kVp9NumRefFrames> updated_buffers = 0; | 
|  |  | 
|  | // Header sizes, in bytes. | 
|  | uint32_t uncompressed_header_size = 0; | 
|  | uint32_t compressed_header_size = 0; | 
|  |  | 
|  | bool is_intra_only() const { | 
|  | return reference_buffers[0] == -1 && reference_buffers[1] == -1 && | 
|  | reference_buffers[2] == -1; | 
|  | } | 
|  |  | 
|  | std::string ToString() const; | 
|  | }; | 
|  |  | 
|  | // Parses the uncompressed header and populates (most) values in a | 
|  | // UncompressedHeader struct. Returns nullopt on failure. | 
|  | absl::optional<Vp9UncompressedHeader> ParseUncompressedVp9Header( | 
|  | rtc::ArrayView<const uint8_t> buf); | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_ |