2 * This file is part of FFmpeg.
4 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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
24 #include "libavutil/avassert.h"
28 #include "mpegvideo.h"
29 #include "msmpeg4data.h"
30 #include "intrax8huf.h"
32 #include "intrax8dsp.h"
34 #define MAX_TABLE_DEPTH(table_bits, max_bits) \
35 ((max_bits + table_bits - 1) / table_bits)
41 #define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
42 #define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
43 #define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
45 static VLC j_ac_vlc[2][2][8]; // [quant < 13], [intra / inter], [select]
46 static VLC j_dc_vlc[2][8]; // [quant], [select]
47 static VLC j_orient_vlc[2][4]; // [quant], [select]
49 static av_cold int x8_vlc_init(void)
54 static const uint16_t sizes[8 * 4 + 8 * 2 + 2 + 4] = {
55 576, 548, 582, 618, 546, 616, 560, 642,
56 584, 582, 704, 664, 512, 544, 656, 640,
57 512, 648, 582, 566, 532, 614, 596, 648,
58 586, 552, 584, 590, 544, 578, 584, 624,
60 528, 528, 526, 528, 536, 528, 526, 544,
61 544, 512, 512, 528, 528, 544, 512, 544,
63 128, 128, 128, 128, 128, 128,
66 static VLC_TYPE table[28150][2];
69 #define init_ac_vlc(dst, src) \
71 dst.table = &table[offset]; \
72 dst.table_allocated = sizes[sizeidx]; \
73 offset += sizes[sizeidx++]; \
74 init_vlc(&dst, AC_VLC_BITS, 77, &src[1], 4, 2, &src[0], 4, 2, \
75 INIT_VLC_USE_NEW_STATIC); \
78 for (i = 0; i < 8; i++) {
79 init_ac_vlc(j_ac_vlc[0][0][i], x8_ac0_highquant_table[i][0]);
80 init_ac_vlc(j_ac_vlc[0][1][i], x8_ac1_highquant_table[i][0]);
81 init_ac_vlc(j_ac_vlc[1][0][i], x8_ac0_lowquant_table[i][0]);
82 init_ac_vlc(j_ac_vlc[1][1][i], x8_ac1_lowquant_table[i][0]);
87 #define init_dc_vlc(dst, src) \
89 dst.table = &table[offset]; \
90 dst.table_allocated = sizes[sizeidx]; \
91 offset += sizes[sizeidx++]; \
92 init_vlc(&dst, DC_VLC_BITS, 34, &src[1], 4, 2, &src[0], 4, 2, \
93 INIT_VLC_USE_NEW_STATIC); \
96 for (i = 0; i < 8; i++) {
97 init_dc_vlc(j_dc_vlc[0][i], x8_dc_highquant_table[i][0]);
98 init_dc_vlc(j_dc_vlc[1][i], x8_dc_lowquant_table[i][0]);
103 #define init_or_vlc(dst, src) \
105 dst.table = &table[offset]; \
106 dst.table_allocated = sizes[sizeidx]; \
107 offset += sizes[sizeidx++]; \
108 init_vlc(&dst, OR_VLC_BITS, 12, &src[1], 4, 2, &src[0], 4, 2, \
109 INIT_VLC_USE_NEW_STATIC); \
112 for (i = 0; i < 2; i++)
113 init_or_vlc(j_orient_vlc[0][i], x8_orient_highquant_table[i][0]);
114 for (i = 0; i < 4; i++)
115 init_or_vlc(j_orient_vlc[1][i], x8_orient_lowquant_table[i][0]);
118 if (offset != sizeof(table) / sizeof(VLC_TYPE) / 2) {
119 av_log(NULL, AV_LOG_ERROR, "table size %zd does not match needed %i\n",
120 sizeof(table) / sizeof(VLC_TYPE) / 2, offset);
121 return AVERROR_INVALIDDATA;
127 static void x8_reset_vlc_tables(IntraX8Context *w)
129 memset(w->j_dc_vlc, 0, sizeof(w->j_dc_vlc));
130 memset(w->j_ac_vlc, 0, sizeof(w->j_ac_vlc));
131 w->j_orient_vlc = NULL;
134 static inline void x8_select_ac_table(IntraX8Context *const w, int mode)
136 MpegEncContext *const s = w->s;
139 av_assert2(mode < 4);
141 if (w->j_ac_vlc[mode])
144 table_index = get_bits(&s->gb, 3);
145 // 2 modes use same tables
146 w->j_ac_vlc[mode] = &j_ac_vlc[w->quant < 13][mode >> 1][table_index];
147 av_assert2(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];
159 return get_vlc2(&s->gb, w->j_orient_vlc->table, OR_VLC_BITS, OR_VLC_MTD);
162 #define extra_bits(eb) (eb) // 3 bits
163 #define extra_run (0xFF << 8) // 1 bit
164 #define extra_level (0x00 << 8) // 1 bit
165 #define run_offset(r) ((r) << 16) // 6 bits
166 #define level_offset(l) ((l) << 24) // 5 bits
167 static const uint32_t ac_decode_table[] = {
168 /* 46 */ extra_bits(3) | extra_run | run_offset(16) | level_offset(0),
169 /* 47 */ extra_bits(3) | extra_run | run_offset(24) | level_offset(0),
170 /* 48 */ extra_bits(2) | extra_run | run_offset(4) | level_offset(1),
171 /* 49 */ extra_bits(3) | extra_run | run_offset(8) | level_offset(1),
173 /* 50 */ extra_bits(5) | extra_run | run_offset(32) | level_offset(0),
174 /* 51 */ extra_bits(4) | extra_run | run_offset(16) | level_offset(1),
176 /* 52 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(4),
177 /* 53 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(8),
178 /* 54 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(12),
179 /* 55 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(16),
180 /* 56 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(24),
182 /* 57 */ extra_bits(2) | extra_level | run_offset(1) | level_offset(3),
183 /* 58 */ extra_bits(3) | extra_level | run_offset(1) | level_offset(7),
185 /* 59 */ extra_bits(2) | extra_run | run_offset(16) | level_offset(0),
186 /* 60 */ extra_bits(2) | extra_run | run_offset(20) | level_offset(0),
187 /* 61 */ extra_bits(2) | extra_run | run_offset(24) | level_offset(0),
188 /* 62 */ extra_bits(2) | extra_run | run_offset(28) | level_offset(0),
189 /* 63 */ extra_bits(4) | extra_run | run_offset(32) | level_offset(0),
190 /* 64 */ extra_bits(4) | extra_run | run_offset(48) | level_offset(0),
192 /* 65 */ extra_bits(2) | extra_run | run_offset(4) | level_offset(1),
193 /* 66 */ extra_bits(3) | extra_run | run_offset(8) | level_offset(1),
194 /* 67 */ extra_bits(4) | extra_run | run_offset(16) | level_offset(1),
196 /* 68 */ extra_bits(2) | extra_level | run_offset(0) | level_offset(4),
197 /* 69 */ extra_bits(3) | extra_level | run_offset(0) | level_offset(8),
198 /* 70 */ extra_bits(4) | extra_level | run_offset(0) | level_offset(16),
200 /* 71 */ extra_bits(2) | extra_level | run_offset(1) | level_offset(3),
201 /* 72 */ extra_bits(3) | extra_level | run_offset(1) | level_offset(7),
209 static void x8_get_ac_rlf(IntraX8Context *const w, const int mode,
210 int *const run, int *const level, int *const final)
212 MpegEncContext *const s = w->s;
215 // x8_select_ac_table(w, mode);
216 i = get_vlc2(&s->gb, w->j_ac_vlc[mode]->table, AC_VLC_BITS, AC_VLC_MTD);
218 if (i < 46) { // [0-45]
222 (*final) = // prevent 'may be used unilitialized'
223 (*run) = 64; // this would cause error exit in the ac loop
228 * i == 0-15 r = 0-15 l = 0; r = i & %01111
229 * i == 16-19 r = 0-3 l = 1; r = i & %00011
230 * i == 20-21 r = 0-1 l = 2; r = i & %00001
231 * i == 22 r = 0 l = 3; r = i & %00000
238 /* l = lut_l[i / 2] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3 }[i >> 1];
239 * 11 10'01 01'00 00'00 00'00 00'00 00 => 0xE50000 */
240 l = (0xE50000 >> (i & (0x1E))) & 3; // 0x1E or (~1) or ((i >> 1) << 1)
242 /* t = lut_mask[l] = { 0x0f, 0x03, 0x01, 0x00 }[l];
243 * as i < 256 the higher bits do not matter */
244 t = (0x01030F >> (l << 3));
248 } else if (i < 73) { // [46-72]
253 sm = ac_decode_table[i];
255 e = get_bits(&s->gb, sm & 0xF);
260 (*run) = (sm & 0xff) + (e & (mask)); // 6bits
261 (*level) = (sm >> 8) + (e & (~mask)); // 5bits
262 (*final) = i > (58 - 46);
263 } else if (i < 75) { // [73-74]
264 static const uint8_t crazy_mix_runlevel[32] = {
265 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
266 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
267 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
268 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
272 e = get_bits(&s->gb, 5); // get the extra bits
273 (*run) = crazy_mix_runlevel[e] >> 4;
274 (*level) = crazy_mix_runlevel[e] & 0x0F;
276 (*level) = get_bits(&s->gb, 7 - 3 * (i & 1));
277 (*run) = get_bits(&s->gb, 6);
278 (*final) = get_bits1(&s->gb);
283 /* static const uint8_t dc_extra_sbits[] = {
284 * 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
286 static const uint8_t dc_index_offset[] = {
287 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
290 static int x8_get_dc_rlf(IntraX8Context *const w, const int mode,
291 int *const level, int *const final)
293 MpegEncContext *const s = w->s;
296 av_assert2(mode < 3);
297 if (!w->j_dc_vlc[mode]) {
298 int table_index = get_bits(&s->gb, 3);
299 // 4 modes, same table
300 w->j_dc_vlc[mode] = &j_dc_vlc[w->quant < 13][table_index];
303 i = get_vlc2(&s->gb, w->j_dc_vlc[mode]->table, DC_VLC_BITS, DC_VLC_MTD);
305 /* (i >= 17) { i -= 17; final =1; } */
314 c = (i + 1) >> 1; // hackish way to calculate dc_extra_sbits[]
317 e = get_bits(&s->gb, c); // get the extra bits
318 i = dc_index_offset[i] + (e >> 1);
320 e = -(e & 1); // 0, 0xffffff
321 (*level) = (i ^ e) - e; // (i ^ 0) -0 , (i ^ 0xff) - (-1)
327 static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma)
329 MpegEncContext *const s = w->s;
334 w->dsp.setup_spatial_compensation(w->dest[chroma], s->sc.edge_emu_buffer,
335 s->current_picture.f->linesize[chroma > 0],
336 &range, &sum, w->edges);
338 w->orient = w->chroma_orient;
339 quant = w->quant_dc_chroma;
345 if (range < quant || range < 3) {
348 // yep you read right, a +-1 idct error may break decoding!
352 // ((1 << 17) + 9) / (8 + 8 + 1 + 2) = 6899
353 w->predicted_dc = (sum * 6899) >> 17;
359 av_assert2(w->orient < 3);
360 if (range < 2 * w->quant) {
361 if ((w->edges & 3) == 0) {
371 static const uint8_t prediction_table[3][12] = {
372 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
373 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
374 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
376 w->raw_orient = x8_get_orient_vlc(w);
377 if (w->raw_orient < 0)
379 av_assert2(w->raw_orient < 12);
380 av_assert2(w->orient < 3);
381 w->orient=prediction_table[w->orient][w->raw_orient];
386 static void x8_update_predictions(IntraX8Context *const w, const int orient,
389 MpegEncContext *const s = w->s;
391 w->prediction_table[s->mb_x * 2 + (s->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
393 * y = 2n + 0 -> // 0 2 4
394 * y = 2n + 1 -> // 1 3 5
398 static void x8_get_prediction_chroma(IntraX8Context *const w)
400 MpegEncContext *const s = w->s;
402 w->edges = 1 * (!(s->mb_x >> 1));
403 w->edges |= 2 * (!(s->mb_y >> 1));
404 w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1)); // mb_x for chroma would always be odd
407 // lut_co[8] = {inv,4,8,8, inv,4,8,8} <- => {1,1,0,0;1,1,0,0} => 0xCC
409 w->chroma_orient = 4 << ((0xCC >> w->edges) & 1);
412 // block[x - 1][y | 1 - 1)]
413 w->chroma_orient = (w->prediction_table[2 * s->mb_x - 2] & 0x03) << 2;
416 static void x8_get_prediction(IntraX8Context *const w)
418 MpegEncContext *const s = w->s;
421 w->edges = 1 * (!s->mb_x);
422 w->edges |= 2 * (!s->mb_y);
423 w->edges |= 4 * (s->mb_x >= (2 * s->mb_width - 1));
425 switch (w->edges & 3) {
429 // take the one from the above block[0][y - 1]
430 w->est_run = w->prediction_table[!(s->mb_y & 1)] >> 2;
434 // take the one from the previous block[x - 1][0]
435 w->est_run = w->prediction_table[2 * s->mb_x - 2] >> 2;
444 b = w->prediction_table[2 * s->mb_x + !(s->mb_y & 1)]; // block[x ][y - 1]
445 a = w->prediction_table[2 * s->mb_x - 2 + (s->mb_y & 1)]; // block[x - 1][y ]
446 c = w->prediction_table[2 * s->mb_x - 2 + !(s->mb_y & 1)]; // block[x - 1][y - 1]
448 w->est_run = FFMIN(b, a);
449 /* This condition has nothing to do with w->edges, even if it looks
450 * similar it would trigger if e.g. x = 3; y = 2;
451 * I guess somebody wrote something wrong and it became standard. */
452 if ((s->mb_x & s->mb_y) != 0)
453 w->est_run = FFMIN(c, w->est_run);
460 i = (0xFFEAF4C4 >> (2 * b + 8 * a)) & 3;
464 w->orient = (0xFFEAD8 >> (2 * c + 8 * (w->quant > 12))) & 3;
467 * ->{ 0, 1, 0, pad },
474 * -> 11 10 '10 10 '11 11'01 00 '11 00'01 00 => 0xEAF4C4
482 * -> 11 10'10 10 '11 01'10 00 => 0xEAD8
486 static void x8_ac_compensation(IntraX8Context *const w, const int direction,
489 MpegEncContext *const s = w->s;
491 #define B(x,y) s->block[0][w->idct_permutation[(x) + (y) * 8]]
492 #define T(x) ((x) * dc_level + 0x8000) >> 16;
535 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
543 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7 * 8);
551 s->block_last_index[0] = FFMAX(s->block_last_index[0], 7);
558 static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst,
562 for (k = 0; k < 8; k++) {
568 static const int16_t quant_table[64] = {
569 256, 256, 256, 256, 256, 256, 259, 262,
570 265, 269, 272, 275, 278, 282, 285, 288,
571 292, 295, 299, 303, 306, 310, 314, 317,
572 321, 325, 329, 333, 337, 341, 345, 349,
573 353, 358, 362, 366, 371, 375, 379, 384,
574 389, 393, 398, 403, 408, 413, 417, 422,
575 428, 433, 438, 443, 448, 454, 459, 465,
576 470, 476, 482, 488, 493, 499, 505, 511,
579 static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
581 MpegEncContext *const s = w->s;
584 int final, run, level;
585 int ac_mode, dc_mode, est_run, dc_level;
588 int use_quant_matrix;
591 av_assert2(w->orient < 12);
592 s->bdsp.clear_block(s->block[0]);
597 dc_mode = !!w->est_run; // 0, 1
599 if (x8_get_dc_rlf(w, dc_mode, &dc_level, &final))
603 if (!final) { // decode ac
604 use_quant_matrix = w->use_quant_matrix;
607 est_run = 64; // not used
609 if (w->raw_orient < 3)
610 use_quant_matrix = 0;
612 if (w->raw_orient > 4) {
616 if (w->est_run > 1) {
618 est_run = w->est_run;
625 x8_select_ac_table(w, ac_mode);
626 /* scantable_selector[12] = { 0, 2, 0, 1, 1, 1, 0, 2, 2, 0, 1, 2 }; <-
627 * -> 10'01' 00'10' 10'00' 01'01' 01'00' 10'00 => 0x928548 */
628 scantable = w->scantable[(0x928548 >> (2 * w->orient)) & 3].permutated;
634 x8_select_ac_table(w, 3);
637 x8_get_ac_rlf(w, ac_mode, &run, &level, &final);
641 // this also handles vlc error in x8_get_ac_rlf
644 level = (level + 1) * w->dquant;
647 sign = -get_bits1(&s->gb);
648 level = (level ^ sign) - sign;
650 if (use_quant_matrix)
651 level = (level * quant_table[pos]) >> 8;
653 s->block[0][scantable[pos]] = level;
656 s->block_last_index[0] = pos;
658 s->block_last_index[0] = 0;
659 if (w->flat_dc && ((unsigned) (dc_level + 1)) < 3) { // [-1; 1]
660 int32_t divide_quant = !chroma ? w->divide_quant_dc_luma
661 : w->divide_quant_dc_chroma;
662 int32_t dc_quant = !chroma ? w->quant
663 : w->quant_dc_chroma;
665 // original intent dc_level += predicted_dc/quant;
666 // but it got lost somewhere in the rounding
667 dc_level += (w->predicted_dc * divide_quant + (1 << 12)) >> 13;
669 dsp_x8_put_solidcolor(av_clip_uint8((dc_level * dc_quant + 4) >> 3),
671 s->current_picture.f->linesize[!!chroma]);
675 zeros_only = (dc_level == 0);
678 s->block[0][0] = dc_level * w->quant;
680 s->block[0][0] = dc_level * w->quant_dc_chroma;
682 // there is !zero_only check in the original, but dc_level check is enough
683 if ((unsigned int) (dc_level + 1) >= 3 && (w->edges & 3) != 3) {
685 /* ac_comp_direction[orient] = { 0, 3, 3, 1, 1, 0, 0, 0, 2, 2, 2, 1 }; <-
686 * -> 01'10' 10'10' 00'00' 00'01' 01'11' 11'00 => 0x6A017C */
687 direction = (0x6A017C >> (w->orient * 2)) & 3;
688 if (direction != 3) {
689 // modify block_last[]
690 x8_ac_compensation(w, direction, s->block[0][0]);
695 dsp_x8_put_solidcolor(w->predicted_dc, w->dest[chroma],
696 s->current_picture.f->linesize[!!chroma]);
698 w->dsp.spatial_compensation[w->orient](s->sc.edge_emu_buffer,
700 s->current_picture.f->linesize[!!chroma]);
703 w->wdsp.idct_add(w->dest[chroma],
704 s->current_picture.f->linesize[!!chroma],
709 x8_update_predictions(w, w->orient, n);
711 if (s->loop_filter) {
712 uint8_t *ptr = w->dest[chroma];
713 int linesize = s->current_picture.f->linesize[!!chroma];
715 if (!((w->edges & 2) || (zeros_only && (w->orient | 4) == 4)))
716 w->dsp.h_loop_filter(ptr, linesize, w->quant);
718 if (!((w->edges & 1) || (zeros_only && (w->orient | 8) == 8)))
719 w->dsp.v_loop_filter(ptr, linesize, w->quant);
724 // FIXME maybe merge with ff_*
725 static void x8_init_block_index(IntraX8Context *w, AVFrame *frame, int mb_y)
727 // not parent codec linesize as this would be wrong for field pics
728 // not that IntraX8 has interlacing support ;)
729 const int linesize = frame->linesize[0];
730 const int uvlinesize = frame->linesize[1];
732 w->dest[0] = frame->data[0];
733 w->dest[1] = frame->data[1];
734 w->dest[2] = frame->data[2];
736 w->dest[0] += mb_y * linesize << 3;
737 // chroma blocks are on add rows
738 w->dest[1] += (mb_y & (~1)) * uvlinesize << 2;
739 w->dest[2] += (mb_y & (~1)) * uvlinesize << 2;
742 av_cold int ff_intrax8_common_init(IntraX8Context *w, IDCTDSPContext *idsp,
743 MpegEncContext *const s)
745 int ret = x8_vlc_init();
752 //two rows, 2 blocks per cannon mb
753 w->prediction_table = av_mallocz(s->mb_width * 2 * 2);
754 if (!w->prediction_table)
755 return AVERROR(ENOMEM);
757 ff_wmv2dsp_init(&w->wdsp);
759 ff_init_scantable_permutation(w->idct_permutation,
762 ff_init_scantable(w->idct_permutation, &w->scantable[0],
763 ff_wmv1_scantable[0]);
764 ff_init_scantable(w->idct_permutation, &w->scantable[1],
765 ff_wmv1_scantable[2]);
766 ff_init_scantable(w->idct_permutation, &w->scantable[2],
767 ff_wmv1_scantable[3]);
769 ff_intrax8dsp_init(&w->dsp);
774 av_cold void ff_intrax8_common_end(IntraX8Context *w)
776 av_freep(&w->prediction_table);
779 int ff_intrax8_decode_picture(IntraX8Context *const w, int dquant,
782 MpegEncContext *const s = w->s;
784 w->use_quant_matrix = get_bits1(&s->gb);
787 w->quant = dquant >> 1;
788 w->qsum = quant_offset;
790 w->divide_quant_dc_luma = ((1 << 16) + (w->quant >> 1)) / w->quant;
792 w->quant_dc_chroma = w->quant;
793 w->divide_quant_dc_chroma = w->divide_quant_dc_luma;
795 w->quant_dc_chroma = w->quant + ((w->quant + 3) >> 3);
796 w->divide_quant_dc_chroma = ((1 << 16) + (w->quant_dc_chroma >> 1)) / w->quant_dc_chroma;
798 x8_reset_vlc_tables(w);
800 for (s->mb_y = 0; s->mb_y < s->mb_height * 2; s->mb_y++) {
801 x8_init_block_index(w, s->current_picture.f, s->mb_y);
802 mb_xy = (s->mb_y >> 1) * s->mb_stride;
804 for (s->mb_x = 0; s->mb_x < s->mb_width * 2; s->mb_x++) {
805 x8_get_prediction(w);
806 if (x8_setup_spatial_predictor(w, 0))
808 if (x8_decode_intra_mb(w, 0))
811 if (s->mb_x & s->mb_y & 1) {
812 x8_get_prediction_chroma(w);
814 /* when setting up chroma, no vlc is read,
815 * so no error condition can be reached */
816 x8_setup_spatial_predictor(w, 1);
817 if (x8_decode_intra_mb(w, 1))
820 x8_setup_spatial_predictor(w, 2);
821 if (x8_decode_intra_mb(w, 2))
827 /* emulate MB info in the relevant tables */
828 s->mbskip_table[mb_xy] = 0;
829 s->mbintra_table[mb_xy] = 1;
830 s->current_picture.qscale_table[mb_xy] = w->quant;
836 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 8, 16);