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"
32 #include "mpegutils.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)
140 if (w->j_ac_vlc[mode])
143 table_index = get_bits(w->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 if (!w->j_orient_vlc) {
153 int table_index = get_bits(w->gb, 1 + (w->quant < 13));
154 w->j_orient_vlc = &j_orient_vlc[w->quant < 13][table_index];
156 assert(w->j_orient_vlc);
157 assert(w->j_orient_vlc->table);
159 return get_vlc2(w->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)
214 // x8_select_ac_table(w, mode);
215 i = get_vlc2(w->gb, w->j_ac_vlc[mode]->table, AC_VLC_BITS, AC_VLC_MTD);
217 if (i < 46) { // [0-45]
221 (*final) = // prevent 'may be used unilitialized'
222 (*run) = 64; // this would cause error exit in the ac loop
227 * i == 0-15 r = 0-15 l = 0; r = i & %01111
228 * i == 16-19 r = 0-3 l = 1; r = i & %00011
229 * i == 20-21 r = 0-1 l = 2; r = i & %00001
230 * i == 22 r = 0 l = 3; r = i & %00000
237 /* l = lut_l[i / 2] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3 }[i >> 1];
238 * 11 10'01 01'00 00'00 00'00 00'00 00 => 0xE50000 */
239 l = (0xE50000 >> (i & (0x1E))) & 3; // 0x1E or (~1) or ((i >> 1) << 1)
241 /* t = lut_mask[l] = { 0x0f, 0x03, 0x01, 0x00 }[l];
242 * as i < 256 the higher bits do not matter */
243 t = (0x01030F >> (l << 3));
247 } else if (i < 73) { // [46-72]
252 sm = ac_decode_table[i];
254 e = get_bits(w->gb, sm & 0xF);
259 (*run) = (sm & 0xff) + (e & (mask)); // 6bits
260 (*level) = (sm >> 8) + (e & (~mask)); // 5bits
261 (*final) = i > (58 - 46);
262 } else if (i < 75) { // [73-74]
263 static const uint8_t crazy_mix_runlevel[32] = {
264 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
265 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
266 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
267 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
271 e = get_bits(w->gb, 5); // get the extra bits
272 (*run) = crazy_mix_runlevel[e] >> 4;
273 (*level) = crazy_mix_runlevel[e] & 0x0F;
275 (*level) = get_bits(w->gb, 7 - 3 * (i & 1));
276 (*run) = get_bits(w->gb, 6);
277 (*final) = get_bits1(w->gb);
282 /* static const uint8_t dc_extra_sbits[] = {
283 * 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
285 static const uint8_t dc_index_offset[] = {
286 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
289 static int x8_get_dc_rlf(IntraX8Context *const w, const int mode,
290 int *const level, int *const final)
295 if (!w->j_dc_vlc[mode]) {
296 int table_index = get_bits(w->gb, 3);
297 // 4 modes, same table
298 w->j_dc_vlc[mode] = &j_dc_vlc[w->quant < 13][table_index];
301 assert(w->j_dc_vlc[mode]->table);
303 i = get_vlc2(w->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(w->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)
333 w->dsp.setup_spatial_compensation(w->dest[chroma], w->scratchpad,
334 w->frame->linesize[chroma > 0],
335 &range, &sum, w->edges);
337 w->orient = w->chroma_orient;
338 quant = w->quant_dc_chroma;
344 if (range < quant || range < 3) {
347 // yep you read right, a +-1 idct error may break decoding!
351 // ((1 << 17) + 9) / (8 + 8 + 1 + 2) = 6899
352 w->predicted_dc = (sum * 6899) >> 17;
358 assert(w->orient < 3);
359 if (range < 2 * w->quant) {
360 if ((w->edges & 3) == 0) {
370 static const uint8_t prediction_table[3][12] = {
371 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
372 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
373 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
375 w->raw_orient = x8_get_orient_vlc(w);
376 if (w->raw_orient < 0)
378 assert(w->raw_orient < 12);
379 assert(w->orient < 3);
380 w->orient = prediction_table[w->orient][w->raw_orient];
385 static void x8_update_predictions(IntraX8Context *const w, const int orient,
388 w->prediction_table[w->mb_x * 2 + (w->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
390 * y = 2n + 0 -> // 0 2 4
391 * y = 2n + 1 -> // 1 3 5
395 static void x8_get_prediction_chroma(IntraX8Context *const w)
397 w->edges = 1 * (!(w->mb_x >> 1));
398 w->edges |= 2 * (!(w->mb_y >> 1));
399 w->edges |= 4 * (w->mb_x >= (2 * w->mb_width - 1)); // mb_x for chroma would always be odd
402 // lut_co[8] = {inv,4,8,8, inv,4,8,8} <- => {1,1,0,0;1,1,0,0} => 0xCC
404 w->chroma_orient = 4 << ((0xCC >> w->edges) & 1);
407 // block[x - 1][y | 1 - 1)]
408 w->chroma_orient = (w->prediction_table[2 * w->mb_x - 2] & 0x03) << 2;
411 static void x8_get_prediction(IntraX8Context *const w)
415 w->edges = 1 * (!w->mb_x);
416 w->edges |= 2 * (!w->mb_y);
417 w->edges |= 4 * (w->mb_x >= (2 * w->mb_width - 1));
419 switch (w->edges & 3) {
423 // take the one from the above block[0][y - 1]
424 w->est_run = w->prediction_table[!(w->mb_y & 1)] >> 2;
428 // take the one from the previous block[x - 1][0]
429 w->est_run = w->prediction_table[2 * w->mb_x - 2] >> 2;
438 b = w->prediction_table[2 * w->mb_x + !(w->mb_y & 1)]; // block[x ][y - 1]
439 a = w->prediction_table[2 * w->mb_x - 2 + (w->mb_y & 1)]; // block[x - 1][y ]
440 c = w->prediction_table[2 * w->mb_x - 2 + !(w->mb_y & 1)]; // block[x - 1][y - 1]
442 w->est_run = FFMIN(b, a);
443 /* This condition has nothing to do with w->edges, even if it looks
444 * similar it would trigger if e.g. x = 3; y = 2;
445 * I guess somebody wrote something wrong and it became standard. */
446 if ((w->mb_x & w->mb_y) != 0)
447 w->est_run = FFMIN(c, w->est_run);
454 i = (0xFFEAF4C4 >> (2 * b + 8 * a)) & 3;
458 w->orient = (0xFFEAD8 >> (2 * c + 8 * (w->quant > 12))) & 3;
461 * ->{ 0, 1, 0, pad },
468 * -> 11 10 '10 10 '11 11'01 00 '11 00'01 00 => 0xEAF4C4
476 * -> 11 10'10 10 '11 01'10 00 => 0xEAD8
480 static void x8_ac_compensation(IntraX8Context *const w, const int direction,
484 #define B(x, y) w->block[0][w->idsp.idct_permutation[(x) + (y) * 8]]
485 #define T(x) ((x) * dc_level + 0x8000) >> 16;
528 w->block_last_index[0] = FFMAX(w->block_last_index[0], 7 * 8);
536 w->block_last_index[0] = FFMAX(w->block_last_index[0], 7 * 8);
544 w->block_last_index[0] = FFMAX(w->block_last_index[0], 7);
551 static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst,
555 for (k = 0; k < 8; k++) {
561 static const int16_t quant_table[64] = {
562 256, 256, 256, 256, 256, 256, 259, 262,
563 265, 269, 272, 275, 278, 282, 285, 288,
564 292, 295, 299, 303, 306, 310, 314, 317,
565 321, 325, 329, 333, 337, 341, 345, 349,
566 353, 358, 362, 366, 371, 375, 379, 384,
567 389, 393, 398, 403, 408, 413, 417, 422,
568 428, 433, 438, 443, 448, 454, 459, 465,
569 470, 476, 482, 488, 493, 499, 505, 511,
572 static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
575 int final, run, level;
576 int ac_mode, dc_mode, est_run, dc_level;
579 int use_quant_matrix;
582 assert(w->orient < 12);
583 w->bdsp.clear_block(w->block[0]);
588 dc_mode = !!w->est_run; // 0, 1
590 if (x8_get_dc_rlf(w, dc_mode, &dc_level, &final))
594 if (!final) { // decode ac
595 use_quant_matrix = w->use_quant_matrix;
598 est_run = 64; // not used
600 if (w->raw_orient < 3)
601 use_quant_matrix = 0;
603 if (w->raw_orient > 4) {
607 if (w->est_run > 1) {
609 est_run = w->est_run;
616 x8_select_ac_table(w, ac_mode);
617 /* scantable_selector[12] = { 0, 2, 0, 1, 1, 1, 0, 2, 2, 0, 1, 2 }; <-
618 * -> 10'01' 00'10' 10'00' 01'01' 01'00' 10'00 => 0x928548 */
619 scantable = w->scantable[(0x928548 >> (2 * w->orient)) & 3].permutated;
625 x8_select_ac_table(w, 3);
628 x8_get_ac_rlf(w, ac_mode, &run, &level, &final);
632 // this also handles vlc error in x8_get_ac_rlf
635 level = (level + 1) * w->dquant;
638 sign = -get_bits1(w->gb);
639 level = (level ^ sign) - sign;
641 if (use_quant_matrix)
642 level = (level * quant_table[pos]) >> 8;
644 w->block[0][scantable[pos]] = level;
647 w->block_last_index[0] = pos;
649 w->block_last_index[0] = 0;
650 if (w->flat_dc && ((unsigned) (dc_level + 1)) < 3) { // [-1; 1]
651 int32_t divide_quant = !chroma ? w->divide_quant_dc_luma
652 : w->divide_quant_dc_chroma;
653 int32_t dc_quant = !chroma ? w->quant
654 : w->quant_dc_chroma;
656 // original intent dc_level += predicted_dc/quant;
657 // but it got lost somewhere in the rounding
658 dc_level += (w->predicted_dc * divide_quant + (1 << 12)) >> 13;
660 dsp_x8_put_solidcolor(av_clip_uint8((dc_level * dc_quant + 4) >> 3),
662 w->frame->linesize[!!chroma]);
666 zeros_only = (dc_level == 0);
669 w->block[0][0] = dc_level * w->quant;
671 w->block[0][0] = dc_level * w->quant_dc_chroma;
673 // there is !zero_only check in the original, but dc_level check is enough
674 if ((unsigned int) (dc_level + 1) >= 3 && (w->edges & 3) != 3) {
676 /* ac_comp_direction[orient] = { 0, 3, 3, 1, 1, 0, 0, 0, 2, 2, 2, 1 }; <-
677 * -> 01'10' 10'10' 00'00' 00'01' 01'11' 11'00 => 0x6A017C */
678 direction = (0x6A017C >> (w->orient * 2)) & 3;
679 if (direction != 3) {
680 // modify block_last[]
681 x8_ac_compensation(w, direction, w->block[0][0]);
686 dsp_x8_put_solidcolor(w->predicted_dc, w->dest[chroma],
687 w->frame->linesize[!!chroma]);
689 w->dsp.spatial_compensation[w->orient](w->scratchpad,
691 w->frame->linesize[!!chroma]);
694 w->idsp.idct_add(w->dest[chroma],
695 w->frame->linesize[!!chroma],
700 x8_update_predictions(w, w->orient, n);
703 uint8_t *ptr = w->dest[chroma];
704 int linesize = w->frame->linesize[!!chroma];
706 if (!((w->edges & 2) || (zeros_only && (w->orient | 4) == 4)))
707 w->dsp.h_loop_filter(ptr, linesize, w->quant);
709 if (!((w->edges & 1) || (zeros_only && (w->orient | 8) == 8)))
710 w->dsp.v_loop_filter(ptr, linesize, w->quant);
715 // FIXME maybe merge with ff_*
716 static void x8_init_block_index(IntraX8Context *w, AVFrame *frame)
718 // not parent codec linesize as this would be wrong for field pics
719 // not that IntraX8 has interlacing support ;)
720 const int linesize = frame->linesize[0];
721 const int uvlinesize = frame->linesize[1];
723 w->dest[0] = frame->data[0];
724 w->dest[1] = frame->data[1];
725 w->dest[2] = frame->data[2];
727 w->dest[0] += w->mb_y * linesize << 3;
728 // chroma blocks are on add rows
729 w->dest[1] += (w->mb_y & (~1)) * uvlinesize << 2;
730 w->dest[2] += (w->mb_y & (~1)) * uvlinesize << 2;
733 av_cold int ff_intrax8_common_init(AVCodecContext *avctx,
734 IntraX8Context *w, IDCTDSPContext *idsp,
735 int16_t (*block)[64],
736 int block_last_index[12],
737 int mb_width, int mb_height,
738 MpegEncContext *const s)
740 int ret = x8_vlc_init();
746 w->mb_width = mb_width;
747 w->mb_height = mb_height;
749 w->block_last_index = block_last_index;
752 // two rows, 2 blocks per cannon mb
753 w->prediction_table = av_mallocz(w->mb_width * 2 * 2);
754 if (!w->prediction_table)
755 return AVERROR(ENOMEM);
757 ff_init_scantable(w->idsp.idct_permutation, &w->scantable[0],
758 ff_wmv1_scantable[0]);
759 ff_init_scantable(w->idsp.idct_permutation, &w->scantable[1],
760 ff_wmv1_scantable[2]);
761 ff_init_scantable(w->idsp.idct_permutation, &w->scantable[2],
762 ff_wmv1_scantable[3]);
764 ff_intrax8dsp_init(&w->dsp);
765 ff_blockdsp_init(&w->bdsp, avctx);
770 av_cold void ff_intrax8_common_end(IntraX8Context *w)
772 av_freep(&w->prediction_table);
775 int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict,
776 GetBitContext *gb, int *mb_x, int *mb_y,
777 int dquant, int quant_offset,
778 int loopfilter, int lowdelay)
780 MpegEncContext *const s = w->s;
786 w->quant = dquant >> 1;
787 w->qsum = quant_offset;
789 w->loopfilter = loopfilter;
790 w->use_quant_matrix = get_bits1(w->gb);
795 w->divide_quant_dc_luma = ((1 << 16) + (w->quant >> 1)) / w->quant;
797 w->quant_dc_chroma = w->quant;
798 w->divide_quant_dc_chroma = w->divide_quant_dc_luma;
800 w->quant_dc_chroma = w->quant + ((w->quant + 3) >> 3);
801 w->divide_quant_dc_chroma = ((1 << 16) + (w->quant_dc_chroma >> 1)) / w->quant_dc_chroma;
803 x8_reset_vlc_tables(w);
805 for (w->mb_y = 0; w->mb_y < w->mb_height * 2; w->mb_y++) {
806 x8_init_block_index(w, w->frame);
807 mb_xy = (w->mb_y >> 1) * (w->mb_width + 1);
808 for (w->mb_x = 0; w->mb_x < w->mb_width * 2; w->mb_x++) {
809 x8_get_prediction(w);
810 if (x8_setup_spatial_predictor(w, 0))
812 if (x8_decode_intra_mb(w, 0))
815 if (w->mb_x & w->mb_y & 1) {
816 x8_get_prediction_chroma(w);
818 /* when setting up chroma, no vlc is read,
819 * so no error condition can be reached */
820 x8_setup_spatial_predictor(w, 1);
821 if (x8_decode_intra_mb(w, 1))
824 x8_setup_spatial_predictor(w, 2);
825 if (x8_decode_intra_mb(w, 2))
831 /* emulate MB info in the relevant tables */
832 s->mbskip_table[mb_xy] = 0;
833 s->mbintra_table[mb_xy] = 1;
834 pict->qscale_table[mb_xy] = w->quant;
840 ff_draw_horiz_band(w->avctx, w->frame, w->frame,
841 (w->mb_y - 1) * 8, 16,
842 PICT_FRAME, 0, lowdelay);