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 /* 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(void);
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 = av_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 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 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
233 put_bits(&s->pb, 11, MIN(s->bit_rate, 2047));
235 if(s->msmpeg4_version<3)
236 s->flipflop_rounding=0;
238 s->flipflop_rounding=1;
239 put_bits(&s->pb, 1, s->flipflop_rounding);
243 /* predict coded block */
244 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
246 int xy, wrap, pred, a, b, c;
248 xy = s->block_index[n];
249 wrap = s->block_wrap[0];
254 a = s->coded_block[xy - 1 ];
255 b = s->coded_block[xy - 1 - wrap];
256 c = s->coded_block[xy - wrap];
265 *coded_block_ptr = &s->coded_block[xy];
270 static void msmpeg4_encode_motion(MpegEncContext * s,
276 /* modulo encoding */
277 /* WARNING : you cannot reach all the MVs even with the modulo
278 encoding. This is a somewhat strange compromise they took !!! */
291 if ((unsigned)mx >= 64 ||
293 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
295 mv = &mv_tables[s->mv_table_index];
297 code = mv->table_mv_index[(mx << 6) | my];
300 mv->table_mv_bits[code],
301 mv->table_mv_code[code]);
303 /* escape : code litterally */
304 put_bits(&s->pb, 6, mx);
305 put_bits(&s->pb, 6, my);
309 void msmpeg4_encode_mb(MpegEncContext * s,
310 DCTELEM block[6][64],
311 int motion_x, int motion_y)
313 int cbp, coded_cbp, i;
319 set_stat(ST_INTER_MB);
321 for (i = 0; i < 6; i++) {
322 if (s->block_last_index[i] >= 0)
325 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
326 /* skip macroblock */
327 put_bits(&s->pb, 1, 1);
330 if (s->use_skip_mb_code)
331 put_bits(&s->pb, 1, 0); /* mb coded */
333 if(s->msmpeg4_version<=2){
335 v2_mb_type[cbp&3][1],
336 v2_mb_type[cbp&3][0]);
337 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
341 cbpy_tab[coded_cbp>>2][1],
342 cbpy_tab[coded_cbp>>2][0]);
344 h263_pred_motion(s, 0, &pred_x, &pred_y);
345 msmpeg4v2_encode_motion(s, motion_x - pred_x);
346 msmpeg4v2_encode_motion(s, motion_y - pred_y);
349 table_mb_non_intra[cbp + 64][1],
350 table_mb_non_intra[cbp + 64][0]);
353 h263_pred_motion(s, 0, &pred_x, &pred_y);
354 msmpeg4_encode_motion(s, motion_x - pred_x,
361 for (i = 0; i < 6; i++) {
363 val = (s->block_last_index[i] >= 1);
364 cbp |= val << (5 - i);
366 /* predict value for close blocks only for luma */
367 pred = coded_block_pred(s, i, &coded_block);
371 coded_cbp |= val << (5 - i);
375 printf("cbp=%x %x\n", cbp, coded_cbp);
378 if(s->msmpeg4_version<=2){
379 if (s->pict_type == I_TYPE) {
381 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
383 if (s->use_skip_mb_code)
384 put_bits(&s->pb, 1, 0); /* mb coded */
386 v2_mb_type[(cbp&3) + 4][1],
387 v2_mb_type[(cbp&3) + 4][0]);
389 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
392 cbpy_tab[cbp>>2][0]);
394 if (s->pict_type == I_TYPE) {
395 set_stat(ST_INTRA_MB);
397 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
399 if (s->use_skip_mb_code)
400 put_bits(&s->pb, 1, 0); /* mb coded */
402 table_mb_non_intra[cbp][1],
403 table_mb_non_intra[cbp][0]);
405 set_stat(ST_INTRA_MB);
406 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
410 for (i = 0; i < 6; i++) {
411 msmpeg4_encode_block(s, block[i], i);
415 /* old ffmpeg msmpeg4v3 mode */
416 void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
421 }else if (s->qscale < 9){
422 s->y_dc_scale = 2 * s->qscale;
423 s->c_dc_scale = (s->qscale + 13)>>1;
425 s->y_dc_scale = s->qscale + 8;
426 s->c_dc_scale = (s->qscale + 13)>>1;
430 static int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
441 *dc_val_ptr= &s->last_dc[i];
442 return s->last_dc[i];
445 /* dir = 0: left, dir = 1: top prediction */
446 static int msmpeg4_pred_dc(MpegEncContext * s, int n,
447 INT16 **dc_val_ptr, int *dir_ptr)
449 int a, b, c, wrap, pred, scale;
452 /* find prediction */
454 scale = s->y_dc_scale;
456 scale = s->c_dc_scale;
459 wrap = s->block_wrap[n];
460 dc_val= s->dc_val[0] + s->block_index[n];
466 b = dc_val[ - 1 - wrap];
469 /* XXX: the following solution consumes divisions, but it does not
470 necessitate to modify mpegvideo.c. The problem comes from the
471 fact they decided to store the quantized DC (which would lead
472 to problems if Q could vary !) */
473 #if defined ARCH_X86 && !defined PIC
475 "movl %3, %%eax \n\t"
476 "shrl $1, %%eax \n\t"
477 "addl %%eax, %2 \n\t"
478 "addl %%eax, %1 \n\t"
479 "addl %0, %%eax \n\t"
481 "movl %%edx, %0 \n\t"
482 "movl %1, %%eax \n\t"
484 "movl %%edx, %1 \n\t"
485 "movl %2, %%eax \n\t"
487 "movl %%edx, %2 \n\t"
488 : "+b" (a), "+c" (b), "+D" (c)
489 : "g" (scale), "S" (inverse[scale])
493 /* #elif defined (ARCH_ALPHA) */
494 /* Divisions are extremely costly on Alpha; optimize the most
495 common case. But they are costly everywhere...
498 a = (a + (8 >> 1)) / 8;
499 b = (b + (8 >> 1)) / 8;
500 c = (c + (8 >> 1)) / 8;
502 a = (a + (scale >> 1)) / scale;
503 b = (b + (scale >> 1)) / scale;
504 c = (c + (scale >> 1)) / scale;
507 /* XXX: WARNING: they did not choose the same test as MPEG4. This
508 is very important ! */
509 if (abs(a - b) <= abs(b - c)) {
517 /* update predictor */
518 *dc_val_ptr = &dc_val[0];
524 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
529 if(s->msmpeg4_version==1){
531 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
533 /* update predictor */
537 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
539 /* update predictor */
541 *dc_val = level * s->y_dc_scale;
543 *dc_val = level * s->c_dc_scale;
547 /* do the prediction */
550 if(s->msmpeg4_version<=2){
553 v2_dc_lum_table[level+256][1],
554 v2_dc_lum_table[level+256][0]);
557 v2_dc_chroma_table[level+256][1],
558 v2_dc_chroma_table[level+256][0]);
570 if (s->dc_table_index == 0) {
572 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
574 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
578 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
580 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
585 put_bits(&s->pb, 8, level);
588 put_bits(&s->pb, 1, sign);
593 /* Encoding of a block. Very similar to MPEG4 except for a different
594 escape coding (same as H263) and more vlc tables.
596 static void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
598 int level, run, last, i, j, last_index;
599 int last_non_zero, sign, slevel;
600 int code, run_diff, dc_pred_dir;
605 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
608 rl = &rl_table[s->rl_table_index];
610 rl = &rl_table[3 + s->rl_chroma_table_index];
613 set_stat(ST_INTRA_AC);
616 rl = &rl_table[3 + s->rl_table_index];
617 if(s->msmpeg4_version<=2)
621 set_stat(ST_INTER_AC);
625 last_index = s->block_last_index[n];
626 last_non_zero = i - 1;
627 for (; i <= last_index; i++) {
628 j = zigzag_direct[i];
631 run = i - last_non_zero - 1;
632 last = (i == last_index);
639 code = get_rl_index(rl, last, run, level);
640 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
644 level1 = level - rl->max_level[last][run];
647 code = get_rl_index(rl, last, run, level1);
650 put_bits(&s->pb, 1, 0);
651 if (level > MAX_LEVEL)
653 run1 = run - rl->max_run[last][level] - run_diff;
656 code = get_rl_index(rl, last, run1, level);
660 put_bits(&s->pb, 1, 0);
661 put_bits(&s->pb, 1, last);
662 put_bits(&s->pb, 6, run);
663 put_bits(&s->pb, 8, slevel & 0xff);
666 put_bits(&s->pb, 1, 1);
667 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
668 put_bits(&s->pb, 1, sign);
672 put_bits(&s->pb, 1, 1);
673 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
674 put_bits(&s->pb, 1, sign);
677 put_bits(&s->pb, 1, sign);
684 /****************************************/
687 static VLC mb_non_intra_vlc;
688 static VLC mb_intra_vlc;
689 static VLC dc_lum_vlc[2];
690 static VLC dc_chroma_vlc[2];
691 static VLC v2_dc_lum_vlc;
692 static VLC v2_dc_chroma_vlc;
694 static VLC v2_intra_cbpc_vlc;
695 static VLC v2_mb_type_vlc;
696 static VLC v2_mv_vlc;
697 static VLC v1_intra_cbpc_vlc;
698 static VLC v1_inter_cbpc_vlc;
700 /* this table is practically identical to the one from h263 except that its inverted */
701 static void init_h263_dc_for_msmpeg4(void)
706 int level, uni_code, uni_len;
709 for(level=-256; level<256; level++){
711 /* find number of bits */
720 l= (-level) ^ ((1 << size) - 1);
725 uni_code= DCtab_lum[size][0];
726 uni_len = DCtab_lum[size][1];
727 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
730 uni_code<<=size; uni_code|=l;
733 uni_code<<=1; uni_code|=1;
737 v2_dc_lum_table[level+256][0]= uni_code;
738 v2_dc_lum_table[level+256][1]= uni_len;
740 /* chrominance h263 */
741 uni_code= DCtab_chrom[size][0];
742 uni_len = DCtab_chrom[size][1];
743 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
746 uni_code<<=size; uni_code|=l;
749 uni_code<<=1; uni_code|=1;
753 v2_dc_chroma_table[level+256][0]= uni_code;
754 v2_dc_chroma_table[level+256][1]= uni_len;
760 /* init all vlc decoding tables */
761 int msmpeg4_decode_init_vlc(MpegEncContext *s)
771 for(i=0;i<NB_RL_TABLES;i++) {
772 init_rl(&rl_table[i]);
773 init_vlc_rl(&rl_table[i]);
777 init_vlc(&mv->vlc, 9, mv->n + 1,
778 mv->table_mv_bits, 1, 1,
779 mv->table_mv_code, 2, 2);
782 init_vlc(&dc_lum_vlc[0], 9, 120,
783 &table0_dc_lum[0][1], 8, 4,
784 &table0_dc_lum[0][0], 8, 4);
785 init_vlc(&dc_chroma_vlc[0], 9, 120,
786 &table0_dc_chroma[0][1], 8, 4,
787 &table0_dc_chroma[0][0], 8, 4);
788 init_vlc(&dc_lum_vlc[1], 9, 120,
789 &table1_dc_lum[0][1], 8, 4,
790 &table1_dc_lum[0][0], 8, 4);
791 init_vlc(&dc_chroma_vlc[1], 9, 120,
792 &table1_dc_chroma[0][1], 8, 4,
793 &table1_dc_chroma[0][0], 8, 4);
795 init_h263_dc_for_msmpeg4();
796 init_vlc(&v2_dc_lum_vlc, 9, 512,
797 &v2_dc_lum_table[0][1], 8, 4,
798 &v2_dc_lum_table[0][0], 8, 4);
799 init_vlc(&v2_dc_chroma_vlc, 9, 512,
800 &v2_dc_chroma_table[0][1], 8, 4,
801 &v2_dc_chroma_table[0][0], 8, 4);
803 init_vlc(&cbpy_vlc, 6, 16,
804 &cbpy_tab[0][1], 2, 1,
805 &cbpy_tab[0][0], 2, 1);
806 init_vlc(&v2_intra_cbpc_vlc, 3, 4,
807 &v2_intra_cbpc[0][1], 2, 1,
808 &v2_intra_cbpc[0][0], 2, 1);
809 init_vlc(&v2_mb_type_vlc, 5, 8,
810 &v2_mb_type[0][1], 2, 1,
811 &v2_mb_type[0][0], 2, 1);
812 init_vlc(&v2_mv_vlc, 9, 33,
816 init_vlc(&mb_non_intra_vlc, 9, 128,
817 &table_mb_non_intra[0][1], 8, 4,
818 &table_mb_non_intra[0][0], 8, 4);
819 init_vlc(&mb_intra_vlc, 9, 64,
820 &table_mb_intra[0][1], 4, 2,
821 &table_mb_intra[0][0], 4, 2);
823 init_vlc(&v1_intra_cbpc_vlc, 6, 8,
824 intra_MCBPC_bits, 1, 1,
825 intra_MCBPC_code, 1, 1);
826 init_vlc(&v1_inter_cbpc_vlc, 6, 25,
827 inter_MCBPC_bits, 1, 1,
828 inter_MCBPC_code, 1, 1);
833 static int decode012(GetBitContext *gb)
840 return get_bits1(gb) + 1;
843 int msmpeg4_decode_picture_header(MpegEncContext * s)
850 for(i=0; i<s->gb.size*8; i++)
851 printf("%d", get_bits1(&s->gb));
852 // get_bits1(&s->gb);
858 if(s->msmpeg4_version==1){
860 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
861 if(start_code!=0x00000100){
862 fprintf(stderr, "invalid startcode\n");
866 num= get_bits(&s->gb, 5); // frame number */
869 s->pict_type = get_bits(&s->gb, 2) + 1;
870 if (s->pict_type != I_TYPE &&
871 s->pict_type != P_TYPE){
872 fprintf(stderr, "invalid picture type\n");
876 s->qscale = get_bits(&s->gb, 5);
878 if (s->pict_type == I_TYPE) {
879 code = get_bits(&s->gb, 5);
880 if(s->msmpeg4_version==1){
881 if(code==0 || code>s->mb_height){
882 fprintf(stderr, "invalid slice height %d\n", code);
886 s->slice_height = code;
888 /* 0x17: one slice, 0x18: two slices, ... */
892 s->slice_height = s->mb_height / (code - 0x16);
895 switch(s->msmpeg4_version){
898 s->rl_chroma_table_index = 2;
899 s->rl_table_index = 2;
901 s->dc_table_index = 0; //not used
904 s->rl_chroma_table_index = decode012(&s->gb);
905 s->rl_table_index = decode012(&s->gb);
907 s->dc_table_index = get_bits1(&s->gb);
910 msmpeg4_decode_ext_header(s, 999 /* bufer size (useless here) */);
911 printf("%X\n", show_bits(&s->gb, 24));
912 code= get_bits(&s->gb, 2);
914 code2= get_bits(&s->gb, 3);
915 if(code2==7) skip_bits(&s->gb, 1);
917 printf("%X\n", show_bits(&s->gb, 24));
918 s->rl_chroma_table_index = 2;
919 s->rl_table_index = 2;
921 s->dc_table_index = 0;
925 /* printf(" %d %d %d %d \n",
927 s->rl_chroma_table_index,
929 s->dc_table_index);*/
932 switch(s->msmpeg4_version){
935 if(s->msmpeg4_version==1)
936 s->use_skip_mb_code = 1;
938 s->use_skip_mb_code = get_bits1(&s->gb);
939 s->rl_table_index = 2;
940 s->rl_chroma_table_index = s->rl_table_index;
941 s->dc_table_index = 0; //not used
942 s->mv_table_index = 0;
945 s->use_skip_mb_code = get_bits1(&s->gb);
946 s->rl_table_index = decode012(&s->gb);
947 s->rl_chroma_table_index = s->rl_table_index;
949 s->dc_table_index = get_bits1(&s->gb);
951 s->mv_table_index = get_bits1(&s->gb);
954 /* printf(" %d %d %d %d %d \n",
957 s->rl_chroma_table_index,
959 s->mv_table_index);*/
960 if(s->flipflop_rounding){
965 // printf("%d", s->no_rounding);
970 if(s->msmpeg4_version==2)
973 for(i=0; i<s->gb.size*8; i++)
974 // printf("%d", get_bits1(&s->gb));
982 printf("*****frame %d:\n", frame_count++);
987 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
989 int left= buf_size*8 - get_bits_count(&s->gb);
990 int length= s->msmpeg4_version>=3 ? 17 : 16;
991 /* the alt_bitstream reader could read over the end so we need to check it */
992 if(left>=length && left<length+8)
996 fps= get_bits(&s->gb, 5);
997 s->bit_rate= get_bits(&s->gb, 11);
998 if(s->msmpeg4_version>=3)
999 s->flipflop_rounding= get_bits1(&s->gb);
1001 s->flipflop_rounding= 0;
1003 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate, s->flipflop_rounding);
1005 else if(left<length+8)
1007 s->flipflop_rounding= 0;
1008 printf("ext header missing, %d left\n", left);
1012 fprintf(stderr, "I frame too long, ignoring ext header\n");
1018 static inline void msmpeg4_memsetw(short *tab, int val, int n)
1025 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1027 int range, bit_size, sign, code, bits;
1032 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1034 bit_size = s->f_code - 1;
1035 range = 1 << bit_size;
1048 code = (val >> bit_size) + 1;
1049 bits = val & (range - 1);
1051 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1053 put_bits(&s->pb, bit_size, bits);
1058 /* this is identical to h263 except that its range is multiplied by 2 */
1059 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1061 int code, val, sign, shift;
1063 code = get_vlc(&s->gb, &v2_mv_vlc);
1064 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
1070 sign = get_bits1(&s->gb);
1072 val = (code - 1) << shift;
1074 val |= get_bits(&s->gb, shift);
1089 static int msmpeg4v12_decode_mb(MpegEncContext *s,
1090 DCTELEM block[6][64])
1093 if (s->pict_type == P_TYPE) {
1094 if (s->use_skip_mb_code) {
1095 if (get_bits1(&s->gb)) {
1099 s->block_last_index[i] = -1;
1100 s->mv_dir = MV_DIR_FORWARD;
1101 s->mv_type = MV_TYPE_16X16;
1109 if(s->msmpeg4_version==2)
1110 code = get_vlc(&s->gb, &v2_mb_type_vlc);
1112 code = get_vlc(&s->gb, &v1_inter_cbpc_vlc);
1113 if(code<0 || code>7){
1114 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1118 s->mb_intra = code >>2;
1123 if(s->msmpeg4_version==2)
1124 cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
1126 cbp= get_vlc(&s->gb, &v1_intra_cbpc_vlc);
1128 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1136 cbpy= get_vlc(&s->gb, &cbpy_vlc);
1138 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1143 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
1145 h263_pred_motion(s, 0, &mx, &my);
1146 mx= msmpeg4v2_decode_motion(s, mx, 1);
1147 my= msmpeg4v2_decode_motion(s, my, 1);
1149 s->mv_dir = MV_DIR_FORWARD;
1150 s->mv_type = MV_TYPE_16X16;
1151 s->mv[0][0][0] = mx;
1152 s->mv[0][0][1] = my;
1154 if(s->msmpeg4_version==2){
1155 s->ac_pred = get_bits1(&s->gb);
1156 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
1159 cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
1160 if(s->pict_type==P_TYPE) cbp^=0x3C;
1164 for (i = 0; i < 6; i++) {
1165 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1167 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1174 int msmpeg4_decode_mb(MpegEncContext *s,
1175 DCTELEM block[6][64])
1180 /* special slice handling */
1182 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
1184 /* reset DC pred (set previous line to 1024) */
1185 wrap = 2 * s->mb_width + 2;
1186 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
1187 1024, 2 * s->mb_width);
1188 wrap = s->mb_width + 2;
1189 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
1191 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
1194 /* reset AC pred (set previous line to 0) */
1195 wrap = s->mb_width * 2 + 2;
1196 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
1197 0, 2 * s->mb_width*16);
1198 wrap = s->mb_width + 2;
1199 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
1201 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
1204 s->first_slice_line = 1;
1206 s->first_slice_line = 0;
1210 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps
1212 if (s->pict_type == P_TYPE) {
1213 set_stat(ST_INTER_MB);
1214 if (s->use_skip_mb_code) {
1215 if (get_bits1(&s->gb)) {
1219 s->block_last_index[i] = -1;
1220 s->mv_dir = MV_DIR_FORWARD;
1221 s->mv_type = MV_TYPE_16X16;
1229 code = get_vlc(&s->gb, &mb_non_intra_vlc);
1232 //s->mb_intra = (code & 0x40) ? 0 : 1;
1233 s->mb_intra = (~code & 0x40) >> 6;
1237 set_stat(ST_INTRA_MB);
1239 code = get_vlc(&s->gb, &mb_intra_vlc);
1242 /* predict coded block pattern */
1245 int val = ((code >> (5 - i)) & 1);
1247 int pred = coded_block_pred(s, i, &coded_val);
1251 cbp |= val << (5 - i);
1258 h263_pred_motion(s, 0, &mx, &my);
1259 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1261 s->mv_dir = MV_DIR_FORWARD;
1262 s->mv_type = MV_TYPE_16X16;
1263 s->mv[0][0][0] = mx;
1264 s->mv[0][0][1] = my;
1266 set_stat(ST_INTRA_MB);
1267 s->ac_pred = get_bits1(&s->gb);
1270 for (i = 0; i < 6; i++) {
1271 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1273 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1281 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1284 int code, level, i, j, last, run, run_diff;
1287 const UINT8 *scan_table;
1296 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
1298 fprintf(stderr, "dc overflow-\n");
1302 rl = &rl_table[s->rl_table_index];
1303 if(level > 256*s->y_dc_scale){
1304 fprintf(stderr, "dc overflow+\n");
1308 rl = &rl_table[3 + s->rl_chroma_table_index];
1309 if(level > 256*s->c_dc_scale){
1310 fprintf(stderr, "dc overflow+\n");
1322 if (dc_pred_dir == 0)
1323 scan_table = ff_alternate_vertical_scan; /* left */
1325 scan_table = ff_alternate_horizontal_scan; /* top */
1327 scan_table = zigzag_direct;
1329 set_stat(ST_INTRA_AC);
1331 qmul = s->qscale << 1;
1332 qadd = (s->qscale - 1) | 1;
1334 rl = &rl_table[3 + s->rl_table_index];
1336 if(s->msmpeg4_version==2)
1342 s->block_last_index[n] = i - 1;
1345 scan_table = zigzag_direct;
1346 set_stat(ST_INTER_AC);
1350 code = get_vlc(&s->gb, &rl->vlc);
1353 if (code == rl->n) {
1355 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
1356 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
1358 last = get_bits1(&s->gb);
1359 run = get_bits(&s->gb, 6);
1360 level = get_bits(&s->gb, 8);
1361 level = (level << 24) >> 24; /* sign extend */
1362 #if 0 // waste of time / this will detect very few errors
1364 const int abs_level= ABS(level);
1365 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1366 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1367 if(abs_level <= rl->max_level[last][run]){
1368 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1369 return DECODING_AC_LOST;
1371 if(abs_level <= rl->max_level[last][run]*2){
1372 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1373 return DECODING_AC_LOST;
1375 if(abs_level <= rl->max_level[last][run1] && 0){
1376 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1377 return DECODING_AC_LOST;
1382 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1383 if (level>0) level= level * qmul + qadd;
1384 else level= level * qmul - qadd;
1385 #if 0 // waste of time too :(
1386 if(level>2048 || level<-2048){
1387 fprintf(stderr, "|level| overflow in 3. esc\n");
1388 return DECODING_AC_LOST;
1393 code = get_vlc(&s->gb, &rl->vlc);
1394 if (code < 0 || code >= rl->n)
1396 run = rl->table_run[code];
1397 level = rl->table_level[code];
1398 last = code >= rl->last;
1399 run += rl->max_run[last][level] + run_diff;
1400 level= level * qmul + qadd;
1401 if (get_bits1(&s->gb))
1406 code = get_vlc(&s->gb, &rl->vlc);
1407 if (code < 0 || code >= rl->n)
1409 run = rl->table_run[code];
1410 level = rl->table_level[code];
1411 last = code >= rl->last;
1412 level += rl->max_level[last][run];
1413 level= level * qmul + qadd;
1414 if (get_bits1(&s->gb))
1418 run = rl->table_run[code];
1419 level = rl->table_level[code] * qmul + qadd;
1420 last = code >= rl->last;
1421 if (get_bits1(&s->gb))
1436 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1438 i = 64; /* XXX: not optimal */
1441 s->block_last_index[n] = i - 1;
1446 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1450 if(s->msmpeg4_version<=2){
1452 level = get_vlc(&s->gb, &v2_dc_lum_vlc);
1454 level = get_vlc(&s->gb, &v2_dc_chroma_vlc);
1459 }else{ //FIXME optimize use unified tables & index
1461 level = get_vlc(&s->gb, &dc_lum_vlc[s->dc_table_index]);
1463 level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]);
1466 fprintf(stderr, "illegal dc vlc\n");
1470 if (level == DC_MAX) {
1471 level = get_bits(&s->gb, 8);
1472 if (get_bits1(&s->gb))
1474 } else if (level != 0) {
1475 if (get_bits1(&s->gb))
1480 if(s->msmpeg4_version==1){
1482 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1485 /* update predictor */
1489 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1492 /* update predictor */
1494 *dc_val = level * s->y_dc_scale;
1496 *dc_val = level * s->c_dc_scale;
1503 static int msmpeg4_decode_motion(MpegEncContext * s,
1504 int *mx_ptr, int *my_ptr)
1509 mv = &mv_tables[s->mv_table_index];
1511 code = get_vlc(&s->gb, &mv->vlc);
1514 if (code == mv->n) {
1515 mx = get_bits(&s->gb, 6);
1516 my = get_bits(&s->gb, 6);
1518 mx = mv->table_mvx[code];
1519 my = mv->table_mvy[code];
1524 /* WARNING : they do not do exactly modulo encoding */