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