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
00036
00037 #include "avcodec.h"
00038 #include "dsputil.h"
00039 #include "mpegvideo.h"
00040 #include "mathops.h"
00041
00042 #include "svq1.h"
00043
00044 #undef NDEBUG
00045 #include <assert.h>
00046
00047 extern const uint8_t mvtab[33][2];
00048
00049 static VLC svq1_block_type;
00050 static VLC svq1_motion_component;
00051 static VLC svq1_intra_multistage[6];
00052 static VLC svq1_inter_multistage[6];
00053 static VLC svq1_intra_mean;
00054 static VLC svq1_inter_mean;
00055
00056
00057 typedef struct svq1_pmv_s {
00058 int x;
00059 int y;
00060 } svq1_pmv;
00061
00062 static const uint16_t checksum_table[256] = {
00063 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
00064 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
00065 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
00066 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
00067 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
00068 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
00069 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
00070 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
00071 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
00072 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
00073 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
00074 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
00075 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
00076 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
00077 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
00078 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
00079 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
00080 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
00081 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
00082 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
00083 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
00084 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
00085 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
00086 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
00087 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
00088 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
00089 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
00090 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
00091 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
00092 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
00093 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
00094 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
00095 };
00096
00097 static const uint8_t string_table[256] = {
00098 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
00099 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
00100 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
00101 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
00102 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
00103 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
00104 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
00105 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
00106 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
00107 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
00108 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
00109 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
00110 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
00111 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
00112 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
00113 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
00114 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
00115 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
00116 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
00117 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
00118 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
00119 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
00120 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
00121 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
00122 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
00123 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
00124 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
00125 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
00126 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
00127 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
00128 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
00129 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
00130 };
00131
00132 #define SVQ1_PROCESS_VECTOR()\
00133 for (; level > 0; i++) {\
00134 \
00135 if (i == m) {\
00136 m = n;\
00137 if (--level == 0)\
00138 break;\
00139 }\
00140 \
00141 if (get_bits1 (bitbuf) == 0)\
00142 break;\
00143 \
00144 list[n++] = list[i];\
00145 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
00146 }
00147
00148 #define SVQ1_ADD_CODEBOOK()\
00149 \
00150 for (j=0; j < stages; j++) {\
00151 n3 = codebook[entries[j]] ^ 0x80808080;\
00152 n1 += ((n3 & 0xFF00FF00) >> 8);\
00153 n2 += (n3 & 0x00FF00FF);\
00154 }\
00155 \
00156 \
00157 if (n1 & 0xFF00FF00) {\
00158 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
00159 n1 += 0x7F007F00;\
00160 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
00161 n1 &= (n3 & 0x00FF00FF);\
00162 }\
00163 \
00164 if (n2 & 0xFF00FF00) {\
00165 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
00166 n2 += 0x7F007F00;\
00167 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
00168 n2 &= (n3 & 0x00FF00FF);\
00169 }
00170
00171 #define SVQ1_DO_CODEBOOK_INTRA()\
00172 for (y=0; y < height; y++) {\
00173 for (x=0; x < (width / 4); x++, codebook++) {\
00174 n1 = n4;\
00175 n2 = n4;\
00176 SVQ1_ADD_CODEBOOK()\
00177 \
00178 dst[x] = (n1 << 8) | n2;\
00179 }\
00180 dst += (pitch / 4);\
00181 }
00182
00183 #define SVQ1_DO_CODEBOOK_NONINTRA()\
00184 for (y=0; y < height; y++) {\
00185 for (x=0; x < (width / 4); x++, codebook++) {\
00186 n3 = dst[x];\
00187 \
00188 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
00189 n2 = (n3 & 0x00FF00FF) + n4;\
00190 SVQ1_ADD_CODEBOOK()\
00191 \
00192 dst[x] = (n1 << 8) | n2;\
00193 }\
00194 dst += (pitch / 4);\
00195 }
00196
00197 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
00198 codebook = (const uint32_t *) cbook[level];\
00199 bit_cache = get_bits (bitbuf, 4*stages);\
00200 \
00201 for (j=0; j < stages; j++) {\
00202 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
00203 }\
00204 mean -= (stages * 128);\
00205 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
00206
00207 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
00208 uint32_t bit_cache;
00209 uint8_t *list[63];
00210 uint32_t *dst;
00211 const uint32_t *codebook;
00212 int entries[6];
00213 int i, j, m, n;
00214 int mean, stages;
00215 unsigned x, y, width, height, level;
00216 uint32_t n1, n2, n3, n4;
00217
00218
00219 list[0] = pixels;
00220
00221
00222 for (i=0, m=1, n=1, level=5; i < n; i++) {
00223 SVQ1_PROCESS_VECTOR();
00224
00225
00226 dst = (uint32_t *) list[i];
00227 width = 1 << ((4 + level) /2);
00228 height = 1 << ((3 + level) /2);
00229
00230
00231 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
00232
00233 if (stages == -1) {
00234 for (y=0; y < height; y++) {
00235 memset (&dst[y*(pitch / 4)], 0, width);
00236 }
00237 continue;
00238 }
00239
00240 if ((stages > 0) && (level >= 4)) {
00241 #ifdef DEBUG_SVQ1
00242 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
00243 #endif
00244 return -1;
00245 }
00246
00247 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
00248
00249 if (stages == 0) {
00250 for (y=0; y < height; y++) {
00251 memset (&dst[y*(pitch / 4)], mean, width);
00252 }
00253 } else {
00254 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
00255 SVQ1_DO_CODEBOOK_INTRA()
00256 }
00257 }
00258
00259 return 0;
00260 }
00261
00262 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
00263 uint32_t bit_cache;
00264 uint8_t *list[63];
00265 uint32_t *dst;
00266 const uint32_t *codebook;
00267 int entries[6];
00268 int i, j, m, n;
00269 int mean, stages;
00270 int x, y, width, height, level;
00271 uint32_t n1, n2, n3, n4;
00272
00273
00274 list[0] = pixels;
00275
00276
00277 for (i=0, m=1, n=1, level=5; i < n; i++) {
00278 SVQ1_PROCESS_VECTOR();
00279
00280
00281 dst = (uint32_t *) list[i];
00282 width = 1 << ((4 + level) /2);
00283 height = 1 << ((3 + level) /2);
00284
00285
00286 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
00287
00288 if (stages == -1) continue;
00289
00290 if ((stages > 0) && (level >= 4)) {
00291 #ifdef DEBUG_SVQ1
00292 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
00293 #endif
00294 return -1;
00295 }
00296
00297 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
00298
00299 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
00300 SVQ1_DO_CODEBOOK_NONINTRA()
00301 }
00302 return 0;
00303 }
00304
00305 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv) {
00306 int diff;
00307 int i;
00308
00309 for (i=0; i < 2; i++) {
00310
00311
00312 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
00313 if(diff<0)
00314 return -1;
00315 else if(diff){
00316 if(get_bits1(bitbuf)) diff= -diff;
00317 }
00318
00319
00320 if (i == 1)
00321 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
00322 else
00323 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
00324 }
00325
00326 return 0;
00327 }
00328
00329 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
00330 uint8_t *src;
00331 uint8_t *dst;
00332 int i;
00333
00334 src = &previous[x + y*pitch];
00335 dst = current;
00336
00337 for (i=0; i < 16; i++) {
00338 memcpy (dst, src, 16);
00339 src += pitch;
00340 dst += pitch;
00341 }
00342 }
00343
00344 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
00345 uint8_t *current, uint8_t *previous, int pitch,
00346 svq1_pmv *motion, int x, int y) {
00347 uint8_t *src;
00348 uint8_t *dst;
00349 svq1_pmv mv;
00350 svq1_pmv *pmv[3];
00351 int result;
00352
00353
00354 pmv[0] = &motion[0];
00355 if (y == 0) {
00356 pmv[1] =
00357 pmv[2] = pmv[0];
00358 }
00359 else {
00360 pmv[1] = &motion[(x / 8) + 2];
00361 pmv[2] = &motion[(x / 8) + 4];
00362 }
00363
00364 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
00365
00366 if (result != 0)
00367 return result;
00368
00369 motion[0].x =
00370 motion[(x / 8) + 2].x =
00371 motion[(x / 8) + 3].x = mv.x;
00372 motion[0].y =
00373 motion[(x / 8) + 2].y =
00374 motion[(x / 8) + 3].y = mv.y;
00375
00376 if(y + (mv.y >> 1)<0)
00377 mv.y= 0;
00378 if(x + (mv.x >> 1)<0)
00379 mv.x= 0;
00380
00381 #if 0
00382 int w= (s->width+15)&~15;
00383 int h= (s->height+15)&~15;
00384 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
00385 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
00386 #endif
00387
00388 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
00389 dst = current;
00390
00391 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
00392
00393 return 0;
00394 }
00395
00396 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
00397 uint8_t *current, uint8_t *previous, int pitch,
00398 svq1_pmv *motion,int x, int y) {
00399 uint8_t *src;
00400 uint8_t *dst;
00401 svq1_pmv mv;
00402 svq1_pmv *pmv[4];
00403 int i, result;
00404
00405
00406 pmv[0] = &motion[0];
00407 if (y == 0) {
00408 pmv[1] =
00409 pmv[2] = pmv[0];
00410 }
00411 else {
00412 pmv[1] = &motion[(x / 8) + 2];
00413 pmv[2] = &motion[(x / 8) + 4];
00414 }
00415
00416 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
00417
00418 if (result != 0)
00419 return result;
00420
00421
00422 pmv[0] = &mv;
00423 if (y == 0) {
00424 pmv[1] =
00425 pmv[2] = pmv[0];
00426 }
00427 else {
00428 pmv[1] = &motion[(x / 8) + 3];
00429 }
00430 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
00431
00432 if (result != 0)
00433 return result;
00434
00435
00436 pmv[1] = &motion[0];
00437 pmv[2] = &motion[(x / 8) + 1];
00438
00439 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
00440
00441 if (result != 0)
00442 return result;
00443
00444
00445 pmv[2] = &motion[(x / 8) + 2];
00446 pmv[3] = &motion[(x / 8) + 3];
00447
00448 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
00449
00450 if (result != 0)
00451 return result;
00452
00453
00454 for (i=0; i < 4; i++) {
00455 int mvx= pmv[i]->x + (i&1)*16;
00456 int mvy= pmv[i]->y + (i>>1)*16;
00457
00459 if(y + (mvy >> 1)<0)
00460 mvy= 0;
00461 if(x + (mvx >> 1)<0)
00462 mvx= 0;
00463
00464 #if 0
00465 int w= (s->width+15)&~15;
00466 int h= (s->height+15)&~15;
00467 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
00468 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
00469 #endif
00470 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
00471 dst = current;
00472
00473 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
00474
00475
00476 if (i & 1) {
00477 current += 8*(pitch - 1);
00478 } else {
00479 current += 8;
00480 }
00481 }
00482
00483 return 0;
00484 }
00485
00486 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
00487 uint8_t *current, uint8_t *previous, int pitch,
00488 svq1_pmv *motion, int x, int y) {
00489 uint32_t block_type;
00490 int result = 0;
00491
00492
00493 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
00494
00495
00496 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
00497 motion[0].x =
00498 motion[0].y =
00499 motion[(x / 8) + 2].x =
00500 motion[(x / 8) + 2].y =
00501 motion[(x / 8) + 3].x =
00502 motion[(x / 8) + 3].y = 0;
00503 }
00504
00505 switch (block_type) {
00506 case SVQ1_BLOCK_SKIP:
00507 svq1_skip_block (current, previous, pitch, x, y);
00508 break;
00509
00510 case SVQ1_BLOCK_INTER:
00511 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
00512
00513 if (result != 0)
00514 {
00515 #ifdef DEBUG_SVQ1
00516 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
00517 #endif
00518 break;
00519 }
00520 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
00521 break;
00522
00523 case SVQ1_BLOCK_INTER_4V:
00524 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
00525
00526 if (result != 0)
00527 {
00528 #ifdef DEBUG_SVQ1
00529 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
00530 #endif
00531 break;
00532 }
00533 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
00534 break;
00535
00536 case SVQ1_BLOCK_INTRA:
00537 result = svq1_decode_block_intra (bitbuf, current, pitch);
00538 break;
00539 }
00540
00541 return result;
00542 }
00543
00544 uint16_t ff_svq1_packet_checksum (const uint8_t *data, const int length, int value) {
00545 int i;
00546
00547 for (i=0; i < length; i++) {
00548 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
00549 }
00550
00551 return value;
00552 }
00553
00554 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
00555 uint8_t seed;
00556 int i;
00557
00558 out[0] = get_bits (bitbuf, 8);
00559
00560 seed = string_table[out[0]];
00561
00562 for (i=1; i <= out[0]; i++) {
00563 out[i] = get_bits (bitbuf, 8) ^ seed;
00564 seed = string_table[out[i] ^ seed];
00565 }
00566 }
00567
00568 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
00569 int frame_size_code;
00570 int temporal_reference;
00571
00572 temporal_reference = get_bits (bitbuf, 8);
00573
00574
00575 s->pict_type= get_bits (bitbuf, 2)+1;
00576 if(s->pict_type==4)
00577 return -1;
00578
00579 if (s->pict_type == FF_I_TYPE) {
00580
00581
00582 if (s->f_code == 0x50 || s->f_code == 0x60) {
00583 int csum = get_bits (bitbuf, 16);
00584
00585 csum = ff_svq1_packet_checksum (bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
00586
00587
00588
00589 }
00590
00591 if ((s->f_code ^ 0x10) >= 0x50) {
00592 uint8_t msg[256];
00593
00594 svq1_parse_string (bitbuf, msg);
00595
00596 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
00597 }
00598
00599 skip_bits (bitbuf, 2);
00600 skip_bits (bitbuf, 2);
00601 skip_bits1 (bitbuf);
00602
00603
00604 frame_size_code = get_bits (bitbuf, 3);
00605
00606 if (frame_size_code == 7) {
00607
00608 s->width = get_bits (bitbuf, 12);
00609 s->height = get_bits (bitbuf, 12);
00610
00611 if (!s->width || !s->height)
00612 return -1;
00613 } else {
00614
00615 s->width = ff_svq1_frame_size_table[frame_size_code].width;
00616 s->height = ff_svq1_frame_size_table[frame_size_code].height;
00617 }
00618 }
00619
00620
00621 if (get_bits1 (bitbuf) == 1) {
00622 skip_bits1 (bitbuf);
00623 skip_bits1 (bitbuf);
00624
00625 if (get_bits (bitbuf, 2) != 0)
00626 return -1;
00627 }
00628
00629 if (get_bits1 (bitbuf) == 1) {
00630 skip_bits1 (bitbuf);
00631 skip_bits (bitbuf, 4);
00632 skip_bits1 (bitbuf);
00633 skip_bits (bitbuf, 2);
00634
00635 while (get_bits1 (bitbuf) == 1) {
00636 skip_bits (bitbuf, 8);
00637 }
00638 }
00639
00640 return 0;
00641 }
00642
00643 static int svq1_decode_frame(AVCodecContext *avctx,
00644 void *data, int *data_size,
00645 const uint8_t *buf, int buf_size)
00646 {
00647 MpegEncContext *s=avctx->priv_data;
00648 uint8_t *current, *previous;
00649 int result, i, x, y, width, height;
00650 AVFrame *pict = data;
00651
00652
00653 init_get_bits(&s->gb,buf,buf_size*8);
00654
00655
00656 s->f_code = get_bits (&s->gb, 22);
00657
00658 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
00659 return -1;
00660
00661
00662 if (s->f_code != 0x20) {
00663 uint32_t *src = (uint32_t *) (buf + 4);
00664
00665 for (i=0; i < 4; i++) {
00666 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
00667 }
00668 }
00669
00670 result = svq1_decode_frame_header (&s->gb, s);
00671
00672 if (result != 0)
00673 {
00674 #ifdef DEBUG_SVQ1
00675 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
00676 #endif
00677 return result;
00678 }
00679 avcodec_set_dimensions(avctx, s->width, s->height);
00680
00681
00682
00683 if(s->pict_type==FF_B_TYPE && s->last_picture_ptr==NULL) return buf_size;
00684
00685 if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return buf_size;
00686 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
00687 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
00688 || avctx->skip_frame >= AVDISCARD_ALL)
00689 return buf_size;
00690
00691 if(MPV_frame_start(s, avctx) < 0)
00692 return -1;
00693
00694
00695 for (i=0; i < 3; i++) {
00696 int linesize;
00697 if (i == 0) {
00698 width = (s->width+15)&~15;
00699 height = (s->height+15)&~15;
00700 linesize= s->linesize;
00701 } else {
00702 if(s->flags&CODEC_FLAG_GRAY) break;
00703 width = (s->width/4+15)&~15;
00704 height = (s->height/4+15)&~15;
00705 linesize= s->uvlinesize;
00706 }
00707
00708 current = s->current_picture.data[i];
00709
00710 if(s->pict_type==FF_B_TYPE){
00711 previous = s->next_picture.data[i];
00712 }else{
00713 previous = s->last_picture.data[i];
00714 }
00715
00716 if (s->pict_type == FF_I_TYPE) {
00717
00718 for (y=0; y < height; y+=16) {
00719 for (x=0; x < width; x+=16) {
00720 result = svq1_decode_block_intra (&s->gb, ¤t[x], linesize);
00721 if (result != 0)
00722 {
00723
00724 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
00725
00726 return result;
00727 }
00728 }
00729 current += 16*linesize;
00730 }
00731 } else {
00732 svq1_pmv pmv[width/8+3];
00733
00734 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
00735
00736 for (y=0; y < height; y+=16) {
00737 for (x=0; x < width; x+=16) {
00738 result = svq1_decode_delta_block (s, &s->gb, ¤t[x], previous,
00739 linesize, pmv, x, y);
00740 if (result != 0)
00741 {
00742 #ifdef DEBUG_SVQ1
00743 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
00744 #endif
00745 return result;
00746 }
00747 }
00748
00749 pmv[0].x =
00750 pmv[0].y = 0;
00751
00752 current += 16*linesize;
00753 }
00754 }
00755 }
00756
00757 *pict = *(AVFrame*)&s->current_picture;
00758
00759
00760 MPV_frame_end(s);
00761
00762 *data_size=sizeof(AVFrame);
00763 return buf_size;
00764 }
00765
00766 static av_cold int svq1_decode_init(AVCodecContext *avctx)
00767 {
00768 MpegEncContext *s = avctx->priv_data;
00769 int i;
00770
00771 MPV_decode_defaults(s);
00772
00773 s->avctx = avctx;
00774 s->width = (avctx->width+3)&~3;
00775 s->height = (avctx->height+3)&~3;
00776 s->codec_id= avctx->codec->id;
00777 avctx->pix_fmt = PIX_FMT_YUV410P;
00778 avctx->has_b_frames= 1;
00779 s->flags= avctx->flags;
00780 if (MPV_common_init(s) < 0) return -1;
00781
00782 init_vlc(&svq1_block_type, 2, 4,
00783 &ff_svq1_block_type_vlc[0][1], 2, 1,
00784 &ff_svq1_block_type_vlc[0][0], 2, 1, 1);
00785
00786 init_vlc(&svq1_motion_component, 7, 33,
00787 &mvtab[0][1], 2, 1,
00788 &mvtab[0][0], 2, 1, 1);
00789
00790 for (i = 0; i < 6; i++) {
00791 init_vlc(&svq1_intra_multistage[i], 3, 8,
00792 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
00793 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
00794 init_vlc(&svq1_inter_multistage[i], 3, 8,
00795 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
00796 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
00797 }
00798
00799 init_vlc(&svq1_intra_mean, 8, 256,
00800 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
00801 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 1);
00802
00803 init_vlc(&svq1_inter_mean, 9, 512,
00804 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
00805 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1);
00806
00807 return 0;
00808 }
00809
00810 static av_cold int svq1_decode_end(AVCodecContext *avctx)
00811 {
00812 MpegEncContext *s = avctx->priv_data;
00813
00814 MPV_common_end(s);
00815 return 0;
00816 }
00817
00818
00819 AVCodec svq1_decoder = {
00820 "svq1",
00821 CODEC_TYPE_VIDEO,
00822 CODEC_ID_SVQ1,
00823 sizeof(MpegEncContext),
00824 svq1_decode_init,
00825 NULL,
00826 svq1_decode_end,
00827 svq1_decode_frame,
00828 CODEC_CAP_DR1,
00829 .flush= ff_mpeg_flush,
00830 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, PIX_FMT_NONE},
00831 .long_name= NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1"),
00832 };