xref: /rockchip-linux_mpp/mpp/codec/dec/av1/av1d_codec.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_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