mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00

Bug: None Change-Id: I91010b0102622fd8154f8ba941e61298b0584eae Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/230802 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#34899}
155 lines
4.9 KiB
C++
155 lines
4.9 KiB
C++
/*
|
|
* 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_
|