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"
36 * You can also call this codec : MPEG4 with a twist !
39 * - (encoding) select best mv table (two choices)
40 * - (encoding) select best vlc/dc table
45 #define CBPY_VLC_BITS 6
46 #define V1_INTRA_CBPC_VLC_BITS 6
47 #define V1_INTER_CBPC_VLC_BITS 6
48 #define V2_INTRA_CBPC_VLC_BITS 3
49 #define V2_MB_TYPE_VLC_BITS 7
51 #define V2_MV_VLC_BITS 9
52 #define TEX_VLC_BITS 9
54 #define II_BITRATE 128*1024
55 #define MBAC_BITRATE 50*1024
57 #define DEFAULT_INTER_INDEX 3
59 static uint32_t v2_dc_lum_table
[512][2];
60 static uint32_t v2_dc_chroma_table
[512][2];
62 static int msmpeg4_decode_dc(MpegEncContext
* s
, int n
, int *dir_ptr
);
63 static void init_h263_dc_for_msmpeg4(void);
64 static inline void msmpeg4_memsetw(short *tab
, int val
, int n
);
66 static void msmpeg4v2_encode_motion(MpegEncContext
* s
, int val
);
67 static int get_size_of_code(MpegEncContext
* s
, RLTable
*rl
, int last
, int run
, int level
, int intra
);
68 #endif //CONFIG_ENCODERS
69 static int msmpeg4v12_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64]);
70 static int msmpeg4v34_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64]);
73 extern const uint8_t wmv3_dc_scale_table
[32];
79 #include "msmpeg4data.h"
81 #if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced
82 static uint8_t rl_length
[NB_RL_TABLES
][MAX_LEVEL
+1][MAX_RUN
+1][2];
83 #endif //CONFIG_ENCODERS
85 static uint8_t static_rl_table_store
[NB_RL_TABLES
][2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
87 static av_cold
void common_init(MpegEncContext
* s
)
89 static int initialized
=0;
91 switch(s
->msmpeg4_version
){
95 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
98 if(s
->workaround_bugs
){
99 s
->y_dc_scale_table
= old_ff_y_dc_scale_table
;
100 s
->c_dc_scale_table
= wmv1_c_dc_scale_table
;
102 s
->y_dc_scale_table
= ff_mpeg4_y_dc_scale_table
;
103 s
->c_dc_scale_table
= ff_mpeg4_c_dc_scale_table
;
108 s
->y_dc_scale_table
= wmv1_y_dc_scale_table
;
109 s
->c_dc_scale_table
= wmv1_c_dc_scale_table
;
111 #if CONFIG_VC1_DECODER
113 s
->y_dc_scale_table
= wmv3_dc_scale_table
;
114 s
->c_dc_scale_table
= wmv3_dc_scale_table
;
121 if(s
->msmpeg4_version
>=4){
122 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_scantable
, wmv1_scantable
[1]);
123 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_h_scantable
, wmv1_scantable
[2]);
124 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_v_scantable
, wmv1_scantable
[3]);
125 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->inter_scantable
, wmv1_scantable
[0]);
127 //Note the default tables are set in common_init in mpegvideo.c
132 init_h263_dc_for_msmpeg4();
138 /* build the table which associate a (x,y) motion vector to a vlc */
139 static void init_mv_table(MVTable
*tab
)
143 tab
->table_mv_index
= av_malloc(sizeof(uint16_t) * 4096);
144 /* mark all entries as not used */
146 tab
->table_mv_index
[i
] = tab
->n
;
148 for(i
=0;i
<tab
->n
;i
++) {
149 x
= tab
->table_mvx
[i
];
150 y
= tab
->table_mvy
[i
];
151 tab
->table_mv_index
[(x
<< 6) | y
] = i
;
155 void ff_msmpeg4_code012(PutBitContext
*pb
, int n
)
161 put_bits(pb
, 1, (n
>= 2));
165 av_cold
void ff_msmpeg4_encode_init(MpegEncContext
*s
)
167 static int init_done
=0;
171 if(s
->msmpeg4_version
>=4){
177 /* init various encoding tables */
179 init_mv_table(&mv_tables
[0]);
180 init_mv_table(&mv_tables
[1]);
181 for(i
=0;i
<NB_RL_TABLES
;i
++)
182 init_rl(&rl_table
[i
], static_rl_table_store
[i
]);
184 for(i
=0; i
<NB_RL_TABLES
; i
++){
186 for(level
=0; level
<=MAX_LEVEL
; level
++){
188 for(run
=0; run
<=MAX_RUN
; run
++){
190 for(last
=0; last
<2; last
++){
191 rl_length
[i
][level
][run
][last
]= get_size_of_code(s
, &rl_table
[ i
], last
, run
, level
, 0);
199 static int get_size_of_code(MpegEncContext
* s
, RLTable
*rl
, int last
, int run
, int level
, int intra
){
202 int run_diff
= intra
? 0 : 1;
204 code
= get_rl_index(rl
, last
, run
, level
);
205 size
+= rl
->table_vlc
[code
][1];
209 level1
= level
- rl
->max_level
[last
][run
];
212 code
= get_rl_index(rl
, last
, run
, level1
);
216 if (level
> MAX_LEVEL
)
218 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
221 code
= get_rl_index(rl
, last
, run1
, level
);
228 size
+= 1+1+ rl
->table_vlc
[code
][1];
232 size
+= 1+1+ rl
->table_vlc
[code
][1];
240 static void find_best_tables(MpegEncContext
* s
)
243 int best
=-1, best_size
=9999999;
244 int chroma_best
=-1, best_chroma_size
=9999999;
255 for(level
=0; level
<=MAX_LEVEL
; level
++){
257 for(run
=0; run
<=MAX_RUN
; run
++){
259 const int last_size
= size
+ chroma_size
;
260 for(last
=0; last
<2; last
++){
261 int inter_count
= s
->ac_stats
[0][0][level
][run
][last
] + s
->ac_stats
[0][1][level
][run
][last
];
262 int intra_luma_count
= s
->ac_stats
[1][0][level
][run
][last
];
263 int intra_chroma_count
= s
->ac_stats
[1][1][level
][run
][last
];
265 if(s
->pict_type
==FF_I_TYPE
){
266 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
];
267 chroma_size
+= intra_chroma_count
*rl_length
[i
+3][level
][run
][last
];
269 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
]
270 +intra_chroma_count
*rl_length
[i
+3][level
][run
][last
]
271 +inter_count
*rl_length
[i
+3][level
][run
][last
];
274 if(last_size
== size
+chroma_size
) break;
281 if(chroma_size
<best_chroma_size
){
282 best_chroma_size
= chroma_size
;
287 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
288 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
290 if(s
->pict_type
==FF_P_TYPE
) chroma_best
= best
;
292 memset(s
->ac_stats
, 0, sizeof(int)*(MAX_LEVEL
+1)*(MAX_RUN
+1)*2*2*2);
294 s
->rl_table_index
= best
;
295 s
->rl_chroma_table_index
= chroma_best
;
297 if(s
->pict_type
!= s
->last_non_b_pict_type
){
298 s
->rl_table_index
= 2;
299 if(s
->pict_type
==FF_I_TYPE
)
300 s
->rl_chroma_table_index
= 1;
302 s
->rl_chroma_table_index
= 2;
307 /* write MSMPEG4 compatible frame header */
308 void msmpeg4_encode_picture_header(MpegEncContext
* s
, int picture_number
)
312 align_put_bits(&s
->pb
);
313 put_bits(&s
->pb
, 2, s
->pict_type
- 1);
315 put_bits(&s
->pb
, 5, s
->qscale
);
316 if(s
->msmpeg4_version
<=2){
317 s
->rl_table_index
= 2;
318 s
->rl_chroma_table_index
= 2;
321 s
->dc_table_index
= 1;
322 s
->mv_table_index
= 1; /* only if P frame */
323 s
->use_skip_mb_code
= 1; /* only if P frame */
324 s
->per_mb_rl_table
= 0;
325 if(s
->msmpeg4_version
==4)
326 s
->inter_intra_pred
= (s
->width
*s
->height
< 320*240 && s
->bit_rate
<=II_BITRATE
&& s
->pict_type
==FF_P_TYPE
);
327 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
329 if (s
->pict_type
== FF_I_TYPE
) {
330 s
->slice_height
= s
->mb_height
/1;
331 put_bits(&s
->pb
, 5, 0x16 + s
->mb_height
/s
->slice_height
);
333 if(s
->msmpeg4_version
==4){
334 msmpeg4_encode_ext_header(s
);
335 if(s
->bit_rate
>MBAC_BITRATE
)
336 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
339 if(s
->msmpeg4_version
>2){
340 if(!s
->per_mb_rl_table
){
341 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
342 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
345 put_bits(&s
->pb
, 1, s
->dc_table_index
);
348 put_bits(&s
->pb
, 1, s
->use_skip_mb_code
);
350 if(s
->msmpeg4_version
==4 && s
->bit_rate
>MBAC_BITRATE
)
351 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
353 if(s
->msmpeg4_version
>2){
354 if(!s
->per_mb_rl_table
)
355 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
357 put_bits(&s
->pb
, 1, s
->dc_table_index
);
359 put_bits(&s
->pb
, 1, s
->mv_table_index
);
363 s
->esc3_level_length
= 0;
364 s
->esc3_run_length
= 0;
367 void msmpeg4_encode_ext_header(MpegEncContext
* s
)
369 put_bits(&s
->pb
, 5, s
->avctx
->time_base
.den
/ s
->avctx
->time_base
.num
); //yes 29.97 -> 29
371 put_bits(&s
->pb
, 11, FFMIN(s
->bit_rate
/1024, 2047));
373 if(s
->msmpeg4_version
>=3)
374 put_bits(&s
->pb
, 1, s
->flipflop_rounding
);
376 assert(s
->flipflop_rounding
==0);
379 #endif //CONFIG_ENCODERS
381 /* predict coded block */
382 int ff_msmpeg4_coded_block_pred(MpegEncContext
* s
, int n
, uint8_t **coded_block_ptr
)
384 int xy
, wrap
, pred
, a
, b
, c
;
386 xy
= s
->block_index
[n
];
392 a
= s
->coded_block
[xy
- 1 ];
393 b
= s
->coded_block
[xy
- 1 - wrap
];
394 c
= s
->coded_block
[xy
- wrap
];
403 *coded_block_ptr
= &s
->coded_block
[xy
];
410 void ff_msmpeg4_encode_motion(MpegEncContext
* s
,
416 /* modulo encoding */
417 /* WARNING : you cannot reach all the MVs even with the modulo
418 encoding. This is a somewhat strange compromise they took !!! */
431 if ((unsigned)mx
>= 64 ||
433 av_log(s
->avctx
, AV_LOG_ERROR
, "error mx=%d my=%d\n", mx
, my
);
435 mv
= &mv_tables
[s
->mv_table_index
];
437 code
= mv
->table_mv_index
[(mx
<< 6) | my
];
439 mv
->table_mv_bits
[code
],
440 mv
->table_mv_code
[code
]);
442 /* escape : code literally */
443 put_bits(&s
->pb
, 6, mx
);
444 put_bits(&s
->pb
, 6, my
);
448 void ff_msmpeg4_handle_slices(MpegEncContext
*s
){
450 if (s
->slice_height
&& (s
->mb_y
% s
->slice_height
) == 0) {
451 if(s
->msmpeg4_version
< 4){
452 ff_mpeg4_clean_buffers(s
);
454 s
->first_slice_line
= 1;
456 s
->first_slice_line
= 0;
461 void msmpeg4_encode_mb(MpegEncContext
* s
,
462 DCTELEM block
[6][64],
463 int motion_x
, int motion_y
)
465 int cbp
, coded_cbp
, i
;
467 uint8_t *coded_block
;
469 ff_msmpeg4_handle_slices(s
);
474 for (i
= 0; i
< 6; i
++) {
475 if (s
->block_last_index
[i
] >= 0)
478 if (s
->use_skip_mb_code
&& (cbp
| motion_x
| motion_y
) == 0) {
479 /* skip macroblock */
480 put_bits(&s
->pb
, 1, 1);
487 if (s
->use_skip_mb_code
)
488 put_bits(&s
->pb
, 1, 0); /* mb coded */
490 if(s
->msmpeg4_version
<=2){
492 v2_mb_type
[cbp
&3][1],
493 v2_mb_type
[cbp
&3][0]);
494 if((cbp
&3) != 3) coded_cbp
= cbp
^ 0x3C;
498 cbpy_tab
[coded_cbp
>>2][1],
499 cbpy_tab
[coded_cbp
>>2][0]);
501 s
->misc_bits
+= get_bits_diff(s
);
503 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
504 msmpeg4v2_encode_motion(s
, motion_x
- pred_x
);
505 msmpeg4v2_encode_motion(s
, motion_y
- pred_y
);
508 table_mb_non_intra
[cbp
+ 64][1],
509 table_mb_non_intra
[cbp
+ 64][0]);
511 s
->misc_bits
+= get_bits_diff(s
);
514 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
515 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
519 s
->mv_bits
+= get_bits_diff(s
);
521 for (i
= 0; i
< 6; i
++) {
522 ff_msmpeg4_encode_block(s
, block
[i
], i
);
524 s
->p_tex_bits
+= get_bits_diff(s
);
529 for (i
= 0; i
< 6; i
++) {
531 val
= (s
->block_last_index
[i
] >= 1);
532 cbp
|= val
<< (5 - i
);
534 /* predict value for close blocks only for luma */
535 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
539 coded_cbp
|= val
<< (5 - i
);
543 printf("cbp=%x %x\n", cbp
, coded_cbp
);
546 if(s
->msmpeg4_version
<=2){
547 if (s
->pict_type
== FF_I_TYPE
) {
549 v2_intra_cbpc
[cbp
&3][1], v2_intra_cbpc
[cbp
&3][0]);
551 if (s
->use_skip_mb_code
)
552 put_bits(&s
->pb
, 1, 0); /* mb coded */
554 v2_mb_type
[(cbp
&3) + 4][1],
555 v2_mb_type
[(cbp
&3) + 4][0]);
557 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
560 cbpy_tab
[cbp
>>2][0]);
562 if (s
->pict_type
== FF_I_TYPE
) {
564 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
566 if (s
->use_skip_mb_code
)
567 put_bits(&s
->pb
, 1, 0); /* mb coded */
569 table_mb_non_intra
[cbp
][1],
570 table_mb_non_intra
[cbp
][0]);
572 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
573 if(s
->inter_intra_pred
){
575 put_bits(&s
->pb
, table_inter_intra
[s
->h263_aic_dir
][1], table_inter_intra
[s
->h263_aic_dir
][0]);
578 s
->misc_bits
+= get_bits_diff(s
);
580 for (i
= 0; i
< 6; i
++) {
581 ff_msmpeg4_encode_block(s
, block
[i
], i
);
583 s
->i_tex_bits
+= get_bits_diff(s
);
588 #endif //CONFIG_ENCODERS
590 static inline int msmpeg4v1_pred_dc(MpegEncContext
* s
, int n
,
591 int32_t **dc_val_ptr
)
601 *dc_val_ptr
= &s
->last_dc
[i
];
602 return s
->last_dc
[i
];
605 static int get_dc(uint8_t *src
, int stride
, int scale
)
612 sum
+=src
[x
+ y
*stride
];
615 return FASTDIV((sum
+ (scale
>>1)), scale
);
618 /* dir = 0: left, dir = 1: top prediction */
619 static inline int msmpeg4_pred_dc(MpegEncContext
* s
, int n
,
620 int16_t **dc_val_ptr
, int *dir_ptr
)
622 int a
, b
, c
, wrap
, pred
, scale
;
625 /* find prediction */
627 scale
= s
->y_dc_scale
;
629 scale
= s
->c_dc_scale
;
632 wrap
= s
->block_wrap
[n
];
633 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
639 b
= dc_val
[ - 1 - wrap
];
642 if(s
->first_slice_line
&& (n
&2)==0 && s
->msmpeg4_version
<4){
646 /* XXX: the following solution consumes divisions, but it does not
647 necessitate to modify mpegvideo.c. The problem comes from the
648 fact they decided to store the quantized DC (which would lead
649 to problems if Q could vary !) */
650 #if ARCH_X86 && !defined PIC
652 "movl %3, %%eax \n\t"
653 "shrl $1, %%eax \n\t"
654 "addl %%eax, %2 \n\t"
655 "addl %%eax, %1 \n\t"
656 "addl %0, %%eax \n\t"
658 "movl %%edx, %0 \n\t"
659 "movl %1, %%eax \n\t"
661 "movl %%edx, %1 \n\t"
662 "movl %2, %%eax \n\t"
664 "movl %%edx, %2 \n\t"
665 : "+b" (a
), "+c" (b
), "+D" (c
)
666 : "g" (scale
), "S" (ff_inverse
[scale
])
670 /* #elif ARCH_ALPHA */
671 /* Divisions are extremely costly on Alpha; optimize the most
672 common case. But they are costly everywhere...
675 a
= (a
+ (8 >> 1)) / 8;
676 b
= (b
+ (8 >> 1)) / 8;
677 c
= (c
+ (8 >> 1)) / 8;
679 a
= FASTDIV((a
+ (scale
>> 1)), scale
);
680 b
= FASTDIV((b
+ (scale
>> 1)), scale
);
681 c
= FASTDIV((c
+ (scale
>> 1)), scale
);
684 /* XXX: WARNING: they did not choose the same test as MPEG4. This
685 is very important ! */
686 if(s
->msmpeg4_version
>3){
687 if(s
->inter_intra_pred
){
698 if (abs(a
- b
) < abs(b
- c
)) {
708 dest
= s
->current_picture
.data
[0] + (((n
>>1) + 2*s
->mb_y
) * 8* wrap
) + ((n
&1) + 2*s
->mb_x
) * 8;
711 dest
= s
->current_picture
.data
[n
-3] + (s
->mb_y
* 8 * wrap
) + s
->mb_x
* 8;
713 if(s
->mb_x
==0) a
= (1024 + (scale
>>1))/scale
;
714 else a
= get_dc(dest
-8, wrap
, scale
*8);
715 if(s
->mb_y
==0) c
= (1024 + (scale
>>1))/scale
;
716 else c
= get_dc(dest
-8*wrap
, wrap
, scale
*8);
718 if (s
->h263_aic_dir
==0) {
721 }else if (s
->h263_aic_dir
==1) {
729 }else if (s
->h263_aic_dir
==2) {
743 if (abs(a
- b
) < abs(b
- c
)) {
752 if (abs(a
- b
) <= abs(b
- c
)) {
761 /* update predictor */
762 *dc_val_ptr
= &dc_val
[0];
768 static void msmpeg4_encode_dc(MpegEncContext
* s
, int level
, int n
, int *dir_ptr
)
774 if(s
->msmpeg4_version
==1){
776 pred
= msmpeg4v1_pred_dc(s
, n
, &dc_val
);
778 /* update predictor */
782 pred
= msmpeg4_pred_dc(s
, n
, &dc_val
, dir_ptr
);
784 /* update predictor */
786 *dc_val
= level
* s
->y_dc_scale
;
788 *dc_val
= level
* s
->c_dc_scale
;
792 /* do the prediction */
795 if(s
->msmpeg4_version
<=2){
798 v2_dc_lum_table
[level
+256][1],
799 v2_dc_lum_table
[level
+256][0]);
802 v2_dc_chroma_table
[level
+256][1],
803 v2_dc_chroma_table
[level
+256][0]);
814 else if( s
->msmpeg4_version
>=6 ) {
815 if( s
->qscale
== 1 ) {
816 extquant
= (level
+ 3) & 0x3;
817 code
= ((level
+3)>>2);
818 } else if( s
->qscale
== 2 ) {
819 extquant
= (level
+ 1) & 0x1;
820 code
= ((level
+1)>>1);
824 if (s
->dc_table_index
== 0) {
826 put_bits(&s
->pb
, ff_table0_dc_lum
[code
][1], ff_table0_dc_lum
[code
][0]);
828 put_bits(&s
->pb
, ff_table0_dc_chroma
[code
][1], ff_table0_dc_chroma
[code
][0]);
832 put_bits(&s
->pb
, ff_table1_dc_lum
[code
][1], ff_table1_dc_lum
[code
][0]);
834 put_bits(&s
->pb
, ff_table1_dc_chroma
[code
][1], ff_table1_dc_chroma
[code
][0]);
838 if(s
->msmpeg4_version
>=6 && s
->qscale
<=2)
839 extrabits
= 3 - s
->qscale
;
842 put_bits(&s
->pb
, 8 + extrabits
, level
);
843 else if(extrabits
> 0)//== VC1 && s->qscale<=2
844 put_bits(&s
->pb
, extrabits
, extquant
);
847 put_bits(&s
->pb
, 1, sign
);
852 /* Encoding of a block. Very similar to MPEG4 except for a different
853 escape coding (same as H263) and more vlc tables.
855 void ff_msmpeg4_encode_block(MpegEncContext
* s
, DCTELEM
* block
, int n
)
857 int level
, run
, last
, i
, j
, last_index
;
858 int last_non_zero
, sign
, slevel
;
859 int code
, run_diff
, dc_pred_dir
;
861 const uint8_t *scantable
;
864 msmpeg4_encode_dc(s
, block
[0], n
, &dc_pred_dir
);
867 rl
= &rl_table
[s
->rl_table_index
];
869 rl
= &rl_table
[3 + s
->rl_chroma_table_index
];
871 run_diff
= s
->msmpeg4_version
>=4;
872 scantable
= s
->intra_scantable
.permutated
;
875 rl
= &rl_table
[3 + s
->rl_table_index
];
876 if(s
->msmpeg4_version
<=2)
880 scantable
= s
->inter_scantable
.permutated
;
883 /* recalculate block_last_index for M$ wmv1 */
884 if(s
->msmpeg4_version
>=4 && s
->msmpeg4_version
<6 && s
->block_last_index
[n
]>0){
885 for(last_index
=63; last_index
>=0; last_index
--){
886 if(block
[scantable
[last_index
]]) break;
888 s
->block_last_index
[n
]= last_index
;
890 last_index
= s
->block_last_index
[n
];
892 last_non_zero
= i
- 1;
893 for (; i
<= last_index
; i
++) {
897 run
= i
- last_non_zero
- 1;
898 last
= (i
== last_index
);
906 if(level
<=MAX_LEVEL
&& run
<=MAX_RUN
){
907 s
->ac_stats
[s
->mb_intra
][n
>3][level
][run
][last
]++;
911 s
->ac_stats
[s
->mb_intra
][n
>3][40][63][0]++; //esc3 like
913 code
= get_rl_index(rl
, last
, run
, level
);
914 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
918 level1
= level
- rl
->max_level
[last
][run
];
921 code
= get_rl_index(rl
, last
, run
, level1
);
924 put_bits(&s
->pb
, 1, 0);
925 if (level
> MAX_LEVEL
)
927 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
930 code
= get_rl_index(rl
, last
, run1
+1, level
);
931 if (s
->msmpeg4_version
== 4 && code
== rl
->n
)
933 code
= get_rl_index(rl
, last
, run1
, level
);
937 put_bits(&s
->pb
, 1, 0);
938 put_bits(&s
->pb
, 1, last
);
939 if(s
->msmpeg4_version
>=4){
940 if(s
->esc3_level_length
==0){
941 s
->esc3_level_length
=8;
942 s
->esc3_run_length
= 6;
943 //ESCLVLSZ + ESCRUNSZ
945 put_bits(&s
->pb
, 6 + (s
->msmpeg4_version
>=6), 3);
947 put_bits(&s
->pb
, 8, 3);
949 put_bits(&s
->pb
, s
->esc3_run_length
, run
);
950 put_bits(&s
->pb
, 1, sign
);
951 put_bits(&s
->pb
, s
->esc3_level_length
, level
);
953 put_bits(&s
->pb
, 6, run
);
954 put_sbits(&s
->pb
, 8, slevel
);
958 put_bits(&s
->pb
, 1, 1);
959 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
960 put_bits(&s
->pb
, 1, sign
);
964 put_bits(&s
->pb
, 1, 1);
965 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
966 put_bits(&s
->pb
, 1, sign
);
969 put_bits(&s
->pb
, 1, sign
);
976 /****************************************/
979 VLC ff_mb_non_intra_vlc
[4];
980 static VLC v2_dc_lum_vlc
;
981 static VLC v2_dc_chroma_vlc
;
983 static VLC v2_intra_cbpc_vlc
;
984 static VLC v2_mb_type_vlc
;
985 static VLC v2_mv_vlc
;
986 static VLC v1_intra_cbpc_vlc
;
987 static VLC v1_inter_cbpc_vlc
;
988 VLC ff_inter_intra_vlc
;
990 /* This table is practically identical to the one from h263
991 * except that it is inverted. */
992 static av_cold
void init_h263_dc_for_msmpeg4(void)
994 int level
, uni_code
, uni_len
;
996 for(level
=-256; level
<256; level
++){
998 /* find number of bits */
1007 l
= (-level
) ^ ((1 << size
) - 1);
1011 /* luminance h263 */
1012 uni_code
= DCtab_lum
[size
][0];
1013 uni_len
= DCtab_lum
[size
][1];
1014 uni_code
^= (1<<uni_len
)-1; //M$ does not like compatibility
1017 uni_code
<<=size
; uni_code
|=l
;
1020 uni_code
<<=1; uni_code
|=1;
1024 v2_dc_lum_table
[level
+256][0]= uni_code
;
1025 v2_dc_lum_table
[level
+256][1]= uni_len
;
1027 /* chrominance h263 */
1028 uni_code
= DCtab_chrom
[size
][0];
1029 uni_len
= DCtab_chrom
[size
][1];
1030 uni_code
^= (1<<uni_len
)-1; //M$ does not like compatibility
1033 uni_code
<<=size
; uni_code
|=l
;
1036 uni_code
<<=1; uni_code
|=1;
1040 v2_dc_chroma_table
[level
+256][0]= uni_code
;
1041 v2_dc_chroma_table
[level
+256][1]= uni_len
;
1046 /* init all vlc decoding tables */
1047 av_cold
int ff_msmpeg4_decode_init(MpegEncContext
*s
)
1049 static int done
= 0;
1058 for(i
=0;i
<NB_RL_TABLES
;i
++) {
1059 init_rl(&rl_table
[i
], static_rl_table_store
[i
]);
1061 INIT_VLC_RL(rl_table
[0], 642);
1062 INIT_VLC_RL(rl_table
[1], 1104);
1063 INIT_VLC_RL(rl_table
[2], 554);
1064 INIT_VLC_RL(rl_table
[3], 940);
1065 INIT_VLC_RL(rl_table
[4], 962);
1066 INIT_VLC_RL(rl_table
[5], 554);
1069 INIT_VLC_STATIC(&mv
->vlc
, MV_VLC_BITS
, mv
->n
+ 1,
1070 mv
->table_mv_bits
, 1, 1,
1071 mv
->table_mv_code
, 2, 2, 3714);
1073 INIT_VLC_STATIC(&mv
->vlc
, MV_VLC_BITS
, mv
->n
+ 1,
1074 mv
->table_mv_bits
, 1, 1,
1075 mv
->table_mv_code
, 2, 2, 2694);
1077 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc
[0], DC_VLC_BITS
, 120,
1078 &ff_table0_dc_lum
[0][1], 8, 4,
1079 &ff_table0_dc_lum
[0][0], 8, 4, 1158);
1080 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc
[0], DC_VLC_BITS
, 120,
1081 &ff_table0_dc_chroma
[0][1], 8, 4,
1082 &ff_table0_dc_chroma
[0][0], 8, 4, 1118);
1083 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc
[1], DC_VLC_BITS
, 120,
1084 &ff_table1_dc_lum
[0][1], 8, 4,
1085 &ff_table1_dc_lum
[0][0], 8, 4, 1476);
1086 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc
[1], DC_VLC_BITS
, 120,
1087 &ff_table1_dc_chroma
[0][1], 8, 4,
1088 &ff_table1_dc_chroma
[0][0], 8, 4, 1216);
1090 INIT_VLC_STATIC(&v2_dc_lum_vlc
, DC_VLC_BITS
, 512,
1091 &v2_dc_lum_table
[0][1], 8, 4,
1092 &v2_dc_lum_table
[0][0], 8, 4, 1472);
1093 INIT_VLC_STATIC(&v2_dc_chroma_vlc
, DC_VLC_BITS
, 512,
1094 &v2_dc_chroma_table
[0][1], 8, 4,
1095 &v2_dc_chroma_table
[0][0], 8, 4, 1506);
1097 INIT_VLC_STATIC(&cbpy_vlc
, CBPY_VLC_BITS
, 16,
1098 &cbpy_tab
[0][1], 2, 1,
1099 &cbpy_tab
[0][0], 2, 1, 64);
1100 INIT_VLC_STATIC(&v2_intra_cbpc_vlc
, V2_INTRA_CBPC_VLC_BITS
, 4,
1101 &v2_intra_cbpc
[0][1], 2, 1,
1102 &v2_intra_cbpc
[0][0], 2, 1, 8);
1103 INIT_VLC_STATIC(&v2_mb_type_vlc
, V2_MB_TYPE_VLC_BITS
, 8,
1104 &v2_mb_type
[0][1], 2, 1,
1105 &v2_mb_type
[0][0], 2, 1, 128);
1106 INIT_VLC_STATIC(&v2_mv_vlc
, V2_MV_VLC_BITS
, 33,
1108 &mvtab
[0][0], 2, 1, 538);
1110 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[0], MB_NON_INTRA_VLC_BITS
, 128,
1111 &wmv2_inter_table
[0][0][1], 8, 4,
1112 &wmv2_inter_table
[0][0][0], 8, 4, 1636);
1113 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[1], MB_NON_INTRA_VLC_BITS
, 128,
1114 &wmv2_inter_table
[1][0][1], 8, 4,
1115 &wmv2_inter_table
[1][0][0], 8, 4, 2648);
1116 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[2], MB_NON_INTRA_VLC_BITS
, 128,
1117 &wmv2_inter_table
[2][0][1], 8, 4,
1118 &wmv2_inter_table
[2][0][0], 8, 4, 1532);
1119 INIT_VLC_STATIC(&ff_mb_non_intra_vlc
[3], MB_NON_INTRA_VLC_BITS
, 128,
1120 &wmv2_inter_table
[3][0][1], 8, 4,
1121 &wmv2_inter_table
[3][0][0], 8, 4, 2488);
1123 INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc
, MB_INTRA_VLC_BITS
, 64,
1124 &ff_msmp4_mb_i_table
[0][1], 4, 2,
1125 &ff_msmp4_mb_i_table
[0][0], 4, 2, 536);
1127 INIT_VLC_STATIC(&v1_intra_cbpc_vlc
, V1_INTRA_CBPC_VLC_BITS
, 8,
1128 intra_MCBPC_bits
, 1, 1,
1129 intra_MCBPC_code
, 1, 1, 64);
1130 INIT_VLC_STATIC(&v1_inter_cbpc_vlc
, V1_INTER_CBPC_VLC_BITS
, 25,
1131 inter_MCBPC_bits
, 1, 1,
1132 inter_MCBPC_code
, 1, 1, 104);
1134 INIT_VLC_STATIC(&ff_inter_intra_vlc
, INTER_INTRA_VLC_BITS
, 4,
1135 &table_inter_intra
[0][1], 2, 1,
1136 &table_inter_intra
[0][0], 2, 1, 8);
1139 switch(s
->msmpeg4_version
){
1142 s
->decode_mb
= msmpeg4v12_decode_mb
;
1146 s
->decode_mb
= msmpeg4v34_decode_mb
;
1149 if (CONFIG_WMV2_DECODER
)
1150 s
->decode_mb
= ff_wmv2_decode_mb
;
1152 //FIXME + TODO VC1 decode mb
1156 s
->slice_height
= s
->mb_height
; //to avoid 1/0 if the first frame is not a keyframe
1161 int msmpeg4_decode_picture_header(MpegEncContext
* s
)
1168 for(i
=0; i
<s
->gb
.size_in_bits
; i
++)
1169 av_log(s
->avctx
, AV_LOG_DEBUG
, "%d", get_bits1(&s
->gb
));
1170 // get_bits1(&s->gb);
1171 av_log(s
->avctx
, AV_LOG_DEBUG
, "END\n");
1176 if(s
->msmpeg4_version
==1){
1178 start_code
= (get_bits(&s
->gb
, 16)<<16) | get_bits(&s
->gb
, 16);
1179 if(start_code
!=0x00000100){
1180 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid startcode\n");
1184 skip_bits(&s
->gb
, 5); // frame number */
1187 s
->pict_type
= get_bits(&s
->gb
, 2) + 1;
1188 if (s
->pict_type
!= FF_I_TYPE
&&
1189 s
->pict_type
!= FF_P_TYPE
){
1190 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid picture type\n");
1196 if(s
->pict_type
== FF_I_TYPE
) had_i
=1;
1197 if(!had_i
) return -1;
1200 s
->chroma_qscale
= s
->qscale
= get_bits(&s
->gb
, 5);
1202 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid qscale\n");
1206 if (s
->pict_type
== FF_I_TYPE
) {
1207 code
= get_bits(&s
->gb
, 5);
1208 if(s
->msmpeg4_version
==1){
1209 if(code
==0 || code
>s
->mb_height
){
1210 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid slice height %d\n", code
);
1214 s
->slice_height
= code
;
1216 /* 0x17: one slice, 0x18: two slices, ... */
1218 av_log(s
->avctx
, AV_LOG_ERROR
, "error, slice code was %X\n", code
);
1222 s
->slice_height
= s
->mb_height
/ (code
- 0x16);
1225 switch(s
->msmpeg4_version
){
1228 s
->rl_chroma_table_index
= 2;
1229 s
->rl_table_index
= 2;
1231 s
->dc_table_index
= 0; //not used
1234 s
->rl_chroma_table_index
= decode012(&s
->gb
);
1235 s
->rl_table_index
= decode012(&s
->gb
);
1237 s
->dc_table_index
= get_bits1(&s
->gb
);
1240 msmpeg4_decode_ext_header(s
, (2+5+5+17+7)/8);
1242 if(s
->bit_rate
> MBAC_BITRATE
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
1243 else s
->per_mb_rl_table
= 0;
1245 if(!s
->per_mb_rl_table
){
1246 s
->rl_chroma_table_index
= decode012(&s
->gb
);
1247 s
->rl_table_index
= decode012(&s
->gb
);
1250 s
->dc_table_index
= get_bits1(&s
->gb
);
1251 s
->inter_intra_pred
= 0;
1255 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
)
1256 av_log(s
->avctx
, AV_LOG_DEBUG
, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1258 s
->rl_chroma_table_index
,
1264 switch(s
->msmpeg4_version
){
1267 if(s
->msmpeg4_version
==1)
1268 s
->use_skip_mb_code
= 1;
1270 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1271 s
->rl_table_index
= 2;
1272 s
->rl_chroma_table_index
= s
->rl_table_index
;
1273 s
->dc_table_index
= 0; //not used
1274 s
->mv_table_index
= 0;
1277 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1278 s
->rl_table_index
= decode012(&s
->gb
);
1279 s
->rl_chroma_table_index
= s
->rl_table_index
;
1281 s
->dc_table_index
= get_bits1(&s
->gb
);
1283 s
->mv_table_index
= get_bits1(&s
->gb
);
1286 s
->use_skip_mb_code
= get_bits1(&s
->gb
);
1288 if(s
->bit_rate
> MBAC_BITRATE
) s
->per_mb_rl_table
= get_bits1(&s
->gb
);
1289 else s
->per_mb_rl_table
= 0;
1291 if(!s
->per_mb_rl_table
){
1292 s
->rl_table_index
= decode012(&s
->gb
);
1293 s
->rl_chroma_table_index
= s
->rl_table_index
;
1296 s
->dc_table_index
= get_bits1(&s
->gb
);
1298 s
->mv_table_index
= get_bits1(&s
->gb
);
1299 s
->inter_intra_pred
= (s
->width
*s
->height
< 320*240 && s
->bit_rate
<=II_BITRATE
);
1303 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
)
1304 av_log(s
->avctx
, AV_LOG_DEBUG
, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1305 s
->use_skip_mb_code
,
1307 s
->rl_chroma_table_index
,
1313 if(s
->flipflop_rounding
){
1314 s
->no_rounding
^= 1;
1319 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
1321 s
->esc3_level_length
= 0;
1322 s
->esc3_run_length
= 0;
1327 int msmpeg4_decode_ext_header(MpegEncContext
* s
, int buf_size
)
1329 int left
= buf_size
*8 - get_bits_count(&s
->gb
);
1330 int length
= s
->msmpeg4_version
>=3 ? 17 : 16;
1331 /* the alt_bitstream reader could read over the end so we need to check it */
1332 if(left
>=length
&& left
<length
+8)
1336 fps
= get_bits(&s
->gb
, 5);
1337 s
->bit_rate
= get_bits(&s
->gb
, 11)*1024;
1338 if(s
->msmpeg4_version
>=3)
1339 s
->flipflop_rounding
= get_bits1(&s
->gb
);
1341 s
->flipflop_rounding
= 0;
1343 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
1345 else if(left
<length
+8)
1347 s
->flipflop_rounding
= 0;
1348 if(s
->msmpeg4_version
!= 2)
1349 av_log(s
->avctx
, AV_LOG_ERROR
, "ext header missing, %d left\n", left
);
1353 av_log(s
->avctx
, AV_LOG_ERROR
, "I frame too long, ignoring ext header\n");
1359 static inline void msmpeg4_memsetw(short *tab
, int val
, int n
)
1367 static void msmpeg4v2_encode_motion(MpegEncContext
* s
, int val
)
1369 int range
, bit_size
, sign
, code
, bits
;
1374 put_bits(&s
->pb
, mvtab
[code
][1], mvtab
[code
][0]);
1376 bit_size
= s
->f_code
- 1;
1377 range
= 1 << bit_size
;
1390 code
= (val
>> bit_size
) + 1;
1391 bits
= val
& (range
- 1);
1393 put_bits(&s
->pb
, mvtab
[code
][1] + 1, (mvtab
[code
][0] << 1) | sign
);
1395 put_bits(&s
->pb
, bit_size
, bits
);
1401 /* This is identical to h263 except that its range is multiplied by 2. */
1402 static int msmpeg4v2_decode_motion(MpegEncContext
* s
, int pred
, int f_code
)
1404 int code
, val
, sign
, shift
;
1406 code
= get_vlc2(&s
->gb
, v2_mv_vlc
.table
, V2_MV_VLC_BITS
, 2);
1407 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1413 sign
= get_bits1(&s
->gb
);
1417 val
= (val
- 1) << shift
;
1418 val
|= get_bits(&s
->gb
, shift
);
1433 static int msmpeg4v12_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1437 if (s
->pict_type
== FF_P_TYPE
) {
1438 if (s
->use_skip_mb_code
) {
1439 if (get_bits1(&s
->gb
)) {
1443 s
->block_last_index
[i
] = -1;
1444 s
->mv_dir
= MV_DIR_FORWARD
;
1445 s
->mv_type
= MV_TYPE_16X16
;
1453 if(s
->msmpeg4_version
==2)
1454 code
= get_vlc2(&s
->gb
, v2_mb_type_vlc
.table
, V2_MB_TYPE_VLC_BITS
, 1);
1456 code
= get_vlc2(&s
->gb
, v1_inter_cbpc_vlc
.table
, V1_INTER_CBPC_VLC_BITS
, 3);
1457 if(code
<0 || code
>7){
1458 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpc %d invalid at %d %d\n", code
, s
->mb_x
, s
->mb_y
);
1462 s
->mb_intra
= code
>>2;
1467 if(s
->msmpeg4_version
==2)
1468 cbp
= get_vlc2(&s
->gb
, v2_intra_cbpc_vlc
.table
, V2_INTRA_CBPC_VLC_BITS
, 1);
1470 cbp
= get_vlc2(&s
->gb
, v1_intra_cbpc_vlc
.table
, V1_INTRA_CBPC_VLC_BITS
, 1);
1472 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpc %d invalid at %d %d\n", cbp
, s
->mb_x
, s
->mb_y
);
1480 cbpy
= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1);
1482 av_log(s
->avctx
, AV_LOG_ERROR
, "cbpy %d invalid at %d %d\n", cbp
, s
->mb_x
, s
->mb_y
);
1487 if(s
->msmpeg4_version
==1 || (cbp
&3) != 3) cbp
^= 0x3C;
1489 h263_pred_motion(s
, 0, 0, &mx
, &my
);
1490 mx
= msmpeg4v2_decode_motion(s
, mx
, 1);
1491 my
= msmpeg4v2_decode_motion(s
, my
, 1);
1493 s
->mv_dir
= MV_DIR_FORWARD
;
1494 s
->mv_type
= MV_TYPE_16X16
;
1495 s
->mv
[0][0][0] = mx
;
1496 s
->mv
[0][0][1] = my
;
1498 if(s
->msmpeg4_version
==2){
1499 s
->ac_pred
= get_bits1(&s
->gb
);
1500 cbp
|= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1)<<2; //FIXME check errors
1503 cbp
|= get_vlc2(&s
->gb
, cbpy_vlc
.table
, CBPY_VLC_BITS
, 1)<<2; //FIXME check errors
1504 if(s
->pict_type
==FF_P_TYPE
) cbp
^=0x3C;
1508 s
->dsp
.clear_blocks(s
->block
[0]);
1509 for (i
= 0; i
< 6; i
++) {
1510 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
1512 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
1519 static int msmpeg4v34_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1523 uint32_t * const mb_type_ptr
= &s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
];
1525 if (s
->pict_type
== FF_P_TYPE
) {
1526 if (s
->use_skip_mb_code
) {
1527 if (get_bits1(&s
->gb
)) {
1531 s
->block_last_index
[i
] = -1;
1532 s
->mv_dir
= MV_DIR_FORWARD
;
1533 s
->mv_type
= MV_TYPE_16X16
;
1537 *mb_type_ptr
= MB_TYPE_SKIP
| MB_TYPE_L0
| MB_TYPE_16x16
;
1543 code
= get_vlc2(&s
->gb
, ff_mb_non_intra_vlc
[DEFAULT_INTER_INDEX
].table
, MB_NON_INTRA_VLC_BITS
, 3);
1546 //s->mb_intra = (code & 0x40) ? 0 : 1;
1547 s
->mb_intra
= (~code
& 0x40) >> 6;
1552 code
= get_vlc2(&s
->gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
1555 /* predict coded block pattern */
1558 int val
= ((code
>> (5 - i
)) & 1);
1560 int pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_val
);
1564 cbp
|= val
<< (5 - i
);
1570 //printf("P at %d %d\n", s->mb_x, s->mb_y);
1571 if(s
->per_mb_rl_table
&& cbp
){
1572 s
->rl_table_index
= decode012(&s
->gb
);
1573 s
->rl_chroma_table_index
= s
->rl_table_index
;
1575 h263_pred_motion(s
, 0, 0, &mx
, &my
);
1576 if (ff_msmpeg4_decode_motion(s
, &mx
, &my
) < 0)
1578 s
->mv_dir
= MV_DIR_FORWARD
;
1579 s
->mv_type
= MV_TYPE_16X16
;
1580 s
->mv
[0][0][0] = mx
;
1581 s
->mv
[0][0][1] = my
;
1582 *mb_type_ptr
= MB_TYPE_L0
| MB_TYPE_16x16
;
1584 //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));
1585 s
->ac_pred
= get_bits1(&s
->gb
);
1586 *mb_type_ptr
= MB_TYPE_INTRA
;
1587 if(s
->inter_intra_pred
){
1588 s
->h263_aic_dir
= get_vlc2(&s
->gb
, ff_inter_intra_vlc
.table
, INTER_INTRA_VLC_BITS
, 1);
1589 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1591 if(s
->per_mb_rl_table
&& cbp
){
1592 s
->rl_table_index
= decode012(&s
->gb
);
1593 s
->rl_chroma_table_index
= s
->rl_table_index
;
1597 s
->dsp
.clear_blocks(s
->block
[0]);
1598 for (i
= 0; i
< 6; i
++) {
1599 if (ff_msmpeg4_decode_block(s
, block
[i
], i
, (cbp
>> (5 - i
)) & 1, NULL
) < 0)
1601 av_log(s
->avctx
, AV_LOG_ERROR
, "\nerror while decoding block: %d x %d (%d)\n", s
->mb_x
, s
->mb_y
, i
);
1608 //#define ERROR_DETAILS
1609 int ff_msmpeg4_decode_block(MpegEncContext
* s
, DCTELEM
* block
,
1610 int n
, int coded
, const uint8_t *scan_table
)
1612 int level
, i
, last
, run
, run_diff
;
1613 int av_uninit(dc_pred_dir
);
1615 RL_VLC_ELEM
*rl_vlc
;
1623 level
= msmpeg4_decode_dc(s
, n
, &dc_pred_dir
);
1626 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow- block: %d qscale: %d//\n", n
, s
->qscale
);
1627 if(s
->inter_intra_pred
) level
=0;
1631 rl
= &rl_table
[s
->rl_table_index
];
1632 if(level
> 256*s
->y_dc_scale
){
1633 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow+ L qscale: %d//\n", s
->qscale
);
1634 if(!s
->inter_intra_pred
) return -1;
1637 rl
= &rl_table
[3 + s
->rl_chroma_table_index
];
1638 if(level
> 256*s
->c_dc_scale
){
1639 av_log(s
->avctx
, AV_LOG_ERROR
, "dc overflow+ C qscale: %d//\n", s
->qscale
);
1640 if(!s
->inter_intra_pred
) return -1;
1645 run_diff
= s
->msmpeg4_version
>= 4;
1651 if (dc_pred_dir
== 0)
1652 scan_table
= s
->intra_v_scantable
.permutated
; /* left */
1654 scan_table
= s
->intra_h_scantable
.permutated
; /* top */
1656 scan_table
= s
->intra_scantable
.permutated
;
1658 rl_vlc
= rl
->rl_vlc
[0];
1660 qmul
= s
->qscale
<< 1;
1661 qadd
= (s
->qscale
- 1) | 1;
1663 rl
= &rl_table
[3 + s
->rl_table_index
];
1665 if(s
->msmpeg4_version
==2)
1671 s
->block_last_index
[n
] = i
;
1675 scan_table
= s
->inter_scantable
.permutated
;
1676 rl_vlc
= rl
->rl_vlc
[s
->qscale
];
1679 OPEN_READER(re
, &s
->gb
);
1681 UPDATE_CACHE(re
, &s
->gb
);
1682 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 0);
1685 cache
= GET_CACHE(re
, &s
->gb
);
1687 if (s
->msmpeg4_version
==1 || (cache
&0x80000000)==0) {
1688 if (s
->msmpeg4_version
==1 || (cache
&0x40000000)==0) {
1690 if(s
->msmpeg4_version
!=1) LAST_SKIP_BITS(re
, &s
->gb
, 2);
1691 UPDATE_CACHE(re
, &s
->gb
);
1692 if(s
->msmpeg4_version
<=3){
1693 last
= SHOW_UBITS(re
, &s
->gb
, 1); SKIP_CACHE(re
, &s
->gb
, 1);
1694 run
= SHOW_UBITS(re
, &s
->gb
, 6); SKIP_CACHE(re
, &s
->gb
, 6);
1695 level
= SHOW_SBITS(re
, &s
->gb
, 8); LAST_SKIP_CACHE(re
, &s
->gb
, 8);
1696 SKIP_COUNTER(re
, &s
->gb
, 1+6+8);
1699 last
= SHOW_UBITS(re
, &s
->gb
, 1); SKIP_BITS(re
, &s
->gb
, 1);
1700 if(!s
->esc3_level_length
){
1702 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1704 ll
= SHOW_UBITS(re
, &s
->gb
, 3); SKIP_BITS(re
, &s
->gb
, 3);
1706 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");
1707 SKIP_BITS(re
, &s
->gb
, 1);
1712 while(ll
<8 && SHOW_UBITS(re
, &s
->gb
, 1)==0){
1714 SKIP_BITS(re
, &s
->gb
, 1);
1716 if(ll
<8) SKIP_BITS(re
, &s
->gb
, 1);
1719 s
->esc3_level_length
= ll
;
1720 s
->esc3_run_length
= SHOW_UBITS(re
, &s
->gb
, 2) + 3; SKIP_BITS(re
, &s
->gb
, 2);
1721 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
1722 UPDATE_CACHE(re
, &s
->gb
);
1724 run
= SHOW_UBITS(re
, &s
->gb
, s
->esc3_run_length
);
1725 SKIP_BITS(re
, &s
->gb
, s
->esc3_run_length
);
1727 sign
= SHOW_UBITS(re
, &s
->gb
, 1);
1728 SKIP_BITS(re
, &s
->gb
, 1);
1730 level
= SHOW_UBITS(re
, &s
->gb
, s
->esc3_level_length
);
1731 SKIP_BITS(re
, &s
->gb
, s
->esc3_level_length
);
1732 if(sign
) level
= -level
;
1734 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
1735 #if 0 // waste of time / this will detect very few errors
1737 const int abs_level
= FFABS(level
);
1738 const int run1
= run
- rl
->max_run
[last
][abs_level
] - run_diff
;
1739 if(abs_level
<=MAX_LEVEL
&& run
<=MAX_RUN
){
1740 if(abs_level
<= rl
->max_level
[last
][run
]){
1741 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, vlc encoding possible\n");
1742 return DECODING_AC_LOST
;
1744 if(abs_level
<= rl
->max_level
[last
][run
]*2){
1745 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, esc 1 encoding possible\n");
1746 return DECODING_AC_LOST
;
1748 if(run1
>=0 && abs_level
<= rl
->max_level
[last
][run1
]){
1749 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal 3. esc, esc 2 encoding possible\n");
1750 return DECODING_AC_LOST
;
1755 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1756 if (level
>0) level
= level
* qmul
+ qadd
;
1757 else level
= level
* qmul
- qadd
;
1758 #if 0 // waste of time too :(
1759 if(level
>2048 || level
<-2048){
1760 av_log(s
->avctx
, AV_LOG_ERROR
, "|level| overflow in 3. esc\n");
1761 return DECODING_AC_LOST
;
1766 #ifdef ERROR_DETAILS
1768 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC3 level=%d\n", level
);
1769 else if((i
>62 && i
<192) || i
>192+63)
1770 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC3 i=%d run=%d level=%d\n", i
, run
, level
);
1774 #if MIN_CACHE_BITS < 23
1775 LAST_SKIP_BITS(re
, &s
->gb
, 2);
1776 UPDATE_CACHE(re
, &s
->gb
);
1778 SKIP_BITS(re
, &s
->gb
, 2);
1780 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 1);
1781 i
+= run
+ rl
->max_run
[run
>>7][level
/qmul
] + run_diff
; //FIXME opt indexing
1782 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1783 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1784 #ifdef ERROR_DETAILS
1786 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC2 level=%d\n", level
);
1787 else if((i
>62 && i
<192) || i
>192+63)
1788 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC2 i=%d run=%d level=%d\n", i
, run
, level
);
1793 #if MIN_CACHE_BITS < 22
1794 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1795 UPDATE_CACHE(re
, &s
->gb
);
1797 SKIP_BITS(re
, &s
->gb
, 1);
1799 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl_vlc
, TEX_VLC_BITS
, 2, 1);
1801 level
= level
+ rl
->max_level
[run
>>7][(run
-1)&63] * qmul
;//FIXME opt indexing
1802 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1803 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1804 #ifdef ERROR_DETAILS
1806 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code in ESC1 level=%d\n", level
);
1807 else if((i
>62 && i
<192) || i
>192+63)
1808 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow in ESC1 i=%d run=%d level=%d\n", i
, run
, level
);
1813 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1814 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1815 #ifdef ERROR_DETAILS
1817 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal vlc code level=%d\n", level
);
1818 else if((i
>62 && i
<192) || i
>192+63)
1819 av_log(s
->avctx
, AV_LOG_ERROR
, "run overflow i=%d run=%d level=%d\n", i
, run
, level
);
1825 const int left
= s
->gb
.size_in_bits
- get_bits_count(&s
->gb
);
1826 if(((i
+192 == 64 && level
/qmul
==-1) || s
->error_recognition
<=1) && left
>=0){
1827 av_log(s
->avctx
, AV_LOG_ERROR
, "ignoring overflow at %d %d\n", s
->mb_x
, s
->mb_y
);
1830 av_log(s
->avctx
, AV_LOG_ERROR
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1835 block
[scan_table
[i
]] = level
;
1839 block
[scan_table
[i
]] = level
;
1841 CLOSE_READER(re
, &s
->gb
);
1845 mpeg4_pred_ac(s
, block
, n
, dc_pred_dir
);
1847 i
= 63; /* XXX: not optimal */
1850 if(s
->msmpeg4_version
>=4 && i
>0) i
=63; //FIXME/XXX optimize
1851 s
->block_last_index
[n
] = i
;
1856 static int msmpeg4_decode_dc(MpegEncContext
* s
, int n
, int *dir_ptr
)
1860 if(s
->msmpeg4_version
<=2){
1862 level
= get_vlc2(&s
->gb
, v2_dc_lum_vlc
.table
, DC_VLC_BITS
, 3);
1864 level
= get_vlc2(&s
->gb
, v2_dc_chroma_vlc
.table
, DC_VLC_BITS
, 3);
1869 }else{ //FIXME optimize use unified tables & index
1871 level
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1873 level
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1876 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal dc vlc\n");
1880 if (level
== DC_MAX
) {
1881 level
= get_bits(&s
->gb
, 8);
1882 if (get_bits1(&s
->gb
))
1884 } else if (level
!= 0) {
1885 if (get_bits1(&s
->gb
))
1890 if(s
->msmpeg4_version
==1){
1892 pred
= msmpeg4v1_pred_dc(s
, n
, &dc_val
);
1895 /* update predictor */
1899 pred
= msmpeg4_pred_dc(s
, n
, &dc_val
, dir_ptr
);
1902 /* update predictor */
1904 *dc_val
= level
* s
->y_dc_scale
;
1906 *dc_val
= level
* s
->c_dc_scale
;
1913 int ff_msmpeg4_decode_motion(MpegEncContext
* s
,
1914 int *mx_ptr
, int *my_ptr
)
1919 mv
= &mv_tables
[s
->mv_table_index
];
1921 code
= get_vlc2(&s
->gb
, mv
->vlc
.table
, MV_VLC_BITS
, 2);
1923 av_log(s
->avctx
, AV_LOG_ERROR
, "illegal MV code at %d %d\n", s
->mb_x
, s
->mb_y
);
1926 if (code
== mv
->n
) {
1927 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1928 mx
= get_bits(&s
->gb
, 6);
1929 my
= get_bits(&s
->gb
, 6);
1931 mx
= mv
->table_mvx
[code
];
1932 my
= mv
->table_mvy
[code
];
1937 /* WARNING : they do not do exactly modulo encoding */