/* * Copyright 2021 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __AV1D_PARSER_H__ #define __AV1D_PARSER_H__ #include #include "mpp_mem.h" #include "mpp_bitread.h" #include "parser_api.h" #include "av1.h" #include "av1d_codec.h" #include "av1d_cbs.h" #include "av1d_syntax.h" #include "av1d_common.h" #include "av1_entropymode.h" extern RK_U32 av1d_debug; #define AV1D_DBG_FUNCTION (0x00000001) #define AV1D_DBG_HEADER (0x00000002) #define AV1D_DBG_REF (0x00000004) #define AV1D_DBG_STRMIN (0x00000008) #define av1d_dbg(flag, fmt, ...) _mpp_dbg(av1d_debug, flag, fmt, ##__VA_ARGS__) #define av1d_dbg_func(fmt, ...) av1d_dbg(AV1D_DBG_FUNCTION, fmt, ## __VA_ARGS__) typedef struct RefInfo { RK_S32 ref_count; RK_U32 invisible; RK_U32 is_output; RK_U32 lst_frame_offset; RK_U32 lst2_frame_offset; RK_U32 lst3_frame_offset; RK_U32 gld_frame_offset; RK_U32 bwd_frame_offset; RK_U32 alt2_frame_offset; RK_U32 alt_frame_offset; RK_U32 is_intra_frame; RK_U32 intra_only; } RefInfo; typedef struct AV1Frame { MppFrame f; RK_S32 slot_index; AV1RawFrameHeader *raw_frame_header; RK_S32 temporal_id; RK_S32 spatial_id; RK_U8 order_hint; RK_U8 gm_type[AV1_NUM_REF_FRAMES]; RK_S32 gm_params[AV1_NUM_REF_FRAMES][6]; RK_U8 skip_mode_frame_idx[2]; AV1RawFilmGrainParams film_grain; RK_U8 coded_lossless; RefInfo *ref; } AV1Frame; typedef struct AV1Context_t { BitReadCtx_t gb; AV1RawSequenceHeader *sequence_header; AV1RawSequenceHeader *seq_ref; AV1RawFrameHeader *raw_frame_header; Av1UnitFragment current_obu; RK_S32 seen_frame_header; RK_U8 *frame_header; size_t frame_header_size; AV1Frame ref[AV1_NUM_REF_FRAMES]; AV1Frame cur_frame; RK_S32 temporal_id; RK_S32 spatial_id; RK_S32 operating_point_idc; RK_S32 bit_depth; RK_S32 order_hint; RK_S32 frame_width; RK_S32 frame_height; RK_S32 upscaled_width; RK_S32 render_width; RK_S32 render_height; RK_S32 num_planes; RK_S32 coded_lossless; RK_S32 all_lossless; RK_S32 tile_cols; RK_S32 tile_rows; RK_S32 tile_num; RK_S32 operating_point; RK_S32 extra_has_frame; RK_U32 frame_tag_size; RK_U32 obu_len; AV1CDFs *cdfs; MvCDFs *cdfs_ndvc; AV1CDFs default_cdfs; MvCDFs default_cdfs_ndvc; AV1CDFs cdfs_last[NUM_REF_FRAMES]; MvCDFs cdfs_last_ndvc[NUM_REF_FRAMES]; RK_U8 disable_frame_end_update_cdf; RK_U8 frame_is_intra; RK_U8 refresh_frame_flags; const Av1UnitType *unit_types; RK_S32 nb_unit_types; RK_U32 tile_offset_start[AV1_MAX_TILES]; RK_U32 tile_offset_end[AV1_MAX_TILES]; AV1ReferenceFrameState ref_s[AV1_NUM_REF_FRAMES]; MppBufSlots slots; MppBufSlots packet_slots; RK_U8 skip_ref0; RK_U8 skip_ref1; MppDecCfgSet *cfg; HalDecTask *task; RK_S32 eos; ///< current packet contains an EOS/EOB NAL RK_S64 pts; } AV1Context; #ifdef __cplusplus extern "C" { #endif MPP_RET av1d_parser_init(Av1CodecContext *ctx, ParserCfg *init); MPP_RET av1d_parser_deinit(Av1CodecContext *ctx); RK_S32 av1d_parser_frame(Av1CodecContext *ctx, HalDecTask *in_task); void av1d_parser_update(Av1CodecContext *ctx, void *info); MPP_RET av1d_paser_reset(Av1CodecContext *ctx); RK_S32 av1d_split_frame(SplitContext_t *ctx, RK_U8 **out_data, RK_S32 *out_size, RK_U8 *data, RK_S32 size); MPP_RET av1d_get_frame_stream(Av1CodecContext *ctx, RK_U8 *buf, RK_S32 length); MPP_RET av1d_split_deinit(Av1CodecContext *ctx); MPP_RET av1d_split_init(Av1CodecContext *ctx); RK_S32 av1d_parser2_syntax(Av1CodecContext *ctx); RK_S32 mpp_av1_split_fragment(AV1Context *ctx, Av1UnitFragment *frag, RK_S32 header_flag); RK_S32 mpp_av1_read_fragment_content(AV1Context *ctx, Av1UnitFragment *frag); RK_S32 mpp_av1_set_context_with_sequence(Av1CodecContext *ctx, const AV1RawSequenceHeader *seq); void mpp_av1_fragment_reset(Av1UnitFragment *frag); RK_S32 mpp_av1_assemble_fragment(AV1Context *ctx, Av1UnitFragment *frag); void mpp_av1_flush(AV1Context *ctx); void mpp_av1_close(AV1Context *ctx); void mpp_av1_free_metadata(void *unit, RK_U8 *content); void Av1GetCDFs(AV1Context *ctx, RK_U32 ref_idx); void Av1StoreCDFs(AV1Context *ctx, RK_U32 refresh_frame_flags); #ifdef __cplusplus } #endif #endif // __AV1D_PARSER_H__