annotate ffmpeg/libavcodec/svq1dec.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 * SVQ1 decoder
yading@10 3 * ported to MPlayer by Arpi <arpi@thot.banki.hu>
yading@10 4 * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
yading@10 5 *
yading@10 6 * Copyright (C) 2002 the xine project
yading@10 7 * Copyright (C) 2002 the ffmpeg project
yading@10 8 *
yading@10 9 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
yading@10 10 *
yading@10 11 * This file is part of FFmpeg.
yading@10 12 *
yading@10 13 * FFmpeg is free software; you can redistribute it and/or
yading@10 14 * modify it under the terms of the GNU Lesser General Public
yading@10 15 * License as published by the Free Software Foundation; either
yading@10 16 * version 2.1 of the License, or (at your option) any later version.
yading@10 17 *
yading@10 18 * FFmpeg is distributed in the hope that it will be useful,
yading@10 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 21 * Lesser General Public License for more details.
yading@10 22 *
yading@10 23 * You should have received a copy of the GNU Lesser General Public
yading@10 24 * License along with FFmpeg; if not, write to the Free Software
yading@10 25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 26 */
yading@10 27
yading@10 28 /**
yading@10 29 * @file
yading@10 30 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
yading@10 31 * For more information of the SVQ1 algorithm, visit:
yading@10 32 * http://www.pcisys.net/~melanson/codecs/
yading@10 33 */
yading@10 34
yading@10 35 #include "avcodec.h"
yading@10 36 #include "get_bits.h"
yading@10 37 #include "hpeldsp.h"
yading@10 38 #include "internal.h"
yading@10 39 #include "mathops.h"
yading@10 40 #include "svq1.h"
yading@10 41
yading@10 42 #undef NDEBUG
yading@10 43 #include <assert.h>
yading@10 44
yading@10 45 extern const uint8_t ff_mvtab[33][2];
yading@10 46
yading@10 47 static VLC svq1_block_type;
yading@10 48 static VLC svq1_motion_component;
yading@10 49 static VLC svq1_intra_multistage[6];
yading@10 50 static VLC svq1_inter_multistage[6];
yading@10 51 static VLC svq1_intra_mean;
yading@10 52 static VLC svq1_inter_mean;
yading@10 53
yading@10 54 /* motion vector (prediction) */
yading@10 55 typedef struct svq1_pmv_s {
yading@10 56 int x;
yading@10 57 int y;
yading@10 58 } svq1_pmv;
yading@10 59
yading@10 60 typedef struct SVQ1Context {
yading@10 61 HpelDSPContext hdsp;
yading@10 62 GetBitContext gb;
yading@10 63 AVFrame *prev;
yading@10 64 int width;
yading@10 65 int height;
yading@10 66 int frame_code;
yading@10 67 int nonref; // 1 if the current frame won't be referenced
yading@10 68 } SVQ1Context;
yading@10 69
yading@10 70 static const uint8_t string_table[256] = {
yading@10 71 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
yading@10 72 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
yading@10 73 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
yading@10 74 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
yading@10 75 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
yading@10 76 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
yading@10 77 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
yading@10 78 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
yading@10 79 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
yading@10 80 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
yading@10 81 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
yading@10 82 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
yading@10 83 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
yading@10 84 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
yading@10 85 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
yading@10 86 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
yading@10 87 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
yading@10 88 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
yading@10 89 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
yading@10 90 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
yading@10 91 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
yading@10 92 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
yading@10 93 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
yading@10 94 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
yading@10 95 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
yading@10 96 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
yading@10 97 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
yading@10 98 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
yading@10 99 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
yading@10 100 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
yading@10 101 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
yading@10 102 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
yading@10 103 };
yading@10 104
yading@10 105 #define SVQ1_PROCESS_VECTOR() \
yading@10 106 for (; level > 0; i++) { \
yading@10 107 /* process next depth */ \
yading@10 108 if (i == m) { \
yading@10 109 m = n; \
yading@10 110 if (--level == 0) \
yading@10 111 break; \
yading@10 112 } \
yading@10 113 /* divide block if next bit set */ \
yading@10 114 if (!get_bits1(bitbuf)) \
yading@10 115 break; \
yading@10 116 /* add child nodes */ \
yading@10 117 list[n++] = list[i]; \
yading@10 118 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
yading@10 119 }
yading@10 120
yading@10 121 #define SVQ1_ADD_CODEBOOK() \
yading@10 122 /* add codebook entries to vector */ \
yading@10 123 for (j = 0; j < stages; j++) { \
yading@10 124 n3 = codebook[entries[j]] ^ 0x80808080; \
yading@10 125 n1 += (n3 & 0xFF00FF00) >> 8; \
yading@10 126 n2 += n3 & 0x00FF00FF; \
yading@10 127 } \
yading@10 128 \
yading@10 129 /* clip to [0..255] */ \
yading@10 130 if (n1 & 0xFF00FF00) { \
yading@10 131 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
yading@10 132 n1 += 0x7F007F00; \
yading@10 133 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
yading@10 134 n1 &= n3 & 0x00FF00FF; \
yading@10 135 } \
yading@10 136 \
yading@10 137 if (n2 & 0xFF00FF00) { \
yading@10 138 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
yading@10 139 n2 += 0x7F007F00; \
yading@10 140 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
yading@10 141 n2 &= n3 & 0x00FF00FF; \
yading@10 142 }
yading@10 143
yading@10 144 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
yading@10 145 codebook = (const uint32_t *)cbook[level]; \
yading@10 146 if (stages > 0) \
yading@10 147 bit_cache = get_bits(bitbuf, 4 * stages); \
yading@10 148 /* calculate codebook entries for this vector */ \
yading@10 149 for (j = 0; j < stages; j++) { \
yading@10 150 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
yading@10 151 16 * j) << (level + 1); \
yading@10 152 } \
yading@10 153 mean -= stages * 128; \
yading@10 154 n4 = (mean << 16) + mean;
yading@10 155
yading@10 156 static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels,
yading@10 157 int pitch)
yading@10 158 {
yading@10 159 uint32_t bit_cache;
yading@10 160 uint8_t *list[63];
yading@10 161 uint32_t *dst;
yading@10 162 const uint32_t *codebook;
yading@10 163 int entries[6];
yading@10 164 int i, j, m, n;
yading@10 165 int mean, stages;
yading@10 166 unsigned x, y, width, height, level;
yading@10 167 uint32_t n1, n2, n3, n4;
yading@10 168
yading@10 169 /* initialize list for breadth first processing of vectors */
yading@10 170 list[0] = pixels;
yading@10 171
yading@10 172 /* recursively process vector */
yading@10 173 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
yading@10 174 SVQ1_PROCESS_VECTOR();
yading@10 175
yading@10 176 /* destination address and vector size */
yading@10 177 dst = (uint32_t *)list[i];
yading@10 178 width = 1 << ((4 + level) / 2);
yading@10 179 height = 1 << ((3 + level) / 2);
yading@10 180
yading@10 181 /* get number of stages (-1 skips vector, 0 for mean only) */
yading@10 182 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
yading@10 183
yading@10 184 if (stages == -1) {
yading@10 185 for (y = 0; y < height; y++)
yading@10 186 memset(&dst[y * (pitch / 4)], 0, width);
yading@10 187 continue; /* skip vector */
yading@10 188 }
yading@10 189
yading@10 190 if (stages > 0 && level >= 4) {
yading@10 191 av_dlog(NULL,
yading@10 192 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
yading@10 193 stages, level);
yading@10 194 return AVERROR_INVALIDDATA; /* invalid vector */
yading@10 195 }
yading@10 196
yading@10 197 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
yading@10 198
yading@10 199 if (stages == 0) {
yading@10 200 for (y = 0; y < height; y++)
yading@10 201 memset(&dst[y * (pitch / 4)], mean, width);
yading@10 202 } else {
yading@10 203 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
yading@10 204
yading@10 205 for (y = 0; y < height; y++) {
yading@10 206 for (x = 0; x < width / 4; x++, codebook++) {
yading@10 207 n1 = n4;
yading@10 208 n2 = n4;
yading@10 209 SVQ1_ADD_CODEBOOK()
yading@10 210 /* store result */
yading@10 211 dst[x] = n1 << 8 | n2;
yading@10 212 }
yading@10 213 dst += pitch / 4;
yading@10 214 }
yading@10 215 }
yading@10 216 }
yading@10 217
yading@10 218 return 0;
yading@10 219 }
yading@10 220
yading@10 221 static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels,
yading@10 222 int pitch)
yading@10 223 {
yading@10 224 uint32_t bit_cache;
yading@10 225 uint8_t *list[63];
yading@10 226 uint32_t *dst;
yading@10 227 const uint32_t *codebook;
yading@10 228 int entries[6];
yading@10 229 int i, j, m, n;
yading@10 230 int mean, stages;
yading@10 231 int x, y, width, height, level;
yading@10 232 uint32_t n1, n2, n3, n4;
yading@10 233
yading@10 234 /* initialize list for breadth first processing of vectors */
yading@10 235 list[0] = pixels;
yading@10 236
yading@10 237 /* recursively process vector */
yading@10 238 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
yading@10 239 SVQ1_PROCESS_VECTOR();
yading@10 240
yading@10 241 /* destination address and vector size */
yading@10 242 dst = (uint32_t *)list[i];
yading@10 243 width = 1 << ((4 + level) / 2);
yading@10 244 height = 1 << ((3 + level) / 2);
yading@10 245
yading@10 246 /* get number of stages (-1 skips vector, 0 for mean only) */
yading@10 247 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
yading@10 248
yading@10 249 if (stages == -1)
yading@10 250 continue; /* skip vector */
yading@10 251
yading@10 252 if ((stages > 0) && (level >= 4)) {
yading@10 253 av_dlog(NULL,
yading@10 254 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
yading@10 255 stages, level);
yading@10 256 return AVERROR_INVALIDDATA; /* invalid vector */
yading@10 257 }
yading@10 258
yading@10 259 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
yading@10 260
yading@10 261 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
yading@10 262
yading@10 263 for (y = 0; y < height; y++) {
yading@10 264 for (x = 0; x < width / 4; x++, codebook++) {
yading@10 265 n3 = dst[x];
yading@10 266 /* add mean value to vector */
yading@10 267 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
yading@10 268 n2 = n4 + (n3 & 0x00FF00FF);
yading@10 269 SVQ1_ADD_CODEBOOK()
yading@10 270 /* store result */
yading@10 271 dst[x] = n1 << 8 | n2;
yading@10 272 }
yading@10 273 dst += pitch / 4;
yading@10 274 }
yading@10 275 }
yading@10 276 return 0;
yading@10 277 }
yading@10 278
yading@10 279 static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv,
yading@10 280 svq1_pmv **pmv)
yading@10 281 {
yading@10 282 int diff;
yading@10 283 int i;
yading@10 284
yading@10 285 for (i = 0; i < 2; i++) {
yading@10 286 /* get motion code */
yading@10 287 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
yading@10 288 if (diff < 0)
yading@10 289 return AVERROR_INVALIDDATA;
yading@10 290 else if (diff) {
yading@10 291 if (get_bits1(bitbuf))
yading@10 292 diff = -diff;
yading@10 293 }
yading@10 294
yading@10 295 /* add median of motion vector predictors and clip result */
yading@10 296 if (i == 1)
yading@10 297 mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6);
yading@10 298 else
yading@10 299 mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6);
yading@10 300 }
yading@10 301
yading@10 302 return 0;
yading@10 303 }
yading@10 304
yading@10 305 static void svq1_skip_block(uint8_t *current, uint8_t *previous,
yading@10 306 int pitch, int x, int y)
yading@10 307 {
yading@10 308 uint8_t *src;
yading@10 309 uint8_t *dst;
yading@10 310 int i;
yading@10 311
yading@10 312 src = &previous[x + y * pitch];
yading@10 313 dst = current;
yading@10 314
yading@10 315 for (i = 0; i < 16; i++) {
yading@10 316 memcpy(dst, src, 16);
yading@10 317 src += pitch;
yading@10 318 dst += pitch;
yading@10 319 }
yading@10 320 }
yading@10 321
yading@10 322 static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf,
yading@10 323 uint8_t *current, uint8_t *previous,
yading@10 324 int pitch, svq1_pmv *motion, int x, int y,
yading@10 325 int width, int height)
yading@10 326 {
yading@10 327 uint8_t *src;
yading@10 328 uint8_t *dst;
yading@10 329 svq1_pmv mv;
yading@10 330 svq1_pmv *pmv[3];
yading@10 331 int result;
yading@10 332
yading@10 333 /* predict and decode motion vector */
yading@10 334 pmv[0] = &motion[0];
yading@10 335 if (y == 0) {
yading@10 336 pmv[1] =
yading@10 337 pmv[2] = pmv[0];
yading@10 338 } else {
yading@10 339 pmv[1] = &motion[x / 8 + 2];
yading@10 340 pmv[2] = &motion[x / 8 + 4];
yading@10 341 }
yading@10 342
yading@10 343 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
yading@10 344 if (result)
yading@10 345 return result;
yading@10 346
yading@10 347 motion[0].x =
yading@10 348 motion[x / 8 + 2].x =
yading@10 349 motion[x / 8 + 3].x = mv.x;
yading@10 350 motion[0].y =
yading@10 351 motion[x / 8 + 2].y =
yading@10 352 motion[x / 8 + 3].y = mv.y;
yading@10 353
yading@10 354 mv.x = av_clip(mv.x, -2 * x, 2 * (width - x - 16));
yading@10 355 mv.y = av_clip(mv.y, -2 * y, 2 * (height - y - 16));
yading@10 356
yading@10 357 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch];
yading@10 358 dst = current;
yading@10 359
yading@10 360 hdsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16);
yading@10 361
yading@10 362 return 0;
yading@10 363 }
yading@10 364
yading@10 365 static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf,
yading@10 366 uint8_t *current, uint8_t *previous,
yading@10 367 int pitch, svq1_pmv *motion, int x, int y,
yading@10 368 int width, int height)
yading@10 369 {
yading@10 370 uint8_t *src;
yading@10 371 uint8_t *dst;
yading@10 372 svq1_pmv mv;
yading@10 373 svq1_pmv *pmv[4];
yading@10 374 int i, result;
yading@10 375
yading@10 376 /* predict and decode motion vector (0) */
yading@10 377 pmv[0] = &motion[0];
yading@10 378 if (y == 0) {
yading@10 379 pmv[1] =
yading@10 380 pmv[2] = pmv[0];
yading@10 381 } else {
yading@10 382 pmv[1] = &motion[(x / 8) + 2];
yading@10 383 pmv[2] = &motion[(x / 8) + 4];
yading@10 384 }
yading@10 385
yading@10 386 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
yading@10 387 if (result)
yading@10 388 return result;
yading@10 389
yading@10 390 /* predict and decode motion vector (1) */
yading@10 391 pmv[0] = &mv;
yading@10 392 if (y == 0) {
yading@10 393 pmv[1] =
yading@10 394 pmv[2] = pmv[0];
yading@10 395 } else {
yading@10 396 pmv[1] = &motion[(x / 8) + 3];
yading@10 397 }
yading@10 398 result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv);
yading@10 399 if (result)
yading@10 400 return result;
yading@10 401
yading@10 402 /* predict and decode motion vector (2) */
yading@10 403 pmv[1] = &motion[0];
yading@10 404 pmv[2] = &motion[(x / 8) + 1];
yading@10 405
yading@10 406 result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv);
yading@10 407 if (result)
yading@10 408 return result;
yading@10 409
yading@10 410 /* predict and decode motion vector (3) */
yading@10 411 pmv[2] = &motion[(x / 8) + 2];
yading@10 412 pmv[3] = &motion[(x / 8) + 3];
yading@10 413
yading@10 414 result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv);
yading@10 415 if (result)
yading@10 416 return result;
yading@10 417
yading@10 418 /* form predictions */
yading@10 419 for (i = 0; i < 4; i++) {
yading@10 420 int mvx = pmv[i]->x + (i & 1) * 16;
yading@10 421 int mvy = pmv[i]->y + (i >> 1) * 16;
yading@10 422
yading@10 423 // FIXME: clipping or padding?
yading@10 424 mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
yading@10 425 mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
yading@10 426
yading@10 427 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
yading@10 428 dst = current;
yading@10 429
yading@10 430 hdsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
yading@10 431
yading@10 432 /* select next block */
yading@10 433 if (i & 1)
yading@10 434 current += 8 * (pitch - 1);
yading@10 435 else
yading@10 436 current += 8;
yading@10 437 }
yading@10 438
yading@10 439 return 0;
yading@10 440 }
yading@10 441
yading@10 442 static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp,
yading@10 443 GetBitContext *bitbuf,
yading@10 444 uint8_t *current, uint8_t *previous,
yading@10 445 int pitch, svq1_pmv *motion, int x, int y,
yading@10 446 int width, int height)
yading@10 447 {
yading@10 448 uint32_t block_type;
yading@10 449 int result = 0;
yading@10 450
yading@10 451 /* get block type */
yading@10 452 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
yading@10 453
yading@10 454 /* reset motion vectors */
yading@10 455 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
yading@10 456 motion[0].x =
yading@10 457 motion[0].y =
yading@10 458 motion[x / 8 + 2].x =
yading@10 459 motion[x / 8 + 2].y =
yading@10 460 motion[x / 8 + 3].x =
yading@10 461 motion[x / 8 + 3].y = 0;
yading@10 462 }
yading@10 463
yading@10 464 switch (block_type) {
yading@10 465 case SVQ1_BLOCK_SKIP:
yading@10 466 svq1_skip_block(current, previous, pitch, x, y);
yading@10 467 break;
yading@10 468
yading@10 469 case SVQ1_BLOCK_INTER:
yading@10 470 result = svq1_motion_inter_block(hdsp, bitbuf, current, previous,
yading@10 471 pitch, motion, x, y, width, height);
yading@10 472
yading@10 473 if (result != 0) {
yading@10 474 av_dlog(avctx, "Error in svq1_motion_inter_block %i\n", result);
yading@10 475 break;
yading@10 476 }
yading@10 477 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
yading@10 478 break;
yading@10 479
yading@10 480 case SVQ1_BLOCK_INTER_4V:
yading@10 481 result = svq1_motion_inter_4v_block(hdsp, bitbuf, current, previous,
yading@10 482 pitch, motion, x, y, width, height);
yading@10 483
yading@10 484 if (result != 0) {
yading@10 485 av_dlog(avctx, "Error in svq1_motion_inter_4v_block %i\n", result);
yading@10 486 break;
yading@10 487 }
yading@10 488 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
yading@10 489 break;
yading@10 490
yading@10 491 case SVQ1_BLOCK_INTRA:
yading@10 492 result = svq1_decode_block_intra(bitbuf, current, pitch);
yading@10 493 break;
yading@10 494 }
yading@10 495
yading@10 496 return result;
yading@10 497 }
yading@10 498
yading@10 499 static void svq1_parse_string(GetBitContext *bitbuf, uint8_t *out)
yading@10 500 {
yading@10 501 uint8_t seed;
yading@10 502 int i;
yading@10 503
yading@10 504 out[0] = get_bits(bitbuf, 8);
yading@10 505 seed = string_table[out[0]];
yading@10 506
yading@10 507 for (i = 1; i <= out[0]; i++) {
yading@10 508 out[i] = get_bits(bitbuf, 8) ^ seed;
yading@10 509 seed = string_table[out[i] ^ seed];
yading@10 510 }
yading@10 511 }
yading@10 512
yading@10 513 static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
yading@10 514 {
yading@10 515 SVQ1Context *s = avctx->priv_data;
yading@10 516 GetBitContext *bitbuf = &s->gb;
yading@10 517 int frame_size_code;
yading@10 518 int width = s->width;
yading@10 519 int height = s->height;
yading@10 520
yading@10 521 skip_bits(bitbuf, 8); /* temporal_reference */
yading@10 522
yading@10 523 /* frame type */
yading@10 524 s->nonref = 0;
yading@10 525 switch (get_bits(bitbuf, 2)) {
yading@10 526 case 0:
yading@10 527 frame->pict_type = AV_PICTURE_TYPE_I;
yading@10 528 break;
yading@10 529 case 2:
yading@10 530 s->nonref = 1;
yading@10 531 case 1:
yading@10 532 frame->pict_type = AV_PICTURE_TYPE_P;
yading@10 533 break;
yading@10 534 default:
yading@10 535 av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
yading@10 536 return AVERROR_INVALIDDATA;
yading@10 537 }
yading@10 538
yading@10 539 if (frame->pict_type == AV_PICTURE_TYPE_I) {
yading@10 540 /* unknown fields */
yading@10 541 if (s->frame_code == 0x50 || s->frame_code == 0x60) {
yading@10 542 int csum = get_bits(bitbuf, 16);
yading@10 543
yading@10 544 csum = ff_svq1_packet_checksum(bitbuf->buffer,
yading@10 545 bitbuf->size_in_bits >> 3,
yading@10 546 csum);
yading@10 547
yading@10 548 av_dlog(avctx, "%s checksum (%02x) for packet data\n",
yading@10 549 (csum == 0) ? "correct" : "incorrect", csum);
yading@10 550 }
yading@10 551
yading@10 552 if ((s->frame_code ^ 0x10) >= 0x50) {
yading@10 553 uint8_t msg[256];
yading@10 554
yading@10 555 svq1_parse_string(bitbuf, msg);
yading@10 556
yading@10 557 av_log(avctx, AV_LOG_INFO,
yading@10 558 "embedded message: \"%s\"\n", (char *)msg);
yading@10 559 }
yading@10 560
yading@10 561 skip_bits(bitbuf, 2);
yading@10 562 skip_bits(bitbuf, 2);
yading@10 563 skip_bits1(bitbuf);
yading@10 564
yading@10 565 /* load frame size */
yading@10 566 frame_size_code = get_bits(bitbuf, 3);
yading@10 567
yading@10 568 if (frame_size_code == 7) {
yading@10 569 /* load width, height (12 bits each) */
yading@10 570 width = get_bits(bitbuf, 12);
yading@10 571 height = get_bits(bitbuf, 12);
yading@10 572
yading@10 573 if (!width || !height)
yading@10 574 return AVERROR_INVALIDDATA;
yading@10 575 } else {
yading@10 576 /* get width, height from table */
yading@10 577 width = ff_svq1_frame_size_table[frame_size_code][0];
yading@10 578 height = ff_svq1_frame_size_table[frame_size_code][1];
yading@10 579 }
yading@10 580 }
yading@10 581
yading@10 582 /* unknown fields */
yading@10 583 if (get_bits1(bitbuf)) {
yading@10 584 skip_bits1(bitbuf); /* use packet checksum if (1) */
yading@10 585 skip_bits1(bitbuf); /* component checksums after image data if (1) */
yading@10 586
yading@10 587 if (get_bits(bitbuf, 2) != 0)
yading@10 588 return AVERROR_INVALIDDATA;
yading@10 589 }
yading@10 590
yading@10 591 if (get_bits1(bitbuf)) {
yading@10 592 skip_bits1(bitbuf);
yading@10 593 skip_bits(bitbuf, 4);
yading@10 594 skip_bits1(bitbuf);
yading@10 595 skip_bits(bitbuf, 2);
yading@10 596
yading@10 597 while (get_bits1(bitbuf))
yading@10 598 skip_bits(bitbuf, 8);
yading@10 599 }
yading@10 600
yading@10 601 s->width = width;
yading@10 602 s->height = height;
yading@10 603 return 0;
yading@10 604 }
yading@10 605
yading@10 606 static int svq1_decode_frame(AVCodecContext *avctx, void *data,
yading@10 607 int *got_frame, AVPacket *avpkt)
yading@10 608 {
yading@10 609 const uint8_t *buf = avpkt->data;
yading@10 610 int buf_size = avpkt->size;
yading@10 611 SVQ1Context *s = avctx->priv_data;
yading@10 612 AVFrame *cur = data;
yading@10 613 uint8_t *current;
yading@10 614 int result, i, x, y, width, height;
yading@10 615 svq1_pmv *pmv;
yading@10 616
yading@10 617 /* initialize bit buffer */
yading@10 618 init_get_bits(&s->gb, buf, buf_size * 8);
yading@10 619
yading@10 620 /* decode frame header */
yading@10 621 s->frame_code = get_bits(&s->gb, 22);
yading@10 622
yading@10 623 if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
yading@10 624 return AVERROR_INVALIDDATA;
yading@10 625
yading@10 626 /* swap some header bytes (why?) */
yading@10 627 if (s->frame_code != 0x20) {
yading@10 628 uint32_t *src = (uint32_t *)(buf + 4);
yading@10 629
yading@10 630 if (buf_size < 36)
yading@10 631 return AVERROR_INVALIDDATA;
yading@10 632
yading@10 633 for (i = 0; i < 4; i++)
yading@10 634 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
yading@10 635 }
yading@10 636
yading@10 637 result = svq1_decode_frame_header(avctx, cur);
yading@10 638 if (result != 0) {
yading@10 639 av_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
yading@10 640 return result;
yading@10 641 }
yading@10 642 avcodec_set_dimensions(avctx, s->width, s->height);
yading@10 643
yading@10 644 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
yading@10 645 (avctx->skip_frame >= AVDISCARD_NONKEY &&
yading@10 646 cur->pict_type != AV_PICTURE_TYPE_I) ||
yading@10 647 avctx->skip_frame >= AVDISCARD_ALL)
yading@10 648 return buf_size;
yading@10 649
yading@10 650 result = ff_get_buffer(avctx, cur, s->nonref ? 0 : AV_GET_BUFFER_FLAG_REF);
yading@10 651 if (result < 0)
yading@10 652 return result;
yading@10 653
yading@10 654 pmv = av_malloc((FFALIGN(s->width, 16) / 8 + 3) * sizeof(*pmv));
yading@10 655 if (!pmv)
yading@10 656 return AVERROR(ENOMEM);
yading@10 657
yading@10 658 /* decode y, u and v components */
yading@10 659 for (i = 0; i < 3; i++) {
yading@10 660 int linesize = cur->linesize[i];
yading@10 661 if (i == 0) {
yading@10 662 width = FFALIGN(s->width, 16);
yading@10 663 height = FFALIGN(s->height, 16);
yading@10 664 } else {
yading@10 665 if (avctx->flags & CODEC_FLAG_GRAY)
yading@10 666 break;
yading@10 667 width = FFALIGN(s->width / 4, 16);
yading@10 668 height = FFALIGN(s->height / 4, 16);
yading@10 669 }
yading@10 670
yading@10 671 current = cur->data[i];
yading@10 672
yading@10 673 if (cur->pict_type == AV_PICTURE_TYPE_I) {
yading@10 674 /* keyframe */
yading@10 675 for (y = 0; y < height; y += 16) {
yading@10 676 for (x = 0; x < width; x += 16) {
yading@10 677 result = svq1_decode_block_intra(&s->gb, &current[x],
yading@10 678 linesize);
yading@10 679 if (result) {
yading@10 680 av_log(avctx, AV_LOG_ERROR,
yading@10 681 "Error in svq1_decode_block %i (keyframe)\n",
yading@10 682 result);
yading@10 683 goto err;
yading@10 684 }
yading@10 685 }
yading@10 686 current += 16 * linesize;
yading@10 687 }
yading@10 688 } else {
yading@10 689 /* delta frame */
yading@10 690 uint8_t *previous = s->prev->data[i];
yading@10 691 if (!previous ||
yading@10 692 s->prev->width != s->width || s->prev->height != s->height) {
yading@10 693 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
yading@10 694 result = AVERROR_INVALIDDATA;
yading@10 695 goto err;
yading@10 696 }
yading@10 697
yading@10 698 memset(pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
yading@10 699
yading@10 700 for (y = 0; y < height; y += 16) {
yading@10 701 for (x = 0; x < width; x += 16) {
yading@10 702 result = svq1_decode_delta_block(avctx, &s->hdsp,
yading@10 703 &s->gb, &current[x],
yading@10 704 previous, linesize,
yading@10 705 pmv, x, y, width, height);
yading@10 706 if (result != 0) {
yading@10 707 av_dlog(avctx,
yading@10 708 "Error in svq1_decode_delta_block %i\n",
yading@10 709 result);
yading@10 710 goto err;
yading@10 711 }
yading@10 712 }
yading@10 713
yading@10 714 pmv[0].x =
yading@10 715 pmv[0].y = 0;
yading@10 716
yading@10 717 current += 16 * linesize;
yading@10 718 }
yading@10 719 }
yading@10 720 }
yading@10 721
yading@10 722 if (!s->nonref) {
yading@10 723 av_frame_unref(s->prev);
yading@10 724 result = av_frame_ref(s->prev, cur);
yading@10 725 if (result < 0)
yading@10 726 goto err;
yading@10 727 }
yading@10 728
yading@10 729 *got_frame = 1;
yading@10 730 result = buf_size;
yading@10 731
yading@10 732 err:
yading@10 733 av_free(pmv);
yading@10 734 return result;
yading@10 735 }
yading@10 736
yading@10 737 static av_cold int svq1_decode_init(AVCodecContext *avctx)
yading@10 738 {
yading@10 739 SVQ1Context *s = avctx->priv_data;
yading@10 740 int i;
yading@10 741 int offset = 0;
yading@10 742
yading@10 743 s->prev = avcodec_alloc_frame();
yading@10 744 if (!s->prev)
yading@10 745 return AVERROR(ENOMEM);
yading@10 746
yading@10 747 s->width = avctx->width + 3 & ~3;
yading@10 748 s->height = avctx->height + 3 & ~3;
yading@10 749 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
yading@10 750
yading@10 751 ff_hpeldsp_init(&s->hdsp, avctx->flags);
yading@10 752
yading@10 753 INIT_VLC_STATIC(&svq1_block_type, 2, 4,
yading@10 754 &ff_svq1_block_type_vlc[0][1], 2, 1,
yading@10 755 &ff_svq1_block_type_vlc[0][0], 2, 1, 6);
yading@10 756
yading@10 757 INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
yading@10 758 &ff_mvtab[0][1], 2, 1,
yading@10 759 &ff_mvtab[0][0], 2, 1, 176);
yading@10 760
yading@10 761 for (i = 0; i < 6; i++) {
yading@10 762 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
yading@10 763 { 10, 10, 14, 14, 14, 16 } };
yading@10 764 static VLC_TYPE table[168][2];
yading@10 765 svq1_intra_multistage[i].table = &table[offset];
yading@10 766 svq1_intra_multistage[i].table_allocated = sizes[0][i];
yading@10 767 offset += sizes[0][i];
yading@10 768 init_vlc(&svq1_intra_multistage[i], 3, 8,
yading@10 769 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
yading@10 770 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1,
yading@10 771 INIT_VLC_USE_NEW_STATIC);
yading@10 772 svq1_inter_multistage[i].table = &table[offset];
yading@10 773 svq1_inter_multistage[i].table_allocated = sizes[1][i];
yading@10 774 offset += sizes[1][i];
yading@10 775 init_vlc(&svq1_inter_multistage[i], 3, 8,
yading@10 776 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
yading@10 777 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1,
yading@10 778 INIT_VLC_USE_NEW_STATIC);
yading@10 779 }
yading@10 780
yading@10 781 INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
yading@10 782 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
yading@10 783 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 632);
yading@10 784
yading@10 785 INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
yading@10 786 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
yading@10 787 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1434);
yading@10 788
yading@10 789 return 0;
yading@10 790 }
yading@10 791
yading@10 792 static av_cold int svq1_decode_end(AVCodecContext *avctx)
yading@10 793 {
yading@10 794 SVQ1Context *s = avctx->priv_data;
yading@10 795
yading@10 796 av_frame_free(&s->prev);
yading@10 797
yading@10 798 return 0;
yading@10 799 }
yading@10 800
yading@10 801 static void svq1_flush(AVCodecContext *avctx)
yading@10 802 {
yading@10 803 SVQ1Context *s = avctx->priv_data;
yading@10 804
yading@10 805 av_frame_unref(s->prev);
yading@10 806 }
yading@10 807
yading@10 808 AVCodec ff_svq1_decoder = {
yading@10 809 .name = "svq1",
yading@10 810 .type = AVMEDIA_TYPE_VIDEO,
yading@10 811 .id = AV_CODEC_ID_SVQ1,
yading@10 812 .priv_data_size = sizeof(SVQ1Context),
yading@10 813 .init = svq1_decode_init,
yading@10 814 .close = svq1_decode_end,
yading@10 815 .decode = svq1_decode_frame,
yading@10 816 .capabilities = CODEC_CAP_DR1,
yading@10 817 .flush = svq1_flush,
yading@10 818 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P,
yading@10 819 AV_PIX_FMT_NONE },
yading@10 820 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
yading@10 821 };