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
36 #define CBPY_VLC_BITS 6
37 #define INTER_INTRA_VLC_BITS 3
38 #define V1_INTRA_CBPC_VLC_BITS 6
39 #define V1_INTER_CBPC_VLC_BITS 6
40 #define V2_INTRA_CBPC_VLC_BITS 3
41 #define V2_MB_TYPE_VLC_BITS 7
43 #define V2_MV_VLC_BITS 9
44 #define TEX_VLC_BITS 9
45 #define MB_NON_INTRA_VLC_BITS 9
46 #define MB_INTRA_VLC_BITS 9
48 #define II_BITRATE 128*1024
49 #define MBAC_BITRATE 50*1024
51 static UINT32 v2_dc_lum_table[512][2];
52 static UINT32 v2_dc_chroma_table[512][2];
54 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
55 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
57 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
58 static int msmpeg4_decode_motion(MpegEncContext * s,
59 int *mx_ptr, int *my_ptr);
60 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
61 static void init_h263_dc_for_msmpeg4(void);
62 static inline void msmpeg4_memsetw(short *tab, int val, int n);
66 extern UINT32 inverse[256];
73 #include "msmpeg4data.h"
77 const char *st_names[ST_NB] = {
87 int st_current_index = 0;
88 unsigned int st_bit_counts[ST_NB];
89 unsigned int st_out_bit_counts[ST_NB];
91 #define set_stat(var) st_current_index = var;
93 void print_stats(void)
101 total += st_bit_counts[i];
104 for(i=0;i<ST_NB;i++) {
105 printf("%-10s : %10.1f %5.1f%%\n",
107 (double)st_bit_counts[i] / 8.0,
108 (double)st_bit_counts[i] * 100.0 / total);
110 printf("%-10s : %10.1f %5.1f%%\n",
118 total += st_out_bit_counts[i];
121 for(i=0;i<ST_NB;i++) {
122 printf("%-10s : %10.1f %5.1f%%\n",
124 (double)st_out_bit_counts[i] / 8.0,
125 (double)st_out_bit_counts[i] * 100.0 / total);
127 printf("%-10s : %10.1f %5.1f%%\n",
135 #define set_stat(var)
139 static void common_init(MpegEncContext * s)
143 switch(s->msmpeg4_version){
147 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
150 if(s->workaround_bugs){
151 s->y_dc_scale_table= old_ff_y_dc_scale_table;
152 s->c_dc_scale_table= old_ff_c_dc_scale_table;
154 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
155 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
159 s->y_dc_scale_table= wmv1_y_dc_scale_table;
160 s->c_dc_scale_table= wmv1_c_dc_scale_table;
164 if(s->msmpeg4_version==4){
165 s->intra_scantable = wmv1_scantable[1];
166 s->intra_h_scantable= wmv1_scantable[2];
167 s->intra_v_scantable= wmv1_scantable[3];
168 s->inter_scantable = wmv1_scantable[0];
170 s->intra_scantable = zigzag_direct;
171 s->intra_h_scantable= ff_alternate_horizontal_scan;
172 s->intra_v_scantable= ff_alternate_vertical_scan;
173 s->inter_scantable = zigzag_direct;
180 init_h263_dc_for_msmpeg4();
182 /* permute for IDCT */
183 for(i=0; i<WMV1_SCANTABLE_COUNT; i++){
186 int j = wmv1_scantable[i][k];
187 wmv1_scantable[i][k]= block_permute_op(j);
194 /* build the table which associate a (x,y) motion vector to a vlc */
195 static void init_mv_table(MVTable *tab)
199 tab->table_mv_index = av_malloc(sizeof(UINT16) * 4096);
200 /* mark all entries as not used */
202 tab->table_mv_index[i] = tab->n;
204 for(i=0;i<tab->n;i++) {
205 x = tab->table_mvx[i];
206 y = tab->table_mvy[i];
207 tab->table_mv_index[(x << 6) | y] = i;
211 static void code012(PutBitContext *pb, int n)
217 put_bits(pb, 1, (n >= 2));
221 void ff_msmpeg4_encode_init(MpegEncContext *s)
223 static int init_done=0;
227 if(s->msmpeg4_version>=4){
233 /* init various encoding tables */
235 init_mv_table(&mv_tables[0]);
236 init_mv_table(&mv_tables[1]);
237 for(i=0;i<NB_RL_TABLES;i++)
238 init_rl(&rl_table[i]);
242 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
245 int run_diff= intra ? 0 : 1;
247 code = get_rl_index(rl, last, run, level);
248 size+= rl->table_vlc[code][1];
252 level1 = level - rl->max_level[last][run];
255 code = get_rl_index(rl, last, run, level1);
259 if (level > MAX_LEVEL)
261 run1 = run - rl->max_run[last][level] - run_diff;
264 code = get_rl_index(rl, last, run1, level);
271 size+= 1+1+ rl->table_vlc[code][1];
275 size+= 1+1+ rl->table_vlc[code][1];
283 static void find_best_tables(MpegEncContext * s)
286 int best =-1, best_size =9999999;
287 int chroma_best=-1, best_chroma_size=9999999;
299 for(level=0; level<=MAX_LEVEL; level++){
301 for(run=0; run<=MAX_RUN; run++){
303 for(last=0; last<2; last++){
304 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
305 int intra_luma_count = s->ac_stats[1][0][level][run][last];
306 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
308 if(s->pict_type==I_TYPE){
309 size += intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1);
310 chroma_size+= intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1);
312 size+= intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1)
313 +intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1)
314 +inter_count *get_size_of_code(s, &rl_table[3+i], last, run, level,0);
323 if(chroma_size<best_chroma_size){
324 best_chroma_size= chroma_size;
328 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
329 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
331 if(s->pict_type==P_TYPE) chroma_best= best;
333 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
335 s->rl_table_index = best;
336 s->rl_chroma_table_index= chroma_best;
338 if(s->pict_type != s->last_non_b_pict_type){
339 s->rl_table_index= 2;
340 if(s->pict_type==I_TYPE)
341 s->rl_chroma_table_index= 1;
343 s->rl_chroma_table_index= 2;
348 /* write MSMPEG4 compatible frame header */
349 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
353 align_put_bits(&s->pb);
354 put_bits(&s->pb, 2, s->pict_type - 1);
356 put_bits(&s->pb, 5, s->qscale);
357 if(s->msmpeg4_version<=2){
358 s->rl_table_index = 2;
359 s->rl_chroma_table_index = 2;
362 s->dc_table_index = 1;
363 s->mv_table_index = 1; /* only if P frame */
364 s->use_skip_mb_code = 1; /* only if P frame */
365 s->per_mb_rl_table = 0;
366 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
368 if (s->pict_type == I_TYPE) {
370 s->slice_height= s->mb_height/1;
371 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
373 if(s->msmpeg4_version==4){
374 msmpeg4_encode_ext_header(s);
375 if(s->bit_rate>MBAC_BITRATE)
376 put_bits(&s->pb, 1, s->per_mb_rl_table);
379 if(s->msmpeg4_version>2){
380 if(!s->per_mb_rl_table){
381 code012(&s->pb, s->rl_chroma_table_index);
382 code012(&s->pb, s->rl_table_index);
385 put_bits(&s->pb, 1, s->dc_table_index);
388 put_bits(&s->pb, 1, s->use_skip_mb_code);
390 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
391 put_bits(&s->pb, 1, s->per_mb_rl_table);
393 if(s->msmpeg4_version>2){
394 if(!s->per_mb_rl_table)
395 code012(&s->pb, s->rl_table_index);
397 put_bits(&s->pb, 1, s->dc_table_index);
399 put_bits(&s->pb, 1, s->mv_table_index);
402 if(s->flipflop_rounding){
409 s->esc3_level_length= 0;
410 s->esc3_run_length= 0;
414 printf("*****frame %d:\n", frame_count++);
418 void msmpeg4_encode_ext_header(MpegEncContext * s)
420 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
422 put_bits(&s->pb, 11, MIN(s->bit_rate/1024, 2047));
424 if(s->msmpeg4_version<3)
425 s->flipflop_rounding=0;
427 s->flipflop_rounding=1;
428 put_bits(&s->pb, 1, s->flipflop_rounding);
432 /* predict coded block */
433 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
435 int xy, wrap, pred, a, b, c;
437 xy = s->block_index[n];
438 wrap = s->block_wrap[0];
443 a = s->coded_block[xy - 1 ];
444 b = s->coded_block[xy - 1 - wrap];
445 c = s->coded_block[xy - wrap];
454 *coded_block_ptr = &s->coded_block[xy];
459 static void msmpeg4_encode_motion(MpegEncContext * s,
465 /* modulo encoding */
466 /* WARNING : you cannot reach all the MVs even with the modulo
467 encoding. This is a somewhat strange compromise they took !!! */
480 if ((unsigned)mx >= 64 ||
482 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
484 mv = &mv_tables[s->mv_table_index];
486 code = mv->table_mv_index[(mx << 6) | my];
489 mv->table_mv_bits[code],
490 mv->table_mv_code[code]);
492 /* escape : code litterally */
493 put_bits(&s->pb, 6, mx);
494 put_bits(&s->pb, 6, my);
498 static inline void handle_slices(MpegEncContext *s){
500 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
501 if(s->msmpeg4_version != 4){
503 /* reset DC pred (set previous line to 1024) */
504 wrap = 2 * s->mb_width + 2;
505 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
506 1024, 2 * s->mb_width);
507 wrap = s->mb_width + 2;
508 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
510 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
513 /* reset AC pred (set previous line to 0) */
514 wrap = s->mb_width * 2 + 2;
515 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
516 0, 2 * s->mb_width*16);
517 wrap = s->mb_width + 2;
518 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
520 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
523 s->first_slice_line = 1;
525 s->first_slice_line = 0;
530 void msmpeg4_encode_mb(MpegEncContext * s,
531 DCTELEM block[6][64],
532 int motion_x, int motion_y)
534 int cbp, coded_cbp, i;
542 set_stat(ST_INTER_MB);
544 for (i = 0; i < 6; i++) {
545 if (s->block_last_index[i] >= 0)
548 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
549 /* skip macroblock */
550 put_bits(&s->pb, 1, 1);
553 if (s->use_skip_mb_code)
554 put_bits(&s->pb, 1, 0); /* mb coded */
556 if(s->msmpeg4_version<=2){
558 v2_mb_type[cbp&3][1],
559 v2_mb_type[cbp&3][0]);
560 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
564 cbpy_tab[coded_cbp>>2][1],
565 cbpy_tab[coded_cbp>>2][0]);
567 h263_pred_motion(s, 0, &pred_x, &pred_y);
568 msmpeg4v2_encode_motion(s, motion_x - pred_x);
569 msmpeg4v2_encode_motion(s, motion_y - pred_y);
572 table_mb_non_intra[cbp + 64][1],
573 table_mb_non_intra[cbp + 64][0]);
576 h263_pred_motion(s, 0, &pred_x, &pred_y);
577 msmpeg4_encode_motion(s, motion_x - pred_x,
584 for (i = 0; i < 6; i++) {
586 val = (s->block_last_index[i] >= 1);
587 cbp |= val << (5 - i);
589 /* predict value for close blocks only for luma */
590 pred = coded_block_pred(s, i, &coded_block);
594 coded_cbp |= val << (5 - i);
598 printf("cbp=%x %x\n", cbp, coded_cbp);
601 if(s->msmpeg4_version<=2){
602 if (s->pict_type == I_TYPE) {
604 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
606 if (s->use_skip_mb_code)
607 put_bits(&s->pb, 1, 0); /* mb coded */
609 v2_mb_type[(cbp&3) + 4][1],
610 v2_mb_type[(cbp&3) + 4][0]);
612 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
615 cbpy_tab[cbp>>2][0]);
617 if (s->pict_type == I_TYPE) {
618 set_stat(ST_INTRA_MB);
620 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
622 if (s->use_skip_mb_code)
623 put_bits(&s->pb, 1, 0); /* mb coded */
625 table_mb_non_intra[cbp][1],
626 table_mb_non_intra[cbp][0]);
628 set_stat(ST_INTRA_MB);
629 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
630 if(s->inter_intra_pred){
632 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
637 for (i = 0; i < 6; i++) {
638 msmpeg4_encode_block(s, block[i], i);
642 /* old ffmpeg msmpeg4v3 mode */
643 void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
648 }else if (s->qscale < 9){
649 s->y_dc_scale = 2 * s->qscale;
650 s->c_dc_scale = (s->qscale + 13)>>1;
652 s->y_dc_scale = s->qscale + 8;
653 s->c_dc_scale = (s->qscale + 13)>>1;
657 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
668 *dc_val_ptr= &s->last_dc[i];
669 return s->last_dc[i];
672 static int get_dc(uint8_t *src, int stride, int scale)
679 sum+=src[x + y*stride];
682 return (sum + (scale>>1))/scale;
685 /* dir = 0: left, dir = 1: top prediction */
686 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
687 UINT16 **dc_val_ptr, int *dir_ptr)
689 int a, b, c, wrap, pred, scale;
692 /* find prediction */
694 scale = s->y_dc_scale;
696 scale = s->c_dc_scale;
699 wrap = s->block_wrap[n];
700 dc_val= s->dc_val[0] + s->block_index[n];
706 b = dc_val[ - 1 - wrap];
709 /* XXX: the following solution consumes divisions, but it does not
710 necessitate to modify mpegvideo.c. The problem comes from the
711 fact they decided to store the quantized DC (which would lead
712 to problems if Q could vary !) */
713 #if defined ARCH_X86 && !defined PIC
715 "movl %3, %%eax \n\t"
716 "shrl $1, %%eax \n\t"
717 "addl %%eax, %2 \n\t"
718 "addl %%eax, %1 \n\t"
719 "addl %0, %%eax \n\t"
721 "movl %%edx, %0 \n\t"
722 "movl %1, %%eax \n\t"
724 "movl %%edx, %1 \n\t"
725 "movl %2, %%eax \n\t"
727 "movl %%edx, %2 \n\t"
728 : "+b" (a), "+c" (b), "+D" (c)
729 : "g" (scale), "S" (inverse[scale])
733 /* #elif defined (ARCH_ALPHA) */
734 /* Divisions are extremely costly on Alpha; optimize the most
735 common case. But they are costly everywhere...
738 a = (a + (8 >> 1)) / 8;
739 b = (b + (8 >> 1)) / 8;
740 c = (c + (8 >> 1)) / 8;
742 a = (a + (scale >> 1)) / scale;
743 b = (b + (scale >> 1)) / scale;
744 c = (c + (scale >> 1)) / scale;
747 /* XXX: WARNING: they did not choose the same test as MPEG4. This
748 is very important ! */
749 if(s->msmpeg4_version>3){
750 if(s->inter_intra_pred){
761 if (abs(a - b) < abs(b - c)) {
771 dest= s->current_picture[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
774 dest= s->current_picture[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
776 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
777 else a= get_dc(dest-8, wrap, scale*8);
778 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
779 else c= get_dc(dest-8*wrap, wrap, scale*8);
781 if (s->h263_aic_dir==0) {
784 }else if (s->h263_aic_dir==1) {
792 }else if (s->h263_aic_dir==2) {
806 if (abs(a - b) < abs(b - c)) {
815 if (abs(a - b) <= abs(b - c)) {
824 /* update predictor */
825 *dc_val_ptr = &dc_val[0];
831 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
836 if(s->msmpeg4_version==1){
838 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
840 /* update predictor */
844 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
846 /* update predictor */
848 *dc_val = level * s->y_dc_scale;
850 *dc_val = level * s->c_dc_scale;
854 /* do the prediction */
857 if(s->msmpeg4_version<=2){
860 v2_dc_lum_table[level+256][1],
861 v2_dc_lum_table[level+256][0]);
864 v2_dc_chroma_table[level+256][1],
865 v2_dc_chroma_table[level+256][0]);
877 if (s->dc_table_index == 0) {
879 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
881 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
885 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
887 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
892 put_bits(&s->pb, 8, level);
895 put_bits(&s->pb, 1, sign);
900 /* Encoding of a block. Very similar to MPEG4 except for a different
901 escape coding (same as H263) and more vlc tables.
903 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
905 int level, run, last, i, j, last_index;
906 int last_non_zero, sign, slevel;
907 int code, run_diff, dc_pred_dir;
909 const UINT8 *scantable;
913 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
916 rl = &rl_table[s->rl_table_index];
918 rl = &rl_table[3 + s->rl_chroma_table_index];
921 scantable= s->intra_scantable;
922 set_stat(ST_INTRA_AC);
925 rl = &rl_table[3 + s->rl_table_index];
926 if(s->msmpeg4_version<=2)
930 scantable= s->inter_scantable;
931 set_stat(ST_INTER_AC);
934 /* recalculate block_last_index for M$ wmv1 */
935 if(scantable!=zigzag_direct && s->block_last_index[n]>0){
936 for(last_index=63; last_index>=0; last_index--){
937 if(block[scantable[last_index]]) break;
940 last_index = s->block_last_index[n];
942 last_non_zero = i - 1;
943 for (; i <= last_index; i++) {
947 run = i - last_non_zero - 1;
948 last = (i == last_index);
955 if(level<=MAX_LEVEL && run<=MAX_RUN){
956 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
960 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
962 code = get_rl_index(rl, last, run, level);
963 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
967 level1 = level - rl->max_level[last][run];
970 code = get_rl_index(rl, last, run, level1);
973 put_bits(&s->pb, 1, 0);
974 if (level > MAX_LEVEL)
976 run1 = run - rl->max_run[last][level] - run_diff;
979 code = get_rl_index(rl, last, run1, level);
983 put_bits(&s->pb, 1, 0);
984 put_bits(&s->pb, 1, last);
985 if(s->msmpeg4_version==4){
986 if(s->esc3_level_length==0){
987 s->esc3_level_length=8;
988 s->esc3_run_length= 6;
990 put_bits(&s->pb, 6, 3);
992 put_bits(&s->pb, 8, 3);
994 put_bits(&s->pb, s->esc3_run_length, run);
995 put_bits(&s->pb, 1, sign);
996 put_bits(&s->pb, s->esc3_level_length, level);
998 put_bits(&s->pb, 6, run);
999 put_bits(&s->pb, 8, slevel & 0xff);
1003 put_bits(&s->pb, 1, 1);
1004 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1005 put_bits(&s->pb, 1, sign);
1009 put_bits(&s->pb, 1, 1);
1010 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1011 put_bits(&s->pb, 1, sign);
1014 put_bits(&s->pb, 1, sign);
1021 /****************************************/
1022 /* decoding stuff */
1024 static VLC mb_non_intra_vlc;
1025 static VLC mb_intra_vlc;
1026 static VLC dc_lum_vlc[2];
1027 static VLC dc_chroma_vlc[2];
1028 static VLC v2_dc_lum_vlc;
1029 static VLC v2_dc_chroma_vlc;
1030 static VLC cbpy_vlc;
1031 static VLC v2_intra_cbpc_vlc;
1032 static VLC v2_mb_type_vlc;
1033 static VLC v2_mv_vlc;
1034 static VLC v1_intra_cbpc_vlc;
1035 static VLC v1_inter_cbpc_vlc;
1036 static VLC inter_intra_vlc;
1038 /* this table is practically identical to the one from h263 except that its inverted */
1039 static void init_h263_dc_for_msmpeg4(void)
1041 int level, uni_code, uni_len;
1043 for(level=-256; level<256; level++){
1045 /* find number of bits */
1054 l= (-level) ^ ((1 << size) - 1);
1058 /* luminance h263 */
1059 uni_code= DCtab_lum[size][0];
1060 uni_len = DCtab_lum[size][1];
1061 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1064 uni_code<<=size; uni_code|=l;
1067 uni_code<<=1; uni_code|=1;
1071 v2_dc_lum_table[level+256][0]= uni_code;
1072 v2_dc_lum_table[level+256][1]= uni_len;
1074 /* chrominance h263 */
1075 uni_code= DCtab_chrom[size][0];
1076 uni_len = DCtab_chrom[size][1];
1077 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1080 uni_code<<=size; uni_code|=l;
1083 uni_code<<=1; uni_code|=1;
1087 v2_dc_chroma_table[level+256][0]= uni_code;
1088 v2_dc_chroma_table[level+256][1]= uni_len;
1093 /* init all vlc decoding tables */
1094 int ff_msmpeg4_decode_init(MpegEncContext *s)
1096 static int done = 0;
1105 for(i=0;i<NB_RL_TABLES;i++) {
1106 init_rl(&rl_table[i]);
1107 init_vlc_rl(&rl_table[i]);
1111 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
1112 mv->table_mv_bits, 1, 1,
1113 mv->table_mv_code, 2, 2);
1116 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
1117 &table0_dc_lum[0][1], 8, 4,
1118 &table0_dc_lum[0][0], 8, 4);
1119 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
1120 &table0_dc_chroma[0][1], 8, 4,
1121 &table0_dc_chroma[0][0], 8, 4);
1122 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
1123 &table1_dc_lum[0][1], 8, 4,
1124 &table1_dc_lum[0][0], 8, 4);
1125 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
1126 &table1_dc_chroma[0][1], 8, 4,
1127 &table1_dc_chroma[0][0], 8, 4);
1129 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
1130 &v2_dc_lum_table[0][1], 8, 4,
1131 &v2_dc_lum_table[0][0], 8, 4);
1132 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
1133 &v2_dc_chroma_table[0][1], 8, 4,
1134 &v2_dc_chroma_table[0][0], 8, 4);
1136 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
1137 &cbpy_tab[0][1], 2, 1,
1138 &cbpy_tab[0][0], 2, 1);
1139 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
1140 &v2_intra_cbpc[0][1], 2, 1,
1141 &v2_intra_cbpc[0][0], 2, 1);
1142 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
1143 &v2_mb_type[0][1], 2, 1,
1144 &v2_mb_type[0][0], 2, 1);
1145 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
1147 &mvtab[0][0], 2, 1);
1149 init_vlc(&mb_non_intra_vlc, MB_NON_INTRA_VLC_BITS, 128,
1150 &table_mb_non_intra[0][1], 8, 4,
1151 &table_mb_non_intra[0][0], 8, 4);
1152 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
1153 &table_mb_intra[0][1], 4, 2,
1154 &table_mb_intra[0][0], 4, 2);
1156 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
1157 intra_MCBPC_bits, 1, 1,
1158 intra_MCBPC_code, 1, 1);
1159 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
1160 inter_MCBPC_bits, 1, 1,
1161 inter_MCBPC_code, 1, 1);
1163 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
1164 &table_inter_intra[0][1], 2, 1,
1165 &table_inter_intra[0][0], 2, 1);
1170 static int decode012(GetBitContext *gb)
1177 return get_bits1(gb) + 1;
1180 int msmpeg4_decode_picture_header(MpegEncContext * s)
1187 for(i=0; i<s->gb.size*8; i++)
1188 printf("%d", get_bits1(&s->gb));
1189 // get_bits1(&s->gb);
1195 if(s->msmpeg4_version==1){
1196 int start_code, num;
1197 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1198 if(start_code!=0x00000100){
1199 fprintf(stderr, "invalid startcode\n");
1203 num= get_bits(&s->gb, 5); // frame number */
1206 s->pict_type = get_bits(&s->gb, 2) + 1;
1207 if (s->pict_type != I_TYPE &&
1208 s->pict_type != P_TYPE){
1209 fprintf(stderr, "invalid picture type\n");
1215 if(s->pict_type == I_TYPE) had_i=1;
1216 if(!had_i) return -1;
1219 s->qscale = get_bits(&s->gb, 5);
1221 if (s->pict_type == I_TYPE) {
1222 code = get_bits(&s->gb, 5);
1223 if(s->msmpeg4_version==1){
1224 if(code==0 || code>s->mb_height){
1225 fprintf(stderr, "invalid slice height %d\n", code);
1229 s->slice_height = code;
1231 /* 0x17: one slice, 0x18: two slices, ... */
1233 fprintf(stderr, "error, slice code was %X\n", code);
1237 s->slice_height = s->mb_height / (code - 0x16);
1240 switch(s->msmpeg4_version){
1243 s->rl_chroma_table_index = 2;
1244 s->rl_table_index = 2;
1246 s->dc_table_index = 0; //not used
1249 s->rl_chroma_table_index = decode012(&s->gb);
1250 s->rl_table_index = decode012(&s->gb);
1252 s->dc_table_index = get_bits1(&s->gb);
1255 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
1257 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1258 else s->per_mb_rl_table= 0;
1260 if(!s->per_mb_rl_table){
1261 s->rl_chroma_table_index = decode012(&s->gb);
1262 s->rl_table_index = decode012(&s->gb);
1265 s->dc_table_index = get_bits1(&s->gb);
1266 s->inter_intra_pred= 0;
1270 /* printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
1272 s->rl_chroma_table_index,
1278 switch(s->msmpeg4_version){
1281 if(s->msmpeg4_version==1)
1282 s->use_skip_mb_code = 1;
1284 s->use_skip_mb_code = get_bits1(&s->gb);
1285 s->rl_table_index = 2;
1286 s->rl_chroma_table_index = s->rl_table_index;
1287 s->dc_table_index = 0; //not used
1288 s->mv_table_index = 0;
1291 s->use_skip_mb_code = get_bits1(&s->gb);
1292 s->rl_table_index = decode012(&s->gb);
1293 s->rl_chroma_table_index = s->rl_table_index;
1295 s->dc_table_index = get_bits1(&s->gb);
1297 s->mv_table_index = get_bits1(&s->gb);
1300 s->use_skip_mb_code = get_bits1(&s->gb);
1302 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1303 else s->per_mb_rl_table= 0;
1305 if(!s->per_mb_rl_table){
1306 s->rl_table_index = decode012(&s->gb);
1307 s->rl_chroma_table_index = s->rl_table_index;
1310 s->dc_table_index = get_bits1(&s->gb);
1312 s->mv_table_index = get_bits1(&s->gb);
1313 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
1316 /* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
1317 s->use_skip_mb_code,
1319 s->rl_chroma_table_index,
1324 if(s->flipflop_rounding){
1325 s->no_rounding ^= 1;
1331 s->esc3_level_length= 0;
1332 s->esc3_run_length= 0;
1335 printf("*****frame %d:\n", frame_count++);
1340 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1342 int left= buf_size*8 - get_bits_count(&s->gb);
1343 int length= s->msmpeg4_version>=3 ? 17 : 16;
1344 /* the alt_bitstream reader could read over the end so we need to check it */
1345 if(left>=length && left<length+8)
1349 fps= get_bits(&s->gb, 5);
1350 s->bit_rate= get_bits(&s->gb, 11)*1024;
1351 if(s->msmpeg4_version>=3)
1352 s->flipflop_rounding= get_bits1(&s->gb);
1354 s->flipflop_rounding= 0;
1356 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
1358 else if(left<length+8)
1360 s->flipflop_rounding= 0;
1361 printf("ext header missing, %d left\n", left);
1365 fprintf(stderr, "I frame too long, ignoring ext header\n");
1371 static inline void msmpeg4_memsetw(short *tab, int val, int n)
1378 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1380 int range, bit_size, sign, code, bits;
1385 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1387 bit_size = s->f_code - 1;
1388 range = 1 << bit_size;
1401 code = (val >> bit_size) + 1;
1402 bits = val & (range - 1);
1404 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1406 put_bits(&s->pb, bit_size, bits);
1411 /* this is identical to h263 except that its range is multiplied by 2 */
1412 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1414 int code, val, sign, shift;
1416 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
1417 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1423 sign = get_bits1(&s->gb);
1425 val = (code - 1) << shift;
1427 val |= get_bits(&s->gb, shift);
1442 static int msmpeg4v12_decode_mb(MpegEncContext *s,
1443 DCTELEM block[6][64])
1446 if (s->pict_type == P_TYPE) {
1447 if (s->use_skip_mb_code) {
1448 if (get_bits1(&s->gb)) {
1452 s->block_last_index[i] = -1;
1453 s->mv_dir = MV_DIR_FORWARD;
1454 s->mv_type = MV_TYPE_16X16;
1462 if(s->msmpeg4_version==2)
1463 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
1465 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
1466 if(code<0 || code>7){
1467 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1471 s->mb_intra = code >>2;
1476 if(s->msmpeg4_version==2)
1477 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
1479 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
1481 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1489 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
1491 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1496 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
1498 h263_pred_motion(s, 0, &mx, &my);
1499 mx= msmpeg4v2_decode_motion(s, mx, 1);
1500 my= msmpeg4v2_decode_motion(s, my, 1);
1502 s->mv_dir = MV_DIR_FORWARD;
1503 s->mv_type = MV_TYPE_16X16;
1504 s->mv[0][0][0] = mx;
1505 s->mv[0][0][1] = my;
1507 if(s->msmpeg4_version==2){
1508 s->ac_pred = get_bits1(&s->gb);
1509 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
1512 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
1513 if(s->pict_type==P_TYPE) cbp^=0x3C;
1517 for (i = 0; i < 6; i++) {
1518 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1520 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1527 int msmpeg4_decode_mb(MpegEncContext *s,
1528 DCTELEM block[6][64])
1536 if(s->mb_y==0) printf("\n");
1539 /* special slice handling */
1542 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps
1544 if (s->pict_type == P_TYPE) {
1545 set_stat(ST_INTER_MB);
1546 if (s->use_skip_mb_code) {
1547 if (get_bits1(&s->gb)) {
1551 s->block_last_index[i] = -1;
1552 s->mv_dir = MV_DIR_FORWARD;
1553 s->mv_type = MV_TYPE_16X16;
1564 code = get_vlc2(&s->gb, mb_non_intra_vlc.table, MB_NON_INTRA_VLC_BITS, 3);
1567 //s->mb_intra = (code & 0x40) ? 0 : 1;
1568 s->mb_intra = (~code & 0x40) >> 6;
1572 set_stat(ST_INTRA_MB);
1574 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
1577 /* predict coded block pattern */
1580 int val = ((code >> (5 - i)) & 1);
1582 int pred = coded_block_pred(s, i, &coded_val);
1586 cbp |= val << (5 - i);
1592 //printf("P at %d %d\n", s->mb_x, s->mb_y);
1593 if(s->per_mb_rl_table && cbp){
1594 s->rl_table_index = decode012(&s->gb);
1595 s->rl_chroma_table_index = s->rl_table_index;
1598 h263_pred_motion(s, 0, &mx, &my);
1599 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1601 s->mv_dir = MV_DIR_FORWARD;
1602 s->mv_type = MV_TYPE_16X16;
1603 s->mv[0][0][0] = mx;
1604 s->mv[0][0][1] = my;
1609 //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));
1610 set_stat(ST_INTRA_MB);
1611 s->ac_pred = get_bits1(&s->gb);
1613 printf("%c", s->ac_pred ? 'A' : 'I');
1615 if(s->inter_intra_pred){
1616 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
1617 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1619 if(s->per_mb_rl_table && cbp){
1620 s->rl_table_index = decode012(&s->gb);
1621 s->rl_chroma_table_index = s->rl_table_index;
1625 for (i = 0; i < 6; i++) {
1626 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1628 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1635 //#define ERROR_DETAILS
1636 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1639 int level, i, last, run, run_diff;
1642 RL_VLC_ELEM *rl_vlc;
1643 const UINT8 *scan_table;
1652 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1657 if(n==4) printf("%X", c);
1662 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
1663 if(s->inter_intra_pred) level=0;
1667 rl = &rl_table[s->rl_table_index];
1668 if(level > 256*s->y_dc_scale){
1669 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale);
1670 if(!s->inter_intra_pred) return -1;
1673 rl = &rl_table[3 + s->rl_chroma_table_index];
1674 if(level > 256*s->c_dc_scale){
1675 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale);
1676 if(!s->inter_intra_pred) return -1;
1687 if (dc_pred_dir == 0)
1688 scan_table = s->intra_v_scantable; /* left */
1690 scan_table = s->intra_h_scantable; /* top */
1692 scan_table = s->intra_scantable;
1694 set_stat(ST_INTRA_AC);
1695 rl_vlc= rl->rl_vlc[0];
1697 qmul = s->qscale << 1;
1698 qadd = (s->qscale - 1) | 1;
1700 rl = &rl_table[3 + s->rl_table_index];
1702 if(s->msmpeg4_version==2)
1708 s->block_last_index[n] = i;
1711 scan_table = s->inter_scantable;
1712 set_stat(ST_INTER_AC);
1713 rl_vlc= rl->rl_vlc[s->qscale];
1716 OPEN_READER(re, &s->gb);
1718 UPDATE_CACHE(re, &s->gb);
1719 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1722 cache= GET_CACHE(re, &s->gb);
1724 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1725 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
1727 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1728 UPDATE_CACHE(re, &s->gb);
1729 if(s->msmpeg4_version<=3){
1730 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1731 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1732 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1733 SKIP_COUNTER(re, &s->gb, 1+6+8);
1736 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
1737 if(!s->esc3_level_length){
1739 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1741 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
1743 if(SHOW_UBITS(re, &s->gb, 1)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1744 SKIP_BITS(re, &s->gb, 1);
1749 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1751 SKIP_BITS(re, &s->gb, 1);
1753 if(ll<8) SKIP_BITS(re, &s->gb, 1);
1756 s->esc3_level_length= ll;
1757 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
1758 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
1759 UPDATE_CACHE(re, &s->gb);
1761 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
1762 SKIP_BITS(re, &s->gb, s->esc3_run_length);
1764 sign= SHOW_UBITS(re, &s->gb, 1);
1765 SKIP_BITS(re, &s->gb, 1);
1767 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
1768 SKIP_BITS(re, &s->gb, s->esc3_level_length);
1769 if(sign) level= -level;
1771 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
1772 #if 0 // waste of time / this will detect very few errors
1774 const int abs_level= ABS(level);
1775 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1776 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1777 if(abs_level <= rl->max_level[last][run]){
1778 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1779 return DECODING_AC_LOST;
1781 if(abs_level <= rl->max_level[last][run]*2){
1782 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1783 return DECODING_AC_LOST;
1785 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
1786 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1787 return DECODING_AC_LOST;
1792 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1793 if (level>0) level= level * qmul + qadd;
1794 else level= level * qmul - qadd;
1795 #if 0 // waste of time too :(
1796 if(level>2048 || level<-2048){
1797 fprintf(stderr, "|level| overflow in 3. esc\n");
1798 return DECODING_AC_LOST;
1803 #ifdef ERROR_DETAILS
1805 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
1806 else if((i>62 && i<192) || i>192+63)
1807 fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
1811 #if MIN_CACHE_BITS < 23
1812 LAST_SKIP_BITS(re, &s->gb, 2);
1813 UPDATE_CACHE(re, &s->gb);
1815 SKIP_BITS(re, &s->gb, 2);
1817 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1818 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1819 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1820 LAST_SKIP_BITS(re, &s->gb, 1);
1821 #ifdef ERROR_DETAILS
1823 fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
1824 else if((i>62 && i<192) || i>192+63)
1825 fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
1830 #if MIN_CACHE_BITS < 22
1831 LAST_SKIP_BITS(re, &s->gb, 1);
1832 UPDATE_CACHE(re, &s->gb);
1834 SKIP_BITS(re, &s->gb, 1);
1836 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1838 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1839 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1840 LAST_SKIP_BITS(re, &s->gb, 1);
1841 #ifdef ERROR_DETAILS
1843 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
1844 else if((i>62 && i<192) || i>192+63)
1845 fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
1850 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1851 LAST_SKIP_BITS(re, &s->gb, 1);
1852 #ifdef ERROR_DETAILS
1854 fprintf(stderr, "illegal vlc code level=%d\n", level);
1855 else if((i>62 && i<192) || i>192+63)
1856 fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
1862 if(i+192 == 64 && level/qmul==-1){
1863 fprintf(stderr, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
1866 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1871 block[scan_table[i]] = level;
1875 block[scan_table[i]] = level;
1877 CLOSE_READER(re, &s->gb);
1881 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1883 i = 63; /* XXX: not optimal */
1886 if(s->msmpeg4_version==4 && i>0) i=63; //FIXME/XXX optimize
1887 s->block_last_index[n] = i;
1892 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1896 if(s->msmpeg4_version<=2){
1898 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
1900 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
1905 }else{ //FIXME optimize use unified tables & index
1907 level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1909 level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1912 fprintf(stderr, "illegal dc vlc\n");
1916 if (level == DC_MAX) {
1917 level = get_bits(&s->gb, 8);
1918 if (get_bits1(&s->gb))
1920 } else if (level != 0) {
1921 if (get_bits1(&s->gb))
1926 if(s->msmpeg4_version==1){
1928 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1931 /* update predictor */
1935 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1938 /* update predictor */
1940 *dc_val = level * s->y_dc_scale;
1942 *dc_val = level * s->c_dc_scale;
1949 static int msmpeg4_decode_motion(MpegEncContext * s,
1950 int *mx_ptr, int *my_ptr)
1955 mv = &mv_tables[s->mv_table_index];
1957 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
1959 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
1962 if (code == mv->n) {
1963 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1964 mx = get_bits(&s->gb, 6);
1965 my = get_bits(&s->gb, 6);
1967 mx = mv->table_mvx[code];
1968 my = mv->table_mvy[code];
1973 /* WARNING : they do not do exactly modulo encoding */