2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * @brief IntraX8 (J-Frame) subdecoder, used by WMV2 and VC-1
27 #include "mpegvideo.h"
28 #include "msmpeg4data.h"
29 #include "intrax8huf.h"
31 #include "intrax8dsp.h"
33 #define MAX_TABLE_DEPTH(table_bits, max_bits) \
34 ((max_bits + table_bits - 1) / table_bits)
40 #define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
41 #define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
42 #define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
44 static VLC j_ac_vlc[2][2][8]; // [quant < 13], [intra / inter], [select]
45 static VLC j_dc_vlc[2][8]; // [quant], [select]
46 static VLC j_orient_vlc[2][4]; // [quant], [select]
48 static av_cold int x8_vlc_init(void)
53 static const uint16_t sizes[8 * 4 + 8 * 2 + 2 + 4] = {
54 576, 548, 582, 618, 546, 616, 560, 642,
55 584, 582, 704, 664, 512, 544, 656, 640,
56 512, 648, 582, 566, 532, 614, 596, 648,
57 586, 552, 584, 590, 544, 578, 584, 624,
59 528, 528, 526, 528, 536, 528, 526, 544,
60 544, 512, 512, 528, 528, 544, 512, 544,
62 128, 128, 128, 128, 128, 128,
65 static VLC_TYPE table[28150][2];
68 #define init_ac_vlc(dst, src) \
70 dst.table = &table[offset]; \
71 dst.table_allocated = sizes[sizeidx]; \
72 offset += sizes[sizeidx++]; \
73 init_vlc(&dst, AC_VLC_BITS, 77, &src[1], 4, 2, &src[0], 4, 2, \
74 INIT_VLC_USE_NEW_STATIC); \
77 for (i = 0; i < 8; i++) {
78 init_ac_vlc(j_ac_vlc[0][0][i], x8_ac0_highquant_table[i][0]);
79 init_ac_vlc(j_ac_vlc[0][1][i], x8_ac1_highquant_table[i][0]);
80 init_ac_vlc(j_ac_vlc[1][0][i], x8_ac0_lowquant_table[i][0]);
81 init_ac_vlc(j_ac_vlc[1][1][i], x8_ac1_lowquant_table[i][0]);
86 #define init_dc_vlc(dst, src) \
88 dst.table = &table[offset]; \
89 dst.table_allocated = sizes[sizeidx]; \
90 offset += sizes[sizeidx++]; \
91 init_vlc(&dst, DC_VLC_BITS, 34, &src[1], 4, 2, &src[0], 4, 2, \
92 INIT_VLC_USE_NEW_STATIC); \
95 for (i = 0; i < 8; i++) {
96 init_dc_vlc(j_dc_vlc[0][i], x8_dc_highquant_table[i][0]);
97 init_dc_vlc(j_dc_vlc[1][i], x8_dc_lowquant_table[i][0]);
102 #define init_or_vlc(dst, src) \
104 dst.table = &table[offset]; \
105 dst.table_allocated = sizes[sizeidx]; \
106 offset += sizes[sizeidx++]; \
107 init_vlc(&dst, OR_VLC_BITS, 12, &src[1], 4, 2, &src[0], 4, 2, \
108 INIT_VLC_USE_NEW_STATIC); \
111 for (i = 0; i < 2; i++)
112 init_or_vlc(j_orient_vlc[0][i], x8_orient_highquant_table[i][0]);
113 for (i = 0; i < 4; i++)
114 init_or_vlc(j_orient_vlc[1][i], x8_orient_lowquant_table[i][0]);
117 if (offset != sizeof(table) / sizeof(VLC_TYPE) / 2) {
118 av_log(NULL, AV_LOG_ERROR, "table size %zd does not match needed %i\n",
119 sizeof(table) / sizeof(VLC_TYPE) / 2, offset);
120 return AVERROR_INVALIDDATA;
126 static void x8_reset_vlc_tables(IntraX8Context *w)
128 memset(w->j_dc_vlc, 0, sizeof(w->j_dc_vlc));
129 memset(w->j_ac_vlc, 0, sizeof(w->j_ac_vlc));
130 w->j_orient_vlc = NULL;
133 static inline void x8_select_ac_table(IntraX8Context *const w, int mode)
135 MpegEncContext *const s = w->s;
140 if (w->j_ac_vlc[mode])
143 table_index = get_bits(&s->gb, 3);
144 // 2 modes use same tables
145 w->j_ac_vlc[mode] = &j_ac_vlc[w->quant < 13][mode >> 1][table_index];
147 assert(w->j_ac_vlc[mode]);
150 static inline int x8_get_orient_vlc(IntraX8Context *w)
152 MpegEncContext *const s = w->s;
154 if (!w->j_orient_vlc) {
155 int table_index = get_bits(&s->gb, 1 + (w->quant < 13));
156 w->j_orient_vlc = &j_orient_vlc[w->quant < 13][table_index];
158 assert(w->j_orient_vlc);
159 assert(w->j_orient_vlc->table);
161 return get_vlc2(&s->gb, w->j_orient_vlc->table, OR_VLC_BITS, OR_VLC_MTD);
164 #define extra_bits(eb) (eb) // 3 bits
165 #define extra_run (0xFF << 8) // 1 bit
166 #define extra_level (0x00 << 8) // 1 bit
167 #define run_offset(r) ((r) << 16) // 6 bits
168 #define level_offset(l) ((l) << 24) // 5 bits
169 static const uint32_t ac_decode_table[] = {
170 /* 46 */ extra_bits(3) | extra_run | run_offset(16) | level_offset(0),
171 /* 47 */ extra_bits(3) | extra_run | run_offset(24) | level_offset(0),
172 /* 48 */ extra_bits(2) | extra_run | run_offset(4) | level_offset(1),
173 /* 49 */ extra_bits(3) | extra_run | run_offset(8) | level_offset(1),
175 /* 50 */ extra_bits(5) | extra_run | run_offset(32) | level_offset(0),
176 /* 51 */ extra_bits(4) | extra_run | run_offset(16) | level_offset(1),
178 /* 52 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(4),
179 /* 53 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(8),
180 /* 54 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(12),
181 /* 55 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(16),
182 /* 56 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(24),
184 /* 57 */ extra_bits(2) | extra_level | run_offset(1) | level_offset(3),
185 /* 58 */ extra_bits(3) | extra_level | run_offset(1) | level_offset(7),
187 /* 59 */ extra_bits(2) | extra_run | run_offset(16) | level_offset(0),
188 /* 60 */ extra_bits(2) | extra_run | run_offset(20) | level_offset(0),
189 /* 61 */ extra_bits(2) | extra_run | run_offset(24) | level_offset(0),
190 /* 62 */ extra_bits(2) | extra_run | run_offset(28) | level_offset(0),
191 /* 63 */ extra_bits(4) | extra_run | run_offset(32) | level_offset(0),
192 /* 64 */ extra_bits(4) | extra_run | run_offset(48) | level_offset(0),
194 /* 65 */ extra_bits(2) | extra_run | run_offset(4) | level_offset(1),
195 /* 66 */ extra_bits(3) | extra_run | run_offset(8) | level_offset(1),
196 /* 67 */ extra_bits(4) | extra_run | run_offset(16) | level_offset(1),
198 /* 68 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(4),
199 /* 69 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(8),
200 /* 70 */ extra_bits(4) | extra_level | run_offset(0) | level_offset(16),
202 /* 71 */ extra_bits(2) | extra_level | run_offset(1) | level_offset(3),
203 /* 72 */ extra_bits(3) | extra_level | run_offset(1) | level_offset(7),
211 static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
212 int *const run, int *const level, int *const final)
214 MpegEncContext *const s = w->s;
217 // x8_select_ac_table(w, mode);
218 i = get_vlc2(&s->gb, w->j_ac_vlc[mode]->table, AC_VLC_BITS, AC_VLC_MTD);
220 if (i < 46) { // [0-45]
224 (*final) = // prevent 'may be used unilitialized'
225 (*run) = 64; // this would cause error exit in the ac loop
230 * i == 0-15 r = 0-15 l = 0; r = i & %01111
231 * i == 16-19 r = 0-3 l = 1; r = i & %00011
232 * i == 20-21 r = 0-1 l = 2; r = i & %00001
233 * i == 22 r = 0 l = 3; r = i & %00000
240 /* l = lut_l[i / 2] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3 }[i >> 1];
241 * 11 10'01 01'00 00'00 00'00 00'00 00 => 0xE50000 */
242 l = (0xE50000 >> (i & (0x1E))) & 3; // 0x1E or (~1) or ((i >> 1) << 1)
244 /* t = lut_mask[l] = { 0x0f, 0x03, 0x01, 0x00 }[l];
245 * as i < 256 the higher bits do not matter */
246 t = (0x01030F >> (l << 3));
250 } else if (i < 73) { // [46-72]
255 sm = ac_decode_table[i];
257 e = get_bits(&s->gb, sm & 0xF);
262 (*run) = (sm & 0xff) + (e & (mask)); // 6bits
263 (*level) = (sm >> 8) + (e & (~mask)); // 5bits
264 (*final) = i > (58 - 46);
265 } else if (i < 75) { // [73-74]
266 static const uint8_t crazy_mix_runlevel[32] = {
267 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
268 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
269 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
270 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
274 e = get_bits(&s->gb, 5); // get the extra bits
275 (*run) = crazy_mix_runlevel[e] >> 4;
276 (*level) = crazy_mix_runlevel[e] & 0x0F;
278 (*level) = get_bits(&s->gb, 7 - 3 * (i & 1));
279 (*run) = get_bits(&s->gb, 6);
280 (*final) = get_bits1(&s->gb);
285 /* static const uint8_t dc_extra_sbits[] = {
286 * 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
288 static const uint8_t dc_index_offset[] = {
289 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
292 static int x8_get_dc_rlf(IntraX8Context *const w, const int mode,
293 int *const level, int *const final)
295 MpegEncContext *const s = w->s;
299 if (!w->j_dc_vlc[mode]) {
300 int table_index = get_bits(&s->gb, 3);
301 // 4 modes, same table
302 w->j_dc_vlc[mode] = &j_dc_vlc[w->quant < 13][table_index];
305 assert(w->j_dc_vlc[mode]->table);
307 i = get_vlc2(&s->gb, w->j_dc_vlc[mode]->table, DC_VLC_BITS, DC_VLC_MTD);
309 /* (i >= 17) { i -= 17; final =1; } */
318 c = (i + 1) >> 1; // hackish way to calculate dc_extra_sbits[]
321 e = get_bits(&s->gb, c); // get the extra bits
322 i = dc_index_offset[i] + (e >> 1);
324 e = -(e & 1); // 0, 0xffffff
325 (*level) = (i ^ e) - e; // (i ^ 0) -0 , (i ^ 0xff) - (-1)
331 static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma)
333 MpegEncContext *const s = w->s;
338 w->dsp.setup_spatial_compensation(s->dest[chroma], s->sc.edge_emu_buffer,
339 s->current_picture.f->linesize[chroma > 0],
340 &range, &sum, w->edges);
342 w->orient = w->chroma_orient;
343 quant = w->quant_dc_chroma;
349 if (range < quant || range < 3) {
352 // yep you read right, a +-1 idct error may break decoding!
356 // ((1 << 17) + 9) / (8 + 8 + 1 + 2) = 6899
357 w->predicted_dc = (sum * 6899) >> 17;
363 assert(w->orient < 3);
364 if (range < 2 * w->quant) {
365 if ((w->edges & 3) == 0) {
375 static const uint8_t prediction_table[3][12] = {
376 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
377 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
378 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
380 w->raw_orient = x8_get_orient_vlc(w);
381 if (w->raw_orient < 0)
383 assert(w->raw_orient < 12);
384 assert(w->orient < 3);
385 w->orient = prediction_table[w->orient][w->raw_orient];
390 static void x8_update_predictions(IntraX8Context *const w, const int orient,
393 MpegEncContext *const s = w->s;
395 w->prediction_table[s->mb_x * 2 + (s->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
397 * y = 2n + 0 -> // 0 2 4
398 * y = 2n + 1 -> // 1 3 5
402 static void x8_get_prediction_chroma(IntraX8Context *const w)
404 MpegEncContext *const s = w->s;
406 w->edges = 1 * (!(s->mb_x >> 1));
407 w->edges |= 2 * (!(s->mb_y >> 1));
408 w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1)); // mb_x for chroma would always be odd
411 // lut_co[8] = {inv,4,8,8, inv,4,8,8} <- => {1,1,0,0;1,1,0,0} => 0xCC
413 w->chroma_orient = 4 << ((0xCC >> w->edges) & 1);
416 // block[x - 1][y | 1 - 1)]
417 w->chroma_orient = (w->prediction_table[2 * s->mb_x - 2] & 0x03) << 2;
420 static void x8_get_prediction(IntraX8Context *const w)
422 MpegEncContext *const s = w->s;
425 w->edges = 1 * (!s->mb_x);
426 w->edges |= 2 * (!s->mb_y);
427 w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1));
429 switch (w->edges & 3) {
433 // take the one from the above block[0][y - 1]
434 w->est_run = w->prediction_table[!(s->mb_y & 1)] >> 2;
438 // take the one from the previous block[x - 1][0]
439 w->est_run = w->prediction_table[2 * s->mb_x - 2] >> 2;
448 b = w->prediction_table[2 * s->mb_x + !(s->mb_y & 1)]; // block[x ][y - 1]
449 a = w->prediction_table[2 * s->mb_x - 2 + (s->mb_y & 1)]; // block[x - 1][y ]
450 c = w->prediction_table[2 * s->mb_x - 2 + !(s->mb_y & 1)]; // block[x - 1][y - 1]
452 w->est_run = FFMIN(b, a);
453 /* This condition has nothing to do with w->edges, even if it looks
454 * similar it would trigger if e.g. x = 3; y = 2;
455 * I guess somebody wrote something wrong and it became standard. */
456 if ((s->mb_x & s->mb_y) != 0)
457 w->est_run = FFMIN(c, w->est_run);
464 i = (0xFFEAF4C4 >> (2 * b + 8 * a)) & 3;
468 w->orient = (0xFFEAD8 >> (2 * c + 8 * (w->quant > 12))) & 3;
471 * ->{ 0, 1, 0, pad },
478 * -> 11 10 '10 10 '11 11'01 00 '11 00'01 00 => 0xEAF4C4
486 * -> 11 10'10 10 '11 01'10 00 => 0xEAD8
490 static void x8_ac_compensation(IntraX8Context *const w, const int direction,
493 MpegEncContext *const s = w->s;
495 #define B(x, y) s->block[0][s->idsp.idct_permutation[(x) + (y) * 8]]
496 #define T(x) ((x) * dc_level + 0x8000) >> 16;
539 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
547 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
555 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7);
562 static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst,
566 for (k = 0; k < 8; k++) {
572 static const int16_t quant_table[64] = {
573 256, 256, 256, 256, 256, 256, 259, 262,
574 265, 269, 272, 275, 278, 282, 285, 288,
575 292, 295, 299, 303, 306, 310, 314, 317,
576 321, 325, 329, 333, 337, 341, 345, 349,
577 353, 358, 362, 366, 371, 375, 379, 384,
578 389, 393, 398, 403, 408, 413, 417, 422,
579 428, 433, 438, 443, 448, 454, 459, 465,
580 470, 476, 482, 488, 493, 499, 505, 511,
583 static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
585 MpegEncContext *const s = w->s;
588 int final, run, level;
589 int ac_mode, dc_mode, est_run, dc_level;
592 int use_quant_matrix;
595 assert(w->orient < 12);
596 s->bdsp.clear_block(s->block[0]);
601 dc_mode = !!w->est_run; // 0, 1
603 if (x8_get_dc_rlf(w, dc_mode, &dc_level, &final))
607 if (!final) { // decode ac
608 use_quant_matrix = w->use_quant_matrix;
611 est_run = 64; // not used
613 if (w->raw_orient < 3)
614 use_quant_matrix = 0;
616 if (w->raw_orient > 4) {
620 if (w->est_run > 1) {
622 est_run = w->est_run;
629 x8_select_ac_table(w, ac_mode);
630 /* scantable_selector[12] = { 0, 2, 0, 1, 1, 1, 0, 2, 2, 0, 1, 2 }; <-
631 * -> 10'01' 00'10' 10'00' 01'01' 01'00' 10'00 => 0x928548 */
632 scantable = w->scantable[(0x928548 >> (2 * w->orient)) & 3].permutated;
638 x8_select_ac_table(w, 3);
641 x8_get_ac_rlf(w, ac_mode, &run, &level, &final);
645 // this also handles vlc error in x8_get_ac_rlf
648 level = (level + 1) * w->dquant;
651 sign = -get_bits1(&s->gb);
652 level = (level ^ sign) - sign;
654 if (use_quant_matrix)
655 level = (level * quant_table[pos]) >> 8;
657 s->block[0][scantable[pos]] = level;
660 s->block_last_index[0] = pos;
662 s->block_last_index[0] = 0;
663 if (w->flat_dc && ((unsigned) (dc_level + 1)) < 3) { // [-1; 1]
664 int32_t divide_quant = !chroma ? w->divide_quant_dc_luma
665 : w->divide_quant_dc_chroma;
666 int32_t dc_quant = !chroma ? w->quant
667 : w->quant_dc_chroma;
669 // original intent dc_level += predicted_dc/quant;
670 // but it got lost somewhere in the rounding
671 dc_level += (w->predicted_dc * divide_quant + (1 << 12)) >> 13;
673 dsp_x8_put_solidcolor(av_clip_uint8((dc_level * dc_quant + 4) >> 3),
675 s->current_picture.f->linesize[!!chroma]);
679 zeros_only = (dc_level == 0);
682 s->block[0][0] = dc_level * w->quant;
684 s->block[0][0] = dc_level * w->quant_dc_chroma;
686 // there is !zero_only check in the original, but dc_level check is enough
687 if ((unsigned int) (dc_level + 1) >= 3 && (w->edges & 3) != 3) {
689 /* ac_comp_direction[orient] = { 0, 3, 3, 1, 1, 0, 0, 0, 2, 2, 2, 1 }; <-
690 * -> 01'10' 10'10' 00'00' 00'01' 01'11' 11'00 => 0x6A017C */
691 direction = (0x6A017C >> (w->orient * 2)) & 3;
692 if (direction != 3) {
693 // modify block_last[]
694 x8_ac_compensation(w, direction, s->block[0][0]);
699 dsp_x8_put_solidcolor(w->predicted_dc, s->dest[chroma],
700 s->current_picture.f->linesize[!!chroma]);
702 w->dsp.spatial_compensation[w->orient](s->sc.edge_emu_buffer,
704 s->current_picture.f->linesize[!!chroma]);
707 s->idsp.idct_add(s->dest[chroma],
708 s->current_picture.f->linesize[!!chroma],
713 x8_update_predictions(w, w->orient, n);
715 if (s->loop_filter) {
716 uint8_t *ptr = s->dest[chroma];
717 int linesize = s->current_picture.f->linesize[!!chroma];
719 if (!((w->edges & 2) || (zeros_only && (w->orient | 4) == 4)))
720 w->dsp.h_loop_filter(ptr, linesize, w->quant);
722 if (!((w->edges & 1) || (zeros_only && (w->orient | 8) == 8)))
723 w->dsp.v_loop_filter(ptr, linesize, w->quant);
728 // FIXME maybe merge with ff_*
729 static void x8_init_block_index(MpegEncContext *s)
731 // not s->linesize as this would be wrong for field pics
732 // not that IntraX8 has interlacing support ;)
733 const int linesize = s->current_picture.f->linesize[0];
734 const int uvlinesize = s->current_picture.f->linesize[1];
736 s->dest[0] = s->current_picture.f->data[0];
737 s->dest[1] = s->current_picture.f->data[1];
738 s->dest[2] = s->current_picture.f->data[2];
740 s->dest[0] += s->mb_y * linesize << 3;
741 // chroma blocks are on add rows
742 s->dest[1] += (s->mb_y & (~1)) * uvlinesize << 2;
743 s->dest[2] += (s->mb_y & (~1)) * uvlinesize << 2;
746 av_cold int ff_intrax8_common_init(IntraX8Context *w, MpegEncContext *const s)
748 int ret = x8_vlc_init();
754 // two rows, 2 blocks per cannon mb
755 w->prediction_table = av_mallocz(s->mb_width * 2 * 2);
756 if (!w->prediction_table)
757 return AVERROR(ENOMEM);
759 ff_init_scantable(s->idsp.idct_permutation, &w->scantable[0],
760 ff_wmv1_scantable[0]);
761 ff_init_scantable(s->idsp.idct_permutation, &w->scantable[1],
762 ff_wmv1_scantable[2]);
763 ff_init_scantable(s->idsp.idct_permutation, &w->scantable[2],
764 ff_wmv1_scantable[3]);
766 ff_intrax8dsp_init(&w->dsp);
771 av_cold void ff_intrax8_common_end(IntraX8Context *w)
773 av_freep(&w->prediction_table);
776 int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant,
779 MpegEncContext *const s = w->s;
782 w->use_quant_matrix = get_bits1(&s->gb);
785 w->quant = dquant >> 1;
786 w->qsum = quant_offset;
788 w->divide_quant_dc_luma = ((1 << 16) + (w->quant >> 1)) / w->quant;
790 w->quant_dc_chroma = w->quant;
791 w->divide_quant_dc_chroma = w->divide_quant_dc_luma;
793 w->quant_dc_chroma = w->quant + ((w->quant + 3) >> 3);
794 w->divide_quant_dc_chroma = ((1 << 16) + (w->quant_dc_chroma >> 1)) / w->quant_dc_chroma;
796 x8_reset_vlc_tables(w);
798 for (s->mb_y = 0; s->mb_y < s->mb_height * 2; s->mb_y++) {
799 x8_init_block_index(s);
800 mb_xy = (s->mb_y >> 1) * s->mb_stride;
802 for (s->mb_x = 0; s->mb_x < s->mb_width * 2; s->mb_x++) {
803 x8_get_prediction(w);
804 if (x8_setup_spatial_predictor(w, 0))
806 if (x8_decode_intra_mb(w, 0))
809 if (s->mb_x & s->mb_y & 1) {
810 x8_get_prediction_chroma(w);
812 /* when setting up chroma, no vlc is read,
813 * so no error condition can be reached */
814 x8_setup_spatial_predictor(w, 1);
815 if (x8_decode_intra_mb(w, 1))
818 x8_setup_spatial_predictor(w, 2);
819 if (x8_decode_intra_mb(w, 2))
825 /* emulate MB info in the relevant tables */
826 s->mbskip_table[mb_xy] = 0;
827 s->mbintra_table[mb_xy] = 1;
828 s->current_picture.qscale_table[mb_xy] = w->quant;
834 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 8, 16);