xref: /third_party/ffmpeg/libavcodec/cavs.h (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
3cabdff1aSopenharmony_ci * Copyright (c) 2006  Stefan Gehrer <stefan.gehrer@gmx.de>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#ifndef AVCODEC_CAVS_H
23cabdff1aSopenharmony_ci#define AVCODEC_CAVS_H
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "cavsdsp.h"
28cabdff1aSopenharmony_ci#include "blockdsp.h"
29cabdff1aSopenharmony_ci#include "h264chroma.h"
30cabdff1aSopenharmony_ci#include "idctdsp.h"
31cabdff1aSopenharmony_ci#include "get_bits.h"
32cabdff1aSopenharmony_ci#include "videodsp.h"
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#define SLICE_MAX_START_CODE    0x000001af
35cabdff1aSopenharmony_ci#define EXT_START_CODE          0x000001b5
36cabdff1aSopenharmony_ci#define USER_START_CODE         0x000001b2
37cabdff1aSopenharmony_ci#define CAVS_START_CODE         0x000001b0
38cabdff1aSopenharmony_ci#define PIC_I_START_CODE        0x000001b3
39cabdff1aSopenharmony_ci#define PIC_PB_START_CODE       0x000001b6
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci#define A_AVAIL                          1
42cabdff1aSopenharmony_ci#define B_AVAIL                          2
43cabdff1aSopenharmony_ci#define C_AVAIL                          4
44cabdff1aSopenharmony_ci#define D_AVAIL                          8
45cabdff1aSopenharmony_ci#define NOT_AVAIL                       -1
46cabdff1aSopenharmony_ci#define REF_INTRA                       -2
47cabdff1aSopenharmony_ci#define REF_DIR                         -3
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci#define ESCAPE_CODE                     59
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_ci#define FWD0                          0x01
52cabdff1aSopenharmony_ci#define FWD1                          0x02
53cabdff1aSopenharmony_ci#define BWD0                          0x04
54cabdff1aSopenharmony_ci#define BWD1                          0x08
55cabdff1aSopenharmony_ci#define SYM0                          0x10
56cabdff1aSopenharmony_ci#define SYM1                          0x20
57cabdff1aSopenharmony_ci#define SPLITH                        0x40
58cabdff1aSopenharmony_ci#define SPLITV                        0x80
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci#define MV_BWD_OFFS                     12
61cabdff1aSopenharmony_ci#define MV_STRIDE                        4
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_cienum cavs_mb {
64cabdff1aSopenharmony_ci  I_8X8 = 0,
65cabdff1aSopenharmony_ci  P_SKIP,
66cabdff1aSopenharmony_ci  P_16X16,
67cabdff1aSopenharmony_ci  P_16X8,
68cabdff1aSopenharmony_ci  P_8X16,
69cabdff1aSopenharmony_ci  P_8X8,
70cabdff1aSopenharmony_ci  B_SKIP,
71cabdff1aSopenharmony_ci  B_DIRECT,
72cabdff1aSopenharmony_ci  B_FWD_16X16,
73cabdff1aSopenharmony_ci  B_BWD_16X16,
74cabdff1aSopenharmony_ci  B_SYM_16X16,
75cabdff1aSopenharmony_ci  B_8X8 = 29
76cabdff1aSopenharmony_ci};
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_cienum cavs_sub_mb {
79cabdff1aSopenharmony_ci  B_SUB_DIRECT,
80cabdff1aSopenharmony_ci  B_SUB_FWD,
81cabdff1aSopenharmony_ci  B_SUB_BWD,
82cabdff1aSopenharmony_ci  B_SUB_SYM
83cabdff1aSopenharmony_ci};
84cabdff1aSopenharmony_ci
85cabdff1aSopenharmony_cienum cavs_intra_luma {
86cabdff1aSopenharmony_ci  INTRA_L_VERT,
87cabdff1aSopenharmony_ci  INTRA_L_HORIZ,
88cabdff1aSopenharmony_ci  INTRA_L_LP,
89cabdff1aSopenharmony_ci  INTRA_L_DOWN_LEFT,
90cabdff1aSopenharmony_ci  INTRA_L_DOWN_RIGHT,
91cabdff1aSopenharmony_ci  INTRA_L_LP_LEFT,
92cabdff1aSopenharmony_ci  INTRA_L_LP_TOP,
93cabdff1aSopenharmony_ci  INTRA_L_DC_128
94cabdff1aSopenharmony_ci};
95cabdff1aSopenharmony_ci
96cabdff1aSopenharmony_cienum cavs_intra_chroma {
97cabdff1aSopenharmony_ci  INTRA_C_LP,
98cabdff1aSopenharmony_ci  INTRA_C_HORIZ,
99cabdff1aSopenharmony_ci  INTRA_C_VERT,
100cabdff1aSopenharmony_ci  INTRA_C_PLANE,
101cabdff1aSopenharmony_ci  INTRA_C_LP_LEFT,
102cabdff1aSopenharmony_ci  INTRA_C_LP_TOP,
103cabdff1aSopenharmony_ci  INTRA_C_DC_128,
104cabdff1aSopenharmony_ci};
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_cienum cavs_mv_pred {
107cabdff1aSopenharmony_ci  MV_PRED_MEDIAN,
108cabdff1aSopenharmony_ci  MV_PRED_LEFT,
109cabdff1aSopenharmony_ci  MV_PRED_TOP,
110cabdff1aSopenharmony_ci  MV_PRED_TOPRIGHT,
111cabdff1aSopenharmony_ci  MV_PRED_PSKIP,
112cabdff1aSopenharmony_ci  MV_PRED_BSKIP
113cabdff1aSopenharmony_ci};
114cabdff1aSopenharmony_ci
115cabdff1aSopenharmony_cienum cavs_block {
116cabdff1aSopenharmony_ci  BLK_16X16,
117cabdff1aSopenharmony_ci  BLK_16X8,
118cabdff1aSopenharmony_ci  BLK_8X16,
119cabdff1aSopenharmony_ci  BLK_8X8
120cabdff1aSopenharmony_ci};
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_cienum cavs_mv_loc {
123cabdff1aSopenharmony_ci  MV_FWD_D3 = 0,
124cabdff1aSopenharmony_ci  MV_FWD_B2,
125cabdff1aSopenharmony_ci  MV_FWD_B3,
126cabdff1aSopenharmony_ci  MV_FWD_C2,
127cabdff1aSopenharmony_ci  MV_FWD_A1,
128cabdff1aSopenharmony_ci  MV_FWD_X0,
129cabdff1aSopenharmony_ci  MV_FWD_X1,
130cabdff1aSopenharmony_ci  MV_FWD_A3 = 8,
131cabdff1aSopenharmony_ci  MV_FWD_X2,
132cabdff1aSopenharmony_ci  MV_FWD_X3,
133cabdff1aSopenharmony_ci  MV_BWD_D3 = MV_BWD_OFFS,
134cabdff1aSopenharmony_ci  MV_BWD_B2,
135cabdff1aSopenharmony_ci  MV_BWD_B3,
136cabdff1aSopenharmony_ci  MV_BWD_C2,
137cabdff1aSopenharmony_ci  MV_BWD_A1,
138cabdff1aSopenharmony_ci  MV_BWD_X0,
139cabdff1aSopenharmony_ci  MV_BWD_X1,
140cabdff1aSopenharmony_ci  MV_BWD_A3 = MV_BWD_OFFS+8,
141cabdff1aSopenharmony_ci  MV_BWD_X2,
142cabdff1aSopenharmony_ci  MV_BWD_X3
143cabdff1aSopenharmony_ci};
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ciDECLARE_ALIGNED(8, typedef, struct) {
146cabdff1aSopenharmony_ci    int16_t x;
147cabdff1aSopenharmony_ci    int16_t y;
148cabdff1aSopenharmony_ci    int16_t dist;
149cabdff1aSopenharmony_ci    int16_t ref;
150cabdff1aSopenharmony_ci} cavs_vector;
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_cistruct dec_2dvlc {
153cabdff1aSopenharmony_ci  int8_t rltab[59][3];
154cabdff1aSopenharmony_ci  int8_t level_add[27];
155cabdff1aSopenharmony_ci  int8_t golomb_order;
156cabdff1aSopenharmony_ci  int inc_limit;
157cabdff1aSopenharmony_ci  int8_t max_run;
158cabdff1aSopenharmony_ci};
159cabdff1aSopenharmony_ci
160cabdff1aSopenharmony_citypedef struct AVSFrame {
161cabdff1aSopenharmony_ci    AVFrame *f;
162cabdff1aSopenharmony_ci    int poc;
163cabdff1aSopenharmony_ci} AVSFrame;
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_citypedef struct AVSContext {
166cabdff1aSopenharmony_ci    AVCodecContext *avctx;
167cabdff1aSopenharmony_ci    BlockDSPContext bdsp;
168cabdff1aSopenharmony_ci    H264ChromaContext h264chroma;
169cabdff1aSopenharmony_ci    IDCTDSPContext idsp;
170cabdff1aSopenharmony_ci    VideoDSPContext vdsp;
171cabdff1aSopenharmony_ci    CAVSDSPContext  cdsp;
172cabdff1aSopenharmony_ci    GetBitContext gb;
173cabdff1aSopenharmony_ci    AVSFrame cur;     ///< currently decoded frame
174cabdff1aSopenharmony_ci    AVSFrame DPB[2];  ///< reference frames
175cabdff1aSopenharmony_ci    int dist[2];     ///< temporal distances from current frame to ref frames
176cabdff1aSopenharmony_ci    int low_delay;
177cabdff1aSopenharmony_ci    int profile, level;
178cabdff1aSopenharmony_ci    int aspect_ratio;
179cabdff1aSopenharmony_ci    int mb_width, mb_height;
180cabdff1aSopenharmony_ci    int width, height;
181cabdff1aSopenharmony_ci    int stream_revision; ///<0 for samples from 2006, 1 for rm52j encoder
182cabdff1aSopenharmony_ci    int progressive;
183cabdff1aSopenharmony_ci    int pic_structure;
184cabdff1aSopenharmony_ci    int skip_mode_flag; ///< select between skip_count or one skip_flag per MB
185cabdff1aSopenharmony_ci    int loop_filter_disable;
186cabdff1aSopenharmony_ci    int alpha_offset, beta_offset;
187cabdff1aSopenharmony_ci    int ref_flag;
188cabdff1aSopenharmony_ci    int mbx, mby, mbidx; ///< macroblock coordinates
189cabdff1aSopenharmony_ci    int flags;         ///< availability flags of neighbouring macroblocks
190cabdff1aSopenharmony_ci    int stc;           ///< last start code
191cabdff1aSopenharmony_ci    uint8_t *cy, *cu, *cv; ///< current MB sample pointers
192cabdff1aSopenharmony_ci    int left_qp;
193cabdff1aSopenharmony_ci    uint8_t *top_qp;
194cabdff1aSopenharmony_ci
195cabdff1aSopenharmony_ci    /** mv motion vector cache
196cabdff1aSopenharmony_ci       0:    D3  B2  B3  C2
197cabdff1aSopenharmony_ci       4:    A1  X0  X1   -
198cabdff1aSopenharmony_ci       8:    A3  X2  X3   -
199cabdff1aSopenharmony_ci
200cabdff1aSopenharmony_ci       X are the vectors in the current macroblock (5,6,9,10)
201cabdff1aSopenharmony_ci       A is the macroblock to the left (4,8)
202cabdff1aSopenharmony_ci       B is the macroblock to the top (1,2)
203cabdff1aSopenharmony_ci       C is the macroblock to the top-right (3)
204cabdff1aSopenharmony_ci       D is the macroblock to the top-left (0)
205cabdff1aSopenharmony_ci
206cabdff1aSopenharmony_ci       the same is repeated for backward motion vectors */
207cabdff1aSopenharmony_ci    cavs_vector mv[2*4*3];
208cabdff1aSopenharmony_ci    cavs_vector *top_mv[2];
209cabdff1aSopenharmony_ci    cavs_vector *col_mv;
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_ci    /** luma pred mode cache
212cabdff1aSopenharmony_ci       0:    --  B2  B3
213cabdff1aSopenharmony_ci       3:    A1  X0  X1
214cabdff1aSopenharmony_ci       6:    A3  X2  X3   */
215cabdff1aSopenharmony_ci    int pred_mode_Y[3*3];
216cabdff1aSopenharmony_ci    int *top_pred_Y;
217cabdff1aSopenharmony_ci    ptrdiff_t l_stride, c_stride;
218cabdff1aSopenharmony_ci    int luma_scan[4];
219cabdff1aSopenharmony_ci    int qp;
220cabdff1aSopenharmony_ci    int qp_fixed;
221cabdff1aSopenharmony_ci    int pic_qp_fixed;
222cabdff1aSopenharmony_ci    int cbp;
223cabdff1aSopenharmony_ci    ScanTable scantable;
224cabdff1aSopenharmony_ci
225cabdff1aSopenharmony_ci    /** intra prediction is done with un-deblocked samples
226cabdff1aSopenharmony_ci     they are saved here before deblocking the MB  */
227cabdff1aSopenharmony_ci    uint8_t *top_border_y, *top_border_u, *top_border_v;
228cabdff1aSopenharmony_ci    uint8_t left_border_y[26], left_border_u[10], left_border_v[10];
229cabdff1aSopenharmony_ci    uint8_t intern_border_y[26];
230cabdff1aSopenharmony_ci    uint8_t topleft_border_y, topleft_border_u, topleft_border_v;
231cabdff1aSopenharmony_ci
232cabdff1aSopenharmony_ci    void (*intra_pred_l[8])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride);
233cabdff1aSopenharmony_ci    void (*intra_pred_c[7])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride);
234cabdff1aSopenharmony_ci    uint8_t *col_type_base;
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci    /* scaling factors for MV prediction */
237cabdff1aSopenharmony_ci    int sym_factor;    ///< for scaling in symmetrical B block
238cabdff1aSopenharmony_ci    int direct_den[2]; ///< for scaling in direct B block
239cabdff1aSopenharmony_ci    int scale_den[2];  ///< for scaling neighbouring MVs
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci    uint8_t *edge_emu_buffer;
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_ci    int got_keyframe;
244cabdff1aSopenharmony_ci    int16_t *block;
245cabdff1aSopenharmony_ci} AVSContext;
246cabdff1aSopenharmony_ci
247cabdff1aSopenharmony_ciextern const uint8_t     ff_cavs_chroma_qp[64];
248cabdff1aSopenharmony_ciextern const uint8_t     ff_cavs_partition_flags[30];
249cabdff1aSopenharmony_ciextern const cavs_vector ff_cavs_intra_mv;
250cabdff1aSopenharmony_ciextern const cavs_vector ff_cavs_dir_mv;
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_cistatic inline void set_mvs(cavs_vector *mv, enum cavs_block size) {
253cabdff1aSopenharmony_ci    switch(size) {
254cabdff1aSopenharmony_ci    case BLK_16X16:
255cabdff1aSopenharmony_ci        mv[MV_STRIDE  ] = mv[0];
256cabdff1aSopenharmony_ci        mv[MV_STRIDE+1] = mv[0];
257cabdff1aSopenharmony_ci    case BLK_16X8:
258cabdff1aSopenharmony_ci        mv[1] = mv[0];
259cabdff1aSopenharmony_ci        break;
260cabdff1aSopenharmony_ci    case BLK_8X16:
261cabdff1aSopenharmony_ci        mv[MV_STRIDE] = mv[0];
262cabdff1aSopenharmony_ci        break;
263cabdff1aSopenharmony_ci    }
264cabdff1aSopenharmony_ci}
265cabdff1aSopenharmony_ci
266cabdff1aSopenharmony_civoid ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type);
267cabdff1aSopenharmony_civoid ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left,
268cabdff1aSopenharmony_ci                                  int block);
269cabdff1aSopenharmony_civoid ff_cavs_load_intra_pred_chroma(AVSContext *h);
270cabdff1aSopenharmony_civoid ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv);
271cabdff1aSopenharmony_civoid ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type);
272cabdff1aSopenharmony_civoid ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC,
273cabdff1aSopenharmony_ci                enum cavs_mv_pred mode, enum cavs_block size, int ref);
274cabdff1aSopenharmony_civoid ff_cavs_init_mb(AVSContext *h);
275cabdff1aSopenharmony_ciint  ff_cavs_next_mb(AVSContext *h);
276cabdff1aSopenharmony_ciint ff_cavs_init_pic(AVSContext *h);
277cabdff1aSopenharmony_ciint ff_cavs_init_top_lines(AVSContext *h);
278cabdff1aSopenharmony_ciint ff_cavs_init(AVCodecContext *avctx);
279cabdff1aSopenharmony_ciint ff_cavs_end (AVCodecContext *avctx);
280cabdff1aSopenharmony_ci
281cabdff1aSopenharmony_ci#endif /* AVCODEC_CAVS_H */
282