2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2011 Mashiat Sarker Shakkhar
4 * Copyright (c) 2006-2007 Konstantin Shishkov
5 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
7 * This file is part of Libav.
9 * Libav is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * Libav is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * VC-1 and WMV3 block decoding routines
30 #include "mpegutils.h"
31 #include "mpegvideo.h"
32 #include "msmpeg4data.h"
33 #include "unary_legacy.h"
36 #include "vc1acdata.h"
39 #define MB_INTRA_VLC_BITS 9
42 // offset tables for interlaced picture MVDATA decoding
43 static const int offset_table1
[9] = { 0, 1, 2, 4, 8, 16, 32, 64, 128 };
44 static const int offset_table2
[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
46 /***********************************************************************/
48 * @name VC-1 Bitplane decoding
66 /** @} */ //imode defines
68 static void init_block_index(VC1Context
*v
)
70 MpegEncContext
*s
= &v
->s
;
71 ff_init_block_index(s
);
72 if (v
->field_mode
&& !(v
->second_field
^ v
->tff
)) {
73 s
->dest
[0] += s
->current_picture_ptr
->f
->linesize
[0];
74 s
->dest
[1] += s
->current_picture_ptr
->f
->linesize
[1];
75 s
->dest
[2] += s
->current_picture_ptr
->f
->linesize
[2];
79 /** @} */ //Bitplane group
81 static void vc1_put_signed_blocks_clamped(VC1Context
*v
)
83 MpegEncContext
*s
= &v
->s
;
84 int topleft_mb_pos
, top_mb_pos
;
85 int stride_y
, fieldtx
= 0;
88 /* The put pixels loop is always one MB row behind the decoding loop,
89 * because we can only put pixels when overlap filtering is done, and
90 * for filtering of the bottom edge of a MB, we need the next MB row
92 * Within the row, the put pixels loop is also one MB col behind the
93 * decoding loop. The reason for this is again, because for filtering
94 * of the right MB edge, we need the next MB present. */
95 if (!s
->first_slice_line
) {
97 topleft_mb_pos
= (s
->mb_y
- 1) * s
->mb_stride
+ s
->mb_x
- 1;
98 if (v
->fcm
== ILACE_FRAME
)
99 fieldtx
= v
->fieldtx_plane
[topleft_mb_pos
];
100 stride_y
= s
->linesize
<< fieldtx
;
101 v_dist
= (16 - fieldtx
) >> (fieldtx
== 0);
102 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][0],
103 s
->dest
[0] - 16 * s
->linesize
- 16,
105 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][1],
106 s
->dest
[0] - 16 * s
->linesize
- 8,
108 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][2],
109 s
->dest
[0] - v_dist
* s
->linesize
- 16,
111 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][3],
112 s
->dest
[0] - v_dist
* s
->linesize
- 8,
114 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][4],
115 s
->dest
[1] - 8 * s
->uvlinesize
- 8,
117 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->topleft_blk_idx
][5],
118 s
->dest
[2] - 8 * s
->uvlinesize
- 8,
121 if (s
->mb_x
== s
->mb_width
- 1) {
122 top_mb_pos
= (s
->mb_y
- 1) * s
->mb_stride
+ s
->mb_x
;
123 if (v
->fcm
== ILACE_FRAME
)
124 fieldtx
= v
->fieldtx_plane
[top_mb_pos
];
125 stride_y
= s
->linesize
<< fieldtx
;
126 v_dist
= fieldtx
? 15 : 8;
127 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][0],
128 s
->dest
[0] - 16 * s
->linesize
,
130 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][1],
131 s
->dest
[0] - 16 * s
->linesize
+ 8,
133 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][2],
134 s
->dest
[0] - v_dist
* s
->linesize
,
136 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][3],
137 s
->dest
[0] - v_dist
* s
->linesize
+ 8,
139 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][4],
140 s
->dest
[1] - 8 * s
->uvlinesize
,
142 s
->idsp
.put_signed_pixels_clamped(v
->block
[v
->top_blk_idx
][5],
143 s
->dest
[2] - 8 * s
->uvlinesize
,
148 #define inc_blk_idx(idx) do { \
150 if (idx >= v->n_allocated_blks) \
154 inc_blk_idx(v
->topleft_blk_idx
);
155 inc_blk_idx(v
->top_blk_idx
);
156 inc_blk_idx(v
->left_blk_idx
);
157 inc_blk_idx(v
->cur_blk_idx
);
160 /***********************************************************************/
162 * @name VC-1 Block-level functions
163 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
169 * @brief Get macroblock-level quantizer scale
171 #define GET_MQUANT() \
172 if (v->dquantfrm) { \
174 if (v->dqprofile == DQPROFILE_ALL_MBS) { \
175 if (v->dqbilevel) { \
176 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
178 mqdiff = get_bits(gb, 3); \
180 mquant = v->pq + mqdiff; \
182 mquant = get_bits(gb, 5); \
185 if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \
186 edges = 1 << v->dqsbedge; \
187 else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
188 edges = (3 << v->dqsbedge) % 15; \
189 else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \
191 if ((edges&1) && !s->mb_x) \
193 if ((edges&2) && s->first_slice_line) \
195 if ((edges&4) && s->mb_x == (s->mb_width - 1)) \
197 if ((edges&8) && s->mb_y == (s->mb_height - 1)) \
199 if (!mquant || mquant > 31) { \
200 av_log(v->s.avctx, AV_LOG_ERROR, \
201 "Overriding invalid mquant %d\n", mquant); \
207 * @def GET_MVDATA(_dmv_x, _dmv_y)
208 * @brief Get MV differentials
209 * @see MVDATA decoding from 8.3.5.2, p(1)20
210 * @param _dmv_x Horizontal differential for decoded MV
211 * @param _dmv_y Vertical differential for decoded MV
213 #define GET_MVDATA(_dmv_x, _dmv_y) \
214 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
215 VC1_MV_DIFF_VLC_BITS, 2); \
223 _dmv_x = _dmv_y = 0; \
224 } else if (index == 35) { \
225 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
226 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
227 } else if (index == 36) { \
232 index1 = index % 6; \
233 if (!s->quarter_sample && index1 == 5) val = 1; \
235 if (size_table[index1] - val > 0) \
236 val = get_bits(gb, size_table[index1] - val); \
238 sign = 0 - (val&1); \
239 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
241 index1 = index / 6; \
242 if (!s->quarter_sample && index1 == 5) val = 1; \
244 if (size_table[index1] - val > 0) \
245 val = get_bits(gb, size_table[index1] - val); \
247 sign = 0 - (val & 1); \
248 _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign; \
251 static av_always_inline
void get_mvdata_interlaced(VC1Context
*v
, int *dmv_x
,
252 int *dmv_y
, int *pred_flag
)
255 int extend_x
= 0, extend_y
= 0;
256 GetBitContext
*gb
= &v
->s
.gb
;
262 bits
= VC1_2REF_MVDATA_VLC_BITS
;
265 bits
= VC1_1REF_MVDATA_VLC_BITS
;
268 switch (v
->dmvrange
) {
276 extend_x
= extend_y
= 1;
279 index
= get_vlc2(gb
, v
->imv_vlc
->table
, bits
, 3);
281 *dmv_x
= get_bits(gb
, v
->k_x
);
282 *dmv_y
= get_bits(gb
, v
->k_y
);
285 *pred_flag
= *dmv_y
& 1;
286 *dmv_y
= (*dmv_y
+ *pred_flag
) >> 1;
288 *dmv_y
= (*dmv_y
+ (*dmv_y
& 1)) >> 1;
294 offs_tab
= offset_table2
;
296 offs_tab
= offset_table1
;
297 index1
= (index
+ 1) % 9;
299 val
= get_bits(gb
, index1
+ extend_x
);
301 *dmv_x
= (sign
^ ((val
>> 1) + offs_tab
[index1
])) - sign
;
305 offs_tab
= offset_table2
;
307 offs_tab
= offset_table1
;
308 index1
= (index
+ 1) / 9;
309 if (index1
> v
->numref
) {
310 val
= get_bits(gb
, (index1
+ (extend_y
<< v
->numref
)) >> v
->numref
);
311 sign
= 0 - (val
& 1);
312 *dmv_y
= (sign
^ ((val
>> 1) + offs_tab
[index1
>> v
->numref
])) - sign
;
315 if (v
->numref
&& pred_flag
)
316 *pred_flag
= index1
& 1;
320 /** Reconstruct motion vector for B-frame and do motion compensation
322 static inline void vc1_b_mc(VC1Context
*v
, int dmv_x
[2], int dmv_y
[2],
323 int direct
, int mode
)
330 if (mode
== BMV_TYPE_INTERPOLATED
) {
336 ff_vc1_mc_1mv(v
, (mode
== BMV_TYPE_BACKWARD
));
339 /** Get predicted DC value for I-frames only
340 * prediction dir: left=0, top=1
341 * @param s MpegEncContext
342 * @param overlap flag indicating that overlap filtering is used
343 * @param pq integer part of picture quantizer
344 * @param[in] n block index in the current MB
345 * @param dc_val_ptr Pointer to DC predictor
346 * @param dir_ptr Prediction direction for use in AC prediction
348 static inline int vc1_i_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
349 int16_t **dc_val_ptr
, int *dir_ptr
)
351 int a
, b
, c
, wrap
, pred
, scale
;
353 static const uint16_t dcpred
[32] = {
354 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
355 114, 102, 93, 85, 79, 73, 68, 64,
356 60, 57, 54, 51, 49, 47, 45, 43,
357 41, 39, 38, 37, 35, 34, 33
360 /* find prediction - wmv3_dc_scale always used here in fact */
361 if (n
< 4) scale
= s
->y_dc_scale
;
362 else scale
= s
->c_dc_scale
;
364 wrap
= s
->block_wrap
[n
];
365 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
371 b
= dc_val
[ - 1 - wrap
];
374 if (pq
< 9 || !overlap
) {
375 /* Set outer values */
376 if (s
->first_slice_line
&& (n
!= 2 && n
!= 3))
377 b
= a
= dcpred
[scale
];
378 if (s
->mb_x
== 0 && (n
!= 1 && n
!= 3))
379 b
= c
= dcpred
[scale
];
381 /* Set outer values */
382 if (s
->first_slice_line
&& (n
!= 2 && n
!= 3))
384 if (s
->mb_x
== 0 && (n
!= 1 && n
!= 3))
388 if (abs(a
- b
) <= abs(b
- c
)) {
390 *dir_ptr
= 1; // left
396 /* update predictor */
397 *dc_val_ptr
= &dc_val
[0];
402 /** Get predicted DC value
403 * prediction dir: left=0, top=1
404 * @param s MpegEncContext
405 * @param overlap flag indicating that overlap filtering is used
406 * @param pq integer part of picture quantizer
407 * @param[in] n block index in the current MB
408 * @param a_avail flag indicating top block availability
409 * @param c_avail flag indicating left block availability
410 * @param dc_val_ptr Pointer to DC predictor
411 * @param dir_ptr Prediction direction for use in AC prediction
413 static inline int ff_vc1_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
414 int a_avail
, int c_avail
,
415 int16_t **dc_val_ptr
, int *dir_ptr
)
417 int a
, b
, c
, wrap
, pred
;
419 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
423 wrap
= s
->block_wrap
[n
];
424 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
430 b
= dc_val
[ - 1 - wrap
];
432 /* scale predictors if needed */
433 q1
= s
->current_picture
.qscale_table
[mb_pos
];
434 dqscale_index
= s
->y_dc_scale_table
[q1
] - 1;
435 if (dqscale_index
< 0)
437 if (c_avail
&& (n
!= 1 && n
!= 3)) {
438 q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
440 c
= (c
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[dqscale_index
] + 0x20000) >> 18;
442 if (a_avail
&& (n
!= 2 && n
!= 3)) {
443 q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
445 a
= (a
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[dqscale_index
] + 0x20000) >> 18;
447 if (a_avail
&& c_avail
&& (n
!= 3)) {
453 q2
= s
->current_picture
.qscale_table
[off
];
455 b
= (b
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[dqscale_index
] + 0x20000) >> 18;
458 if (a_avail
&& c_avail
) {
459 if (abs(a
- b
) <= abs(b
- c
)) {
461 *dir_ptr
= 1; // left
466 } else if (a_avail
) {
469 } else if (c_avail
) {
471 *dir_ptr
= 1; // left
474 *dir_ptr
= 1; // left
477 /* update predictor */
478 *dc_val_ptr
= &dc_val
[0];
482 /** @} */ // Block group
485 * @name VC1 Macroblock-level functions in Simple/Main Profiles
486 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
490 static inline int vc1_coded_block_pred(MpegEncContext
* s
, int n
,
491 uint8_t **coded_block_ptr
)
493 int xy
, wrap
, pred
, a
, b
, c
;
495 xy
= s
->block_index
[n
];
501 a
= s
->coded_block
[xy
- 1 ];
502 b
= s
->coded_block
[xy
- 1 - wrap
];
503 c
= s
->coded_block
[xy
- wrap
];
512 *coded_block_ptr
= &s
->coded_block
[xy
];
518 * Decode one AC coefficient
519 * @param v The VC1 context
520 * @param last Last coefficient
521 * @param skip How much zero coefficients to skip
522 * @param value Decoded AC coefficient value
523 * @param codingset set of VLC to decode data
526 static void vc1_decode_ac_coeff(VC1Context
*v
, int *last
, int *skip
,
527 int *value
, int codingset
)
529 GetBitContext
*gb
= &v
->s
.gb
;
530 int index
, escape
, run
= 0, level
= 0, lst
= 0;
532 index
= get_vlc2(gb
, ff_vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
533 if (index
!= ff_vc1_ac_sizes
[codingset
] - 1) {
534 run
= vc1_index_decode_table
[codingset
][index
][0];
535 level
= vc1_index_decode_table
[codingset
][index
][1];
536 lst
= index
>= vc1_last_decode_table
[codingset
] || get_bits_left(gb
) < 0;
540 escape
= decode210(gb
);
542 index
= get_vlc2(gb
, ff_vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
543 run
= vc1_index_decode_table
[codingset
][index
][0];
544 level
= vc1_index_decode_table
[codingset
][index
][1];
545 lst
= index
>= vc1_last_decode_table
[codingset
];
548 level
+= vc1_last_delta_level_table
[codingset
][run
];
550 level
+= vc1_delta_level_table
[codingset
][run
];
553 run
+= vc1_last_delta_run_table
[codingset
][level
] + 1;
555 run
+= vc1_delta_run_table
[codingset
][level
] + 1;
562 if (v
->s
.esc3_level_length
== 0) {
563 if (v
->pq
< 8 || v
->dquantfrm
) { // table 59
564 v
->s
.esc3_level_length
= get_bits(gb
, 3);
565 if (!v
->s
.esc3_level_length
)
566 v
->s
.esc3_level_length
= get_bits(gb
, 2) + 8;
568 v
->s
.esc3_level_length
= get_unary(gb
, 1, 6) + 2;
570 v
->s
.esc3_run_length
= 3 + get_bits(gb
, 2);
572 run
= get_bits(gb
, v
->s
.esc3_run_length
);
573 sign
= get_bits1(gb
);
574 level
= get_bits(gb
, v
->s
.esc3_level_length
);
585 /** Decode intra block in intra frames - should be faster than decode_intra_block
586 * @param v VC1Context
587 * @param block block to decode
588 * @param[in] n subblock index
589 * @param coded are AC coeffs present or not
590 * @param codingset set of VLC to decode data
592 static int vc1_decode_i_block(VC1Context
*v
, int16_t block
[64], int n
,
593 int coded
, int codingset
)
595 GetBitContext
*gb
= &v
->s
.gb
;
596 MpegEncContext
*s
= &v
->s
;
597 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
600 int16_t *ac_val
, *ac_val2
;
603 /* Get DC differential */
605 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
607 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
610 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
614 if (dcdiff
== 119 /* ESC index value */) {
616 if (v
->pq
== 1) dcdiff
= get_bits(gb
, 10);
617 else if (v
->pq
== 2) dcdiff
= get_bits(gb
, 9);
618 else dcdiff
= get_bits(gb
, 8);
621 dcdiff
= (dcdiff
<< 2) + get_bits(gb
, 2) - 3;
623 dcdiff
= (dcdiff
<< 1) + get_bits1(gb
) - 1;
630 dcdiff
+= vc1_i_pred_dc(&v
->s
, v
->overlap
, v
->pq
, n
, &dc_val
, &dc_pred_dir
);
633 /* Store the quantized DC coeff, used for prediction */
635 block
[0] = dcdiff
* s
->y_dc_scale
;
637 block
[0] = dcdiff
* s
->c_dc_scale
;
648 int last
= 0, skip
, value
;
649 const uint8_t *zz_table
;
653 scale
= v
->pq
* 2 + v
->halfpq
;
657 zz_table
= v
->zz_8x8
[2];
659 zz_table
= v
->zz_8x8
[3];
661 zz_table
= v
->zz_8x8
[1];
663 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
665 if (dc_pred_dir
) // left
668 ac_val
-= 16 * s
->block_wrap
[n
];
671 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
675 block
[zz_table
[i
++]] = value
;
678 /* apply AC prediction if needed */
680 if (dc_pred_dir
) { // left
681 for (k
= 1; k
< 8; k
++)
682 block
[k
<< v
->left_blk_sh
] += ac_val
[k
];
684 for (k
= 1; k
< 8; k
++)
685 block
[k
<< v
->top_blk_sh
] += ac_val
[k
+ 8];
688 /* save AC coeffs for further prediction */
689 for (k
= 1; k
< 8; k
++) {
690 ac_val2
[k
] = block
[k
<< v
->left_blk_sh
];
691 ac_val2
[k
+ 8] = block
[k
<< v
->top_blk_sh
];
694 /* scale AC coeffs */
695 for (k
= 1; k
< 64; k
++)
699 block
[k
] += (block
[k
] < 0) ? -v
->pq
: v
->pq
;
702 if (s
->ac_pred
) i
= 63;
708 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
712 scale
= v
->pq
* 2 + v
->halfpq
;
713 memset(ac_val2
, 0, 16 * 2);
714 if (dc_pred_dir
) { // left
717 memcpy(ac_val2
, ac_val
, 8 * 2);
719 ac_val
-= 16 * s
->block_wrap
[n
];
721 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
724 /* apply AC prediction if needed */
726 if (dc_pred_dir
) { //left
727 for (k
= 1; k
< 8; k
++) {
728 block
[k
<< v
->left_blk_sh
] = ac_val
[k
] * scale
;
729 if (!v
->pquantizer
&& block
[k
<< v
->left_blk_sh
])
730 block
[k
<< v
->left_blk_sh
] += (block
[k
<< v
->left_blk_sh
] < 0) ? -v
->pq
: v
->pq
;
733 for (k
= 1; k
< 8; k
++) {
734 block
[k
<< v
->top_blk_sh
] = ac_val
[k
+ 8] * scale
;
735 if (!v
->pquantizer
&& block
[k
<< v
->top_blk_sh
])
736 block
[k
<< v
->top_blk_sh
] += (block
[k
<< v
->top_blk_sh
] < 0) ? -v
->pq
: v
->pq
;
742 s
->block_last_index
[n
] = i
;
747 /** Decode intra block in intra frames - should be faster than decode_intra_block
748 * @param v VC1Context
749 * @param block block to decode
750 * @param[in] n subblock number
751 * @param coded are AC coeffs present or not
752 * @param codingset set of VLC to decode data
753 * @param mquant quantizer value for this macroblock
755 static int vc1_decode_i_block_adv(VC1Context
*v
, int16_t block
[64], int n
,
756 int coded
, int codingset
, int mquant
)
758 GetBitContext
*gb
= &v
->s
.gb
;
759 MpegEncContext
*s
= &v
->s
;
760 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
763 int16_t *ac_val
, *ac_val2
;
765 int a_avail
= v
->a_avail
, c_avail
= v
->c_avail
;
766 int use_pred
= s
->ac_pred
;
769 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
771 /* Get DC differential */
773 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
775 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
778 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
782 if (dcdiff
== 119 /* ESC index value */) {
784 if (mquant
== 1) dcdiff
= get_bits(gb
, 10);
785 else if (mquant
== 2) dcdiff
= get_bits(gb
, 9);
786 else dcdiff
= get_bits(gb
, 8);
789 dcdiff
= (dcdiff
<< 2) + get_bits(gb
, 2) - 3;
790 else if (mquant
== 2)
791 dcdiff
= (dcdiff
<< 1) + get_bits1(gb
) - 1;
798 dcdiff
+= ff_vc1_pred_dc(&v
->s
, v
->overlap
, mquant
, n
, v
->a_avail
, v
->c_avail
, &dc_val
, &dc_pred_dir
);
801 /* Store the quantized DC coeff, used for prediction */
803 block
[0] = dcdiff
* s
->y_dc_scale
;
805 block
[0] = dcdiff
* s
->c_dc_scale
;
811 /* check if AC is needed at all */
812 if (!a_avail
&& !c_avail
)
814 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
817 scale
= mquant
* 2 + ((mquant
== v
->pq
) ? v
->halfpq
: 0);
819 if (dc_pred_dir
) // left
822 ac_val
-= 16 * s
->block_wrap
[n
];
824 q1
= s
->current_picture
.qscale_table
[mb_pos
];
825 if (dc_pred_dir
&& c_avail
&& mb_pos
)
826 q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
827 if (!dc_pred_dir
&& a_avail
&& mb_pos
>= s
->mb_stride
)
828 q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
829 if (dc_pred_dir
&& n
== 1)
831 if (!dc_pred_dir
&& n
== 2)
837 int last
= 0, skip
, value
;
838 const uint8_t *zz_table
;
842 if (!use_pred
&& v
->fcm
== ILACE_FRAME
) {
843 zz_table
= v
->zzi_8x8
;
845 if (!dc_pred_dir
) // top
846 zz_table
= v
->zz_8x8
[2];
848 zz_table
= v
->zz_8x8
[3];
851 if (v
->fcm
!= ILACE_FRAME
)
852 zz_table
= v
->zz_8x8
[1];
854 zz_table
= v
->zzi_8x8
;
858 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
862 block
[zz_table
[i
++]] = value
;
865 /* apply AC prediction if needed */
867 /* scale predictors if needed*/
868 if (q2
&& q1
!= q2
) {
869 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
870 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
873 return AVERROR_INVALIDDATA
;
874 if (dc_pred_dir
) { // left
875 for (k
= 1; k
< 8; k
++)
876 block
[k
<< v
->left_blk_sh
] += (ac_val
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
878 for (k
= 1; k
< 8; k
++)
879 block
[k
<< v
->top_blk_sh
] += (ac_val
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
882 if (dc_pred_dir
) { //left
883 for (k
= 1; k
< 8; k
++)
884 block
[k
<< v
->left_blk_sh
] += ac_val
[k
];
886 for (k
= 1; k
< 8; k
++)
887 block
[k
<< v
->top_blk_sh
] += ac_val
[k
+ 8];
891 /* save AC coeffs for further prediction */
892 for (k
= 1; k
< 8; k
++) {
893 ac_val2
[k
] = block
[k
<< v
->left_blk_sh
];
894 ac_val2
[k
+ 8] = block
[k
<< v
->top_blk_sh
];
897 /* scale AC coeffs */
898 for (k
= 1; k
< 64; k
++)
902 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
905 if (use_pred
) i
= 63;
906 } else { // no AC coeffs
909 memset(ac_val2
, 0, 16 * 2);
910 if (dc_pred_dir
) { // left
912 memcpy(ac_val2
, ac_val
, 8 * 2);
913 if (q2
&& q1
!= q2
) {
914 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
915 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
917 return AVERROR_INVALIDDATA
;
918 for (k
= 1; k
< 8; k
++)
919 ac_val2
[k
] = (ac_val2
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
924 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
925 if (q2
&& q1
!= q2
) {
926 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
927 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
929 return AVERROR_INVALIDDATA
;
930 for (k
= 1; k
< 8; k
++)
931 ac_val2
[k
+ 8] = (ac_val2
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
936 /* apply AC prediction if needed */
938 if (dc_pred_dir
) { // left
939 for (k
= 1; k
< 8; k
++) {
940 block
[k
<< v
->left_blk_sh
] = ac_val2
[k
] * scale
;
941 if (!v
->pquantizer
&& block
[k
<< v
->left_blk_sh
])
942 block
[k
<< v
->left_blk_sh
] += (block
[k
<< v
->left_blk_sh
] < 0) ? -mquant
: mquant
;
945 for (k
= 1; k
< 8; k
++) {
946 block
[k
<< v
->top_blk_sh
] = ac_val2
[k
+ 8] * scale
;
947 if (!v
->pquantizer
&& block
[k
<< v
->top_blk_sh
])
948 block
[k
<< v
->top_blk_sh
] += (block
[k
<< v
->top_blk_sh
] < 0) ? -mquant
: mquant
;
954 s
->block_last_index
[n
] = i
;
959 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
960 * @param v VC1Context
961 * @param block block to decode
962 * @param[in] n subblock index
963 * @param coded are AC coeffs present or not
964 * @param mquant block quantizer
965 * @param codingset set of VLC to decode data
967 static int vc1_decode_intra_block(VC1Context
*v
, int16_t block
[64], int n
,
968 int coded
, int mquant
, int codingset
)
970 GetBitContext
*gb
= &v
->s
.gb
;
971 MpegEncContext
*s
= &v
->s
;
972 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
975 int16_t *ac_val
, *ac_val2
;
977 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
978 int a_avail
= v
->a_avail
, c_avail
= v
->c_avail
;
979 int use_pred
= s
->ac_pred
;
983 s
->bdsp
.clear_block(block
);
985 /* XXX: Guard against dumb values of mquant */
986 mquant
= (mquant
< 1) ? 0 : ((mquant
> 31) ? 31 : mquant
);
988 /* Set DC scale - y and c use the same */
989 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
990 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
992 /* Get DC differential */
994 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
996 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
999 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
1003 if (dcdiff
== 119 /* ESC index value */) {
1004 /* TODO: Optimize */
1005 if (mquant
== 1) dcdiff
= get_bits(gb
, 10);
1006 else if (mquant
== 2) dcdiff
= get_bits(gb
, 9);
1007 else dcdiff
= get_bits(gb
, 8);
1010 dcdiff
= (dcdiff
<< 2) + get_bits(gb
, 2) - 3;
1011 else if (mquant
== 2)
1012 dcdiff
= (dcdiff
<< 1) + get_bits1(gb
) - 1;
1019 dcdiff
+= ff_vc1_pred_dc(&v
->s
, v
->overlap
, mquant
, n
, a_avail
, c_avail
, &dc_val
, &dc_pred_dir
);
1022 /* Store the quantized DC coeff, used for prediction */
1025 block
[0] = dcdiff
* s
->y_dc_scale
;
1027 block
[0] = dcdiff
* s
->c_dc_scale
;
1033 /* check if AC is needed at all and adjust direction if needed */
1034 if (!a_avail
) dc_pred_dir
= 1;
1035 if (!c_avail
) dc_pred_dir
= 0;
1036 if (!a_avail
&& !c_avail
) use_pred
= 0;
1037 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
1040 scale
= mquant
* 2 + v
->halfpq
;
1042 if (dc_pred_dir
) //left
1045 ac_val
-= 16 * s
->block_wrap
[n
];
1047 q1
= s
->current_picture
.qscale_table
[mb_pos
];
1048 if (dc_pred_dir
&& c_avail
&& mb_pos
)
1049 q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
1050 if (!dc_pred_dir
&& a_avail
&& mb_pos
>= s
->mb_stride
)
1051 q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
1052 if (dc_pred_dir
&& n
== 1)
1054 if (!dc_pred_dir
&& n
== 2)
1056 if (n
== 3) q2
= q1
;
1059 int last
= 0, skip
, value
;
1063 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
1067 if (v
->fcm
== PROGRESSIVE
)
1068 block
[v
->zz_8x8
[0][i
++]] = value
;
1070 if (use_pred
&& (v
->fcm
== ILACE_FRAME
)) {
1071 if (!dc_pred_dir
) // top
1072 block
[v
->zz_8x8
[2][i
++]] = value
;
1074 block
[v
->zz_8x8
[3][i
++]] = value
;
1076 block
[v
->zzi_8x8
[i
++]] = value
;
1081 /* apply AC prediction if needed */
1083 /* scale predictors if needed*/
1084 if (q2
&& q1
!= q2
) {
1085 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
1086 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
1089 return AVERROR_INVALIDDATA
;
1090 if (dc_pred_dir
) { // left
1091 for (k
= 1; k
< 8; k
++)
1092 block
[k
<< v
->left_blk_sh
] += (ac_val
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1094 for (k
= 1; k
< 8; k
++)
1095 block
[k
<< v
->top_blk_sh
] += (ac_val
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1098 if (dc_pred_dir
) { // left
1099 for (k
= 1; k
< 8; k
++)
1100 block
[k
<< v
->left_blk_sh
] += ac_val
[k
];
1102 for (k
= 1; k
< 8; k
++)
1103 block
[k
<< v
->top_blk_sh
] += ac_val
[k
+ 8];
1107 /* save AC coeffs for further prediction */
1108 for (k
= 1; k
< 8; k
++) {
1109 ac_val2
[k
] = block
[k
<< v
->left_blk_sh
];
1110 ac_val2
[k
+ 8] = block
[k
<< v
->top_blk_sh
];
1113 /* scale AC coeffs */
1114 for (k
= 1; k
< 64; k
++)
1118 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
1121 if (use_pred
) i
= 63;
1122 } else { // no AC coeffs
1125 memset(ac_val2
, 0, 16 * 2);
1126 if (dc_pred_dir
) { // left
1128 memcpy(ac_val2
, ac_val
, 8 * 2);
1129 if (q2
&& q1
!= q2
) {
1130 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
1131 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
1133 return AVERROR_INVALIDDATA
;
1134 for (k
= 1; k
< 8; k
++)
1135 ac_val2
[k
] = (ac_val2
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1140 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
1141 if (q2
&& q1
!= q2
) {
1142 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
1143 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
1145 return AVERROR_INVALIDDATA
;
1146 for (k
= 1; k
< 8; k
++)
1147 ac_val2
[k
+ 8] = (ac_val2
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1152 /* apply AC prediction if needed */
1154 if (dc_pred_dir
) { // left
1155 for (k
= 1; k
< 8; k
++) {
1156 block
[k
<< v
->left_blk_sh
] = ac_val2
[k
] * scale
;
1157 if (!v
->pquantizer
&& block
[k
<< v
->left_blk_sh
])
1158 block
[k
<< v
->left_blk_sh
] += (block
[k
<< v
->left_blk_sh
] < 0) ? -mquant
: mquant
;
1161 for (k
= 1; k
< 8; k
++) {
1162 block
[k
<< v
->top_blk_sh
] = ac_val2
[k
+ 8] * scale
;
1163 if (!v
->pquantizer
&& block
[k
<< v
->top_blk_sh
])
1164 block
[k
<< v
->top_blk_sh
] += (block
[k
<< v
->top_blk_sh
] < 0) ? -mquant
: mquant
;
1170 s
->block_last_index
[n
] = i
;
1177 static int vc1_decode_p_block(VC1Context
*v
, int16_t block
[64], int n
,
1178 int mquant
, int ttmb
, int first_block
,
1179 uint8_t *dst
, int linesize
, int skip_block
,
1182 MpegEncContext
*s
= &v
->s
;
1183 GetBitContext
*gb
= &s
->gb
;
1186 int scale
, off
, idx
, last
, skip
, value
;
1187 int ttblk
= ttmb
& 7;
1190 s
->bdsp
.clear_block(block
);
1193 ttblk
= ff_vc1_ttblk_to_tt
[v
->tt_index
][get_vlc2(gb
, ff_vc1_ttblk_vlc
[v
->tt_index
].table
, VC1_TTBLK_VLC_BITS
, 1)];
1195 if (ttblk
== TT_4X4
) {
1196 subblkpat
= ~(get_vlc2(gb
, ff_vc1_subblkpat_vlc
[v
->tt_index
].table
, VC1_SUBBLKPAT_VLC_BITS
, 1) + 1);
1198 if ((ttblk
!= TT_8X8
&& ttblk
!= TT_4X4
)
1199 && ((v
->ttmbf
|| (ttmb
!= -1 && (ttmb
& 8) && !first_block
))
1200 || (!v
->res_rtm_flag
&& !first_block
))) {
1201 subblkpat
= decode012(gb
);
1203 subblkpat
^= 3; // swap decoded pattern bits
1204 if (ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
)
1206 if (ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
)
1209 scale
= 2 * mquant
+ ((v
->pq
== mquant
) ? v
->halfpq
: 0);
1211 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
1212 if (ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
) {
1213 subblkpat
= 2 - (ttblk
== TT_8X4_TOP
);
1216 if (ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
) {
1217 subblkpat
= 2 - (ttblk
== TT_4X8_LEFT
);
1226 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
1231 idx
= v
->zz_8x8
[0][i
++];
1233 idx
= v
->zzi_8x8
[i
++];
1234 block
[idx
] = value
* scale
;
1236 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
1240 v
->vc1dsp
.vc1_inv_trans_8x8_dc(dst
, linesize
, block
);
1242 v
->vc1dsp
.vc1_inv_trans_8x8(block
);
1243 s
->idsp
.add_pixels_clamped(block
, dst
, linesize
);
1248 pat
= ~subblkpat
& 0xF;
1249 for (j
= 0; j
< 4; j
++) {
1250 last
= subblkpat
& (1 << (3 - j
));
1252 off
= (j
& 1) * 4 + (j
& 2) * 16;
1254 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
1259 idx
= ff_vc1_simple_progressive_4x4_zz
[i
++];
1261 idx
= ff_vc1_adv_interlaced_4x4_zz
[i
++];
1262 block
[idx
+ off
] = value
* scale
;
1264 block
[idx
+ off
] += (block
[idx
+ off
] < 0) ? -mquant
: mquant
;
1266 if (!(subblkpat
& (1 << (3 - j
))) && !skip_block
) {
1268 v
->vc1dsp
.vc1_inv_trans_4x4_dc(dst
+ (j
& 1) * 4 + (j
& 2) * 2 * linesize
, linesize
, block
+ off
);
1270 v
->vc1dsp
.vc1_inv_trans_4x4(dst
+ (j
& 1) * 4 + (j
& 2) * 2 * linesize
, linesize
, block
+ off
);
1275 pat
= ~((subblkpat
& 2) * 6 + (subblkpat
& 1) * 3) & 0xF;
1276 for (j
= 0; j
< 2; j
++) {
1277 last
= subblkpat
& (1 << (1 - j
));
1281 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
1286 idx
= v
->zz_8x4
[i
++] + off
;
1288 idx
= ff_vc1_adv_interlaced_8x4_zz
[i
++] + off
;
1289 block
[idx
] = value
* scale
;
1291 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
1293 if (!(subblkpat
& (1 << (1 - j
))) && !skip_block
) {
1295 v
->vc1dsp
.vc1_inv_trans_8x4_dc(dst
+ j
* 4 * linesize
, linesize
, block
+ off
);
1297 v
->vc1dsp
.vc1_inv_trans_8x4(dst
+ j
* 4 * linesize
, linesize
, block
+ off
);
1302 pat
= ~(subblkpat
* 5) & 0xF;
1303 for (j
= 0; j
< 2; j
++) {
1304 last
= subblkpat
& (1 << (1 - j
));
1308 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
1313 idx
= v
->zz_4x8
[i
++] + off
;
1315 idx
= ff_vc1_adv_interlaced_4x8_zz
[i
++] + off
;
1316 block
[idx
] = value
* scale
;
1318 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
1320 if (!(subblkpat
& (1 << (1 - j
))) && !skip_block
) {
1322 v
->vc1dsp
.vc1_inv_trans_4x8_dc(dst
+ j
* 4, linesize
, block
+ off
);
1324 v
->vc1dsp
.vc1_inv_trans_4x8(dst
+ j
*4, linesize
, block
+ off
);
1330 *ttmb_out
|= ttblk
<< (n
* 4);
1334 /** @} */ // Macroblock group
1336 static const int size_table
[6] = { 0, 2, 3, 4, 5, 8 };
1337 static const int offset_table
[6] = { 0, 1, 3, 7, 15, 31 };
1339 /** Decode one P-frame MB
1341 static int vc1_decode_p_mb(VC1Context
*v
)
1343 MpegEncContext
*s
= &v
->s
;
1344 GetBitContext
*gb
= &s
->gb
;
1346 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1347 int cbp
; /* cbp decoding stuff */
1348 int mqdiff
, mquant
; /* MB quantization */
1349 int ttmb
= v
->ttfrm
; /* MB Transform type */
1351 int mb_has_coeffs
= 1; /* last_flag */
1352 int dmv_x
, dmv_y
; /* Differential MV components */
1353 int index
, index1
; /* LUT indexes */
1354 int val
, sign
; /* temp values */
1355 int first_block
= 1;
1357 int skipped
, fourmv
;
1358 int block_cbp
= 0, pat
, block_tt
= 0, block_intra
= 0;
1360 mquant
= v
->pq
; /* lossy initialization */
1362 if (v
->mv_type_is_raw
)
1363 fourmv
= get_bits1(gb
);
1365 fourmv
= v
->mv_type_mb_plane
[mb_pos
];
1367 skipped
= get_bits1(gb
);
1369 skipped
= v
->s
.mbskip_table
[mb_pos
];
1371 if (!fourmv
) { /* 1MV mode */
1373 GET_MVDATA(dmv_x
, dmv_y
);
1376 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
1377 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
1379 s
->current_picture
.mb_type
[mb_pos
] = s
->mb_intra
? MB_TYPE_INTRA
: MB_TYPE_16x16
;
1380 ff_vc1_pred_mv(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0, 0);
1382 /* FIXME Set DC val for inter block ? */
1383 if (s
->mb_intra
&& !mb_has_coeffs
) {
1385 s
->ac_pred
= get_bits1(gb
);
1387 } else if (mb_has_coeffs
) {
1389 s
->ac_pred
= get_bits1(gb
);
1390 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1396 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1398 if (!v
->ttmbf
&& !s
->mb_intra
&& mb_has_coeffs
)
1399 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
,
1400 VC1_TTMB_VLC_BITS
, 2);
1401 if (!s
->mb_intra
) ff_vc1_mc_1mv(v
, 0);
1403 for (i
= 0; i
< 6; i
++) {
1404 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1406 val
= ((cbp
>> (5 - i
)) & 1);
1407 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
1408 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
1410 /* check if prediction blocks A and C are available */
1411 v
->a_avail
= v
->c_avail
= 0;
1412 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
1413 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
1414 if (i
== 1 || i
== 3 || s
->mb_x
)
1415 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
1417 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
1418 (i
& 4) ? v
->codingset2
: v
->codingset
);
1419 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
1421 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
1423 for (j
= 0; j
< 64; j
++)
1424 s
->block
[i
][j
] <<= 1;
1425 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
1426 s
->dest
[dst_idx
] + off
,
1427 i
& 4 ? s
->uvlinesize
1429 if (v
->pq
>= 9 && v
->overlap
) {
1431 v
->vc1dsp
.vc1_h_overlap(s
->dest
[dst_idx
] + off
, i
& 4 ? s
->uvlinesize
: s
->linesize
);
1433 v
->vc1dsp
.vc1_v_overlap(s
->dest
[dst_idx
] + off
, i
& 4 ? s
->uvlinesize
: s
->linesize
);
1435 block_cbp
|= 0xF << (i
<< 2);
1436 block_intra
|= 1 << i
;
1438 pat
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
, first_block
,
1439 s
->dest
[dst_idx
] + off
, (i
& 4) ? s
->uvlinesize
: s
->linesize
,
1440 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
), &block_tt
);
1441 block_cbp
|= pat
<< (i
<< 2);
1442 if (!v
->ttmbf
&& ttmb
< 8)
1449 for (i
= 0; i
< 6; i
++) {
1450 v
->mb_type
[0][s
->block_index
[i
]] = 0;
1451 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1453 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_SKIP
;
1454 s
->current_picture
.qscale_table
[mb_pos
] = 0;
1455 ff_vc1_pred_mv(v
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0, 0);
1456 ff_vc1_mc_1mv(v
, 0);
1458 } else { // 4MV mode
1459 if (!skipped
/* unskipped MB */) {
1460 int intra_count
= 0, coded_inter
= 0;
1461 int is_intra
[6], is_coded
[6];
1463 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1464 for (i
= 0; i
< 6; i
++) {
1465 val
= ((cbp
>> (5 - i
)) & 1);
1466 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1473 GET_MVDATA(dmv_x
, dmv_y
);
1475 ff_vc1_pred_mv(v
, i
, dmv_x
, dmv_y
, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0, 0);
1477 ff_vc1_mc_4mv_luma(v
, i
, 0, 0);
1478 intra_count
+= s
->mb_intra
;
1479 is_intra
[i
] = s
->mb_intra
;
1480 is_coded
[i
] = mb_has_coeffs
;
1483 is_intra
[i
] = (intra_count
>= 3);
1487 ff_vc1_mc_4mv_chroma(v
, 0);
1488 v
->mb_type
[0][s
->block_index
[i
]] = is_intra
[i
];
1490 coded_inter
= !is_intra
[i
] & is_coded
[i
];
1492 // if there are no coded blocks then don't do anything more
1494 if (!intra_count
&& !coded_inter
)
1497 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1498 /* test if block is intra and has pred */
1501 for (i
= 0; i
< 6; i
++)
1503 if (((!s
->first_slice_line
|| (i
== 2 || i
== 3)) && v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]])
1504 || ((s
->mb_x
|| (i
== 1 || i
== 3)) && v
->mb_type
[0][s
->block_index
[i
] - 1])) {
1510 s
->ac_pred
= get_bits1(gb
);
1514 if (!v
->ttmbf
&& coded_inter
)
1515 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
1516 for (i
= 0; i
< 6; i
++) {
1518 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
1519 s
->mb_intra
= is_intra
[i
];
1521 /* check if prediction blocks A and C are available */
1522 v
->a_avail
= v
->c_avail
= 0;
1523 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
1524 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
1525 if (i
== 1 || i
== 3 || s
->mb_x
)
1526 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
1528 vc1_decode_intra_block(v
, s
->block
[i
], i
, is_coded
[i
], mquant
,
1529 (i
& 4) ? v
->codingset2
: v
->codingset
);
1530 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
1532 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
1534 for (j
= 0; j
< 64; j
++)
1535 s
->block
[i
][j
] <<= 1;
1536 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
1537 s
->dest
[dst_idx
] + off
,
1538 (i
& 4) ? s
->uvlinesize
1540 if (v
->pq
>= 9 && v
->overlap
) {
1542 v
->vc1dsp
.vc1_h_overlap(s
->dest
[dst_idx
] + off
, i
& 4 ? s
->uvlinesize
: s
->linesize
);
1544 v
->vc1dsp
.vc1_v_overlap(s
->dest
[dst_idx
] + off
, i
& 4 ? s
->uvlinesize
: s
->linesize
);
1546 block_cbp
|= 0xF << (i
<< 2);
1547 block_intra
|= 1 << i
;
1548 } else if (is_coded
[i
]) {
1549 pat
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
1550 first_block
, s
->dest
[dst_idx
] + off
,
1551 (i
& 4) ? s
->uvlinesize
: s
->linesize
,
1552 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
),
1554 block_cbp
|= pat
<< (i
<< 2);
1555 if (!v
->ttmbf
&& ttmb
< 8)
1560 } else { // skipped MB
1562 s
->current_picture
.qscale_table
[mb_pos
] = 0;
1563 for (i
= 0; i
< 6; i
++) {
1564 v
->mb_type
[0][s
->block_index
[i
]] = 0;
1565 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1567 for (i
= 0; i
< 4; i
++) {
1568 ff_vc1_pred_mv(v
, i
, 0, 0, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0, 0);
1569 ff_vc1_mc_4mv_luma(v
, i
, 0, 0);
1571 ff_vc1_mc_4mv_chroma(v
, 0);
1572 s
->current_picture
.qscale_table
[mb_pos
] = 0;
1576 v
->cbp
[s
->mb_x
] = block_cbp
;
1577 v
->ttblk
[s
->mb_x
] = block_tt
;
1578 v
->is_intra
[s
->mb_x
] = block_intra
;
1583 /* Decode one macroblock in an interlaced frame p picture */
1585 static int vc1_decode_p_mb_intfr(VC1Context
*v
)
1587 MpegEncContext
*s
= &v
->s
;
1588 GetBitContext
*gb
= &s
->gb
;
1590 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1591 int cbp
= 0; /* cbp decoding stuff */
1592 int mqdiff
, mquant
; /* MB quantization */
1593 int ttmb
= v
->ttfrm
; /* MB Transform type */
1595 int mb_has_coeffs
= 1; /* last_flag */
1596 int dmv_x
, dmv_y
; /* Differential MV components */
1597 int val
; /* temp value */
1598 int first_block
= 1;
1600 int skipped
, fourmv
= 0, twomv
= 0;
1601 int block_cbp
= 0, pat
, block_tt
= 0;
1602 int idx_mbmode
= 0, mvbp
;
1603 int stride_y
, fieldtx
;
1605 mquant
= v
->pq
; /* Lossy initialization */
1608 skipped
= get_bits1(gb
);
1610 skipped
= v
->s
.mbskip_table
[mb_pos
];
1612 if (v
->fourmvswitch
)
1613 idx_mbmode
= get_vlc2(gb
, v
->mbmode_vlc
->table
, VC1_INTFR_4MV_MBMODE_VLC_BITS
, 2); // try getting this done
1615 idx_mbmode
= get_vlc2(gb
, v
->mbmode_vlc
->table
, VC1_INTFR_NON4MV_MBMODE_VLC_BITS
, 2); // in a single line
1616 switch (ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][0]) {
1617 /* store the motion vector type in a flag (useful later) */
1618 case MV_PMODE_INTFR_4MV
:
1620 v
->blk_mv_type
[s
->block_index
[0]] = 0;
1621 v
->blk_mv_type
[s
->block_index
[1]] = 0;
1622 v
->blk_mv_type
[s
->block_index
[2]] = 0;
1623 v
->blk_mv_type
[s
->block_index
[3]] = 0;
1625 case MV_PMODE_INTFR_4MV_FIELD
:
1627 v
->blk_mv_type
[s
->block_index
[0]] = 1;
1628 v
->blk_mv_type
[s
->block_index
[1]] = 1;
1629 v
->blk_mv_type
[s
->block_index
[2]] = 1;
1630 v
->blk_mv_type
[s
->block_index
[3]] = 1;
1632 case MV_PMODE_INTFR_2MV_FIELD
:
1634 v
->blk_mv_type
[s
->block_index
[0]] = 1;
1635 v
->blk_mv_type
[s
->block_index
[1]] = 1;
1636 v
->blk_mv_type
[s
->block_index
[2]] = 1;
1637 v
->blk_mv_type
[s
->block_index
[3]] = 1;
1639 case MV_PMODE_INTFR_1MV
:
1640 v
->blk_mv_type
[s
->block_index
[0]] = 0;
1641 v
->blk_mv_type
[s
->block_index
[1]] = 0;
1642 v
->blk_mv_type
[s
->block_index
[2]] = 0;
1643 v
->blk_mv_type
[s
->block_index
[3]] = 0;
1646 if (ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][0] == MV_PMODE_INTFR_INTRA
) { // intra MB
1647 for (i
= 0; i
< 4; i
++) {
1648 s
->current_picture
.motion_val
[1][s
->block_index
[i
]][0] = 0;
1649 s
->current_picture
.motion_val
[1][s
->block_index
[i
]][1] = 0;
1651 v
->is_intra
[s
->mb_x
] = 0x3f; // Set the bitfield to all 1.
1653 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
1654 fieldtx
= v
->fieldtx_plane
[mb_pos
] = get_bits1(gb
);
1655 mb_has_coeffs
= get_bits1(gb
);
1657 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1658 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
] = get_bits1(gb
);
1660 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1661 /* Set DC scale - y and c use the same (not sure if necessary here) */
1662 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
1663 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
1665 for (i
= 0; i
< 6; i
++) {
1666 v
->a_avail
= v
->c_avail
= 0;
1667 v
->mb_type
[0][s
->block_index
[i
]] = 1;
1668 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1670 val
= ((cbp
>> (5 - i
)) & 1);
1671 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
1672 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
1673 if (i
== 1 || i
== 3 || s
->mb_x
)
1674 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
1676 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
1677 (i
& 4) ? v
->codingset2
: v
->codingset
);
1678 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
1680 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
1682 stride_y
= s
->linesize
<< fieldtx
;
1683 off
= (fieldtx
) ? ((i
& 1) * 8) + ((i
& 2) >> 1) * s
->linesize
: (i
& 1) * 8 + 4 * (i
& 2) * s
->linesize
;
1685 stride_y
= s
->uvlinesize
;
1688 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
1689 s
->dest
[dst_idx
] + off
,
1694 } else { // inter MB
1695 mb_has_coeffs
= ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][3];
1697 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1698 if (ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][0] == MV_PMODE_INTFR_2MV_FIELD
) {
1699 v
->twomvbp
= get_vlc2(gb
, v
->twomvbp_vlc
->table
, VC1_2MV_BLOCK_PATTERN_VLC_BITS
, 1);
1701 if ((ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][0] == MV_PMODE_INTFR_4MV
)
1702 || (ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][0] == MV_PMODE_INTFR_4MV_FIELD
)) {
1703 v
->fourmvbp
= get_vlc2(gb
, v
->fourmvbp_vlc
->table
, VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 1);
1706 s
->mb_intra
= v
->is_intra
[s
->mb_x
] = 0;
1707 for (i
= 0; i
< 6; i
++)
1708 v
->mb_type
[0][s
->block_index
[i
]] = 0;
1709 fieldtx
= v
->fieldtx_plane
[mb_pos
] = ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][1];
1710 /* for all motion vector read MVDATA and motion compensate each block */
1714 for (i
= 0; i
< 6; i
++) {
1717 val
= ((mvbp
>> (3 - i
)) & 1);
1719 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
1721 ff_vc1_pred_mv_intfr(v
, i
, dmv_x
, dmv_y
, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
1722 ff_vc1_mc_4mv_luma(v
, i
, 0, 0);
1723 } else if (i
== 4) {
1724 ff_vc1_mc_4mv_chroma4(v
, 0, 0, 0);
1731 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
1733 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
1734 ff_vc1_mc_4mv_luma(v
, 0, 0, 0);
1735 ff_vc1_mc_4mv_luma(v
, 1, 0, 0);
1738 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
1740 ff_vc1_pred_mv_intfr(v
, 2, dmv_x
, dmv_y
, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
1741 ff_vc1_mc_4mv_luma(v
, 2, 0, 0);
1742 ff_vc1_mc_4mv_luma(v
, 3, 0, 0);
1743 ff_vc1_mc_4mv_chroma4(v
, 0, 0, 0);
1745 mvbp
= ff_vc1_mbmode_intfrp
[v
->fourmvswitch
][idx_mbmode
][2];
1748 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
1750 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
1751 ff_vc1_mc_1mv(v
, 0);
1754 GET_MQUANT(); // p. 227
1755 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1756 if (!v
->ttmbf
&& cbp
)
1757 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
1758 for (i
= 0; i
< 6; i
++) {
1759 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1761 val
= ((cbp
>> (5 - i
)) & 1);
1763 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
1765 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + ((i
> 1) * s
->linesize
));
1767 pat
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
1768 first_block
, s
->dest
[dst_idx
] + off
,
1769 (i
& 4) ? s
->uvlinesize
: (s
->linesize
<< fieldtx
),
1770 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
), &block_tt
);
1771 block_cbp
|= pat
<< (i
<< 2);
1772 if (!v
->ttmbf
&& ttmb
< 8)
1779 s
->mb_intra
= v
->is_intra
[s
->mb_x
] = 0;
1780 for (i
= 0; i
< 6; i
++) {
1781 v
->mb_type
[0][s
->block_index
[i
]] = 0;
1782 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1784 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_SKIP
;
1785 s
->current_picture
.qscale_table
[mb_pos
] = 0;
1786 v
->blk_mv_type
[s
->block_index
[0]] = 0;
1787 v
->blk_mv_type
[s
->block_index
[1]] = 0;
1788 v
->blk_mv_type
[s
->block_index
[2]] = 0;
1789 v
->blk_mv_type
[s
->block_index
[3]] = 0;
1790 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
1791 ff_vc1_mc_1mv(v
, 0);
1793 if (s
->mb_x
== s
->mb_width
- 1)
1794 memmove(v
->is_intra_base
, v
->is_intra
, sizeof(v
->is_intra_base
[0])*s
->mb_stride
);
1798 static int vc1_decode_p_mb_intfi(VC1Context
*v
)
1800 MpegEncContext
*s
= &v
->s
;
1801 GetBitContext
*gb
= &s
->gb
;
1803 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1804 int cbp
= 0; /* cbp decoding stuff */
1805 int mqdiff
, mquant
; /* MB quantization */
1806 int ttmb
= v
->ttfrm
; /* MB Transform type */
1808 int mb_has_coeffs
= 1; /* last_flag */
1809 int dmv_x
, dmv_y
; /* Differential MV components */
1810 int val
; /* temp values */
1811 int first_block
= 1;
1814 int block_cbp
= 0, pat
, block_tt
= 0;
1817 mquant
= v
->pq
; /* Lossy initialization */
1819 idx_mbmode
= get_vlc2(gb
, v
->mbmode_vlc
->table
, VC1_IF_MBMODE_VLC_BITS
, 2);
1820 if (idx_mbmode
<= 1) { // intra MB
1821 v
->is_intra
[s
->mb_x
] = 0x3f; // Set the bitfield to all 1.
1823 s
->current_picture
.motion_val
[1][s
->block_index
[0] + v
->blocks_off
][0] = 0;
1824 s
->current_picture
.motion_val
[1][s
->block_index
[0] + v
->blocks_off
][1] = 0;
1825 s
->current_picture
.mb_type
[mb_pos
+ v
->mb_off
] = MB_TYPE_INTRA
;
1827 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1828 /* Set DC scale - y and c use the same (not sure if necessary here) */
1829 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
1830 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
1831 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
] = get_bits1(gb
);
1832 mb_has_coeffs
= idx_mbmode
& 1;
1834 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_ICBPCY_VLC_BITS
, 2);
1836 for (i
= 0; i
< 6; i
++) {
1837 v
->a_avail
= v
->c_avail
= 0;
1838 v
->mb_type
[0][s
->block_index
[i
]] = 1;
1839 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1841 val
= ((cbp
>> (5 - i
)) & 1);
1842 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
1843 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
1844 if (i
== 1 || i
== 3 || s
->mb_x
)
1845 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
1847 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
1848 (i
& 4) ? v
->codingset2
: v
->codingset
);
1849 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
1851 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
1852 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
1853 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
1854 s
->dest
[dst_idx
] + off
,
1855 (i
& 4) ? s
->uvlinesize
1857 // TODO: loop filter
1860 s
->mb_intra
= v
->is_intra
[s
->mb_x
] = 0;
1861 s
->current_picture
.mb_type
[mb_pos
+ v
->mb_off
] = MB_TYPE_16x16
;
1862 for (i
= 0; i
< 6; i
++) v
->mb_type
[0][s
->block_index
[i
]] = 0;
1863 if (idx_mbmode
<= 5) { // 1-MV
1864 dmv_x
= dmv_y
= pred_flag
= 0;
1865 if (idx_mbmode
& 1) {
1866 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, &pred_flag
);
1868 ff_vc1_pred_mv(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], pred_flag
, 0);
1869 ff_vc1_mc_1mv(v
, 0);
1870 mb_has_coeffs
= !(idx_mbmode
& 2);
1872 v
->fourmvbp
= get_vlc2(gb
, v
->fourmvbp_vlc
->table
, VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 1);
1873 for (i
= 0; i
< 6; i
++) {
1875 dmv_x
= dmv_y
= pred_flag
= 0;
1876 val
= ((v
->fourmvbp
>> (3 - i
)) & 1);
1878 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, &pred_flag
);
1880 ff_vc1_pred_mv(v
, i
, dmv_x
, dmv_y
, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0], pred_flag
, 0);
1881 ff_vc1_mc_4mv_luma(v
, i
, 0, 0);
1883 ff_vc1_mc_4mv_chroma(v
, 0);
1885 mb_has_coeffs
= idx_mbmode
& 1;
1888 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1892 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1893 if (!v
->ttmbf
&& cbp
) {
1894 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
1897 for (i
= 0; i
< 6; i
++) {
1898 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1900 val
= ((cbp
>> (5 - i
)) & 1);
1901 off
= (i
& 4) ? 0 : (i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
;
1903 pat
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
1904 first_block
, s
->dest
[dst_idx
] + off
,
1905 (i
& 4) ? s
->uvlinesize
: s
->linesize
,
1906 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
),
1908 block_cbp
|= pat
<< (i
<< 2);
1909 if (!v
->ttmbf
&& ttmb
< 8) ttmb
= -1;
1914 if (s
->mb_x
== s
->mb_width
- 1)
1915 memmove(v
->is_intra_base
, v
->is_intra
, sizeof(v
->is_intra_base
[0]) * s
->mb_stride
);
1919 /** Decode one B-frame MB (in Main profile)
1921 static void vc1_decode_b_mb(VC1Context
*v
)
1923 MpegEncContext
*s
= &v
->s
;
1924 GetBitContext
*gb
= &s
->gb
;
1926 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1927 int cbp
= 0; /* cbp decoding stuff */
1928 int mqdiff
, mquant
; /* MB quantization */
1929 int ttmb
= v
->ttfrm
; /* MB Transform type */
1930 int mb_has_coeffs
= 0; /* last_flag */
1931 int index
, index1
; /* LUT indexes */
1932 int val
, sign
; /* temp values */
1933 int first_block
= 1;
1935 int skipped
, direct
;
1936 int dmv_x
[2], dmv_y
[2];
1937 int bmvtype
= BMV_TYPE_BACKWARD
;
1939 mquant
= v
->pq
; /* lossy initialization */
1943 direct
= get_bits1(gb
);
1945 direct
= v
->direct_mb_plane
[mb_pos
];
1947 skipped
= get_bits1(gb
);
1949 skipped
= v
->s
.mbskip_table
[mb_pos
];
1951 dmv_x
[0] = dmv_x
[1] = dmv_y
[0] = dmv_y
[1] = 0;
1952 for (i
= 0; i
< 6; i
++) {
1953 v
->mb_type
[0][s
->block_index
[i
]] = 0;
1954 s
->dc_val
[0][s
->block_index
[i
]] = 0;
1956 s
->current_picture
.qscale_table
[mb_pos
] = 0;
1960 GET_MVDATA(dmv_x
[0], dmv_y
[0]);
1961 dmv_x
[1] = dmv_x
[0];
1962 dmv_y
[1] = dmv_y
[0];
1964 if (skipped
|| !s
->mb_intra
) {
1965 bmvtype
= decode012(gb
);
1968 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_BACKWARD
: BMV_TYPE_FORWARD
;
1971 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_FORWARD
: BMV_TYPE_BACKWARD
;
1974 bmvtype
= BMV_TYPE_INTERPOLATED
;
1975 dmv_x
[0] = dmv_y
[0] = 0;
1979 for (i
= 0; i
< 6; i
++)
1980 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
1984 bmvtype
= BMV_TYPE_INTERPOLATED
;
1985 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
1986 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
1990 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
1993 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
1995 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
1996 dmv_x
[0] = dmv_y
[0] = dmv_x
[1] = dmv_y
[1] = 0;
1997 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
1998 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2000 if (!mb_has_coeffs
&& !s
->mb_intra
) {
2001 /* no coded blocks - effectively skipped */
2002 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2003 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2006 if (s
->mb_intra
&& !mb_has_coeffs
) {
2008 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2009 s
->ac_pred
= get_bits1(gb
);
2011 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2013 if (bmvtype
== BMV_TYPE_INTERPOLATED
) {
2014 GET_MVDATA(dmv_x
[0], dmv_y
[0]);
2015 if (!mb_has_coeffs
) {
2016 /* interpolated skipped block */
2017 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2018 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2022 ff_vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2024 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
2027 s
->ac_pred
= get_bits1(gb
);
2028 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2030 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2031 if (!v
->ttmbf
&& !s
->mb_intra
&& mb_has_coeffs
)
2032 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
2036 for (i
= 0; i
< 6; i
++) {
2037 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2039 val
= ((cbp
>> (5 - i
)) & 1);
2040 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
2041 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
2043 /* check if prediction blocks A and C are available */
2044 v
->a_avail
= v
->c_avail
= 0;
2045 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
2046 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
2047 if (i
== 1 || i
== 3 || s
->mb_x
)
2048 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
2050 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
2051 (i
& 4) ? v
->codingset2
: v
->codingset
);
2052 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
2054 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
2056 for (j
= 0; j
< 64; j
++)
2057 s
->block
[i
][j
] <<= 1;
2058 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
2059 s
->dest
[dst_idx
] + off
,
2060 i
& 4 ? s
->uvlinesize
2063 vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
2064 first_block
, s
->dest
[dst_idx
] + off
,
2065 (i
& 4) ? s
->uvlinesize
: s
->linesize
,
2066 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
), NULL
);
2067 if (!v
->ttmbf
&& ttmb
< 8)
2074 /** Decode one B-frame MB (in interlaced field B picture)
2076 static void vc1_decode_b_mb_intfi(VC1Context
*v
)
2078 MpegEncContext
*s
= &v
->s
;
2079 GetBitContext
*gb
= &s
->gb
;
2081 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2082 int cbp
= 0; /* cbp decoding stuff */
2083 int mqdiff
, mquant
; /* MB quantization */
2084 int ttmb
= v
->ttfrm
; /* MB Transform type */
2085 int mb_has_coeffs
= 0; /* last_flag */
2086 int val
; /* temp value */
2087 int first_block
= 1;
2090 int dmv_x
[2], dmv_y
[2], pred_flag
[2];
2091 int bmvtype
= BMV_TYPE_BACKWARD
;
2092 int idx_mbmode
, interpmvp
;
2094 mquant
= v
->pq
; /* Lossy initialization */
2097 idx_mbmode
= get_vlc2(gb
, v
->mbmode_vlc
->table
, VC1_IF_MBMODE_VLC_BITS
, 2);
2098 if (idx_mbmode
<= 1) { // intra MB
2099 v
->is_intra
[s
->mb_x
] = 0x3f; // Set the bitfield to all 1.
2101 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
2102 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
2103 s
->current_picture
.mb_type
[mb_pos
+ v
->mb_off
] = MB_TYPE_INTRA
;
2105 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2106 /* Set DC scale - y and c use the same (not sure if necessary here) */
2107 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
2108 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
2109 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
] = get_bits1(gb
);
2110 mb_has_coeffs
= idx_mbmode
& 1;
2112 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_ICBPCY_VLC_BITS
, 2);
2114 for (i
= 0; i
< 6; i
++) {
2115 v
->a_avail
= v
->c_avail
= 0;
2116 v
->mb_type
[0][s
->block_index
[i
]] = 1;
2117 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2119 val
= ((cbp
>> (5 - i
)) & 1);
2120 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
2121 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
2122 if (i
== 1 || i
== 3 || s
->mb_x
)
2123 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
2125 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
2126 (i
& 4) ? v
->codingset2
: v
->codingset
);
2127 if ((i
> 3) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
2129 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
2131 for (j
= 0; j
< 64; j
++)
2132 s
->block
[i
][j
] <<= 1;
2133 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
2134 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
2135 s
->dest
[dst_idx
] + off
,
2136 (i
& 4) ? s
->uvlinesize
2138 // TODO: yet to perform loop filter
2141 s
->mb_intra
= v
->is_intra
[s
->mb_x
] = 0;
2142 s
->current_picture
.mb_type
[mb_pos
+ v
->mb_off
] = MB_TYPE_16x16
;
2143 for (i
= 0; i
< 6; i
++) v
->mb_type
[0][s
->block_index
[i
]] = 0;
2145 fwd
= v
->forward_mb_plane
[mb_pos
] = get_bits1(gb
);
2147 fwd
= v
->forward_mb_plane
[mb_pos
];
2148 if (idx_mbmode
<= 5) { // 1-MV
2149 dmv_x
[0] = dmv_x
[1] = dmv_y
[0] = dmv_y
[1] = 0;
2150 pred_flag
[0] = pred_flag
[1] = 0;
2152 bmvtype
= BMV_TYPE_FORWARD
;
2154 bmvtype
= decode012(gb
);
2157 bmvtype
= BMV_TYPE_BACKWARD
;
2160 bmvtype
= BMV_TYPE_DIRECT
;
2163 bmvtype
= BMV_TYPE_INTERPOLATED
;
2164 interpmvp
= get_bits1(gb
);
2167 v
->bmvtype
= bmvtype
;
2168 if (bmvtype
!= BMV_TYPE_DIRECT
&& idx_mbmode
& 1) {
2169 get_mvdata_interlaced(v
, &dmv_x
[bmvtype
== BMV_TYPE_BACKWARD
], &dmv_y
[bmvtype
== BMV_TYPE_BACKWARD
], &pred_flag
[bmvtype
== BMV_TYPE_BACKWARD
]);
2171 if (bmvtype
== BMV_TYPE_INTERPOLATED
&& interpmvp
) {
2172 get_mvdata_interlaced(v
, &dmv_x
[1], &dmv_y
[1], &pred_flag
[1]);
2174 if (bmvtype
== BMV_TYPE_DIRECT
) {
2175 dmv_x
[0] = dmv_y
[0] = pred_flag
[0] = 0;
2176 dmv_x
[1] = dmv_y
[1] = pred_flag
[0] = 0;
2178 ff_vc1_pred_b_mv_intfi(v
, 0, dmv_x
, dmv_y
, 1, pred_flag
);
2179 vc1_b_mc(v
, dmv_x
, dmv_y
, (bmvtype
== BMV_TYPE_DIRECT
), bmvtype
);
2180 mb_has_coeffs
= !(idx_mbmode
& 2);
2183 bmvtype
= BMV_TYPE_FORWARD
;
2184 v
->bmvtype
= bmvtype
;
2185 v
->fourmvbp
= get_vlc2(gb
, v
->fourmvbp_vlc
->table
, VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 1);
2186 for (i
= 0; i
< 6; i
++) {
2188 dmv_x
[0] = dmv_y
[0] = pred_flag
[0] = 0;
2189 dmv_x
[1] = dmv_y
[1] = pred_flag
[1] = 0;
2190 val
= ((v
->fourmvbp
>> (3 - i
)) & 1);
2192 get_mvdata_interlaced(v
, &dmv_x
[bmvtype
== BMV_TYPE_BACKWARD
],
2193 &dmv_y
[bmvtype
== BMV_TYPE_BACKWARD
],
2194 &pred_flag
[bmvtype
== BMV_TYPE_BACKWARD
]);
2196 ff_vc1_pred_b_mv_intfi(v
, i
, dmv_x
, dmv_y
, 0, pred_flag
);
2197 ff_vc1_mc_4mv_luma(v
, i
, bmvtype
== BMV_TYPE_BACKWARD
, 0);
2199 ff_vc1_mc_4mv_chroma(v
, bmvtype
== BMV_TYPE_BACKWARD
);
2201 mb_has_coeffs
= idx_mbmode
& 1;
2204 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2208 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2209 if (!v
->ttmbf
&& cbp
) {
2210 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
2213 for (i
= 0; i
< 6; i
++) {
2214 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2216 val
= ((cbp
>> (5 - i
)) & 1);
2217 off
= (i
& 4) ? 0 : (i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
;
2219 vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
2220 first_block
, s
->dest
[dst_idx
] + off
,
2221 (i
& 4) ? s
->uvlinesize
: s
->linesize
,
2222 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
), NULL
);
2223 if (!v
->ttmbf
&& ttmb
< 8)
2231 /** Decode one B-frame MB (in interlaced frame B picture)
2233 static int vc1_decode_b_mb_intfr(VC1Context
*v
)
2235 MpegEncContext
*s
= &v
->s
;
2236 GetBitContext
*gb
= &s
->gb
;
2238 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2239 int cbp
= 0; /* cbp decoding stuff */
2240 int mqdiff
, mquant
; /* MB quantization */
2241 int ttmb
= v
->ttfrm
; /* MB Transform type */
2242 int mvsw
= 0; /* motion vector switch */
2243 int mb_has_coeffs
= 1; /* last_flag */
2244 int dmv_x
, dmv_y
; /* Differential MV components */
2245 int val
; /* temp value */
2246 int first_block
= 1;
2248 int skipped
, direct
, twomv
= 0;
2249 int block_cbp
= 0, pat
, block_tt
= 0;
2250 int idx_mbmode
= 0, mvbp
;
2251 int stride_y
, fieldtx
;
2252 int bmvtype
= BMV_TYPE_BACKWARD
;
2255 mquant
= v
->pq
; /* Lossy initialization */
2258 skipped
= get_bits1(gb
);
2260 skipped
= v
->s
.mbskip_table
[mb_pos
];
2263 idx_mbmode
= get_vlc2(gb
, v
->mbmode_vlc
->table
, VC1_INTFR_NON4MV_MBMODE_VLC_BITS
, 2);
2264 if (ff_vc1_mbmode_intfrp
[0][idx_mbmode
][0] == MV_PMODE_INTFR_2MV_FIELD
) {
2266 v
->blk_mv_type
[s
->block_index
[0]] = 1;
2267 v
->blk_mv_type
[s
->block_index
[1]] = 1;
2268 v
->blk_mv_type
[s
->block_index
[2]] = 1;
2269 v
->blk_mv_type
[s
->block_index
[3]] = 1;
2271 v
->blk_mv_type
[s
->block_index
[0]] = 0;
2272 v
->blk_mv_type
[s
->block_index
[1]] = 0;
2273 v
->blk_mv_type
[s
->block_index
[2]] = 0;
2274 v
->blk_mv_type
[s
->block_index
[3]] = 0;
2279 direct
= get_bits1(gb
);
2281 direct
= v
->direct_mb_plane
[mb_pos
];
2284 s
->mv
[0][0][0] = s
->current_picture
.motion_val
[0][s
->block_index
[0]][0] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[0]][0], v
->bfraction
, 0, s
->quarter_sample
);
2285 s
->mv
[0][0][1] = s
->current_picture
.motion_val
[0][s
->block_index
[0]][1] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[0]][1], v
->bfraction
, 0, s
->quarter_sample
);
2286 s
->mv
[1][0][0] = s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[0]][0], v
->bfraction
, 1, s
->quarter_sample
);
2287 s
->mv
[1][0][1] = s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[0]][1], v
->bfraction
, 1, s
->quarter_sample
);
2290 s
->mv
[0][2][0] = s
->current_picture
.motion_val
[0][s
->block_index
[2]][0] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[2]][0], v
->bfraction
, 0, s
->quarter_sample
);
2291 s
->mv
[0][2][1] = s
->current_picture
.motion_val
[0][s
->block_index
[2]][1] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[2]][1], v
->bfraction
, 0, s
->quarter_sample
);
2292 s
->mv
[1][2][0] = s
->current_picture
.motion_val
[1][s
->block_index
[2]][0] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[2]][0], v
->bfraction
, 1, s
->quarter_sample
);
2293 s
->mv
[1][2][1] = s
->current_picture
.motion_val
[1][s
->block_index
[2]][1] = scale_mv(s
->next_picture
.motion_val
[1][s
->block_index
[2]][1], v
->bfraction
, 1, s
->quarter_sample
);
2295 for (i
= 1; i
< 4; i
+= 2) {
2296 s
->mv
[0][i
][0] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][0] = s
->mv
[0][i
-1][0];
2297 s
->mv
[0][i
][1] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][1] = s
->mv
[0][i
-1][1];
2298 s
->mv
[1][i
][0] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][0] = s
->mv
[1][i
-1][0];
2299 s
->mv
[1][i
][1] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][1] = s
->mv
[1][i
-1][1];
2302 for (i
= 1; i
< 4; i
++) {
2303 s
->mv
[0][i
][0] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][0] = s
->mv
[0][0][0];
2304 s
->mv
[0][i
][1] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][1] = s
->mv
[0][0][1];
2305 s
->mv
[1][i
][0] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][0] = s
->mv
[1][0][0];
2306 s
->mv
[1][i
][1] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][1] = s
->mv
[1][0][1];
2311 if (ff_vc1_mbmode_intfrp
[0][idx_mbmode
][0] == MV_PMODE_INTFR_INTRA
) { // intra MB
2312 for (i
= 0; i
< 4; i
++) {
2313 s
->mv
[0][i
][0] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][0] = 0;
2314 s
->mv
[0][i
][1] = s
->current_picture
.motion_val
[0][s
->block_index
[i
]][1] = 0;
2315 s
->mv
[1][i
][0] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][0] = 0;
2316 s
->mv
[1][i
][1] = s
->current_picture
.motion_val
[1][s
->block_index
[i
]][1] = 0;
2318 v
->is_intra
[s
->mb_x
] = 0x3f; // Set the bitfield to all 1.
2320 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
2321 fieldtx
= v
->fieldtx_plane
[mb_pos
] = get_bits1(gb
);
2322 mb_has_coeffs
= get_bits1(gb
);
2324 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2325 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
] = get_bits1(gb
);
2327 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2328 /* Set DC scale - y and c use the same (not sure if necessary here) */
2329 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
2330 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
2332 for (i
= 0; i
< 6; i
++) {
2333 v
->a_avail
= v
->c_avail
= 0;
2334 v
->mb_type
[0][s
->block_index
[i
]] = 1;
2335 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2337 val
= ((cbp
>> (5 - i
)) & 1);
2338 if (i
== 2 || i
== 3 || !s
->first_slice_line
)
2339 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
2340 if (i
== 1 || i
== 3 || s
->mb_x
)
2341 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
2343 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
,
2344 (i
& 4) ? v
->codingset2
: v
->codingset
);
2345 if (i
> 3 && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
2347 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
2349 stride_y
= s
->linesize
<< fieldtx
;
2350 off
= (fieldtx
) ? ((i
& 1) * 8) + ((i
& 2) >> 1) * s
->linesize
: (i
& 1) * 8 + 4 * (i
& 2) * s
->linesize
;
2352 stride_y
= s
->uvlinesize
;
2355 s
->idsp
.put_signed_pixels_clamped(s
->block
[i
],
2356 s
->dest
[dst_idx
] + off
,
2360 s
->mb_intra
= v
->is_intra
[s
->mb_x
] = 0;
2362 if (skipped
|| !s
->mb_intra
) {
2363 bmvtype
= decode012(gb
);
2366 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_BACKWARD
: BMV_TYPE_FORWARD
;
2369 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_FORWARD
: BMV_TYPE_BACKWARD
;
2372 bmvtype
= BMV_TYPE_INTERPOLATED
;
2376 if (twomv
&& bmvtype
!= BMV_TYPE_INTERPOLATED
)
2377 mvsw
= get_bits1(gb
);
2380 if (!skipped
) { // inter MB
2381 mb_has_coeffs
= ff_vc1_mbmode_intfrp
[0][idx_mbmode
][3];
2383 cbp
= 1 + get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2385 if (bmvtype
== BMV_TYPE_INTERPOLATED
&& twomv
) {
2386 v
->fourmvbp
= get_vlc2(gb
, v
->fourmvbp_vlc
->table
, VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 1);
2387 } else if (bmvtype
== BMV_TYPE_INTERPOLATED
|| twomv
) {
2388 v
->twomvbp
= get_vlc2(gb
, v
->twomvbp_vlc
->table
, VC1_2MV_BLOCK_PATTERN_VLC_BITS
, 1);
2392 for (i
= 0; i
< 6; i
++)
2393 v
->mb_type
[0][s
->block_index
[i
]] = 0;
2394 fieldtx
= v
->fieldtx_plane
[mb_pos
] = ff_vc1_mbmode_intfrp
[0][idx_mbmode
][1];
2395 /* for all motion vector read MVDATA and motion compensate each block */
2399 for (i
= 0; i
< 4; i
++) {
2400 ff_vc1_mc_4mv_luma(v
, i
, 0, 0);
2401 ff_vc1_mc_4mv_luma(v
, i
, 1, 1);
2403 ff_vc1_mc_4mv_chroma4(v
, 0, 0, 0);
2404 ff_vc1_mc_4mv_chroma4(v
, 1, 1, 1);
2406 ff_vc1_mc_1mv(v
, 0);
2407 ff_vc1_interp_mc(v
);
2409 } else if (twomv
&& bmvtype
== BMV_TYPE_INTERPOLATED
) {
2411 for (i
= 0; i
< 4; i
++) {
2414 val
= ((mvbp
>> (3 - i
)) & 1);
2416 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2418 ff_vc1_pred_mv_intfr(v
, j
, dmv_x
, dmv_y
, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], dir
);
2419 ff_vc1_mc_4mv_luma(v
, j
, dir
, dir
);
2420 ff_vc1_mc_4mv_luma(v
, j
+1, dir
, dir
);
2423 ff_vc1_mc_4mv_chroma4(v
, 0, 0, 0);
2424 ff_vc1_mc_4mv_chroma4(v
, 1, 1, 1);
2425 } else if (bmvtype
== BMV_TYPE_INTERPOLATED
) {
2429 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2431 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
2432 ff_vc1_mc_1mv(v
, 0);
2436 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2438 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 1);
2439 ff_vc1_interp_mc(v
);
2441 dir
= bmvtype
== BMV_TYPE_BACKWARD
;
2448 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2449 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], dir
);
2453 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2454 ff_vc1_pred_mv_intfr(v
, 2, dmv_x
, dmv_y
, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], dir2
);
2457 for (i
= 0; i
< 2; i
++) {
2458 s
->mv
[dir
][i
+2][0] = s
->mv
[dir
][i
][0] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
+2]][0] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
]][0];
2459 s
->mv
[dir
][i
+2][1] = s
->mv
[dir
][i
][1] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
+2]][1] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
]][1];
2460 s
->mv
[dir2
][i
+2][0] = s
->mv
[dir2
][i
][0] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
]][0] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
+2]][0];
2461 s
->mv
[dir2
][i
+2][1] = s
->mv
[dir2
][i
][1] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
]][1] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
+2]][1];
2464 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], !dir
);
2465 ff_vc1_pred_mv_intfr(v
, 2, 0, 0, 2, v
->range_x
, v
->range_y
, v
->mb_type
[0], !dir
);
2468 ff_vc1_mc_4mv_luma(v
, 0, dir
, 0);
2469 ff_vc1_mc_4mv_luma(v
, 1, dir
, 0);
2470 ff_vc1_mc_4mv_luma(v
, 2, dir2
, 0);
2471 ff_vc1_mc_4mv_luma(v
, 3, dir2
, 0);
2472 ff_vc1_mc_4mv_chroma4(v
, dir
, dir2
, 0);
2474 dir
= bmvtype
== BMV_TYPE_BACKWARD
;
2476 mvbp
= ff_vc1_mbmode_intfrp
[0][idx_mbmode
][2];
2479 get_mvdata_interlaced(v
, &dmv_x
, &dmv_y
, 0);
2481 ff_vc1_pred_mv_intfr(v
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], dir
);
2482 v
->blk_mv_type
[s
->block_index
[0]] = 1;
2483 v
->blk_mv_type
[s
->block_index
[1]] = 1;
2484 v
->blk_mv_type
[s
->block_index
[2]] = 1;
2485 v
->blk_mv_type
[s
->block_index
[3]] = 1;
2486 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 2, v
->range_x
, v
->range_y
, 0, !dir
);
2487 for (i
= 0; i
< 2; i
++) {
2488 s
->mv
[!dir
][i
+2][0] = s
->mv
[!dir
][i
][0] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
+2]][0] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
]][0];
2489 s
->mv
[!dir
][i
+2][1] = s
->mv
[!dir
][i
][1] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
+2]][1] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
]][1];
2491 ff_vc1_mc_1mv(v
, dir
);
2495 GET_MQUANT(); // p. 227
2496 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2497 if (!v
->ttmbf
&& cbp
)
2498 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
2499 for (i
= 0; i
< 6; i
++) {
2500 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2502 val
= ((cbp
>> (5 - i
)) & 1);
2504 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
2506 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + ((i
> 1) * s
->linesize
));
2508 pat
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
,
2509 first_block
, s
->dest
[dst_idx
] + off
,
2510 (i
& 4) ? s
->uvlinesize
: (s
->linesize
<< fieldtx
),
2511 (i
& 4) && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
), &block_tt
);
2512 block_cbp
|= pat
<< (i
<< 2);
2513 if (!v
->ttmbf
&& ttmb
< 8)
2521 for (i
= 0; i
< 6; i
++) {
2522 v
->mb_type
[0][s
->block_index
[i
]] = 0;
2523 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2525 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_SKIP
;
2526 s
->current_picture
.qscale_table
[mb_pos
] = 0;
2527 v
->blk_mv_type
[s
->block_index
[0]] = 0;
2528 v
->blk_mv_type
[s
->block_index
[1]] = 0;
2529 v
->blk_mv_type
[s
->block_index
[2]] = 0;
2530 v
->blk_mv_type
[s
->block_index
[3]] = 0;
2533 if (bmvtype
== BMV_TYPE_INTERPOLATED
) {
2534 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 0);
2535 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], 1);
2537 dir
= bmvtype
== BMV_TYPE_BACKWARD
;
2538 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0], dir
);
2543 for (i
= 0; i
< 2; i
++) {
2544 s
->mv
[dir
][i
+2][0] = s
->mv
[dir
][i
][0] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
+2]][0] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
]][0];
2545 s
->mv
[dir
][i
+2][1] = s
->mv
[dir
][i
][1] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
+2]][1] = s
->current_picture
.motion_val
[dir
][s
->block_index
[i
]][1];
2546 s
->mv
[dir2
][i
+2][0] = s
->mv
[dir2
][i
][0] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
]][0] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
+2]][0];
2547 s
->mv
[dir2
][i
+2][1] = s
->mv
[dir2
][i
][1] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
]][1] = s
->current_picture
.motion_val
[dir2
][s
->block_index
[i
+2]][1];
2550 v
->blk_mv_type
[s
->block_index
[0]] = 1;
2551 v
->blk_mv_type
[s
->block_index
[1]] = 1;
2552 v
->blk_mv_type
[s
->block_index
[2]] = 1;
2553 v
->blk_mv_type
[s
->block_index
[3]] = 1;
2554 ff_vc1_pred_mv_intfr(v
, 0, 0, 0, 2, v
->range_x
, v
->range_y
, 0, !dir
);
2555 for (i
= 0; i
< 2; i
++) {
2556 s
->mv
[!dir
][i
+2][0] = s
->mv
[!dir
][i
][0] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
+2]][0] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
]][0];
2557 s
->mv
[!dir
][i
+2][1] = s
->mv
[!dir
][i
][1] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
+2]][1] = s
->current_picture
.motion_val
[!dir
][s
->block_index
[i
]][1];
2563 ff_vc1_mc_1mv(v
, dir
);
2564 if (direct
|| bmvtype
== BMV_TYPE_INTERPOLATED
) {
2565 ff_vc1_interp_mc(v
);
2569 if (s
->mb_x
== s
->mb_width
- 1)
2570 memmove(v
->is_intra_base
, v
->is_intra
, sizeof(v
->is_intra_base
[0]) * s
->mb_stride
);
2571 v
->cbp
[s
->mb_x
] = block_cbp
;
2572 v
->ttblk
[s
->mb_x
] = block_tt
;
2576 /** Decode blocks of I-frame
2578 static void vc1_decode_i_blocks(VC1Context
*v
)
2581 MpegEncContext
*s
= &v
->s
;
2586 /* select coding mode used for VLC tables selection */
2587 switch (v
->y_ac_table_index
) {
2589 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2592 v
->codingset
= CS_HIGH_MOT_INTRA
;
2595 v
->codingset
= CS_MID_RATE_INTRA
;
2599 switch (v
->c_ac_table_index
) {
2601 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2604 v
->codingset2
= CS_HIGH_MOT_INTER
;
2607 v
->codingset2
= CS_MID_RATE_INTER
;
2611 /* Set DC scale - y and c use the same */
2612 s
->y_dc_scale
= s
->y_dc_scale_table
[v
->pq
];
2613 s
->c_dc_scale
= s
->c_dc_scale_table
[v
->pq
];
2616 s
->mb_x
= s
->mb_y
= 0;
2618 s
->first_slice_line
= 1;
2619 for (s
->mb_y
= 0; s
->mb_y
< s
->end_mb_y
; s
->mb_y
++) {
2621 init_block_index(v
);
2622 for (; s
->mb_x
< v
->end_mb_x
; s
->mb_x
++) {
2624 ff_update_block_index(s
);
2625 dst
[0] = s
->dest
[0];
2626 dst
[1] = dst
[0] + 8;
2627 dst
[2] = s
->dest
[0] + s
->linesize
* 8;
2628 dst
[3] = dst
[2] + 8;
2629 dst
[4] = s
->dest
[1];
2630 dst
[5] = s
->dest
[2];
2631 s
->bdsp
.clear_blocks(s
->block
[0]);
2632 mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_width
;
2633 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
2634 s
->current_picture
.qscale_table
[mb_pos
] = v
->pq
;
2635 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
2636 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
2638 // do actual MB decoding and displaying
2639 cbp
= get_vlc2(&v
->s
.gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
2640 v
->s
.ac_pred
= get_bits1(&v
->s
.gb
);
2642 for (k
= 0; k
< 6; k
++) {
2643 val
= ((cbp
>> (5 - k
)) & 1);
2646 int pred
= vc1_coded_block_pred(&v
->s
, k
, &coded_val
);
2650 cbp
|= val
<< (5 - k
);
2652 vc1_decode_i_block(v
, s
->block
[k
], k
, val
, (k
< 4) ? v
->codingset
: v
->codingset2
);
2654 if (k
> 3 && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
2656 v
->vc1dsp
.vc1_inv_trans_8x8(s
->block
[k
]);
2657 if (v
->pq
>= 9 && v
->overlap
) {
2659 for (j
= 0; j
< 64; j
++)
2660 s
->block
[k
][j
] <<= 1;
2661 s
->idsp
.put_signed_pixels_clamped(s
->block
[k
], dst
[k
],
2662 k
& 4 ? s
->uvlinesize
2666 for (j
= 0; j
< 64; j
++)
2667 s
->block
[k
][j
] = (s
->block
[k
][j
] - 64) << 1;
2668 s
->idsp
.put_pixels_clamped(s
->block
[k
], dst
[k
],
2669 k
& 4 ? s
->uvlinesize
2674 if (v
->pq
>= 9 && v
->overlap
) {
2676 v
->vc1dsp
.vc1_h_overlap(s
->dest
[0], s
->linesize
);
2677 v
->vc1dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
2678 if (!(s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
2679 v
->vc1dsp
.vc1_h_overlap(s
->dest
[1], s
->uvlinesize
);
2680 v
->vc1dsp
.vc1_h_overlap(s
->dest
[2], s
->uvlinesize
);
2683 v
->vc1dsp
.vc1_h_overlap(s
->dest
[0] + 8, s
->linesize
);
2684 v
->vc1dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
2685 if (!s
->first_slice_line
) {
2686 v
->vc1dsp
.vc1_v_overlap(s
->dest
[0], s
->linesize
);
2687 v
->vc1dsp
.vc1_v_overlap(s
->dest
[0] + 8, s
->linesize
);
2688 if (!(s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
2689 v
->vc1dsp
.vc1_v_overlap(s
->dest
[1], s
->uvlinesize
);
2690 v
->vc1dsp
.vc1_v_overlap(s
->dest
[2], s
->uvlinesize
);
2693 v
->vc1dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
2694 v
->vc1dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
2696 if (v
->s
.loop_filter
)
2697 ff_vc1_loop_filter_iblk(v
, v
->pq
);
2699 if (get_bits_count(&s
->gb
) > v
->bits
) {
2700 ff_er_add_slice(&s
->er
, 0, 0, s
->mb_x
, s
->mb_y
, ER_MB_ERROR
);
2701 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i\n",
2702 get_bits_count(&s
->gb
), v
->bits
);
2706 if (!v
->s
.loop_filter
)
2707 ff_mpeg_draw_horiz_band(s
, s
->mb_y
* 16, 16);
2709 ff_mpeg_draw_horiz_band(s
, (s
->mb_y
- 1) * 16, 16);
2711 s
->first_slice_line
= 0;
2713 if (v
->s
.loop_filter
)
2714 ff_mpeg_draw_horiz_band(s
, (s
->end_mb_y
- 1) * 16, 16);
2716 /* This is intentionally mb_height and not end_mb_y - unlike in advanced
2717 * profile, these only differ are when decoding MSS2 rectangles. */
2718 ff_er_add_slice(&s
->er
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, ER_MB_END
);
2721 /** Decode blocks of I-frame for advanced profile
2723 static void vc1_decode_i_blocks_adv(VC1Context
*v
)
2726 MpegEncContext
*s
= &v
->s
;
2732 GetBitContext
*gb
= &s
->gb
;
2734 /* select coding mode used for VLC tables selection */
2735 switch (v
->y_ac_table_index
) {
2737 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2740 v
->codingset
= CS_HIGH_MOT_INTRA
;
2743 v
->codingset
= CS_MID_RATE_INTRA
;
2747 switch (v
->c_ac_table_index
) {
2749 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2752 v
->codingset2
= CS_HIGH_MOT_INTER
;
2755 v
->codingset2
= CS_MID_RATE_INTER
;
2760 s
->mb_x
= s
->mb_y
= 0;
2762 s
->first_slice_line
= 1;
2763 s
->mb_y
= s
->start_mb_y
;
2764 if (s
->start_mb_y
) {
2766 init_block_index(v
);
2767 memset(&s
->coded_block
[s
->block_index
[0] - s
->b8_stride
], 0,
2768 (1 + s
->b8_stride
) * sizeof(*s
->coded_block
));
2770 for (; s
->mb_y
< s
->end_mb_y
; s
->mb_y
++) {
2772 init_block_index(v
);
2773 for (;s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2774 int16_t (*block
)[64] = v
->block
[v
->cur_blk_idx
];
2775 ff_update_block_index(s
);
2776 s
->bdsp
.clear_blocks(block
[0]);
2777 mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2778 s
->current_picture
.mb_type
[mb_pos
+ v
->mb_off
] = MB_TYPE_INTRA
;
2779 s
->current_picture
.motion_val
[1][s
->block_index
[0] + v
->blocks_off
][0] = 0;
2780 s
->current_picture
.motion_val
[1][s
->block_index
[0] + v
->blocks_off
][1] = 0;
2782 // do actual MB decoding and displaying
2783 if (v
->fieldtx_is_raw
)
2784 v
->fieldtx_plane
[mb_pos
] = get_bits1(&v
->s
.gb
);
2785 cbp
= get_vlc2(&v
->s
.gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
2786 if (v
->acpred_is_raw
)
2787 v
->s
.ac_pred
= get_bits1(&v
->s
.gb
);
2789 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
];
2791 if (v
->condover
== CONDOVER_SELECT
&& v
->overflg_is_raw
)
2792 v
->over_flags_plane
[mb_pos
] = get_bits1(&v
->s
.gb
);
2796 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2797 /* Set DC scale - y and c use the same */
2798 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
2799 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
2801 for (k
= 0; k
< 6; k
++) {
2802 val
= ((cbp
>> (5 - k
)) & 1);
2805 int pred
= vc1_coded_block_pred(&v
->s
, k
, &coded_val
);
2809 cbp
|= val
<< (5 - k
);
2811 v
->a_avail
= !s
->first_slice_line
|| (k
== 2 || k
== 3);
2812 v
->c_avail
= !!s
->mb_x
|| (k
== 1 || k
== 3);
2814 vc1_decode_i_block_adv(v
, block
[k
], k
, val
,
2815 (k
< 4) ? v
->codingset
: v
->codingset2
, mquant
);
2817 if (k
> 3 && (s
->avctx
->flags
& AV_CODEC_FLAG_GRAY
))
2819 v
->vc1dsp
.vc1_inv_trans_8x8(block
[k
]);
2822 ff_vc1_smooth_overlap_filter_iblk(v
);
2823 vc1_put_signed_blocks_clamped(v
);
2824 if (v
->s
.loop_filter
)
2825 ff_vc1_loop_filter_iblk_delayed(v
, v
->pq
);
2827 if (get_bits_count(&s
->gb
) > v
->bits
) {
2828 // TODO: may need modification to handle slice coding
2829 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
, s
->mb_x
, s
->mb_y
, ER_MB_ERROR
);
2830 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i\n",
2831 get_bits_count(&s
->gb
), v
->bits
);
2835 if (!v
->s
.loop_filter
)
2836 ff_mpeg_draw_horiz_band(s
, s
->mb_y
* 16, 16);
2838 ff_mpeg_draw_horiz_band(s
, (s
->mb_y
-1) * 16, 16);
2839 s
->first_slice_line
= 0;
2842 /* raw bottom MB row */
2844 init_block_index(v
);
2846 for (;s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2847 ff_update_block_index(s
);
2848 vc1_put_signed_blocks_clamped(v
);
2849 if (v
->s
.loop_filter
)
2850 ff_vc1_loop_filter_iblk_delayed(v
, v
->pq
);
2852 if (v
->s
.loop_filter
)
2853 ff_mpeg_draw_horiz_band(s
, (s
->end_mb_y
-1)*16, 16);
2854 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
<< v
->field_mode
, s
->mb_width
- 1,
2855 (s
->end_mb_y
<< v
->field_mode
) - 1, ER_MB_END
);
2858 static void vc1_decode_p_blocks(VC1Context
*v
)
2860 MpegEncContext
*s
= &v
->s
;
2861 int apply_loop_filter
;
2863 /* select coding mode used for VLC tables selection */
2864 switch (v
->c_ac_table_index
) {
2866 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2869 v
->codingset
= CS_HIGH_MOT_INTRA
;
2872 v
->codingset
= CS_MID_RATE_INTRA
;
2876 switch (v
->c_ac_table_index
) {
2878 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2881 v
->codingset2
= CS_HIGH_MOT_INTER
;
2884 v
->codingset2
= CS_MID_RATE_INTER
;
2888 apply_loop_filter
= s
->loop_filter
&& !(s
->avctx
->skip_loop_filter
>= AVDISCARD_NONKEY
) &&
2889 v
->fcm
== PROGRESSIVE
;
2890 s
->first_slice_line
= 1;
2891 memset(v
->cbp_base
, 0, sizeof(v
->cbp_base
[0])*2*s
->mb_stride
);
2892 for (s
->mb_y
= s
->start_mb_y
; s
->mb_y
< s
->end_mb_y
; s
->mb_y
++) {
2894 init_block_index(v
);
2895 for (; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2896 ff_update_block_index(s
);
2898 if (v
->fcm
== ILACE_FIELD
)
2899 vc1_decode_p_mb_intfi(v
);
2900 else if (v
->fcm
== ILACE_FRAME
)
2901 vc1_decode_p_mb_intfr(v
);
2902 else vc1_decode_p_mb(v
);
2903 if (s
->mb_y
!= s
->start_mb_y
&& apply_loop_filter
)
2904 ff_vc1_apply_p_loop_filter(v
);
2905 if (get_bits_count(&s
->gb
) > v
->bits
|| get_bits_count(&s
->gb
) < 0) {
2906 // TODO: may need modification to handle slice coding
2907 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
, s
->mb_x
, s
->mb_y
, ER_MB_ERROR
);
2908 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i at %ix%i\n",
2909 get_bits_count(&s
->gb
), v
->bits
, s
->mb_x
, s
->mb_y
);
2913 memmove(v
->cbp_base
, v
->cbp
, sizeof(v
->cbp_base
[0]) * s
->mb_stride
);
2914 memmove(v
->ttblk_base
, v
->ttblk
, sizeof(v
->ttblk_base
[0]) * s
->mb_stride
);
2915 memmove(v
->is_intra_base
, v
->is_intra
, sizeof(v
->is_intra_base
[0]) * s
->mb_stride
);
2916 memmove(v
->luma_mv_base
, v
->luma_mv
, sizeof(v
->luma_mv_base
[0]) * s
->mb_stride
);
2917 if (s
->mb_y
!= s
->start_mb_y
) ff_mpeg_draw_horiz_band(s
, (s
->mb_y
- 1) * 16, 16);
2918 s
->first_slice_line
= 0;
2920 if (apply_loop_filter
) {
2922 init_block_index(v
);
2923 for (; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2924 ff_update_block_index(s
);
2925 ff_vc1_apply_p_loop_filter(v
);
2928 if (s
->end_mb_y
>= s
->start_mb_y
)
2929 ff_mpeg_draw_horiz_band(s
, (s
->end_mb_y
- 1) * 16, 16);
2930 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
<< v
->field_mode
, s
->mb_width
- 1,
2931 (s
->end_mb_y
<< v
->field_mode
) - 1, ER_MB_END
);
2934 static void vc1_decode_b_blocks(VC1Context
*v
)
2936 MpegEncContext
*s
= &v
->s
;
2938 /* select coding mode used for VLC tables selection */
2939 switch (v
->c_ac_table_index
) {
2941 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2944 v
->codingset
= CS_HIGH_MOT_INTRA
;
2947 v
->codingset
= CS_MID_RATE_INTRA
;
2951 switch (v
->c_ac_table_index
) {
2953 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2956 v
->codingset2
= CS_HIGH_MOT_INTER
;
2959 v
->codingset2
= CS_MID_RATE_INTER
;
2963 s
->first_slice_line
= 1;
2964 for (s
->mb_y
= s
->start_mb_y
; s
->mb_y
< s
->end_mb_y
; s
->mb_y
++) {
2966 init_block_index(v
);
2967 for (; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2968 ff_update_block_index(s
);
2970 if (v
->fcm
== ILACE_FIELD
)
2971 vc1_decode_b_mb_intfi(v
);
2972 else if (v
->fcm
== ILACE_FRAME
)
2973 vc1_decode_b_mb_intfr(v
);
2976 if (get_bits_count(&s
->gb
) > v
->bits
|| get_bits_count(&s
->gb
) < 0) {
2977 // TODO: may need modification to handle slice coding
2978 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
, s
->mb_x
, s
->mb_y
, ER_MB_ERROR
);
2979 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i at %ix%i\n",
2980 get_bits_count(&s
->gb
), v
->bits
, s
->mb_x
, s
->mb_y
);
2983 if (v
->s
.loop_filter
)
2984 ff_vc1_loop_filter_iblk(v
, v
->pq
);
2986 if (!v
->s
.loop_filter
)
2987 ff_mpeg_draw_horiz_band(s
, s
->mb_y
* 16, 16);
2989 ff_mpeg_draw_horiz_band(s
, (s
->mb_y
- 1) * 16, 16);
2990 s
->first_slice_line
= 0;
2992 if (v
->s
.loop_filter
)
2993 ff_mpeg_draw_horiz_band(s
, (s
->end_mb_y
- 1) * 16, 16);
2994 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
<< v
->field_mode
, s
->mb_width
- 1,
2995 (s
->end_mb_y
<< v
->field_mode
) - 1, ER_MB_END
);
2998 static void vc1_decode_skip_blocks(VC1Context
*v
)
3000 MpegEncContext
*s
= &v
->s
;
3002 if (!v
->s
.last_picture
.f
->data
[0])
3005 ff_er_add_slice(&s
->er
, 0, s
->start_mb_y
, s
->mb_width
- 1, s
->end_mb_y
- 1, ER_MB_END
);
3006 s
->first_slice_line
= 1;
3007 for (s
->mb_y
= s
->start_mb_y
; s
->mb_y
< s
->end_mb_y
; s
->mb_y
++) {
3009 init_block_index(v
);
3010 ff_update_block_index(s
);
3011 memcpy(s
->dest
[0], s
->last_picture
.f
->data
[0] + s
->mb_y
* 16 * s
->linesize
, s
->linesize
* 16);
3012 memcpy(s
->dest
[1], s
->last_picture
.f
->data
[1] + s
->mb_y
* 8 * s
->uvlinesize
, s
->uvlinesize
* 8);
3013 memcpy(s
->dest
[2], s
->last_picture
.f
->data
[2] + s
->mb_y
* 8 * s
->uvlinesize
, s
->uvlinesize
* 8);
3014 ff_mpeg_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3015 s
->first_slice_line
= 0;
3017 s
->pict_type
= AV_PICTURE_TYPE_P
;
3020 void ff_vc1_decode_blocks(VC1Context
*v
)
3023 v
->s
.esc3_level_length
= 0;
3025 ff_intrax8_decode_picture(&v
->x8
, &v
->s
.current_picture
,
3026 &v
->s
.gb
, &v
->s
.mb_x
, &v
->s
.mb_y
,
3027 2 * v
->pq
+ v
->halfpq
, v
->pq
* !v
->pquantizer
,
3028 v
->s
.loop_filter
, v
->s
.low_delay
);
3030 ff_er_add_slice(&v
->s
.er
, 0, 0,
3031 (v
->s
.mb_x
>> 1) - 1, (v
->s
.mb_y
>> 1) - 1,
3035 v
->left_blk_idx
= -1;
3036 v
->topleft_blk_idx
= 1;
3038 switch (v
->s
.pict_type
) {
3039 case AV_PICTURE_TYPE_I
:
3040 if (v
->profile
== PROFILE_ADVANCED
)
3041 vc1_decode_i_blocks_adv(v
);
3043 vc1_decode_i_blocks(v
);
3045 case AV_PICTURE_TYPE_P
:
3046 if (v
->p_frame_skipped
)
3047 vc1_decode_skip_blocks(v
);
3049 vc1_decode_p_blocks(v
);
3051 case AV_PICTURE_TYPE_B
:
3053 if (v
->profile
== PROFILE_ADVANCED
)
3054 vc1_decode_i_blocks_adv(v
);
3056 vc1_decode_i_blocks(v
);
3058 vc1_decode_b_blocks(v
);