1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2021 Rockchip Electronics Co. LTD 3*437bfbebSnyanmisaka * 4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 6*437bfbebSnyanmisaka * You may obtain a copy of the License at 7*437bfbebSnyanmisaka * 8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 9*437bfbebSnyanmisaka * 10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 14*437bfbebSnyanmisaka * limitations under the License. 15*437bfbebSnyanmisaka */ 16*437bfbebSnyanmisaka 17*437bfbebSnyanmisaka #ifndef __AV1D_CODEC_H__ 18*437bfbebSnyanmisaka #define __AV1D_CODEC_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include "mpp_frame.h" 21*437bfbebSnyanmisaka 22*437bfbebSnyanmisaka #include "av1d_cbs.h" 23*437bfbebSnyanmisaka #include "av1d_syntax.h" 24*437bfbebSnyanmisaka #include "mpp_bitread.h" 25*437bfbebSnyanmisaka 26*437bfbebSnyanmisaka typedef struct AV1ParseContext { 27*437bfbebSnyanmisaka Av1UnitFragment temporal_unit; 28*437bfbebSnyanmisaka int parsed_extradata; 29*437bfbebSnyanmisaka } AV1ParseContext; 30*437bfbebSnyanmisaka 31*437bfbebSnyanmisaka #define MPP_PARSER_PTS_NB 4 32*437bfbebSnyanmisaka #define MAX_OBU_HEADER_SIZE (2 + 8) 33*437bfbebSnyanmisaka 34*437bfbebSnyanmisaka typedef struct AV1OBU_T { 35*437bfbebSnyanmisaka /** Size of payload */ 36*437bfbebSnyanmisaka int size; 37*437bfbebSnyanmisaka const uint8_t *data; 38*437bfbebSnyanmisaka 39*437bfbebSnyanmisaka /** 40*437bfbebSnyanmisaka * Size, in bits, of just the data, excluding the trailing_one_bit and 41*437bfbebSnyanmisaka * any trailing padding. 42*437bfbebSnyanmisaka */ 43*437bfbebSnyanmisaka int size_bits; 44*437bfbebSnyanmisaka 45*437bfbebSnyanmisaka /** Size of entire OBU, including header */ 46*437bfbebSnyanmisaka int raw_size; 47*437bfbebSnyanmisaka const uint8_t *raw_data; 48*437bfbebSnyanmisaka 49*437bfbebSnyanmisaka /** GetBitContext initialized to the start of the payload */ 50*437bfbebSnyanmisaka BitReadCtx_t gb; 51*437bfbebSnyanmisaka 52*437bfbebSnyanmisaka int type; 53*437bfbebSnyanmisaka 54*437bfbebSnyanmisaka int temporal_id; 55*437bfbebSnyanmisaka int spatial_id; 56*437bfbebSnyanmisaka } AV1OBU; 57*437bfbebSnyanmisaka 58*437bfbebSnyanmisaka typedef struct SplitContext { 59*437bfbebSnyanmisaka RK_U8 *buffer; 60*437bfbebSnyanmisaka RK_U32 buffer_size; 61*437bfbebSnyanmisaka RK_S32 index; 62*437bfbebSnyanmisaka RK_S32 last_index; 63*437bfbebSnyanmisaka RK_U32 state; ///< contains the last few bytes in MSB order 64*437bfbebSnyanmisaka RK_S32 frame_start_found; 65*437bfbebSnyanmisaka RK_S32 overread; ///< the number of bytes which where irreversibly read from the next frame 66*437bfbebSnyanmisaka RK_S32 overread_index; ///< the index into ParseContext.buffer of the overread bytes 67*437bfbebSnyanmisaka RK_U64 state64; ///< contains the last 8 bytes in MSB order 68*437bfbebSnyanmisaka RK_S64 pts; /* pts of the current frame */ 69*437bfbebSnyanmisaka RK_S64 dts; /* dts of the current frame */ 70*437bfbebSnyanmisaka RK_S64 frame_offset; /* offset of the current frame */ 71*437bfbebSnyanmisaka RK_S64 cur_offset; /* current offset 72*437bfbebSnyanmisaka (incremented by each av_parser_parse()) */ 73*437bfbebSnyanmisaka RK_S64 next_frame_offset; /* offset of the next frame */ 74*437bfbebSnyanmisaka 75*437bfbebSnyanmisaka /* private data */ 76*437bfbebSnyanmisaka void *priv_data; 77*437bfbebSnyanmisaka RK_S64 last_pts; 78*437bfbebSnyanmisaka RK_S64 last_dts; 79*437bfbebSnyanmisaka RK_S32 fetch_timestamp; 80*437bfbebSnyanmisaka 81*437bfbebSnyanmisaka RK_S32 cur_frame_start_index; 82*437bfbebSnyanmisaka RK_S64 cur_frame_offset[MPP_PARSER_PTS_NB]; 83*437bfbebSnyanmisaka RK_S64 cur_frame_pts[MPP_PARSER_PTS_NB]; 84*437bfbebSnyanmisaka RK_S64 cur_frame_dts[MPP_PARSER_PTS_NB]; 85*437bfbebSnyanmisaka 86*437bfbebSnyanmisaka RK_S64 offset; ///< byte offset from starting packet start 87*437bfbebSnyanmisaka RK_S64 cur_frame_end[MPP_PARSER_PTS_NB]; 88*437bfbebSnyanmisaka /** 89*437bfbebSnyanmisaka * Set by parser to 1 for key frames and 0 for non-key frames. 90*437bfbebSnyanmisaka * It is initialized to -1, so if the parser doesn't set this flag, 91*437bfbebSnyanmisaka * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames 92*437bfbebSnyanmisaka * will be used. 93*437bfbebSnyanmisaka */ 94*437bfbebSnyanmisaka RK_S32 key_frame; 95*437bfbebSnyanmisaka RK_S32 eos; 96*437bfbebSnyanmisaka RK_U32 frame_header; 97*437bfbebSnyanmisaka } SplitContext_t; 98*437bfbebSnyanmisaka 99*437bfbebSnyanmisaka typedef struct Av1CodecContext_t { 100*437bfbebSnyanmisaka 101*437bfbebSnyanmisaka void *priv_data; /* Av1Context */ 102*437bfbebSnyanmisaka void *priv_data2; /* SplitContext */ 103*437bfbebSnyanmisaka 104*437bfbebSnyanmisaka MppFrameFormat pix_fmt; 105*437bfbebSnyanmisaka MppFrameColorSpace colorspace; 106*437bfbebSnyanmisaka MppFrameColorRange color_range; 107*437bfbebSnyanmisaka MppFrameColorPrimaries color_primaries; 108*437bfbebSnyanmisaka MppFrameColorTransferCharacteristic color_trc; 109*437bfbebSnyanmisaka MppFrameChromaLocation chroma_sample_location; 110*437bfbebSnyanmisaka 111*437bfbebSnyanmisaka RK_S32 width, height; 112*437bfbebSnyanmisaka 113*437bfbebSnyanmisaka RK_S32 profile, level; 114*437bfbebSnyanmisaka 115*437bfbebSnyanmisaka MppPacket pkt; 116*437bfbebSnyanmisaka 117*437bfbebSnyanmisaka DXVA_PicParams_AV1 pic_params; 118*437bfbebSnyanmisaka 119*437bfbebSnyanmisaka /* split info */ 120*437bfbebSnyanmisaka RK_U32 frame_header; 121*437bfbebSnyanmisaka RK_U32 new_frame; 122*437bfbebSnyanmisaka RK_U8 *stream; 123*437bfbebSnyanmisaka RK_U32 stream_size; 124*437bfbebSnyanmisaka RK_U32 stream_offset; 125*437bfbebSnyanmisaka 126*437bfbebSnyanmisaka RK_S32 eos; 127*437bfbebSnyanmisaka MppFrameFormat usr_set_fmt; 128*437bfbebSnyanmisaka } Av1CodecContext; 129*437bfbebSnyanmisaka 130*437bfbebSnyanmisaka #endif /*__AV1D_CODEC_H__*/ 131