AV1: Added frame header and tile group OBU parsing. (#312)

* * rocDecode/AV1: Added frame header OBU parsing.

* * rocDecode/AV1: Added a missing function description.

* * rocDecode/AV1: Added tile group OBU parsing.
Этот коммит содержится в:
jeffqjiangNew
2024-04-11 09:01:54 -04:00
коммит произвёл GitHub
родитель 77e4c3150a
Коммит 6b03950181
3 изменённых файлов: 1654 добавлений и 8 удалений
+9 -4
Просмотреть файл
@@ -120,7 +120,7 @@ typedef enum {
kOnly4x4 = 0,
kTxModeLargest = 1,
kTxModeSelect = 2,
} TX_Mode;
} Tx_Mode;
typedef enum {
kIdentity = 0, // Warp model is just an identity transform
@@ -236,7 +236,10 @@ typedef struct {
typedef struct {
uint32_t frame_width_minus_1;
uint32_t frame_width; // FrameWidth
uint32_t frame_height_minus_1;
uint32_t frame_height; // FrameHeight
uint32_t upscaled_width; // UpscaledWidth
Av1SuperResParams superres_params;
uint32_t mi_cols;
uint32_t mi_rows;
@@ -245,7 +248,9 @@ typedef struct {
typedef struct {
uint32_t render_and_frame_size_different;
uint32_t render_width_minus_1;
uint32_t render_width; // RenderWidth
uint32_t render_height_minus_1;
uint32_t render_height; // RenderHeight
} Av1RenderSize;
typedef struct {
@@ -396,7 +401,7 @@ typedef struct {
Av1TemporalPointInfo temporal_point_info;
uint32_t display_frame_id;
uint32_t frame_type;
uint32_t frame_isIntra;
uint32_t frame_is_intra;
uint32_t show_frame;
uint32_t showable_frame;
uint32_t error_resilient_mode;
@@ -423,7 +428,7 @@ typedef struct {
uint32_t gold_frame_idx;
int32_t ref_frame_idx[REFS_PER_FRAME];
uint32_t delta_frame_id_minus_1;
uint32_t expectedFrameId[REFS_PER_FRAME];
uint32_t expected_frame_id[REFS_PER_FRAME];
uint32_t allow_high_precision_mv;
uint32_t is_filter_switchable;
uint32_t interpolation_filter;
@@ -437,7 +442,7 @@ typedef struct {
Av1DeltaLFParams delta_lf_params;
uint32_t coded_lossless;
uint32_t lossless_array[MAX_SEGMENTS];
uint32_t seg_qm__level[3][MAX_SEGMENTS];
uint32_t seg_qm_level[3][MAX_SEGMENTS];
uint32_t all_lossless;
Av1LoopFilterParams loop_filter_params;
Av1CdefParams cdef_params;
Разница между файлами не показана из-за своего большого размера Загрузить разницу
+313 -4
Просмотреть файл
@@ -26,6 +26,7 @@ THE SOFTWARE.
#define OBU_HEADER_SIZE 1
#define OBU_EXTENSION_SIZE 1
#define INVALID_INDEX -1 // Invalid buffer index.
class Av1VideoParser : public RocVideoParser {
public:
@@ -54,18 +55,70 @@ public:
*/
virtual rocDecStatus UnInitialize(); // derived method
typedef struct {
int index;
} Av1Picture;
typedef struct {
uint32_t offset;
uint32_t size;
} Av1TileDataInfo;
typedef struct {
uint32_t buffer_id; // buffer ID in the bitstream buffer pool.
uint8_t *buffer_ptr; // pointer of the tile group data buffer.
uint32_t buffer_size; // total size of the data buffer, may include the header bytes.
Av1TileDataInfo tile_data_info[MAX_TILE_ROWS][MAX_TILE_COLS];
} Av1TileGroupDataInfo;
protected:
Av1SequenceHeader seq_header_;
Av1FrameHeader frame_header_;
Av1TileGroupDataInfo tile_group_data_;
int temporal_id_; // temporal level of the data contained in the OBU
int spatial_id_; // spatial level of the data contained in the OBU
// Frame header syntax elements
int ref_frame_type_[NUM_REF_FRAMES];
int ref_frame_id_[NUM_REF_FRAMES];
int ref_order_hint_[NUM_REF_FRAMES];
int ref_valid_[NUM_REF_FRAMES];
// A list of all frame buffers that may be used for reference of the current picture or any
// subsequent pictures. The value is the index of a frame in DPB buffer pool. If an entry is
// not used as reference, the value should be -1.
int ref_pic_map_[NUM_REF_FRAMES];
int ref_pic_map_next_[NUM_REF_FRAMES]; // for next picture
// The reference list for the current picture
Av1Picture ref_pictures_[REFS_PER_FRAME];
// The free frame buffer in DPB pool that the current picutre is decoded into
int new_fb_index_;
/*! \brief Function to parse a sequence header OBU
* \param p_stream Pointer to the bit stream
* \param size Byte size of the stream
* \param [in] p_stream Pointer to the bit stream
* \param [in] size Byte size of the stream
* \return None
*/
void ParseSequenceHeader(uint8_t *p_stream, size_t size);
/*! \brief Function to parse a frame header OBU
* \param [in] p_stream Pointer to the bit stream
* \param [in] size Byte size of the stream
* \return <tt>ParserResult</tt>
*/
ParserResult ParseUncompressedHeader(uint8_t *p_stream, size_t size);
/*! \brief Function to parse a tile group OBU
* \param [in] p_stream Pointer to the bit stream
* \param [in] size Byte size of the stream
* \return None
*/
void ParseTileGroupInfo(uint8_t *p_stream, size_t size);
/*! \brief Function to parse color config in sequence header
* \param p_stream Pointer to the bit stream
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_seq_header Pointer to sequence header struct
@@ -73,7 +126,263 @@ protected:
*/
void ParseColorConfig(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header);
/*! \brief Function to calculate the floor of the base 2 logarithm of the input x
/*! \brief Function to mark reference frames
* \param [in] p_seq_header Pointer to sequence header
* \param [in] p_frame_header Ponter to frame header
* \param [in] id_len Current frame id length
*/
void MarkRefFrames(Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header, uint32_t id_len);
/*! \brief Function to parse frame size
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void FrameSize(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse super res parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void SuperResParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to calculate 4x4 block columns and rows of the frame
* \param [in] p_frame_header Pointer to frame header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void ComputeImageSize(Av1FrameHeader *p_frame_header);
/*! \brief Function to parse render size info
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void RenderSize(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to compute the distance between two order hints by sign extending the result of subtracting the values.
* \param [in] p_seq_header Pointer to sequence header struct
* \param [in] a One order hint
* \param [in] b The other order hint
* \return The order hint distance
*/
int GetRelativeDist(Av1SequenceHeader *p_seq_header, int a, int b);
/*! \brief Function to compute the elements in the ref_frame_idx array. 7.8. Set frame refs process.
* \param [in] p_seq_header Pinter to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void SetFrameRefs(Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to find the latest backward reference
* \param [in] shifted_order_hints An array containing the expected output order shifted such that the current
* frame has hint equal to curr_frame_hint
* \param [in] used_frame An array marking which reference frames have been used
* \param [in] curr_frame_hint A variable set equal to 1 << (OrderHintBits - 1)
*/
int FindLatestBackward(int *shifted_order_hints, int *used_frame, int curr_frame_hint);
/*! \brief Function to find the earliest backward reference
* \param [in] shifted_order_hints An array containing the expected output order shifted such that the current
* frame has hint equal to curr_frame_hint
* \param [in] used_frame An array marking which reference frames have been used
* \param [in] curr_frame_hint A variable set equal to 1 << (OrderHintBits - 1)
*/
int FindEarliestBackward(int *shifted_order_hints, int *used_frame, int curr_frame_hint);
/*! \brief Function to find the latest forward reference
* \param [in] shifted_order_hints An array containing the expected output order shifted such that the current
* frame has hint equal to curr_frame_hint
* \param [in] used_frame An array marking which reference frames have been used
* \param [in] curr_frame_hint A variable set equal to 1 << (OrderHintBits - 1)
*/
int FindLatestForward(int *shifted_order_hints, int *used_frame, int curr_frame_hint);
/*! \brief Function to parse frame size with refs info
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void FrameSizeWithRefs(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to indicates that this frame can be decoded without dependence on previous coded frames. setup_past_independence().
* \param [out] p_frame_header Pointer to frame header struct
*/
void SetupPastIndependence(Av1FrameHeader *p_frame_header);
/*! \brief Function to parse tile info
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void TileInfo(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to calculate the smallest value for k such that blk_size << k is greater than or equal to target.
* \param [in] blk_size Block size
* \param [in] target target value
* \return 32-bit unsigned
*/
uint32_t TileLog2(uint32_t blk_size, uint32_t target);
/*! \brief Function to parse quantization parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void QuantizationParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to read delta quantizer
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
uint32_t ReadDeltaQ(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to segmentation parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void SegmentationParams(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse quantizer index delta parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void DeltaQParams(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse loop filter delta parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void DeltaLFParams(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse loop filter parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void LoopFilterParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse CDEF parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void CdefParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to loop restoration parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void LrParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse TX mode
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void ReadTxMode(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to skip mode parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void SkipModeParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to parse global motion parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void GlobalMotionParams(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header);
/*! \brief Function to calculate global motion parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct
* \param [in] type Motion type
* \param [in] ref Reference frame
* \param [in] idx Parameter index
* \return None
*/
void ReadGlobalParam(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header, int type, int ref, int idx);
/*! \brief Function to decode signed subexp with ref. 5.9.26. decode_signed_subexp_with_ref()
*/
int DecodeSignedSubexpWithRef(const uint8_t *p_stream, size_t &offset, int low, int high, int r);
/*! \brief Function to decode unsigned subexp with ref. 5.9.27. decode_unsigned_subexp_with_ref()
*/
int DecodeUnsignedSubexpWithRef(const uint8_t *p_stream, size_t &offset, int mx, int r);
/*! \brief Function to decode subexp. 5.9.28. decode_subexp()
*/
int DecodeSubexp(const uint8_t *p_stream, size_t &offset, int num_syms);
/*! \brief Function to inverse recenter. 5.9.29. inverse_recenter()
*/
int InverseRecenter(int r, int v);
/*! \brief Function to parse film grain parameters
* \param [in] p_stream Pointer to the bit stream
* \param [in] offset Starting bit offset
* \param [out] offset Updated bit offset
* \param [in] p_seq_header Pointer to sequence header struct
* \param [out] p_frame_header Pointer to frame header struct
* \return None
*/
void FilmGrainParams(const uint8_t *p_stream, size_t &offset, Av1SequenceHeader *p_seq_header, Av1FrameHeader *p_frame_header);
/*! \brief Function to calculate the floor of the base 2 logarithm of the input x
* \param [in] x A 32-bit unsigned integer
* \return the location of the most significant bit in x
*/