2 * MSMPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
23 #include "mpegvideo.h"
27 * You can also call this codec : MPEG4 with a twist !
30 * - (encoding) select best mv table (two choices)
31 * - (encoding) select best vlc/dc table
35 static UINT32 v2_dc_lum_table[512][2];
36 static UINT32 v2_dc_chroma_table[512][2];
38 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
39 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
41 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
42 static int msmpeg4_decode_motion(MpegEncContext * s,
43 int *mx_ptr, int *my_ptr);
44 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
45 static void init_h263_dc_for_msmpeg4(void);
48 extern UINT32 inverse[256];
55 #include "msmpeg4data.h"
59 const char *st_names[ST_NB] = {
69 int st_current_index = 0;
70 unsigned int st_bit_counts[ST_NB];
71 unsigned int st_out_bit_counts[ST_NB];
73 #define set_stat(var) st_current_index = var;
75 void print_stats(void)
83 total += st_bit_counts[i];
86 for(i=0;i<ST_NB;i++) {
87 printf("%-10s : %10.1f %5.1f%%\n",
89 (double)st_bit_counts[i] / 8.0,
90 (double)st_bit_counts[i] * 100.0 / total);
92 printf("%-10s : %10.1f %5.1f%%\n",
100 total += st_out_bit_counts[i];
103 for(i=0;i<ST_NB;i++) {
104 printf("%-10s : %10.1f %5.1f%%\n",
106 (double)st_out_bit_counts[i] / 8.0,
107 (double)st_out_bit_counts[i] * 100.0 / total);
109 printf("%-10s : %10.1f %5.1f%%\n",
117 #define set_stat(var)
121 static void common_init(MpegEncContext * s)
125 switch(s->msmpeg4_version){
129 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
132 if(s->workaround_bugs){
133 s->y_dc_scale_table= old_ff_y_dc_scale_table;
134 s->c_dc_scale_table= old_ff_c_dc_scale_table;
136 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
137 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
141 s->y_dc_scale_table= wmv1_y_dc_scale_table;
142 s->c_dc_scale_table= wmv1_c_dc_scale_table;
146 if(s->msmpeg4_version==4){
147 s->intra_scantable = wmv1_scantable[1];
148 s->intra_h_scantable= wmv1_scantable[2];
149 s->intra_v_scantable= wmv1_scantable[3];
150 s->inter_scantable = wmv1_scantable[0];
152 s->intra_scantable = zigzag_direct;
153 s->intra_h_scantable= ff_alternate_horizontal_scan;
154 s->intra_v_scantable= ff_alternate_vertical_scan;
155 s->inter_scantable = zigzag_direct;
162 init_h263_dc_for_msmpeg4();
164 /* permute for IDCT */
165 for(i=0; i<WMV1_SCANTABLE_COUNT; i++){
168 int j = wmv1_scantable[i][k];
169 wmv1_scantable[i][k]= block_permute_op(j);
176 /* build the table which associate a (x,y) motion vector to a vlc */
177 static void init_mv_table(MVTable *tab)
181 tab->table_mv_index = av_malloc(sizeof(UINT16) * 4096);
182 /* mark all entries as not used */
184 tab->table_mv_index[i] = tab->n;
186 for(i=0;i<tab->n;i++) {
187 x = tab->table_mvx[i];
188 y = tab->table_mvy[i];
189 tab->table_mv_index[(x << 6) | y] = i;
193 static void code012(PutBitContext *pb, int n)
199 put_bits(pb, 1, (n >= 2));
203 void ff_msmpeg4_encode_init(MpegEncContext *s)
205 static int init_done=0;
209 if(s->msmpeg4_version>=4){
215 /* init various encoding tables */
217 init_mv_table(&mv_tables[0]);
218 init_mv_table(&mv_tables[1]);
219 for(i=0;i<NB_RL_TABLES;i++)
220 init_rl(&rl_table[i]);
224 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
227 int run_diff= intra ? 0 : 1;
229 code = get_rl_index(rl, last, run, level);
230 size+= rl->table_vlc[code][1];
234 level1 = level - rl->max_level[last][run];
237 code = get_rl_index(rl, last, run, level1);
241 if (level > MAX_LEVEL)
243 run1 = run - rl->max_run[last][level] - run_diff;
246 code = get_rl_index(rl, last, run1, level);
253 size+= 1+1+ rl->table_vlc[code][1];
257 size+= 1+1+ rl->table_vlc[code][1];
265 static void find_best_tables(MpegEncContext * s)
268 int best =-1, best_size =9999999;
269 int chroma_best=-1, best_chroma_size=9999999;
281 for(level=0; level<=MAX_LEVEL; level++){
283 for(run=0; run<=MAX_RUN; run++){
285 for(last=0; last<2; last++){
286 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
287 int intra_luma_count = s->ac_stats[1][0][level][run][last];
288 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
290 if(s->pict_type==I_TYPE){
291 size += intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1);
292 chroma_size+= intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1);
294 size+= intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1)
295 +intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1)
296 +inter_count *get_size_of_code(s, &rl_table[3+i], last, run, level,0);
305 if(chroma_size<best_chroma_size){
306 best_chroma_size= chroma_size;
310 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
311 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
313 if(s->pict_type==P_TYPE) chroma_best= best;
315 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
317 s->rl_table_index = best;
318 s->rl_chroma_table_index= chroma_best;
320 if(s->pict_type != s->last_non_b_pict_type){
321 s->rl_table_index= 2;
322 if(s->pict_type==I_TYPE)
323 s->rl_chroma_table_index= 1;
325 s->rl_chroma_table_index= 2;
330 /* write MSMPEG4 compatible frame header */
331 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
335 align_put_bits(&s->pb);
336 put_bits(&s->pb, 2, s->pict_type - 1);
338 put_bits(&s->pb, 5, s->qscale);
339 if(s->msmpeg4_version<=2){
340 s->rl_table_index = 2;
341 s->rl_chroma_table_index = 2;
344 s->dc_table_index = 1;
345 s->mv_table_index = 1; /* only if P frame */
346 s->use_skip_mb_code = 1; /* only if P frame */
347 s->per_mb_rl_table = 0;
349 if (s->pict_type == I_TYPE) {
351 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */
353 if(s->msmpeg4_version==4){
354 msmpeg4_encode_ext_header(s);
355 put_bits(&s->pb, 1, s->per_mb_rl_table);
358 if(s->msmpeg4_version>2){
359 if(!s->per_mb_rl_table){
360 code012(&s->pb, s->rl_chroma_table_index);
361 code012(&s->pb, s->rl_table_index);
364 put_bits(&s->pb, 1, s->dc_table_index);
367 put_bits(&s->pb, 1, s->use_skip_mb_code);
369 if(s->msmpeg4_version==4)
370 put_bits(&s->pb, 1, s->per_mb_rl_table);
372 if(s->msmpeg4_version>2){
373 if(!s->per_mb_rl_table)
374 code012(&s->pb, s->rl_table_index);
376 put_bits(&s->pb, 1, s->dc_table_index);
378 put_bits(&s->pb, 1, s->mv_table_index);
381 if(s->flipflop_rounding){
388 s->esc3_level_length= 0;
389 s->esc3_run_length= 0;
393 printf("*****frame %d:\n", frame_count++);
397 void msmpeg4_encode_ext_header(MpegEncContext * s)
399 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
401 put_bits(&s->pb, 11, MIN(s->bit_rate, 2047));
403 if(s->msmpeg4_version<3)
404 s->flipflop_rounding=0;
406 s->flipflop_rounding=1;
407 put_bits(&s->pb, 1, s->flipflop_rounding);
411 /* predict coded block */
412 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
414 int xy, wrap, pred, a, b, c;
416 xy = s->block_index[n];
417 wrap = s->block_wrap[0];
422 a = s->coded_block[xy - 1 ];
423 b = s->coded_block[xy - 1 - wrap];
424 c = s->coded_block[xy - wrap];
433 *coded_block_ptr = &s->coded_block[xy];
438 static void msmpeg4_encode_motion(MpegEncContext * s,
444 /* modulo encoding */
445 /* WARNING : you cannot reach all the MVs even with the modulo
446 encoding. This is a somewhat strange compromise they took !!! */
459 if ((unsigned)mx >= 64 ||
461 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
463 mv = &mv_tables[s->mv_table_index];
465 code = mv->table_mv_index[(mx << 6) | my];
468 mv->table_mv_bits[code],
469 mv->table_mv_code[code]);
471 /* escape : code litterally */
472 put_bits(&s->pb, 6, mx);
473 put_bits(&s->pb, 6, my);
477 void msmpeg4_encode_mb(MpegEncContext * s,
478 DCTELEM block[6][64],
479 int motion_x, int motion_y)
481 int cbp, coded_cbp, i;
487 set_stat(ST_INTER_MB);
489 for (i = 0; i < 6; i++) {
490 if (s->block_last_index[i] >= 0)
493 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
494 /* skip macroblock */
495 put_bits(&s->pb, 1, 1);
498 if (s->use_skip_mb_code)
499 put_bits(&s->pb, 1, 0); /* mb coded */
501 if(s->msmpeg4_version<=2){
503 v2_mb_type[cbp&3][1],
504 v2_mb_type[cbp&3][0]);
505 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
509 cbpy_tab[coded_cbp>>2][1],
510 cbpy_tab[coded_cbp>>2][0]);
512 h263_pred_motion(s, 0, &pred_x, &pred_y);
513 msmpeg4v2_encode_motion(s, motion_x - pred_x);
514 msmpeg4v2_encode_motion(s, motion_y - pred_y);
517 table_mb_non_intra[cbp + 64][1],
518 table_mb_non_intra[cbp + 64][0]);
521 h263_pred_motion(s, 0, &pred_x, &pred_y);
522 msmpeg4_encode_motion(s, motion_x - pred_x,
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 = 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 == 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 == I_TYPE) {
563 set_stat(ST_INTRA_MB);
565 table_mb_intra[coded_cbp][1], table_mb_intra[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 set_stat(ST_INTRA_MB);
574 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
578 for (i = 0; i < 6; i++) {
579 msmpeg4_encode_block(s, block[i], i);
583 /* old ffmpeg msmpeg4v3 mode */
584 void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
589 }else if (s->qscale < 9){
590 s->y_dc_scale = 2 * s->qscale;
591 s->c_dc_scale = (s->qscale + 13)>>1;
593 s->y_dc_scale = s->qscale + 8;
594 s->c_dc_scale = (s->qscale + 13)>>1;
598 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
609 *dc_val_ptr= &s->last_dc[i];
610 return s->last_dc[i];
613 /* dir = 0: left, dir = 1: top prediction */
614 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
615 UINT16 **dc_val_ptr, int *dir_ptr)
617 int a, b, c, wrap, pred, scale;
620 /* find prediction */
622 scale = s->y_dc_scale;
624 scale = s->c_dc_scale;
627 wrap = s->block_wrap[n];
628 dc_val= s->dc_val[0] + s->block_index[n];
634 b = dc_val[ - 1 - wrap];
637 /* XXX: the following solution consumes divisions, but it does not
638 necessitate to modify mpegvideo.c. The problem comes from the
639 fact they decided to store the quantized DC (which would lead
640 to problems if Q could vary !) */
641 #if defined ARCH_X86 && !defined PIC
643 "movl %3, %%eax \n\t"
644 "shrl $1, %%eax \n\t"
645 "addl %%eax, %2 \n\t"
646 "addl %%eax, %1 \n\t"
647 "addl %0, %%eax \n\t"
649 "movl %%edx, %0 \n\t"
650 "movl %1, %%eax \n\t"
652 "movl %%edx, %1 \n\t"
653 "movl %2, %%eax \n\t"
655 "movl %%edx, %2 \n\t"
656 : "+b" (a), "+c" (b), "+D" (c)
657 : "g" (scale), "S" (inverse[scale])
661 /* #elif defined (ARCH_ALPHA) */
662 /* Divisions are extremely costly on Alpha; optimize the most
663 common case. But they are costly everywhere...
666 a = (a + (8 >> 1)) / 8;
667 b = (b + (8 >> 1)) / 8;
668 c = (c + (8 >> 1)) / 8;
670 a = (a + (scale >> 1)) / scale;
671 b = (b + (scale >> 1)) / scale;
672 c = (c + (scale >> 1)) / scale;
675 /* XXX: WARNING: they did not choose the same test as MPEG4. This
676 is very important ! */
678 if (abs(a - b) <= abs(b - c)) {
686 /* update predictor */
687 *dc_val_ptr = &dc_val[0];
693 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
698 if(s->msmpeg4_version==1){
700 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
702 /* update predictor */
706 if(s->msmpeg4_version<=3)
707 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
709 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
711 /* update predictor */
713 *dc_val = level * s->y_dc_scale;
715 *dc_val = level * s->c_dc_scale;
719 /* do the prediction */
722 if(s->msmpeg4_version<=2){
725 v2_dc_lum_table[level+256][1],
726 v2_dc_lum_table[level+256][0]);
729 v2_dc_chroma_table[level+256][1],
730 v2_dc_chroma_table[level+256][0]);
742 if (s->dc_table_index == 0) {
744 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
746 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
750 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
752 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
757 put_bits(&s->pb, 8, level);
760 put_bits(&s->pb, 1, sign);
765 /* Encoding of a block. Very similar to MPEG4 except for a different
766 escape coding (same as H263) and more vlc tables.
768 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
770 int level, run, last, i, j, last_index;
771 int last_non_zero, sign, slevel;
772 int code, run_diff, dc_pred_dir;
774 const UINT8 *scantable;
778 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
781 rl = &rl_table[s->rl_table_index];
783 rl = &rl_table[3 + s->rl_chroma_table_index];
786 scantable= s->intra_scantable;
787 set_stat(ST_INTRA_AC);
790 rl = &rl_table[3 + s->rl_table_index];
791 if(s->msmpeg4_version<=2)
795 scantable= s->inter_scantable;
796 set_stat(ST_INTER_AC);
799 /* recalculate block_last_index for M$ wmv1 */
800 if(scantable!=zigzag_direct && s->block_last_index[n]>0){
801 for(last_index=63; last_index>=0; last_index--){
802 if(block[scantable[last_index]]) break;
805 last_index = s->block_last_index[n];
807 last_non_zero = i - 1;
808 for (; i <= last_index; i++) {
812 run = i - last_non_zero - 1;
813 last = (i == last_index);
820 if(level<=MAX_LEVEL && run<=MAX_RUN){
821 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
825 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
827 code = get_rl_index(rl, last, run, level);
828 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
832 level1 = level - rl->max_level[last][run];
835 code = get_rl_index(rl, last, run, level1);
838 put_bits(&s->pb, 1, 0);
839 if (level > MAX_LEVEL)
841 run1 = run - rl->max_run[last][level] - run_diff;
844 code = get_rl_index(rl, last, run1, level);
848 put_bits(&s->pb, 1, 0);
849 put_bits(&s->pb, 1, last);
850 if(s->msmpeg4_version==4){
851 if(s->esc3_level_length==0){
852 s->esc3_level_length=8;
853 s->esc3_run_length= 6;
855 put_bits(&s->pb, 6, 3);
857 put_bits(&s->pb, 8, 3);
859 put_bits(&s->pb, s->esc3_run_length, run);
860 put_bits(&s->pb, 1, sign);
861 put_bits(&s->pb, s->esc3_level_length, level);
863 put_bits(&s->pb, 6, run);
864 put_bits(&s->pb, 8, slevel & 0xff);
868 put_bits(&s->pb, 1, 1);
869 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
870 put_bits(&s->pb, 1, sign);
874 put_bits(&s->pb, 1, 1);
875 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
876 put_bits(&s->pb, 1, sign);
879 put_bits(&s->pb, 1, sign);
886 /****************************************/
889 static VLC mb_non_intra_vlc;
890 static VLC mb_intra_vlc;
891 static VLC dc_lum_vlc[2];
892 static VLC dc_chroma_vlc[2];
893 static VLC v2_dc_lum_vlc;
894 static VLC v2_dc_chroma_vlc;
896 static VLC v2_intra_cbpc_vlc;
897 static VLC v2_mb_type_vlc;
898 static VLC v2_mv_vlc;
899 static VLC v1_intra_cbpc_vlc;
900 static VLC v1_inter_cbpc_vlc;
902 /* this table is practically identical to the one from h263 except that its inverted */
903 static void init_h263_dc_for_msmpeg4(void)
905 int level, uni_code, uni_len;
907 for(level=-256; level<256; level++){
909 /* find number of bits */
918 l= (-level) ^ ((1 << size) - 1);
923 uni_code= DCtab_lum[size][0];
924 uni_len = DCtab_lum[size][1];
925 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
928 uni_code<<=size; uni_code|=l;
931 uni_code<<=1; uni_code|=1;
935 v2_dc_lum_table[level+256][0]= uni_code;
936 v2_dc_lum_table[level+256][1]= uni_len;
938 /* chrominance h263 */
939 uni_code= DCtab_chrom[size][0];
940 uni_len = DCtab_chrom[size][1];
941 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
944 uni_code<<=size; uni_code|=l;
947 uni_code<<=1; uni_code|=1;
951 v2_dc_chroma_table[level+256][0]= uni_code;
952 v2_dc_chroma_table[level+256][1]= uni_len;
957 /* init all vlc decoding tables */
958 int ff_msmpeg4_decode_init(MpegEncContext *s)
969 for(i=0;i<NB_RL_TABLES;i++) {
970 init_rl(&rl_table[i]);
971 init_vlc_rl(&rl_table[i]);
975 init_vlc(&mv->vlc, 9, mv->n + 1,
976 mv->table_mv_bits, 1, 1,
977 mv->table_mv_code, 2, 2);
980 init_vlc(&dc_lum_vlc[0], 9, 120,
981 &table0_dc_lum[0][1], 8, 4,
982 &table0_dc_lum[0][0], 8, 4);
983 init_vlc(&dc_chroma_vlc[0], 9, 120,
984 &table0_dc_chroma[0][1], 8, 4,
985 &table0_dc_chroma[0][0], 8, 4);
986 init_vlc(&dc_lum_vlc[1], 9, 120,
987 &table1_dc_lum[0][1], 8, 4,
988 &table1_dc_lum[0][0], 8, 4);
989 init_vlc(&dc_chroma_vlc[1], 9, 120,
990 &table1_dc_chroma[0][1], 8, 4,
991 &table1_dc_chroma[0][0], 8, 4);
993 init_vlc(&v2_dc_lum_vlc, 9, 512,
994 &v2_dc_lum_table[0][1], 8, 4,
995 &v2_dc_lum_table[0][0], 8, 4);
996 init_vlc(&v2_dc_chroma_vlc, 9, 512,
997 &v2_dc_chroma_table[0][1], 8, 4,
998 &v2_dc_chroma_table[0][0], 8, 4);
1000 init_vlc(&cbpy_vlc, 6, 16,
1001 &cbpy_tab[0][1], 2, 1,
1002 &cbpy_tab[0][0], 2, 1);
1003 init_vlc(&v2_intra_cbpc_vlc, 3, 4,
1004 &v2_intra_cbpc[0][1], 2, 1,
1005 &v2_intra_cbpc[0][0], 2, 1);
1006 init_vlc(&v2_mb_type_vlc, 5, 8,
1007 &v2_mb_type[0][1], 2, 1,
1008 &v2_mb_type[0][0], 2, 1);
1009 init_vlc(&v2_mv_vlc, 9, 33,
1011 &mvtab[0][0], 2, 1);
1013 init_vlc(&mb_non_intra_vlc, 9, 128,
1014 &table_mb_non_intra[0][1], 8, 4,
1015 &table_mb_non_intra[0][0], 8, 4);
1016 init_vlc(&mb_intra_vlc, 9, 64,
1017 &table_mb_intra[0][1], 4, 2,
1018 &table_mb_intra[0][0], 4, 2);
1020 init_vlc(&v1_intra_cbpc_vlc, 6, 8,
1021 intra_MCBPC_bits, 1, 1,
1022 intra_MCBPC_code, 1, 1);
1023 init_vlc(&v1_inter_cbpc_vlc, 6, 25,
1024 inter_MCBPC_bits, 1, 1,
1025 inter_MCBPC_code, 1, 1);
1030 static int decode012(GetBitContext *gb)
1037 return get_bits1(gb) + 1;
1040 int msmpeg4_decode_picture_header(MpegEncContext * s)
1047 for(i=0; i<s->gb.size*8; i++)
1048 printf("%d", get_bits1(&s->gb));
1049 // get_bits1(&s->gb);
1055 if(s->msmpeg4_version==1){
1056 int start_code, num;
1057 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1058 if(start_code!=0x00000100){
1059 fprintf(stderr, "invalid startcode\n");
1063 num= get_bits(&s->gb, 5); // frame number */
1066 s->pict_type = get_bits(&s->gb, 2) + 1;
1067 if (s->pict_type != I_TYPE &&
1068 s->pict_type != P_TYPE){
1069 fprintf(stderr, "invalid picture type\n");
1073 s->qscale = get_bits(&s->gb, 5);
1075 if (s->pict_type == I_TYPE) {
1076 code = get_bits(&s->gb, 5);
1077 if(s->msmpeg4_version==1){
1078 if(code==0 || code>s->mb_height){
1079 fprintf(stderr, "invalid slice height %d\n", code);
1083 s->slice_height = code;
1085 /* 0x17: one slice, 0x18: two slices, ... */
1089 s->slice_height = s->mb_height / (code - 0x16);
1092 switch(s->msmpeg4_version){
1095 s->rl_chroma_table_index = 2;
1096 s->rl_table_index = 2;
1098 s->dc_table_index = 0; //not used
1101 s->rl_chroma_table_index = decode012(&s->gb);
1102 s->rl_table_index = decode012(&s->gb);
1104 s->dc_table_index = get_bits1(&s->gb);
1107 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
1109 s->per_mb_rl_table= get_bits1(&s->gb);
1110 if(!s->per_mb_rl_table){
1111 s->rl_chroma_table_index = decode012(&s->gb);
1112 s->rl_table_index = decode012(&s->gb);
1115 s->dc_table_index = get_bits1(&s->gb);
1119 /* printf(" %d %d %d %d %d \n",
1121 s->rl_chroma_table_index,
1124 s->per_mb_rl_table);*/
1127 switch(s->msmpeg4_version){
1130 if(s->msmpeg4_version==1)
1131 s->use_skip_mb_code = 1;
1133 s->use_skip_mb_code = get_bits1(&s->gb);
1134 s->rl_table_index = 2;
1135 s->rl_chroma_table_index = s->rl_table_index;
1136 s->dc_table_index = 0; //not used
1137 s->mv_table_index = 0;
1140 s->use_skip_mb_code = get_bits1(&s->gb);
1141 s->rl_table_index = decode012(&s->gb);
1142 s->rl_chroma_table_index = s->rl_table_index;
1144 s->dc_table_index = get_bits1(&s->gb);
1146 s->mv_table_index = get_bits1(&s->gb);
1149 s->use_skip_mb_code = get_bits1(&s->gb);
1150 s->per_mb_rl_table= get_bits1(&s->gb);
1151 if(!s->per_mb_rl_table){
1152 s->rl_table_index = decode012(&s->gb);
1153 s->rl_chroma_table_index = s->rl_table_index;
1156 s->dc_table_index = get_bits1(&s->gb);
1158 s->mv_table_index = get_bits1(&s->gb);
1161 /* printf(" %d %d %d %d %d %d \n",
1162 s->use_skip_mb_code,
1164 s->rl_chroma_table_index,
1167 s->per_mb_rl_table);*/
1168 if(s->flipflop_rounding){
1169 s->no_rounding ^= 1;
1175 s->esc3_level_length= 0;
1176 s->esc3_run_length= 0;
1179 printf("*****frame %d:\n", frame_count++);
1184 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1186 int left= buf_size*8 - get_bits_count(&s->gb);
1187 int length= s->msmpeg4_version>=3 ? 17 : 16;
1188 /* the alt_bitstream reader could read over the end so we need to check it */
1189 if(left>=length && left<length+8)
1193 fps= get_bits(&s->gb, 5);
1194 s->bit_rate= get_bits(&s->gb, 11);
1195 if(s->msmpeg4_version>=3)
1196 s->flipflop_rounding= get_bits1(&s->gb);
1198 s->flipflop_rounding= 0;
1200 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate, s->flipflop_rounding);
1202 else if(left<length+8)
1204 s->flipflop_rounding= 0;
1205 printf("ext header missing, %d left\n", left);
1209 fprintf(stderr, "I frame too long, ignoring ext header\n");
1215 static inline void msmpeg4_memsetw(short *tab, int val, int n)
1222 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1224 int range, bit_size, sign, code, bits;
1229 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1231 bit_size = s->f_code - 1;
1232 range = 1 << bit_size;
1245 code = (val >> bit_size) + 1;
1246 bits = val & (range - 1);
1248 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1250 put_bits(&s->pb, bit_size, bits);
1255 /* this is identical to h263 except that its range is multiplied by 2 */
1256 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1258 int code, val, sign, shift;
1260 code = get_vlc(&s->gb, &v2_mv_vlc);
1261 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1267 sign = get_bits1(&s->gb);
1269 val = (code - 1) << shift;
1271 val |= get_bits(&s->gb, shift);
1286 static int msmpeg4v12_decode_mb(MpegEncContext *s,
1287 DCTELEM block[6][64])
1290 if (s->pict_type == P_TYPE) {
1291 if (s->use_skip_mb_code) {
1292 if (get_bits1(&s->gb)) {
1296 s->block_last_index[i] = -1;
1297 s->mv_dir = MV_DIR_FORWARD;
1298 s->mv_type = MV_TYPE_16X16;
1306 if(s->msmpeg4_version==2)
1307 code = get_vlc(&s->gb, &v2_mb_type_vlc);
1309 code = get_vlc(&s->gb, &v1_inter_cbpc_vlc);
1310 if(code<0 || code>7){
1311 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1315 s->mb_intra = code >>2;
1320 if(s->msmpeg4_version==2)
1321 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
1323 cbp= get_vlc(&s->gb, &v1_intra_cbpc_vlc);
1325 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1333 cbpy= get_vlc(&s->gb, &cbpy_vlc);
1335 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1340 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
1342 h263_pred_motion(s, 0, &mx, &my);
1343 mx= msmpeg4v2_decode_motion(s, mx, 1);
1344 my= msmpeg4v2_decode_motion(s, my, 1);
1346 s->mv_dir = MV_DIR_FORWARD;
1347 s->mv_type = MV_TYPE_16X16;
1348 s->mv[0][0][0] = mx;
1349 s->mv[0][0][1] = my;
1351 if(s->msmpeg4_version==2){
1352 s->ac_pred = get_bits1(&s->gb);
1353 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
1356 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
1357 if(s->pict_type==P_TYPE) cbp^=0x3C;
1361 for (i = 0; i < 6; i++) {
1362 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1364 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1371 int msmpeg4_decode_mb(MpegEncContext *s,
1372 DCTELEM block[6][64])
1377 /* special slice handling */
1379 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
1381 /* reset DC pred (set previous line to 1024) */
1382 wrap = 2 * s->mb_width + 2;
1383 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
1384 1024, 2 * s->mb_width);
1385 wrap = s->mb_width + 2;
1386 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
1388 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
1391 /* reset AC pred (set previous line to 0) */
1392 wrap = s->mb_width * 2 + 2;
1393 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
1394 0, 2 * s->mb_width*16);
1395 wrap = s->mb_width + 2;
1396 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
1398 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
1401 s->first_slice_line = 1;
1403 s->first_slice_line = 0;
1407 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps
1409 if (s->pict_type == P_TYPE) {
1410 set_stat(ST_INTER_MB);
1411 if (s->use_skip_mb_code) {
1412 if (get_bits1(&s->gb)) {
1416 s->block_last_index[i] = -1;
1417 s->mv_dir = MV_DIR_FORWARD;
1418 s->mv_type = MV_TYPE_16X16;
1426 code = get_vlc(&s->gb, &mb_non_intra_vlc);
1429 //s->mb_intra = (code & 0x40) ? 0 : 1;
1430 s->mb_intra = (~code & 0x40) >> 6;
1434 set_stat(ST_INTRA_MB);
1436 code = get_vlc(&s->gb, &mb_intra_vlc);
1439 /* predict coded block pattern */
1442 int val = ((code >> (5 - i)) & 1);
1444 int pred = coded_block_pred(s, i, &coded_val);
1448 cbp |= val << (5 - i);
1454 //printf("P at %d %d\n", s->mb_x, s->mb_y);
1455 if(s->per_mb_rl_table && cbp){
1456 s->rl_table_index = decode012(&s->gb);
1457 s->rl_chroma_table_index = s->rl_table_index;
1460 h263_pred_motion(s, 0, &mx, &my);
1461 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1463 s->mv_dir = MV_DIR_FORWARD;
1464 s->mv_type = MV_TYPE_16X16;
1465 s->mv[0][0][0] = mx;
1466 s->mv[0][0][1] = my;
1468 //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));
1469 set_stat(ST_INTRA_MB);
1470 s->ac_pred = get_bits1(&s->gb);
1471 if(s->per_mb_rl_table && cbp){
1472 s->rl_table_index = decode012(&s->gb);
1473 s->rl_chroma_table_index = s->rl_table_index;
1477 for (i = 0; i < 6; i++) {
1478 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1480 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1488 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1491 int code, level, i, j, last, run, run_diff;
1494 const UINT8 *scan_table;
1503 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1505 fprintf(stderr, "dc overflow-\n");
1509 rl = &rl_table[s->rl_table_index];
1510 if(level > 256*s->y_dc_scale){
1511 fprintf(stderr, "dc overflow+\n");
1515 rl = &rl_table[3 + s->rl_chroma_table_index];
1516 if(level > 256*s->c_dc_scale){
1517 fprintf(stderr, "dc overflow+\n");
1529 if (dc_pred_dir == 0)
1530 scan_table = s->intra_v_scantable; /* left */
1532 scan_table = s->intra_h_scantable; /* top */
1534 scan_table = s->intra_scantable;
1536 set_stat(ST_INTRA_AC);
1538 qmul = s->qscale << 1;
1539 qadd = (s->qscale - 1) | 1;
1541 rl = &rl_table[3 + s->rl_table_index];
1543 if(s->msmpeg4_version==2)
1549 s->block_last_index[n] = i - 1;
1552 scan_table = s->inter_scantable;
1553 set_stat(ST_INTER_AC);
1557 code = get_vlc(&s->gb, &rl->vlc);
1559 fprintf(stderr, "illegal AC-VLC code at %d %d\n", s->mb_x, s->mb_y);
1562 if (code == rl->n) {
1564 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
1565 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
1567 if(s->msmpeg4_version<=3){
1568 last= get_bits1(&s->gb);
1569 run= get_bits(&s->gb, 6);
1570 level= get_bits(&s->gb, 8);
1571 level= ((int8_t)level);
1574 last= get_bits1(&s->gb);
1575 if(!s->esc3_level_length){
1577 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1579 ll= get_bits(&s->gb, 3);
1581 if(get_bits1(&s->gb)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1586 while(ll<8 && get_bits1(&s->gb)==0) ll++;
1589 s->esc3_level_length= ll;
1590 s->esc3_run_length= get_bits(&s->gb, 2) + 3;
1591 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
1593 run= get_bits(&s->gb, s->esc3_run_length);
1594 sign= get_bits1(&s->gb);
1595 level= get_bits(&s->gb, s->esc3_level_length);
1596 if(sign) level= -level;
1598 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
1599 #if 0 // waste of time / this will detect very few errors
1601 const int abs_level= ABS(level);
1602 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1603 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1604 if(abs_level <= rl->max_level[last][run]){
1605 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1606 return DECODING_AC_LOST;
1608 if(abs_level <= rl->max_level[last][run]*2){
1609 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1610 return DECODING_AC_LOST;
1612 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
1613 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1614 return DECODING_AC_LOST;
1619 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1620 if (level>0) level= level * qmul + qadd;
1621 else level= level * qmul - qadd;
1622 #if 0 // waste of time too :(
1623 if(level>2048 || level<-2048){
1624 fprintf(stderr, "|level| overflow in 3. esc\n");
1625 return DECODING_AC_LOST;
1630 code = get_vlc(&s->gb, &rl->vlc);
1631 if (code < 0 || code >= rl->n){
1632 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
1635 run = rl->table_run[code];
1636 level = rl->table_level[code];
1637 last = code >= rl->last;
1638 run += rl->max_run[last][level] + run_diff;
1639 level= level * qmul + qadd;
1640 if (get_bits1(&s->gb))
1645 code = get_vlc(&s->gb, &rl->vlc);
1646 if (code < 0 || code >= rl->n){
1647 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
1650 run = rl->table_run[code];
1651 level = rl->table_level[code];
1652 last = code >= rl->last;
1653 level += rl->max_level[last][run];
1654 level= level * qmul + qadd;
1655 if (get_bits1(&s->gb))
1659 run = rl->table_run[code];
1660 level = rl->table_level[code] * qmul + qadd;
1661 last = code >= rl->last;
1662 if (get_bits1(&s->gb))
1667 fprintf(stderr, "run too long at %d %d\n", s->mb_x, s->mb_y);
1679 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1681 i = 64; /* XXX: not optimal */
1684 if(s->msmpeg4_version==4 && i>1) i=64; //FIXME/XXX optimize
1685 s->block_last_index[n] = i - 1;
1690 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1694 if(s->msmpeg4_version<=2){
1696 level = get_vlc(&s->gb, &v2_dc_lum_vlc);
1698 level = get_vlc(&s->gb, &v2_dc_chroma_vlc);
1703 }else{ //FIXME optimize use unified tables & index
1705 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]);
1707 level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]);
1710 fprintf(stderr, "illegal dc vlc\n");
1714 if (level == DC_MAX) {
1715 level = get_bits(&s->gb, 8);
1716 if (get_bits1(&s->gb))
1718 } else if (level != 0) {
1719 if (get_bits1(&s->gb))
1724 if(s->msmpeg4_version==1){
1726 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1729 /* update predictor */
1733 if(s->msmpeg4_version<=3)
1734 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1736 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1739 /* update predictor */
1741 *dc_val = level * s->y_dc_scale;
1743 *dc_val = level * s->c_dc_scale;
1750 static int msmpeg4_decode_motion(MpegEncContext * s,
1751 int *mx_ptr, int *my_ptr)
1756 mv = &mv_tables[s->mv_table_index];
1758 code = get_vlc(&s->gb, &mv->vlc);
1760 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
1763 if (code == mv->n) {
1764 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1765 mx = get_bits(&s->gb, 6);
1766 my = get_bits(&s->gb, 6);
1768 mx = mv->table_mvx[code];
1769 my = mv->table_mvy[code];
1774 /* WARNING : they do not do exactly modulo encoding */