57 { 0, 1, 5, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
58 { 0, 3, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0 }
62 { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125 },
63 { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119 }
67 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
68 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
69 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08,
70 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,
71 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16,
72 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28,
73 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
74 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
75 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
76 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
77 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
78 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
79 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
80 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
81 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
82 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,
83 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4,
84 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
85 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
86 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
88 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
89 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
90 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
91 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0,
92 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34,
93 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26,
94 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38,
95 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
96 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
97 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
98 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
99 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
100 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
101 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5,
102 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4,
103 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3,
104 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2,
105 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA,
106 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
107 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
117 { 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
118 { 0, 1, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
122 { 0, 7, 6, 5, 8, 4, 3, 1, 2 },
123 { 0, 2, 3, 4, 5, 6, 7, 1, 8 }
126 #define MAX_ENTRIES 162
147 const uint8_t *syms,
int num_syms)
152 int prefix = 0, max_bits = 0, idx = 0;
154 for (i = 0; i < 16; i++) {
155 for (j = 0; j < lens[i]; j++) {
157 codes[idx] = prefix++;
165 codes, 2, 2, syms, 1, 1, 0);
172 for (i = 0; i < 2; i++) {
192 for (i = 0; i < 2; i++) {
214 if (val < (1 << (nbits - 1)))
215 val -= (1 << nbits) - 1;
228 int *
block,
int *dc_cache,
229 int bx,
int by, uint16_t *quant_mat)
231 int skip,
val, pos = 1, zz_pos,
dc;
233 memset(block, 0,
sizeof(*block) * 64);
253 dc += dc_cache[
LEFT];
256 block[0] = dc * quant_mat[0];
275 block[zz_pos] = val * quant_mat[zz_pos];
279 return pos == 64 ? 0 : -1;
283 uint8_t *dst[3],
int mb_x,
int mb_y)
288 for (j = 0; j < 2; j++) {
289 for (i = 0; i < 2; i++) {
290 int xpos = mb_x * 2 + i;
306 for (i = 1; i < 3; i++) {
317 out = dst[i] + mb_x * 16;
320 for (j = 0; j < 16; j++) {
321 for (k = 0; k < 8; k++)
331 int *sel_len,
int *prev)
335 for (i = 2; i >= 0; i--) {
341 if (sel_len[i] > 0) {
343 vec_pos[i] =
get_bits(gb, sel_len[i]);
344 if (vec_pos[i] >= pval)
347 vec_pos[i] = !prev[i];
351 vec_pos[i] = prev[i];
357 int vec_size,
int component,
int shift,
int *prev)
359 if (vec_pos < vec_size)
362 return prev[component];
364 return prev[component];
367 #define MKVAL(vals) (vals[0] | (vals[1] << 3) | (vals[2] << 6))
381 uint8_t *picdst[3],
int mb_x,
int mb_y)
385 int sel_len[3], sel_flag[3];
387 int prev_vec1 = 0, prev_split = 0;
389 int prev_pix[3] = { 0 };
390 int prev_mode[16] = { 0 };
393 const int val_shift = ctx->
quality == 100 ? 0 : 2;
395 for (i = 0; i < 3; i++)
398 for (i = 0; i < 3; i++) {
400 for (j = 0; j < vec_len[i]; j++) {
405 sel_flag[i] = vec_len[i] > 1;
406 sel_len[i] = vec_len[i] > 2 ? vec_len[i] - 2 : 0;
409 for (j = 0; j < 16; j++) {
414 vals[0] = vals[1] = vals[2] = 0;
421 for (i = 0; i < 16; i++) {
423 vals[0] = prev_mode[i] & 7;
424 vals[1] = (prev_mode[i] >> 3) & 7;
425 vals[2] = prev_mode[i] >> 6;
426 if (mode == 1 && i == split) {
429 }
else if (mode == 2) {
433 for (k = 0; k < 3; k++)
436 val_shift, prev_pix);
437 prev_mode[i] =
MKVAL(vals);
442 if (split >= prev_split)
449 vals[0] = prev_mode[0] & 7;
450 vals[1] = (prev_mode[0] >> 3) & 7;
451 vals[2] = prev_mode[0] >> 6;
452 for (i = 0; i < 3; i++) {
453 for (k = 0; k <
split; k++) {
455 vec_len[i], i, val_shift,
457 prev_mode[k] =
MKVAL(vals);
463 vals[0] = prev_vec1 & 7;
464 vals[1] = (prev_vec1 >> 3) & 7;
465 vals[2] = prev_vec1 >> 6;
468 prev_vec1 =
MKVAL(vals);
470 for (i = 0; i < 3; i++) {
471 for (k = 0; k < 16 -
split; k++) {
473 vec_len[i], i, val_shift,
475 prev_mode[split + k] =
MKVAL(vals);
482 for (i = 0; i < 3; i++)
483 for (j = 0; j < 16; j++)
484 memcpy(picdst[i] + mb_x * 16 + j * ctx->
pic->
linesize[i],
485 ctx->
imgbuf[i] + j * 16, 16);
499 for (i = 0; i < 2; i++)
500 c->
prev_dc[0][mb_x * 2 + i] = 0;
502 for (i = 1; i < 3; i++) {
513 int buf_size = avpkt->
size;
519 int x,
y, i, mb_width, mb_height, blk_type;
524 "Frame should have at least %d bytes, got %d instead\n",
530 width = bytestream2_get_be16(&bc);
531 height = bytestream2_get_be16(&bc);
533 quality = bytestream2_get_byte(&bc);
534 frame_type = bytestream2_get_byte(&bc);
536 if (width > avctx->
width ||
537 height != avctx->
height) {
542 if (quality < 1 || quality > 100) {
546 if ((frame_type & ~3) || frame_type == 3) {
553 "Empty frame found but it is not a skip frame.\n");
572 for (i = 0; i < 2; i++)
578 mb_width =
FFALIGN(width, 16) >> 4;
579 mb_height =
FFALIGN(height, 16) >> 4;
585 for (y = 0; y < mb_height; y++) {
587 for (x = 0; x < mb_width; x++) {
593 "Error decoding DCT block %d,%d\n",
601 "Error decoding VQ block %d,%d\n",
635 for (i = 0; i < 3; i++)
652 for (i = 0; i < 3; i++) {