annotate ffmpeg/libavcodec/cavs.h @ 13:844d341cf643 tip

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