2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2006-2007 Konstantin Shishkov
4 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * VC-1 and WMV3 decoder
30 #include "mpegvideo.h"
33 #include "vc1acdata.h"
34 #include "msmpeg4data.h"
36 #include "simple_idct.h"
41 #define MB_INTRA_VLC_BITS 9
44 static const uint16_t table_mb_intra
[64][2];
48 * Init VC-1 specific tables and VC1Context members
49 * @param v The VC1Context to initialize
52 static int vc1_init_common(VC1Context
*v
)
57 v
->hrd_rate
= v
->hrd_buffer
= NULL
;
63 init_vlc(&ff_vc1_bfraction_vlc
, VC1_BFRACTION_VLC_BITS
, 23,
64 ff_vc1_bfraction_bits
, 1, 1,
65 ff_vc1_bfraction_codes
, 1, 1, 1);
66 init_vlc(&ff_vc1_norm2_vlc
, VC1_NORM2_VLC_BITS
, 4,
67 ff_vc1_norm2_bits
, 1, 1,
68 ff_vc1_norm2_codes
, 1, 1, 1);
69 init_vlc(&ff_vc1_norm6_vlc
, VC1_NORM6_VLC_BITS
, 64,
70 ff_vc1_norm6_bits
, 1, 1,
71 ff_vc1_norm6_codes
, 2, 2, 1);
72 init_vlc(&ff_vc1_imode_vlc
, VC1_IMODE_VLC_BITS
, 7,
73 ff_vc1_imode_bits
, 1, 1,
74 ff_vc1_imode_codes
, 1, 1, 1);
77 init_vlc(&ff_vc1_ttmb_vlc
[i
], VC1_TTMB_VLC_BITS
, 16,
78 ff_vc1_ttmb_bits
[i
], 1, 1,
79 ff_vc1_ttmb_codes
[i
], 2, 2, 1);
80 init_vlc(&ff_vc1_ttblk_vlc
[i
], VC1_TTBLK_VLC_BITS
, 8,
81 ff_vc1_ttblk_bits
[i
], 1, 1,
82 ff_vc1_ttblk_codes
[i
], 1, 1, 1);
83 init_vlc(&ff_vc1_subblkpat_vlc
[i
], VC1_SUBBLKPAT_VLC_BITS
, 15,
84 ff_vc1_subblkpat_bits
[i
], 1, 1,
85 ff_vc1_subblkpat_codes
[i
], 1, 1, 1);
89 init_vlc(&ff_vc1_4mv_block_pattern_vlc
[i
], VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 16,
90 ff_vc1_4mv_block_pattern_bits
[i
], 1, 1,
91 ff_vc1_4mv_block_pattern_codes
[i
], 1, 1, 1);
92 init_vlc(&ff_vc1_cbpcy_p_vlc
[i
], VC1_CBPCY_P_VLC_BITS
, 64,
93 ff_vc1_cbpcy_p_bits
[i
], 1, 1,
94 ff_vc1_cbpcy_p_codes
[i
], 2, 2, 1);
95 init_vlc(&ff_vc1_mv_diff_vlc
[i
], VC1_MV_DIFF_VLC_BITS
, 73,
96 ff_vc1_mv_diff_bits
[i
], 1, 1,
97 ff_vc1_mv_diff_codes
[i
], 2, 2, 1);
100 init_vlc(&ff_vc1_ac_coeff_table
[i
], AC_VLC_BITS
, vc1_ac_sizes
[i
],
101 &vc1_ac_tables
[i
][0][1], 8, 4,
102 &vc1_ac_tables
[i
][0][0], 8, 4, 1);
103 init_vlc(&ff_msmp4_mb_i_vlc
, MB_INTRA_VLC_BITS
, 64,
104 &ff_msmp4_mb_i_table
[0][1], 4, 2,
105 &ff_msmp4_mb_i_table
[0][0], 4, 2, 1);
110 v
->mvrange
= 0; /* 7.1.1.18, p80 */
115 /***********************************************************************/
117 * @defgroup bitplane VC9 Bitplane decoding
122 /** @addtogroup bitplane
135 /** @} */ //imode defines
137 /** Decode rows by checking if they are skipped
138 * @param plane Buffer to store decoded bits
139 * @param[in] width Width of this buffer
140 * @param[in] height Height of this buffer
141 * @param[in] stride of this buffer
143 static void decode_rowskip(uint8_t* plane
, int width
, int height
, int stride
, GetBitContext
*gb
){
146 for (y
=0; y
<height
; y
++){
147 if (!get_bits1(gb
)) //rowskip
148 memset(plane
, 0, width
);
150 for (x
=0; x
<width
; x
++)
151 plane
[x
] = get_bits1(gb
);
156 /** Decode columns by checking if they are skipped
157 * @param plane Buffer to store decoded bits
158 * @param[in] width Width of this buffer
159 * @param[in] height Height of this buffer
160 * @param[in] stride of this buffer
161 * @todo FIXME: Optimize
163 static void decode_colskip(uint8_t* plane
, int width
, int height
, int stride
, GetBitContext
*gb
){
166 for (x
=0; x
<width
; x
++){
167 if (!get_bits1(gb
)) //colskip
168 for (y
=0; y
<height
; y
++)
171 for (y
=0; y
<height
; y
++)
172 plane
[y
*stride
] = get_bits1(gb
);
177 /** Decode a bitplane's bits
178 * @param bp Bitplane where to store the decode bits
179 * @param v VC-1 context for bit reading and logging
181 * @todo FIXME: Optimize
183 static int bitplane_decoding(uint8_t* data
, int *raw_flag
, VC1Context
*v
)
185 GetBitContext
*gb
= &v
->s
.gb
;
187 int imode
, x
, y
, code
, offset
;
188 uint8_t invert
, *planep
= data
;
189 int width
, height
, stride
;
191 width
= v
->s
.mb_width
;
192 height
= v
->s
.mb_height
;
193 stride
= v
->s
.mb_stride
;
194 invert
= get_bits1(gb
);
195 imode
= get_vlc2(gb
, ff_vc1_imode_vlc
.table
, VC1_IMODE_VLC_BITS
, 1);
201 //Data is actually read in the MB layer (same for all tests == "raw")
202 *raw_flag
= 1; //invert ignored
206 if ((height
* width
) & 1)
208 *planep
++ = get_bits1(gb
);
212 // decode bitplane as one long line
213 for (y
= offset
; y
< height
* width
; y
+= 2) {
214 code
= get_vlc2(gb
, ff_vc1_norm2_vlc
.table
, VC1_NORM2_VLC_BITS
, 1);
215 *planep
++ = code
& 1;
217 if(offset
== width
) {
219 planep
+= stride
- width
;
221 *planep
++ = code
>> 1;
223 if(offset
== width
) {
225 planep
+= stride
- width
;
231 if(!(height
% 3) && (width
% 3)) { // use 2x3 decoding
232 for(y
= 0; y
< height
; y
+= 3) {
233 for(x
= width
& 1; x
< width
; x
+= 2) {
234 code
= get_vlc2(gb
, ff_vc1_norm6_vlc
.table
, VC1_NORM6_VLC_BITS
, 2);
236 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "invalid NORM-6 VLC\n");
239 planep
[x
+ 0] = (code
>> 0) & 1;
240 planep
[x
+ 1] = (code
>> 1) & 1;
241 planep
[x
+ 0 + stride
] = (code
>> 2) & 1;
242 planep
[x
+ 1 + stride
] = (code
>> 3) & 1;
243 planep
[x
+ 0 + stride
* 2] = (code
>> 4) & 1;
244 planep
[x
+ 1 + stride
* 2] = (code
>> 5) & 1;
246 planep
+= stride
* 3;
248 if(width
& 1) decode_colskip(data
, 1, height
, stride
, &v
->s
.gb
);
250 planep
+= (height
& 1) * stride
;
251 for(y
= height
& 1; y
< height
; y
+= 2) {
252 for(x
= width
% 3; x
< width
; x
+= 3) {
253 code
= get_vlc2(gb
, ff_vc1_norm6_vlc
.table
, VC1_NORM6_VLC_BITS
, 2);
255 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "invalid NORM-6 VLC\n");
258 planep
[x
+ 0] = (code
>> 0) & 1;
259 planep
[x
+ 1] = (code
>> 1) & 1;
260 planep
[x
+ 2] = (code
>> 2) & 1;
261 planep
[x
+ 0 + stride
] = (code
>> 3) & 1;
262 planep
[x
+ 1 + stride
] = (code
>> 4) & 1;
263 planep
[x
+ 2 + stride
] = (code
>> 5) & 1;
265 planep
+= stride
* 2;
268 if(x
) decode_colskip(data
, x
, height
, stride
, &v
->s
.gb
);
269 if(height
& 1) decode_rowskip(data
+x
, width
- x
, 1, stride
, &v
->s
.gb
);
273 decode_rowskip(data
, width
, height
, stride
, &v
->s
.gb
);
276 decode_colskip(data
, width
, height
, stride
, &v
->s
.gb
);
281 /* Applying diff operator */
282 if (imode
== IMODE_DIFF2
|| imode
== IMODE_DIFF6
)
286 for (x
=1; x
<width
; x
++)
287 planep
[x
] ^= planep
[x
-1];
288 for (y
=1; y
<height
; y
++)
291 planep
[0] ^= planep
[-stride
];
292 for (x
=1; x
<width
; x
++)
294 if (planep
[x
-1] != planep
[x
-stride
]) planep
[x
] ^= invert
;
295 else planep
[x
] ^= planep
[x
-1];
302 for (x
=0; x
<stride
*height
; x
++) planep
[x
] = !planep
[x
]; //FIXME stride
304 return (imode
<<1) + invert
;
307 /** @} */ //Bitplane group
309 /***********************************************************************/
310 /** VOP Dquant decoding
311 * @param v VC-1 Context
313 static int vop_dquant_decoding(VC1Context
*v
)
315 GetBitContext
*gb
= &v
->s
.gb
;
321 pqdiff
= get_bits(gb
, 3);
322 if (pqdiff
== 7) v
->altpq
= get_bits(gb
, 5);
323 else v
->altpq
= v
->pq
+ pqdiff
+ 1;
327 v
->dquantfrm
= get_bits1(gb
);
330 v
->dqprofile
= get_bits(gb
, 2);
331 switch (v
->dqprofile
)
333 case DQPROFILE_SINGLE_EDGE
:
334 case DQPROFILE_DOUBLE_EDGES
:
335 v
->dqsbedge
= get_bits(gb
, 2);
337 case DQPROFILE_ALL_MBS
:
338 v
->dqbilevel
= get_bits1(gb
);
341 default: break; //Forbidden ?
343 if (v
->dqbilevel
|| v
->dqprofile
!= DQPROFILE_ALL_MBS
)
345 pqdiff
= get_bits(gb
, 3);
346 if (pqdiff
== 7) v
->altpq
= get_bits(gb
, 5);
347 else v
->altpq
= v
->pq
+ pqdiff
+ 1;
354 /** Put block onto picture
356 static void vc1_put_block(VC1Context
*v
, DCTELEM block
[6][64])
360 DSPContext
*dsp
= &v
->s
.dsp
;
364 for(k
= 0; k
< 6; k
++)
365 for(j
= 0; j
< 8; j
++)
366 for(i
= 0; i
< 8; i
++)
367 block
[k
][i
+ j
*8] = ((block
[k
][i
+ j
*8] - 128) << 1) + 128;
370 ys
= v
->s
.current_picture
.linesize
[0];
371 us
= v
->s
.current_picture
.linesize
[1];
372 vs
= v
->s
.current_picture
.linesize
[2];
375 dsp
->put_pixels_clamped(block
[0], Y
, ys
);
376 dsp
->put_pixels_clamped(block
[1], Y
+ 8, ys
);
378 dsp
->put_pixels_clamped(block
[2], Y
, ys
);
379 dsp
->put_pixels_clamped(block
[3], Y
+ 8, ys
);
381 if(!(v
->s
.flags
& CODEC_FLAG_GRAY
)) {
382 dsp
->put_pixels_clamped(block
[4], v
->s
.dest
[1], us
);
383 dsp
->put_pixels_clamped(block
[5], v
->s
.dest
[2], vs
);
387 /** Do motion compensation over 1 macroblock
388 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
390 static void vc1_mc_1mv(VC1Context
*v
, int dir
)
392 MpegEncContext
*s
= &v
->s
;
393 DSPContext
*dsp
= &v
->s
.dsp
;
394 uint8_t *srcY
, *srcU
, *srcV
;
395 int dxy
, uvdxy
, mx
, my
, uvmx
, uvmy
, src_x
, src_y
, uvsrc_x
, uvsrc_y
;
397 if(!v
->s
.last_picture
.data
[0])return;
399 mx
= s
->mv
[dir
][0][0];
400 my
= s
->mv
[dir
][0][1];
402 // store motion vectors for further use in B frames
403 if(s
->pict_type
== FF_P_TYPE
) {
404 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = mx
;
405 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = my
;
407 uvmx
= (mx
+ ((mx
& 3) == 3)) >> 1;
408 uvmy
= (my
+ ((my
& 3) == 3)) >> 1;
410 uvmx
= uvmx
+ ((uvmx
<0)?(uvmx
&1):-(uvmx
&1));
411 uvmy
= uvmy
+ ((uvmy
<0)?(uvmy
&1):-(uvmy
&1));
414 srcY
= s
->last_picture
.data
[0];
415 srcU
= s
->last_picture
.data
[1];
416 srcV
= s
->last_picture
.data
[2];
418 srcY
= s
->next_picture
.data
[0];
419 srcU
= s
->next_picture
.data
[1];
420 srcV
= s
->next_picture
.data
[2];
423 src_x
= s
->mb_x
* 16 + (mx
>> 2);
424 src_y
= s
->mb_y
* 16 + (my
>> 2);
425 uvsrc_x
= s
->mb_x
* 8 + (uvmx
>> 2);
426 uvsrc_y
= s
->mb_y
* 8 + (uvmy
>> 2);
428 if(v
->profile
!= PROFILE_ADVANCED
){
429 src_x
= av_clip( src_x
, -16, s
->mb_width
* 16);
430 src_y
= av_clip( src_y
, -16, s
->mb_height
* 16);
431 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->mb_width
* 8);
432 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->mb_height
* 8);
434 src_x
= av_clip( src_x
, -17, s
->avctx
->coded_width
);
435 src_y
= av_clip( src_y
, -18, s
->avctx
->coded_height
+ 1);
436 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->avctx
->coded_width
>> 1);
437 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->avctx
->coded_height
>> 1);
440 srcY
+= src_y
* s
->linesize
+ src_x
;
441 srcU
+= uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
442 srcV
+= uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
444 /* for grayscale we should not try to read from unknown area */
445 if(s
->flags
& CODEC_FLAG_GRAY
) {
446 srcU
= s
->edge_emu_buffer
+ 18 * s
->linesize
;
447 srcV
= s
->edge_emu_buffer
+ 18 * s
->linesize
;
450 if(v
->rangeredfrm
|| (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
451 || (unsigned)(src_x
- s
->mspel
) > s
->h_edge_pos
- (mx
&3) - 16 - s
->mspel
*3
452 || (unsigned)(src_y
- s
->mspel
) > s
->v_edge_pos
- (my
&3) - 16 - s
->mspel
*3){
453 uint8_t *uvbuf
= s
->edge_emu_buffer
+ 19 * s
->linesize
;
455 srcY
-= s
->mspel
* (1 + s
->linesize
);
456 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcY
, s
->linesize
, 17+s
->mspel
*2, 17+s
->mspel
*2,
457 src_x
- s
->mspel
, src_y
- s
->mspel
, s
->h_edge_pos
, s
->v_edge_pos
);
458 srcY
= s
->edge_emu_buffer
;
459 ff_emulated_edge_mc(uvbuf
, srcU
, s
->uvlinesize
, 8+1, 8+1,
460 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
461 ff_emulated_edge_mc(uvbuf
+ 16, srcV
, s
->uvlinesize
, 8+1, 8+1,
462 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
465 /* if we deal with range reduction we need to scale source blocks */
471 for(j
= 0; j
< 17 + s
->mspel
*2; j
++) {
472 for(i
= 0; i
< 17 + s
->mspel
*2; i
++) src
[i
] = ((src
[i
] - 128) >> 1) + 128;
475 src
= srcU
; src2
= srcV
;
476 for(j
= 0; j
< 9; j
++) {
477 for(i
= 0; i
< 9; i
++) {
478 src
[i
] = ((src
[i
] - 128) >> 1) + 128;
479 src2
[i
] = ((src2
[i
] - 128) >> 1) + 128;
481 src
+= s
->uvlinesize
;
482 src2
+= s
->uvlinesize
;
485 /* if we deal with intensity compensation we need to scale source blocks */
486 if(v
->mv_mode
== MV_PMODE_INTENSITY_COMP
) {
491 for(j
= 0; j
< 17 + s
->mspel
*2; j
++) {
492 for(i
= 0; i
< 17 + s
->mspel
*2; i
++) src
[i
] = v
->luty
[src
[i
]];
495 src
= srcU
; src2
= srcV
;
496 for(j
= 0; j
< 9; j
++) {
497 for(i
= 0; i
< 9; i
++) {
498 src
[i
] = v
->lutuv
[src
[i
]];
499 src2
[i
] = v
->lutuv
[src2
[i
]];
501 src
+= s
->uvlinesize
;
502 src2
+= s
->uvlinesize
;
505 srcY
+= s
->mspel
* (1 + s
->linesize
);
509 dxy
= ((my
& 3) << 2) | (mx
& 3);
510 dsp
->put_vc1_mspel_pixels_tab
[dxy
](s
->dest
[0] , srcY
, s
->linesize
, v
->rnd
);
511 dsp
->put_vc1_mspel_pixels_tab
[dxy
](s
->dest
[0] + 8, srcY
+ 8, s
->linesize
, v
->rnd
);
512 srcY
+= s
->linesize
* 8;
513 dsp
->put_vc1_mspel_pixels_tab
[dxy
](s
->dest
[0] + 8 * s
->linesize
, srcY
, s
->linesize
, v
->rnd
);
514 dsp
->put_vc1_mspel_pixels_tab
[dxy
](s
->dest
[0] + 8 * s
->linesize
+ 8, srcY
+ 8, s
->linesize
, v
->rnd
);
515 } else { // hpel mc - always used for luma
516 dxy
= (my
& 2) | ((mx
& 2) >> 1);
519 dsp
->put_pixels_tab
[0][dxy
](s
->dest
[0], srcY
, s
->linesize
, 16);
521 dsp
->put_no_rnd_pixels_tab
[0][dxy
](s
->dest
[0], srcY
, s
->linesize
, 16);
524 if(s
->flags
& CODEC_FLAG_GRAY
) return;
525 /* Chroma MC always uses qpel bilinear */
526 uvdxy
= ((uvmy
& 3) << 2) | (uvmx
& 3);
530 dsp
->put_h264_chroma_pixels_tab
[0](s
->dest
[1], srcU
, s
->uvlinesize
, 8, uvmx
, uvmy
);
531 dsp
->put_h264_chroma_pixels_tab
[0](s
->dest
[2], srcV
, s
->uvlinesize
, 8, uvmx
, uvmy
);
533 dsp
->put_no_rnd_h264_chroma_pixels_tab
[0](s
->dest
[1], srcU
, s
->uvlinesize
, 8, uvmx
, uvmy
);
534 dsp
->put_no_rnd_h264_chroma_pixels_tab
[0](s
->dest
[2], srcV
, s
->uvlinesize
, 8, uvmx
, uvmy
);
538 /** Do motion compensation for 4-MV macroblock - luminance block
540 static void vc1_mc_4mv_luma(VC1Context
*v
, int n
)
542 MpegEncContext
*s
= &v
->s
;
543 DSPContext
*dsp
= &v
->s
.dsp
;
545 int dxy
, mx
, my
, src_x
, src_y
;
548 if(!v
->s
.last_picture
.data
[0])return;
551 srcY
= s
->last_picture
.data
[0];
553 off
= s
->linesize
* 4 * (n
&2) + (n
&1) * 8;
555 src_x
= s
->mb_x
* 16 + (n
&1) * 8 + (mx
>> 2);
556 src_y
= s
->mb_y
* 16 + (n
&2) * 4 + (my
>> 2);
558 if(v
->profile
!= PROFILE_ADVANCED
){
559 src_x
= av_clip( src_x
, -16, s
->mb_width
* 16);
560 src_y
= av_clip( src_y
, -16, s
->mb_height
* 16);
562 src_x
= av_clip( src_x
, -17, s
->avctx
->coded_width
);
563 src_y
= av_clip( src_y
, -18, s
->avctx
->coded_height
+ 1);
566 srcY
+= src_y
* s
->linesize
+ src_x
;
568 if(v
->rangeredfrm
|| (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
569 || (unsigned)(src_x
- s
->mspel
) > s
->h_edge_pos
- (mx
&3) - 8 - s
->mspel
*2
570 || (unsigned)(src_y
- s
->mspel
) > s
->v_edge_pos
- (my
&3) - 8 - s
->mspel
*2){
571 srcY
-= s
->mspel
* (1 + s
->linesize
);
572 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcY
, s
->linesize
, 9+s
->mspel
*2, 9+s
->mspel
*2,
573 src_x
- s
->mspel
, src_y
- s
->mspel
, s
->h_edge_pos
, s
->v_edge_pos
);
574 srcY
= s
->edge_emu_buffer
;
575 /* if we deal with range reduction we need to scale source blocks */
581 for(j
= 0; j
< 9 + s
->mspel
*2; j
++) {
582 for(i
= 0; i
< 9 + s
->mspel
*2; i
++) src
[i
] = ((src
[i
] - 128) >> 1) + 128;
586 /* if we deal with intensity compensation we need to scale source blocks */
587 if(v
->mv_mode
== MV_PMODE_INTENSITY_COMP
) {
592 for(j
= 0; j
< 9 + s
->mspel
*2; j
++) {
593 for(i
= 0; i
< 9 + s
->mspel
*2; i
++) src
[i
] = v
->luty
[src
[i
]];
597 srcY
+= s
->mspel
* (1 + s
->linesize
);
601 dxy
= ((my
& 3) << 2) | (mx
& 3);
602 dsp
->put_vc1_mspel_pixels_tab
[dxy
](s
->dest
[0] + off
, srcY
, s
->linesize
, v
->rnd
);
603 } else { // hpel mc - always used for luma
604 dxy
= (my
& 2) | ((mx
& 2) >> 1);
606 dsp
->put_pixels_tab
[1][dxy
](s
->dest
[0] + off
, srcY
, s
->linesize
, 8);
608 dsp
->put_no_rnd_pixels_tab
[1][dxy
](s
->dest
[0] + off
, srcY
, s
->linesize
, 8);
612 static inline int median4(int a
, int b
, int c
, int d
)
615 if(c
< d
) return (FFMIN(b
, d
) + FFMAX(a
, c
)) / 2;
616 else return (FFMIN(b
, c
) + FFMAX(a
, d
)) / 2;
618 if(c
< d
) return (FFMIN(a
, d
) + FFMAX(b
, c
)) / 2;
619 else return (FFMIN(a
, c
) + FFMAX(b
, d
)) / 2;
624 /** Do motion compensation for 4-MV macroblock - both chroma blocks
626 static void vc1_mc_4mv_chroma(VC1Context
*v
)
628 MpegEncContext
*s
= &v
->s
;
629 DSPContext
*dsp
= &v
->s
.dsp
;
630 uint8_t *srcU
, *srcV
;
631 int uvdxy
, uvmx
, uvmy
, uvsrc_x
, uvsrc_y
;
632 int i
, idx
, tx
= 0, ty
= 0;
633 int mvx
[4], mvy
[4], intra
[4];
634 static const int count
[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
636 if(!v
->s
.last_picture
.data
[0])return;
637 if(s
->flags
& CODEC_FLAG_GRAY
) return;
639 for(i
= 0; i
< 4; i
++) {
640 mvx
[i
] = s
->mv
[0][i
][0];
641 mvy
[i
] = s
->mv
[0][i
][1];
642 intra
[i
] = v
->mb_type
[0][s
->block_index
[i
]];
645 /* calculate chroma MV vector from four luma MVs */
646 idx
= (intra
[3] << 3) | (intra
[2] << 2) | (intra
[1] << 1) | intra
[0];
647 if(!idx
) { // all blocks are inter
648 tx
= median4(mvx
[0], mvx
[1], mvx
[2], mvx
[3]);
649 ty
= median4(mvy
[0], mvy
[1], mvy
[2], mvy
[3]);
650 } else if(count
[idx
] == 1) { // 3 inter blocks
653 tx
= mid_pred(mvx
[1], mvx
[2], mvx
[3]);
654 ty
= mid_pred(mvy
[1], mvy
[2], mvy
[3]);
657 tx
= mid_pred(mvx
[0], mvx
[2], mvx
[3]);
658 ty
= mid_pred(mvy
[0], mvy
[2], mvy
[3]);
661 tx
= mid_pred(mvx
[0], mvx
[1], mvx
[3]);
662 ty
= mid_pred(mvy
[0], mvy
[1], mvy
[3]);
665 tx
= mid_pred(mvx
[0], mvx
[1], mvx
[2]);
666 ty
= mid_pred(mvy
[0], mvy
[1], mvy
[2]);
669 } else if(count
[idx
] == 2) {
671 for(i
=0; i
<3;i
++) if(!intra
[i
]) {t1
= i
; break;}
672 for(i
= t1
+1; i
<4; i
++)if(!intra
[i
]) {t2
= i
; break;}
673 tx
= (mvx
[t1
] + mvx
[t2
]) / 2;
674 ty
= (mvy
[t1
] + mvy
[t2
]) / 2;
676 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
677 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
678 return; //no need to do MC for inter blocks
681 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = tx
;
682 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = ty
;
683 uvmx
= (tx
+ ((tx
&3) == 3)) >> 1;
684 uvmy
= (ty
+ ((ty
&3) == 3)) >> 1;
686 uvmx
= uvmx
+ ((uvmx
<0)?(uvmx
&1):-(uvmx
&1));
687 uvmy
= uvmy
+ ((uvmy
<0)?(uvmy
&1):-(uvmy
&1));
690 uvsrc_x
= s
->mb_x
* 8 + (uvmx
>> 2);
691 uvsrc_y
= s
->mb_y
* 8 + (uvmy
>> 2);
693 if(v
->profile
!= PROFILE_ADVANCED
){
694 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->mb_width
* 8);
695 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->mb_height
* 8);
697 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->avctx
->coded_width
>> 1);
698 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->avctx
->coded_height
>> 1);
701 srcU
= s
->last_picture
.data
[1] + uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
702 srcV
= s
->last_picture
.data
[2] + uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
703 if(v
->rangeredfrm
|| (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
704 || (unsigned)uvsrc_x
> (s
->h_edge_pos
>> 1) - 9
705 || (unsigned)uvsrc_y
> (s
->v_edge_pos
>> 1) - 9){
706 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcU
, s
->uvlinesize
, 8+1, 8+1,
707 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
708 ff_emulated_edge_mc(s
->edge_emu_buffer
+ 16, srcV
, s
->uvlinesize
, 8+1, 8+1,
709 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
710 srcU
= s
->edge_emu_buffer
;
711 srcV
= s
->edge_emu_buffer
+ 16;
713 /* if we deal with range reduction we need to scale source blocks */
718 src
= srcU
; src2
= srcV
;
719 for(j
= 0; j
< 9; j
++) {
720 for(i
= 0; i
< 9; i
++) {
721 src
[i
] = ((src
[i
] - 128) >> 1) + 128;
722 src2
[i
] = ((src2
[i
] - 128) >> 1) + 128;
724 src
+= s
->uvlinesize
;
725 src2
+= s
->uvlinesize
;
728 /* if we deal with intensity compensation we need to scale source blocks */
729 if(v
->mv_mode
== MV_PMODE_INTENSITY_COMP
) {
733 src
= srcU
; src2
= srcV
;
734 for(j
= 0; j
< 9; j
++) {
735 for(i
= 0; i
< 9; i
++) {
736 src
[i
] = v
->lutuv
[src
[i
]];
737 src2
[i
] = v
->lutuv
[src2
[i
]];
739 src
+= s
->uvlinesize
;
740 src2
+= s
->uvlinesize
;
745 /* Chroma MC always uses qpel bilinear */
746 uvdxy
= ((uvmy
& 3) << 2) | (uvmx
& 3);
750 dsp
->put_h264_chroma_pixels_tab
[0](s
->dest
[1], srcU
, s
->uvlinesize
, 8, uvmx
, uvmy
);
751 dsp
->put_h264_chroma_pixels_tab
[0](s
->dest
[2], srcV
, s
->uvlinesize
, 8, uvmx
, uvmy
);
753 dsp
->put_no_rnd_h264_chroma_pixels_tab
[0](s
->dest
[1], srcU
, s
->uvlinesize
, 8, uvmx
, uvmy
);
754 dsp
->put_no_rnd_h264_chroma_pixels_tab
[0](s
->dest
[2], srcV
, s
->uvlinesize
, 8, uvmx
, uvmy
);
758 static int decode_sequence_header_adv(VC1Context
*v
, GetBitContext
*gb
);
761 * Decode Simple/Main Profiles sequence header
762 * @see Figure 7-8, p16-17
763 * @param avctx Codec context
764 * @param gb GetBit context initialized from Codec context extra_data
767 static int decode_sequence_header(AVCodecContext
*avctx
, GetBitContext
*gb
)
769 VC1Context
*v
= avctx
->priv_data
;
771 av_log(avctx
, AV_LOG_DEBUG
, "Header: %0X\n", show_bits(gb
, 32));
772 v
->profile
= get_bits(gb
, 2);
773 if (v
->profile
== PROFILE_COMPLEX
)
775 av_log(avctx
, AV_LOG_ERROR
, "WMV3 Complex Profile is not fully supported\n");
778 if (v
->profile
== PROFILE_ADVANCED
)
780 v
->zz_8x4
= ff_vc1_adv_progressive_8x4_zz
;
781 v
->zz_4x8
= ff_vc1_adv_progressive_4x8_zz
;
782 return decode_sequence_header_adv(v
, gb
);
786 v
->zz_8x4
= ff_vc1_simple_progressive_8x4_zz
;
787 v
->zz_4x8
= ff_vc1_simple_progressive_4x8_zz
;
788 v
->res_sm
= get_bits(gb
, 2); //reserved
791 av_log(avctx
, AV_LOG_ERROR
,
792 "Reserved RES_SM=%i is forbidden\n", v
->res_sm
);
798 v
->frmrtq_postproc
= get_bits(gb
, 3); //common
799 // (bitrate-32kbps)/64kbps
800 v
->bitrtq_postproc
= get_bits(gb
, 5); //common
801 v
->s
.loop_filter
= get_bits1(gb
); //common
802 if(v
->s
.loop_filter
== 1 && v
->profile
== PROFILE_SIMPLE
)
804 av_log(avctx
, AV_LOG_ERROR
,
805 "LOOPFILTER shell not be enabled in simple profile\n");
808 v
->res_x8
= get_bits1(gb
); //reserved
809 v
->multires
= get_bits1(gb
);
810 v
->res_fasttx
= get_bits1(gb
);
813 v
->s
.dsp
.vc1_inv_trans_8x8
= ff_simple_idct
;
814 v
->s
.dsp
.vc1_inv_trans_8x4
= ff_simple_idct84_add
;
815 v
->s
.dsp
.vc1_inv_trans_4x8
= ff_simple_idct48_add
;
816 v
->s
.dsp
.vc1_inv_trans_4x4
= ff_simple_idct44_add
;
819 v
->fastuvmc
= get_bits1(gb
); //common
820 if (!v
->profile
&& !v
->fastuvmc
)
822 av_log(avctx
, AV_LOG_ERROR
,
823 "FASTUVMC unavailable in Simple Profile\n");
826 v
->extended_mv
= get_bits1(gb
); //common
827 if (!v
->profile
&& v
->extended_mv
)
829 av_log(avctx
, AV_LOG_ERROR
,
830 "Extended MVs unavailable in Simple Profile\n");
833 v
->dquant
= get_bits(gb
, 2); //common
834 v
->vstransform
= get_bits1(gb
); //common
836 v
->res_transtab
= get_bits1(gb
);
839 av_log(avctx
, AV_LOG_ERROR
,
840 "1 for reserved RES_TRANSTAB is forbidden\n");
844 v
->overlap
= get_bits1(gb
); //common
846 v
->s
.resync_marker
= get_bits1(gb
);
847 v
->rangered
= get_bits1(gb
);
848 if (v
->rangered
&& v
->profile
== PROFILE_SIMPLE
)
850 av_log(avctx
, AV_LOG_INFO
,
851 "RANGERED should be set to 0 in simple profile\n");
854 v
->s
.max_b_frames
= avctx
->max_b_frames
= get_bits(gb
, 3); //common
855 v
->quantizer_mode
= get_bits(gb
, 2); //common
857 v
->finterpflag
= get_bits1(gb
); //common
858 v
->res_rtm_flag
= get_bits1(gb
); //reserved
859 if (!v
->res_rtm_flag
)
861 // av_log(avctx, AV_LOG_ERROR,
862 // "0 for reserved RES_RTM_FLAG is forbidden\n");
863 av_log(avctx
, AV_LOG_ERROR
,
864 "Old WMV3 version detected, only I-frames will be decoded\n");
867 //TODO: figure out what they mean (always 0x402F)
868 if(!v
->res_fasttx
) skip_bits(gb
, 16);
869 av_log(avctx
, AV_LOG_DEBUG
,
870 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
871 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
872 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
873 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
874 v
->profile
, v
->frmrtq_postproc
, v
->bitrtq_postproc
,
875 v
->s
.loop_filter
, v
->multires
, v
->fastuvmc
, v
->extended_mv
,
876 v
->rangered
, v
->vstransform
, v
->overlap
, v
->s
.resync_marker
,
877 v
->dquant
, v
->quantizer_mode
, avctx
->max_b_frames
882 static int decode_sequence_header_adv(VC1Context
*v
, GetBitContext
*gb
)
885 v
->level
= get_bits(gb
, 3);
888 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "Reserved LEVEL %i\n",v
->level
);
890 v
->chromaformat
= get_bits(gb
, 2);
891 if (v
->chromaformat
!= 1)
893 av_log(v
->s
.avctx
, AV_LOG_ERROR
,
894 "Only 4:2:0 chroma format supported\n");
899 v
->frmrtq_postproc
= get_bits(gb
, 3); //common
900 // (bitrate-32kbps)/64kbps
901 v
->bitrtq_postproc
= get_bits(gb
, 5); //common
902 v
->postprocflag
= get_bits1(gb
); //common
904 v
->s
.avctx
->coded_width
= (get_bits(gb
, 12) + 1) << 1;
905 v
->s
.avctx
->coded_height
= (get_bits(gb
, 12) + 1) << 1;
906 v
->s
.avctx
->width
= v
->s
.avctx
->coded_width
;
907 v
->s
.avctx
->height
= v
->s
.avctx
->coded_height
;
908 v
->broadcast
= get_bits1(gb
);
909 v
->interlace
= get_bits1(gb
);
910 v
->tfcntrflag
= get_bits1(gb
);
911 v
->finterpflag
= get_bits1(gb
);
912 skip_bits1(gb
); // reserved
914 v
->s
.h_edge_pos
= v
->s
.avctx
->coded_width
;
915 v
->s
.v_edge_pos
= v
->s
.avctx
->coded_height
;
917 av_log(v
->s
.avctx
, AV_LOG_DEBUG
,
918 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
919 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
920 "TFCTRflag=%i, FINTERPflag=%i\n",
921 v
->level
, v
->frmrtq_postproc
, v
->bitrtq_postproc
,
922 v
->s
.loop_filter
, v
->chromaformat
, v
->broadcast
, v
->interlace
,
923 v
->tfcntrflag
, v
->finterpflag
926 v
->psf
= get_bits1(gb
);
927 if(v
->psf
) { //PsF, 6.1.13
928 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "Progressive Segmented Frame mode: not supported (yet)\n");
931 v
->s
.max_b_frames
= v
->s
.avctx
->max_b_frames
= 7;
932 if(get_bits1(gb
)) { //Display Info - decoding is not affected by it
934 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "Display extended info:\n");
935 v
->s
.avctx
->width
= v
->s
.width
= w
= get_bits(gb
, 14) + 1;
936 v
->s
.avctx
->height
= v
->s
.height
= h
= get_bits(gb
, 14) + 1;
937 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "Display dimensions: %ix%i\n", w
, h
);
939 ar
= get_bits(gb
, 4);
941 v
->s
.avctx
->sample_aspect_ratio
= ff_vc1_pixel_aspect
[ar
];
945 v
->s
.avctx
->sample_aspect_ratio
= (AVRational
){w
, h
};
948 if(get_bits1(gb
)){ //framerate stuff
950 v
->s
.avctx
->time_base
.num
= 32;
951 v
->s
.avctx
->time_base
.den
= get_bits(gb
, 16) + 1;
954 nr
= get_bits(gb
, 8);
955 dr
= get_bits(gb
, 4);
956 if(nr
&& nr
< 8 && dr
&& dr
< 3){
957 v
->s
.avctx
->time_base
.num
= ff_vc1_fps_dr
[dr
- 1];
958 v
->s
.avctx
->time_base
.den
= ff_vc1_fps_nr
[nr
- 1] * 1000;
964 v
->color_prim
= get_bits(gb
, 8);
965 v
->transfer_char
= get_bits(gb
, 8);
966 v
->matrix_coef
= get_bits(gb
, 8);
970 v
->hrd_param_flag
= get_bits1(gb
);
971 if(v
->hrd_param_flag
) {
973 v
->hrd_num_leaky_buckets
= get_bits(gb
, 5);
974 skip_bits(gb
, 4); //bitrate exponent
975 skip_bits(gb
, 4); //buffer size exponent
976 for(i
= 0; i
< v
->hrd_num_leaky_buckets
; i
++) {
977 skip_bits(gb
, 16); //hrd_rate[n]
978 skip_bits(gb
, 16); //hrd_buffer[n]
984 static int decode_entry_point(AVCodecContext
*avctx
, GetBitContext
*gb
)
986 VC1Context
*v
= avctx
->priv_data
;
987 int i
, blink
, clentry
, refdist
;
989 av_log(avctx
, AV_LOG_DEBUG
, "Entry point: %08X\n", show_bits_long(gb
, 32));
990 blink
= get_bits1(gb
); // broken link
991 clentry
= get_bits1(gb
); // closed entry
992 v
->panscanflag
= get_bits1(gb
);
993 refdist
= get_bits1(gb
); // refdist flag
994 v
->s
.loop_filter
= get_bits1(gb
);
995 v
->fastuvmc
= get_bits1(gb
);
996 v
->extended_mv
= get_bits1(gb
);
997 v
->dquant
= get_bits(gb
, 2);
998 v
->vstransform
= get_bits1(gb
);
999 v
->overlap
= get_bits1(gb
);
1000 v
->quantizer_mode
= get_bits(gb
, 2);
1002 if(v
->hrd_param_flag
){
1003 for(i
= 0; i
< v
->hrd_num_leaky_buckets
; i
++) {
1004 skip_bits(gb
, 8); //hrd_full[n]
1009 avctx
->coded_width
= (get_bits(gb
, 12)+1)<<1;
1010 avctx
->coded_height
= (get_bits(gb
, 12)+1)<<1;
1013 v
->extended_dmv
= get_bits1(gb
);
1015 av_log(avctx
, AV_LOG_ERROR
, "Luma scaling is not supported, expect wrong picture\n");
1016 skip_bits(gb
, 3); // Y range, ignored for now
1019 av_log(avctx
, AV_LOG_ERROR
, "Chroma scaling is not supported, expect wrong picture\n");
1020 skip_bits(gb
, 3); // UV range, ignored for now
1023 av_log(avctx
, AV_LOG_DEBUG
, "Entry point info:\n"
1024 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
1025 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
1026 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
1027 blink
, clentry
, v
->panscanflag
, refdist
, v
->s
.loop_filter
,
1028 v
->fastuvmc
, v
->extended_mv
, v
->dquant
, v
->vstransform
, v
->overlap
, v
->quantizer_mode
);
1033 static int vc1_parse_frame_header(VC1Context
*v
, GetBitContext
* gb
)
1035 int pqindex
, lowquant
, status
;
1037 if(v
->finterpflag
) v
->interpfrm
= get_bits1(gb
);
1038 skip_bits(gb
, 2); //framecnt unused
1040 if (v
->rangered
) v
->rangeredfrm
= get_bits1(gb
);
1041 v
->s
.pict_type
= get_bits1(gb
);
1042 if (v
->s
.avctx
->max_b_frames
) {
1043 if (!v
->s
.pict_type
) {
1044 if (get_bits1(gb
)) v
->s
.pict_type
= FF_I_TYPE
;
1045 else v
->s
.pict_type
= FF_B_TYPE
;
1046 } else v
->s
.pict_type
= FF_P_TYPE
;
1047 } else v
->s
.pict_type
= v
->s
.pict_type
? FF_P_TYPE
: FF_I_TYPE
;
1050 if(v
->s
.pict_type
== FF_B_TYPE
) {
1051 v
->bfraction
= get_vlc2(gb
, ff_vc1_bfraction_vlc
.table
, VC1_BFRACTION_VLC_BITS
, 1);
1052 v
->bfraction
= ff_vc1_bfraction_lut
[v
->bfraction
];
1053 if(v
->bfraction
== 0) {
1054 v
->s
.pict_type
= FF_BI_TYPE
;
1057 if(v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
)
1058 skip_bits(gb
, 7); // skip buffer fullness
1061 if(v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
)
1063 if(v
->s
.pict_type
== FF_P_TYPE
)
1066 /* Quantizer stuff */
1067 pqindex
= get_bits(gb
, 5);
1068 if(!pqindex
) return -1;
1069 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1070 v
->pq
= ff_vc1_pquant_table
[0][pqindex
];
1072 v
->pq
= ff_vc1_pquant_table
[1][pqindex
];
1075 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1076 v
->pquantizer
= pqindex
< 9;
1077 if (v
->quantizer_mode
== QUANT_NON_UNIFORM
)
1079 v
->pqindex
= pqindex
;
1080 if (pqindex
< 9) v
->halfpq
= get_bits1(gb
);
1082 if (v
->quantizer_mode
== QUANT_FRAME_EXPLICIT
)
1083 v
->pquantizer
= get_bits1(gb
);
1085 if (v
->extended_mv
== 1) v
->mvrange
= get_unary(gb
, 0, 3);
1086 v
->k_x
= v
->mvrange
+ 9 + (v
->mvrange
>> 1); //k_x can be 9 10 12 13
1087 v
->k_y
= v
->mvrange
+ 8; //k_y can be 8 9 10 11
1088 v
->range_x
= 1 << (v
->k_x
- 1);
1089 v
->range_y
= 1 << (v
->k_y
- 1);
1090 if (v
->profile
== PROFILE_ADVANCED
)
1092 if (v
->postprocflag
) v
->postproc
= get_bits1(gb
);
1095 if (v
->multires
&& v
->s
.pict_type
!= FF_B_TYPE
) v
->respic
= get_bits(gb
, 2);
1097 if(v
->res_x8
&& (v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
)){
1098 v
->x8_type
= get_bits1(gb
);
1099 }else v
->x8_type
= 0;
1100 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1101 // (v->s.pict_type == FF_P_TYPE) ? 'P' : ((v->s.pict_type == FF_I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1103 if(v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_P_TYPE
) v
->use_ic
= 0;
1105 switch(v
->s
.pict_type
) {
1107 if (v
->pq
< 5) v
->tt_index
= 0;
1108 else if(v
->pq
< 13) v
->tt_index
= 1;
1109 else v
->tt_index
= 2;
1111 lowquant
= (v
->pq
> 12) ? 0 : 1;
1112 v
->mv_mode
= ff_vc1_mv_pmode_table
[lowquant
][get_unary(gb
, 1, 4)];
1113 if (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
1115 int scale
, shift
, i
;
1116 v
->mv_mode2
= ff_vc1_mv_pmode_table2
[lowquant
][get_unary(gb
, 1, 3)];
1117 v
->lumscale
= get_bits(gb
, 6);
1118 v
->lumshift
= get_bits(gb
, 6);
1120 /* fill lookup tables for intensity compensation */
1123 shift
= (255 - v
->lumshift
* 2) << 6;
1124 if(v
->lumshift
> 31)
1127 scale
= v
->lumscale
+ 32;
1128 if(v
->lumshift
> 31)
1129 shift
= (v
->lumshift
- 64) << 6;
1131 shift
= v
->lumshift
<< 6;
1133 for(i
= 0; i
< 256; i
++) {
1134 v
->luty
[i
] = av_clip_uint8((scale
* i
+ shift
+ 32) >> 6);
1135 v
->lutuv
[i
] = av_clip_uint8((scale
* (i
- 128) + 128*64 + 32) >> 6);
1138 if(v
->mv_mode
== MV_PMODE_1MV_HPEL
|| v
->mv_mode
== MV_PMODE_1MV_HPEL_BILIN
)
1139 v
->s
.quarter_sample
= 0;
1140 else if(v
->mv_mode
== MV_PMODE_INTENSITY_COMP
) {
1141 if(v
->mv_mode2
== MV_PMODE_1MV_HPEL
|| v
->mv_mode2
== MV_PMODE_1MV_HPEL_BILIN
)
1142 v
->s
.quarter_sample
= 0;
1144 v
->s
.quarter_sample
= 1;
1146 v
->s
.quarter_sample
= 1;
1147 v
->s
.mspel
= !(v
->mv_mode
== MV_PMODE_1MV_HPEL_BILIN
|| (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
&& v
->mv_mode2
== MV_PMODE_1MV_HPEL_BILIN
));
1149 if ((v
->mv_mode
== MV_PMODE_INTENSITY_COMP
&&
1150 v
->mv_mode2
== MV_PMODE_MIXED_MV
)
1151 || v
->mv_mode
== MV_PMODE_MIXED_MV
)
1153 status
= bitplane_decoding(v
->mv_type_mb_plane
, &v
->mv_type_is_raw
, v
);
1154 if (status
< 0) return -1;
1155 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB MV Type plane encoding: "
1156 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1158 v
->mv_type_is_raw
= 0;
1159 memset(v
->mv_type_mb_plane
, 0, v
->s
.mb_stride
* v
->s
.mb_height
);
1161 status
= bitplane_decoding(v
->s
.mbskip_table
, &v
->skip_is_raw
, v
);
1162 if (status
< 0) return -1;
1163 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Skip plane encoding: "
1164 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1166 /* Hopefully this is correct for P frames */
1167 v
->s
.mv_table_index
= get_bits(gb
, 2); //but using ff_vc1_ tables
1168 v
->cbpcy_vlc
= &ff_vc1_cbpcy_p_vlc
[get_bits(gb
, 2)];
1172 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1173 vop_dquant_decoding(v
);
1176 v
->ttfrm
= 0; //FIXME Is that so ?
1179 v
->ttmbf
= get_bits1(gb
);
1182 v
->ttfrm
= ff_vc1_ttfrm_to_tt
[get_bits(gb
, 2)];
1190 if (v
->pq
< 5) v
->tt_index
= 0;
1191 else if(v
->pq
< 13) v
->tt_index
= 1;
1192 else v
->tt_index
= 2;
1194 lowquant
= (v
->pq
> 12) ? 0 : 1;
1195 v
->mv_mode
= get_bits1(gb
) ? MV_PMODE_1MV
: MV_PMODE_1MV_HPEL_BILIN
;
1196 v
->s
.quarter_sample
= (v
->mv_mode
== MV_PMODE_1MV
);
1197 v
->s
.mspel
= v
->s
.quarter_sample
;
1199 status
= bitplane_decoding(v
->direct_mb_plane
, &v
->dmb_is_raw
, v
);
1200 if (status
< 0) return -1;
1201 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Direct Type plane encoding: "
1202 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1203 status
= bitplane_decoding(v
->s
.mbskip_table
, &v
->skip_is_raw
, v
);
1204 if (status
< 0) return -1;
1205 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Skip plane encoding: "
1206 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1208 v
->s
.mv_table_index
= get_bits(gb
, 2);
1209 v
->cbpcy_vlc
= &ff_vc1_cbpcy_p_vlc
[get_bits(gb
, 2)];
1213 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1214 vop_dquant_decoding(v
);
1220 v
->ttmbf
= get_bits1(gb
);
1223 v
->ttfrm
= ff_vc1_ttfrm_to_tt
[get_bits(gb
, 2)];
1235 v
->c_ac_table_index
= decode012(gb
);
1236 if (v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
)
1238 v
->y_ac_table_index
= decode012(gb
);
1241 v
->s
.dc_table_index
= get_bits1(gb
);
1244 if(v
->s
.pict_type
== FF_BI_TYPE
) {
1245 v
->s
.pict_type
= FF_B_TYPE
;
1251 static int vc1_parse_frame_header_adv(VC1Context
*v
, GetBitContext
* gb
)
1253 int pqindex
, lowquant
;
1256 v
->p_frame_skipped
= 0;
1259 v
->fcm
= decode012(gb
);
1260 if(v
->fcm
) return -1; // interlaced frames/fields are not implemented
1262 switch(get_unary(gb
, 0, 4)) {
1264 v
->s
.pict_type
= FF_P_TYPE
;
1267 v
->s
.pict_type
= FF_B_TYPE
;
1270 v
->s
.pict_type
= FF_I_TYPE
;
1273 v
->s
.pict_type
= FF_BI_TYPE
;
1276 v
->s
.pict_type
= FF_P_TYPE
; // skipped pic
1277 v
->p_frame_skipped
= 1;
1283 if(!v
->interlace
|| v
->psf
) {
1284 v
->rptfrm
= get_bits(gb
, 2);
1286 v
->tff
= get_bits1(gb
);
1287 v
->rptfrm
= get_bits1(gb
);
1290 if(v
->panscanflag
) {
1293 v
->rnd
= get_bits1(gb
);
1295 v
->uvsamp
= get_bits1(gb
);
1296 if(v
->finterpflag
) v
->interpfrm
= get_bits1(gb
);
1297 if(v
->s
.pict_type
== FF_B_TYPE
) {
1298 v
->bfraction
= get_vlc2(gb
, ff_vc1_bfraction_vlc
.table
, VC1_BFRACTION_VLC_BITS
, 1);
1299 v
->bfraction
= ff_vc1_bfraction_lut
[v
->bfraction
];
1300 if(v
->bfraction
== 0) {
1301 v
->s
.pict_type
= FF_BI_TYPE
; /* XXX: should not happen here */
1304 pqindex
= get_bits(gb
, 5);
1305 if(!pqindex
) return -1;
1306 v
->pqindex
= pqindex
;
1307 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1308 v
->pq
= ff_vc1_pquant_table
[0][pqindex
];
1310 v
->pq
= ff_vc1_pquant_table
[1][pqindex
];
1313 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1314 v
->pquantizer
= pqindex
< 9;
1315 if (v
->quantizer_mode
== QUANT_NON_UNIFORM
)
1317 v
->pqindex
= pqindex
;
1318 if (pqindex
< 9) v
->halfpq
= get_bits1(gb
);
1320 if (v
->quantizer_mode
== QUANT_FRAME_EXPLICIT
)
1321 v
->pquantizer
= get_bits1(gb
);
1323 if(v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_P_TYPE
) v
->use_ic
= 0;
1325 switch(v
->s
.pict_type
) {
1328 status
= bitplane_decoding(v
->acpred_plane
, &v
->acpred_is_raw
, v
);
1329 if (status
< 0) return -1;
1330 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "ACPRED plane encoding: "
1331 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1332 v
->condover
= CONDOVER_NONE
;
1333 if(v
->overlap
&& v
->pq
<= 8) {
1334 v
->condover
= decode012(gb
);
1335 if(v
->condover
== CONDOVER_SELECT
) {
1336 status
= bitplane_decoding(v
->over_flags_plane
, &v
->overflg_is_raw
, v
);
1337 if (status
< 0) return -1;
1338 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "CONDOVER plane encoding: "
1339 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1345 v
->postproc
= get_bits1(gb
);
1346 if (v
->extended_mv
) v
->mvrange
= get_unary(gb
, 0, 3);
1347 else v
->mvrange
= 0;
1348 v
->k_x
= v
->mvrange
+ 9 + (v
->mvrange
>> 1); //k_x can be 9 10 12 13
1349 v
->k_y
= v
->mvrange
+ 8; //k_y can be 8 9 10 11
1350 v
->range_x
= 1 << (v
->k_x
- 1);
1351 v
->range_y
= 1 << (v
->k_y
- 1);
1353 if (v
->pq
< 5) v
->tt_index
= 0;
1354 else if(v
->pq
< 13) v
->tt_index
= 1;
1355 else v
->tt_index
= 2;
1357 lowquant
= (v
->pq
> 12) ? 0 : 1;
1358 v
->mv_mode
= ff_vc1_mv_pmode_table
[lowquant
][get_unary(gb
, 1, 4)];
1359 if (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
1361 int scale
, shift
, i
;
1362 v
->mv_mode2
= ff_vc1_mv_pmode_table2
[lowquant
][get_unary(gb
, 1, 3)];
1363 v
->lumscale
= get_bits(gb
, 6);
1364 v
->lumshift
= get_bits(gb
, 6);
1365 /* fill lookup tables for intensity compensation */
1368 shift
= (255 - v
->lumshift
* 2) << 6;
1369 if(v
->lumshift
> 31)
1372 scale
= v
->lumscale
+ 32;
1373 if(v
->lumshift
> 31)
1374 shift
= (v
->lumshift
- 64) << 6;
1376 shift
= v
->lumshift
<< 6;
1378 for(i
= 0; i
< 256; i
++) {
1379 v
->luty
[i
] = av_clip_uint8((scale
* i
+ shift
+ 32) >> 6);
1380 v
->lutuv
[i
] = av_clip_uint8((scale
* (i
- 128) + 128*64 + 32) >> 6);
1384 if(v
->mv_mode
== MV_PMODE_1MV_HPEL
|| v
->mv_mode
== MV_PMODE_1MV_HPEL_BILIN
)
1385 v
->s
.quarter_sample
= 0;
1386 else if(v
->mv_mode
== MV_PMODE_INTENSITY_COMP
) {
1387 if(v
->mv_mode2
== MV_PMODE_1MV_HPEL
|| v
->mv_mode2
== MV_PMODE_1MV_HPEL_BILIN
)
1388 v
->s
.quarter_sample
= 0;
1390 v
->s
.quarter_sample
= 1;
1392 v
->s
.quarter_sample
= 1;
1393 v
->s
.mspel
= !(v
->mv_mode
== MV_PMODE_1MV_HPEL_BILIN
|| (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
&& v
->mv_mode2
== MV_PMODE_1MV_HPEL_BILIN
));
1395 if ((v
->mv_mode
== MV_PMODE_INTENSITY_COMP
&&
1396 v
->mv_mode2
== MV_PMODE_MIXED_MV
)
1397 || v
->mv_mode
== MV_PMODE_MIXED_MV
)
1399 status
= bitplane_decoding(v
->mv_type_mb_plane
, &v
->mv_type_is_raw
, v
);
1400 if (status
< 0) return -1;
1401 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB MV Type plane encoding: "
1402 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1404 v
->mv_type_is_raw
= 0;
1405 memset(v
->mv_type_mb_plane
, 0, v
->s
.mb_stride
* v
->s
.mb_height
);
1407 status
= bitplane_decoding(v
->s
.mbskip_table
, &v
->skip_is_raw
, v
);
1408 if (status
< 0) return -1;
1409 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Skip plane encoding: "
1410 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1412 /* Hopefully this is correct for P frames */
1413 v
->s
.mv_table_index
= get_bits(gb
, 2); //but using ff_vc1_ tables
1414 v
->cbpcy_vlc
= &ff_vc1_cbpcy_p_vlc
[get_bits(gb
, 2)];
1417 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1418 vop_dquant_decoding(v
);
1421 v
->ttfrm
= 0; //FIXME Is that so ?
1424 v
->ttmbf
= get_bits1(gb
);
1427 v
->ttfrm
= ff_vc1_ttfrm_to_tt
[get_bits(gb
, 2)];
1436 v
->postproc
= get_bits1(gb
);
1437 if (v
->extended_mv
) v
->mvrange
= get_unary(gb
, 0, 3);
1438 else v
->mvrange
= 0;
1439 v
->k_x
= v
->mvrange
+ 9 + (v
->mvrange
>> 1); //k_x can be 9 10 12 13
1440 v
->k_y
= v
->mvrange
+ 8; //k_y can be 8 9 10 11
1441 v
->range_x
= 1 << (v
->k_x
- 1);
1442 v
->range_y
= 1 << (v
->k_y
- 1);
1444 if (v
->pq
< 5) v
->tt_index
= 0;
1445 else if(v
->pq
< 13) v
->tt_index
= 1;
1446 else v
->tt_index
= 2;
1448 lowquant
= (v
->pq
> 12) ? 0 : 1;
1449 v
->mv_mode
= get_bits1(gb
) ? MV_PMODE_1MV
: MV_PMODE_1MV_HPEL_BILIN
;
1450 v
->s
.quarter_sample
= (v
->mv_mode
== MV_PMODE_1MV
);
1451 v
->s
.mspel
= v
->s
.quarter_sample
;
1453 status
= bitplane_decoding(v
->direct_mb_plane
, &v
->dmb_is_raw
, v
);
1454 if (status
< 0) return -1;
1455 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Direct Type plane encoding: "
1456 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1457 status
= bitplane_decoding(v
->s
.mbskip_table
, &v
->skip_is_raw
, v
);
1458 if (status
< 0) return -1;
1459 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Skip plane encoding: "
1460 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1462 v
->s
.mv_table_index
= get_bits(gb
, 2);
1463 v
->cbpcy_vlc
= &ff_vc1_cbpcy_p_vlc
[get_bits(gb
, 2)];
1467 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1468 vop_dquant_decoding(v
);
1474 v
->ttmbf
= get_bits1(gb
);
1477 v
->ttfrm
= ff_vc1_ttfrm_to_tt
[get_bits(gb
, 2)];
1487 v
->c_ac_table_index
= decode012(gb
);
1488 if (v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
)
1490 v
->y_ac_table_index
= decode012(gb
);
1493 v
->s
.dc_table_index
= get_bits1(gb
);
1494 if ((v
->s
.pict_type
== FF_I_TYPE
|| v
->s
.pict_type
== FF_BI_TYPE
) && v
->dquant
) {
1495 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1496 vop_dquant_decoding(v
);
1500 if(v
->s
.pict_type
== FF_BI_TYPE
) {
1501 v
->s
.pict_type
= FF_B_TYPE
;
1507 /***********************************************************************/
1509 * @defgroup block VC-1 Block-level functions
1510 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1516 * @brief Get macroblock-level quantizer scale
1518 #define GET_MQUANT() \
1522 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1526 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
1530 mqdiff = get_bits(gb, 3); \
1531 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1532 else mquant = get_bits(gb, 5); \
1535 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1536 edges = 1 << v->dqsbedge; \
1537 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1538 edges = (3 << v->dqsbedge) % 15; \
1539 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
1541 if((edges&1) && !s->mb_x) \
1542 mquant = v->altpq; \
1543 if((edges&2) && s->first_slice_line) \
1544 mquant = v->altpq; \
1545 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
1546 mquant = v->altpq; \
1547 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
1548 mquant = v->altpq; \
1552 * @def GET_MVDATA(_dmv_x, _dmv_y)
1553 * @brief Get MV differentials
1554 * @see MVDATA decoding from 8.3.5.2, p(1)20
1555 * @param _dmv_x Horizontal differential for decoded MV
1556 * @param _dmv_y Vertical differential for decoded MV
1558 #define GET_MVDATA(_dmv_x, _dmv_y) \
1559 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\
1560 VC1_MV_DIFF_VLC_BITS, 2); \
1563 mb_has_coeffs = 1; \
1566 else mb_has_coeffs = 0; \
1568 if (!index) { _dmv_x = _dmv_y = 0; } \
1569 else if (index == 35) \
1571 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1572 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1574 else if (index == 36) \
1583 if (!s->quarter_sample && index1 == 5) val = 1; \
1585 if(size_table[index1] - val > 0) \
1586 val = get_bits(gb, size_table[index1] - val); \
1588 sign = 0 - (val&1); \
1589 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1592 if (!s->quarter_sample && index1 == 5) val = 1; \
1594 if(size_table[index1] - val > 0) \
1595 val = get_bits(gb, size_table[index1] - val); \
1597 sign = 0 - (val&1); \
1598 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1601 /** Predict and set motion vector
1603 static inline void vc1_pred_mv(MpegEncContext
*s
, int n
, int dmv_x
, int dmv_y
, int mv1
, int r_x
, int r_y
, uint8_t* is_intra
)
1605 int xy
, wrap
, off
= 0;
1610 /* scale MV difference to be quad-pel */
1611 dmv_x
<<= 1 - s
->quarter_sample
;
1612 dmv_y
<<= 1 - s
->quarter_sample
;
1614 wrap
= s
->b8_stride
;
1615 xy
= s
->block_index
[n
];
1618 s
->mv
[0][n
][0] = s
->current_picture
.motion_val
[0][xy
][0] = 0;
1619 s
->mv
[0][n
][1] = s
->current_picture
.motion_val
[0][xy
][1] = 0;
1620 s
->current_picture
.motion_val
[1][xy
][0] = 0;
1621 s
->current_picture
.motion_val
[1][xy
][1] = 0;
1622 if(mv1
) { /* duplicate motion data for 1-MV block */
1623 s
->current_picture
.motion_val
[0][xy
+ 1][0] = 0;
1624 s
->current_picture
.motion_val
[0][xy
+ 1][1] = 0;
1625 s
->current_picture
.motion_val
[0][xy
+ wrap
][0] = 0;
1626 s
->current_picture
.motion_val
[0][xy
+ wrap
][1] = 0;
1627 s
->current_picture
.motion_val
[0][xy
+ wrap
+ 1][0] = 0;
1628 s
->current_picture
.motion_val
[0][xy
+ wrap
+ 1][1] = 0;
1629 s
->current_picture
.motion_val
[1][xy
+ 1][0] = 0;
1630 s
->current_picture
.motion_val
[1][xy
+ 1][1] = 0;
1631 s
->current_picture
.motion_val
[1][xy
+ wrap
][0] = 0;
1632 s
->current_picture
.motion_val
[1][xy
+ wrap
][1] = 0;
1633 s
->current_picture
.motion_val
[1][xy
+ wrap
+ 1][0] = 0;
1634 s
->current_picture
.motion_val
[1][xy
+ wrap
+ 1][1] = 0;
1639 C
= s
->current_picture
.motion_val
[0][xy
- 1];
1640 A
= s
->current_picture
.motion_val
[0][xy
- wrap
];
1642 off
= (s
->mb_x
== (s
->mb_width
- 1)) ? -1 : 2;
1644 //in 4-MV mode different blocks have different B predictor position
1647 off
= (s
->mb_x
> 0) ? -1 : 1;
1650 off
= (s
->mb_x
== (s
->mb_width
- 1)) ? -1 : 1;
1659 B
= s
->current_picture
.motion_val
[0][xy
- wrap
+ off
];
1661 if(!s
->first_slice_line
|| (n
==2 || n
==3)) { // predictor A is not out of bounds
1662 if(s
->mb_width
== 1) {
1666 px
= mid_pred(A
[0], B
[0], C
[0]);
1667 py
= mid_pred(A
[1], B
[1], C
[1]);
1669 } else if(s
->mb_x
|| (n
==1 || n
==3)) { // predictor C is not out of bounds
1675 /* Pullback MV as specified in 8.3.5.3.4 */
1678 qx
= (s
->mb_x
<< 6) + ((n
==1 || n
==3) ? 32 : 0);
1679 qy
= (s
->mb_y
<< 6) + ((n
==2 || n
==3) ? 32 : 0);
1680 X
= (s
->mb_width
<< 6) - 4;
1681 Y
= (s
->mb_height
<< 6) - 4;
1683 if(qx
+ px
< -60) px
= -60 - qx
;
1684 if(qy
+ py
< -60) py
= -60 - qy
;
1686 if(qx
+ px
< -28) px
= -28 - qx
;
1687 if(qy
+ py
< -28) py
= -28 - qy
;
1689 if(qx
+ px
> X
) px
= X
- qx
;
1690 if(qy
+ py
> Y
) py
= Y
- qy
;
1692 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
1693 if((!s
->first_slice_line
|| (n
==2 || n
==3)) && (s
->mb_x
|| (n
==1 || n
==3))) {
1694 if(is_intra
[xy
- wrap
])
1695 sum
= FFABS(px
) + FFABS(py
);
1697 sum
= FFABS(px
- A
[0]) + FFABS(py
- A
[1]);
1699 if(get_bits1(&s
->gb
)) {
1707 if(is_intra
[xy
- 1])
1708 sum
= FFABS(px
) + FFABS(py
);
1710 sum
= FFABS(px
- C
[0]) + FFABS(py
- C
[1]);
1712 if(get_bits1(&s
->gb
)) {
1722 /* store MV using signed modulus of MV range defined in 4.11 */
1723 s
->mv
[0][n
][0] = s
->current_picture
.motion_val
[0][xy
][0] = ((px
+ dmv_x
+ r_x
) & ((r_x
<< 1) - 1)) - r_x
;
1724 s
->mv
[0][n
][1] = s
->current_picture
.motion_val
[0][xy
][1] = ((py
+ dmv_y
+ r_y
) & ((r_y
<< 1) - 1)) - r_y
;
1725 if(mv1
) { /* duplicate motion data for 1-MV block */
1726 s
->current_picture
.motion_val
[0][xy
+ 1][0] = s
->current_picture
.motion_val
[0][xy
][0];
1727 s
->current_picture
.motion_val
[0][xy
+ 1][1] = s
->current_picture
.motion_val
[0][xy
][1];
1728 s
->current_picture
.motion_val
[0][xy
+ wrap
][0] = s
->current_picture
.motion_val
[0][xy
][0];
1729 s
->current_picture
.motion_val
[0][xy
+ wrap
][1] = s
->current_picture
.motion_val
[0][xy
][1];
1730 s
->current_picture
.motion_val
[0][xy
+ wrap
+ 1][0] = s
->current_picture
.motion_val
[0][xy
][0];
1731 s
->current_picture
.motion_val
[0][xy
+ wrap
+ 1][1] = s
->current_picture
.motion_val
[0][xy
][1];
1735 /** Motion compensation for direct or interpolated blocks in B-frames
1737 static void vc1_interp_mc(VC1Context
*v
)
1739 MpegEncContext
*s
= &v
->s
;
1740 DSPContext
*dsp
= &v
->s
.dsp
;
1741 uint8_t *srcY
, *srcU
, *srcV
;
1742 int dxy
, uvdxy
, mx
, my
, uvmx
, uvmy
, src_x
, src_y
, uvsrc_x
, uvsrc_y
;
1744 if(!v
->s
.next_picture
.data
[0])return;
1746 mx
= s
->mv
[1][0][0];
1747 my
= s
->mv
[1][0][1];
1748 uvmx
= (mx
+ ((mx
& 3) == 3)) >> 1;
1749 uvmy
= (my
+ ((my
& 3) == 3)) >> 1;
1751 uvmx
= uvmx
+ ((uvmx
<0)?-(uvmx
&1):(uvmx
&1));
1752 uvmy
= uvmy
+ ((uvmy
<0)?-(uvmy
&1):(uvmy
&1));
1754 srcY
= s
->next_picture
.data
[0];
1755 srcU
= s
->next_picture
.data
[1];
1756 srcV
= s
->next_picture
.data
[2];
1758 src_x
= s
->mb_x
* 16 + (mx
>> 2);
1759 src_y
= s
->mb_y
* 16 + (my
>> 2);
1760 uvsrc_x
= s
->mb_x
* 8 + (uvmx
>> 2);
1761 uvsrc_y
= s
->mb_y
* 8 + (uvmy
>> 2);
1763 if(v
->profile
!= PROFILE_ADVANCED
){
1764 src_x
= av_clip( src_x
, -16, s
->mb_width
* 16);
1765 src_y
= av_clip( src_y
, -16, s
->mb_height
* 16);
1766 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->mb_width
* 8);
1767 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->mb_height
* 8);
1769 src_x
= av_clip( src_x
, -17, s
->avctx
->coded_width
);
1770 src_y
= av_clip( src_y
, -18, s
->avctx
->coded_height
+ 1);
1771 uvsrc_x
= av_clip(uvsrc_x
, -8, s
->avctx
->coded_width
>> 1);
1772 uvsrc_y
= av_clip(uvsrc_y
, -8, s
->avctx
->coded_height
>> 1);
1775 srcY
+= src_y
* s
->linesize
+ src_x
;
1776 srcU
+= uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
1777 srcV
+= uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
1779 /* for grayscale we should not try to read from unknown area */
1780 if(s
->flags
& CODEC_FLAG_GRAY
) {
1781 srcU
= s
->edge_emu_buffer
+ 18 * s
->linesize
;
1782 srcV
= s
->edge_emu_buffer
+ 18 * s
->linesize
;
1786 || (unsigned)src_x
> s
->h_edge_pos
- (mx
&3) - 16
1787 || (unsigned)src_y
> s
->v_edge_pos
- (my
&3) - 16){
1788 uint8_t *uvbuf
= s
->edge_emu_buffer
+ 19 * s
->linesize
;
1790 srcY
-= s
->mspel
* (1 + s
->linesize
);
1791 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcY
, s
->linesize
, 17+s
->mspel
*2, 17+s
->mspel
*2,
1792 src_x
- s
->mspel
, src_y
- s
->mspel
, s
->h_edge_pos
, s
->v_edge_pos
);
1793 srcY
= s
->edge_emu_buffer
;
1794 ff_emulated_edge_mc(uvbuf
, srcU
, s
->uvlinesize
, 8+1, 8+1,
1795 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
1796 ff_emulated_edge_mc(uvbuf
+ 16, srcV
, s
->uvlinesize
, 8+1, 8+1,
1797 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
1800 /* if we deal with range reduction we need to scale source blocks */
1801 if(v
->rangeredfrm
) {
1803 uint8_t *src
, *src2
;
1806 for(j
= 0; j
< 17 + s
->mspel
*2; j
++) {
1807 for(i
= 0; i
< 17 + s
->mspel
*2; i
++) src
[i
] = ((src
[i
] - 128) >> 1) + 128;
1810 src
= srcU
; src2
= srcV
;
1811 for(j
= 0; j
< 9; j
++) {
1812 for(i
= 0; i
< 9; i
++) {
1813 src
[i
] = ((src
[i
] - 128) >> 1) + 128;
1814 src2
[i
] = ((src2
[i
] - 128) >> 1) + 128;
1816 src
+= s
->uvlinesize
;
1817 src2
+= s
->uvlinesize
;
1820 srcY
+= s
->mspel
* (1 + s
->linesize
);
1825 dxy
= ((my
& 1) << 1) | (mx
& 1);
1827 dsp
->avg_pixels_tab
[0][dxy
](s
->dest
[0], srcY
, s
->linesize
, 16);
1829 if(s
->flags
& CODEC_FLAG_GRAY
) return;
1830 /* Chroma MC always uses qpel blilinear */
1831 uvdxy
= ((uvmy
& 3) << 2) | (uvmx
& 3);
1834 dsp
->avg_h264_chroma_pixels_tab
[0](s
->dest
[1], srcU
, s
->uvlinesize
, 8, uvmx
, uvmy
);
1835 dsp
->avg_h264_chroma_pixels_tab
[0](s
->dest
[2], srcV
, s
->uvlinesize
, 8, uvmx
, uvmy
);
1838 static av_always_inline
int scale_mv(int value
, int bfrac
, int inv
, int qs
)
1842 #if B_FRACTION_DEN==256
1846 return 2 * ((value
* n
+ 255) >> 9);
1847 return (value
* n
+ 128) >> 8;
1850 n
-= B_FRACTION_DEN
;
1852 return 2 * ((value
* n
+ B_FRACTION_DEN
- 1) / (2 * B_FRACTION_DEN
));
1853 return (value
* n
+ B_FRACTION_DEN
/2) / B_FRACTION_DEN
;
1857 /** Reconstruct motion vector for B-frame and do motion compensation
1859 static inline void vc1_b_mc(VC1Context
*v
, int dmv_x
[2], int dmv_y
[2], int direct
, int mode
)
1862 v
->mv_mode2
= v
->mv_mode
;
1863 v
->mv_mode
= MV_PMODE_INTENSITY_COMP
;
1868 if(v
->use_ic
) v
->mv_mode
= v
->mv_mode2
;
1871 if(mode
== BMV_TYPE_INTERPOLATED
) {
1874 if(v
->use_ic
) v
->mv_mode
= v
->mv_mode2
;
1878 if(v
->use_ic
&& (mode
== BMV_TYPE_BACKWARD
)) v
->mv_mode
= v
->mv_mode2
;
1879 vc1_mc_1mv(v
, (mode
== BMV_TYPE_BACKWARD
));
1880 if(v
->use_ic
) v
->mv_mode
= v
->mv_mode2
;
1883 static inline void vc1_pred_b_mv(VC1Context
*v
, int dmv_x
[2], int dmv_y
[2], int direct
, int mvtype
)
1885 MpegEncContext
*s
= &v
->s
;
1886 int xy
, wrap
, off
= 0;
1891 const uint8_t *is_intra
= v
->mb_type
[0];
1895 /* scale MV difference to be quad-pel */
1896 dmv_x
[0] <<= 1 - s
->quarter_sample
;
1897 dmv_y
[0] <<= 1 - s
->quarter_sample
;
1898 dmv_x
[1] <<= 1 - s
->quarter_sample
;
1899 dmv_y
[1] <<= 1 - s
->quarter_sample
;
1901 wrap
= s
->b8_stride
;
1902 xy
= s
->block_index
[0];
1905 s
->current_picture
.motion_val
[0][xy
][0] =
1906 s
->current_picture
.motion_val
[0][xy
][1] =
1907 s
->current_picture
.motion_val
[1][xy
][0] =
1908 s
->current_picture
.motion_val
[1][xy
][1] = 0;
1911 s
->mv
[0][0][0] = scale_mv(s
->next_picture
.motion_val
[1][xy
][0], v
->bfraction
, 0, s
->quarter_sample
);
1912 s
->mv
[0][0][1] = scale_mv(s
->next_picture
.motion_val
[1][xy
][1], v
->bfraction
, 0, s
->quarter_sample
);
1913 s
->mv
[1][0][0] = scale_mv(s
->next_picture
.motion_val
[1][xy
][0], v
->bfraction
, 1, s
->quarter_sample
);
1914 s
->mv
[1][0][1] = scale_mv(s
->next_picture
.motion_val
[1][xy
][1], v
->bfraction
, 1, s
->quarter_sample
);
1916 /* Pullback predicted motion vectors as specified in 8.4.5.4 */
1917 s
->mv
[0][0][0] = av_clip(s
->mv
[0][0][0], -60 - (s
->mb_x
<< 6), (s
->mb_width
<< 6) - 4 - (s
->mb_x
<< 6));
1918 s
->mv
[0][0][1] = av_clip(s
->mv
[0][0][1], -60 - (s
->mb_y
<< 6), (s
->mb_height
<< 6) - 4 - (s
->mb_y
<< 6));
1919 s
->mv
[1][0][0] = av_clip(s
->mv
[1][0][0], -60 - (s
->mb_x
<< 6), (s
->mb_width
<< 6) - 4 - (s
->mb_x
<< 6));
1920 s
->mv
[1][0][1] = av_clip(s
->mv
[1][0][1], -60 - (s
->mb_y
<< 6), (s
->mb_height
<< 6) - 4 - (s
->mb_y
<< 6));
1922 s
->current_picture
.motion_val
[0][xy
][0] = s
->mv
[0][0][0];
1923 s
->current_picture
.motion_val
[0][xy
][1] = s
->mv
[0][0][1];
1924 s
->current_picture
.motion_val
[1][xy
][0] = s
->mv
[1][0][0];
1925 s
->current_picture
.motion_val
[1][xy
][1] = s
->mv
[1][0][1];
1929 if((mvtype
== BMV_TYPE_FORWARD
) || (mvtype
== BMV_TYPE_INTERPOLATED
)) {
1930 C
= s
->current_picture
.motion_val
[0][xy
- 2];
1931 A
= s
->current_picture
.motion_val
[0][xy
- wrap
*2];
1932 off
= (s
->mb_x
== (s
->mb_width
- 1)) ? -2 : 2;
1933 B
= s
->current_picture
.motion_val
[0][xy
- wrap
*2 + off
];
1935 if(!s
->mb_x
) C
[0] = C
[1] = 0;
1936 if(!s
->first_slice_line
) { // predictor A is not out of bounds
1937 if(s
->mb_width
== 1) {
1941 px
= mid_pred(A
[0], B
[0], C
[0]);
1942 py
= mid_pred(A
[1], B
[1], C
[1]);
1944 } else if(s
->mb_x
) { // predictor C is not out of bounds
1950 /* Pullback MV as specified in 8.3.5.3.4 */
1953 if(v
->profile
< PROFILE_ADVANCED
) {
1954 qx
= (s
->mb_x
<< 5);
1955 qy
= (s
->mb_y
<< 5);
1956 X
= (s
->mb_width
<< 5) - 4;
1957 Y
= (s
->mb_height
<< 5) - 4;
1958 if(qx
+ px
< -28) px
= -28 - qx
;
1959 if(qy
+ py
< -28) py
= -28 - qy
;
1960 if(qx
+ px
> X
) px
= X
- qx
;
1961 if(qy
+ py
> Y
) py
= Y
- qy
;
1963 qx
= (s
->mb_x
<< 6);
1964 qy
= (s
->mb_y
<< 6);
1965 X
= (s
->mb_width
<< 6) - 4;
1966 Y
= (s
->mb_height
<< 6) - 4;
1967 if(qx
+ px
< -60) px
= -60 - qx
;
1968 if(qy
+ py
< -60) py
= -60 - qy
;
1969 if(qx
+ px
> X
) px
= X
- qx
;
1970 if(qy
+ py
> Y
) py
= Y
- qy
;
1973 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
1974 if(0 && !s
->first_slice_line
&& s
->mb_x
) {
1975 if(is_intra
[xy
- wrap
])
1976 sum
= FFABS(px
) + FFABS(py
);
1978 sum
= FFABS(px
- A
[0]) + FFABS(py
- A
[1]);
1980 if(get_bits1(&s
->gb
)) {
1988 if(is_intra
[xy
- 2])
1989 sum
= FFABS(px
) + FFABS(py
);
1991 sum
= FFABS(px
- C
[0]) + FFABS(py
- C
[1]);
1993 if(get_bits1(&s
->gb
)) {
2003 /* store MV using signed modulus of MV range defined in 4.11 */
2004 s
->mv
[0][0][0] = ((px
+ dmv_x
[0] + r_x
) & ((r_x
<< 1) - 1)) - r_x
;
2005 s
->mv
[0][0][1] = ((py
+ dmv_y
[0] + r_y
) & ((r_y
<< 1) - 1)) - r_y
;
2007 if((mvtype
== BMV_TYPE_BACKWARD
) || (mvtype
== BMV_TYPE_INTERPOLATED
)) {
2008 C
= s
->current_picture
.motion_val
[1][xy
- 2];
2009 A
= s
->current_picture
.motion_val
[1][xy
- wrap
*2];
2010 off
= (s
->mb_x
== (s
->mb_width
- 1)) ? -2 : 2;
2011 B
= s
->current_picture
.motion_val
[1][xy
- wrap
*2 + off
];
2013 if(!s
->mb_x
) C
[0] = C
[1] = 0;
2014 if(!s
->first_slice_line
) { // predictor A is not out of bounds
2015 if(s
->mb_width
== 1) {
2019 px
= mid_pred(A
[0], B
[0], C
[0]);
2020 py
= mid_pred(A
[1], B
[1], C
[1]);
2022 } else if(s
->mb_x
) { // predictor C is not out of bounds
2028 /* Pullback MV as specified in 8.3.5.3.4 */
2031 if(v
->profile
< PROFILE_ADVANCED
) {
2032 qx
= (s
->mb_x
<< 5);
2033 qy
= (s
->mb_y
<< 5);
2034 X
= (s
->mb_width
<< 5) - 4;
2035 Y
= (s
->mb_height
<< 5) - 4;
2036 if(qx
+ px
< -28) px
= -28 - qx
;
2037 if(qy
+ py
< -28) py
= -28 - qy
;
2038 if(qx
+ px
> X
) px
= X
- qx
;
2039 if(qy
+ py
> Y
) py
= Y
- qy
;
2041 qx
= (s
->mb_x
<< 6);
2042 qy
= (s
->mb_y
<< 6);
2043 X
= (s
->mb_width
<< 6) - 4;
2044 Y
= (s
->mb_height
<< 6) - 4;
2045 if(qx
+ px
< -60) px
= -60 - qx
;
2046 if(qy
+ py
< -60) py
= -60 - qy
;
2047 if(qx
+ px
> X
) px
= X
- qx
;
2048 if(qy
+ py
> Y
) py
= Y
- qy
;
2051 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2052 if(0 && !s
->first_slice_line
&& s
->mb_x
) {
2053 if(is_intra
[xy
- wrap
])
2054 sum
= FFABS(px
) + FFABS(py
);
2056 sum
= FFABS(px
- A
[0]) + FFABS(py
- A
[1]);
2058 if(get_bits1(&s
->gb
)) {
2066 if(is_intra
[xy
- 2])
2067 sum
= FFABS(px
) + FFABS(py
);
2069 sum
= FFABS(px
- C
[0]) + FFABS(py
- C
[1]);
2071 if(get_bits1(&s
->gb
)) {
2081 /* store MV using signed modulus of MV range defined in 4.11 */
2083 s
->mv
[1][0][0] = ((px
+ dmv_x
[1] + r_x
) & ((r_x
<< 1) - 1)) - r_x
;
2084 s
->mv
[1][0][1] = ((py
+ dmv_y
[1] + r_y
) & ((r_y
<< 1) - 1)) - r_y
;
2086 s
->current_picture
.motion_val
[0][xy
][0] = s
->mv
[0][0][0];
2087 s
->current_picture
.motion_val
[0][xy
][1] = s
->mv
[0][0][1];
2088 s
->current_picture
.motion_val
[1][xy
][0] = s
->mv
[1][0][0];
2089 s
->current_picture
.motion_val
[1][xy
][1] = s
->mv
[1][0][1];
2092 /** Get predicted DC value for I-frames only
2093 * prediction dir: left=0, top=1
2094 * @param s MpegEncContext
2095 * @param[in] n block index in the current MB
2096 * @param dc_val_ptr Pointer to DC predictor
2097 * @param dir_ptr Prediction direction for use in AC prediction
2099 static inline int vc1_i_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
2100 int16_t **dc_val_ptr
, int *dir_ptr
)
2102 int a
, b
, c
, wrap
, pred
, scale
;
2104 static const uint16_t dcpred
[32] = {
2105 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
2106 114, 102, 93, 85, 79, 73, 68, 64,
2107 60, 57, 54, 51, 49, 47, 45, 43,
2108 41, 39, 38, 37, 35, 34, 33
2111 /* find prediction - wmv3_dc_scale always used here in fact */
2112 if (n
< 4) scale
= s
->y_dc_scale
;
2113 else scale
= s
->c_dc_scale
;
2115 wrap
= s
->block_wrap
[n
];
2116 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
2122 b
= dc_val
[ - 1 - wrap
];
2123 a
= dc_val
[ - wrap
];
2125 if (pq
< 9 || !overlap
)
2127 /* Set outer values */
2128 if (s
->first_slice_line
&& (n
!=2 && n
!=3)) b
=a
=dcpred
[scale
];
2129 if (s
->mb_x
== 0 && (n
!=1 && n
!=3)) b
=c
=dcpred
[scale
];
2133 /* Set outer values */
2134 if (s
->first_slice_line
&& (n
!=2 && n
!=3)) b
=a
=0;
2135 if (s
->mb_x
== 0 && (n
!=1 && n
!=3)) b
=c
=0;
2138 if (abs(a
- b
) <= abs(b
- c
)) {
2146 /* update predictor */
2147 *dc_val_ptr
= &dc_val
[0];
2152 /** Get predicted DC value
2153 * prediction dir: left=0, top=1
2154 * @param s MpegEncContext
2155 * @param[in] n block index in the current MB
2156 * @param dc_val_ptr Pointer to DC predictor
2157 * @param dir_ptr Prediction direction for use in AC prediction
2159 static inline int vc1_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
2160 int a_avail
, int c_avail
,
2161 int16_t **dc_val_ptr
, int *dir_ptr
)
2163 int a
, b
, c
, wrap
, pred
, scale
;
2165 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2168 /* find prediction - wmv3_dc_scale always used here in fact */
2169 if (n
< 4) scale
= s
->y_dc_scale
;
2170 else scale
= s
->c_dc_scale
;
2172 wrap
= s
->block_wrap
[n
];
2173 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
2179 b
= dc_val
[ - 1 - wrap
];
2180 a
= dc_val
[ - wrap
];
2181 /* scale predictors if needed */
2182 q1
= s
->current_picture
.qscale_table
[mb_pos
];
2183 if(c_avail
&& (n
!= 1 && n
!=3)) {
2184 q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
2186 c
= (c
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[s
->y_dc_scale_table
[q1
] - 1] + 0x20000) >> 18;
2188 if(a_avail
&& (n
!= 2 && n
!=3)) {
2189 q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
2191 a
= (a
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[s
->y_dc_scale_table
[q1
] - 1] + 0x20000) >> 18;
2193 if(a_avail
&& c_avail
&& (n
!=3)) {
2196 if(n
!= 2) off
-= s
->mb_stride
;
2197 q2
= s
->current_picture
.qscale_table
[off
];
2199 b
= (b
* s
->y_dc_scale_table
[q2
] * ff_vc1_dqscale
[s
->y_dc_scale_table
[q1
] - 1] + 0x20000) >> 18;
2202 if(a_avail
&& c_avail
) {
2203 if(abs(a
- b
) <= abs(b
- c
)) {
2210 } else if(a_avail
) {
2213 } else if(c_avail
) {
2221 /* update predictor */
2222 *dc_val_ptr
= &dc_val
[0];
2228 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
2229 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2233 static inline int vc1_coded_block_pred(MpegEncContext
* s
, int n
, uint8_t **coded_block_ptr
)
2235 int xy
, wrap
, pred
, a
, b
, c
;
2237 xy
= s
->block_index
[n
];
2238 wrap
= s
->b8_stride
;
2243 a
= s
->coded_block
[xy
- 1 ];
2244 b
= s
->coded_block
[xy
- 1 - wrap
];
2245 c
= s
->coded_block
[xy
- wrap
];
2254 *coded_block_ptr
= &s
->coded_block
[xy
];
2260 * Decode one AC coefficient
2261 * @param v The VC1 context
2262 * @param last Last coefficient
2263 * @param skip How much zero coefficients to skip
2264 * @param value Decoded AC coefficient value
2267 static void vc1_decode_ac_coeff(VC1Context
*v
, int *last
, int *skip
, int *value
, int codingset
)
2269 GetBitContext
*gb
= &v
->s
.gb
;
2270 int index
, escape
, run
= 0, level
= 0, lst
= 0;
2272 index
= get_vlc2(gb
, ff_vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
2273 if (index
!= vc1_ac_sizes
[codingset
] - 1) {
2274 run
= vc1_index_decode_table
[codingset
][index
][0];
2275 level
= vc1_index_decode_table
[codingset
][index
][1];
2276 lst
= index
>= vc1_last_decode_table
[codingset
];
2280 escape
= decode210(gb
);
2282 index
= get_vlc2(gb
, ff_vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
2283 run
= vc1_index_decode_table
[codingset
][index
][0];
2284 level
= vc1_index_decode_table
[codingset
][index
][1];
2285 lst
= index
>= vc1_last_decode_table
[codingset
];
2288 level
+= vc1_last_delta_level_table
[codingset
][run
];
2290 level
+= vc1_delta_level_table
[codingset
][run
];
2293 run
+= vc1_last_delta_run_table
[codingset
][level
] + 1;
2295 run
+= vc1_delta_run_table
[codingset
][level
] + 1;
2301 lst
= get_bits1(gb
);
2302 if(v
->s
.esc3_level_length
== 0) {
2303 if(v
->pq
< 8 || v
->dquantfrm
) { // table 59
2304 v
->s
.esc3_level_length
= get_bits(gb
, 3);
2305 if(!v
->s
.esc3_level_length
)
2306 v
->s
.esc3_level_length
= get_bits(gb
, 2) + 8;
2308 v
->s
.esc3_level_length
= get_unary(gb
, 1, 6) + 2;
2310 v
->s
.esc3_run_length
= 3 + get_bits(gb
, 2);
2312 run
= get_bits(gb
, v
->s
.esc3_run_length
);
2313 sign
= get_bits1(gb
);
2314 level
= get_bits(gb
, v
->s
.esc3_level_length
);
2325 /** Decode intra block in intra frames - should be faster than decode_intra_block
2326 * @param v VC1Context
2327 * @param block block to decode
2328 * @param coded are AC coeffs present or not
2329 * @param codingset set of VLC to decode data
2331 static int vc1_decode_i_block(VC1Context
*v
, DCTELEM block
[64], int n
, int coded
, int codingset
)
2333 GetBitContext
*gb
= &v
->s
.gb
;
2334 MpegEncContext
*s
= &v
->s
;
2335 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
2338 int16_t *ac_val
, *ac_val2
;
2341 /* Get DC differential */
2343 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2345 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2348 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
2353 if (dcdiff
== 119 /* ESC index value */)
2355 /* TODO: Optimize */
2356 if (v
->pq
== 1) dcdiff
= get_bits(gb
, 10);
2357 else if (v
->pq
== 2) dcdiff
= get_bits(gb
, 9);
2358 else dcdiff
= get_bits(gb
, 8);
2363 dcdiff
= (dcdiff
<<2) + get_bits(gb
, 2) - 3;
2364 else if (v
->pq
== 2)
2365 dcdiff
= (dcdiff
<<1) + get_bits1(gb
) - 1;
2372 dcdiff
+= vc1_i_pred_dc(&v
->s
, v
->overlap
, v
->pq
, n
, &dc_val
, &dc_pred_dir
);
2375 /* Store the quantized DC coeff, used for prediction */
2377 block
[0] = dcdiff
* s
->y_dc_scale
;
2379 block
[0] = dcdiff
* s
->c_dc_scale
;
2392 int last
= 0, skip
, value
;
2393 const int8_t *zz_table
;
2397 scale
= v
->pq
* 2 + v
->halfpq
;
2401 zz_table
= ff_vc1_horizontal_zz
;
2403 zz_table
= ff_vc1_vertical_zz
;
2405 zz_table
= ff_vc1_normal_zz
;
2407 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
2409 if(dc_pred_dir
) //left
2412 ac_val
-= 16 * s
->block_wrap
[n
];
2415 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
2419 block
[zz_table
[i
++]] = value
;
2422 /* apply AC prediction if needed */
2424 if(dc_pred_dir
) { //left
2425 for(k
= 1; k
< 8; k
++)
2426 block
[k
<< 3] += ac_val
[k
];
2428 for(k
= 1; k
< 8; k
++)
2429 block
[k
] += ac_val
[k
+ 8];
2432 /* save AC coeffs for further prediction */
2433 for(k
= 1; k
< 8; k
++) {
2434 ac_val2
[k
] = block
[k
<< 3];
2435 ac_val2
[k
+ 8] = block
[k
];
2438 /* scale AC coeffs */
2439 for(k
= 1; k
< 64; k
++)
2443 block
[k
] += (block
[k
] < 0) ? -v
->pq
: v
->pq
;
2446 if(s
->ac_pred
) i
= 63;
2452 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
2455 scale
= v
->pq
* 2 + v
->halfpq
;
2456 memset(ac_val2
, 0, 16 * 2);
2457 if(dc_pred_dir
) {//left
2460 memcpy(ac_val2
, ac_val
, 8 * 2);
2462 ac_val
-= 16 * s
->block_wrap
[n
];
2464 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
2467 /* apply AC prediction if needed */
2469 if(dc_pred_dir
) { //left
2470 for(k
= 1; k
< 8; k
++) {
2471 block
[k
<< 3] = ac_val
[k
] * scale
;
2472 if(!v
->pquantizer
&& block
[k
<< 3])
2473 block
[k
<< 3] += (block
[k
<< 3] < 0) ? -v
->pq
: v
->pq
;
2476 for(k
= 1; k
< 8; k
++) {
2477 block
[k
] = ac_val
[k
+ 8] * scale
;
2478 if(!v
->pquantizer
&& block
[k
])
2479 block
[k
] += (block
[k
] < 0) ? -v
->pq
: v
->pq
;
2485 s
->block_last_index
[n
] = i
;
2490 /** Decode intra block in intra frames - should be faster than decode_intra_block
2491 * @param v VC1Context
2492 * @param block block to decode
2493 * @param coded are AC coeffs present or not
2494 * @param codingset set of VLC to decode data
2496 static int vc1_decode_i_block_adv(VC1Context
*v
, DCTELEM block
[64], int n
, int coded
, int codingset
, int mquant
)
2498 GetBitContext
*gb
= &v
->s
.gb
;
2499 MpegEncContext
*s
= &v
->s
;
2500 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
2503 int16_t *ac_val
, *ac_val2
;
2505 int a_avail
= v
->a_avail
, c_avail
= v
->c_avail
;
2506 int use_pred
= s
->ac_pred
;
2509 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2511 /* Get DC differential */
2513 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2515 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2518 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
2523 if (dcdiff
== 119 /* ESC index value */)
2525 /* TODO: Optimize */
2526 if (mquant
== 1) dcdiff
= get_bits(gb
, 10);
2527 else if (mquant
== 2) dcdiff
= get_bits(gb
, 9);
2528 else dcdiff
= get_bits(gb
, 8);
2533 dcdiff
= (dcdiff
<<2) + get_bits(gb
, 2) - 3;
2534 else if (mquant
== 2)
2535 dcdiff
= (dcdiff
<<1) + get_bits1(gb
) - 1;
2542 dcdiff
+= vc1_pred_dc(&v
->s
, v
->overlap
, mquant
, n
, v
->a_avail
, v
->c_avail
, &dc_val
, &dc_pred_dir
);
2545 /* Store the quantized DC coeff, used for prediction */
2547 block
[0] = dcdiff
* s
->y_dc_scale
;
2549 block
[0] = dcdiff
* s
->c_dc_scale
;
2558 /* check if AC is needed at all */
2559 if(!a_avail
&& !c_avail
) use_pred
= 0;
2560 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
2563 scale
= mquant
* 2 + ((mquant
== v
->pq
) ? v
->halfpq
: 0);
2565 if(dc_pred_dir
) //left
2568 ac_val
-= 16 * s
->block_wrap
[n
];
2570 q1
= s
->current_picture
.qscale_table
[mb_pos
];
2571 if(dc_pred_dir
&& c_avail
&& mb_pos
) q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
2572 if(!dc_pred_dir
&& a_avail
&& mb_pos
>= s
->mb_stride
) q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
2573 if(dc_pred_dir
&& n
==1) q2
= q1
;
2574 if(!dc_pred_dir
&& n
==2) q2
= q1
;
2578 int last
= 0, skip
, value
;
2579 const int8_t *zz_table
;
2584 zz_table
= ff_vc1_horizontal_zz
;
2586 zz_table
= ff_vc1_vertical_zz
;
2588 zz_table
= ff_vc1_normal_zz
;
2591 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
2595 block
[zz_table
[i
++]] = value
;
2598 /* apply AC prediction if needed */
2600 /* scale predictors if needed*/
2602 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2603 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2605 if(dc_pred_dir
) { //left
2606 for(k
= 1; k
< 8; k
++)
2607 block
[k
<< 3] += (ac_val
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2609 for(k
= 1; k
< 8; k
++)
2610 block
[k
] += (ac_val
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2613 if(dc_pred_dir
) { //left
2614 for(k
= 1; k
< 8; k
++)
2615 block
[k
<< 3] += ac_val
[k
];
2617 for(k
= 1; k
< 8; k
++)
2618 block
[k
] += ac_val
[k
+ 8];
2622 /* save AC coeffs for further prediction */
2623 for(k
= 1; k
< 8; k
++) {
2624 ac_val2
[k
] = block
[k
<< 3];
2625 ac_val2
[k
+ 8] = block
[k
];
2628 /* scale AC coeffs */
2629 for(k
= 1; k
< 64; k
++)
2633 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
2636 if(use_pred
) i
= 63;
2637 } else { // no AC coeffs
2640 memset(ac_val2
, 0, 16 * 2);
2641 if(dc_pred_dir
) {//left
2643 memcpy(ac_val2
, ac_val
, 8 * 2);
2645 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2646 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2647 for(k
= 1; k
< 8; k
++)
2648 ac_val2
[k
] = (ac_val2
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2653 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
2655 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2656 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2657 for(k
= 1; k
< 8; k
++)
2658 ac_val2
[k
+ 8] = (ac_val2
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2663 /* apply AC prediction if needed */
2665 if(dc_pred_dir
) { //left
2666 for(k
= 1; k
< 8; k
++) {
2667 block
[k
<< 3] = ac_val2
[k
] * scale
;
2668 if(!v
->pquantizer
&& block
[k
<< 3])
2669 block
[k
<< 3] += (block
[k
<< 3] < 0) ? -mquant
: mquant
;
2672 for(k
= 1; k
< 8; k
++) {
2673 block
[k
] = ac_val2
[k
+ 8] * scale
;
2674 if(!v
->pquantizer
&& block
[k
])
2675 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
2681 s
->block_last_index
[n
] = i
;
2686 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2687 * @param v VC1Context
2688 * @param block block to decode
2689 * @param coded are AC coeffs present or not
2690 * @param mquant block quantizer
2691 * @param codingset set of VLC to decode data
2693 static int vc1_decode_intra_block(VC1Context
*v
, DCTELEM block
[64], int n
, int coded
, int mquant
, int codingset
)
2695 GetBitContext
*gb
= &v
->s
.gb
;
2696 MpegEncContext
*s
= &v
->s
;
2697 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
2700 int16_t *ac_val
, *ac_val2
;
2702 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2703 int a_avail
= v
->a_avail
, c_avail
= v
->c_avail
;
2704 int use_pred
= s
->ac_pred
;
2708 /* XXX: Guard against dumb values of mquant */
2709 mquant
= (mquant
< 1) ? 0 : ( (mquant
>31) ? 31 : mquant
);
2711 /* Set DC scale - y and c use the same */
2712 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
2713 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
2715 /* Get DC differential */
2717 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2719 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
2722 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
2727 if (dcdiff
== 119 /* ESC index value */)
2729 /* TODO: Optimize */
2730 if (mquant
== 1) dcdiff
= get_bits(gb
, 10);
2731 else if (mquant
== 2) dcdiff
= get_bits(gb
, 9);
2732 else dcdiff
= get_bits(gb
, 8);
2737 dcdiff
= (dcdiff
<<2) + get_bits(gb
, 2) - 3;
2738 else if (mquant
== 2)
2739 dcdiff
= (dcdiff
<<1) + get_bits1(gb
) - 1;
2746 dcdiff
+= vc1_pred_dc(&v
->s
, v
->overlap
, mquant
, n
, a_avail
, c_avail
, &dc_val
, &dc_pred_dir
);
2749 /* Store the quantized DC coeff, used for prediction */
2752 block
[0] = dcdiff
* s
->y_dc_scale
;
2754 block
[0] = dcdiff
* s
->c_dc_scale
;
2763 /* check if AC is needed at all and adjust direction if needed */
2764 if(!a_avail
) dc_pred_dir
= 1;
2765 if(!c_avail
) dc_pred_dir
= 0;
2766 if(!a_avail
&& !c_avail
) use_pred
= 0;
2767 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
2770 scale
= mquant
* 2 + v
->halfpq
;
2772 if(dc_pred_dir
) //left
2775 ac_val
-= 16 * s
->block_wrap
[n
];
2777 q1
= s
->current_picture
.qscale_table
[mb_pos
];
2778 if(dc_pred_dir
&& c_avail
&& mb_pos
) q2
= s
->current_picture
.qscale_table
[mb_pos
- 1];
2779 if(!dc_pred_dir
&& a_avail
&& mb_pos
>= s
->mb_stride
) q2
= s
->current_picture
.qscale_table
[mb_pos
- s
->mb_stride
];
2780 if(dc_pred_dir
&& n
==1) q2
= q1
;
2781 if(!dc_pred_dir
&& n
==2) q2
= q1
;
2785 int last
= 0, skip
, value
;
2786 const int8_t *zz_table
;
2789 zz_table
= ff_vc1_simple_progressive_8x8_zz
;
2792 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
2796 block
[zz_table
[i
++]] = value
;
2799 /* apply AC prediction if needed */
2801 /* scale predictors if needed*/
2803 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2804 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2806 if(dc_pred_dir
) { //left
2807 for(k
= 1; k
< 8; k
++)
2808 block
[k
<< 3] += (ac_val
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2810 for(k
= 1; k
< 8; k
++)
2811 block
[k
] += (ac_val
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2814 if(dc_pred_dir
) { //left
2815 for(k
= 1; k
< 8; k
++)
2816 block
[k
<< 3] += ac_val
[k
];
2818 for(k
= 1; k
< 8; k
++)
2819 block
[k
] += ac_val
[k
+ 8];
2823 /* save AC coeffs for further prediction */
2824 for(k
= 1; k
< 8; k
++) {
2825 ac_val2
[k
] = block
[k
<< 3];
2826 ac_val2
[k
+ 8] = block
[k
];
2829 /* scale AC coeffs */
2830 for(k
= 1; k
< 64; k
++)
2834 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
2837 if(use_pred
) i
= 63;
2838 } else { // no AC coeffs
2841 memset(ac_val2
, 0, 16 * 2);
2842 if(dc_pred_dir
) {//left
2844 memcpy(ac_val2
, ac_val
, 8 * 2);
2846 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2847 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2848 for(k
= 1; k
< 8; k
++)
2849 ac_val2
[k
] = (ac_val2
[k
] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2854 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
2856 q1
= q1
* 2 + ((q1
== v
->pq
) ? v
->halfpq
: 0) - 1;
2857 q2
= q2
* 2 + ((q2
== v
->pq
) ? v
->halfpq
: 0) - 1;
2858 for(k
= 1; k
< 8; k
++)
2859 ac_val2
[k
+ 8] = (ac_val2
[k
+ 8] * q2
* ff_vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
2864 /* apply AC prediction if needed */
2866 if(dc_pred_dir
) { //left
2867 for(k
= 1; k
< 8; k
++) {
2868 block
[k
<< 3] = ac_val2
[k
] * scale
;
2869 if(!v
->pquantizer
&& block
[k
<< 3])
2870 block
[k
<< 3] += (block
[k
<< 3] < 0) ? -mquant
: mquant
;
2873 for(k
= 1; k
< 8; k
++) {
2874 block
[k
] = ac_val2
[k
+ 8] * scale
;
2875 if(!v
->pquantizer
&& block
[k
])
2876 block
[k
] += (block
[k
] < 0) ? -mquant
: mquant
;
2882 s
->block_last_index
[n
] = i
;
2889 static int vc1_decode_p_block(VC1Context
*v
, DCTELEM block
[64], int n
, int mquant
, int ttmb
, int first_block
,
2890 uint8_t *dst
, int linesize
, int skip_block
)
2892 MpegEncContext
*s
= &v
->s
;
2893 GetBitContext
*gb
= &s
->gb
;
2896 int scale
, off
, idx
, last
, skip
, value
;
2897 int ttblk
= ttmb
& 7;
2900 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)];
2902 if(ttblk
== TT_4X4
) {
2903 subblkpat
= ~(get_vlc2(gb
, ff_vc1_subblkpat_vlc
[v
->tt_index
].table
, VC1_SUBBLKPAT_VLC_BITS
, 1) + 1);
2905 if((ttblk
!= TT_8X8
&& ttblk
!= TT_4X4
) && (v
->ttmbf
|| (ttmb
!= -1 && (ttmb
& 8) && !first_block
))) {
2906 subblkpat
= decode012(gb
);
2907 if(subblkpat
) subblkpat
^= 3; //swap decoded pattern bits
2908 if(ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
) ttblk
= TT_8X4
;
2909 if(ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
) ttblk
= TT_4X8
;
2911 scale
= 2 * mquant
+ ((v
->pq
== mquant
) ? v
->halfpq
: 0);
2913 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
2914 if(ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
) {
2915 subblkpat
= 2 - (ttblk
== TT_8X4_TOP
);
2918 if(ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
) {
2919 subblkpat
= 2 - (ttblk
== TT_4X8_LEFT
);
2927 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2931 idx
= ff_vc1_simple_progressive_8x8_zz
[i
++];
2932 block
[idx
] = value
* scale
;
2934 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
2937 s
->dsp
.vc1_inv_trans_8x8(block
);
2938 s
->dsp
.add_pixels_clamped(block
, dst
, linesize
);
2942 for(j
= 0; j
< 4; j
++) {
2943 last
= subblkpat
& (1 << (3 - j
));
2945 off
= (j
& 1) * 4 + (j
& 2) * 16;
2947 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2951 idx
= ff_vc1_simple_progressive_4x4_zz
[i
++];
2952 block
[idx
+ off
] = value
* scale
;
2954 block
[idx
+ off
] += (block
[idx
+ off
] < 0) ? -mquant
: mquant
;
2956 if(!(subblkpat
& (1 << (3 - j
))) && !skip_block
)
2957 s
->dsp
.vc1_inv_trans_4x4(dst
+ (j
&1)*4 + (j
&2)*2*linesize
, linesize
, block
+ off
);
2961 for(j
= 0; j
< 2; j
++) {
2962 last
= subblkpat
& (1 << (1 - j
));
2966 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2970 idx
= v
->zz_8x4
[i
++]+off
;
2971 block
[idx
] = value
* scale
;
2973 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
2975 if(!(subblkpat
& (1 << (1 - j
))) && !skip_block
)
2976 s
->dsp
.vc1_inv_trans_8x4(dst
+ j
*4*linesize
, linesize
, block
+ off
);
2980 for(j
= 0; j
< 2; j
++) {
2981 last
= subblkpat
& (1 << (1 - j
));
2985 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2989 idx
= v
->zz_4x8
[i
++]+off
;
2990 block
[idx
] = value
* scale
;
2992 block
[idx
] += (block
[idx
] < 0) ? -mquant
: mquant
;
2994 if(!(subblkpat
& (1 << (1 - j
))) && !skip_block
)
2995 s
->dsp
.vc1_inv_trans_4x8(dst
+ j
*4, linesize
, block
+ off
);
3003 /** Decode one P-frame MB (in Simple/Main profile)
3005 static int vc1_decode_p_mb(VC1Context
*v
)
3007 MpegEncContext
*s
= &v
->s
;
3008 GetBitContext
*gb
= &s
->gb
;
3010 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
3011 int cbp
; /* cbp decoding stuff */
3012 int mqdiff
, mquant
; /* MB quantization */
3013 int ttmb
= v
->ttfrm
; /* MB Transform type */
3016 static const int size_table
[6] = { 0, 2, 3, 4, 5, 8 },
3017 offset_table
[6] = { 0, 1, 3, 7, 15, 31 };
3018 int mb_has_coeffs
= 1; /* last_flag */
3019 int dmv_x
, dmv_y
; /* Differential MV components */
3020 int index
, index1
; /* LUT indexes */
3021 int val
, sign
; /* temp values */
3022 int first_block
= 1;
3024 int skipped
, fourmv
;
3026 mquant
= v
->pq
; /* Loosy initialization */
3028 if (v
->mv_type_is_raw
)
3029 fourmv
= get_bits1(gb
);
3031 fourmv
= v
->mv_type_mb_plane
[mb_pos
];
3033 skipped
= get_bits1(gb
);
3035 skipped
= v
->s
.mbskip_table
[mb_pos
];
3037 s
->dsp
.clear_blocks(s
->block
[0]);
3039 if (!fourmv
) /* 1MV mode */
3043 GET_MVDATA(dmv_x
, dmv_y
);
3046 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
3047 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
3049 s
->current_picture
.mb_type
[mb_pos
] = s
->mb_intra
? MB_TYPE_INTRA
: MB_TYPE_16x16
;
3050 vc1_pred_mv(s
, 0, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0]);
3052 /* FIXME Set DC val for inter block ? */
3053 if (s
->mb_intra
&& !mb_has_coeffs
)
3056 s
->ac_pred
= get_bits1(gb
);
3059 else if (mb_has_coeffs
)
3061 if (s
->mb_intra
) s
->ac_pred
= get_bits1(gb
);
3062 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
3070 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3072 if (!v
->ttmbf
&& !s
->mb_intra
&& mb_has_coeffs
)
3073 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
,
3074 VC1_TTMB_VLC_BITS
, 2);
3075 if(!s
->mb_intra
) vc1_mc_1mv(v
, 0);
3079 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3081 val
= ((cbp
>> (5 - i
)) & 1);
3082 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
3083 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
3085 /* check if prediction blocks A and C are available */
3086 v
->a_avail
= v
->c_avail
= 0;
3087 if(i
== 2 || i
== 3 || !s
->first_slice_line
)
3088 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
3089 if(i
== 1 || i
== 3 || s
->mb_x
)
3090 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
3092 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
, (i
&4)?v
->codingset2
:v
->codingset
);
3093 if((i
>3) && (s
->flags
& CODEC_FLAG_GRAY
)) continue;
3094 s
->dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
3095 if(v
->rangeredfrm
) for(j
= 0; j
< 64; j
++) s
->block
[i
][j
] <<= 1;
3096 s
->dsp
.put_signed_pixels_clamped(s
->block
[i
], s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3097 if(v
->pq
>= 9 && v
->overlap
) {
3099 s
->dsp
.vc1_h_overlap(s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3101 s
->dsp
.vc1_v_overlap(s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3104 vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
, first_block
, s
->dest
[dst_idx
] + off
, (i
&4)?s
->uvlinesize
:s
->linesize
, (i
&4) && (s
->flags
& CODEC_FLAG_GRAY
));
3105 if(!v
->ttmbf
&& ttmb
< 8) ttmb
= -1;
3113 for(i
= 0; i
< 6; i
++) {
3114 v
->mb_type
[0][s
->block_index
[i
]] = 0;
3115 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3117 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_SKIP
;
3118 s
->current_picture
.qscale_table
[mb_pos
] = 0;
3119 vc1_pred_mv(s
, 0, 0, 0, 1, v
->range_x
, v
->range_y
, v
->mb_type
[0]);
3126 if (!skipped
/* unskipped MB */)
3128 int intra_count
= 0, coded_inter
= 0;
3129 int is_intra
[6], is_coded
[6];
3131 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
3134 val
= ((cbp
>> (5 - i
)) & 1);
3135 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3142 GET_MVDATA(dmv_x
, dmv_y
);
3144 vc1_pred_mv(s
, i
, dmv_x
, dmv_y
, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0]);
3145 if(!s
->mb_intra
) vc1_mc_4mv_luma(v
, i
);
3146 intra_count
+= s
->mb_intra
;
3147 is_intra
[i
] = s
->mb_intra
;
3148 is_coded
[i
] = mb_has_coeffs
;
3151 is_intra
[i
] = (intra_count
>= 3);
3154 if(i
== 4) vc1_mc_4mv_chroma(v
);
3155 v
->mb_type
[0][s
->block_index
[i
]] = is_intra
[i
];
3156 if(!coded_inter
) coded_inter
= !is_intra
[i
] & is_coded
[i
];
3158 // if there are no coded blocks then don't do anything more
3159 if(!intra_count
&& !coded_inter
) return 0;
3162 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3163 /* test if block is intra and has pred */
3168 if(((!s
->first_slice_line
|| (i
==2 || i
==3)) && v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]])
3169 || ((s
->mb_x
|| (i
==1 || i
==3)) && v
->mb_type
[0][s
->block_index
[i
] - 1])) {
3174 if(intrapred
)s
->ac_pred
= get_bits1(gb
);
3175 else s
->ac_pred
= 0;
3177 if (!v
->ttmbf
&& coded_inter
)
3178 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
3182 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
3183 s
->mb_intra
= is_intra
[i
];
3185 /* check if prediction blocks A and C are available */
3186 v
->a_avail
= v
->c_avail
= 0;
3187 if(i
== 2 || i
== 3 || !s
->first_slice_line
)
3188 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
3189 if(i
== 1 || i
== 3 || s
->mb_x
)
3190 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
3192 vc1_decode_intra_block(v
, s
->block
[i
], i
, is_coded
[i
], mquant
, (i
&4)?v
->codingset2
:v
->codingset
);
3193 if((i
>3) && (s
->flags
& CODEC_FLAG_GRAY
)) continue;
3194 s
->dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
3195 if(v
->rangeredfrm
) for(j
= 0; j
< 64; j
++) s
->block
[i
][j
] <<= 1;
3196 s
->dsp
.put_signed_pixels_clamped(s
->block
[i
], s
->dest
[dst_idx
] + off
, (i
&4)?s
->uvlinesize
:s
->linesize
);
3197 if(v
->pq
>= 9 && v
->overlap
) {
3199 s
->dsp
.vc1_h_overlap(s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3201 s
->dsp
.vc1_v_overlap(s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3203 } else if(is_coded
[i
]) {
3204 status
= vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
, first_block
, s
->dest
[dst_idx
] + off
, (i
&4)?s
->uvlinesize
:s
->linesize
, (i
&4) && (s
->flags
& CODEC_FLAG_GRAY
));
3205 if(!v
->ttmbf
&& ttmb
< 8) ttmb
= -1;
3214 s
->current_picture
.qscale_table
[mb_pos
] = 0;
3215 for (i
=0; i
<6; i
++) {
3216 v
->mb_type
[0][s
->block_index
[i
]] = 0;
3217 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3221 vc1_pred_mv(s
, i
, 0, 0, 0, v
->range_x
, v
->range_y
, v
->mb_type
[0]);
3222 vc1_mc_4mv_luma(v
, i
);
3224 vc1_mc_4mv_chroma(v
);
3225 s
->current_picture
.qscale_table
[mb_pos
] = 0;
3230 /* Should never happen */
3234 /** Decode one B-frame MB (in Main profile)
3236 static void vc1_decode_b_mb(VC1Context
*v
)
3238 MpegEncContext
*s
= &v
->s
;
3239 GetBitContext
*gb
= &s
->gb
;
3241 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
3242 int cbp
= 0; /* cbp decoding stuff */
3243 int mqdiff
, mquant
; /* MB quantization */
3244 int ttmb
= v
->ttfrm
; /* MB Transform type */
3246 static const int size_table
[6] = { 0, 2, 3, 4, 5, 8 },
3247 offset_table
[6] = { 0, 1, 3, 7, 15, 31 };
3248 int mb_has_coeffs
= 0; /* last_flag */
3249 int index
, index1
; /* LUT indexes */
3250 int val
, sign
; /* temp values */
3251 int first_block
= 1;
3253 int skipped
, direct
;
3254 int dmv_x
[2], dmv_y
[2];
3255 int bmvtype
= BMV_TYPE_BACKWARD
;
3257 mquant
= v
->pq
; /* Loosy initialization */
3261 direct
= get_bits1(gb
);
3263 direct
= v
->direct_mb_plane
[mb_pos
];
3265 skipped
= get_bits1(gb
);
3267 skipped
= v
->s
.mbskip_table
[mb_pos
];
3269 s
->dsp
.clear_blocks(s
->block
[0]);
3270 dmv_x
[0] = dmv_x
[1] = dmv_y
[0] = dmv_y
[1] = 0;
3271 for(i
= 0; i
< 6; i
++) {
3272 v
->mb_type
[0][s
->block_index
[i
]] = 0;
3273 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3275 s
->current_picture
.qscale_table
[mb_pos
] = 0;
3279 GET_MVDATA(dmv_x
[0], dmv_y
[0]);
3280 dmv_x
[1] = dmv_x
[0];
3281 dmv_y
[1] = dmv_y
[0];
3283 if(skipped
|| !s
->mb_intra
) {
3284 bmvtype
= decode012(gb
);
3287 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_BACKWARD
: BMV_TYPE_FORWARD
;
3290 bmvtype
= (v
->bfraction
>= (B_FRACTION_DEN
/2)) ? BMV_TYPE_FORWARD
: BMV_TYPE_BACKWARD
;
3293 bmvtype
= BMV_TYPE_INTERPOLATED
;
3294 dmv_x
[0] = dmv_y
[0] = 0;
3298 for(i
= 0; i
< 6; i
++)
3299 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
3302 if(direct
) bmvtype
= BMV_TYPE_INTERPOLATED
;
3303 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3304 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3308 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
3312 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3314 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
3315 dmv_x
[0] = dmv_y
[0] = dmv_x
[1] = dmv_y
[1] = 0;
3316 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3317 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3319 if(!mb_has_coeffs
&& !s
->mb_intra
) {
3320 /* no coded blocks - effectively skipped */
3321 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3322 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3325 if(s
->mb_intra
&& !mb_has_coeffs
) {
3327 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3328 s
->ac_pred
= get_bits1(gb
);
3330 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3332 if(bmvtype
== BMV_TYPE_INTERPOLATED
) {
3333 GET_MVDATA(dmv_x
[0], dmv_y
[0]);
3334 if(!mb_has_coeffs
) {
3335 /* interpolated skipped block */
3336 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3337 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3341 vc1_pred_b_mv(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3343 vc1_b_mc(v
, dmv_x
, dmv_y
, direct
, bmvtype
);
3346 s
->ac_pred
= get_bits1(gb
);
3347 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
3349 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3350 if(!v
->ttmbf
&& !s
->mb_intra
&& mb_has_coeffs
)
3351 ttmb
= get_vlc2(gb
, ff_vc1_ttmb_vlc
[v
->tt_index
].table
, VC1_TTMB_VLC_BITS
, 2);
3357 s
->dc_val
[0][s
->block_index
[i
]] = 0;
3359 val
= ((cbp
>> (5 - i
)) & 1);
3360 off
= (i
& 4) ? 0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
3361 v
->mb_type
[0][s
->block_index
[i
]] = s
->mb_intra
;
3363 /* check if prediction blocks A and C are available */
3364 v
->a_avail
= v
->c_avail
= 0;
3365 if(i
== 2 || i
== 3 || !s
->first_slice_line
)
3366 v
->a_avail
= v
->mb_type
[0][s
->block_index
[i
] - s
->block_wrap
[i
]];
3367 if(i
== 1 || i
== 3 || s
->mb_x
)
3368 v
->c_avail
= v
->mb_type
[0][s
->block_index
[i
] - 1];
3370 vc1_decode_intra_block(v
, s
->block
[i
], i
, val
, mquant
, (i
&4)?v
->codingset2
:v
->codingset
);
3371 if((i
>3) && (s
->flags
& CODEC_FLAG_GRAY
)) continue;
3372 s
->dsp
.vc1_inv_trans_8x8(s
->block
[i
]);
3373 if(v
->rangeredfrm
) for(j
= 0; j
< 64; j
++) s
->block
[i
][j
] <<= 1;
3374 s
->dsp
.put_signed_pixels_clamped(s
->block
[i
], s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
3376 vc1_decode_p_block(v
, s
->block
[i
], i
, mquant
, ttmb
, first_block
, s
->dest
[dst_idx
] + off
, (i
&4)?s
->uvlinesize
:s
->linesize
, (i
&4) && (s
->flags
& CODEC_FLAG_GRAY
));
3377 if(!v
->ttmbf
&& ttmb
< 8) ttmb
= -1;
3383 /** Decode blocks of I-frame
3385 static void vc1_decode_i_blocks(VC1Context
*v
)
3388 MpegEncContext
*s
= &v
->s
;
3393 /* select codingmode used for VLC tables selection */
3394 switch(v
->y_ac_table_index
){
3396 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
3399 v
->codingset
= CS_HIGH_MOT_INTRA
;
3402 v
->codingset
= CS_MID_RATE_INTRA
;
3406 switch(v
->c_ac_table_index
){
3408 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
3411 v
->codingset2
= CS_HIGH_MOT_INTER
;
3414 v
->codingset2
= CS_MID_RATE_INTER
;
3418 /* Set DC scale - y and c use the same */
3419 s
->y_dc_scale
= s
->y_dc_scale_table
[v
->pq
];
3420 s
->c_dc_scale
= s
->c_dc_scale_table
[v
->pq
];
3423 s
->mb_x
= s
->mb_y
= 0;
3425 s
->first_slice_line
= 1;
3426 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
3427 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
3428 ff_init_block_index(s
);
3429 ff_update_block_index(s
);
3430 s
->dsp
.clear_blocks(s
->block
[0]);
3431 mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_width
;
3432 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
3433 s
->current_picture
.qscale_table
[mb_pos
] = v
->pq
;
3434 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
3435 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
3437 // do actual MB decoding and displaying
3438 cbp
= get_vlc2(&v
->s
.gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
3439 v
->s
.ac_pred
= get_bits1(&v
->s
.gb
);
3441 for(k
= 0; k
< 6; k
++) {
3442 val
= ((cbp
>> (5 - k
)) & 1);
3445 int pred
= vc1_coded_block_pred(&v
->s
, k
, &coded_val
);
3449 cbp
|= val
<< (5 - k
);
3451 vc1_decode_i_block(v
, s
->block
[k
], k
, val
, (k
<4)? v
->codingset
: v
->codingset2
);
3453 s
->dsp
.vc1_inv_trans_8x8(s
->block
[k
]);
3454 if(v
->pq
>= 9 && v
->overlap
) {
3455 for(j
= 0; j
< 64; j
++) s
->block
[k
][j
] += 128;
3459 vc1_put_block(v
, s
->block
);
3460 if(v
->pq
>= 9 && v
->overlap
) {
3462 s
->dsp
.vc1_h_overlap(s
->dest
[0], s
->linesize
);
3463 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
3464 if(!(s
->flags
& CODEC_FLAG_GRAY
)) {
3465 s
->dsp
.vc1_h_overlap(s
->dest
[1], s
->uvlinesize
);
3466 s
->dsp
.vc1_h_overlap(s
->dest
[2], s
->uvlinesize
);
3469 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8, s
->linesize
);
3470 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
3471 if(!s
->first_slice_line
) {
3472 s
->dsp
.vc1_v_overlap(s
->dest
[0], s
->linesize
);
3473 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8, s
->linesize
);
3474 if(!(s
->flags
& CODEC_FLAG_GRAY
)) {
3475 s
->dsp
.vc1_v_overlap(s
->dest
[1], s
->uvlinesize
);
3476 s
->dsp
.vc1_v_overlap(s
->dest
[2], s
->uvlinesize
);
3479 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
3480 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
3483 if(get_bits_count(&s
->gb
) > v
->bits
) {
3484 ff_er_add_slice(s
, 0, 0, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
));
3485 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i\n", get_bits_count(&s
->gb
), v
->bits
);
3489 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3490 s
->first_slice_line
= 0;
3492 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
3495 /** Decode blocks of I-frame for advanced profile
3497 static void vc1_decode_i_blocks_adv(VC1Context
*v
)
3500 MpegEncContext
*s
= &v
->s
;
3507 GetBitContext
*gb
= &s
->gb
;
3509 /* select codingmode used for VLC tables selection */
3510 switch(v
->y_ac_table_index
){
3512 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
3515 v
->codingset
= CS_HIGH_MOT_INTRA
;
3518 v
->codingset
= CS_MID_RATE_INTRA
;
3522 switch(v
->c_ac_table_index
){
3524 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
3527 v
->codingset2
= CS_HIGH_MOT_INTER
;
3530 v
->codingset2
= CS_MID_RATE_INTER
;
3535 s
->mb_x
= s
->mb_y
= 0;
3537 s
->first_slice_line
= 1;
3538 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
3539 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
3540 ff_init_block_index(s
);
3541 ff_update_block_index(s
);
3542 s
->dsp
.clear_blocks(s
->block
[0]);
3543 mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
3544 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
3545 s
->current_picture
.motion_val
[1][s
->block_index
[0]][0] = 0;
3546 s
->current_picture
.motion_val
[1][s
->block_index
[0]][1] = 0;
3548 // do actual MB decoding and displaying
3549 cbp
= get_vlc2(&v
->s
.gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
3550 if(v
->acpred_is_raw
)
3551 v
->s
.ac_pred
= get_bits1(&v
->s
.gb
);
3553 v
->s
.ac_pred
= v
->acpred_plane
[mb_pos
];
3555 if(v
->condover
== CONDOVER_SELECT
) {
3556 if(v
->overflg_is_raw
)
3557 overlap
= get_bits1(&v
->s
.gb
);
3559 overlap
= v
->over_flags_plane
[mb_pos
];
3561 overlap
= (v
->condover
== CONDOVER_ALL
);
3565 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
3566 /* Set DC scale - y and c use the same */
3567 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
3568 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
3570 for(k
= 0; k
< 6; k
++) {
3571 val
= ((cbp
>> (5 - k
)) & 1);
3574 int pred
= vc1_coded_block_pred(&v
->s
, k
, &coded_val
);
3578 cbp
|= val
<< (5 - k
);
3580 v
->a_avail
= !s
->first_slice_line
|| (k
==2 || k
==3);
3581 v
->c_avail
= !!s
->mb_x
|| (k
==1 || k
==3);
3583 vc1_decode_i_block_adv(v
, s
->block
[k
], k
, val
, (k
<4)? v
->codingset
: v
->codingset2
, mquant
);
3585 s
->dsp
.vc1_inv_trans_8x8(s
->block
[k
]);
3586 for(j
= 0; j
< 64; j
++) s
->block
[k
][j
] += 128;
3589 vc1_put_block(v
, s
->block
);
3592 s
->dsp
.vc1_h_overlap(s
->dest
[0], s
->linesize
);
3593 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
3594 if(!(s
->flags
& CODEC_FLAG_GRAY
)) {
3595 s
->dsp
.vc1_h_overlap(s
->dest
[1], s
->uvlinesize
);
3596 s
->dsp
.vc1_h_overlap(s
->dest
[2], s
->uvlinesize
);
3599 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8, s
->linesize
);
3600 s
->dsp
.vc1_h_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
3601 if(!s
->first_slice_line
) {
3602 s
->dsp
.vc1_v_overlap(s
->dest
[0], s
->linesize
);
3603 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8, s
->linesize
);
3604 if(!(s
->flags
& CODEC_FLAG_GRAY
)) {
3605 s
->dsp
.vc1_v_overlap(s
->dest
[1], s
->uvlinesize
);
3606 s
->dsp
.vc1_v_overlap(s
->dest
[2], s
->uvlinesize
);
3609 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
, s
->linesize
);
3610 s
->dsp
.vc1_v_overlap(s
->dest
[0] + 8 * s
->linesize
+ 8, s
->linesize
);
3613 if(get_bits_count(&s
->gb
) > v
->bits
) {
3614 ff_er_add_slice(s
, 0, 0, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
));
3615 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i\n", get_bits_count(&s
->gb
), v
->bits
);
3619 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3620 s
->first_slice_line
= 0;
3622 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
3625 static void vc1_decode_p_blocks(VC1Context
*v
)
3627 MpegEncContext
*s
= &v
->s
;
3629 /* select codingmode used for VLC tables selection */
3630 switch(v
->c_ac_table_index
){
3632 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
3635 v
->codingset
= CS_HIGH_MOT_INTRA
;
3638 v
->codingset
= CS_MID_RATE_INTRA
;
3642 switch(v
->c_ac_table_index
){
3644 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
3647 v
->codingset2
= CS_HIGH_MOT_INTER
;
3650 v
->codingset2
= CS_MID_RATE_INTER
;
3654 s
->first_slice_line
= 1;
3655 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
3656 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
3657 ff_init_block_index(s
);
3658 ff_update_block_index(s
);
3659 s
->dsp
.clear_blocks(s
->block
[0]);
3662 if(get_bits_count(&s
->gb
) > v
->bits
|| get_bits_count(&s
->gb
) < 0) {
3663 ff_er_add_slice(s
, 0, 0, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
));
3664 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s
->gb
), v
->bits
,s
->mb_x
,s
->mb_y
);
3668 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3669 s
->first_slice_line
= 0;
3671 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
3674 static void vc1_decode_b_blocks(VC1Context
*v
)
3676 MpegEncContext
*s
= &v
->s
;
3678 /* select codingmode used for VLC tables selection */
3679 switch(v
->c_ac_table_index
){
3681 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
3684 v
->codingset
= CS_HIGH_MOT_INTRA
;
3687 v
->codingset
= CS_MID_RATE_INTRA
;
3691 switch(v
->c_ac_table_index
){
3693 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
3696 v
->codingset2
= CS_HIGH_MOT_INTER
;
3699 v
->codingset2
= CS_MID_RATE_INTER
;
3703 s
->first_slice_line
= 1;
3704 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
3705 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
3706 ff_init_block_index(s
);
3707 ff_update_block_index(s
);
3708 s
->dsp
.clear_blocks(s
->block
[0]);
3711 if(get_bits_count(&s
->gb
) > v
->bits
|| get_bits_count(&s
->gb
) < 0) {
3712 ff_er_add_slice(s
, 0, 0, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
));
3713 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s
->gb
), v
->bits
,s
->mb_x
,s
->mb_y
);
3717 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3718 s
->first_slice_line
= 0;
3720 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
3723 static void vc1_decode_skip_blocks(VC1Context
*v
)
3725 MpegEncContext
*s
= &v
->s
;
3727 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
3728 s
->first_slice_line
= 1;
3729 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
3731 ff_init_block_index(s
);
3732 ff_update_block_index(s
);
3733 memcpy(s
->dest
[0], s
->last_picture
.data
[0] + s
->mb_y
* 16 * s
->linesize
, s
->linesize
* 16);
3734 memcpy(s
->dest
[1], s
->last_picture
.data
[1] + s
->mb_y
* 8 * s
->uvlinesize
, s
->uvlinesize
* 8);
3735 memcpy(s
->dest
[2], s
->last_picture
.data
[2] + s
->mb_y
* 8 * s
->uvlinesize
, s
->uvlinesize
* 8);
3736 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
3737 s
->first_slice_line
= 0;
3739 s
->pict_type
= FF_P_TYPE
;
3742 static void vc1_decode_blocks(VC1Context
*v
)
3745 v
->s
.esc3_level_length
= 0;
3747 ff_intrax8_decode_picture(&v
->x8
, 2*v
->pq
+v
->halfpq
, v
->pq
*(!v
->pquantizer
) );
3750 switch(v
->s
.pict_type
) {
3752 if(v
->profile
== PROFILE_ADVANCED
)
3753 vc1_decode_i_blocks_adv(v
);
3755 vc1_decode_i_blocks(v
);
3758 if(v
->p_frame_skipped
)
3759 vc1_decode_skip_blocks(v
);
3761 vc1_decode_p_blocks(v
);
3765 if(v
->profile
== PROFILE_ADVANCED
)
3766 vc1_decode_i_blocks_adv(v
);
3768 vc1_decode_i_blocks(v
);
3770 vc1_decode_b_blocks(v
);
3776 /** Find VC-1 marker in buffer
3777 * @return position where next marker starts or end of buffer if no marker found
3779 static av_always_inline
const uint8_t* find_next_marker(const uint8_t *src
, const uint8_t *end
)
3781 uint32_t mrk
= 0xFFFFFFFF;
3783 if(end
-src
< 4) return end
;
3785 mrk
= (mrk
<< 8) | *src
++;
3792 static av_always_inline
int vc1_unescape_buffer(const uint8_t *src
, int size
, uint8_t *dst
)
3797 for(dsize
= 0; dsize
< size
; dsize
++) *dst
++ = *src
++;
3800 for(i
= 0; i
< size
; i
++, src
++) {
3801 if(src
[0] == 3 && i
>= 2 && !src
[-1] && !src
[-2] && i
< size
-1 && src
[1] < 4) {
3802 dst
[dsize
++] = src
[1];
3806 dst
[dsize
++] = *src
;
3811 /** Initialize a VC1/WMV3 decoder
3812 * @todo TODO: Handle VC-1 IDUs (Transport level?)
3813 * @todo TODO: Decypher remaining bits in extra_data
3815 static av_cold
int vc1_decode_init(AVCodecContext
*avctx
)
3817 VC1Context
*v
= avctx
->priv_data
;
3818 MpegEncContext
*s
= &v
->s
;
3821 if (!avctx
->extradata_size
|| !avctx
->extradata
) return -1;
3822 if (!(avctx
->flags
& CODEC_FLAG_GRAY
))
3823 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
3825 avctx
->pix_fmt
= PIX_FMT_GRAY8
;
3827 avctx
->flags
|= CODEC_FLAG_EMU_EDGE
;
3828 v
->s
.flags
|= CODEC_FLAG_EMU_EDGE
;
3830 if(avctx
->idct_algo
==FF_IDCT_AUTO
){
3831 avctx
->idct_algo
=FF_IDCT_WMV2
;
3834 if(ff_h263_decode_init(avctx
) < 0)
3836 if (vc1_init_common(v
) < 0) return -1;
3838 avctx
->coded_width
= avctx
->width
;
3839 avctx
->coded_height
= avctx
->height
;
3840 if (avctx
->codec_id
== CODEC_ID_WMV3
)
3844 // looks like WMV3 has a sequence header stored in the extradata
3845 // advanced sequence header may be before the first frame
3846 // the last byte of the extradata is a version number, 1 for the
3847 // samples we can decode
3849 init_get_bits(&gb
, avctx
->extradata
, avctx
->extradata_size
*8);
3851 if (decode_sequence_header(avctx
, &gb
) < 0)
3854 count
= avctx
->extradata_size
*8 - get_bits_count(&gb
);
3857 av_log(avctx
, AV_LOG_INFO
, "Extra data: %i bits left, value: %X\n",
3858 count
, get_bits(&gb
, count
));
3862 av_log(avctx
, AV_LOG_INFO
, "Read %i bits in overflow\n", -count
);
3864 } else { // VC1/WVC1
3865 const uint8_t *start
= avctx
->extradata
;
3866 uint8_t *end
= avctx
->extradata
+ avctx
->extradata_size
;
3867 const uint8_t *next
;
3868 int size
, buf2_size
;
3869 uint8_t *buf2
= NULL
;
3870 int seq_initialized
= 0, ep_initialized
= 0;
3872 if(avctx
->extradata_size
< 16) {
3873 av_log(avctx
, AV_LOG_ERROR
, "Extradata size too small: %i\n", avctx
->extradata_size
);
3877 buf2
= av_mallocz(avctx
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
3878 if(start
[0]) start
++; // in WVC1 extradata first byte is its size
3880 for(; next
< end
; start
= next
){
3881 next
= find_next_marker(start
+ 4, end
);
3882 size
= next
- start
- 4;
3883 if(size
<= 0) continue;
3884 buf2_size
= vc1_unescape_buffer(start
+ 4, size
, buf2
);
3885 init_get_bits(&gb
, buf2
, buf2_size
* 8);
3886 switch(AV_RB32(start
)){
3887 case VC1_CODE_SEQHDR
:
3888 if(decode_sequence_header(avctx
, &gb
) < 0){
3892 seq_initialized
= 1;
3894 case VC1_CODE_ENTRYPOINT
:
3895 if(decode_entry_point(avctx
, &gb
) < 0){
3904 if(!seq_initialized
|| !ep_initialized
){
3905 av_log(avctx
, AV_LOG_ERROR
, "Incomplete extradata\n");
3909 avctx
->has_b_frames
= !!(avctx
->max_b_frames
);
3910 s
->low_delay
= !avctx
->has_b_frames
;
3912 s
->mb_width
= (avctx
->coded_width
+15)>>4;
3913 s
->mb_height
= (avctx
->coded_height
+15)>>4;
3915 /* Allocate mb bitplanes */
3916 v
->mv_type_mb_plane
= av_malloc(s
->mb_stride
* s
->mb_height
);
3917 v
->direct_mb_plane
= av_malloc(s
->mb_stride
* s
->mb_height
);
3918 v
->acpred_plane
= av_malloc(s
->mb_stride
* s
->mb_height
);
3919 v
->over_flags_plane
= av_malloc(s
->mb_stride
* s
->mb_height
);
3921 /* allocate block type info in that way so it could be used with s->block_index[] */
3922 v
->mb_type_base
= av_malloc(s
->b8_stride
* (s
->mb_height
* 2 + 1) + s
->mb_stride
* (s
->mb_height
+ 1) * 2);
3923 v
->mb_type
[0] = v
->mb_type_base
+ s
->b8_stride
+ 1;
3924 v
->mb_type
[1] = v
->mb_type_base
+ s
->b8_stride
* (s
->mb_height
* 2 + 1) + s
->mb_stride
+ 1;
3925 v
->mb_type
[2] = v
->mb_type
[1] + s
->mb_stride
* (s
->mb_height
+ 1);
3927 /* Init coded blocks info */
3928 if (v
->profile
== PROFILE_ADVANCED
)
3930 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
3932 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
3936 ff_intrax8_common_init(&v
->x8
,s
);
3941 /** Decode a VC1/WMV3 frame
3942 * @todo TODO: Handle VC-1 IDUs (Transport level?)
3944 static int vc1_decode_frame(AVCodecContext
*avctx
,
3945 void *data
, int *data_size
,
3946 const uint8_t *buf
, int buf_size
)
3948 VC1Context
*v
= avctx
->priv_data
;
3949 MpegEncContext
*s
= &v
->s
;
3950 AVFrame
*pict
= data
;
3951 uint8_t *buf2
= NULL
;
3953 /* no supplementary picture */
3954 if (buf_size
== 0) {
3955 /* special case for last picture */
3956 if (s
->low_delay
==0 && s
->next_picture_ptr
) {
3957 *pict
= *(AVFrame
*)s
->next_picture_ptr
;
3958 s
->next_picture_ptr
= NULL
;
3960 *data_size
= sizeof(AVFrame
);
3966 /* We need to set current_picture_ptr before reading the header,
3967 * otherwise we cannot store anything in there. */
3968 if(s
->current_picture_ptr
==NULL
|| s
->current_picture_ptr
->data
[0]){
3969 int i
= ff_find_unused_picture(s
, 0);
3970 s
->current_picture_ptr
= &s
->picture
[i
];
3973 //for advanced profile we may need to parse and unescape data
3974 if (avctx
->codec_id
== CODEC_ID_VC1
) {
3976 buf2
= av_mallocz(buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
3978 if(IS_MARKER(AV_RB32(buf
))){ /* frame starts with marker and needs to be parsed */
3979 const uint8_t *start
, *end
, *next
;
3983 for(start
= buf
, end
= buf
+ buf_size
; next
< end
; start
= next
){
3984 next
= find_next_marker(start
+ 4, end
);
3985 size
= next
- start
- 4;
3986 if(size
<= 0) continue;
3987 switch(AV_RB32(start
)){
3988 case VC1_CODE_FRAME
:
3989 buf_size2
= vc1_unescape_buffer(start
+ 4, size
, buf2
);
3991 case VC1_CODE_ENTRYPOINT
: /* it should be before frame data */
3992 buf_size2
= vc1_unescape_buffer(start
+ 4, size
, buf2
);
3993 init_get_bits(&s
->gb
, buf2
, buf_size2
*8);
3994 decode_entry_point(avctx
, &s
->gb
);
3996 case VC1_CODE_SLICE
:
3997 av_log(avctx
, AV_LOG_ERROR
, "Sliced decoding is not implemented (yet)\n");
4002 }else if(v
->interlace
&& ((buf
[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
4003 const uint8_t *divider
;
4005 divider
= find_next_marker(buf
, buf
+ buf_size
);
4006 if((divider
== (buf
+ buf_size
)) || AV_RB32(divider
) != VC1_CODE_FIELD
){
4007 av_log(avctx
, AV_LOG_ERROR
, "Error in WVC1 interlaced frame\n");
4011 buf_size2
= vc1_unescape_buffer(buf
, divider
- buf
, buf2
);
4013 av_free(buf2
);return -1;
4015 buf_size2
= vc1_unescape_buffer(buf
, buf_size
, buf2
);
4017 init_get_bits(&s
->gb
, buf2
, buf_size2
*8);
4019 init_get_bits(&s
->gb
, buf
, buf_size
*8);
4020 // do parse frame header
4021 if(v
->profile
< PROFILE_ADVANCED
) {
4022 if(vc1_parse_frame_header(v
, &s
->gb
) == -1) {
4027 if(vc1_parse_frame_header_adv(v
, &s
->gb
) == -1) {
4033 if(s
->pict_type
!= FF_I_TYPE
&& !v
->res_rtm_flag
){
4039 s
->current_picture
.pict_type
= s
->pict_type
;
4040 s
->current_picture
.key_frame
= s
->pict_type
== FF_I_TYPE
;
4042 /* skip B-frames if we don't have reference frames */
4043 if(s
->last_picture_ptr
==NULL
&& (s
->pict_type
==FF_B_TYPE
|| s
->dropable
)){
4045 return -1;//buf_size;
4047 /* skip b frames if we are in a hurry */
4048 if(avctx
->hurry_up
&& s
->pict_type
==FF_B_TYPE
) return -1;//buf_size;
4049 if( (avctx
->skip_frame
>= AVDISCARD_NONREF
&& s
->pict_type
==FF_B_TYPE
)
4050 || (avctx
->skip_frame
>= AVDISCARD_NONKEY
&& s
->pict_type
!=FF_I_TYPE
)
4051 || avctx
->skip_frame
>= AVDISCARD_ALL
) {
4055 /* skip everything if we are in a hurry>=5 */
4056 if(avctx
->hurry_up
>=5) {
4058 return -1;//buf_size;
4061 if(s
->next_p_frame_damaged
){
4062 if(s
->pict_type
==FF_B_TYPE
)
4065 s
->next_p_frame_damaged
=0;
4068 if(MPV_frame_start(s
, avctx
) < 0) {
4073 s
->me
.qpel_put
= s
->dsp
.put_qpel_pixels_tab
;
4074 s
->me
.qpel_avg
= s
->dsp
.avg_qpel_pixels_tab
;
4076 ff_er_frame_start(s
);
4078 v
->bits
= buf_size
* 8;
4079 vc1_decode_blocks(v
);
4080 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
4081 // if(get_bits_count(&s->gb) > buf_size * 8)
4087 assert(s
->current_picture
.pict_type
== s
->current_picture_ptr
->pict_type
);
4088 assert(s
->current_picture
.pict_type
== s
->pict_type
);
4089 if (s
->pict_type
== FF_B_TYPE
|| s
->low_delay
) {
4090 *pict
= *(AVFrame
*)s
->current_picture_ptr
;
4091 } else if (s
->last_picture_ptr
!= NULL
) {
4092 *pict
= *(AVFrame
*)s
->last_picture_ptr
;
4095 if(s
->last_picture_ptr
|| s
->low_delay
){
4096 *data_size
= sizeof(AVFrame
);
4097 ff_print_debug_info(s
, pict
);
4100 /* Return the Picture timestamp as the frame number */
4101 /* we subtract 1 because it is added on utils.c */
4102 avctx
->frame_number
= s
->picture_number
- 1;
4109 /** Close a VC1/WMV3 decoder
4110 * @warning Initial try at using MpegEncContext stuff
4112 static av_cold
int vc1_decode_end(AVCodecContext
*avctx
)
4114 VC1Context
*v
= avctx
->priv_data
;
4116 av_freep(&v
->hrd_rate
);
4117 av_freep(&v
->hrd_buffer
);
4118 MPV_common_end(&v
->s
);
4119 av_freep(&v
->mv_type_mb_plane
);
4120 av_freep(&v
->direct_mb_plane
);
4121 av_freep(&v
->acpred_plane
);
4122 av_freep(&v
->over_flags_plane
);
4123 av_freep(&v
->mb_type_base
);
4124 ff_intrax8_common_end(&v
->x8
);
4129 AVCodec vc1_decoder
= {
4140 .long_name
= NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
4143 AVCodec wmv3_decoder
= {
4154 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 9"),