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"
25 #include "msmpeg4data.h"
30 static void parse_mb_skip(Wmv2Context
* w
){
32 MpegEncContext
* const s
= &w
->s
;
33 uint32_t * const mb_type
= s
->current_picture_ptr
->mb_type
;
35 w
->skip_type
= get_bits(&s
->gb
, 2);
38 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
39 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
40 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_16x16
| MB_TYPE_L0
;
45 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
46 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
47 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
52 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
53 if(get_bits1(&s
->gb
)){
54 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
55 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
58 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
59 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
65 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
66 if(get_bits1(&s
->gb
)){
67 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
68 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
71 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
72 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
80 static int decode_ext_header(Wmv2Context
*w
){
81 MpegEncContext
* const s
= &w
->s
;
86 if(s
->avctx
->extradata_size
<4) return -1;
88 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
*8);
90 fps
= get_bits(&gb
, 5);
91 s
->bit_rate
= get_bits(&gb
, 11)*1024;
92 w
->mspel_bit
= get_bits1(&gb
);
93 s
->loop_filter
= get_bits1(&gb
);
94 w
->abt_flag
= get_bits1(&gb
);
95 w
->j_type_bit
= get_bits1(&gb
);
96 w
->top_left_mv_flag
= get_bits1(&gb
);
97 w
->per_mb_rl_bit
= get_bits1(&gb
);
98 code
= get_bits(&gb
, 3);
100 if(code
==0) return -1;
102 s
->slice_height
= s
->mb_height
/ code
;
104 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
105 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",
106 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
,
112 int ff_wmv2_decode_picture_header(MpegEncContext
* s
)
114 Wmv2Context
* const w
= (Wmv2Context
*)s
;
120 for(i
=0; i
<s
->gb
.size
*8; i
++)
121 printf("%d", get_bits1(&s
->gb
));
122 // get_bits1(&s->gb);
127 if(s
->picture_number
==0)
128 decode_ext_header(w
);
130 s
->pict_type
= get_bits1(&s
->gb
) + 1;
131 if(s
->pict_type
== FF_I_TYPE
){
132 code
= get_bits(&s
->gb
, 7);
133 av_log(s
->avctx
, AV_LOG_DEBUG
, "I7:%X/\n", code
);
135 s
->chroma_qscale
= s
->qscale
= get_bits(&s
->gb
, 5);
142 int ff_wmv2_decode_secondary_picture_header(MpegEncContext
* s
)
144 Wmv2Context
* const w
= (Wmv2Context
*)s
;
146 if (s
->pict_type
== FF_I_TYPE
) {
147 if(w
->j_type_bit
) w
->j_type
= get_bits1(&s
->gb
);
148 else w
->j_type
= 0; //FIXME check
151 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
152 else s
->per_mb_rl_table
= 0;
154 if(!s
->per_mb_rl_table
){
155 s
->rl_chroma_table_index
= decode012(&s
->gb
);
156 s
->rl_table_index
= decode012(&s
->gb
);
159 s
->dc_table_index
= get_bits1(&s
->gb
);
161 s
->inter_intra_pred
= 0;
163 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
164 av_log(s
->avctx
, AV_LOG_DEBUG
, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n",
166 s
->rl_chroma_table_index
,
177 cbp_index
= decode012(&s
->gb
);
180 w
->cbp_table_index
= map
[cbp_index
];
181 }else if(s
->qscale
<= 20){
183 w
->cbp_table_index
= map
[cbp_index
];
186 w
->cbp_table_index
= map
[cbp_index
];
189 if(w
->mspel_bit
) s
->mspel
= get_bits1(&s
->gb
);
190 else s
->mspel
= 0; //FIXME check
193 w
->per_mb_abt
= get_bits1(&s
->gb
)^1;
195 w
->abt_type
= decode012(&s
->gb
);
199 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
200 else s
->per_mb_rl_table
= 0;
202 if(!s
->per_mb_rl_table
){
203 s
->rl_table_index
= decode012(&s
->gb
);
204 s
->rl_chroma_table_index
= s
->rl_table_index
;
207 s
->dc_table_index
= get_bits1(&s
->gb
);
208 s
->mv_table_index
= get_bits1(&s
->gb
);
210 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
213 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
214 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",
216 s
->rl_chroma_table_index
,
225 s
->inter_intra_pred
);
228 s
->esc3_level_length
= 0;
229 s
->esc3_run_length
= 0;
231 s
->picture_number
++; //FIXME ?
235 ff_intrax8_decode_picture(&w
->x8
, 2*s
->qscale
, (s
->qscale
-1)|1 );
242 static inline int wmv2_decode_motion(Wmv2Context
*w
, int *mx_ptr
, int *my_ptr
){
243 MpegEncContext
* const s
= &w
->s
;
246 ret
= ff_msmpeg4_decode_motion(s
, mx_ptr
, my_ptr
);
250 if((((*mx_ptr
)|(*my_ptr
)) & 1) && s
->mspel
)
251 w
->hshift
= get_bits1(&s
->gb
);
255 //printf("%d %d ", *mx_ptr, *my_ptr);
260 static int16_t *wmv2_pred_motion(Wmv2Context
*w
, int *px
, int *py
){
261 MpegEncContext
* const s
= &w
->s
;
262 int xy
, wrap
, diff
, type
;
263 int16_t *A
, *B
, *C
, *mot_val
;
266 xy
= s
->block_index
[0];
268 mot_val
= s
->current_picture
.motion_val
[0][xy
];
270 A
= s
->current_picture
.motion_val
[0][xy
- 1];
271 B
= s
->current_picture
.motion_val
[0][xy
- wrap
];
272 C
= s
->current_picture
.motion_val
[0][xy
+ 2 - wrap
];
274 if(s
->mb_x
&& !s
->first_slice_line
&& !s
->mspel
&& w
->top_left_mv_flag
)
275 diff
= FFMAX(FFABS(A
[0] - B
[0]), FFABS(A
[1] - B
[1]));
280 type
= get_bits1(&s
->gb
);
291 /* special case for first (slice) line */
292 if (s
->first_slice_line
) {
296 *px
= mid_pred(A
[0], B
[0], C
[0]);
297 *py
= mid_pred(A
[1], B
[1], C
[1]);
304 static inline int wmv2_decode_inter_block(Wmv2Context
*w
, DCTELEM
*block
, int n
, int cbp
){
305 MpegEncContext
* const s
= &w
->s
;
306 static const int sub_cbp_table
[3]= {2,3,1};
310 s
->block_last_index
[n
] = -1;
316 w
->abt_type
= decode012(&s
->gb
);
319 printf("B%d", w
->abt_type
);
321 w
->abt_type_table
[n
]= w
->abt_type
;
324 // const uint8_t *scantable= w->abt_scantable[w->abt_type-1].permutated;
325 const uint8_t *scantable
= w
->abt_scantable
[w
->abt_type
-1].scantable
;
326 // const uint8_t *scantable= w->abt_type-1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
328 sub_cbp
= sub_cbp_table
[ decode012(&s
->gb
) ];
329 // printf("S%d", sub_cbp);
332 if (ff_msmpeg4_decode_block(s
, block
, n
, 1, scantable
) < 0)
337 if (ff_msmpeg4_decode_block(s
, w
->abt_block2
[n
], n
, 1, scantable
) < 0)
340 s
->block_last_index
[n
] = 63;
344 return ff_msmpeg4_decode_block(s
, block
, n
, 1, s
->inter_scantable
.permutated
);
349 int ff_wmv2_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
351 Wmv2Context
* const w
= (Wmv2Context
*)s
;
355 if(w
->j_type
) return 0;
357 if (s
->pict_type
== FF_P_TYPE
) {
358 if(IS_SKIP(s
->current_picture
.mb_type
[s
->mb_y
* s
->mb_stride
+ s
->mb_x
])){
362 s
->block_last_index
[i
] = -1;
363 s
->mv_dir
= MV_DIR_FORWARD
;
364 s
->mv_type
= MV_TYPE_16X16
;
372 code
= get_vlc2(&s
->gb
, ff_mb_non_intra_vlc
[w
->cbp_table_index
].table
, MB_NON_INTRA_VLC_BITS
, 3);
375 s
->mb_intra
= (~code
& 0x40) >> 6;
380 code
= get_vlc2(&s
->gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
382 av_log(s
->avctx
, AV_LOG_ERROR
, "II-cbp illegal at %d %d\n", s
->mb_x
, s
->mb_y
);
385 /* predict coded block pattern */
388 int val
= ((code
>> (5 - i
)) & 1);
390 int pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_val
);
394 cbp
|= val
<< (5 - i
);
400 //printf("P at %d %d\n", s->mb_x, s->mb_y);
401 wmv2_pred_motion(w
, &mx
, &my
);
404 s
->dsp
.clear_blocks(s
->block
[0]);
405 if(s
->per_mb_rl_table
){
406 s
->rl_table_index
= decode012(&s
->gb
);
407 s
->rl_chroma_table_index
= s
->rl_table_index
;
410 if(w
->abt_flag
&& w
->per_mb_abt
){
411 w
->per_block_abt
= get_bits1(&s
->gb
);
412 if(!w
->per_block_abt
)
413 w
->abt_type
= decode012(&s
->gb
);
418 if (wmv2_decode_motion(w
, &mx
, &my
) < 0)
421 s
->mv_dir
= MV_DIR_FORWARD
;
422 s
->mv_type
= MV_TYPE_16X16
;
426 for (i
= 0; i
< 6; i
++) {
427 if (wmv2_decode_inter_block(w
, block
[i
], i
, (cbp
>> (5 - i
)) & 1) < 0)
429 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding inter block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
434 //if(s->pict_type==FF_P_TYPE)
435 // printf("%d%d ", s->inter_intra_pred, cbp);
436 //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));
437 s
->ac_pred
= get_bits1(&s
->gb
);
438 if(s
->inter_intra_pred
){
439 s
->h263_aic_dir
= get_vlc2(&s
->gb
, ff_inter_intra_vlc
.table
, INTER_INTRA_VLC_BITS
, 1);
440 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
442 if(s
->per_mb_rl_table
&& cbp
){
443 s
->rl_table_index
= decode012(&s
->gb
);
444 s
->rl_chroma_table_index
= s
->rl_table_index
;
447 s
->dsp
.clear_blocks(s
->block
[0]);
448 for (i
= 0; i
< 6; i
++) {
449 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
451 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding intra block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
460 static av_cold
int wmv2_decode_init(AVCodecContext
*avctx
){
461 Wmv2Context
* const w
= avctx
->priv_data
;
463 if(avctx
->idct_algo
==FF_IDCT_AUTO
){
464 avctx
->idct_algo
=FF_IDCT_WMV2
;
467 if(ff_h263_decode_init(avctx
) < 0)
470 ff_wmv2_common_init(w
);
472 ff_intrax8_common_init(&w
->x8
,&w
->s
);
477 static av_cold
int wmv2_decode_end(AVCodecContext
*avctx
)
479 Wmv2Context
*w
= avctx
->priv_data
;
481 ff_intrax8_common_end(&w
->x8
);
482 return ff_h263_decode_end(avctx
);
485 AVCodec wmv2_decoder
= {
493 ff_h263_decode_frame
,
494 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
495 .long_name
= "Windows Media Video 8",