00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #include "avcodec.h"
00036 #include "dsputil.h"
00037 #include "get_bits.h"
00038 #include "internal.h"
00039 #include "mathops.h"
00040 #include "svq1.h"
00041
00042 #undef NDEBUG
00043 #include <assert.h>
00044
00045 extern const uint8_t ff_mvtab[33][2];
00046
00047 static VLC svq1_block_type;
00048 static VLC svq1_motion_component;
00049 static VLC svq1_intra_multistage[6];
00050 static VLC svq1_inter_multistage[6];
00051 static VLC svq1_intra_mean;
00052 static VLC svq1_inter_mean;
00053
00054
00055 typedef struct svq1_pmv_s {
00056 int x;
00057 int y;
00058 } svq1_pmv;
00059
00060 typedef struct SVQ1Context {
00061 DSPContext dsp;
00062 GetBitContext gb;
00063 AVFrame *cur, *prev;
00064 int width;
00065 int height;
00066 int frame_code;
00067 int nonref;
00068 } SVQ1Context;
00069
00070 static const uint8_t string_table[256] = {
00071 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
00072 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
00073 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
00074 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
00075 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
00076 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
00077 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
00078 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
00079 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
00080 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
00081 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
00082 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
00083 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
00084 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
00085 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
00086 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
00087 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
00088 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
00089 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
00090 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
00091 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
00092 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
00093 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
00094 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
00095 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
00096 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
00097 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
00098 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
00099 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
00100 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
00101 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
00102 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
00103 };
00104
00105 #define SVQ1_PROCESS_VECTOR() \
00106 for (; level > 0; i++) { \
00107 \
00108 if (i == m) { \
00109 m = n; \
00110 if (--level == 0) \
00111 break; \
00112 } \
00113 \
00114 if (!get_bits1(bitbuf)) \
00115 break; \
00116 \
00117 list[n++] = list[i]; \
00118 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
00119 }
00120
00121 #define SVQ1_ADD_CODEBOOK() \
00122 \
00123 for (j = 0; j < stages; j++) { \
00124 n3 = codebook[entries[j]] ^ 0x80808080; \
00125 n1 += (n3 & 0xFF00FF00) >> 8; \
00126 n2 += n3 & 0x00FF00FF; \
00127 } \
00128 \
00129 \
00130 if (n1 & 0xFF00FF00) { \
00131 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
00132 n1 += 0x7F007F00; \
00133 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
00134 n1 &= n3 & 0x00FF00FF; \
00135 } \
00136 \
00137 if (n2 & 0xFF00FF00) { \
00138 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
00139 n2 += 0x7F007F00; \
00140 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
00141 n2 &= n3 & 0x00FF00FF; \
00142 }
00143
00144 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
00145 codebook = (const uint32_t *)cbook[level]; \
00146 if (stages > 0) \
00147 bit_cache = get_bits(bitbuf, 4 * stages); \
00148 \
00149 for (j = 0; j < stages; j++) { \
00150 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
00151 16 * j) << (level + 1); \
00152 } \
00153 mean -= stages * 128; \
00154 n4 = (mean << 16) + mean;
00155
00156 static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels,
00157 int pitch)
00158 {
00159 uint32_t bit_cache;
00160 uint8_t *list[63];
00161 uint32_t *dst;
00162 const uint32_t *codebook;
00163 int entries[6];
00164 int i, j, m, n;
00165 int mean, stages;
00166 unsigned x, y, width, height, level;
00167 uint32_t n1, n2, n3, n4;
00168
00169
00170 list[0] = pixels;
00171
00172
00173 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
00174 SVQ1_PROCESS_VECTOR();
00175
00176
00177 dst = (uint32_t *)list[i];
00178 width = 1 << ((4 + level) / 2);
00179 height = 1 << ((3 + level) / 2);
00180
00181
00182 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
00183
00184 if (stages == -1) {
00185 for (y = 0; y < height; y++)
00186 memset(&dst[y * (pitch / 4)], 0, width);
00187 continue;
00188 }
00189
00190 if (stages > 0 && level >= 4) {
00191 av_dlog(NULL,
00192 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
00193 stages, level);
00194 return AVERROR_INVALIDDATA;
00195 }
00196
00197 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
00198
00199 if (stages == 0) {
00200 for (y = 0; y < height; y++)
00201 memset(&dst[y * (pitch / 4)], mean, width);
00202 } else {
00203 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
00204
00205 for (y = 0; y < height; y++) {
00206 for (x = 0; x < width / 4; x++, codebook++) {
00207 n1 = n4;
00208 n2 = n4;
00209 SVQ1_ADD_CODEBOOK()
00210
00211 dst[x] = n1 << 8 | n2;
00212 }
00213 dst += pitch / 4;
00214 }
00215 }
00216 }
00217
00218 return 0;
00219 }
00220
00221 static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels,
00222 int pitch)
00223 {
00224 uint32_t bit_cache;
00225 uint8_t *list[63];
00226 uint32_t *dst;
00227 const uint32_t *codebook;
00228 int entries[6];
00229 int i, j, m, n;
00230 int mean, stages;
00231 int x, y, width, height, level;
00232 uint32_t n1, n2, n3, n4;
00233
00234
00235 list[0] = pixels;
00236
00237
00238 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
00239 SVQ1_PROCESS_VECTOR();
00240
00241
00242 dst = (uint32_t *)list[i];
00243 width = 1 << ((4 + level) / 2);
00244 height = 1 << ((3 + level) / 2);
00245
00246
00247 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
00248
00249 if (stages == -1)
00250 continue;
00251
00252 if ((stages > 0) && (level >= 4)) {
00253 av_dlog(NULL,
00254 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
00255 stages, level);
00256 return AVERROR_INVALIDDATA;
00257 }
00258
00259 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
00260
00261 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
00262
00263 for (y = 0; y < height; y++) {
00264 for (x = 0; x < width / 4; x++, codebook++) {
00265 n3 = dst[x];
00266
00267 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
00268 n2 = n4 + (n3 & 0x00FF00FF);
00269 SVQ1_ADD_CODEBOOK()
00270
00271 dst[x] = n1 << 8 | n2;
00272 }
00273 dst += pitch / 4;
00274 }
00275 }
00276 return 0;
00277 }
00278
00279 static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv,
00280 svq1_pmv **pmv)
00281 {
00282 int diff;
00283 int i;
00284
00285 for (i = 0; i < 2; i++) {
00286
00287 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
00288 if (diff < 0)
00289 return AVERROR_INVALIDDATA;
00290 else if (diff) {
00291 if (get_bits1(bitbuf))
00292 diff = -diff;
00293 }
00294
00295
00296 if (i == 1)
00297 mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6);
00298 else
00299 mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6);
00300 }
00301
00302 return 0;
00303 }
00304
00305 static void svq1_skip_block(uint8_t *current, uint8_t *previous,
00306 int pitch, int x, int y)
00307 {
00308 uint8_t *src;
00309 uint8_t *dst;
00310 int i;
00311
00312 src = &previous[x + y * pitch];
00313 dst = current;
00314
00315 for (i = 0; i < 16; i++) {
00316 memcpy(dst, src, 16);
00317 src += pitch;
00318 dst += pitch;
00319 }
00320 }
00321
00322 static int svq1_motion_inter_block(DSPContext *dsp, GetBitContext *bitbuf,
00323 uint8_t *current, uint8_t *previous,
00324 int pitch, svq1_pmv *motion, int x, int y)
00325 {
00326 uint8_t *src;
00327 uint8_t *dst;
00328 svq1_pmv mv;
00329 svq1_pmv *pmv[3];
00330 int result;
00331
00332
00333 pmv[0] = &motion[0];
00334 if (y == 0) {
00335 pmv[1] =
00336 pmv[2] = pmv[0];
00337 } else {
00338 pmv[1] = &motion[x / 8 + 2];
00339 pmv[2] = &motion[x / 8 + 4];
00340 }
00341
00342 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
00343 if (result)
00344 return result;
00345
00346 motion[0].x =
00347 motion[x / 8 + 2].x =
00348 motion[x / 8 + 3].x = mv.x;
00349 motion[0].y =
00350 motion[x / 8 + 2].y =
00351 motion[x / 8 + 3].y = mv.y;
00352
00353 if (y + (mv.y >> 1) < 0)
00354 mv.y = 0;
00355 if (x + (mv.x >> 1) < 0)
00356 mv.x = 0;
00357
00358 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch];
00359 dst = current;
00360
00361 dsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16);
00362
00363 return 0;
00364 }
00365
00366 static int svq1_motion_inter_4v_block(DSPContext *dsp, GetBitContext *bitbuf,
00367 uint8_t *current, uint8_t *previous,
00368 int pitch, svq1_pmv *motion, int x, int y)
00369 {
00370 uint8_t *src;
00371 uint8_t *dst;
00372 svq1_pmv mv;
00373 svq1_pmv *pmv[4];
00374 int i, result;
00375
00376
00377 pmv[0] = &motion[0];
00378 if (y == 0) {
00379 pmv[1] =
00380 pmv[2] = pmv[0];
00381 } else {
00382 pmv[1] = &motion[(x / 8) + 2];
00383 pmv[2] = &motion[(x / 8) + 4];
00384 }
00385
00386 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
00387 if (result)
00388 return result;
00389
00390
00391 pmv[0] = &mv;
00392 if (y == 0) {
00393 pmv[1] =
00394 pmv[2] = pmv[0];
00395 } else {
00396 pmv[1] = &motion[(x / 8) + 3];
00397 }
00398 result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv);
00399 if (result)
00400 return result;
00401
00402
00403 pmv[1] = &motion[0];
00404 pmv[2] = &motion[(x / 8) + 1];
00405
00406 result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv);
00407 if (result)
00408 return result;
00409
00410
00411 pmv[2] = &motion[(x / 8) + 2];
00412 pmv[3] = &motion[(x / 8) + 3];
00413
00414 result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv);
00415 if (result)
00416 return result;
00417
00418
00419 for (i = 0; i < 4; i++) {
00420 int mvx = pmv[i]->x + (i & 1) * 16;
00421 int mvy = pmv[i]->y + (i >> 1) * 16;
00422
00423
00424 if (y + (mvy >> 1) < 0)
00425 mvy = 0;
00426 if (x + (mvx >> 1) < 0)
00427 mvx = 0;
00428
00429 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
00430 dst = current;
00431
00432 dsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
00433
00434
00435 if (i & 1)
00436 current += 8 * (pitch - 1);
00437 else
00438 current += 8;
00439 }
00440
00441 return 0;
00442 }
00443
00444 static int svq1_decode_delta_block(AVCodecContext *avctx, DSPContext *dsp,
00445 GetBitContext *bitbuf,
00446 uint8_t *current, uint8_t *previous,
00447 int pitch, svq1_pmv *motion, int x, int y)
00448 {
00449 uint32_t block_type;
00450 int result = 0;
00451
00452
00453 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
00454
00455
00456 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
00457 motion[0].x =
00458 motion[0].y =
00459 motion[x / 8 + 2].x =
00460 motion[x / 8 + 2].y =
00461 motion[x / 8 + 3].x =
00462 motion[x / 8 + 3].y = 0;
00463 }
00464
00465 switch (block_type) {
00466 case SVQ1_BLOCK_SKIP:
00467 svq1_skip_block(current, previous, pitch, x, y);
00468 break;
00469
00470 case SVQ1_BLOCK_INTER:
00471 result = svq1_motion_inter_block(dsp, bitbuf, current, previous,
00472 pitch, motion, x, y);
00473
00474 if (result != 0) {
00475 av_dlog(avctx, "Error in svq1_motion_inter_block %i\n", result);
00476 break;
00477 }
00478 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
00479 break;
00480
00481 case SVQ1_BLOCK_INTER_4V:
00482 result = svq1_motion_inter_4v_block(dsp, bitbuf, current, previous,
00483 pitch, motion, x, y);
00484
00485 if (result != 0) {
00486 av_dlog(avctx, "Error in svq1_motion_inter_4v_block %i\n", result);
00487 break;
00488 }
00489 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
00490 break;
00491
00492 case SVQ1_BLOCK_INTRA:
00493 result = svq1_decode_block_intra(bitbuf, current, pitch);
00494 break;
00495 }
00496
00497 return result;
00498 }
00499
00500 static void svq1_parse_string(GetBitContext *bitbuf, uint8_t *out)
00501 {
00502 uint8_t seed;
00503 int i;
00504
00505 out[0] = get_bits(bitbuf, 8);
00506 seed = string_table[out[0]];
00507
00508 for (i = 1; i <= out[0]; i++) {
00509 out[i] = get_bits(bitbuf, 8) ^ seed;
00510 seed = string_table[out[i] ^ seed];
00511 }
00512 }
00513
00514 static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
00515 {
00516 SVQ1Context *s = avctx->priv_data;
00517 GetBitContext *bitbuf = &s->gb;
00518 int frame_size_code;
00519 int width = s->width;
00520 int height = s->height;
00521
00522 skip_bits(bitbuf, 8);
00523
00524
00525 s->nonref = 0;
00526 switch (get_bits(bitbuf, 2)) {
00527 case 0:
00528 frame->pict_type = AV_PICTURE_TYPE_I;
00529 break;
00530 case 2:
00531 s->nonref = 1;
00532 case 1:
00533 frame->pict_type = AV_PICTURE_TYPE_P;
00534 break;
00535 default:
00536 av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
00537 return AVERROR_INVALIDDATA;
00538 }
00539
00540 if (frame->pict_type == AV_PICTURE_TYPE_I) {
00541
00542 if (s->frame_code == 0x50 || s->frame_code == 0x60) {
00543 int csum = get_bits(bitbuf, 16);
00544
00545 csum = ff_svq1_packet_checksum(bitbuf->buffer,
00546 bitbuf->size_in_bits >> 3,
00547 csum);
00548
00549 av_dlog(avctx, "%s checksum (%02x) for packet data\n",
00550 (csum == 0) ? "correct" : "incorrect", csum);
00551 }
00552
00553 if ((s->frame_code ^ 0x10) >= 0x50) {
00554 uint8_t msg[256];
00555
00556 svq1_parse_string(bitbuf, msg);
00557
00558 av_log(avctx, AV_LOG_INFO,
00559 "embedded message: \"%s\"\n", (char *)msg);
00560 }
00561
00562 skip_bits(bitbuf, 2);
00563 skip_bits(bitbuf, 2);
00564 skip_bits1(bitbuf);
00565
00566
00567 frame_size_code = get_bits(bitbuf, 3);
00568
00569 if (frame_size_code == 7) {
00570
00571 width = get_bits(bitbuf, 12);
00572 height = get_bits(bitbuf, 12);
00573
00574 if (!width || !height)
00575 return AVERROR_INVALIDDATA;
00576 } else {
00577
00578 width = ff_svq1_frame_size_table[frame_size_code].width;
00579 height = ff_svq1_frame_size_table[frame_size_code].height;
00580 }
00581 }
00582
00583
00584 if (get_bits1(bitbuf)) {
00585 skip_bits1(bitbuf);
00586 skip_bits1(bitbuf);
00587
00588 if (get_bits(bitbuf, 2) != 0)
00589 return AVERROR_INVALIDDATA;
00590 }
00591
00592 if (get_bits1(bitbuf)) {
00593 skip_bits1(bitbuf);
00594 skip_bits(bitbuf, 4);
00595 skip_bits1(bitbuf);
00596 skip_bits(bitbuf, 2);
00597
00598 while (get_bits1(bitbuf))
00599 skip_bits(bitbuf, 8);
00600 }
00601
00602 s->width = width;
00603 s->height = height;
00604 return 0;
00605 }
00606
00607 static int svq1_decode_frame(AVCodecContext *avctx, void *data,
00608 int *got_frame, AVPacket *avpkt)
00609 {
00610 const uint8_t *buf = avpkt->data;
00611 int buf_size = avpkt->size;
00612 SVQ1Context *s = avctx->priv_data;
00613 AVFrame *cur = s->cur;
00614 uint8_t *current;
00615 int result, i, x, y, width, height;
00616 svq1_pmv *pmv;
00617
00618 if (cur->data[0])
00619 avctx->release_buffer(avctx, cur);
00620
00621
00622 init_get_bits(&s->gb, buf, buf_size * 8);
00623
00624
00625 s->frame_code = get_bits(&s->gb, 22);
00626
00627 if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
00628 return AVERROR_INVALIDDATA;
00629
00630
00631 if (s->frame_code != 0x20) {
00632 uint32_t *src = (uint32_t *)(buf + 4);
00633
00634 if (buf_size < 36)
00635 return AVERROR_INVALIDDATA;
00636
00637 for (i = 0; i < 4; i++)
00638 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
00639 }
00640
00641 result = svq1_decode_frame_header(avctx, cur);
00642 if (result != 0) {
00643 av_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
00644 return result;
00645 }
00646 avcodec_set_dimensions(avctx, s->width, s->height);
00647
00648 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
00649 (avctx->skip_frame >= AVDISCARD_NONKEY &&
00650 cur->pict_type != AV_PICTURE_TYPE_I) ||
00651 avctx->skip_frame >= AVDISCARD_ALL)
00652 return buf_size;
00653
00654 result = ff_get_buffer(avctx, cur);
00655 if (result < 0)
00656 return result;
00657
00658 pmv = av_malloc((FFALIGN(s->width, 16) / 8 + 3) * sizeof(*pmv));
00659 if (!pmv)
00660 return AVERROR(ENOMEM);
00661
00662
00663 for (i = 0; i < 3; i++) {
00664 int linesize = cur->linesize[i];
00665 if (i == 0) {
00666 width = FFALIGN(s->width, 16);
00667 height = FFALIGN(s->height, 16);
00668 } else {
00669 if (avctx->flags & CODEC_FLAG_GRAY)
00670 break;
00671 width = FFALIGN(s->width / 4, 16);
00672 height = FFALIGN(s->height / 4, 16);
00673 }
00674
00675 current = cur->data[i];
00676
00677 if (cur->pict_type == AV_PICTURE_TYPE_I) {
00678
00679 for (y = 0; y < height; y += 16) {
00680 for (x = 0; x < width; x += 16) {
00681 result = svq1_decode_block_intra(&s->gb, ¤t[x],
00682 linesize);
00683 if (result) {
00684 av_log(avctx, AV_LOG_ERROR,
00685 "Error in svq1_decode_block %i (keyframe)\n",
00686 result);
00687 goto err;
00688 }
00689 }
00690 current += 16 * linesize;
00691 }
00692 } else {
00693
00694 uint8_t *previous = s->prev->data[i];
00695 if (!previous) {
00696 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
00697 result = AVERROR_INVALIDDATA;
00698 goto err;
00699 }
00700
00701 memset(pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
00702
00703 for (y = 0; y < height; y += 16) {
00704 for (x = 0; x < width; x += 16) {
00705 result = svq1_decode_delta_block(avctx, &s->dsp,
00706 &s->gb, ¤t[x],
00707 previous, linesize,
00708 pmv, x, y);
00709 if (result) {
00710 av_dlog(avctx,
00711 "Error in svq1_decode_delta_block %i\n",
00712 result);
00713 goto err;
00714 }
00715 }
00716
00717 pmv[0].x =
00718 pmv[0].y = 0;
00719
00720 current += 16 * linesize;
00721 }
00722 }
00723 }
00724
00725 *(AVFrame*)data = *cur;
00726 cur->qscale_table = NULL;
00727 if (!s->nonref)
00728 FFSWAP(AVFrame*, s->cur, s->prev);
00729
00730 *got_frame = 1;
00731 result = buf_size;
00732
00733 err:
00734 av_free(pmv);
00735 return result;
00736 }
00737
00738 static av_cold int svq1_decode_init(AVCodecContext *avctx)
00739 {
00740 SVQ1Context *s = avctx->priv_data;
00741 int i;
00742 int offset = 0;
00743
00744 s->cur = avcodec_alloc_frame();
00745 s->prev = avcodec_alloc_frame();
00746 if (!s->cur || !s->prev) {
00747 avcodec_free_frame(&s->cur);
00748 avcodec_free_frame(&s->prev);
00749 return AVERROR(ENOMEM);
00750 }
00751
00752 s->width = avctx->width + 3 & ~3;
00753 s->height = avctx->height + 3 & ~3;
00754 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
00755
00756 ff_dsputil_init(&s->dsp, avctx);
00757
00758 INIT_VLC_STATIC(&svq1_block_type, 2, 4,
00759 &ff_svq1_block_type_vlc[0][1], 2, 1,
00760 &ff_svq1_block_type_vlc[0][0], 2, 1, 6);
00761
00762 INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
00763 &ff_mvtab[0][1], 2, 1,
00764 &ff_mvtab[0][0], 2, 1, 176);
00765
00766 for (i = 0; i < 6; i++) {
00767 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
00768 { 10, 10, 14, 14, 14, 16 } };
00769 static VLC_TYPE table[168][2];
00770 svq1_intra_multistage[i].table = &table[offset];
00771 svq1_intra_multistage[i].table_allocated = sizes[0][i];
00772 offset += sizes[0][i];
00773 init_vlc(&svq1_intra_multistage[i], 3, 8,
00774 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
00775 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1,
00776 INIT_VLC_USE_NEW_STATIC);
00777 svq1_inter_multistage[i].table = &table[offset];
00778 svq1_inter_multistage[i].table_allocated = sizes[1][i];
00779 offset += sizes[1][i];
00780 init_vlc(&svq1_inter_multistage[i], 3, 8,
00781 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
00782 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1,
00783 INIT_VLC_USE_NEW_STATIC);
00784 }
00785
00786 INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
00787 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
00788 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 632);
00789
00790 INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
00791 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
00792 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1434);
00793
00794 return 0;
00795 }
00796
00797 static av_cold int svq1_decode_end(AVCodecContext *avctx)
00798 {
00799 SVQ1Context *s = avctx->priv_data;
00800
00801 if (s->cur->data[0])
00802 avctx->release_buffer(avctx, s->cur);
00803 if (s->prev->data[0])
00804 avctx->release_buffer(avctx, s->prev);
00805 avcodec_free_frame(&s->cur);
00806 avcodec_free_frame(&s->prev);
00807
00808 return 0;
00809 }
00810
00811 static void svq1_flush(AVCodecContext *avctx)
00812 {
00813 SVQ1Context *s = avctx->priv_data;
00814
00815 if (s->cur->data[0])
00816 avctx->release_buffer(avctx, s->cur);
00817 if (s->prev->data[0])
00818 avctx->release_buffer(avctx, s->prev);
00819 }
00820
00821 AVCodec ff_svq1_decoder = {
00822 .name = "svq1",
00823 .type = AVMEDIA_TYPE_VIDEO,
00824 .id = AV_CODEC_ID_SVQ1,
00825 .priv_data_size = sizeof(SVQ1Context),
00826 .init = svq1_decode_init,
00827 .close = svq1_decode_end,
00828 .decode = svq1_decode_frame,
00829 .capabilities = CODEC_CAP_DR1,
00830 .flush = svq1_flush,
00831 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P,
00832 AV_PIX_FMT_NONE },
00833 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
00834 };