1/* 2 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21/** 22 * @file 23 * VP5 and VP6 compatible video decoder (common features) 24 */ 25 26#ifndef AVCODEC_VP56_H 27#define AVCODEC_VP56_H 28 29#include "libavutil/mem_internal.h" 30 31#include "avcodec.h" 32#include "get_bits.h" 33#include "hpeldsp.h" 34#include "bytestream.h" 35#include "h264chroma.h" 36#include "videodsp.h" 37#include "vp3dsp.h" 38#include "vp56dsp.h" 39 40typedef struct vp56_context VP56Context; 41 42typedef enum { 43 VP56_FRAME_NONE =-1, 44 VP56_FRAME_CURRENT = 0, 45 VP56_FRAME_PREVIOUS = 1, 46 VP56_FRAME_GOLDEN = 2, 47 VP56_FRAME_GOLDEN2 = 3, 48} VP56Frame; 49 50typedef enum { 51 VP56_MB_INTER_NOVEC_PF = 0, /**< Inter MB, no vector, from previous frame */ 52 VP56_MB_INTRA = 1, /**< Intra MB */ 53 VP56_MB_INTER_DELTA_PF = 2, /**< Inter MB, above/left vector + delta, from previous frame */ 54 VP56_MB_INTER_V1_PF = 3, /**< Inter MB, first vector, from previous frame */ 55 VP56_MB_INTER_V2_PF = 4, /**< Inter MB, second vector, from previous frame */ 56 VP56_MB_INTER_NOVEC_GF = 5, /**< Inter MB, no vector, from golden frame */ 57 VP56_MB_INTER_DELTA_GF = 6, /**< Inter MB, above/left vector + delta, from golden frame */ 58 VP56_MB_INTER_4V = 7, /**< Inter MB, 4 vectors, from previous frame */ 59 VP56_MB_INTER_V1_GF = 8, /**< Inter MB, first vector, from golden frame */ 60 VP56_MB_INTER_V2_GF = 9, /**< Inter MB, second vector, from golden frame */ 61} VP56mb; 62 63typedef struct VP56Tree { 64 int8_t val; 65 int8_t prob_idx; 66} VP56Tree; 67 68typedef struct VP56mv { 69 DECLARE_ALIGNED(4, int16_t, x); 70 int16_t y; 71} VP56mv; 72 73#define VP56_SIZE_CHANGE 1 74 75typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, 76 VP56mv *vect); 77typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, 78 int offset1, int offset2, ptrdiff_t stride, 79 VP56mv mv, int mask, int select, int luma); 80typedef int (*VP56ParseCoeff)(VP56Context *s); 81typedef void (*VP56DefaultModelsInit)(VP56Context *s); 82typedef void (*VP56ParseVectorModels)(VP56Context *s); 83typedef int (*VP56ParseCoeffModels)(VP56Context *s); 84typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, 85 int buf_size); 86 87typedef struct VP56RangeCoder { 88 int high; 89 int bits; /* stored negated (i.e. negative "bits" is a positive number of 90 bits left) in order to eliminate a negate in cache refilling */ 91 const uint8_t *buffer; 92 const uint8_t *end; 93 unsigned int code_word; 94 int end_reached; 95} VP56RangeCoder; 96 97typedef struct VP56RefDc { 98 uint8_t not_null_dc; 99 VP56Frame ref_frame; 100 int16_t dc_coeff; 101} VP56RefDc; 102 103typedef struct VP56Macroblock { 104 uint8_t type; 105 VP56mv mv; 106} VP56Macroblock; 107 108typedef struct VP56Model { 109 uint8_t coeff_reorder[64]; /* used in vp6 only */ 110 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ 111 uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */ 112 uint8_t vector_sig[2]; /* delta sign */ 113 uint8_t vector_dct[2]; /* delta coding types */ 114 uint8_t vector_pdi[2][2]; /* predefined delta init */ 115 uint8_t vector_pdv[2][7]; /* predefined delta values */ 116 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ 117 uint8_t coeff_dccv[2][11]; /* DC coeff value */ 118 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ 119 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ 120 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ 121 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ 122 uint8_t mb_type[3][10][10]; /* model for decoding MB type */ 123 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ 124} VP56Model; 125 126struct vp56_context { 127 AVCodecContext *avctx; 128 H264ChromaContext h264chroma; 129 HpelDSPContext hdsp; 130 VideoDSPContext vdsp; 131 VP3DSPContext vp3dsp; 132 VP56DSPContext vp56dsp; 133 uint8_t idct_scantable[64]; 134 AVFrame *frames[4]; 135 uint8_t *edge_emu_buffer_alloc; 136 uint8_t *edge_emu_buffer; 137 VP56RangeCoder c; 138 VP56RangeCoder cc; 139 VP56RangeCoder *ccp; 140 int sub_version; 141 142 /* frame info */ 143 int golden_frame; 144 int plane_width[4]; 145 int plane_height[4]; 146 int mb_width; /* number of horizontal MB */ 147 int mb_height; /* number of vertical MB */ 148 int block_offset[6]; 149 150 int quantizer; 151 uint16_t dequant_dc; 152 uint16_t dequant_ac; 153 154 /* DC predictors management */ 155 VP56RefDc *above_blocks; 156 VP56RefDc left_block[4]; 157 int above_block_idx[6]; 158 int16_t prev_dc[3][3]; /* [plan][ref_frame] */ 159 160 /* blocks / macroblock */ 161 VP56mb mb_type; 162 VP56Macroblock *macroblocks; 163 DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64]; 164 int idct_selector[6]; 165 166 /* motion vectors */ 167 VP56mv mv[6]; /* vectors for each block in MB */ 168 VP56mv vector_candidate[2]; 169 int vector_candidate_pos; 170 171 /* filtering hints */ 172 int filter_header; /* used in vp6 only */ 173 int deblock_filtering; 174 int filter_selection; 175 int filter_mode; 176 int max_vector_length; 177 int sample_variance_threshold; 178 DECLARE_ALIGNED(8, int, bounding_values_array)[256]; 179 180 uint8_t coeff_ctx[4][64]; /* used in vp5 only */ 181 uint8_t coeff_ctx_last[4]; /* used in vp5 only */ 182 183 int has_alpha; 184 185 /* upside-down flipping hints */ 186 int flip; /* are we flipping ? */ 187 int frbi; /* first row block index in MB */ 188 int srbi; /* second row block index in MB */ 189 ptrdiff_t stride[4]; /* stride for each plan */ 190 191 const uint8_t *vp56_coord_div; 192 VP56ParseVectorAdjustment parse_vector_adjustment; 193 VP56Filter filter; 194 VP56ParseCoeff parse_coeff; 195 VP56DefaultModelsInit default_models_init; 196 VP56ParseVectorModels parse_vector_models; 197 VP56ParseCoeffModels parse_coeff_models; 198 VP56ParseHeader parse_header; 199 200 /* for "slice" parallelism between YUV and A */ 201 VP56Context *alpha_context; 202 203 VP56Model *modelp; 204 VP56Model model; 205 206 /* huffman decoding */ 207 int use_huffman; 208 GetBitContext gb; 209 VLC dccv_vlc[2]; 210 VLC runv_vlc[2]; 211 VLC ract_vlc[2][3][6]; 212 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ 213 214 int have_undamaged_frame; 215 int discard_frame; 216}; 217 218 219/** 220 * Initializes an VP56Context. Expects its caller to clean up 221 * in case of error. 222 */ 223int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, 224 int flip, int has_alpha); 225int ff_vp56_free_context(VP56Context *s); 226void ff_vp56_init_dequant(VP56Context *s, int quantizer); 227int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame, 228 int *got_frame, AVPacket *avpkt); 229 230 231/** 232 * vp56 specific range coder implementation 233 */ 234 235extern const uint8_t ff_vp56_norm_shift[256]; 236int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size); 237 238/** 239 * vp5689 returns 1 if the end of the stream has been reached, 0 otherwise. 240 */ 241static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c) 242{ 243 if (c->end <= c->buffer && c->bits >= 0) 244 c->end_reached ++; 245 return c->end_reached > 10; 246} 247 248static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c) 249{ 250 int shift = ff_vp56_norm_shift[c->high]; 251 int bits = c->bits; 252 unsigned int code_word = c->code_word; 253 254 c->high <<= shift; 255 code_word <<= shift; 256 bits += shift; 257 if(bits >= 0 && c->buffer < c->end) { 258 code_word |= bytestream_get_be16(&c->buffer) << bits; 259 bits -= 16; 260 } 261 c->bits = bits; 262 return code_word; 263} 264 265#if ARCH_ARM 266#include "arm/vp56_arith.h" 267#elif ARCH_X86 268#include "x86/vp56_arith.h" 269#endif 270 271#ifndef vp56_rac_get_prob 272#define vp56_rac_get_prob vp56_rac_get_prob 273static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) 274{ 275 unsigned int code_word = vp56_rac_renorm(c); 276 unsigned int low = 1 + (((c->high - 1) * prob) >> 8); 277 unsigned int low_shift = low << 16; 278 int bit = code_word >= low_shift; 279 280 c->high = bit ? c->high - low : low; 281 c->code_word = bit ? code_word - low_shift : code_word; 282 283 return bit; 284} 285#endif 286 287#ifndef vp56_rac_get_prob_branchy 288// branchy variant, to be used where there's a branch based on the bit decoded 289static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob) 290{ 291 unsigned long code_word = vp56_rac_renorm(c); 292 unsigned low = 1 + (((c->high - 1) * prob) >> 8); 293 unsigned low_shift = low << 16; 294 295 if (code_word >= low_shift) { 296 c->high -= low; 297 c->code_word = code_word - low_shift; 298 return 1; 299 } 300 301 c->high = low; 302 c->code_word = code_word; 303 return 0; 304} 305#endif 306 307static av_always_inline int vp56_rac_get(VP56RangeCoder *c) 308{ 309 unsigned int code_word = vp56_rac_renorm(c); 310 /* equiprobable */ 311 int low = (c->high + 1) >> 1; 312 unsigned int low_shift = low << 16; 313 int bit = code_word >= low_shift; 314 if (bit) { 315 c->high -= low; 316 code_word -= low_shift; 317 } else { 318 c->high = low; 319 } 320 321 c->code_word = code_word; 322 return bit; 323} 324 325// rounding is different than vp56_rac_get, is vp56_rac_get wrong? 326static av_always_inline int vp8_rac_get(VP56RangeCoder *c) 327{ 328 return vp56_rac_get_prob(c, 128); 329} 330 331static int vp56_rac_gets(VP56RangeCoder *c, int bits) 332{ 333 int value = 0; 334 335 while (bits--) { 336 value = (value << 1) | vp56_rac_get(c); 337 } 338 339 return value; 340} 341 342static int vp8_rac_get_uint(VP56RangeCoder *c, int bits) 343{ 344 int value = 0; 345 346 while (bits--) { 347 value = (value << 1) | vp8_rac_get(c); 348 } 349 350 return value; 351} 352 353// fixme: add 1 bit to all the calls to this? 354static av_unused int vp8_rac_get_sint(VP56RangeCoder *c, int bits) 355{ 356 int v; 357 358 if (!vp8_rac_get(c)) 359 return 0; 360 361 v = vp8_rac_get_uint(c, bits); 362 363 if (vp8_rac_get(c)) 364 v = -v; 365 366 return v; 367} 368 369// P(7) 370static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) 371{ 372 int v = vp56_rac_gets(c, 7) << 1; 373 return v + !v; 374} 375 376static av_unused int vp8_rac_get_nn(VP56RangeCoder *c) 377{ 378 int v = vp8_rac_get_uint(c, 7) << 1; 379 return v + !v; 380} 381 382static av_always_inline 383int vp56_rac_get_tree(VP56RangeCoder *c, 384 const VP56Tree *tree, 385 const uint8_t *probs) 386{ 387 while (tree->val > 0) { 388 if (vp56_rac_get_prob_branchy(c, probs[tree->prob_idx])) 389 tree += tree->val; 390 else 391 tree++; 392 } 393 return -tree->val; 394} 395 396// how probabilities are associated with decisions is different I think 397// well, the new scheme fits in the old but this way has one fewer branches per decision 398static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2], 399 const uint8_t *probs) 400{ 401 int i = 0; 402 403 do { 404 i = tree[i][vp56_rac_get_prob(c, probs[i])]; 405 } while (i > 0); 406 407 return -i; 408} 409 410// DCTextra 411static av_always_inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob) 412{ 413 int v = 0; 414 415 do { 416 v = (v<<1) + vp56_rac_get_prob(c, *prob++); 417 } while (*prob); 418 419 return v; 420} 421 422#endif /* AVCODEC_VP56_H */ 423