1/** 2 * @file 3 * VP5 and VP6 compatible video decoder (common features) 4 * 5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> 6 * 7 * This file is part of FFmpeg. 8 * 9 * FFmpeg is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * FFmpeg is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with FFmpeg; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 24#ifndef AVCODEC_VP56_H 25#define AVCODEC_VP56_H 26 27#include "vp56data.h" 28#include "dsputil.h" 29#include "get_bits.h" 30#include "bytestream.h" 31#include "vp56dsp.h" 32 33typedef struct vp56_context VP56Context; 34typedef struct vp56_mv VP56mv; 35 36typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, 37 VP56mv *vect); 38typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, 39 int offset1, int offset2, int stride, 40 VP56mv mv, int mask, int select, int luma); 41typedef void (*VP56ParseCoeff)(VP56Context *s); 42typedef void (*VP56DefaultModelsInit)(VP56Context *s); 43typedef void (*VP56ParseVectorModels)(VP56Context *s); 44typedef void (*VP56ParseCoeffModels)(VP56Context *s); 45typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, 46 int buf_size, int *golden_frame); 47 48typedef struct { 49 int high; 50 int bits; 51 const uint8_t *buffer; 52 const uint8_t *end; 53 unsigned long code_word; 54} VP56RangeCoder; 55 56typedef struct { 57 uint8_t not_null_dc; 58 VP56Frame ref_frame; 59 DCTELEM dc_coeff; 60} VP56RefDc; 61 62struct vp56_mv { 63 int x; 64 int y; 65}; 66 67typedef struct { 68 uint8_t type; 69 VP56mv mv; 70} VP56Macroblock; 71 72typedef struct { 73 uint8_t coeff_reorder[64]; /* used in vp6 only */ 74 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ 75 uint8_t vector_sig[2]; /* delta sign */ 76 uint8_t vector_dct[2]; /* delta coding types */ 77 uint8_t vector_pdi[2][2]; /* predefined delta init */ 78 uint8_t vector_pdv[2][7]; /* predefined delta values */ 79 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ 80 uint8_t coeff_dccv[2][11]; /* DC coeff value */ 81 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ 82 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ 83 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ 84 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ 85 uint8_t mb_type[3][10][10]; /* model for decoding MB type */ 86 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ 87} VP56Model; 88 89struct vp56_context { 90 AVCodecContext *avctx; 91 DSPContext dsp; 92 VP56DSPContext vp56dsp; 93 ScanTable scantable; 94 AVFrame frames[4]; 95 AVFrame *framep[6]; 96 uint8_t *edge_emu_buffer_alloc; 97 uint8_t *edge_emu_buffer; 98 VP56RangeCoder c; 99 VP56RangeCoder cc; 100 VP56RangeCoder *ccp; 101 int sub_version; 102 103 /* frame info */ 104 int plane_width[4]; 105 int plane_height[4]; 106 int mb_width; /* number of horizontal MB */ 107 int mb_height; /* number of vertical MB */ 108 int block_offset[6]; 109 110 int quantizer; 111 uint16_t dequant_dc; 112 uint16_t dequant_ac; 113 int8_t *qscale_table; 114 115 /* DC predictors management */ 116 VP56RefDc *above_blocks; 117 VP56RefDc left_block[4]; 118 int above_block_idx[6]; 119 DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */ 120 121 /* blocks / macroblock */ 122 VP56mb mb_type; 123 VP56Macroblock *macroblocks; 124 DECLARE_ALIGNED(16, DCTELEM, block_coeff)[6][64]; 125 126 /* motion vectors */ 127 VP56mv mv[6]; /* vectors for each block in MB */ 128 VP56mv vector_candidate[2]; 129 int vector_candidate_pos; 130 131 /* filtering hints */ 132 int filter_header; /* used in vp6 only */ 133 int deblock_filtering; 134 int filter_selection; 135 int filter_mode; 136 int max_vector_length; 137 int sample_variance_threshold; 138 139 uint8_t coeff_ctx[4][64]; /* used in vp5 only */ 140 uint8_t coeff_ctx_last[4]; /* used in vp5 only */ 141 142 int has_alpha; 143 144 /* upside-down flipping hints */ 145 int flip; /* are we flipping ? */ 146 int frbi; /* first row block index in MB */ 147 int srbi; /* second row block index in MB */ 148 int stride[4]; /* stride for each plan */ 149 150 const uint8_t *vp56_coord_div; 151 VP56ParseVectorAdjustment parse_vector_adjustment; 152 VP56Filter filter; 153 VP56ParseCoeff parse_coeff; 154 VP56DefaultModelsInit default_models_init; 155 VP56ParseVectorModels parse_vector_models; 156 VP56ParseCoeffModels parse_coeff_models; 157 VP56ParseHeader parse_header; 158 159 VP56Model *modelp; 160 VP56Model models[2]; 161 162 /* huffman decoding */ 163 int use_huffman; 164 GetBitContext gb; 165 VLC dccv_vlc[2]; 166 VLC runv_vlc[2]; 167 VLC ract_vlc[2][3][6]; 168 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ 169}; 170 171 172void vp56_init(AVCodecContext *avctx, int flip, int has_alpha); 173int vp56_free(AVCodecContext *avctx); 174void vp56_init_dequant(VP56Context *s, int quantizer); 175int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, 176 AVPacket *avpkt); 177 178 179/** 180 * vp56 specific range coder implementation 181 */ 182 183static inline void vp56_init_range_decoder(VP56RangeCoder *c, 184 const uint8_t *buf, int buf_size) 185{ 186 c->high = 255; 187 c->bits = 8; 188 c->buffer = buf; 189 c->end = buf + buf_size; 190 c->code_word = bytestream_get_be16(&c->buffer); 191} 192 193static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) 194{ 195 unsigned int low = 1 + (((c->high - 1) * prob) / 256); 196 unsigned int low_shift = low << 8; 197 int bit = c->code_word >= low_shift; 198 199 if (bit) { 200 c->high -= low; 201 c->code_word -= low_shift; 202 } else { 203 c->high = low; 204 } 205 206 /* normalize */ 207 while (c->high < 128) { 208 c->high <<= 1; 209 c->code_word <<= 1; 210 if (--c->bits == 0 && c->buffer < c->end) { 211 c->bits = 8; 212 c->code_word |= *c->buffer++; 213 } 214 } 215 return bit; 216} 217 218static inline int vp56_rac_get(VP56RangeCoder *c) 219{ 220 /* equiprobable */ 221 int low = (c->high + 1) >> 1; 222 unsigned int low_shift = low << 8; 223 int bit = c->code_word >= low_shift; 224 if (bit) { 225 c->high = (c->high - low) << 1; 226 c->code_word -= low_shift; 227 } else { 228 c->high = low << 1; 229 } 230 231 /* normalize */ 232 c->code_word <<= 1; 233 if (--c->bits == 0 && c->buffer < c->end) { 234 c->bits = 8; 235 c->code_word |= *c->buffer++; 236 } 237 return bit; 238} 239 240static inline int vp56_rac_gets(VP56RangeCoder *c, int bits) 241{ 242 int value = 0; 243 244 while (bits--) { 245 value = (value << 1) | vp56_rac_get(c); 246 } 247 248 return value; 249} 250 251static inline int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) 252{ 253 int v = vp56_rac_gets(c, 7) << 1; 254 return v + !v; 255} 256 257static inline int vp56_rac_get_tree(VP56RangeCoder *c, 258 const VP56Tree *tree, 259 const uint8_t *probs) 260{ 261 while (tree->val > 0) { 262 if (vp56_rac_get_prob(c, probs[tree->prob_idx])) 263 tree += tree->val; 264 else 265 tree++; 266 } 267 return -tree->val; 268} 269 270#endif /* AVCODEC_VP56_H */ 271