2 * Copyright (c) 2002 The FFmpeg Project.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "simple_idct.h"
27 #define SKIP_TYPE_NONE 0
28 #define SKIP_TYPE_MPEG 1
29 #define SKIP_TYPE_ROW 2
30 #define SKIP_TYPE_COL 3
33 typedef struct Wmv2Context
{
41 int abt_type_table
[6];
51 ScanTable abt_scantable
[2];
52 DCTELEM abt_block2
[6][64] __align8
;
55 static void wmv2_common_init(Wmv2Context
* w
){
56 MpegEncContext
* const s
= &w
->s
;
58 ff_init_scantable(s
->dsp
.idct_permutation
, &w
->abt_scantable
[0], wmv2_scantableA
);
59 ff_init_scantable(s
->dsp
.idct_permutation
, &w
->abt_scantable
[1], wmv2_scantableB
);
62 #ifdef CONFIG_ENCODERS
64 static int encode_ext_header(Wmv2Context
*w
){
65 MpegEncContext
* const s
= &w
->s
;
69 init_put_bits(&pb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
);
71 put_bits(&pb
, 5, s
->avctx
->time_base
.den
/ s
->avctx
->time_base
.num
); //yes 29.97 -> 29
72 put_bits(&pb
, 11, FFMIN(s
->bit_rate
/1024, 2047));
74 put_bits(&pb
, 1, w
->mspel_bit
=1);
75 put_bits(&pb
, 1, w
->flag3
=1);
76 put_bits(&pb
, 1, w
->abt_flag
=1);
77 put_bits(&pb
, 1, w
->j_type_bit
=1);
78 put_bits(&pb
, 1, w
->top_left_mv_flag
=0);
79 put_bits(&pb
, 1, w
->per_mb_rl_bit
=1);
80 put_bits(&pb
, 3, code
=1);
84 s
->slice_height
= s
->mb_height
/ code
;
89 static int wmv2_encode_init(AVCodecContext
*avctx
){
90 Wmv2Context
* const w
= avctx
->priv_data
;
92 if(MPV_encode_init(avctx
) < 0)
97 avctx
->extradata_size
= 4;
98 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+ 10);
104 #if 0 /* unused, remove? */
105 static int wmv2_encode_end(AVCodecContext
*avctx
){
107 if(MPV_encode_end(avctx
) < 0)
110 avctx
->extradata_size
= 0;
111 av_freep(&avctx
->extradata
);
117 int ff_wmv2_encode_picture_header(MpegEncContext
* s
, int picture_number
)
119 Wmv2Context
* const w
= (Wmv2Context
*)s
;
121 put_bits(&s
->pb
, 1, s
->pict_type
- 1);
122 if(s
->pict_type
== I_TYPE
){
123 put_bits(&s
->pb
, 7, 0);
125 put_bits(&s
->pb
, 5, s
->qscale
);
127 s
->dc_table_index
= 1;
128 s
->mv_table_index
= 1; /* only if P frame */
129 // s->use_skip_mb_code = 1; /* only if P frame */
130 s
->per_mb_rl_table
= 0;
136 assert(s
->flipflop_rounding
);
138 if (s
->pict_type
== I_TYPE
) {
139 assert(s
->no_rounding
==1);
140 if(w
->j_type_bit
) put_bits(&s
->pb
, 1, w
->j_type
);
142 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
144 if(!s
->per_mb_rl_table
){
145 code012(&s
->pb
, s
->rl_chroma_table_index
);
146 code012(&s
->pb
, s
->rl_table_index
);
149 put_bits(&s
->pb
, 1, s
->dc_table_index
);
151 s
->inter_intra_pred
= 0;
155 put_bits(&s
->pb
, 2, SKIP_TYPE_NONE
);
157 code012(&s
->pb
, cbp_index
=0);
160 w
->cbp_table_index
= map
[cbp_index
];
161 }else if(s
->qscale
<= 20){
163 w
->cbp_table_index
= map
[cbp_index
];
166 w
->cbp_table_index
= map
[cbp_index
];
169 if(w
->mspel_bit
) put_bits(&s
->pb
, 1, s
->mspel
);
172 put_bits(&s
->pb
, 1, w
->per_mb_abt
^1);
174 code012(&s
->pb
, w
->abt_type
);
178 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
180 if(!s
->per_mb_rl_table
){
181 code012(&s
->pb
, s
->rl_table_index
);
182 s
->rl_chroma_table_index
= s
->rl_table_index
;
184 put_bits(&s
->pb
, 1, s
->dc_table_index
);
185 put_bits(&s
->pb
, 1, s
->mv_table_index
);
187 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
189 s
->esc3_level_length
= 0;
190 s
->esc3_run_length
= 0;
195 // nearly idential to wmv1 but thats just because we dont use the useless M$ crap features
196 // its duplicated here in case someone wants to add support for these carp features
197 void ff_wmv2_encode_mb(MpegEncContext
* s
,
198 DCTELEM block
[6][64],
199 int motion_x
, int motion_y
)
201 Wmv2Context
* const w
= (Wmv2Context
*)s
;
202 int cbp
, coded_cbp
, i
;
204 uint8_t *coded_block
;
210 set_stat(ST_INTER_MB
);
212 for (i
= 0; i
< 6; i
++) {
213 if (s
->block_last_index
[i
] >= 0)
218 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][1],
219 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][0]);
222 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
223 msmpeg4_encode_motion(s
, motion_x
- pred_x
,
229 for (i
= 0; i
< 6; i
++) {
231 val
= (s
->block_last_index
[i
] >= 1);
232 cbp
|= val
<< (5 - i
);
234 /* predict value for close blocks only for luma */
235 pred
= coded_block_pred(s
, i
, &coded_block
);
239 coded_cbp
|= val
<< (5 - i
);
243 printf("cbp=%x %x\n", cbp
, coded_cbp
);
246 if (s
->pict_type
== I_TYPE
) {
247 set_stat(ST_INTRA_MB
);
249 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
252 wmv2_inter_table
[w
->cbp_table_index
][cbp
][1],
253 wmv2_inter_table
[w
->cbp_table_index
][cbp
][0]);
255 set_stat(ST_INTRA_MB
);
256 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
257 if(s
->inter_intra_pred
){
259 put_bits(&s
->pb
, table_inter_intra
[s
->h263_aic_dir
][1], table_inter_intra
[s
->h263_aic_dir
][0]);
263 for (i
= 0; i
< 6; i
++) {
264 msmpeg4_encode_block(s
, block
[i
], i
);
267 #endif //CONFIG_ENCODERS
269 static void parse_mb_skip(Wmv2Context
* w
){
271 MpegEncContext
* const s
= &w
->s
;
272 uint32_t * const mb_type
= s
->current_picture_ptr
->mb_type
;
274 w
->skip_type
= get_bits(&s
->gb
, 2);
275 switch(w
->skip_type
){
277 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
278 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
279 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_16x16
| MB_TYPE_L0
;
284 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
285 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
286 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
291 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
292 if(get_bits1(&s
->gb
)){
293 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
294 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
297 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
298 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
304 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
305 if(get_bits1(&s
->gb
)){
306 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
307 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= MB_TYPE_SKIP
| MB_TYPE_16x16
| MB_TYPE_L0
;
310 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
311 mb_type
[mb_y
*s
->mb_stride
+ mb_x
]= (get_bits1(&s
->gb
) ? MB_TYPE_SKIP
: 0) | MB_TYPE_16x16
| MB_TYPE_L0
;
319 static int decode_ext_header(Wmv2Context
*w
){
320 MpegEncContext
* const s
= &w
->s
;
325 if(s
->avctx
->extradata_size
<4) return -1;
327 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
*8);
329 fps
= get_bits(&gb
, 5);
330 s
->bit_rate
= get_bits(&gb
, 11)*1024;
331 w
->mspel_bit
= get_bits1(&gb
);
332 w
->flag3
= get_bits1(&gb
);
333 w
->abt_flag
= get_bits1(&gb
);
334 w
->j_type_bit
= get_bits1(&gb
);
335 w
->top_left_mv_flag
= get_bits1(&gb
);
336 w
->per_mb_rl_bit
= get_bits1(&gb
);
337 code
= get_bits(&gb
, 3);
339 if(code
==0) return -1;
341 s
->slice_height
= s
->mb_height
/ code
;
343 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
344 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, flag3:%d, slices:%d\n",
345 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
, w
->flag3
,
351 int ff_wmv2_decode_picture_header(MpegEncContext
* s
)
353 Wmv2Context
* const w
= (Wmv2Context
*)s
;
359 for(i
=0; i
<s
->gb
.size
*8; i
++)
360 printf("%d", get_bits1(&s
->gb
));
361 // get_bits1(&s->gb);
366 if(s
->picture_number
==0)
367 decode_ext_header(w
);
369 s
->pict_type
= get_bits(&s
->gb
, 1) + 1;
370 if(s
->pict_type
== I_TYPE
){
371 code
= get_bits(&s
->gb
, 7);
372 av_log(s
->avctx
, AV_LOG_ERROR
, "I7:%X/\n", code
);
374 s
->chroma_qscale
= s
->qscale
= get_bits(&s
->gb
, 5);
381 int ff_wmv2_decode_secondary_picture_header(MpegEncContext
* s
)
383 Wmv2Context
* const w
= (Wmv2Context
*)s
;
385 if (s
->pict_type
== I_TYPE
) {
386 if(w
->j_type_bit
) w
->j_type
= get_bits1(&s
->gb
);
387 else w
->j_type
= 0; //FIXME check
390 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
391 else s
->per_mb_rl_table
= 0;
393 if(!s
->per_mb_rl_table
){
394 s
->rl_chroma_table_index
= decode012(&s
->gb
);
395 s
->rl_table_index
= decode012(&s
->gb
);
398 s
->dc_table_index
= get_bits1(&s
->gb
);
400 s
->inter_intra_pred
= 0;
402 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
403 av_log(s
->avctx
, AV_LOG_DEBUG
, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n",
405 s
->rl_chroma_table_index
,
416 cbp_index
= decode012(&s
->gb
);
419 w
->cbp_table_index
= map
[cbp_index
];
420 }else if(s
->qscale
<= 20){
422 w
->cbp_table_index
= map
[cbp_index
];
425 w
->cbp_table_index
= map
[cbp_index
];
428 if(w
->mspel_bit
) s
->mspel
= get_bits1(&s
->gb
);
429 else s
->mspel
= 0; //FIXME check
432 w
->per_mb_abt
= get_bits1(&s
->gb
)^1;
434 w
->abt_type
= decode012(&s
->gb
);
438 if(w
->per_mb_rl_bit
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
439 else s
->per_mb_rl_table
= 0;
441 if(!s
->per_mb_rl_table
){
442 s
->rl_table_index
= decode012(&s
->gb
);
443 s
->rl_chroma_table_index
= s
->rl_table_index
;
446 s
->dc_table_index
= get_bits1(&s
->gb
);
447 s
->mv_table_index
= get_bits1(&s
->gb
);
449 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
452 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
453 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",
455 s
->rl_chroma_table_index
,
464 s
->inter_intra_pred
);
467 s
->esc3_level_length
= 0;
468 s
->esc3_run_length
= 0;
470 s
->picture_number
++; //FIXME ?
474 // return wmv2_decode_j_picture(w); //FIXME
477 av_log(s
->avctx
, AV_LOG_ERROR
, "J-type picture is not supported\n");
484 static inline int wmv2_decode_motion(Wmv2Context
*w
, int *mx_ptr
, int *my_ptr
){
485 MpegEncContext
* const s
= &w
->s
;
488 ret
= msmpeg4_decode_motion(s
, mx_ptr
, my_ptr
);
492 if((((*mx_ptr
)|(*my_ptr
)) & 1) && s
->mspel
)
493 w
->hshift
= get_bits1(&s
->gb
);
497 //printf("%d %d ", *mx_ptr, *my_ptr);
502 static int16_t *wmv2_pred_motion(Wmv2Context
*w
, int *px
, int *py
){
503 MpegEncContext
* const s
= &w
->s
;
504 int xy
, wrap
, diff
, type
;
505 int16_t *A
, *B
, *C
, *mot_val
;
508 xy
= s
->block_index
[0];
510 mot_val
= s
->current_picture
.motion_val
[0][xy
];
512 A
= s
->current_picture
.motion_val
[0][xy
- 1];
513 B
= s
->current_picture
.motion_val
[0][xy
- wrap
];
514 C
= s
->current_picture
.motion_val
[0][xy
+ 2 - wrap
];
516 diff
= FFMAX(ABS(A
[0] - B
[0]), ABS(A
[1] - B
[1]));
518 if(s
->mb_x
&& !s
->first_slice_line
&& !s
->mspel
&& w
->top_left_mv_flag
&& diff
>= 8)
519 type
= get_bits1(&s
->gb
);
530 /* special case for first (slice) line */
531 if (s
->first_slice_line
) {
535 *px
= mid_pred(A
[0], B
[0], C
[0]);
536 *py
= mid_pred(A
[1], B
[1], C
[1]);
543 static inline int wmv2_decode_inter_block(Wmv2Context
*w
, DCTELEM
*block
, int n
, int cbp
){
544 MpegEncContext
* const s
= &w
->s
;
545 static const int sub_cbp_table
[3]= {2,3,1};
549 s
->block_last_index
[n
] = -1;
555 w
->abt_type
= decode012(&s
->gb
);
558 printf("B%d", w
->abt_type
);
560 w
->abt_type_table
[n
]= w
->abt_type
;
563 // const uint8_t *scantable= w->abt_scantable[w->abt_type-1].permutated;
564 const uint8_t *scantable
= w
->abt_scantable
[w
->abt_type
-1].scantable
;
565 // const uint8_t *scantable= w->abt_type-1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
567 sub_cbp
= sub_cbp_table
[ decode012(&s
->gb
) ];
568 // printf("S%d", sub_cbp);
571 if (msmpeg4_decode_block(s
, block
, n
, 1, scantable
) < 0)
576 if (msmpeg4_decode_block(s
, w
->abt_block2
[n
], n
, 1, scantable
) < 0)
579 s
->block_last_index
[n
] = 63;
583 return msmpeg4_decode_block(s
, block
, n
, 1, s
->inter_scantable
.permutated
);
587 static void wmv2_add_block(Wmv2Context
*w
, DCTELEM
*block1
, uint8_t *dst
, int stride
, int n
){
588 MpegEncContext
* const s
= &w
->s
;
590 if (s
->block_last_index
[n
] >= 0) {
591 switch(w
->abt_type_table
[n
]){
593 s
->dsp
.idct_add (dst
, stride
, block1
);
596 simple_idct84_add(dst
, stride
, block1
);
597 simple_idct84_add(dst
+ 4*stride
, stride
, w
->abt_block2
[n
]);
598 memset(w
->abt_block2
[n
], 0, 64*sizeof(DCTELEM
));
601 simple_idct48_add(dst
, stride
, block1
);
602 simple_idct48_add(dst
+ 4 , stride
, w
->abt_block2
[n
]);
603 memset(w
->abt_block2
[n
], 0, 64*sizeof(DCTELEM
));
606 av_log(s
->avctx
, AV_LOG_ERROR
, "internal error in WMV2 abt\n");
611 void ff_wmv2_add_mb(MpegEncContext
*s
, DCTELEM block1
[6][64], uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
){
612 Wmv2Context
* const w
= (Wmv2Context
*)s
;
614 wmv2_add_block(w
, block1
[0], dest_y
, s
->linesize
, 0);
615 wmv2_add_block(w
, block1
[1], dest_y
+ 8 , s
->linesize
, 1);
616 wmv2_add_block(w
, block1
[2], dest_y
+ 8*s
->linesize
, s
->linesize
, 2);
617 wmv2_add_block(w
, block1
[3], dest_y
+ 8 + 8*s
->linesize
, s
->linesize
, 3);
619 if(s
->flags
&CODEC_FLAG_GRAY
) return;
621 wmv2_add_block(w
, block1
[4], dest_cb
, s
->uvlinesize
, 4);
622 wmv2_add_block(w
, block1
[5], dest_cr
, s
->uvlinesize
, 5);
625 void ff_mspel_motion(MpegEncContext
*s
,
626 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
627 uint8_t **ref_picture
, op_pixels_func (*pix_op
)[4],
628 int motion_x
, int motion_y
, int h
)
630 Wmv2Context
* const w
= (Wmv2Context
*)s
;
632 int dxy
, offset
, mx
, my
, src_x
, src_y
, v_edge_pos
, linesize
, uvlinesize
;
635 dxy
= ((motion_y
& 1) << 1) | (motion_x
& 1);
636 dxy
= 2*dxy
+ w
->hshift
;
637 src_x
= s
->mb_x
* 16 + (motion_x
>> 1);
638 src_y
= s
->mb_y
* 16 + (motion_y
>> 1);
640 /* WARNING: do no forget half pels */
641 v_edge_pos
= s
->v_edge_pos
;
642 src_x
= clip(src_x
, -16, s
->width
);
643 src_y
= clip(src_y
, -16, s
->height
);
644 linesize
= s
->linesize
;
645 uvlinesize
= s
->uvlinesize
;
646 ptr
= ref_picture
[0] + (src_y
* linesize
) + src_x
;
648 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
649 if(src_x
<1 || src_y
<1 || src_x
+ 17 >= s
->h_edge_pos
650 || src_y
+ h
+1 >= v_edge_pos
){
651 ff_emulated_edge_mc(s
->edge_emu_buffer
, ptr
- 1 - s
->linesize
, s
->linesize
, 19, 19,
652 src_x
-1, src_y
-1, s
->h_edge_pos
, s
->v_edge_pos
);
653 ptr
= s
->edge_emu_buffer
+ 1 + s
->linesize
;
658 s
->dsp
.put_mspel_pixels_tab
[dxy
](dest_y
, ptr
, linesize
);
659 s
->dsp
.put_mspel_pixels_tab
[dxy
](dest_y
+8 , ptr
+8 , linesize
);
660 s
->dsp
.put_mspel_pixels_tab
[dxy
](dest_y
+8*linesize
, ptr
+8*linesize
, linesize
);
661 s
->dsp
.put_mspel_pixels_tab
[dxy
](dest_y
+8+8*linesize
, ptr
+8+8*linesize
, linesize
);
663 if(s
->flags
&CODEC_FLAG_GRAY
) return;
665 if (s
->out_format
== FMT_H263
) {
667 if ((motion_x
& 3) != 0)
669 if ((motion_y
& 3) != 0)
676 dxy
= ((my
& 1) << 1) | (mx
& 1);
681 src_x
= s
->mb_x
* 8 + mx
;
682 src_y
= s
->mb_y
* 8 + my
;
683 src_x
= clip(src_x
, -8, s
->width
>> 1);
684 if (src_x
== (s
->width
>> 1))
686 src_y
= clip(src_y
, -8, s
->height
>> 1);
687 if (src_y
== (s
->height
>> 1))
689 offset
= (src_y
* uvlinesize
) + src_x
;
690 ptr
= ref_picture
[1] + offset
;
692 ff_emulated_edge_mc(s
->edge_emu_buffer
, ptr
, s
->uvlinesize
, 9, 9,
693 src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
694 ptr
= s
->edge_emu_buffer
;
696 pix_op
[1][dxy
](dest_cb
, ptr
, uvlinesize
, h
>> 1);
698 ptr
= ref_picture
[2] + offset
;
700 ff_emulated_edge_mc(s
->edge_emu_buffer
, ptr
, s
->uvlinesize
, 9, 9,
701 src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
702 ptr
= s
->edge_emu_buffer
;
704 pix_op
[1][dxy
](dest_cr
, ptr
, uvlinesize
, h
>> 1);
708 static int wmv2_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
710 Wmv2Context
* const w
= (Wmv2Context
*)s
;
714 if(w
->j_type
) return 0;
716 if (s
->pict_type
== P_TYPE
) {
717 if(IS_SKIP(s
->current_picture
.mb_type
[s
->mb_y
* s
->mb_stride
+ s
->mb_x
])){
721 s
->block_last_index
[i
] = -1;
722 s
->mv_dir
= MV_DIR_FORWARD
;
723 s
->mv_type
= MV_TYPE_16X16
;
731 code
= get_vlc2(&s
->gb
, mb_non_intra_vlc
[w
->cbp_table_index
].table
, MB_NON_INTRA_VLC_BITS
, 3);
734 s
->mb_intra
= (~code
& 0x40) >> 6;
739 code
= get_vlc2(&s
->gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
741 av_log(s
->avctx
, AV_LOG_ERROR
, "II-cbp illegal at %d %d\n", s
->mb_x
, s
->mb_y
);
744 /* predict coded block pattern */
747 int val
= ((code
>> (5 - i
)) & 1);
749 int pred
= coded_block_pred(s
, i
, &coded_val
);
753 cbp
|= val
<< (5 - i
);
759 //printf("P at %d %d\n", s->mb_x, s->mb_y);
760 wmv2_pred_motion(w
, &mx
, &my
);
763 s
->dsp
.clear_blocks(s
->block
[0]);
764 if(s
->per_mb_rl_table
){
765 s
->rl_table_index
= decode012(&s
->gb
);
766 s
->rl_chroma_table_index
= s
->rl_table_index
;
769 if(w
->abt_flag
&& w
->per_mb_abt
){
770 w
->per_block_abt
= get_bits1(&s
->gb
);
771 if(!w
->per_block_abt
)
772 w
->abt_type
= decode012(&s
->gb
);
777 if (wmv2_decode_motion(w
, &mx
, &my
) < 0)
780 s
->mv_dir
= MV_DIR_FORWARD
;
781 s
->mv_type
= MV_TYPE_16X16
;
785 for (i
= 0; i
< 6; i
++) {
786 if (wmv2_decode_inter_block(w
, block
[i
], i
, (cbp
>> (5 - i
)) & 1) < 0)
788 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding inter block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
793 //if(s->pict_type==P_TYPE)
794 // printf("%d%d ", s->inter_intra_pred, cbp);
795 //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));
796 s
->ac_pred
= get_bits1(&s
->gb
);
797 if(s
->inter_intra_pred
){
798 s
->h263_aic_dir
= get_vlc2(&s
->gb
, inter_intra_vlc
.table
, INTER_INTRA_VLC_BITS
, 1);
799 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
801 if(s
->per_mb_rl_table
&& cbp
){
802 s
->rl_table_index
= decode012(&s
->gb
);
803 s
->rl_chroma_table_index
= s
->rl_table_index
;
806 s
->dsp
.clear_blocks(s
->block
[0]);
807 for (i
= 0; i
< 6; i
++) {
808 if (msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
810 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding intra block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
819 static int wmv2_decode_init(AVCodecContext
*avctx
){
820 Wmv2Context
* const w
= avctx
->priv_data
;
822 if(ff_h263_decode_init(avctx
) < 0)
830 AVCodec wmv2_decoder
= {
838 ff_h263_decode_frame
,
839 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
842 #ifdef CONFIG_ENCODERS
843 AVCodec wmv2_encoder
= {