vp56.h (8146B)
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 "h264chroma.h" 35 #include "videodsp.h" 36 #include "vp3dsp.h" 37 #include "vp56dsp.h" 38 #include "vpx_rac.h" 39 40 typedef struct vp56_context VP56Context; 41 42 typedef enum { 43 VP56_FRAME_NONE =-1, 44 VP56_FRAME_CURRENT = 0, 45 VP56_FRAME_PREVIOUS = 1, 46 VP56_FRAME_GOLDEN = 2, 47 } VP56Frame; 48 49 typedef enum { 50 VP56_MB_INTER_NOVEC_PF = 0, /**< Inter MB, no vector, from previous frame */ 51 VP56_MB_INTRA = 1, /**< Intra MB */ 52 VP56_MB_INTER_DELTA_PF = 2, /**< Inter MB, above/left vector + delta, from previous frame */ 53 VP56_MB_INTER_V1_PF = 3, /**< Inter MB, first vector, from previous frame */ 54 VP56_MB_INTER_V2_PF = 4, /**< Inter MB, second vector, from previous frame */ 55 VP56_MB_INTER_NOVEC_GF = 5, /**< Inter MB, no vector, from golden frame */ 56 VP56_MB_INTER_DELTA_GF = 6, /**< Inter MB, above/left vector + delta, from golden frame */ 57 VP56_MB_INTER_4V = 7, /**< Inter MB, 4 vectors, from previous frame */ 58 VP56_MB_INTER_V1_GF = 8, /**< Inter MB, first vector, from golden frame */ 59 VP56_MB_INTER_V2_GF = 9, /**< Inter MB, second vector, from golden frame */ 60 } VP56mb; 61 62 typedef struct VP56Tree { 63 int8_t val; 64 int8_t prob_idx; 65 } VP56Tree; 66 67 typedef struct VP56mv { 68 DECLARE_ALIGNED(4, int16_t, x); 69 int16_t y; 70 } VP56mv; 71 72 #define VP56_SIZE_CHANGE 1 73 74 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, 75 VP56mv *vect); 76 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, 77 int offset1, int offset2, ptrdiff_t stride, 78 VP56mv mv, int mask, int select, int luma); 79 typedef int (*VP56ParseCoeff)(VP56Context *s); 80 typedef void (*VP56DefaultModelsInit)(VP56Context *s); 81 typedef void (*VP56ParseVectorModels)(VP56Context *s); 82 typedef int (*VP56ParseCoeffModels)(VP56Context *s); 83 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, 84 int buf_size); 85 86 typedef struct VP56RefDc { 87 uint8_t not_null_dc; 88 VP56Frame ref_frame; 89 int16_t dc_coeff; 90 } VP56RefDc; 91 92 typedef struct VP56Macroblock { 93 uint8_t type; 94 VP56mv mv; 95 } VP56Macroblock; 96 97 typedef struct VP56Model { 98 uint8_t coeff_reorder[64]; /* used in vp6 only */ 99 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ 100 uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */ 101 uint8_t vector_sig[2]; /* delta sign */ 102 uint8_t vector_dct[2]; /* delta coding types */ 103 uint8_t vector_pdi[2][2]; /* predefined delta init */ 104 uint8_t vector_pdv[2][7]; /* predefined delta values */ 105 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ 106 uint8_t coeff_dccv[2][11]; /* DC coeff value */ 107 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ 108 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ 109 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ 110 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ 111 uint8_t mb_type[3][10][10]; /* model for decoding MB type */ 112 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ 113 } VP56Model; 114 115 struct vp56_context { 116 AVCodecContext *avctx; 117 H264ChromaContext h264chroma; 118 HpelDSPContext hdsp; 119 VideoDSPContext vdsp; 120 VP3DSPContext vp3dsp; 121 VP56DSPContext vp56dsp; 122 uint8_t idct_scantable[64]; 123 AVFrame *frames[4]; 124 uint8_t *edge_emu_buffer_alloc; 125 uint8_t *edge_emu_buffer; 126 VPXRangeCoder c; 127 VPXRangeCoder cc; 128 VPXRangeCoder *ccp; 129 int sub_version; 130 131 /* frame info */ 132 int golden_frame; 133 int plane_width[4]; 134 int plane_height[4]; 135 int mb_width; /* number of horizontal MB */ 136 int mb_height; /* number of vertical MB */ 137 int block_offset[6]; 138 139 int quantizer; 140 uint16_t dequant_dc; 141 uint16_t dequant_ac; 142 143 /* DC predictors management */ 144 VP56RefDc *above_blocks; 145 VP56RefDc left_block[4]; 146 int above_block_idx[6]; 147 int16_t prev_dc[3][3]; /* [plan][ref_frame] */ 148 149 /* blocks / macroblock */ 150 VP56mb mb_type; 151 VP56Macroblock *macroblocks; 152 DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64]; 153 int idct_selector[6]; 154 const uint8_t *def_coeff_reorder;/* used in vp6 only */ 155 156 /* motion vectors */ 157 VP56mv mv[6]; /* vectors for each block in MB */ 158 VP56mv vector_candidate[2]; 159 int vector_candidate_pos; 160 161 /* filtering hints */ 162 int filter_header; /* used in vp6 only */ 163 int deblock_filtering; 164 int filter_selection; 165 int filter_mode; 166 int max_vector_length; 167 int sample_variance_threshold; 168 DECLARE_ALIGNED(8, int, bounding_values_array)[256]; 169 170 uint8_t coeff_ctx[4][64]; /* used in vp5 only */ 171 uint8_t coeff_ctx_last[4]; /* used in vp5 only */ 172 173 int has_alpha; 174 175 /* interlacing params */ 176 int interlaced; 177 int il_prob; 178 int il_block; 179 180 /* upside-down flipping hints */ 181 int flip; /* are we flipping ? */ 182 int frbi; /* first row block index in MB */ 183 int srbi; /* second row block index in MB */ 184 ptrdiff_t stride[4]; /* stride for each plan */ 185 186 const uint8_t *vp56_coord_div; 187 VP56ParseVectorAdjustment parse_vector_adjustment; 188 VP56Filter filter; 189 VP56ParseCoeff parse_coeff; 190 VP56DefaultModelsInit default_models_init; 191 VP56ParseVectorModels parse_vector_models; 192 VP56ParseCoeffModels parse_coeff_models; 193 VP56ParseHeader parse_header; 194 195 /* for "slice" parallelism between YUV and A */ 196 VP56Context *alpha_context; 197 198 VP56Model *modelp; 199 VP56Model model; 200 201 /* huffman decoding */ 202 int use_huffman; 203 GetBitContext gb; 204 VLC dccv_vlc[2]; 205 VLC runv_vlc[2]; 206 VLC ract_vlc[2][3][6]; 207 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ 208 209 int have_undamaged_frame; 210 int discard_frame; 211 }; 212 213 214 /** 215 * Initializes an VP56Context. Expects its caller to clean up 216 * in case of error. 217 */ 218 int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, 219 int flip, int has_alpha); 220 int ff_vp56_free_context(VP56Context *s); 221 void ff_vp56_init_dequant(VP56Context *s, int quantizer); 222 int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame, 223 int *got_frame, AVPacket *avpkt); 224 225 226 /** 227 * vp56 specific range coder implementation 228 */ 229 230 static int vp56_rac_gets(VPXRangeCoder *c, int bits) 231 { 232 int value = 0; 233 234 while (bits--) { 235 value = (value << 1) | vpx_rac_get(c); 236 } 237 238 return value; 239 } 240 241 // P(7) 242 static av_unused int vp56_rac_gets_nn(VPXRangeCoder *c, int bits) 243 { 244 int v = vp56_rac_gets(c, 7) << 1; 245 return v + !v; 246 } 247 248 static av_always_inline 249 int vp56_rac_get_tree(VPXRangeCoder *c, 250 const VP56Tree *tree, 251 const uint8_t *probs) 252 { 253 while (tree->val > 0) { 254 if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) 255 tree += tree->val; 256 else 257 tree++; 258 } 259 return -tree->val; 260 } 261 262 #endif /* AVCODEC_VP56_H */