2 * MSMPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2001 Gerard Lantau.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 /* motion vector table */
36 typedef struct MVTable {
38 const UINT16 *table_mv_code;
39 const UINT8 *table_mv_bits;
40 const UINT8 *table_mvx;
41 const UINT8 *table_mvy;
42 UINT16 *table_mv_index; /* encoding: convert mv to index in table_mv */
43 VLC vlc; /* decoding: vlc */
46 static UINT32 v2_dc_lum_table[512][2];
47 static UINT32 v2_dc_chroma_table[512][2];
49 static void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
50 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
52 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
53 static int msmpeg4_decode_motion(MpegEncContext * s,
54 int *mx_ptr, int *my_ptr);
56 extern UINT32 inverse[256];
62 /* XXX: move it to mpegvideo.h */
64 static int init_done = 0;
66 #include "msmpeg4data.h"
70 const char *st_names[ST_NB] = {
80 int st_current_index = 0;
81 unsigned int st_bit_counts[ST_NB];
82 unsigned int st_out_bit_counts[ST_NB];
84 #define set_stat(var) st_current_index = var;
86 void print_stats(void)
94 total += st_bit_counts[i];
97 for(i=0;i<ST_NB;i++) {
98 printf("%-10s : %10.1f %5.1f%%\n",
100 (double)st_bit_counts[i] / 8.0,
101 (double)st_bit_counts[i] * 100.0 / total);
103 printf("%-10s : %10.1f %5.1f%%\n",
111 total += st_out_bit_counts[i];
114 for(i=0;i<ST_NB;i++) {
115 printf("%-10s : %10.1f %5.1f%%\n",
117 (double)st_out_bit_counts[i] / 8.0,
118 (double)st_out_bit_counts[i] * 100.0 / total);
120 printf("%-10s : %10.1f %5.1f%%\n",
128 #define set_stat(var)
132 /* build the table which associate a (x,y) motion vector to a vlc */
133 static void init_mv_table(MVTable *tab)
137 tab->table_mv_index = malloc(sizeof(UINT16) * 4096);
138 /* mark all entries as not used */
140 tab->table_mv_index[i] = tab->n;
142 for(i=0;i<tab->n;i++) {
143 x = tab->table_mvx[i];
144 y = tab->table_mvy[i];
145 tab->table_mv_index[(x << 6) | y] = i;
149 static void code012(PutBitContext *pb, int n)
155 put_bits(pb, 1, (n >= 2));
159 /* write MSMPEG4 V3 compatible frame header */
160 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
164 align_put_bits(&s->pb);
166 put_bits(&s->pb, 2, s->pict_type - 1);
168 put_bits(&s->pb, 5, s->qscale);
170 s->rl_table_index = 2;
171 s->rl_chroma_table_index = 1; /* only for I frame */
172 s->dc_table_index = 1;
173 s->mv_table_index = 1; /* only if P frame */
174 s->use_skip_mb_code = 1; /* only if P frame */
176 if (s->pict_type == I_TYPE) {
177 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */
179 code012(&s->pb, s->rl_chroma_table_index);
180 code012(&s->pb, s->rl_table_index);
182 put_bits(&s->pb, 1, s->dc_table_index);
185 put_bits(&s->pb, 1, s->use_skip_mb_code);
187 s->rl_chroma_table_index = s->rl_table_index;
188 code012(&s->pb, s->rl_table_index);
190 put_bits(&s->pb, 1, s->dc_table_index);
192 put_bits(&s->pb, 1, s->mv_table_index);
194 if(s->flipflop_rounding){
202 /* init various encoding tables */
204 init_mv_table(&mv_tables[0]);
205 init_mv_table(&mv_tables[1]);
206 for(i=0;i<NB_RL_TABLES;i++)
207 init_rl(&rl_table[i]);
212 printf("*****frame %d:\n", frame_count++);
216 void msmpeg4_encode_ext_header(MpegEncContext * s)
218 s->flipflop_rounding=1;
219 s->bitrate= 910; // FIXME
221 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
223 put_bits(&s->pb, 11, s->bitrate);
225 put_bits(&s->pb, 1, s->flipflop_rounding);
228 /* predict coded block */
229 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
231 int xy, wrap, pred, a, b, c;
233 xy = s->block_index[n];
234 wrap = s->block_wrap[0];
239 a = s->coded_block[xy - 1 ];
240 b = s->coded_block[xy - 1 - wrap];
241 c = s->coded_block[xy - wrap];
250 *coded_block_ptr = &s->coded_block[xy];
255 static void msmpeg4_encode_motion(MpegEncContext * s,
261 /* modulo encoding */
262 /* WARNING : you cannot reach all the MVs even with the modulo
263 encoding. This is a somewhat strange compromise they took !!! */
276 if ((unsigned)mx >= 64 ||
278 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
280 mv = &mv_tables[s->mv_table_index];
282 code = mv->table_mv_index[(mx << 6) | my];
285 mv->table_mv_bits[code],
286 mv->table_mv_code[code]);
288 /* escape : code litterally */
289 put_bits(&s->pb, 6, mx);
290 put_bits(&s->pb, 6, my);
294 void msmpeg4_encode_mb(MpegEncContext * s,
295 DCTELEM block[6][64],
296 int motion_x, int motion_y)
298 int cbp, coded_cbp, i;
304 set_stat(ST_INTER_MB);
306 for (i = 0; i < 6; i++) {
307 if (s->block_last_index[i] >= 0)
310 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
311 /* skip macroblock */
312 put_bits(&s->pb, 1, 1);
315 if (s->use_skip_mb_code)
316 put_bits(&s->pb, 1, 0); /* mb coded */
319 table_mb_non_intra[cbp + 64][1],
320 table_mb_non_intra[cbp + 64][0]);
323 h263_pred_motion(s, 0, &pred_x, &pred_y);
324 msmpeg4_encode_motion(s, motion_x - pred_x,
330 for (i = 0; i < 6; i++) {
332 val = (s->block_last_index[i] >= 1);
333 cbp |= val << (5 - i);
335 /* predict value for close blocks only for luma */
336 pred = coded_block_pred(s, i, &coded_block);
340 coded_cbp |= val << (5 - i);
344 printf("cbp=%x %x\n", cbp, coded_cbp);
347 if (s->pict_type == I_TYPE) {
348 set_stat(ST_INTRA_MB);
350 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
352 if (s->use_skip_mb_code)
353 put_bits(&s->pb, 1, 0); /* mb coded */
355 table_mb_non_intra[cbp][1],
356 table_mb_non_intra[cbp][0]);
358 set_stat(ST_INTRA_MB);
359 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
362 for (i = 0; i < 6; i++) {
363 msmpeg4_encode_block(s, block[i], i);
368 /* strongly inspirated from MPEG4, but not exactly the same ! */
369 void msmpeg4_dc_scale(MpegEncContext * s)
371 if (s->qscale < 5 || s->msmpeg4_version==2){
374 }else if (s->qscale < 9){
375 s->y_dc_scale = 2 * s->qscale;
376 s->c_dc_scale = (s->qscale + 13)>>1;
378 s->y_dc_scale = s->qscale + 8;
379 s->c_dc_scale = (s->qscale + 13)>>1;
383 /* dir = 0: left, dir = 1: top prediction */
384 static int msmpeg4_pred_dc(MpegEncContext * s, int n,
385 INT16 **dc_val_ptr, int *dir_ptr)
387 int a, b, c, wrap, pred, scale;
390 /* find prediction */
392 scale = s->y_dc_scale;
394 scale = s->c_dc_scale;
396 wrap = s->block_wrap[n];
397 dc_val= s->dc_val[0] + s->block_index[n];
403 b = dc_val[ - 1 - wrap];
406 /* XXX: the following solution consumes divisions, but it does not
407 necessitate to modify mpegvideo.c. The problem comes from the
408 fact they decided to store the quantized DC (which would lead
409 to problems if Q could vary !) */
410 #if defined ARCH_X86 && !defined PIC
412 "movl %3, %%eax \n\t"
413 "shrl $1, %%eax \n\t"
414 "addl %%eax, %2 \n\t"
415 "addl %%eax, %1 \n\t"
416 "addl %0, %%eax \n\t"
418 "movl %%edx, %0 \n\t"
419 "movl %1, %%eax \n\t"
421 "movl %%edx, %1 \n\t"
422 "movl %2, %%eax \n\t"
424 "movl %%edx, %2 \n\t"
425 : "+b" (a), "+c" (b), "+D" (c)
426 : "g" (scale), "S" (inverse[scale])
430 /* #elif defined (ARCH_ALPHA) */
431 /* Divisions are extremely costly on Alpha; optimize the most
432 common case. But they are costly everywhere...
435 a = (a + (8 >> 1)) / 8;
436 b = (b + (8 >> 1)) / 8;
437 c = (c + (8 >> 1)) / 8;
439 a = (a + (scale >> 1)) / scale;
440 b = (b + (scale >> 1)) / scale;
441 c = (c + (scale >> 1)) / scale;
444 /* XXX: WARNING: they did not choose the same test as MPEG4. This
445 is very important ! */
446 if (abs(a - b) <= abs(b - c)) {
454 /* update predictor */
455 *dc_val_ptr = &dc_val[0];
461 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
467 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
469 /* update predictor */
471 *dc_val = level * s->y_dc_scale;
473 *dc_val = level * s->c_dc_scale;
476 /* do the prediction */
489 if (s->dc_table_index == 0) {
491 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
493 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
497 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
499 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
504 put_bits(&s->pb, 8, level);
507 put_bits(&s->pb, 1, sign);
511 /* Encoding of a block. Very similar to MPEG4 except for a different
512 escape coding (same as H263) and more vlc tables.
514 static void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
516 int level, run, last, i, j, last_index;
517 int last_non_zero, sign, slevel;
518 int code, run_diff, dc_pred_dir;
523 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
526 rl = &rl_table[s->rl_table_index];
528 rl = &rl_table[3 + s->rl_chroma_table_index];
531 set_stat(ST_INTRA_AC);
534 rl = &rl_table[3 + s->rl_table_index];
536 set_stat(ST_INTER_AC);
540 last_index = s->block_last_index[n];
541 last_non_zero = i - 1;
542 for (; i <= last_index; i++) {
543 j = zigzag_direct[i];
546 run = i - last_non_zero - 1;
547 last = (i == last_index);
554 code = get_rl_index(rl, last, run, level);
555 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
559 level1 = level - rl->max_level[last][run];
562 code = get_rl_index(rl, last, run, level1);
565 put_bits(&s->pb, 1, 0);
566 if (level > MAX_LEVEL)
568 run1 = run - rl->max_run[last][level] - run_diff;
571 code = get_rl_index(rl, last, run1, level);
575 put_bits(&s->pb, 1, 0);
576 put_bits(&s->pb, 1, last);
577 put_bits(&s->pb, 6, run);
578 put_bits(&s->pb, 8, slevel & 0xff);
581 put_bits(&s->pb, 1, 1);
582 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
583 put_bits(&s->pb, 1, sign);
587 put_bits(&s->pb, 1, 1);
588 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
589 put_bits(&s->pb, 1, sign);
592 put_bits(&s->pb, 1, sign);
599 /****************************************/
602 static VLC mb_non_intra_vlc;
603 static VLC mb_intra_vlc;
604 static VLC dc_lum_vlc[2];
605 static VLC dc_chroma_vlc[2];
606 static VLC v2_dc_lum_vlc;
607 static VLC v2_dc_chroma_vlc;
609 static VLC v2_intra_cbpc_vlc;
610 static VLC v2_mb_type_vlc;
611 static VLC v2_mv_vlc;
613 /* this table is practically identical to the one from h263 except that its inverted */
614 static void init_h263_dc_for_msmpeg4()
619 int level, uni_code, uni_len;
622 for(level=-256; level<256; level++){
624 /* find number of bits */
633 l= (-level) ^ ((1 << size) - 1);
638 uni_code= DCtab_lum[size][0];
639 uni_len = DCtab_lum[size][1];
640 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
643 uni_code<<=size; uni_code|=l;
646 uni_code<<=1; uni_code|=1;
650 v2_dc_lum_table[level+256][0]= uni_code;
651 v2_dc_lum_table[level+256][1]= uni_len;
653 /* chrominance h263 */
654 uni_code= DCtab_chrom[size][0];
655 uni_len = DCtab_chrom[size][1];
656 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
659 uni_code<<=size; uni_code|=l;
662 uni_code<<=1; uni_code|=1;
666 v2_dc_chroma_table[level+256][0]= uni_code;
667 v2_dc_chroma_table[level+256][1]= uni_len;
673 /* init all vlc decoding tables */
674 int msmpeg4_decode_init_vlc(MpegEncContext *s)
679 for(i=0;i<NB_RL_TABLES;i++) {
680 init_rl(&rl_table[i]);
681 init_vlc_rl(&rl_table[i]);
685 init_vlc(&mv->vlc, 9, mv->n + 1,
686 mv->table_mv_bits, 1, 1,
687 mv->table_mv_code, 2, 2);
690 init_vlc(&dc_lum_vlc[0], 9, 120,
691 &table0_dc_lum[0][1], 8, 4,
692 &table0_dc_lum[0][0], 8, 4);
693 init_vlc(&dc_chroma_vlc[0], 9, 120,
694 &table0_dc_chroma[0][1], 8, 4,
695 &table0_dc_chroma[0][0], 8, 4);
696 init_vlc(&dc_lum_vlc[1], 9, 120,
697 &table1_dc_lum[0][1], 8, 4,
698 &table1_dc_lum[0][0], 8, 4);
699 init_vlc(&dc_chroma_vlc[1], 9, 120,
700 &table1_dc_chroma[0][1], 8, 4,
701 &table1_dc_chroma[0][0], 8, 4);
703 init_h263_dc_for_msmpeg4();
704 init_vlc(&v2_dc_lum_vlc, 9, 512,
705 &v2_dc_lum_table[0][1], 8, 4,
706 &v2_dc_lum_table[0][0], 8, 4);
707 init_vlc(&v2_dc_chroma_vlc, 9, 512,
708 &v2_dc_chroma_table[0][1], 8, 4,
709 &v2_dc_chroma_table[0][0], 8, 4);
711 init_vlc(&cbpy_vlc, 6, 16,
712 &cbpy_tab[0][1], 2, 1,
713 &cbpy_tab[0][0], 2, 1);
714 init_vlc(&v2_intra_cbpc_vlc, 3, 4,
715 &v2_intra_cbpc[0][1], 2, 1,
716 &v2_intra_cbpc[0][0], 2, 1);
717 init_vlc(&v2_mb_type_vlc, 5, 8,
718 &v2_mb_type[0][1], 2, 1,
719 &v2_mb_type[0][0], 2, 1);
720 init_vlc(&v2_mv_vlc, 9, 33,
724 init_vlc(&mb_non_intra_vlc, 9, 128,
725 &table_mb_non_intra[0][1], 8, 4,
726 &table_mb_non_intra[0][0], 8, 4);
727 init_vlc(&mb_intra_vlc, 9, 64,
728 &table_mb_intra[0][1], 4, 2,
729 &table_mb_intra[0][0], 4, 2);
733 static int decode012(GetBitContext *gb)
740 return get_bits1(gb) + 1;
743 int msmpeg4_decode_picture_header(MpegEncContext * s)
747 s->pict_type = get_bits(&s->gb, 2) + 1;
748 if (s->pict_type != I_TYPE &&
749 s->pict_type != P_TYPE)
752 s->qscale = get_bits(&s->gb, 5);
754 if (s->pict_type == I_TYPE) {
755 code = get_bits(&s->gb, 5);
756 /* 0x17: one slice, 0x18: two slices */
759 s->slice_height = s->mb_height / (code - 0x16);
760 if(s->msmpeg4_version==2){
761 s->rl_chroma_table_index = 2;
762 s->rl_table_index = 2;
764 s->dc_table_index = 0; //not used
766 s->rl_chroma_table_index = decode012(&s->gb);
767 s->rl_table_index = decode012(&s->gb);
769 s->dc_table_index = get_bits1(&s->gb);
772 /* printf(" %d %d %d %d \n",
774 s->rl_chroma_table_index,
776 s->dc_table_index);*/
778 s->use_skip_mb_code = get_bits1(&s->gb);
780 if(s->msmpeg4_version==2){
781 s->rl_table_index = 2;
782 s->rl_chroma_table_index = s->rl_table_index;
784 s->dc_table_index = 0; //not used
786 s->mv_table_index = 0;
788 s->rl_table_index = decode012(&s->gb);
789 s->rl_chroma_table_index = s->rl_table_index;
791 s->dc_table_index = get_bits1(&s->gb);
793 s->mv_table_index = get_bits1(&s->gb);
795 /* printf(" %d %d %d %d %d \n",
798 s->rl_chroma_table_index,
800 s->mv_table_index);*/
801 if(s->flipflop_rounding){
806 // printf("%d", s->no_rounding);
810 if(s->msmpeg4_version==2)
813 for(i=0; i<s->gb.size*8; i++)
814 // printf("%d", get_bits1(&s->gb));
822 printf("*****frame %d:\n", frame_count++);
827 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
829 /* the alt_bitstream reader could read over the end so we need to check it */
830 if(get_bits_count(&s->gb) + 16 < buf_size*8)
834 fps= get_bits(&s->gb, 5);
835 s->bitrate= get_bits(&s->gb, 11);
836 s->flipflop_rounding= get_bits1(&s->gb);
838 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding);
842 s->flipflop_rounding= 0;
849 static inline void memsetw(short *tab, int val, int n)
856 /* this is identical to h263 except that its range is multiplied by 2 */
857 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
859 int code, val, sign, shift;
861 code = get_vlc(&s->gb, &v2_mv_vlc);
867 sign = get_bits1(&s->gb);
869 val = (code - 1) << shift;
871 val |= get_bits(&s->gb, shift);
886 int msmpeg4v2_decode_mb(MpegEncContext *s,
887 DCTELEM block[6][64])
890 if (s->pict_type == P_TYPE) {
891 if (s->use_skip_mb_code) {
892 if (get_bits1(&s->gb)) {
896 s->block_last_index[i] = -1;
897 s->mv_dir = MV_DIR_FORWARD;
898 s->mv_type = MV_TYPE_16X16;
906 code = get_vlc(&s->gb, &v2_mb_type_vlc);
907 s->mb_intra = code >>2;
912 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
918 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
919 if((cbp&3) != 3) cbp^= 0x3C;
921 h263_pred_motion(s, 0, &mx, &my);
922 mx= msmpeg4v2_decode_motion(s, mx, 1);
923 my= msmpeg4v2_decode_motion(s, my, 1);
925 s->mv_dir = MV_DIR_FORWARD;
926 s->mv_type = MV_TYPE_16X16;
930 s->ac_pred = get_bits1(&s->gb);
931 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
934 for (i = 0; i < 6; i++) {
935 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
937 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
944 int msmpeg4_decode_mb(MpegEncContext *s,
945 DCTELEM block[6][64])
950 /* special slice handling */
952 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
954 /* reset DC pred (set previous line to 1024) */
955 wrap = 2 * s->mb_width + 2;
956 memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
957 1024, 2 * s->mb_width);
958 wrap = s->mb_width + 2;
959 memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
961 memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
964 /* reset AC pred (set previous line to 0) */
965 wrap = s->mb_width * 2 + 2;
966 memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
967 0, 2 * s->mb_width*16);
968 wrap = s->mb_width + 2;
969 memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
971 memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
974 s->first_slice_line = 1;
976 s->first_slice_line = 0;
980 if(s->msmpeg4_version==2) return msmpeg4v2_decode_mb(s, block); //FIXME merge if possible
982 if (s->pict_type == P_TYPE) {
983 set_stat(ST_INTER_MB);
984 if (s->use_skip_mb_code) {
985 if (get_bits1(&s->gb)) {
989 s->block_last_index[i] = -1;
990 s->mv_dir = MV_DIR_FORWARD;
991 s->mv_type = MV_TYPE_16X16;
999 code = get_vlc(&s->gb, &mb_non_intra_vlc);
1002 //s->mb_intra = (code & 0x40) ? 0 : 1;
1003 s->mb_intra = (~code & 0x40) >> 6;
1007 set_stat(ST_INTRA_MB);
1009 code = get_vlc(&s->gb, &mb_intra_vlc);
1012 /* predict coded block pattern */
1015 int val = ((code >> (5 - i)) & 1);
1017 int pred = coded_block_pred(s, i, &coded_val);
1021 cbp |= val << (5 - i);
1028 h263_pred_motion(s, 0, &mx, &my);
1029 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1031 s->mv_dir = MV_DIR_FORWARD;
1032 s->mv_type = MV_TYPE_16X16;
1033 s->mv[0][0][0] = mx;
1034 s->mv[0][0][1] = my;
1036 set_stat(ST_INTRA_MB);
1037 s->ac_pred = get_bits1(&s->gb);
1040 for (i = 0; i < 6; i++) {
1041 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1043 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1050 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1053 int code, level, i, j, last, run, run_diff;
1056 const UINT8 *scan_table;
1065 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1070 rl = &rl_table[s->rl_table_index];
1072 rl = &rl_table[3 + s->rl_chroma_table_index];
1081 if (dc_pred_dir == 0)
1082 scan_table = ff_alternate_vertical_scan; /* left */
1084 scan_table = ff_alternate_horizontal_scan; /* top */
1086 scan_table = zigzag_direct;
1088 set_stat(ST_INTRA_AC);
1090 qmul = s->qscale << 1;
1091 qadd = (s->qscale - 1) | 1;
1093 rl = &rl_table[3 + s->rl_table_index];
1095 if(s->msmpeg4_version==2)
1101 s->block_last_index[n] = i - 1;
1104 scan_table = zigzag_direct;
1105 set_stat(ST_INTER_AC);
1109 code = get_vlc(&s->gb, &rl->vlc);
1112 if (code == rl->n) {
1114 if (get_bits1(&s->gb) == 0) {
1115 if (get_bits1(&s->gb) == 0) {
1117 last = get_bits1(&s->gb);
1118 run = get_bits(&s->gb, 6);
1119 level = get_bits(&s->gb, 8);
1120 level = (level << 24) >> 24; /* sign extend */
1121 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1122 if (level>0) level= level * qmul + qadd;
1123 else level= level * qmul - qadd;
1126 code = get_vlc(&s->gb, &rl->vlc);
1127 if (code < 0 || code >= rl->n)
1129 run = rl->table_run[code];
1130 level = rl->table_level[code];
1131 last = code >= rl->last;
1132 run += rl->max_run[last][level] + run_diff;
1133 level= level * qmul + qadd;
1134 if (get_bits1(&s->gb))
1139 code = get_vlc(&s->gb, &rl->vlc);
1140 if (code < 0 || code >= rl->n)
1142 run = rl->table_run[code];
1143 level = rl->table_level[code];
1144 last = code >= rl->last;
1145 level += rl->max_level[last][run];
1146 level= level * qmul + qadd;
1147 if (get_bits1(&s->gb))
1151 run = rl->table_run[code];
1152 level = rl->table_level[code] * qmul + qadd;
1153 last = code >= rl->last;
1154 if (get_bits1(&s->gb))
1168 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1170 i = 64; /* XXX: not optimal */
1173 s->block_last_index[n] = i - 1;
1178 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1183 if(s->msmpeg4_version==2){
1185 level = get_vlc(&s->gb, &v2_dc_lum_vlc);
1187 level = get_vlc(&s->gb, &v2_dc_chroma_vlc);
1192 }else{ //FIXME optimize use unified tables & index
1194 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]);
1196 level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]);
1201 if (level == DC_MAX) {
1202 level = get_bits(&s->gb, 8);
1203 if (get_bits1(&s->gb))
1205 } else if (level != 0) {
1206 if (get_bits1(&s->gb))
1211 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1214 /* update predictor */
1216 *dc_val = level * s->y_dc_scale;
1218 *dc_val = level * s->c_dc_scale;
1224 static int msmpeg4_decode_motion(MpegEncContext * s,
1225 int *mx_ptr, int *my_ptr)
1230 mv = &mv_tables[s->mv_table_index];
1232 code = get_vlc(&s->gb, &mv->vlc);
1235 if (code == mv->n) {
1236 mx = get_bits(&s->gb, 6);
1237 my = get_bits(&s->gb, 6);
1239 mx = mv->table_mvx[code];
1240 my = mv->table_mvy[code];
1245 /* WARNING : they do not do exactly modulo encoding */