1/** 2 * @file libavcodec/vp5.c 3 * VP5 compatible video decoder 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#include <stdlib.h> 25#include <string.h> 26 27#include "avcodec.h" 28#include "dsputil.h" 29#include "bitstream.h" 30 31#include "vp56.h" 32#include "vp56data.h" 33#include "vp5data.h" 34 35 36static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, 37 int *golden_frame) 38{ 39 VP56RangeCoder *c = &s->c; 40 int rows, cols; 41 42 vp56_init_range_decoder(&s->c, buf, buf_size); 43 s->framep[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c); 44 vp56_rac_get(c); 45 vp56_init_dequant(s, vp56_rac_gets(c, 6)); 46 if (s->framep[VP56_FRAME_CURRENT]->key_frame) 47 { 48 vp56_rac_gets(c, 8); 49 if(vp56_rac_gets(c, 5) > 5) 50 return 0; 51 vp56_rac_gets(c, 2); 52 if (vp56_rac_get(c)) { 53 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); 54 return 0; 55 } 56 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */ 57 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */ 58 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */ 59 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */ 60 vp56_rac_gets(c, 2); 61 if (!s->macroblocks || /* first frame */ 62 16*cols != s->avctx->coded_width || 63 16*rows != s->avctx->coded_height) { 64 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows); 65 return 2; 66 } 67 } else if (!s->macroblocks) 68 return 0; 69 return 1; 70} 71 72/* Gives very similar result than the vp6 version except in a few cases */ 73static int vp5_adjust(int v, int t) 74{ 75 int s2, s1 = v >> 31; 76 v ^= s1; 77 v -= s1; 78 v *= v < 2*t; 79 v -= t; 80 s2 = v >> 31; 81 v ^= s2; 82 v -= s2; 83 v = t - v; 84 v += s1; 85 v ^= s1; 86 return v; 87} 88 89static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect) 90{ 91 VP56RangeCoder *c = &s->c; 92 VP56Model *model = s->modelp; 93 int comp, di; 94 95 for (comp=0; comp<2; comp++) { 96 int delta = 0; 97 if (vp56_rac_get_prob(c, model->vector_dct[comp])) { 98 int sign = vp56_rac_get_prob(c, model->vector_sig[comp]); 99 di = vp56_rac_get_prob(c, model->vector_pdi[comp][0]); 100 di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1; 101 delta = vp56_rac_get_tree(c, vp56_pva_tree, 102 model->vector_pdv[comp]); 103 delta = di | (delta << 2); 104 delta = (delta ^ -sign) + sign; 105 } 106 if (!comp) 107 vect->x = delta; 108 else 109 vect->y = delta; 110 } 111} 112 113static void vp5_parse_vector_models(VP56Context *s) 114{ 115 VP56RangeCoder *c = &s->c; 116 VP56Model *model = s->modelp; 117 int comp, node; 118 119 for (comp=0; comp<2; comp++) { 120 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][0])) 121 model->vector_dct[comp] = vp56_rac_gets_nn(c, 7); 122 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][1])) 123 model->vector_sig[comp] = vp56_rac_gets_nn(c, 7); 124 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][2])) 125 model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7); 126 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][3])) 127 model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7); 128 } 129 130 for (comp=0; comp<2; comp++) 131 for (node=0; node<7; node++) 132 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][4 + node])) 133 model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7); 134} 135 136static void vp5_parse_coeff_models(VP56Context *s) 137{ 138 VP56RangeCoder *c = &s->c; 139 VP56Model *model = s->modelp; 140 uint8_t def_prob[11]; 141 int node, cg, ctx; 142 int ct; /* code type */ 143 int pt; /* plane type (0 for Y, 1 for U or V) */ 144 145 memset(def_prob, 0x80, sizeof(def_prob)); 146 147 for (pt=0; pt<2; pt++) 148 for (node=0; node<11; node++) 149 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) { 150 def_prob[node] = vp56_rac_gets_nn(c, 7); 151 model->coeff_dccv[pt][node] = def_prob[node]; 152 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) { 153 model->coeff_dccv[pt][node] = def_prob[node]; 154 } 155 156 for (ct=0; ct<3; ct++) 157 for (pt=0; pt<2; pt++) 158 for (cg=0; cg<6; cg++) 159 for (node=0; node<11; node++) 160 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) { 161 def_prob[node] = vp56_rac_gets_nn(c, 7); 162 model->coeff_ract[pt][ct][cg][node] = def_prob[node]; 163 } else if (s->framep[VP56_FRAME_CURRENT]->key_frame) { 164 model->coeff_ract[pt][ct][cg][node] = def_prob[node]; 165 } 166 167 /* coeff_dcct is a linear combination of coeff_dccv */ 168 for (pt=0; pt<2; pt++) 169 for (ctx=0; ctx<36; ctx++) 170 for (node=0; node<5; node++) 171 model->coeff_dcct[pt][ctx][node] = av_clip(((model->coeff_dccv[pt][node] * vp5_dccv_lc[node][ctx][0] + 128) >> 8) + vp5_dccv_lc[node][ctx][1], 1, 254); 172 173 /* coeff_acct is a linear combination of coeff_ract */ 174 for (ct=0; ct<3; ct++) 175 for (pt=0; pt<2; pt++) 176 for (cg=0; cg<3; cg++) 177 for (ctx=0; ctx<6; ctx++) 178 for (node=0; node<5; node++) 179 model->coeff_acct[pt][ct][cg][ctx][node] = av_clip(((model->coeff_ract[pt][ct][cg][node] * vp5_ract_lc[ct][cg][node][ctx][0] + 128) >> 8) + vp5_ract_lc[ct][cg][node][ctx][1], 1, 254); 180} 181 182static void vp5_parse_coeff(VP56Context *s) 183{ 184 VP56RangeCoder *c = &s->c; 185 VP56Model *model = s->modelp; 186 uint8_t *permute = s->scantable.permutated; 187 uint8_t *model1, *model2; 188 int coeff, sign, coeff_idx; 189 int b, i, cg, idx, ctx, ctx_last; 190 int pt = 0; /* plane type (0 for Y, 1 for U or V) */ 191 192 for (b=0; b<6; b++) { 193 int ct = 1; /* code type */ 194 195 if (b > 3) pt = 1; 196 197 ctx = 6*s->coeff_ctx[vp56_b6to4[b]][0] 198 + s->above_blocks[s->above_block_idx[b]].not_null_dc; 199 model1 = model->coeff_dccv[pt]; 200 model2 = model->coeff_dcct[pt][ctx]; 201 202 for (coeff_idx=0; coeff_idx<64; ) { 203 if (vp56_rac_get_prob(c, model2[0])) { 204 if (vp56_rac_get_prob(c, model2[2])) { 205 if (vp56_rac_get_prob(c, model2[3])) { 206 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 4; 207 idx = vp56_rac_get_tree(c, vp56_pc_tree, model1); 208 sign = vp56_rac_get(c); 209 coeff = vp56_coeff_bias[idx+5]; 210 for (i=vp56_coeff_bit_length[idx]; i>=0; i--) 211 coeff += vp56_rac_get_prob(c, vp56_coeff_parse_table[idx][i]) << i; 212 } else { 213 if (vp56_rac_get_prob(c, model2[4])) { 214 coeff = 3 + vp56_rac_get_prob(c, model1[5]); 215 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 3; 216 } else { 217 coeff = 2; 218 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 2; 219 } 220 sign = vp56_rac_get(c); 221 } 222 ct = 2; 223 } else { 224 ct = 1; 225 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 1; 226 sign = vp56_rac_get(c); 227 coeff = 1; 228 } 229 coeff = (coeff ^ -sign) + sign; 230 if (coeff_idx) 231 coeff *= s->dequant_ac; 232 s->block_coeff[b][permute[coeff_idx]] = coeff; 233 } else { 234 if (ct && !vp56_rac_get_prob(c, model2[1])) 235 break; 236 ct = 0; 237 s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0; 238 } 239 240 cg = vp5_coeff_groups[++coeff_idx]; 241 ctx = s->coeff_ctx[vp56_b6to4[b]][coeff_idx]; 242 model1 = model->coeff_ract[pt][ct][cg]; 243 model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx]; 244 } 245 246 ctx_last = FFMIN(s->coeff_ctx_last[vp56_b6to4[b]], 24); 247 s->coeff_ctx_last[vp56_b6to4[b]] = coeff_idx; 248 if (coeff_idx < ctx_last) 249 for (i=coeff_idx; i<=ctx_last; i++) 250 s->coeff_ctx[vp56_b6to4[b]][i] = 5; 251 s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[vp56_b6to4[b]][0]; 252 } 253} 254 255static void vp5_default_models_init(VP56Context *s) 256{ 257 VP56Model *model = s->modelp; 258 int i; 259 260 for (i=0; i<2; i++) { 261 model->vector_sig[i] = 0x80; 262 model->vector_dct[i] = 0x80; 263 model->vector_pdi[i][0] = 0x55; 264 model->vector_pdi[i][1] = 0x80; 265 } 266 memcpy(model->mb_types_stats, vp56_def_mb_types_stats, sizeof(model->mb_types_stats)); 267 memset(model->vector_pdv, 0x80, sizeof(model->vector_pdv)); 268} 269 270static av_cold int vp5_decode_init(AVCodecContext *avctx) 271{ 272 VP56Context *s = avctx->priv_data; 273 274 vp56_init(avctx, 1, 0); 275 s->vp56_coord_div = vp5_coord_div; 276 s->parse_vector_adjustment = vp5_parse_vector_adjustment; 277 s->adjust = vp5_adjust; 278 s->parse_coeff = vp5_parse_coeff; 279 s->default_models_init = vp5_default_models_init; 280 s->parse_vector_models = vp5_parse_vector_models; 281 s->parse_coeff_models = vp5_parse_coeff_models; 282 s->parse_header = vp5_parse_header; 283 284 return 0; 285} 286 287AVCodec vp5_decoder = { 288 "vp5", 289 CODEC_TYPE_VIDEO, 290 CODEC_ID_VP5, 291 sizeof(VP56Context), 292 vp5_decode_init, 293 NULL, 294 vp56_free, 295 vp56_decode_frame, 296 CODEC_CAP_DR1, 297 .long_name = NULL_IF_CONFIG_SMALL("On2 VP5"), 298}; 299