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_PARSER_H__ 18*437bfbebSnyanmisaka #define __AV1D_PARSER_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include <stdlib.h> 21*437bfbebSnyanmisaka 22*437bfbebSnyanmisaka #include "mpp_mem.h" 23*437bfbebSnyanmisaka #include "mpp_bitread.h" 24*437bfbebSnyanmisaka #include "mpp_frame.h" 25*437bfbebSnyanmisaka 26*437bfbebSnyanmisaka #include "parser_api.h" 27*437bfbebSnyanmisaka 28*437bfbebSnyanmisaka #include "av1.h" 29*437bfbebSnyanmisaka #include "av1d_codec.h" 30*437bfbebSnyanmisaka #include "av1d_cbs.h" 31*437bfbebSnyanmisaka #include "av1d_syntax.h" 32*437bfbebSnyanmisaka #include "av1d_common.h" 33*437bfbebSnyanmisaka #include "av1_entropymode.h" 34*437bfbebSnyanmisaka 35*437bfbebSnyanmisaka extern RK_U32 av1d_debug; 36*437bfbebSnyanmisaka 37*437bfbebSnyanmisaka #define AV1D_DBG_FUNCTION (0x00000001) 38*437bfbebSnyanmisaka #define AV1D_DBG_HEADER (0x00000002) 39*437bfbebSnyanmisaka #define AV1D_DBG_REF (0x00000004) 40*437bfbebSnyanmisaka #define AV1D_DBG_STRMIN (0x00000008) 41*437bfbebSnyanmisaka #define AV1D_DBG_DUMP_RPU (0x10000000) 42*437bfbebSnyanmisaka 43*437bfbebSnyanmisaka #define av1d_dbg(flag, fmt, ...) _mpp_dbg_f(av1d_debug, flag, fmt, ##__VA_ARGS__) 44*437bfbebSnyanmisaka #define av1d_dbg_func(fmt, ...) av1d_dbg(AV1D_DBG_FUNCTION, fmt, ## __VA_ARGS__) 45*437bfbebSnyanmisaka 46*437bfbebSnyanmisaka typedef struct RefInfo { 47*437bfbebSnyanmisaka RK_S32 ref_count; 48*437bfbebSnyanmisaka RK_U32 invisible; 49*437bfbebSnyanmisaka RK_U32 is_output; 50*437bfbebSnyanmisaka RK_U32 lst_frame_offset; 51*437bfbebSnyanmisaka RK_U32 lst2_frame_offset; 52*437bfbebSnyanmisaka RK_U32 lst3_frame_offset; 53*437bfbebSnyanmisaka RK_U32 gld_frame_offset; 54*437bfbebSnyanmisaka RK_U32 bwd_frame_offset; 55*437bfbebSnyanmisaka RK_U32 alt2_frame_offset; 56*437bfbebSnyanmisaka RK_U32 alt_frame_offset; 57*437bfbebSnyanmisaka RK_U32 is_intra_frame; 58*437bfbebSnyanmisaka RK_U32 intra_only; 59*437bfbebSnyanmisaka } RefInfo; 60*437bfbebSnyanmisaka 61*437bfbebSnyanmisaka typedef struct GlobalMtionParams { 62*437bfbebSnyanmisaka RK_U32 wmtype; 63*437bfbebSnyanmisaka RK_S32 wmmat[6]; 64*437bfbebSnyanmisaka RK_S32 wmmat_val[6]; 65*437bfbebSnyanmisaka RK_S32 alpha, beta, gamma, delta; 66*437bfbebSnyanmisaka } GlobalMtionParams; 67*437bfbebSnyanmisaka 68*437bfbebSnyanmisaka typedef struct AV1Frame { 69*437bfbebSnyanmisaka MppFrame f; 70*437bfbebSnyanmisaka RK_S32 slot_index; 71*437bfbebSnyanmisaka AV1RawFrameHeader *raw_frame_header; 72*437bfbebSnyanmisaka RK_S32 temporal_id; 73*437bfbebSnyanmisaka RK_S32 spatial_id; 74*437bfbebSnyanmisaka RK_U8 order_hint; 75*437bfbebSnyanmisaka GlobalMtionParams gm_params[AV1_NUM_REF_FRAMES]; 76*437bfbebSnyanmisaka RK_U8 skip_mode_frame_idx[2]; 77*437bfbebSnyanmisaka AV1RawFilmGrainParams film_grain; 78*437bfbebSnyanmisaka RK_U8 coded_lossless; 79*437bfbebSnyanmisaka RefInfo *ref; 80*437bfbebSnyanmisaka } AV1Frame; 81*437bfbebSnyanmisaka 82*437bfbebSnyanmisaka typedef struct AV1Context_t { 83*437bfbebSnyanmisaka BitReadCtx_t gb; 84*437bfbebSnyanmisaka 85*437bfbebSnyanmisaka AV1RawSequenceHeader *sequence_header; 86*437bfbebSnyanmisaka AV1RawSequenceHeader *seq_ref; 87*437bfbebSnyanmisaka AV1RawFrameHeader *raw_frame_header; 88*437bfbebSnyanmisaka Av1UnitFragment current_obu; 89*437bfbebSnyanmisaka 90*437bfbebSnyanmisaka RK_S32 seen_frame_header; 91*437bfbebSnyanmisaka RK_U8 *frame_header; 92*437bfbebSnyanmisaka size_t frame_header_size; 93*437bfbebSnyanmisaka 94*437bfbebSnyanmisaka AV1Frame ref[AV1_NUM_REF_FRAMES]; 95*437bfbebSnyanmisaka AV1Frame cur_frame; 96*437bfbebSnyanmisaka 97*437bfbebSnyanmisaka MppFrameMasteringDisplayMetadata mastering_display; 98*437bfbebSnyanmisaka MppFrameContentLightMetadata content_light; 99*437bfbebSnyanmisaka MppFrameHdrDynamicMeta *hdr_dynamic_meta; 100*437bfbebSnyanmisaka RK_U32 hdr_dynamic; 101*437bfbebSnyanmisaka RK_U32 is_hdr; 102*437bfbebSnyanmisaka 103*437bfbebSnyanmisaka RK_S32 temporal_id; 104*437bfbebSnyanmisaka RK_S32 spatial_id; 105*437bfbebSnyanmisaka RK_S32 operating_point_idc; 106*437bfbebSnyanmisaka 107*437bfbebSnyanmisaka RK_S32 bit_depth; 108*437bfbebSnyanmisaka RK_S32 order_hint; 109*437bfbebSnyanmisaka RK_S32 frame_width; 110*437bfbebSnyanmisaka RK_S32 frame_height; 111*437bfbebSnyanmisaka RK_S32 upscaled_width; 112*437bfbebSnyanmisaka RK_S32 render_width; 113*437bfbebSnyanmisaka RK_S32 render_height; 114*437bfbebSnyanmisaka 115*437bfbebSnyanmisaka RK_S32 num_planes; 116*437bfbebSnyanmisaka RK_S32 coded_lossless; 117*437bfbebSnyanmisaka RK_S32 all_lossless; 118*437bfbebSnyanmisaka RK_S32 tile_cols; 119*437bfbebSnyanmisaka RK_S32 tile_rows; 120*437bfbebSnyanmisaka RK_S32 tile_num; 121*437bfbebSnyanmisaka RK_S32 operating_point; 122*437bfbebSnyanmisaka RK_S32 extra_has_frame; 123*437bfbebSnyanmisaka RK_U32 frame_tag_size; 124*437bfbebSnyanmisaka RK_U32 fist_tile_group; 125*437bfbebSnyanmisaka RK_U32 tile_offset; 126*437bfbebSnyanmisaka 127*437bfbebSnyanmisaka AV1CDFs *cdfs; 128*437bfbebSnyanmisaka MvCDFs *cdfs_ndvc; 129*437bfbebSnyanmisaka AV1CDFs default_cdfs; 130*437bfbebSnyanmisaka MvCDFs default_cdfs_ndvc; 131*437bfbebSnyanmisaka AV1CDFs cdfs_last[NUM_REF_FRAMES]; 132*437bfbebSnyanmisaka MvCDFs cdfs_last_ndvc[NUM_REF_FRAMES]; 133*437bfbebSnyanmisaka RK_U8 disable_frame_end_update_cdf; 134*437bfbebSnyanmisaka RK_U8 frame_is_intra; 135*437bfbebSnyanmisaka RK_U8 refresh_frame_flags; 136*437bfbebSnyanmisaka 137*437bfbebSnyanmisaka const Av1UnitType *unit_types; 138*437bfbebSnyanmisaka RK_S32 nb_unit_types; 139*437bfbebSnyanmisaka 140*437bfbebSnyanmisaka RK_U32 tile_offset_start[AV1_MAX_TILES]; 141*437bfbebSnyanmisaka RK_U32 tile_offset_end[AV1_MAX_TILES]; 142*437bfbebSnyanmisaka 143*437bfbebSnyanmisaka AV1ReferenceFrameState ref_s[AV1_NUM_REF_FRAMES]; 144*437bfbebSnyanmisaka 145*437bfbebSnyanmisaka MppBufSlots slots; 146*437bfbebSnyanmisaka MppBufSlots packet_slots; 147*437bfbebSnyanmisaka RK_U8 skip_ref0; 148*437bfbebSnyanmisaka RK_U8 skip_ref1; 149*437bfbebSnyanmisaka MppDecCfgSet *cfg; 150*437bfbebSnyanmisaka HalDecTask *task; 151*437bfbebSnyanmisaka RK_S32 eos; ///< current packet contains an EOS/EOB NAL 152*437bfbebSnyanmisaka RK_S64 pts; 153*437bfbebSnyanmisaka RK_S64 dts; 154*437bfbebSnyanmisaka const MppDecHwCap *hw_info; 155*437bfbebSnyanmisaka } AV1Context; 156*437bfbebSnyanmisaka 157*437bfbebSnyanmisaka #ifdef __cplusplus 158*437bfbebSnyanmisaka extern "C" { 159*437bfbebSnyanmisaka #endif 160*437bfbebSnyanmisaka 161*437bfbebSnyanmisaka MPP_RET av1d_parser_init(Av1CodecContext *ctx, ParserCfg *init); 162*437bfbebSnyanmisaka 163*437bfbebSnyanmisaka MPP_RET av1d_parser_deinit(Av1CodecContext *ctx); 164*437bfbebSnyanmisaka 165*437bfbebSnyanmisaka RK_S32 av1d_parser_frame(Av1CodecContext *ctx, HalDecTask *in_task); 166*437bfbebSnyanmisaka 167*437bfbebSnyanmisaka void av1d_parser_update(Av1CodecContext *ctx, void *info); 168*437bfbebSnyanmisaka 169*437bfbebSnyanmisaka MPP_RET av1d_paser_reset(Av1CodecContext *ctx); 170*437bfbebSnyanmisaka 171*437bfbebSnyanmisaka RK_S32 av1d_split_frame(Av1CodecContext *ctx, 172*437bfbebSnyanmisaka RK_U8 **out_data, RK_S32 *out_size, 173*437bfbebSnyanmisaka RK_U8 *data, RK_S32 size); 174*437bfbebSnyanmisaka 175*437bfbebSnyanmisaka MPP_RET av1d_get_frame_stream(Av1CodecContext *ctx, RK_U8 *buf, RK_S32 length); 176*437bfbebSnyanmisaka 177*437bfbebSnyanmisaka MPP_RET av1d_split_init(Av1CodecContext *ctx); 178*437bfbebSnyanmisaka 179*437bfbebSnyanmisaka RK_S32 av1d_parser2_syntax(Av1CodecContext *ctx); 180*437bfbebSnyanmisaka 181*437bfbebSnyanmisaka RK_S32 mpp_av1_split_fragment(AV1Context *ctx, Av1UnitFragment *frag, RK_S32 header_flag); 182*437bfbebSnyanmisaka RK_S32 mpp_av1_read_fragment_content(AV1Context *ctx, Av1UnitFragment *frag); 183*437bfbebSnyanmisaka RK_S32 mpp_av1_set_context_with_sequence(Av1CodecContext *ctx, 184*437bfbebSnyanmisaka const AV1RawSequenceHeader *seq); 185*437bfbebSnyanmisaka void mpp_av1_fragment_reset(Av1UnitFragment *frag); 186*437bfbebSnyanmisaka RK_S32 mpp_av1_assemble_fragment(AV1Context *ctx, Av1UnitFragment *frag); 187*437bfbebSnyanmisaka void mpp_av1_flush(AV1Context *ctx); 188*437bfbebSnyanmisaka void mpp_av1_close(AV1Context *ctx); 189*437bfbebSnyanmisaka void mpp_av1_free_metadata(void *unit, RK_U8 *content); 190*437bfbebSnyanmisaka 191*437bfbebSnyanmisaka void Av1GetCDFs(AV1Context *ctx, RK_U32 ref_idx); 192*437bfbebSnyanmisaka void Av1StoreCDFs(AV1Context *ctx, RK_U32 refresh_frame_flags); 193*437bfbebSnyanmisaka 194*437bfbebSnyanmisaka #ifdef __cplusplus 195*437bfbebSnyanmisaka } 196*437bfbebSnyanmisaka #endif 197*437bfbebSnyanmisaka 198*437bfbebSnyanmisaka #endif // __AV1D_PARSER_H__ 199