annotate ffmpeg/libavcodec/vp5.c @ 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 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 /**
yading@10 22 * @file
yading@10 23 * VP5 compatible video decoder
yading@10 24 */
yading@10 25
yading@10 26 #include <stdlib.h>
yading@10 27 #include <string.h>
yading@10 28
yading@10 29 #include "avcodec.h"
yading@10 30 #include "get_bits.h"
yading@10 31
yading@10 32 #include "vp56.h"
yading@10 33 #include "vp56data.h"
yading@10 34 #include "vp5data.h"
yading@10 35
yading@10 36
yading@10 37 static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size)
yading@10 38 {
yading@10 39 VP56RangeCoder *c = &s->c;
yading@10 40 int rows, cols;
yading@10 41
yading@10 42 ff_vp56_init_range_decoder(&s->c, buf, buf_size);
yading@10 43 s->frames[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c);
yading@10 44 vp56_rac_get(c);
yading@10 45 ff_vp56_init_dequant(s, vp56_rac_gets(c, 6));
yading@10 46 if (s->frames[VP56_FRAME_CURRENT]->key_frame)
yading@10 47 {
yading@10 48 vp56_rac_gets(c, 8);
yading@10 49 if(vp56_rac_gets(c, 5) > 5)
yading@10 50 return AVERROR_INVALIDDATA;
yading@10 51 vp56_rac_gets(c, 2);
yading@10 52 if (vp56_rac_get(c)) {
yading@10 53 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
yading@10 54 return AVERROR_PATCHWELCOME;
yading@10 55 }
yading@10 56 rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */
yading@10 57 cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */
yading@10 58 if (!rows || !cols) {
yading@10 59 av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n",
yading@10 60 cols << 4, rows << 4);
yading@10 61 return AVERROR_INVALIDDATA;
yading@10 62 }
yading@10 63 vp56_rac_gets(c, 8); /* number of displayed macroblock rows */
yading@10 64 vp56_rac_gets(c, 8); /* number of displayed macroblock cols */
yading@10 65 vp56_rac_gets(c, 2);
yading@10 66 if (!s->macroblocks || /* first frame */
yading@10 67 16*cols != s->avctx->coded_width ||
yading@10 68 16*rows != s->avctx->coded_height) {
yading@10 69 avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
yading@10 70 return VP56_SIZE_CHANGE;
yading@10 71 }
yading@10 72 } else if (!s->macroblocks)
yading@10 73 return AVERROR_INVALIDDATA;
yading@10 74 return 0;
yading@10 75 }
yading@10 76
yading@10 77 static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect)
yading@10 78 {
yading@10 79 VP56RangeCoder *c = &s->c;
yading@10 80 VP56Model *model = s->modelp;
yading@10 81 int comp, di;
yading@10 82
yading@10 83 for (comp=0; comp<2; comp++) {
yading@10 84 int delta = 0;
yading@10 85 if (vp56_rac_get_prob(c, model->vector_dct[comp])) {
yading@10 86 int sign = vp56_rac_get_prob(c, model->vector_sig[comp]);
yading@10 87 di = vp56_rac_get_prob(c, model->vector_pdi[comp][0]);
yading@10 88 di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1;
yading@10 89 delta = vp56_rac_get_tree(c, ff_vp56_pva_tree,
yading@10 90 model->vector_pdv[comp]);
yading@10 91 delta = di | (delta << 2);
yading@10 92 delta = (delta ^ -sign) + sign;
yading@10 93 }
yading@10 94 if (!comp)
yading@10 95 vect->x = delta;
yading@10 96 else
yading@10 97 vect->y = delta;
yading@10 98 }
yading@10 99 }
yading@10 100
yading@10 101 static void vp5_parse_vector_models(VP56Context *s)
yading@10 102 {
yading@10 103 VP56RangeCoder *c = &s->c;
yading@10 104 VP56Model *model = s->modelp;
yading@10 105 int comp, node;
yading@10 106
yading@10 107 for (comp=0; comp<2; comp++) {
yading@10 108 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][0]))
yading@10 109 model->vector_dct[comp] = vp56_rac_gets_nn(c, 7);
yading@10 110 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][1]))
yading@10 111 model->vector_sig[comp] = vp56_rac_gets_nn(c, 7);
yading@10 112 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][2]))
yading@10 113 model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7);
yading@10 114 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][3]))
yading@10 115 model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7);
yading@10 116 }
yading@10 117
yading@10 118 for (comp=0; comp<2; comp++)
yading@10 119 for (node=0; node<7; node++)
yading@10 120 if (vp56_rac_get_prob(c, vp5_vmc_pct[comp][4 + node]))
yading@10 121 model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7);
yading@10 122 }
yading@10 123
yading@10 124 static int vp5_parse_coeff_models(VP56Context *s)
yading@10 125 {
yading@10 126 VP56RangeCoder *c = &s->c;
yading@10 127 VP56Model *model = s->modelp;
yading@10 128 uint8_t def_prob[11];
yading@10 129 int node, cg, ctx;
yading@10 130 int ct; /* code type */
yading@10 131 int pt; /* plane type (0 for Y, 1 for U or V) */
yading@10 132
yading@10 133 memset(def_prob, 0x80, sizeof(def_prob));
yading@10 134
yading@10 135 for (pt=0; pt<2; pt++)
yading@10 136 for (node=0; node<11; node++)
yading@10 137 if (vp56_rac_get_prob(c, vp5_dccv_pct[pt][node])) {
yading@10 138 def_prob[node] = vp56_rac_gets_nn(c, 7);
yading@10 139 model->coeff_dccv[pt][node] = def_prob[node];
yading@10 140 } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) {
yading@10 141 model->coeff_dccv[pt][node] = def_prob[node];
yading@10 142 }
yading@10 143
yading@10 144 for (ct=0; ct<3; ct++)
yading@10 145 for (pt=0; pt<2; pt++)
yading@10 146 for (cg=0; cg<6; cg++)
yading@10 147 for (node=0; node<11; node++)
yading@10 148 if (vp56_rac_get_prob(c, vp5_ract_pct[ct][pt][cg][node])) {
yading@10 149 def_prob[node] = vp56_rac_gets_nn(c, 7);
yading@10 150 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
yading@10 151 } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) {
yading@10 152 model->coeff_ract[pt][ct][cg][node] = def_prob[node];
yading@10 153 }
yading@10 154
yading@10 155 /* coeff_dcct is a linear combination of coeff_dccv */
yading@10 156 for (pt=0; pt<2; pt++)
yading@10 157 for (ctx=0; ctx<36; ctx++)
yading@10 158 for (node=0; node<5; node++)
yading@10 159 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);
yading@10 160
yading@10 161 /* coeff_acct is a linear combination of coeff_ract */
yading@10 162 for (ct=0; ct<3; ct++)
yading@10 163 for (pt=0; pt<2; pt++)
yading@10 164 for (cg=0; cg<3; cg++)
yading@10 165 for (ctx=0; ctx<6; ctx++)
yading@10 166 for (node=0; node<5; node++)
yading@10 167 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);
yading@10 168 return 0;
yading@10 169 }
yading@10 170
yading@10 171 static void vp5_parse_coeff(VP56Context *s)
yading@10 172 {
yading@10 173 VP56RangeCoder *c = &s->c;
yading@10 174 VP56Model *model = s->modelp;
yading@10 175 uint8_t *permute = s->idct_scantable;
yading@10 176 uint8_t *model1, *model2;
yading@10 177 int coeff, sign, coeff_idx;
yading@10 178 int b, i, cg, idx, ctx, ctx_last;
yading@10 179 int pt = 0; /* plane type (0 for Y, 1 for U or V) */
yading@10 180
yading@10 181 for (b=0; b<6; b++) {
yading@10 182 int ct = 1; /* code type */
yading@10 183
yading@10 184 if (b > 3) pt = 1;
yading@10 185
yading@10 186 ctx = 6*s->coeff_ctx[ff_vp56_b6to4[b]][0]
yading@10 187 + s->above_blocks[s->above_block_idx[b]].not_null_dc;
yading@10 188 model1 = model->coeff_dccv[pt];
yading@10 189 model2 = model->coeff_dcct[pt][ctx];
yading@10 190
yading@10 191 coeff_idx = 0;
yading@10 192 for (;;) {
yading@10 193 if (vp56_rac_get_prob(c, model2[0])) {
yading@10 194 if (vp56_rac_get_prob(c, model2[2])) {
yading@10 195 if (vp56_rac_get_prob(c, model2[3])) {
yading@10 196 s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 4;
yading@10 197 idx = vp56_rac_get_tree(c, ff_vp56_pc_tree, model1);
yading@10 198 sign = vp56_rac_get(c);
yading@10 199 coeff = ff_vp56_coeff_bias[idx+5];
yading@10 200 for (i=ff_vp56_coeff_bit_length[idx]; i>=0; i--)
yading@10 201 coeff += vp56_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i;
yading@10 202 } else {
yading@10 203 if (vp56_rac_get_prob(c, model2[4])) {
yading@10 204 coeff = 3 + vp56_rac_get_prob(c, model1[5]);
yading@10 205 s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 3;
yading@10 206 } else {
yading@10 207 coeff = 2;
yading@10 208 s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 2;
yading@10 209 }
yading@10 210 sign = vp56_rac_get(c);
yading@10 211 }
yading@10 212 ct = 2;
yading@10 213 } else {
yading@10 214 ct = 1;
yading@10 215 s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 1;
yading@10 216 sign = vp56_rac_get(c);
yading@10 217 coeff = 1;
yading@10 218 }
yading@10 219 coeff = (coeff ^ -sign) + sign;
yading@10 220 if (coeff_idx)
yading@10 221 coeff *= s->dequant_ac;
yading@10 222 s->block_coeff[b][permute[coeff_idx]] = coeff;
yading@10 223 } else {
yading@10 224 if (ct && !vp56_rac_get_prob(c, model2[1]))
yading@10 225 break;
yading@10 226 ct = 0;
yading@10 227 s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 0;
yading@10 228 }
yading@10 229 coeff_idx++;
yading@10 230 if (coeff_idx >= 64)
yading@10 231 break;
yading@10 232
yading@10 233 cg = vp5_coeff_groups[coeff_idx];
yading@10 234 ctx = s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx];
yading@10 235 model1 = model->coeff_ract[pt][ct][cg];
yading@10 236 model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx];
yading@10 237 }
yading@10 238
yading@10 239 ctx_last = FFMIN(s->coeff_ctx_last[ff_vp56_b6to4[b]], 24);
yading@10 240 s->coeff_ctx_last[ff_vp56_b6to4[b]] = coeff_idx;
yading@10 241 if (coeff_idx < ctx_last)
yading@10 242 for (i=coeff_idx; i<=ctx_last; i++)
yading@10 243 s->coeff_ctx[ff_vp56_b6to4[b]][i] = 5;
yading@10 244 s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[ff_vp56_b6to4[b]][0];
yading@10 245 }
yading@10 246 }
yading@10 247
yading@10 248 static void vp5_default_models_init(VP56Context *s)
yading@10 249 {
yading@10 250 VP56Model *model = s->modelp;
yading@10 251 int i;
yading@10 252
yading@10 253 for (i=0; i<2; i++) {
yading@10 254 model->vector_sig[i] = 0x80;
yading@10 255 model->vector_dct[i] = 0x80;
yading@10 256 model->vector_pdi[i][0] = 0x55;
yading@10 257 model->vector_pdi[i][1] = 0x80;
yading@10 258 }
yading@10 259 memcpy(model->mb_types_stats, ff_vp56_def_mb_types_stats, sizeof(model->mb_types_stats));
yading@10 260 memset(model->vector_pdv, 0x80, sizeof(model->vector_pdv));
yading@10 261 }
yading@10 262
yading@10 263 static av_cold int vp5_decode_init(AVCodecContext *avctx)
yading@10 264 {
yading@10 265 VP56Context *s = avctx->priv_data;
yading@10 266 int ret;
yading@10 267
yading@10 268 if ((ret = ff_vp56_init(avctx, 1, 0)) < 0)
yading@10 269 return ret;
yading@10 270 s->vp56_coord_div = vp5_coord_div;
yading@10 271 s->parse_vector_adjustment = vp5_parse_vector_adjustment;
yading@10 272 s->parse_coeff = vp5_parse_coeff;
yading@10 273 s->default_models_init = vp5_default_models_init;
yading@10 274 s->parse_vector_models = vp5_parse_vector_models;
yading@10 275 s->parse_coeff_models = vp5_parse_coeff_models;
yading@10 276 s->parse_header = vp5_parse_header;
yading@10 277
yading@10 278 return 0;
yading@10 279 }
yading@10 280
yading@10 281 AVCodec ff_vp5_decoder = {
yading@10 282 .name = "vp5",
yading@10 283 .type = AVMEDIA_TYPE_VIDEO,
yading@10 284 .id = AV_CODEC_ID_VP5,
yading@10 285 .priv_data_size = sizeof(VP56Context),
yading@10 286 .init = vp5_decode_init,
yading@10 287 .close = ff_vp56_free,
yading@10 288 .decode = ff_vp56_decode_frame,
yading@10 289 .capabilities = CODEC_CAP_DR1,
yading@10 290 .long_name = NULL_IF_CONFIG_SMALL("On2 VP5"),
yading@10 291 };