2 * MSMPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * @file libavcodec/msmpeg4.c
27 * MSMPEG4 backend for ffmpeg encoder and decoder.
32 #include "mpegvideo.h"
34 #include "libavutil/x86_cpu.h"
37 * You can also call this codec : MPEG4 with a twist !
40 * - (encoding) select best mv table (two choices)
41 * - (encoding) select best vlc/dc table
46 #define CBPY_VLC_BITS 6
47 #define V1_INTRA_CBPC_VLC_BITS 6
48 #define V1_INTER_CBPC_VLC_BITS 6
49 #define V2_INTRA_CBPC_VLC_BITS 3
50 #define V2_MB_TYPE_VLC_BITS 7
52 #define V2_MV_VLC_BITS 9
53 #define TEX_VLC_BITS 9
55 #define II_BITRATE 128*1024
56 #define MBAC_BITRATE 50*1024
58 #define DEFAULT_INTER_INDEX 3
60 static uint32_t v2_dc_lum_table
[512][2];
61 static uint32_t v2_dc_chroma_table
[512][2];
63 static int msmpeg4_decode_dc(MpegEncContext
* s
, int n
, int *dir_ptr
);
64 static void init_h263_dc_for_msmpeg4(void);
65 static inline void msmpeg4_memsetw(short *tab
, int val
, int n
);
67 static void msmpeg4v2_encode_motion(MpegEncContext
* s
, int val
);
68 static int get_size_of_code(MpegEncContext
* s
, RLTable
*rl
, int last
, int run
, int level
, int intra
);
69 #endif //CONFIG_ENCODERS
70 static int msmpeg4v12_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64]);
71 static int msmpeg4v34_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64]);
74 extern const uint8_t wmv3_dc_scale_table
[32];
80 #include "msmpeg4data.h"
82 #if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced
83 static uint8_t rl_length
[NB_RL_TABLES
][MAX_LEVEL
+1][MAX_RUN
+1][2];
84 #endif //CONFIG_ENCODERS
86 static uint8_t static_rl_table_store
[NB_RL_TABLES
][2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
88 static av_cold
void common_init(MpegEncContext
* s
)
90 static int initialized
=0;
92 switch(s
->msmpeg4_version
){
96 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
99 if(s
->workaround_bugs
){
100 s
->y_dc_scale_table
= old_ff_y_dc_scale_table
;
101 s
->c_dc_scale_table
= wmv1_c_dc_scale_table
;
103 s
->y_dc_scale_table
= ff_mpeg4_y_dc_scale_table
;
104 s
->c_dc_scale_table
= ff_mpeg4_c_dc_scale_table
;
109 s
->y_dc_scale_table
= wmv1_y_dc_scale_table
;
110 s
->c_dc_scale_table
= wmv1_c_dc_scale_table
;
112 #if CONFIG_VC1_DECODER
114 s
->y_dc_scale_table
= wmv3_dc_scale_table
;
115 s
->c_dc_scale_table
= wmv3_dc_scale_table
;
122 if(s
->msmpeg4_version
>=4){
123 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_scantable
, wmv1_scantable
[1]);
124 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_h_scantable
, wmv1_scantable
[2]);
125 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_v_scantable
, wmv1_scantable
[3]);
126 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->inter_scantable
, wmv1_scantable
[0]);
128 //Note the default tables are set in common_init in mpegvideo.c
133 init_h263_dc_for_msmpeg4();
139 /* build the table which associate a (x,y) motion vector to a vlc */
140 static void init_mv_table(MVTable
*tab
)
144 tab
->table_mv_index
= av_malloc(sizeof(uint16_t) * 4096);
145 /* mark all entries as not used */
147 tab
->table_mv_index
[i
] = tab
->n
;
149 for(i
=0;i
<tab
->n
;i
++) {
150 x
= tab
->table_mvx
[i
];
151 y
= tab
->table_mvy
[i
];
152 tab
->table_mv_index
[(x
<< 6) | y
] = i
;
156 void ff_msmpeg4_code012(PutBitContext
*pb
, int n
)
162 put_bits(pb
, 1, (n
>= 2));
166 av_cold
void ff_msmpeg4_encode_init(MpegEncContext
*s
)
168 static int init_done
=0;
172 if(s
->msmpeg4_version
>=4){
178 /* init various encoding tables */
180 init_mv_table(&mv_tables
[0]);
181 init_mv_table(&mv_tables
[1]);
182 for(i
=0;i
<NB_RL_TABLES
;i
++)
183 init_rl(&rl_table
[i
], static_rl_table_store
[i
]);
185 for(i
=0; i
<NB_RL_TABLES
; i
++){
187 for(level
=0; level
<=MAX_LEVEL
; level
++){
189 for(run
=0; run
<=MAX_RUN
; run
++){
191 for(last
=0; last
<2; last
++){
192 rl_length
[i
][level
][run
][last
]= get_size_of_code(s
, &rl_table
[ i
], last
, run
, level
, 0);
200 static int get_size_of_code(MpegEncContext
* s
, RLTable
*rl
, int last
, int run
, int level
, int intra
){
203 int run_diff
= intra
? 0 : 1;
205 code
= get_rl_index(rl
, last
, run
, level
);
206 size
+= rl
->table_vlc
[code
][1];
210 level1
= level
- rl
->max_level
[last
][run
];
213 code
= get_rl_index(rl
, last
, run
, level1
);
217 if (level
> MAX_LEVEL
)
219 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
222 code
= get_rl_index(rl
, last
, run1
, level
);
229 size
+= 1+1+ rl
->table_vlc
[code
][1];
233 size
+= 1+1+ rl
->table_vlc
[code
][1];
241 static void find_best_tables(MpegEncContext
* s
)
244 int best
=-1, best_size
=9999999;
245 int chroma_best
=-1, best_chroma_size
=9999999;
256 for(level
=0; level
<=MAX_LEVEL
; level
++){
258 for(run
=0; run
<=MAX_RUN
; run
++){
260 const int last_size
= size
+ chroma_size
;
261 for(last
=0; last
<2; last
++){
262 int inter_count
= s
->ac_stats
[0][0][level
][run
][last
] + s
->ac_stats
[0][1][level
][run
][last
];
263 int intra_luma_count
= s
->ac_stats
[1][0][level
][run
][last
];
264 int intra_chroma_count
= s
->ac_stats
[1][1][level
][run
][last
];
266 if(s
->pict_type
==FF_I_TYPE
){
267 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
];
268 chroma_size
+= intra_chroma_count
*rl_length
[i
+3][level
][run
][last
];
270 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
]
271 +intra_chroma_count
*rl_length
[i
+3][level
][run
][last
]
272 +inter_count
*rl_length
[i
+3][level
][run
][last
];
275 if(last_size
== size
+chroma_size
) break;
282 if(chroma_size
<best_chroma_size
){
283 best_chroma_size
= chroma_size
;
288 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
289 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
291 if(s
->pict_type
==FF_P_TYPE
) chroma_best
= best
;
293 memset(s
->ac_stats
, 0, sizeof(int)*(MAX_LEVEL
+1)*(MAX_RUN
+1)*2*2*2);
295 s
->rl_table_index
= best
;
296 s
->rl_chroma_table_index
= chroma_best
;
298 if(s
->pict_type
!= s
->last_non_b_pict_type
){
299 s
->rl_table_index
= 2;
300 if(s
->pict_type
==FF_I_TYPE
)
301 s
->rl_chroma_table_index
= 1;
303 s
->rl_chroma_table_index
= 2;
308 /* write MSMPEG4 compatible frame header */
309 void msmpeg4_encode_picture_header(MpegEncContext
* s
, int picture_number
)
313 align_put_bits(&s
->pb
);
314 put_bits(&s
->pb
, 2, s
->pict_type
- 1);
316 put_bits(&s
->pb
, 5, s
->qscale
);
317 if(s
->msmpeg4_version
<=2){
318 s
->rl_table_index
= 2;
319 s
->rl_chroma_table_index
= 2;
322 s
->dc_table_index
= 1;
323 s
->mv_table_index
= 1; /* only if P frame */
324 s
->use_skip_mb_code
= 1; /* only if P frame */
325 s
->per_mb_rl_table
= 0;
326 if(s
->msmpeg4_version
==4)
327 s
->inter_intra_pred
= (s
->width
*s
->height
< 320*240 && s
->bit_rate
<=II_BITRATE
&& s
->pict_type
==FF_P_TYPE
);
328 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
330 if (s
->pict_type
== FF_I_TYPE
) {
331 s
->slice_height
= s
->mb_height
/1;
332 put_bits(&s
->pb
, 5, 0x16 + s
->mb_height
/s
->slice_height
);
334 if(s
->msmpeg4_version
==4){
335 msmpeg4_encode_ext_header(s
);
336 if(s
->bit_rate
>MBAC_BITRATE
)
337 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
340 if(s
->msmpeg4_version
>2){
341 if(!s
->per_mb_rl_table
){
342 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
343 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
346 put_bits(&s
->pb
, 1, s
->dc_table_index
);
349 put_bits(&s
->pb
, 1, s
->use_skip_mb_code
);
351 if(s
->msmpeg4_version
==4 && s
->bit_rate
>MBAC_BITRATE
)
352 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
354 if(s
->msmpeg4_version
>2){
355 if(!s
->per_mb_rl_table
)
356 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
358 put_bits(&s
->pb
, 1, s
->dc_table_index
);
360 put_bits(&s
->pb
, 1, s
->mv_table_index
);
364 s
->esc3_level_length
= 0;
365 s
->esc3_run_length
= 0;
368 void msmpeg4_encode_ext_header(MpegEncContext
* s
)
370 put_bits(&s
->pb
, 5, s
->avctx
->time_base
.den
/ s
->avctx
->time_base
.num
); //yes 29.97 -> 29
372 put_bits(&s
->pb
, 11, FFMIN(s
->bit_rate
/1024, 2047));
374 if(s
->msmpeg4_version
>=3)
375 put_bits(&s
->pb
, 1, s
->flipflop_rounding
);
377 assert(s
->flipflop_rounding
==0);
380 #endif //CONFIG_ENCODERS
382 /* predict coded block */
383 int ff_msmpeg4_coded_block_pred(MpegEncContext
* s
, int n
, uint8_t **coded_block_ptr
)
385 int xy
, wrap
, pred
, a
, b
, c
;
387 xy
= s
->block_index
[n
];
393 a
= s
->coded_block
[xy
- 1 ];
394 b
= s
->coded_block
[xy
- 1 - wrap
];
395 c
= s
->coded_block
[xy
- wrap
];
404 *coded_block_ptr
= &s
->coded_block
[xy
];
411 void ff_msmpeg4_encode_motion(MpegEncContext
* s
,
417 /* modulo encoding */
418 /* WARNING : you cannot reach all the MVs even with the modulo
419 encoding. This is a somewhat strange compromise they took !!! */
432 if ((unsigned)mx
>= 64 ||
434 av_log(s
->avctx
, AV_LOG_ERROR
, "error mx=%d my=%d\n", mx
, my
);
436 mv
= &mv_tables
[s
->mv_table_index
];
438 code
= mv
->table_mv_index
[(mx
<< 6) | my
];
440 mv
->table_mv_bits
[code
],
441 mv
->table_mv_code
[code
]);
443 /* escape : code literally */
444 put_bits(&s
->pb
, 6, mx
);
445 put_bits(&s
->pb
, 6, my
);
449 void ff_msmpeg4_handle_slices(MpegEncContext
*s
){
451 if (s
->slice_height
&& (s
->mb_y
% s
->slice_height
) == 0) {
452 if(s
->msmpeg4_version
< 4){
453 ff_mpeg4_clean_buffers(s
);
455 s
->first_slice_line
= 1;
457 s
->first_slice_line
= 0;
462 void msmpeg4_encode_mb(MpegEncContext
* s
,
463 DCTELEM block
[6][64],
464 int motion_x
, int motion_y
)
466 int cbp
, coded_cbp
, i
;
468 uint8_t *coded_block
;
470 ff_msmpeg4_handle_slices(s
);
475 for (i
= 0; i
< 6; i
++) {
476 if (s
->block_last_index
[i
] >= 0)
479 if (s
->use_skip_mb_code
&& (cbp
| motion_x
| motion_y
) == 0) {
480 /* skip macroblock */
481 put_bits(&s
->pb
, 1, 1);
488 if (s
->use_skip_mb_code
)
489 put_bits(&s
->pb
, 1, 0); /* mb coded */
491 if(s
->msmpeg4_version
<=2){
493 v2_mb_type
[cbp
&3][1],
494 v2_mb_type
[cbp
&3][0]);
495 if((cbp
&3) != 3) coded_cbp
= cbp
^ 0x3C;
499 cbpy_tab
[coded_cbp
>>2][1],
500 cbpy_tab
[coded_cbp
>>2][0]);
502 s
->misc_bits
+= get_bits_diff(s
);
504 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
505 msmpeg4v2_encode_motion(s
, motion_x
- pred_x
);
506 msmpeg4v2_encode_motion(s
, motion_y
- pred_y
);
509 table_mb_non_intra
[cbp
+ 64][1],
510 table_mb_non_intra
[cbp
+ 64][0]);
512 s
->misc_bits
+= get_bits_diff(s
);
515 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
516 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
520 s
->mv_bits
+= get_bits_diff(s
);
522 for (i
= 0; i
< 6; i
++) {
523 ff_msmpeg4_encode_block(s
, block
[i
], i
);
525 s
->p_tex_bits
+= get_bits_diff(s
);
530 for (i
= 0; i
< 6; i
++) {
532 val
= (s
->block_last_index
[i
] >= 1);
533 cbp
|= val
<< (5 - i
);
535 /* predict value for close blocks only for luma */
536 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
540 coded_cbp
|= val
<< (5 - i
);
544 printf("cbp=%x %x\n", cbp
, coded_cbp
);
547 if(s
->msmpeg4_version
<=2){
548 if (s
->pict_type
== FF_I_TYPE
) {
550 v2_intra_cbpc
[cbp
&3][1], v2_intra_cbpc
[cbp
&3][0]);
552 if (s
->use_skip_mb_code
)
553 put_bits(&s
->pb
, 1, 0); /* mb coded */
555 v2_mb_type
[(cbp
&3) + 4][1],
556 v2_mb_type
[(cbp
&3) + 4][0]);
558 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
561 cbpy_tab
[cbp
>>2][0]);
563 if (s
->pict_type
== FF_I_TYPE
) {
565 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
567 if (s
->use_skip_mb_code
)
568 put_bits(&s
->pb
, 1, 0); /* mb coded */
570 table_mb_non_intra
[cbp
][1],
571 table_mb_non_intra
[cbp
][0]);
573 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
574 if(s
->inter_intra_pred
){
576 put_bits(&s
->pb
, table_inter_intra
[s
->h263_aic_dir
][1], table_inter_intra
[s
->h263_aic_dir
][0]);
579 s
->misc_bits
+= get_bits_diff(s
);
581 for (i
= 0; i
< 6; i
++) {
582 ff_msmpeg4_encode_block(s
, block
[i
], i
);
584 s
->i_tex_bits
+= get_bits_diff(s
);
589 #endif //CONFIG_ENCODERS
591 static inline int msmpeg4v1_pred_dc(MpegEncContext
* s
, int n
,
592 int32_t **dc_val_ptr
)
602 *dc_val_ptr
= &s
->last_dc
[i
];
603 return s
->last_dc
[i
];
606 static int get_dc(uint8_t *src
, int stride
, int scale
)
613 sum
+=src
[x
+ y
*stride
];
616 return FASTDIV((sum
+ (scale
>>1)), scale
);
619 /* dir = 0: left, dir = 1: top prediction */
620 static inline int msmpeg4_pred_dc(MpegEncContext
* s
, int n
,
621 int16_t **dc_val_ptr
, int *dir_ptr
)
623 int a
, b
, c
, wrap
, pred
, scale
;
626 /* find prediction */
628 scale
= s
->y_dc_scale
;
630 scale
= s
->c_dc_scale
;
633 wrap
= s
->block_wrap
[n
];
634 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
640 b
= dc_val
[ - 1 - wrap
];
643 if(s
->first_slice_line
&& (n
&2)==0 && s
->msmpeg4_version
<4){
647 /* XXX: the following solution consumes divisions, but it does not
648 necessitate to modify mpegvideo.c. The problem comes from the
649 fact they decided to store the quantized DC (which would lead
650 to problems if Q could vary !) */
651 #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE
653 "movl %3, %%eax \n\t"
654 "shrl $1, %%eax \n\t"
655 "addl %%eax, %2 \n\t"
656 "addl %%eax, %1 \n\t"
657 "addl %0, %%eax \n\t"
659 "movl %%edx, %0 \n\t"
660 "movl %1, %%eax \n\t"
662 "movl %%edx, %1 \n\t"
663 "movl %2, %%eax \n\t"
665 "movl %%edx, %2 \n\t"
666 : "+b" (a
), "+c" (b
), "+D" (c
)
667 : "g" (scale
), "S" (ff_inverse
[scale
])
671 /* #elif ARCH_ALPHA */
672 /* Divisions are extremely costly on Alpha; optimize the most
673 common case. But they are costly everywhere...
676 a
= (a
+ (8 >> 1)) / 8;
677 b
= (b
+ (8 >> 1)) / 8;
678 c
= (c
+ (8 >> 1)) / 8;
680 a
= FASTDIV((a
+ (scale
>> 1)), scale
);
681 b
= FASTDIV((b
+ (scale
>> 1)), scale
);
682 c
= FASTDIV((c
+ (scale
>> 1)), scale
);
685 /* XXX: WARNING: they did not choose the same test as MPEG4. This
686 is very important ! */
687 if(s
->msmpeg4_version
>3){
688 if(s
->inter_intra_pred
){
699 if (abs(a
- b
) < abs(b
- c
)) {
709 dest
= s
->current_picture
.data
[0] + (((n
>>1) + 2*s
->mb_y
) * 8* wrap
) + ((n
&1) + 2*s
->mb_x
) * 8;
712 dest
= s
->current_picture
.data
[n
-3] + (s
->mb_y
* 8 * wrap
) + s
->mb_x
* 8;
714 if(s
->mb_x
==0) a
= (1024 + (scale
>>1))/scale
;
715 else a
= get_dc(dest
-8, wrap
, scale
*8);
716 if(s
->mb_y
==0) c
= (1024 + (scale
>>1))/scale
;
717 else c
= get_dc(dest
-8*wrap
, wrap
, scale
*8);
719 if (s
->h263_aic_dir
==0) {
722 }else if (s
->h263_aic_dir
==1) {
730 }else if (s
->h263_aic_dir
==2) {
744 if (abs(a
- b
) < abs(b
- c
)) {
753 if (abs(a
- b
) <= abs(b
- c
)) {
762 /* update predictor */
763 *dc_val_ptr
= &dc_val
[0];
769 static void msmpeg4_encode_dc(MpegEncContext
* s
, int level
, int n
, int *dir_ptr
)
775 if(s
->msmpeg4_version
==1){
777 pred
= msmpeg4v1_pred_dc(s
, n
, &dc_val
);
779 /* update predictor */
783 pred
= msmpeg4_pred_dc(s
, n
, &dc_val
, dir_ptr
);
785 /* update predictor */
787 *dc_val
= level
* s
->y_dc_scale
;
789 *dc_val
= level
* s
->c_dc_scale
;
793 /* do the prediction */
796 if(s
->msmpeg4_version
<=2){
799 v2_dc_lum_table
[level
+256][1],
800 v2_dc_lum_table
[level
+256][0]);
803 v2_dc_chroma_table
[level
+256][1],
804 v2_dc_chroma_table
[level
+256][0]);
815 else if( s
->msmpeg4_version
>=6 ) {
816 if( s
->qscale
== 1 ) {
817 extquant
= (level
+ 3) & 0x3;
818 code
= ((level
+3)>>2);
819 } else if( s
->qscale
== 2 ) {
820 extquant
= (level
+ 1) & 0x1;
821 code
= ((level
+1)>>1);
825 if (s
->dc_table_index
== 0) {
827 put_bits(&s
->pb
, ff_table0_dc_lum
[code
][1], ff_table0_dc_lum
[code
][0]);
829 put_bits(&s
->pb
, ff_table0_dc_chroma
[code
][1], ff_table0_dc_chroma
[code
][0]);
833 put_bits(&s
->pb
, ff_table1_dc_lum
[code
][1], ff_table1_dc_lum
[code
][0]);
835 put_bits(&s
->pb
, ff_table1_dc_chroma
[code
][1], ff_table1_dc_chroma
[code
][0]);
839 if(s
->msmpeg4_version
>=6 && s
->qscale
<=2)
840 extrabits
= 3 - s
->qscale
;
843 put_bits(&s
->pb
, 8 + extrabits
, level
);
844 else if(extrabits
> 0)//== VC1 && s->qscale<=2
845 put_bits(&s
->pb
, extrabits
, extquant
);
848 put_bits(&s
->pb
, 1, sign
);
853 /* Encoding of a block. Very similar to MPEG4 except for a different
854 escape coding (same as H263) and more vlc tables.
856 void ff_msmpeg4_encode_block(MpegEncContext
* s
, DCTELEM
* block
, int n
)
858 int level
, run
, last
, i
, j
, last_index
;
859 int last_non_zero
, sign
, slevel
;
860 int code
, run_diff
, dc_pred_dir
;
862 const uint8_t *scantable
;
865 msmpeg4_encode_dc(s
, block
[0], n
, &dc_pred_dir
);
868 rl
= &rl_table
[s
->rl_table_index
];
870 rl
= &rl_table
[3 + s
->rl_chroma_table_index
];
872 run_diff
= s
->msmpeg4_version
>=4;
873 scantable
= s
->intra_scantable
.permutated
;
876 rl
= &rl_table
[3 + s
->rl_table_index
];
877 if(s
->msmpeg4_version
<=2)
881 scantable
= s
->inter_scantable
.permutated
;
884 /* recalculate block_last_index for M$ wmv1 */
885 if(s
->msmpeg4_version
>=4 && s
->msmpeg4_version
<6 && s
->block_last_index
[n
]>0){
886 for(last_index
=63; last_index
>=0; last_index
--){
887 if(block
[scantable
[last_index
]]) break;
889 s
->block_last_index
[n
]= last_index
;
891 last_index
= s
->block_last_index
[n
];
893 last_non_zero
= i
- 1;
894 for (; i
<= last_index
; i
++) {
898 run
= i
- last_non_zero
- 1;
899 last
= (i
== last_index
);
907 if(level
<=MAX_LEVEL
&& run
<=MAX_RUN
){
908 s
->ac_stats
[s
->mb_intra
][n
>3][level
][run
][last
]++;
912 s
->ac_stats
[s
->mb_intra
][n
>3][40][63][0]++; //esc3 like
914 code
= get_rl_index(rl
, last
, run
, level
);
915 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
919 level1
= level
- rl
->max_level
[last
][run
];
922 code
= get_rl_index(rl
, last
, run
, level1
);
925 put_bits(&s
->pb
, 1, 0);
926 if (level
> MAX_LEVEL
)
928 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
931 code
= get_rl_index(rl
, last
, run1
+1, level
);
932 if (s
->msmpeg4_version
== 4 && code
== rl
->n
)
934 code
= get_rl_index(rl
, last
, run1
, level
);
938 put_bits(&s
->pb
, 1, 0);
939 put_bits(&s
->pb
, 1, last
);
940 if(s
->msmpeg4_version
>=4){
941 if(s
->esc3_level_length
==0){
942 s
->esc3_level_length
=8;
943 s
->esc3_run_length
= 6;
944 //ESCLVLSZ + ESCRUNSZ
946 put_bits(&s
->pb
, 6 + (s
->msmpeg4_version
>=6), 3);
948 put_bits(&s
->pb
, 8, 3);
950 put_bits(&s
->pb
, s
->esc3_run_length
, run
);
951 put_bits(&s
->pb
, 1, sign
);
952 put_bits(&s
->pb
, s
->esc3_level_length
, level
);
954 put_bits(&s
->pb
, 6, run
);
955 put_sbits(&s
->pb
, 8, slevel
);
959 put_bits(&s
->pb
, 1, 1);
960 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
961 put_bits(&s
->pb
, 1, sign
);
965 put_bits(&s
->pb
, 1, 1);
966 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
967 put_bits(&s
->pb
, 1, sign
);
970 put_bits(&s
->pb
, 1, sign
);
977 /****************************************/
980 VLC ff_mb_non_intra_vlc
[4];
981 static VLC v2_dc_lum_vlc
;
982 static VLC v2_dc_chroma_vlc
;
984 static VLC v2_intra_cbpc_vlc
;
985 static VLC v2_mb_type_vlc
;
986 static VLC v2_mv_vlc
;
987 static VLC v1_intra_cbpc_vlc
;
988 static VLC v1_inter_cbpc_vlc
;
989 VLC ff_inter_intra_vlc
;
991 /* This table is practically identical to the one from h263
992 * except that it is inverted. */
993 static av_cold
void init_h263_dc_for_msmpeg4(void)
995 int level
, uni_code
, uni_len
;
997 for(level
=-256; level
<256; level
++){
999 /* find number of bits */
1008 l
= (-level
) ^ ((1 << size
) - 1);
1012 /* luminance h263 */
1013 uni_code
= DCtab_lum
[size
][0];
1014 uni_len
= DCtab_lum
[size
][1];
1015 uni_code
^= (1<<uni_len
)-1; //M$ does not like compatibility
1018 uni_code
<<=size
; uni_code
|=l
;
1021 uni_code
<<=1; uni_code
|=1;
1025 v2_dc_lum_table
[level
+256][0]= uni_code
;
1026 v2_dc_lum_table
[level
+256][1]= uni_len
;
1028 /* chrominance h263 */
1029 uni_code
= DCtab_chrom
[size
][0];
1030 uni_len
= DCtab_chrom
[size
][1];
1031 uni_code
^= (1<<uni_len
)-1; //M$ does not like compatibility
1034 uni_code
<<=size
; uni_code
|=l
;
1037 uni_code
<<=1; uni_code
|=1;
1041 v2_dc_chroma_table
[level
+256][0]= uni_code
;
1042 v2_dc_chroma_table
[level
+256][1]= uni_len
;
1047 /* init all vlc decoding tables */
1048 av_cold
int ff_msmpeg4_decode_init(MpegEncContext
*s
)
1050 static int done
= 0;
1059 for(i
=0;i
<NB_RL_TABLES
;i
++) {
1060 init_rl(&rl_table
[i
], static_rl_table_store
[i
]);
1062 INIT_VLC_RL(rl_table
[0], 642);
1063 INIT_VLC_RL(rl_table
[1], 1104);
1064 INIT_VLC_RL(rl_table
[2], 554);
1065 INIT_VLC_RL(rl_table
[3], 940);
1066 INIT_VLC_RL(rl_table
[4], 962);
1067 INIT_VLC_RL(rl_table
[5], 554);
1070 INIT_VLC_STATIC(&mv
->vlc
, MV_VLC_BITS
, mv
->n
+ 1,
1071 mv
->table_mv_bits
, 1, 1,
1072 mv
->table_mv_code
, 2, 2, 3714);
1074 INIT_VLC_STATIC(&mv
->vlc
, MV_VLC_BITS
, mv
->n
+ 1,
1075 mv
->table_mv_bits
, 1, 1,
1076 mv
->table_mv_code
, 2, 2, 2694);
1078 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc
[0], DC_VLC_BITS
, 120,
1079 &ff_table0_dc_lum
[0][1], 8, 4,
1080 &ff_table0_dc_lum
[0][0], 8, 4, 1158);
1081 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc
[0], DC_VLC_BITS
, 120,
1082 &ff_table0_dc_chroma
[0][1], 8, 4,
1083 &ff_table0_dc_chroma
[0][0], 8, 4, 1118);
1084 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc
[1], DC_VLC_BITS
, 120,
1085 &ff_table1_dc_lum
[0][1], 8, 4,
1086 &ff_table1_dc_lum
[0][0], 8, 4, 1476);
1087 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc
[1], DC_VLC_BITS
, 120,
1088 &ff_table1_dc_chroma
[0][1], 8, 4,
1089 &ff_table1_dc_chroma
[0][0], 8, 4, 1216);
1091 INIT_VLC_STATIC(&v2_dc_lum_vlc
, DC_VLC_BITS
, 512,
1092 &v2_dc_lum_table
[0][1], 8, 4,
1093 &v2_dc_lum_table
[0][0], 8, 4, 1472);
1094 INIT_VLC_STATIC(&v2_dc_chroma_vlc
, DC_VLC_BITS
, 512,
1095 &v2_dc_chroma_table
[0][1], 8, 4,
1096 &v2_dc_chroma_table
[0][0], 8, 4, 1506);
1098 INIT_VLC_STATIC(&cbpy_vlc
, CBPY_VLC_BITS
, 16,
1099 &cbpy_tab
[0][1], 2, 1,
1100 &cbpy_tab
[0][0], 2, 1, 64);
1101 INIT_VLC_STATIC(&v2_intra_cbpc_vlc
, V2_INTRA_CBPC_VLC_BITS
, 4,
1102 &v2_intra_cbpc
[0][1], 2, 1,
1103 &v2_intra_cbpc
[0][0], 2, 1, 8);
1104 INIT_VLC_STATIC(&v2_mb_type_vlc
, V2_MB_TYPE_VLC_BITS
, 8,
1105 &v2_mb_type
[0][1], 2, 1,
1106 &v2_mb_type
[0][0], 2, 1, 128);
1107 INIT_VLC_STATIC(&v2_mv_vlc
, V2_MV_VLC_BITS
, 33,
1109 &mvtab
[0][0], 2, 1, 538);
1111 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[0], MB_NON_INTRA_VLC_BITS
, 128,
1112 &wmv2_inter_table
[0][0][1], 8, 4,
1113 &wmv2_inter_table
[0][0][0], 8, 4, 1636);
1114 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[1], MB_NON_INTRA_VLC_BITS
, 128,
1115 &wmv2_inter_table
[1][0][1], 8, 4,
1116 &wmv2_inter_table
[1][0][0], 8, 4, 2648);
1117 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[2], MB_NON_INTRA_VLC_BITS
, 128,
1118 &wmv2_inter_table
[2][0][1], 8, 4,
1119 &wmv2_inter_table
[2][0][0], 8, 4, 1532);
1120 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[3], MB_NON_INTRA_VLC_BITS
, 128,
1121 &wmv2_inter_table
[3][0][1], 8, 4,
1122 &wmv2_inter_table
[3][0][0], 8, 4, 2488);
1124 INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc
, MB_INTRA_VLC_BITS
, 64,
1125 &ff_msmp4_mb_i_table
[0][1], 4, 2,
1126 &ff_msmp4_mb_i_table
[0][0], 4, 2, 536);
1128 INIT_VLC_STATIC(&v1_intra_cbpc_vlc
, V1_INTRA_CBPC_VLC_BITS
, 8,
1129 intra_MCBPC_bits
, 1, 1,
1130 intra_MCBPC_code
, 1, 1, 64);
1131 INIT_VLC_STATIC(&v1_inter_cbpc_vlc
, V1_INTER_CBPC_VLC_BITS
, 25,
1132 inter_MCBPC_bits
, 1, 1,
1133 inter_MCBPC_code
, 1, 1, 104);
1135 INIT_VLC_STATIC(&ff_inter_intra_vlc
, INTER_INTRA_VLC_BITS
, 4,
1136 &table_inter_intra
[0][1], 2, 1,
1137 &table_inter_intra
[0][0], 2, 1, 8);
1140 switch(s
->msmpeg4_version
){
1143 s
->decode_mb
= msmpeg4v12_decode_mb
;
1147 s
->decode_mb
= msmpeg4v34_decode_mb
;
1150 if (CONFIG_WMV2_DECODER
)
1151 s
->decode_mb
= ff_wmv2_decode_mb
;
1153 //FIXME + TODO VC1 decode mb
1157 s
->slice_height
= s
->mb_height
; //to avoid 1/0 if the first frame is not a keyframe
1162 int msmpeg4_decode_picture_header(MpegEncContext
* s
)
1169 for(i
=0; i
<s
->gb
.size_in_bits
; i
++)
1170 av_log(s
->avctx
, AV_LOG_DEBUG
, "%d", get_bits1(&s
->gb
));
1171 // get_bits1(&s->gb);
1172 av_log(s
->avctx
, AV_LOG_DEBUG
, "END\n");
1177 if(s
->msmpeg4_version
==1){
1179 start_code
= (get_bits(&s
->gb
, 16)<<16) | get_bits(&s
->gb
, 16);
1180 if(start_code
!=0x00000100){
1181 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid startcode\n");
1185 skip_bits(&s
->gb
, 5); // frame number */
1188 s
->pict_type
= get_bits(&s
->gb
, 2) + 1;
1189 if (s
->pict_type
!= FF_I_TYPE
&&
1190 s
->pict_type
!= FF_P_TYPE
){
1191 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid picture type\n");
1197 if(s
->pict_type
== FF_I_TYPE
) had_i
=1;
1198 if(!had_i
) return -1;
1201 s
->chroma_qscale
= s
->qscale
= get_bits(&s
->gb
, 5);
1203 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid qscale\n");
1207 if (s
->pict_type
== FF_I_TYPE
) {
1208 code
= get_bits(&s
->gb
, 5);
1209 if(s
->msmpeg4_version
==1){
1210 if(code
==0 || code
>s
->mb_height
){
1211 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid slice height %d\n", code
);
1215 s
->slice_height
= code
;
1217 /* 0x17: one slice, 0x18: two slices, ... */
1219 av_log(s
->avctx
, AV_LOG_ERROR
, "error, slice code was %X\n", code
);
1223 s
->slice_height
= s
->mb_height
/ (code
- 0x16);
1226 switch(s
->msmpeg4_version
){
1229 s
->rl_chroma_table_index
= 2;
1230 s
->rl_table_index
= 2;
1232 s
->dc_table_index
= 0; //not used
1235 s
->rl_chroma_table_index
= decode012(&s
->gb
);
1236 s
->rl_table_index
= decode012(&s
->gb
);
1238 s
->dc_table_index
= get_bits1(&s
->gb
);
1241 msmpeg4_decode_ext_header(s
, (2+5+5+17+7)/8);
1243 if(s
->bit_rate
> MBAC_BITRATE
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
1244 else s
->per_mb_rl_table
= 0;
1246 if(!s
->per_mb_rl_table
){
1247 s
->rl_chroma_table_index
= decode012(&s
->gb
);
1248 s
->rl_table_index
= decode012(&s
->gb
);
1251 s
->dc_table_index
= get_bits1(&s
->gb
);
1252 s
->inter_intra_pred
= 0;
1256 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
)
1257 av_log(s
->avctx
, AV_LOG_DEBUG
, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1259 s
->rl_chroma_table_index
,
1265 switch(s
->msmpeg4_version
){
1268 if(s
->msmpeg4_version
==1)
1269 s
->use_skip_mb_code
= 1;
1271 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1272 s
->rl_table_index
= 2;
1273 s
->rl_chroma_table_index
= s
->rl_table_index
;
1274 s
->dc_table_index
= 0; //not used
1275 s
->mv_table_index
= 0;
1278 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1279 s
->rl_table_index
= decode012(&s
->gb
);
1280 s
->rl_chroma_table_index
= s
->rl_table_index
;
1282 s
->dc_table_index
= get_bits1(&s
->gb
);
1284 s
->mv_table_index
= get_bits1(&s
->gb
);
1287 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1289 if(s
->bit_rate
> MBAC_BITRATE
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
1290 else s
->per_mb_rl_table
= 0;
1292 if(!s
->per_mb_rl_table
){
1293 s
->rl_table_index
= decode012(&s
->gb
);
1294 s
->rl_chroma_table_index
= s
->rl_table_index
;
1297 s
->dc_table_index
= get_bits1(&s
->gb
);
1299 s
->mv_table_index
= get_bits1(&s
->gb
);
1300 s
->inter_intra_pred
= (s
->width
*s
->height
< 320*240 && s
->bit_rate
<=II_BITRATE
);
1304 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
)
1305 av_log(s
->avctx
, AV_LOG_DEBUG
, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1306 s
->use_skip_mb_code
,
1308 s
->rl_chroma_table_index
,
1314 if(s
->flipflop_rounding
){
1315 s
->no_rounding
^= 1;
1320 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
1322 s
->esc3_level_length
= 0;
1323 s
->esc3_run_length
= 0;
1328 int msmpeg4_decode_ext_header(MpegEncContext
* s
, int buf_size
)
1330 int left
= buf_size
*8 - get_bits_count(&s
->gb
);
1331 int length
= s
->msmpeg4_version
>=3 ? 17 : 16;
1332 /* the alt_bitstream reader could read over the end so we need to check it */
1333 if(left
>=length
&& left
<length
+8)
1337 fps
= get_bits(&s
->gb
, 5);
1338 s
->bit_rate
= get_bits(&s
->gb
, 11)*1024;
1339 if(s
->msmpeg4_version
>=3)
1340 s
->flipflop_rounding
= get_bits1(&s
->gb
);
1342 s
->flipflop_rounding
= 0;
1344 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
1346 else if(left
<length
+8)
1348 s
->flipflop_rounding
= 0;
1349 if(s
->msmpeg4_version
!= 2)
1350 av_log(s
->avctx
, AV_LOG_ERROR
, "ext header missing, %d left\n", left
);
1354 av_log(s
->avctx
, AV_LOG_ERROR
, "I frame too long, ignoring ext header\n");
1360 static inline void msmpeg4_memsetw(short *tab
, int val
, int n
)
1368 static void msmpeg4v2_encode_motion(MpegEncContext
* s
, int val
)
1370 int range
, bit_size
, sign
, code
, bits
;
1375 put_bits(&s
->pb
, mvtab
[code
][1], mvtab
[code
][0]);
1377 bit_size
= s
->f_code
- 1;
1378 range
= 1 << bit_size
;
1391 code
= (val
>> bit_size
) + 1;
1392 bits
= val
& (range
- 1);
1394 put_bits(&s
->pb
, mvtab
[code
][1] + 1, (mvtab
[code
][0] << 1) | sign
);
1396 put_bits(&s
->pb
, bit_size
, bits
);
1402 /* This is identical to h263 except that its range is multiplied by 2. */
1403 static int msmpeg4v2_decode_motion(MpegEncContext
* s
, int pred
, int f_code
)
1405 int code
, val
, sign
, shift
;
1407 code
= get_vlc2(&s
->gb
, v2_mv_vlc
.table
, V2_MV_VLC_BITS
, 2);
1408 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1414 sign
= get_bits1(&s
->gb
);
1418 val
= (val
- 1) << shift
;
1419 val
|= get_bits(&s
->gb
, shift
);
1434 static int msmpeg4v12_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1438 if (s
->pict_type
== FF_P_TYPE
) {
1439 if (s
->use_skip_mb_code
) {
1440 if (get_bits1(&s
->gb
)) {
1444 s
->block_last_index
[i
] = -1;
1445 s
->mv_dir
= MV_DIR_FORWARD
;
1446 s
->mv_type
= MV_TYPE_16X16
;
1454 if(s
->msmpeg4_version
==2)
1455 code
= get_vlc2(&s
->gb
, v2_mb_type_vlc
.table
, V2_MB_TYPE_VLC_BITS
, 1);
1457 code
= get_vlc2(&s
->gb
, v1_inter_cbpc_vlc
.table
, V1_INTER_CBPC_VLC_BITS
, 3);
1458 if(code
<0 || code
>7){
1459 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpc %d invalid at %d %d\n", code
, s
->mb_x
, s
->mb_y
);
1463 s
->mb_intra
= code
>>2;
1468 if(s
->msmpeg4_version
==2)
1469 cbp
= get_vlc2(&s
->gb
, v2_intra_cbpc_vlc
.table
, V2_INTRA_CBPC_VLC_BITS
, 1);
1471 cbp
= get_vlc2(&s
->gb
, v1_intra_cbpc_vlc
.table
, V1_INTRA_CBPC_VLC_BITS
, 1);
1473 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpc %d invalid at %d %d\n", cbp
, s
->mb_x
, s
->mb_y
);
1481 cbpy
= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1);
1483 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpy %d invalid at %d %d\n", cbp
, s
->mb_x
, s
->mb_y
);
1488 if(s
->msmpeg4_version
==1 || (cbp
&3) != 3) cbp
^= 0x3C;
1490 h263_pred_motion(s
, 0, 0, &mx
, &my
);
1491 mx
= msmpeg4v2_decode_motion(s
, mx
, 1);
1492 my
= msmpeg4v2_decode_motion(s
, my
, 1);
1494 s
->mv_dir
= MV_DIR_FORWARD
;
1495 s
->mv_type
= MV_TYPE_16X16
;
1496 s
->mv
[0][0][0] = mx
;
1497 s
->mv
[0][0][1] = my
;
1499 if(s
->msmpeg4_version
==2){
1500 s
->ac_pred
= get_bits1(&s
->gb
);
1501 cbp
|= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1)<<2; //FIXME check errors
1504 cbp
|= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1)<<2; //FIXME check errors
1505 if(s
->pict_type
==FF_P_TYPE
) cbp
^=0x3C;
1509 s
->dsp
.clear_blocks(s
->block
[0]);
1510 for (i
= 0; i
< 6; i
++) {
1511 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
1513 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
1520 static int msmpeg4v34_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1524 uint32_t * const mb_type_ptr
= &s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
];
1526 if (s
->pict_type
== FF_P_TYPE
) {
1527 if (s
->use_skip_mb_code
) {
1528 if (get_bits1(&s
->gb
)) {
1532 s
->block_last_index
[i
] = -1;
1533 s
->mv_dir
= MV_DIR_FORWARD
;
1534 s
->mv_type
= MV_TYPE_16X16
;
1538 *mb_type_ptr
= MB_TYPE_SKIP
| MB_TYPE_L0
| MB_TYPE_16x16
;
1544 code
= get_vlc2(&s
->gb
, ff_mb_non_intra_vlc
[DEFAULT_INTER_INDEX
].table
, MB_NON_INTRA_VLC_BITS
, 3);
1547 //s->mb_intra = (code & 0x40) ? 0 : 1;
1548 s
->mb_intra
= (~code
& 0x40) >> 6;
1553 code
= get_vlc2(&s
->gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
1556 /* predict coded block pattern */
1559 int val
= ((code
>> (5 - i
)) & 1);
1561 int pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_val
);
1565 cbp
|= val
<< (5 - i
);
1571 //printf("P at %d %d\n", s->mb_x, s->mb_y);
1572 if(s
->per_mb_rl_table
&& cbp
){
1573 s
->rl_table_index
= decode012(&s
->gb
);
1574 s
->rl_chroma_table_index
= s
->rl_table_index
;
1576 h263_pred_motion(s
, 0, 0, &mx
, &my
);
1577 if (ff_msmpeg4_decode_motion(s
, &mx
, &my
) < 0)
1579 s
->mv_dir
= MV_DIR_FORWARD
;
1580 s
->mv_type
= MV_TYPE_16X16
;
1581 s
->mv
[0][0][0] = mx
;
1582 s
->mv
[0][0][1] = my
;
1583 *mb_type_ptr
= MB_TYPE_L0
| MB_TYPE_16x16
;
1585 //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));
1586 s
->ac_pred
= get_bits1(&s
->gb
);
1587 *mb_type_ptr
= MB_TYPE_INTRA
;
1588 if(s
->inter_intra_pred
){
1589 s
->h263_aic_dir
= get_vlc2(&s
->gb
, ff_inter_intra_vlc
.table
, INTER_INTRA_VLC_BITS
, 1);
1590 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1592 if(s
->per_mb_rl_table
&& cbp
){
1593 s
->rl_table_index
= decode012(&s
->gb
);
1594 s
->rl_chroma_table_index
= s
->rl_table_index
;
1598 s
->dsp
.clear_blocks(s
->block
[0]);
1599 for (i
= 0; i
< 6; i
++) {
1600 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
1602 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
1609 //#define ERROR_DETAILS
1610 int ff_msmpeg4_decode_block(MpegEncContext
* s
, DCTELEM
* block
,
1611 int n
, int coded
, const uint8_t *scan_table
)
1613 int level
, i
, last
, run
, run_diff
;
1614 int av_uninit(dc_pred_dir
);
1616 RL_VLC_ELEM
*rl_vlc
;
1624 level
= msmpeg4_decode_dc(s
, n
, &dc_pred_dir
);
1627 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow- block: %d qscale: %d//\n", n
, s
->qscale
);
1628 if(s
->inter_intra_pred
) level
=0;
1632 rl
= &rl_table
[s
->rl_table_index
];
1633 if(level
> 256*s
->y_dc_scale
){
1634 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow+ L qscale: %d//\n", s
->qscale
);
1635 if(!s
->inter_intra_pred
) return -1;
1638 rl
= &rl_table
[3 + s
->rl_chroma_table_index
];
1639 if(level
> 256*s
->c_dc_scale
){
1640 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow+ C qscale: %d//\n", s
->qscale
);
1641 if(!s
->inter_intra_pred
) return -1;
1646 run_diff
= s
->msmpeg4_version
>= 4;
1652 if (dc_pred_dir
== 0)
1653 scan_table
= s
->intra_v_scantable
.permutated
; /* left */
1655 scan_table
= s
->intra_h_scantable
.permutated
; /* top */
1657 scan_table
= s
->intra_scantable
.permutated
;
1659 rl_vlc
= rl
->rl_vlc
[0];
1661 qmul
= s
->qscale
<< 1;
1662 qadd
= (s
->qscale
- 1) | 1;
1664 rl
= &rl_table
[3 + s
->rl_table_index
];
1666 if(s
->msmpeg4_version
==2)
1672 s
->block_last_index
[n
] = i
;
1676 scan_table
= s
->inter_scantable
.permutated
;
1677 rl_vlc
= rl
->rl_vlc
[s
->qscale
];
1680 OPEN_READER(re
, &s
->gb
);
1682 UPDATE_CACHE(re
, &s
->gb
);
1683 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 0);
1686 cache
= GET_CACHE(re
, &s
->gb
);
1688 if (s
->msmpeg4_version
==1 || (cache
&0x80000000)==0) {
1689 if (s
->msmpeg4_version
==1 || (cache
&0x40000000)==0) {
1691 if(s
->msmpeg4_version
!=1) LAST_SKIP_BITS(re
, &s
->gb
, 2);
1692 UPDATE_CACHE(re
, &s
->gb
);
1693 if(s
->msmpeg4_version
<=3){
1694 last
= SHOW_UBITS(re
, &s
->gb
, 1); SKIP_CACHE(re
, &s
->gb
, 1);
1695 run
= SHOW_UBITS(re
, &s
->gb
, 6); SKIP_CACHE(re
, &s
->gb
, 6);
1696 level
= SHOW_SBITS(re
, &s
->gb
, 8); LAST_SKIP_CACHE(re
, &s
->gb
, 8);
1697 SKIP_COUNTER(re
, &s
->gb
, 1+6+8);
1700 last
= SHOW_UBITS(re
, &s
->gb
, 1); SKIP_BITS(re
, &s
->gb
, 1);
1701 if(!s
->esc3_level_length
){
1703 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1705 ll
= SHOW_UBITS(re
, &s
->gb
, 3); SKIP_BITS(re
, &s
->gb
, 3);
1707 if(SHOW_UBITS(re
, &s
->gb
, 1)) av_log(s
->avctx
, AV_LOG_ERROR
, "cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1708 SKIP_BITS(re
, &s
->gb
, 1);
1713 while(ll
<8 && SHOW_UBITS(re
, &s
->gb
, 1)==0){
1715 SKIP_BITS(re
, &s
->gb
, 1);
1717 if(ll
<8) SKIP_BITS(re
, &s
->gb
, 1);
1720 s
->esc3_level_length
= ll
;
1721 s
->esc3_run_length
= SHOW_UBITS(re
, &s
->gb
, 2) + 3; SKIP_BITS(re
, &s
->gb
, 2);
1722 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
1723 UPDATE_CACHE(re
, &s
->gb
);
1725 run
= SHOW_UBITS(re
, &s
->gb
, s
->esc3_run_length
);
1726 SKIP_BITS(re
, &s
->gb
, s
->esc3_run_length
);
1728 sign
= SHOW_UBITS(re
, &s
->gb
, 1);
1729 SKIP_BITS(re
, &s
->gb
, 1);
1731 level
= SHOW_UBITS(re
, &s
->gb
, s
->esc3_level_length
);
1732 SKIP_BITS(re
, &s
->gb
, s
->esc3_level_length
);
1733 if(sign
) level
= -level
;
1735 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
1736 #if 0 // waste of time / this will detect very few errors
1738 const int abs_level
= FFABS(level
);
1739 const int run1
= run
- rl
->max_run
[last
][abs_level
] - run_diff
;
1740 if(abs_level
<=MAX_LEVEL
&& run
<=MAX_RUN
){
1741 if(abs_level
<= rl
->max_level
[last
][run
]){
1742 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, vlc encoding possible\n");
1743 return DECODING_AC_LOST
;
1745 if(abs_level
<= rl
->max_level
[last
][run
]*2){
1746 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, esc 1 encoding possible\n");
1747 return DECODING_AC_LOST
;
1749 if(run1
>=0 && abs_level
<= rl
->max_level
[last
][run1
]){
1750 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, esc 2 encoding possible\n");
1751 return DECODING_AC_LOST
;
1756 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1757 if (level
>0) level
= level
* qmul
+ qadd
;
1758 else level
= level
* qmul
- qadd
;
1759 #if 0 // waste of time too :(
1760 if(level
>2048 || level
<-2048){
1761 av_log(s
->avctx
, AV_LOG_ERROR
, "|level| overflow in 3. esc\n");
1762 return DECODING_AC_LOST
;
1767 #ifdef ERROR_DETAILS
1769 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC3 level=%d\n", level
);
1770 else if((i
>62 && i
<192) || i
>192+63)
1771 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC3 i=%d run=%d level=%d\n", i
, run
, level
);
1775 #if MIN_CACHE_BITS < 23
1776 LAST_SKIP_BITS(re
, &s
->gb
, 2);
1777 UPDATE_CACHE(re
, &s
->gb
);
1779 SKIP_BITS(re
, &s
->gb
, 2);
1781 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 1);
1782 i
+= run
+ rl
->max_run
[run
>>7][level
/qmul
] + run_diff
; //FIXME opt indexing
1783 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1784 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1785 #ifdef ERROR_DETAILS
1787 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC2 level=%d\n", level
);
1788 else if((i
>62 && i
<192) || i
>192+63)
1789 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC2 i=%d run=%d level=%d\n", i
, run
, level
);
1794 #if MIN_CACHE_BITS < 22
1795 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1796 UPDATE_CACHE(re
, &s
->gb
);
1798 SKIP_BITS(re
, &s
->gb
, 1);
1800 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 1);
1802 level
= level
+ rl
->max_level
[run
>>7][(run
-1)&63] * qmul
;//FIXME opt indexing
1803 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1804 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1805 #ifdef ERROR_DETAILS
1807 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC1 level=%d\n", level
);
1808 else if((i
>62 && i
<192) || i
>192+63)
1809 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC1 i=%d run=%d level=%d\n", i
, run
, level
);
1814 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1815 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1816 #ifdef ERROR_DETAILS
1818 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code level=%d\n", level
);
1819 else if((i
>62 && i
<192) || i
>192+63)
1820 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow i=%d run=%d level=%d\n", i
, run
, level
);
1826 const int left
= s
->gb
.size_in_bits
- get_bits_count(&s
->gb
);
1827 if(((i
+192 == 64 && level
/qmul
==-1) || s
->error_recognition
<=1) && left
>=0){
1828 av_log(s
->avctx
, AV_LOG_ERROR
, "ignoring overflow at %d %d\n", s
->mb_x
, s
->mb_y
);
1831 av_log(s
->avctx
, AV_LOG_ERROR
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1836 block
[scan_table
[i
]] = level
;
1840 block
[scan_table
[i
]] = level
;
1842 CLOSE_READER(re
, &s
->gb
);
1846 mpeg4_pred_ac(s
, block
, n
, dc_pred_dir
);
1848 i
= 63; /* XXX: not optimal */
1851 if(s
->msmpeg4_version
>=4 && i
>0) i
=63; //FIXME/XXX optimize
1852 s
->block_last_index
[n
] = i
;
1857 static int msmpeg4_decode_dc(MpegEncContext
* s
, int n
, int *dir_ptr
)
1861 if(s
->msmpeg4_version
<=2){
1863 level
= get_vlc2(&s
->gb
, v2_dc_lum_vlc
.table
, DC_VLC_BITS
, 3);
1865 level
= get_vlc2(&s
->gb
, v2_dc_chroma_vlc
.table
, DC_VLC_BITS
, 3);
1870 }else{ //FIXME optimize use unified tables & index
1872 level
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1874 level
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1877 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal dc vlc\n");
1881 if (level
== DC_MAX
) {
1882 level
= get_bits(&s
->gb
, 8);
1883 if (get_bits1(&s
->gb
))
1885 } else if (level
!= 0) {
1886 if (get_bits1(&s
->gb
))
1891 if(s
->msmpeg4_version
==1){
1893 pred
= msmpeg4v1_pred_dc(s
, n
, &dc_val
);
1896 /* update predictor */
1900 pred
= msmpeg4_pred_dc(s
, n
, &dc_val
, dir_ptr
);
1903 /* update predictor */
1905 *dc_val
= level
* s
->y_dc_scale
;
1907 *dc_val
= level
* s
->c_dc_scale
;
1914 int ff_msmpeg4_decode_motion(MpegEncContext
* s
,
1915 int *mx_ptr
, int *my_ptr
)
1920 mv
= &mv_tables
[s
->mv_table_index
];
1922 code
= get_vlc2(&s
->gb
, mv
->vlc
.table
, MV_VLC_BITS
, 2);
1924 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal MV code at %d %d\n", s
->mb_x
, s
->mb_y
);
1927 if (code
== mv
->n
) {
1928 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1929 mx
= get_bits(&s
->gb
, 6);
1930 my
= get_bits(&s
->gb
, 6);
1932 mx
= mv
->table_mvx
[code
];
1933 my
= mv
->table_mvy
[code
];
1938 /* WARNING : they do not do exactly modulo encoding */