xref: /rockchip-linux_mpp/mpp/codec/dec/av1/av1d_parser.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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