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);
55 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
56 static void init_h263_dc_for_msmpeg4();
59 extern UINT32 inverse[256];
65 /* XXX: move it to mpegvideo.h */
67 static int init_done = 0;
69 #include "msmpeg4data.h"
73 const char *st_names[ST_NB] = {
83 int st_current_index = 0;
84 unsigned int st_bit_counts[ST_NB];
85 unsigned int st_out_bit_counts[ST_NB];
87 #define set_stat(var) st_current_index = var;
89 void print_stats(void)
97 total += st_bit_counts[i];
100 for(i=0;i<ST_NB;i++) {
101 printf("%-10s : %10.1f %5.1f%%\n",
103 (double)st_bit_counts[i] / 8.0,
104 (double)st_bit_counts[i] * 100.0 / total);
106 printf("%-10s : %10.1f %5.1f%%\n",
114 total += st_out_bit_counts[i];
117 for(i=0;i<ST_NB;i++) {
118 printf("%-10s : %10.1f %5.1f%%\n",
120 (double)st_out_bit_counts[i] / 8.0,
121 (double)st_out_bit_counts[i] * 100.0 / total);
123 printf("%-10s : %10.1f %5.1f%%\n",
131 #define set_stat(var)
135 /* build the table which associate a (x,y) motion vector to a vlc */
136 static void init_mv_table(MVTable *tab)
140 tab->table_mv_index = malloc(sizeof(UINT16) * 4096);
141 /* mark all entries as not used */
143 tab->table_mv_index[i] = tab->n;
145 for(i=0;i<tab->n;i++) {
146 x = tab->table_mvx[i];
147 y = tab->table_mvy[i];
148 tab->table_mv_index[(x << 6) | y] = i;
152 static void code012(PutBitContext *pb, int n)
158 put_bits(pb, 1, (n >= 2));
162 /* write MSMPEG4 V3 compatible frame header */
163 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
167 align_put_bits(&s->pb);
169 put_bits(&s->pb, 2, s->pict_type - 1);
171 put_bits(&s->pb, 5, s->qscale);
173 s->rl_table_index = 2;
174 if(s->msmpeg4_version==2)
175 s->rl_chroma_table_index = 2; /* only for I frame */
177 s->rl_chroma_table_index = 1; /* only for I frame */
179 s->dc_table_index = 1;
180 s->mv_table_index = 1; /* only if P frame */
181 s->use_skip_mb_code = 1; /* only if P frame */
183 if (s->pict_type == I_TYPE) {
184 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */
186 if(s->msmpeg4_version!=2){
187 code012(&s->pb, s->rl_chroma_table_index);
188 code012(&s->pb, s->rl_table_index);
190 put_bits(&s->pb, 1, s->dc_table_index);
194 put_bits(&s->pb, 1, s->use_skip_mb_code);
196 s->rl_chroma_table_index = s->rl_table_index;
197 if(s->msmpeg4_version!=2){
198 code012(&s->pb, s->rl_table_index);
200 put_bits(&s->pb, 1, s->dc_table_index);
202 put_bits(&s->pb, 1, s->mv_table_index);
205 if(s->flipflop_rounding){
213 /* init various encoding tables */
215 init_mv_table(&mv_tables[0]);
216 init_mv_table(&mv_tables[1]);
217 for(i=0;i<NB_RL_TABLES;i++)
218 init_rl(&rl_table[i]);
220 init_h263_dc_for_msmpeg4();
225 printf("*****frame %d:\n", frame_count++);
229 void msmpeg4_encode_ext_header(MpegEncContext * s)
231 s->flipflop_rounding=1;
232 s->bitrate= 910; // FIXME
234 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
236 put_bits(&s->pb, 11, s->bitrate);
238 put_bits(&s->pb, 1, s->flipflop_rounding);
241 /* predict coded block */
242 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
244 int xy, wrap, pred, a, b, c;
246 xy = s->block_index[n];
247 wrap = s->block_wrap[0];
252 a = s->coded_block[xy - 1 ];
253 b = s->coded_block[xy - 1 - wrap];
254 c = s->coded_block[xy - wrap];
263 *coded_block_ptr = &s->coded_block[xy];
268 static void msmpeg4_encode_motion(MpegEncContext * s,
274 /* modulo encoding */
275 /* WARNING : you cannot reach all the MVs even with the modulo
276 encoding. This is a somewhat strange compromise they took !!! */
289 if ((unsigned)mx >= 64 ||
291 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
293 mv = &mv_tables[s->mv_table_index];
295 code = mv->table_mv_index[(mx << 6) | my];
298 mv->table_mv_bits[code],
299 mv->table_mv_code[code]);
301 /* escape : code litterally */
302 put_bits(&s->pb, 6, mx);
303 put_bits(&s->pb, 6, my);
307 void msmpeg4_encode_mb(MpegEncContext * s,
308 DCTELEM block[6][64],
309 int motion_x, int motion_y)
311 int cbp, coded_cbp, i;
317 set_stat(ST_INTER_MB);
319 for (i = 0; i < 6; i++) {
320 if (s->block_last_index[i] >= 0)
323 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
324 /* skip macroblock */
325 put_bits(&s->pb, 1, 1);
328 if (s->use_skip_mb_code)
329 put_bits(&s->pb, 1, 0); /* mb coded */
331 if(s->msmpeg4_version==2){
333 v2_mb_type[cbp&3][1],
334 v2_mb_type[cbp&3][0]);
335 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
339 cbpy_tab[coded_cbp>>2][1],
340 cbpy_tab[coded_cbp>>2][0]);
342 h263_pred_motion(s, 0, &pred_x, &pred_y);
343 msmpeg4v2_encode_motion(s, motion_x - pred_x);
344 msmpeg4v2_encode_motion(s, motion_y - pred_y);
347 table_mb_non_intra[cbp + 64][1],
348 table_mb_non_intra[cbp + 64][0]);
351 h263_pred_motion(s, 0, &pred_x, &pred_y);
352 msmpeg4_encode_motion(s, motion_x - pred_x,
359 for (i = 0; i < 6; i++) {
361 val = (s->block_last_index[i] >= 1);
362 cbp |= val << (5 - i);
364 /* predict value for close blocks only for luma */
365 pred = coded_block_pred(s, i, &coded_block);
369 coded_cbp |= val << (5 - i);
373 printf("cbp=%x %x\n", cbp, coded_cbp);
376 if(s->msmpeg4_version==2){
377 if (s->pict_type == I_TYPE) {
379 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
381 if (s->use_skip_mb_code)
382 put_bits(&s->pb, 1, 0); /* mb coded */
384 v2_mb_type[(cbp&3) + 4][1],
385 v2_mb_type[(cbp&3) + 4][0]);
387 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
390 cbpy_tab[cbp>>2][0]);
392 if (s->pict_type == I_TYPE) {
393 set_stat(ST_INTRA_MB);
395 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
397 if (s->use_skip_mb_code)
398 put_bits(&s->pb, 1, 0); /* mb coded */
400 table_mb_non_intra[cbp][1],
401 table_mb_non_intra[cbp][0]);
403 set_stat(ST_INTRA_MB);
404 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
408 for (i = 0; i < 6; i++) {
409 msmpeg4_encode_block(s, block[i], i);
414 /* strongly inspirated from MPEG4, but not exactly the same ! */
415 void msmpeg4_dc_scale(MpegEncContext * s)
417 if (s->qscale < 5 || s->msmpeg4_version==2){
420 }else if (s->qscale < 9){
421 s->y_dc_scale = 2 * s->qscale;
422 s->c_dc_scale = (s->qscale + 13)>>1;
424 s->y_dc_scale = s->qscale + 8;
425 s->c_dc_scale = (s->qscale + 13)>>1;
429 /* dir = 0: left, dir = 1: top prediction */
430 static int msmpeg4_pred_dc(MpegEncContext * s, int n,
431 INT16 **dc_val_ptr, int *dir_ptr)
433 int a, b, c, wrap, pred, scale;
436 /* find prediction */
438 scale = s->y_dc_scale;
440 scale = s->c_dc_scale;
442 wrap = s->block_wrap[n];
443 dc_val= s->dc_val[0] + s->block_index[n];
449 b = dc_val[ - 1 - wrap];
452 /* XXX: the following solution consumes divisions, but it does not
453 necessitate to modify mpegvideo.c. The problem comes from the
454 fact they decided to store the quantized DC (which would lead
455 to problems if Q could vary !) */
456 #if defined ARCH_X86 && !defined PIC
458 "movl %3, %%eax \n\t"
459 "shrl $1, %%eax \n\t"
460 "addl %%eax, %2 \n\t"
461 "addl %%eax, %1 \n\t"
462 "addl %0, %%eax \n\t"
464 "movl %%edx, %0 \n\t"
465 "movl %1, %%eax \n\t"
467 "movl %%edx, %1 \n\t"
468 "movl %2, %%eax \n\t"
470 "movl %%edx, %2 \n\t"
471 : "+b" (a), "+c" (b), "+D" (c)
472 : "g" (scale), "S" (inverse[scale])
476 /* #elif defined (ARCH_ALPHA) */
477 /* Divisions are extremely costly on Alpha; optimize the most
478 common case. But they are costly everywhere...
481 a = (a + (8 >> 1)) / 8;
482 b = (b + (8 >> 1)) / 8;
483 c = (c + (8 >> 1)) / 8;
485 a = (a + (scale >> 1)) / scale;
486 b = (b + (scale >> 1)) / scale;
487 c = (c + (scale >> 1)) / scale;
490 /* XXX: WARNING: they did not choose the same test as MPEG4. This
491 is very important ! */
492 if (abs(a - b) <= abs(b - c)) {
500 /* update predictor */
501 *dc_val_ptr = &dc_val[0];
507 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
513 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
515 /* update predictor */
517 *dc_val = level * s->y_dc_scale;
519 *dc_val = level * s->c_dc_scale;
522 /* do the prediction */
525 if(s->msmpeg4_version==2){
528 v2_dc_lum_table[level+256][1],
529 v2_dc_lum_table[level+256][0]);
532 v2_dc_chroma_table[level+256][1],
533 v2_dc_chroma_table[level+256][0]);
545 if (s->dc_table_index == 0) {
547 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
549 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
553 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
555 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
560 put_bits(&s->pb, 8, level);
563 put_bits(&s->pb, 1, sign);
568 /* Encoding of a block. Very similar to MPEG4 except for a different
569 escape coding (same as H263) and more vlc tables.
571 static void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
573 int level, run, last, i, j, last_index;
574 int last_non_zero, sign, slevel;
575 int code, run_diff, dc_pred_dir;
580 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
583 rl = &rl_table[s->rl_table_index];
585 rl = &rl_table[3 + s->rl_chroma_table_index];
588 set_stat(ST_INTRA_AC);
591 rl = &rl_table[3 + s->rl_table_index];
592 if(s->msmpeg4_version==2)
596 set_stat(ST_INTER_AC);
600 last_index = s->block_last_index[n];
601 last_non_zero = i - 1;
602 for (; i <= last_index; i++) {
603 j = zigzag_direct[i];
606 run = i - last_non_zero - 1;
607 last = (i == last_index);
614 code = get_rl_index(rl, last, run, level);
615 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
619 level1 = level - rl->max_level[last][run];
622 code = get_rl_index(rl, last, run, level1);
625 put_bits(&s->pb, 1, 0);
626 if (level > MAX_LEVEL)
628 run1 = run - rl->max_run[last][level] - run_diff;
631 code = get_rl_index(rl, last, run1, level);
635 put_bits(&s->pb, 1, 0);
636 put_bits(&s->pb, 1, last);
637 put_bits(&s->pb, 6, run);
638 put_bits(&s->pb, 8, slevel & 0xff);
641 put_bits(&s->pb, 1, 1);
642 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
643 put_bits(&s->pb, 1, sign);
647 put_bits(&s->pb, 1, 1);
648 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
649 put_bits(&s->pb, 1, sign);
652 put_bits(&s->pb, 1, sign);
659 /****************************************/
662 static VLC mb_non_intra_vlc;
663 static VLC mb_intra_vlc;
664 static VLC dc_lum_vlc[2];
665 static VLC dc_chroma_vlc[2];
666 static VLC v2_dc_lum_vlc;
667 static VLC v2_dc_chroma_vlc;
669 static VLC v2_intra_cbpc_vlc;
670 static VLC v2_mb_type_vlc;
671 static VLC v2_mv_vlc;
673 /* this table is practically identical to the one from h263 except that its inverted */
674 static void init_h263_dc_for_msmpeg4()
679 int level, uni_code, uni_len;
682 for(level=-256; level<256; level++){
684 /* find number of bits */
693 l= (-level) ^ ((1 << size) - 1);
698 uni_code= DCtab_lum[size][0];
699 uni_len = DCtab_lum[size][1];
700 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
703 uni_code<<=size; uni_code|=l;
706 uni_code<<=1; uni_code|=1;
710 v2_dc_lum_table[level+256][0]= uni_code;
711 v2_dc_lum_table[level+256][1]= uni_len;
713 /* chrominance h263 */
714 uni_code= DCtab_chrom[size][0];
715 uni_len = DCtab_chrom[size][1];
716 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
719 uni_code<<=size; uni_code|=l;
722 uni_code<<=1; uni_code|=1;
726 v2_dc_chroma_table[level+256][0]= uni_code;
727 v2_dc_chroma_table[level+256][1]= uni_len;
733 /* init all vlc decoding tables */
734 int msmpeg4_decode_init_vlc(MpegEncContext *s)
739 for(i=0;i<NB_RL_TABLES;i++) {
740 init_rl(&rl_table[i]);
741 init_vlc_rl(&rl_table[i]);
745 init_vlc(&mv->vlc, 9, mv->n + 1,
746 mv->table_mv_bits, 1, 1,
747 mv->table_mv_code, 2, 2);
750 init_vlc(&dc_lum_vlc[0], 9, 120,
751 &table0_dc_lum[0][1], 8, 4,
752 &table0_dc_lum[0][0], 8, 4);
753 init_vlc(&dc_chroma_vlc[0], 9, 120,
754 &table0_dc_chroma[0][1], 8, 4,
755 &table0_dc_chroma[0][0], 8, 4);
756 init_vlc(&dc_lum_vlc[1], 9, 120,
757 &table1_dc_lum[0][1], 8, 4,
758 &table1_dc_lum[0][0], 8, 4);
759 init_vlc(&dc_chroma_vlc[1], 9, 120,
760 &table1_dc_chroma[0][1], 8, 4,
761 &table1_dc_chroma[0][0], 8, 4);
763 init_h263_dc_for_msmpeg4();
764 init_vlc(&v2_dc_lum_vlc, 9, 512,
765 &v2_dc_lum_table[0][1], 8, 4,
766 &v2_dc_lum_table[0][0], 8, 4);
767 init_vlc(&v2_dc_chroma_vlc, 9, 512,
768 &v2_dc_chroma_table[0][1], 8, 4,
769 &v2_dc_chroma_table[0][0], 8, 4);
771 init_vlc(&cbpy_vlc, 6, 16,
772 &cbpy_tab[0][1], 2, 1,
773 &cbpy_tab[0][0], 2, 1);
774 init_vlc(&v2_intra_cbpc_vlc, 3, 4,
775 &v2_intra_cbpc[0][1], 2, 1,
776 &v2_intra_cbpc[0][0], 2, 1);
777 init_vlc(&v2_mb_type_vlc, 5, 8,
778 &v2_mb_type[0][1], 2, 1,
779 &v2_mb_type[0][0], 2, 1);
780 init_vlc(&v2_mv_vlc, 9, 33,
784 init_vlc(&mb_non_intra_vlc, 9, 128,
785 &table_mb_non_intra[0][1], 8, 4,
786 &table_mb_non_intra[0][0], 8, 4);
787 init_vlc(&mb_intra_vlc, 9, 64,
788 &table_mb_intra[0][1], 4, 2,
789 &table_mb_intra[0][0], 4, 2);
793 static int decode012(GetBitContext *gb)
800 return get_bits1(gb) + 1;
803 int msmpeg4_decode_picture_header(MpegEncContext * s)
807 s->pict_type = get_bits(&s->gb, 2) + 1;
808 if (s->pict_type != I_TYPE &&
809 s->pict_type != P_TYPE)
812 s->qscale = get_bits(&s->gb, 5);
814 if (s->pict_type == I_TYPE) {
815 code = get_bits(&s->gb, 5);
816 /* 0x17: one slice, 0x18: two slices */
819 s->slice_height = s->mb_height / (code - 0x16);
820 if(s->msmpeg4_version==2){
821 s->rl_chroma_table_index = 2;
822 s->rl_table_index = 2;
824 s->dc_table_index = 0; //not used
826 s->rl_chroma_table_index = decode012(&s->gb);
827 s->rl_table_index = decode012(&s->gb);
829 s->dc_table_index = get_bits1(&s->gb);
832 /* printf(" %d %d %d %d \n",
834 s->rl_chroma_table_index,
836 s->dc_table_index);*/
838 s->use_skip_mb_code = get_bits1(&s->gb);
840 if(s->msmpeg4_version==2){
841 s->rl_table_index = 2;
842 s->rl_chroma_table_index = s->rl_table_index;
844 s->dc_table_index = 0; //not used
846 s->mv_table_index = 0;
848 s->rl_table_index = decode012(&s->gb);
849 s->rl_chroma_table_index = s->rl_table_index;
851 s->dc_table_index = get_bits1(&s->gb);
853 s->mv_table_index = get_bits1(&s->gb);
855 /* printf(" %d %d %d %d %d \n",
858 s->rl_chroma_table_index,
860 s->mv_table_index);*/
861 if(s->flipflop_rounding){
866 // printf("%d", s->no_rounding);
870 if(s->msmpeg4_version==2)
873 for(i=0; i<s->gb.size*8; i++)
874 // printf("%d", get_bits1(&s->gb));
882 printf("*****frame %d:\n", frame_count++);
887 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
889 /* the alt_bitstream reader could read over the end so we need to check it */
890 if(get_bits_count(&s->gb) + 16 < buf_size*8)
894 fps= get_bits(&s->gb, 5);
895 s->bitrate= get_bits(&s->gb, 11);
896 s->flipflop_rounding= get_bits1(&s->gb);
898 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding);
902 s->flipflop_rounding= 0;
909 static inline void memsetw(short *tab, int val, int n)
916 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
918 int range, bit_size, sign, code, bits;
923 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
925 bit_size = s->f_code - 1;
926 range = 1 << bit_size;
939 code = (val >> bit_size) + 1;
940 bits = val & (range - 1);
942 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
944 put_bits(&s->pb, bit_size, bits);
949 /* this is identical to h263 except that its range is multiplied by 2 */
950 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
952 int code, val, sign, shift;
954 code = get_vlc(&s->gb, &v2_mv_vlc);
960 sign = get_bits1(&s->gb);
962 val = (code - 1) << shift;
964 val |= get_bits(&s->gb, shift);
979 int msmpeg4v2_decode_mb(MpegEncContext *s,
980 DCTELEM block[6][64])
983 if (s->pict_type == P_TYPE) {
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, &v2_mb_type_vlc);
1000 s->mb_intra = code >>2;
1005 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
1011 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
1012 if((cbp&3) != 3) cbp^= 0x3C;
1014 h263_pred_motion(s, 0, &mx, &my);
1015 mx= msmpeg4v2_decode_motion(s, mx, 1);
1016 my= msmpeg4v2_decode_motion(s, my, 1);
1018 s->mv_dir = MV_DIR_FORWARD;
1019 s->mv_type = MV_TYPE_16X16;
1020 s->mv[0][0][0] = mx;
1021 s->mv[0][0][1] = my;
1023 s->ac_pred = get_bits1(&s->gb);
1024 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
1027 for (i = 0; i < 6; i++) {
1028 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1030 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1037 int msmpeg4_decode_mb(MpegEncContext *s,
1038 DCTELEM block[6][64])
1043 /* special slice handling */
1045 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
1047 /* reset DC pred (set previous line to 1024) */
1048 wrap = 2 * s->mb_width + 2;
1049 memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
1050 1024, 2 * s->mb_width);
1051 wrap = s->mb_width + 2;
1052 memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
1054 memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
1057 /* reset AC pred (set previous line to 0) */
1058 wrap = s->mb_width * 2 + 2;
1059 memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
1060 0, 2 * s->mb_width*16);
1061 wrap = s->mb_width + 2;
1062 memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
1064 memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
1067 s->first_slice_line = 1;
1069 s->first_slice_line = 0;
1073 if(s->msmpeg4_version==2) return msmpeg4v2_decode_mb(s, block); //FIXME merge if possible
1075 if (s->pict_type == P_TYPE) {
1076 set_stat(ST_INTER_MB);
1077 if (s->use_skip_mb_code) {
1078 if (get_bits1(&s->gb)) {
1082 s->block_last_index[i] = -1;
1083 s->mv_dir = MV_DIR_FORWARD;
1084 s->mv_type = MV_TYPE_16X16;
1092 code = get_vlc(&s->gb, &mb_non_intra_vlc);
1095 //s->mb_intra = (code & 0x40) ? 0 : 1;
1096 s->mb_intra = (~code & 0x40) >> 6;
1100 set_stat(ST_INTRA_MB);
1102 code = get_vlc(&s->gb, &mb_intra_vlc);
1105 /* predict coded block pattern */
1108 int val = ((code >> (5 - i)) & 1);
1110 int pred = coded_block_pred(s, i, &coded_val);
1114 cbp |= val << (5 - i);
1121 h263_pred_motion(s, 0, &mx, &my);
1122 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1124 s->mv_dir = MV_DIR_FORWARD;
1125 s->mv_type = MV_TYPE_16X16;
1126 s->mv[0][0][0] = mx;
1127 s->mv[0][0][1] = my;
1129 set_stat(ST_INTRA_MB);
1130 s->ac_pred = get_bits1(&s->gb);
1133 for (i = 0; i < 6; i++) {
1134 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1136 fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1143 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1146 int code, level, i, j, last, run, run_diff;
1149 const UINT8 *scan_table;
1158 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1163 rl = &rl_table[s->rl_table_index];
1165 rl = &rl_table[3 + s->rl_chroma_table_index];
1174 if (dc_pred_dir == 0)
1175 scan_table = ff_alternate_vertical_scan; /* left */
1177 scan_table = ff_alternate_horizontal_scan; /* top */
1179 scan_table = zigzag_direct;
1181 set_stat(ST_INTRA_AC);
1183 qmul = s->qscale << 1;
1184 qadd = (s->qscale - 1) | 1;
1186 rl = &rl_table[3 + s->rl_table_index];
1188 if(s->msmpeg4_version==2)
1194 s->block_last_index[n] = i - 1;
1197 scan_table = zigzag_direct;
1198 set_stat(ST_INTER_AC);
1202 code = get_vlc(&s->gb, &rl->vlc);
1205 if (code == rl->n) {
1207 if (get_bits1(&s->gb) == 0) {
1208 if (get_bits1(&s->gb) == 0) {
1210 last = get_bits1(&s->gb);
1211 run = get_bits(&s->gb, 6);
1212 level = get_bits(&s->gb, 8);
1213 level = (level << 24) >> 24; /* sign extend */
1214 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1215 if (level>0) level= level * qmul + qadd;
1216 else level= level * qmul - qadd;
1219 code = get_vlc(&s->gb, &rl->vlc);
1220 if (code < 0 || code >= rl->n)
1222 run = rl->table_run[code];
1223 level = rl->table_level[code];
1224 last = code >= rl->last;
1225 run += rl->max_run[last][level] + run_diff;
1226 level= level * qmul + qadd;
1227 if (get_bits1(&s->gb))
1232 code = get_vlc(&s->gb, &rl->vlc);
1233 if (code < 0 || code >= rl->n)
1235 run = rl->table_run[code];
1236 level = rl->table_level[code];
1237 last = code >= rl->last;
1238 level += rl->max_level[last][run];
1239 level= level * qmul + qadd;
1240 if (get_bits1(&s->gb))
1244 run = rl->table_run[code];
1245 level = rl->table_level[code] * qmul + qadd;
1246 last = code >= rl->last;
1247 if (get_bits1(&s->gb))
1261 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1263 i = 64; /* XXX: not optimal */
1266 s->block_last_index[n] = i - 1;
1271 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1276 if(s->msmpeg4_version==2){
1278 level = get_vlc(&s->gb, &v2_dc_lum_vlc);
1280 level = get_vlc(&s->gb, &v2_dc_chroma_vlc);
1285 }else{ //FIXME optimize use unified tables & index
1287 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]);
1289 level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]);
1294 if (level == DC_MAX) {
1295 level = get_bits(&s->gb, 8);
1296 if (get_bits1(&s->gb))
1298 } else if (level != 0) {
1299 if (get_bits1(&s->gb))
1304 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1307 /* update predictor */
1309 *dc_val = level * s->y_dc_scale;
1311 *dc_val = level * s->c_dc_scale;
1317 static int msmpeg4_decode_motion(MpegEncContext * s,
1318 int *mx_ptr, int *my_ptr)
1323 mv = &mv_tables[s->mv_table_index];
1325 code = get_vlc(&s->gb, &mv->vlc);
1328 if (code == mv->n) {
1329 mx = get_bits(&s->gb, 6);
1330 my = get_bits(&s->gb, 6);
1332 mx = mv->table_mvx[code];
1333 my = mv->table_mvy[code];
1338 /* WARNING : they do not do exactly modulo encoding */