2 * Copyright (c) 2002 The FFmpeg Project
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "mpegvideo.h"
26 #include "msmpeg4data.h"
31 static void parse_mb_skip(Wmv2Context
* w
){
33 MpegEncContext
* const s
= &w
->s
;
34 uint32_t * const mb_type
= s
->current_picture_ptr
->mb_type
;
36 w
->skip_type
= get_bits(&s
->gb
, 2);
39 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
40 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
41 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_16x16
| MB_TYPE_L0
;
46 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
47 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
48 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
53 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
54 if(get_bits1(&s
->gb
)){
55 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
56 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
59 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
60 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
66 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
67 if(get_bits1(&s
->gb
)){
68 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
69 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
72 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
73 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
81 static int decode_ext_header(Wmv2Context
*w
){
82 MpegEncContext
* const s
= &w
->s
;
87 if(s
->avctx
->extradata_size
<4) return -1;
89 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
*8);
91 fps
= get_bits(&gb
, 5);
92 s
->bit_rate
= get_bits(&gb
, 11)*1024;
93 w
->mspel_bit
= get_bits1(&gb
);
94 s
->loop_filter
= get_bits1(&gb
);
95 w
->abt_flag
= get_bits1(&gb
);
96 w
->j_type_bit
= get_bits1(&gb
);
97 w
->top_left_mv_flag
= get_bits1(&gb
);
98 w
->per_mb_rl_bit
= get_bits1(&gb
);
99 code
= get_bits(&gb
, 3);
101 if(code
==0) return -1;
103 s
->slice_height
= s
->mb_height
/ code
;
105 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
106 av_log(s
->avctx
, AV_LOG_DEBUG
, "fps:%d, br:%d, qpbit:%d, abt_flag:%d, j_type_bit:%d, tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, slices:%d\n",
107 fps
, s
->bit_rate
, w
->mspel_bit
, w
->abt_flag
, w
->j_type_bit
, w
->top_left_mv_flag
, w
->per_mb_rl_bit
, code
, s
->loop_filter
,
113 int ff_wmv2_decode_picture_header(MpegEncContext
* s
)
115 Wmv2Context
* const w
= (Wmv2Context
*)s
;
121 for(i
=0; i
<s
->gb
.size
*8; i
++)
122 printf("%d", get_bits1(&s
->gb
));
123 // get_bits1(&s->gb);
128 if(s
->picture_number
==0)
129 decode_ext_header(w
);
131 s
->pict_type
= get_bits1(&s
->gb
) + 1;
132 if(s
->pict_type
== FF_I_TYPE
){
133 code
= get_bits(&s
->gb
, 7);
134 av_log(s
->avctx
, AV_LOG_DEBUG
, "I7:%X/\n", code
);
136 s
->chroma_qscale
= s
->qscale
= get_bits(&s
->gb
, 5);
143 int ff_wmv2_decode_secondary_picture_header(MpegEncContext
* s
)
145 Wmv2Context
* const w
= (Wmv2Context
*)s
;
147 if (s
->pict_type
== FF_I_TYPE
) {
148 if(w
->j_type_bit
) w
->j_type
= get_bits1(&s
->gb
);
149 else w
->j_type
= 0; //FIXME check
152 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
153 else s
->per_mb_rl_table
= 0;
155 if(!s
->per_mb_rl_table
){
156 s
->rl_chroma_table_index
= decode012(&s
->gb
);
157 s
->rl_table_index
= decode012(&s
->gb
);
160 s
->dc_table_index
= get_bits1(&s
->gb
);
162 s
->inter_intra_pred
= 0;
164 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
165 av_log(s
->avctx
, AV_LOG_DEBUG
, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n",
167 s
->rl_chroma_table_index
,
178 cbp_index
= decode012(&s
->gb
);
181 w
->cbp_table_index
= map
[cbp_index
];
182 }else if(s
->qscale
<= 20){
184 w
->cbp_table_index
= map
[cbp_index
];
187 w
->cbp_table_index
= map
[cbp_index
];
190 if(w
->mspel_bit
) s
->mspel
= get_bits1(&s
->gb
);
191 else s
->mspel
= 0; //FIXME check
194 w
->per_mb_abt
= get_bits1(&s
->gb
)^1;
196 w
->abt_type
= decode012(&s
->gb
);
200 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
201 else s
->per_mb_rl_table
= 0;
203 if(!s
->per_mb_rl_table
){
204 s
->rl_table_index
= decode012(&s
->gb
);
205 s
->rl_chroma_table_index
= s
->rl_table_index
;
208 s
->dc_table_index
= get_bits1(&s
->gb
);
209 s
->mv_table_index
= get_bits1(&s
->gb
);
211 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
214 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
215 av_log(s
->avctx
, AV_LOG_DEBUG
, "rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d per_mb_abt:%d abt_type:%d cbp:%d ii:%d\n",
217 s
->rl_chroma_table_index
,
226 s
->inter_intra_pred
);
229 s
->esc3_level_length
= 0;
230 s
->esc3_run_length
= 0;
232 s
->picture_number
++; //FIXME ?
236 ff_intrax8_decode_picture(&w
->x8
, 2*s
->qscale
, (s
->qscale
-1)|1 );
243 static inline int wmv2_decode_motion(Wmv2Context
*w
, int *mx_ptr
, int *my_ptr
){
244 MpegEncContext
* const s
= &w
->s
;
247 ret
= ff_msmpeg4_decode_motion(s
, mx_ptr
, my_ptr
);
251 if((((*mx_ptr
)|(*my_ptr
)) & 1) && s
->mspel
)
252 w
->hshift
= get_bits1(&s
->gb
);
256 //printf("%d %d ", *mx_ptr, *my_ptr);
261 static int16_t *wmv2_pred_motion(Wmv2Context
*w
, int *px
, int *py
){
262 MpegEncContext
* const s
= &w
->s
;
263 int xy
, wrap
, diff
, type
;
264 int16_t *A
, *B
, *C
, *mot_val
;
267 xy
= s
->block_index
[0];
269 mot_val
= s
->current_picture
.motion_val
[0][xy
];
271 A
= s
->current_picture
.motion_val
[0][xy
- 1];
272 B
= s
->current_picture
.motion_val
[0][xy
- wrap
];
273 C
= s
->current_picture
.motion_val
[0][xy
+ 2 - wrap
];
275 if(s
->mb_x
&& !s
->first_slice_line
&& !s
->mspel
&& w
->top_left_mv_flag
)
276 diff
= FFMAX(FFABS(A
[0] - B
[0]), FFABS(A
[1] - B
[1]));
281 type
= get_bits1(&s
->gb
);
292 /* special case for first (slice) line */
293 if (s
->first_slice_line
) {
297 *px
= mid_pred(A
[0], B
[0], C
[0]);
298 *py
= mid_pred(A
[1], B
[1], C
[1]);
305 static inline int wmv2_decode_inter_block(Wmv2Context
*w
, DCTELEM
*block
, int n
, int cbp
){
306 MpegEncContext
* const s
= &w
->s
;
307 static const int sub_cbp_table
[3]= {2,3,1};
311 s
->block_last_index
[n
] = -1;
317 w
->abt_type
= decode012(&s
->gb
);
320 printf("B%d", w
->abt_type
);
322 w
->abt_type_table
[n
]= w
->abt_type
;
325 // const uint8_t *scantable= w->abt_scantable[w->abt_type-1].permutated;
326 const uint8_t *scantable
= w
->abt_scantable
[w
->abt_type
-1].scantable
;
327 // const uint8_t *scantable= w->abt_type-1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
329 sub_cbp
= sub_cbp_table
[ decode012(&s
->gb
) ];
330 // printf("S%d", sub_cbp);
333 if (ff_msmpeg4_decode_block(s
, block
, n
, 1, scantable
) < 0)
338 if (ff_msmpeg4_decode_block(s
, w
->abt_block2
[n
], n
, 1, scantable
) < 0)
341 s
->block_last_index
[n
] = 63;
345 return ff_msmpeg4_decode_block(s
, block
, n
, 1, s
->inter_scantable
.permutated
);
350 int ff_wmv2_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
352 Wmv2Context
* const w
= (Wmv2Context
*)s
;
356 if(w
->j_type
) return 0;
358 if (s
->pict_type
== FF_P_TYPE
) {
359 if(IS_SKIP(s
->current_picture
.mb_type
[s
->mb_y
* s
->mb_stride
+ s
->mb_x
])){
363 s
->block_last_index
[i
] = -1;
364 s
->mv_dir
= MV_DIR_FORWARD
;
365 s
->mv_type
= MV_TYPE_16X16
;
373 code
= get_vlc2(&s
->gb
, ff_mb_non_intra_vlc
[w
->cbp_table_index
].table
, MB_NON_INTRA_VLC_BITS
, 3);
376 s
->mb_intra
= (~code
& 0x40) >> 6;
381 code
= get_vlc2(&s
->gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
383 av_log(s
->avctx
, AV_LOG_ERROR
, "II-cbp illegal at %d %d\n", s
->mb_x
, s
->mb_y
);
386 /* predict coded block pattern */
389 int val
= ((code
>> (5 - i
)) & 1);
391 int pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_val
);
395 cbp
|= val
<< (5 - i
);
401 //printf("P at %d %d\n", s->mb_x, s->mb_y);
402 wmv2_pred_motion(w
, &mx
, &my
);
405 s
->dsp
.clear_blocks(s
->block
[0]);
406 if(s
->per_mb_rl_table
){
407 s
->rl_table_index
= decode012(&s
->gb
);
408 s
->rl_chroma_table_index
= s
->rl_table_index
;
411 if(w
->abt_flag
&& w
->per_mb_abt
){
412 w
->per_block_abt
= get_bits1(&s
->gb
);
413 if(!w
->per_block_abt
)
414 w
->abt_type
= decode012(&s
->gb
);
419 if (wmv2_decode_motion(w
, &mx
, &my
) < 0)
422 s
->mv_dir
= MV_DIR_FORWARD
;
423 s
->mv_type
= MV_TYPE_16X16
;
427 for (i
= 0; i
< 6; i
++) {
428 if (wmv2_decode_inter_block(w
, block
[i
], i
, (cbp
>> (5 - i
)) & 1) < 0)
430 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding inter block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
435 //if(s->pict_type==FF_P_TYPE)
436 // printf("%d%d ", s->inter_intra_pred, cbp);
437 //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
438 s
->ac_pred
= get_bits1(&s
->gb
);
439 if(s
->inter_intra_pred
){
440 s
->h263_aic_dir
= get_vlc2(&s
->gb
, ff_inter_intra_vlc
.table
, INTER_INTRA_VLC_BITS
, 1);
441 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
443 if(s
->per_mb_rl_table
&& cbp
){
444 s
->rl_table_index
= decode012(&s
->gb
);
445 s
->rl_chroma_table_index
= s
->rl_table_index
;
448 s
->dsp
.clear_blocks(s
->block
[0]);
449 for (i
= 0; i
< 6; i
++) {
450 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
452 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding intra block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
461 static av_cold
int wmv2_decode_init(AVCodecContext
*avctx
){
462 Wmv2Context
* const w
= avctx
->priv_data
;
464 if(avctx
->idct_algo
==FF_IDCT_AUTO
){
465 avctx
->idct_algo
=FF_IDCT_WMV2
;
468 if(ff_h263_decode_init(avctx
) < 0)
471 ff_wmv2_common_init(w
);
473 ff_intrax8_common_init(&w
->x8
,&w
->s
);
478 static av_cold
int wmv2_decode_end(AVCodecContext
*avctx
)
480 Wmv2Context
*w
= avctx
->priv_data
;
482 ff_intrax8_common_end(&w
->x8
);
483 return ff_h263_decode_end(avctx
);
486 AVCodec wmv2_decoder
= {
494 ff_h263_decode_frame
,
495 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
496 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),
497 .pix_fmts
= ff_pixfmt_list_420
,