/* * 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 #include #include #include #include #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 show_existing_frame; bool is_keyframe = false; bool show_frame = false; bool error_resilient = false; Vp9BitDept bit_detph = Vp9BitDept::k8Bit; absl::optional color_space; absl::optional color_range; absl::optional 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 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> segmentation_tree_probs; absl::optional> segmentation_pred_prob; bool segmentation_is_delta = false; std::array, 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 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 reference_buffers_sign_bias = 0; // Indicates which reference buffer [0,7] to infer the frame size from. absl::optional infer_size_from_reference; // Which of the 8 reference buffers are updated by this frame. std::bitset 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 ParseUncompressedVp9Header( rtc::ArrayView buf); } // namespace webrtc #endif // MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_