Browse code

Split the mpeg4 encoder and decoder off h263.c

Originally committed as revision 21079 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer authored on 2010/01/08 08:53:49
Showing 14 changed files
... ...
@@ -124,10 +124,10 @@ OBJS-$(CONFIG_H261_ENCODER)            += h261enc.o h261.o             \
124 124
                                           mpegvideo_enc.o motion_est.o \
125 125
                                           ratecontrol.o mpeg12data.o   \
126 126
                                           mpegvideo.o
127
-OBJS-$(CONFIG_H263_DECODER)            += h263dec.o h263.o flvdec.o intelh263dec.o \
127
+OBJS-$(CONFIG_H263_DECODER)            += h263dec.o h263.o mpeg4video.o mpeg4videodec.o flvdec.o intelh263dec.o \
128 128
                                           mpegvideo.o error_resilience.o
129 129
 OBJS-$(CONFIG_H263_VAAPI_HWACCEL)      += vaapi_mpeg4.o
130
-OBJS-$(CONFIG_H263_ENCODER)            += mpegvideo_enc.o motion_est.o      \
130
+OBJS-$(CONFIG_H263_ENCODER)            += mpegvideo_enc.o mpeg4video.o mpeg4videoenc.o motion_est.o      \
131 131
                                           ratecontrol.o h263.o flvenc.o mpeg12data.o \
132 132
                                           mpegvideo.o error_resilience.o
133 133
 OBJS-$(CONFIG_H264_DECODER)            += h264.o h264idct.o h264pred.o cabac.o \
... ...
@@ -37,11 +37,12 @@
37 37
 #include "dsputil.h"
38 38
 #include "avcodec.h"
39 39
 #include "mpegvideo.h"
40
+#include "h263.h"
40 41
 #include "h263data.h"
41
-#include "mpeg4data.h"
42 42
 #include "mathops.h"
43 43
 #include "unary.h"
44 44
 #include "flv.h"
45
+#include "mpeg4video.h"
45 46
 
46 47
 //#undef NDEBUG
47 48
 //#include <assert.h>
... ...
@@ -50,26 +51,12 @@
50 50
 // reading vlc values. Changing these may improve speed and data cache needs
51 51
 // be aware though that decreasing them may need the number of stages that is
52 52
 // passed to get_vlc* to be increased.
53
-#define INTRA_MCBPC_VLC_BITS 6
54
-#define INTER_MCBPC_VLC_BITS 7
55
-#define CBPY_VLC_BITS 6
56 53
 #define MV_VLC_BITS 9
57
-#define DC_VLC_BITS 9
58
-#define SPRITE_TRAJ_VLC_BITS 6
59
-#define MB_TYPE_B_VLC_BITS 4
60
-#define TEX_VLC_BITS 9
61 54
 #define H263_MBTYPE_B_VLC_BITS 6
62 55
 #define CBPC_B_VLC_BITS 3
63 56
 
64
-#if CONFIG_ENCODERS
65
-//The uni_DCtab_* tables below contain unified bits+length tables to encode DC
66
-//differences in mpeg4. Unified in the sense that the specification specifies
67
-//this encoding in several steps.
68
-static uint8_t uni_DCtab_lum_len[512];
69
-static uint8_t uni_DCtab_chrom_len[512];
70
-static uint16_t uni_DCtab_lum_bits[512];
71
-static uint16_t uni_DCtab_chrom_bits[512];
72 57
 
58
+#if CONFIG_ENCODERS
73 59
 /**
74 60
  * Table of number of bits a motion vector component needs.
75 61
  */
... ...
@@ -88,34 +75,16 @@ static uint8_t umv_fcode_tab[MAX_MV*2+1];
88 88
 
89 89
 //unified encoding tables for run length encoding of coefficients
90 90
 //unified in the sense that the specification specifies the encoding in several steps.
91
-static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
92
-static uint8_t  uni_mpeg4_intra_rl_len [64*64*2*2];
93
-static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
94
-static uint8_t  uni_mpeg4_inter_rl_len [64*64*2*2];
95 91
 static uint8_t  uni_h263_intra_aic_rl_len [64*64*2*2];
96 92
 static uint8_t  uni_h263_inter_rl_len [64*64*2*2];
97 93
 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
98 94
 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
99 95
 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
100 96
 
101
-/* mpeg4
102
-inter
103
-max level: 24/6
104
-max run: 53/63
105
-
106
-intra
107
-max level: 53/16
108
-max run: 29/41
109
-*/
110 97
 #endif
111 98
 
112
-static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
99
+static uint8_t static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
113 100
 
114
-#if 0 //3IV1 is quite rare and it slows things down a tiny bit
115
-#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
116
-#else
117
-#define IS_3IV1 0
118
-#endif
119 101
 
120 102
 int h263_get_picture_format(int width, int height)
121 103
 {
... ...
@@ -159,13 +128,13 @@ void ff_h263_show_pict_info(MpegEncContext *s){
159 159
  * This may be one of the standard aspect ratios or it specifies
160 160
  * that the aspect will be stored explicitly later.
161 161
  */
162
-static av_const int aspect_to_info(AVRational aspect){
162
+av_const int ff_h263_aspect_to_info(AVRational aspect){
163 163
     int i;
164 164
 
165 165
     if(aspect.num==0) aspect= (AVRational){1,1};
166 166
 
167 167
     for(i=1; i<6; i++){
168
-        if(av_cmp_q(pixel_aspect[i], aspect) == 0){
168
+        if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
169 169
             return i;
170 170
         }
171 171
     }
... ...
@@ -265,7 +234,7 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
265 265
 
266 266
                 if (format == 7) {
267 267
             /* Custom Picture Format (CPFMT) */
268
-            s->aspect_ratio_info= aspect_to_info(s->avctx->sample_aspect_ratio);
268
+            s->aspect_ratio_info= ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio);
269 269
 
270 270
             put_bits(&s->pb,4,s->aspect_ratio_info);
271 271
             put_bits(&s->pb,9,(s->width >> 2) - 1);
... ...
@@ -342,149 +311,6 @@ void h263_encode_gob_header(MpegEncContext * s, int mb_line)
342 342
 }
343 343
 
344 344
 /**
345
- * Returns the number of bits that encoding the 8x8 block in block would need.
346
- * @param[in]  block_last_index last index in scantable order that refers to a non zero element in block.
347
- */
348
-static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
349
-    int last=0;
350
-    int j;
351
-    int rate=0;
352
-
353
-    for(j=1; j<=block_last_index; j++){
354
-        const int index= scantable[j];
355
-        int level= block[index];
356
-        if(level){
357
-            level+= 64;
358
-            if((level&(~127)) == 0){
359
-                if(j<block_last_index) rate+= s->intra_ac_vlc_length     [UNI_AC_ENC_INDEX(j-last-1, level)];
360
-                else                   rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
361
-            }else
362
-                rate += s->ac_esc_length;
363
-
364
-            last= j;
365
-        }
366
-    }
367
-
368
-    return rate;
369
-}
370
-
371
-
372
-/**
373
- * Restores the ac coefficients in block that have been changed by decide_ac_pred().
374
- * This function also restores s->block_last_index.
375
- * @param[in,out] block MB coefficients, these will be restored
376
- * @param[in] dir ac prediction direction for each 8x8 block
377
- * @param[out] st scantable for each 8x8 block
378
- * @param[in] zigzag_last_index index refering to the last non zero coefficient in zigzag order
379
- */
380
-static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], const int zigzag_last_index[6])
381
-{
382
-    int i, n;
383
-    memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
384
-
385
-    for(n=0; n<6; n++){
386
-        int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
387
-
388
-        st[n]= s->intra_scantable.permutated;
389
-        if(dir[n]){
390
-            /* top prediction */
391
-            for(i=1; i<8; i++){
392
-                block[n][s->dsp.idct_permutation[i   ]] = ac_val[i+8];
393
-            }
394
-        }else{
395
-            /* left prediction */
396
-            for(i=1; i<8; i++){
397
-                block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i  ];
398
-            }
399
-        }
400
-    }
401
-}
402
-
403
-/**
404
- * Returns the optimal value (0 or 1) for the ac_pred element for the given MB in mpeg4.
405
- * This function will also update s->block_last_index and s->ac_val.
406
- * @param[in,out] block MB coefficients, these will be updated if 1 is returned
407
- * @param[in] dir ac prediction direction for each 8x8 block
408
- * @param[out] st scantable for each 8x8 block
409
- * @param[out] zigzag_last_index index refering to the last non zero coefficient in zigzag order
410
- */
411
-static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], int zigzag_last_index[6])
412
-{
413
-    int score= 0;
414
-    int i, n;
415
-    int8_t * const qscale_table= s->current_picture.qscale_table;
416
-
417
-    memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
418
-
419
-    for(n=0; n<6; n++){
420
-        int16_t *ac_val, *ac_val1;
421
-
422
-        score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
423
-
424
-        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
425
-        ac_val1= ac_val;
426
-        if(dir[n]){
427
-            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
428
-            /* top prediction */
429
-            ac_val-= s->block_wrap[n]*16;
430
-            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
431
-                /* same qscale */
432
-                for(i=1; i<8; i++){
433
-                    const int level= block[n][s->dsp.idct_permutation[i   ]];
434
-                    block[n][s->dsp.idct_permutation[i   ]] = level - ac_val[i+8];
435
-                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
436
-                    ac_val1[i+8]= level;
437
-                }
438
-            }else{
439
-                /* different qscale, we must rescale */
440
-                for(i=1; i<8; i++){
441
-                    const int level= block[n][s->dsp.idct_permutation[i   ]];
442
-                    block[n][s->dsp.idct_permutation[i   ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
443
-                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
444
-                    ac_val1[i+8]= level;
445
-                }
446
-            }
447
-            st[n]= s->intra_h_scantable.permutated;
448
-        }else{
449
-            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
450
-            /* left prediction */
451
-            ac_val-= 16;
452
-            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
453
-                /* same qscale */
454
-                for(i=1; i<8; i++){
455
-                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
456
-                    block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
457
-                    ac_val1[i  ]= level;
458
-                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
459
-                }
460
-            }else{
461
-                /* different qscale, we must rescale */
462
-                for(i=1; i<8; i++){
463
-                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
464
-                    block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
465
-                    ac_val1[i  ]= level;
466
-                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
467
-                }
468
-            }
469
-            st[n]= s->intra_v_scantable.permutated;
470
-        }
471
-
472
-        for(i=63; i>0; i--) //FIXME optimize
473
-            if(block[n][ st[n][i] ]) break;
474
-        s->block_last_index[n]= i;
475
-
476
-        score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
477
-    }
478
-
479
-    if(score < 0){
480
-        return 1;
481
-    }else{
482
-        restore_ac_coeffs(s, block, dir, st, zigzag_last_index);
483
-        return 0;
484
-    }
485
-}
486
-
487
-/**
488 345
  * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
489 346
  */
490 347
 void ff_clean_h263_qscales(MpegEncContext *s){
... ...
@@ -513,49 +339,12 @@ void ff_clean_h263_qscales(MpegEncContext *s){
513 513
     }
514 514
 }
515 515
 
516
-/**
517
- * modify mb_type & qscale so that encoding is acually possible in mpeg4
518
- */
519
-void ff_clean_mpeg4_qscales(MpegEncContext *s){
520
-    int i;
521
-    int8_t * const qscale_table= s->current_picture.qscale_table;
522
-
523
-    ff_clean_h263_qscales(s);
524
-
525
-    if(s->pict_type== FF_B_TYPE){
526
-        int odd=0;
527
-        /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
528
-
529
-        for(i=0; i<s->mb_num; i++){
530
-            int mb_xy= s->mb_index2xy[i];
531
-            odd += qscale_table[mb_xy]&1;
532
-        }
533
-
534
-        if(2*odd > s->mb_num) odd=1;
535
-        else                  odd=0;
536
-
537
-        for(i=0; i<s->mb_num; i++){
538
-            int mb_xy= s->mb_index2xy[i];
539
-            if((qscale_table[mb_xy]&1) != odd)
540
-                qscale_table[mb_xy]++;
541
-            if(qscale_table[mb_xy] > 31)
542
-                qscale_table[mb_xy]= 31;
543
-        }
544
-
545
-        for(i=1; i<s->mb_num; i++){
546
-            int mb_xy= s->mb_index2xy[i];
547
-            if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
548
-                s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
549
-            }
550
-        }
551
-    }
552
-}
553
-
554 516
 #endif //CONFIG_ENCODERS
555 517
 
556 518
 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
557 519
 #define tab_bias (tab_size/2)
558 520
 
521
+//used by mpeg4 and rv10 decoder
559 522
 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
560 523
     int i;
561 524
     for(i=0; i<tab_size; i++){
... ...
@@ -702,828 +491,10 @@ void ff_h263_update_motion_val(MpegEncContext * s){
702 702
     }
703 703
 }
704 704
 
705
-/**
706
- * predicts the dc.
707
- * encoding quantized level -> quantized diff
708
- * decoding quantized diff -> quantized level
709
- * @param n block index (0-3 are luma, 4-5 are chroma)
710
- * @param dir_ptr pointer to an integer where the prediction direction will be stored
711
- */
712
-static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
713
-{
714
-    int a, b, c, wrap, pred, scale, ret;
715
-    int16_t *dc_val;
716
-
717
-    /* find prediction */
718
-    if (n < 4) {
719
-        scale = s->y_dc_scale;
720
-    } else {
721
-        scale = s->c_dc_scale;
722
-    }
723
-    if(IS_3IV1)
724
-        scale= 8;
725
-
726
-    wrap= s->block_wrap[n];
727
-    dc_val = s->dc_val[0] + s->block_index[n];
728
-
729
-    /* B C
730
-     * A X
731
-     */
732
-    a = dc_val[ - 1];
733
-    b = dc_val[ - 1 - wrap];
734
-    c = dc_val[ - wrap];
735
-
736
-    /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
737
-    if(s->first_slice_line && n!=3){
738
-        if(n!=2) b=c= 1024;
739
-        if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
740
-    }
741
-    if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
742
-        if(n==0 || n==4 || n==5)
743
-            b=1024;
744
-    }
745
-
746
-    if (abs(a - b) < abs(b - c)) {
747
-        pred = c;
748
-        *dir_ptr = 1; /* top */
749
-    } else {
750
-        pred = a;
751
-        *dir_ptr = 0; /* left */
752
-    }
753
-    /* we assume pred is positive */
754
-    pred = FASTDIV((pred + (scale >> 1)), scale);
755
-
756
-    if(encoding){
757
-        ret = level - pred;
758
-    }else{
759
-        level += pred;
760
-        ret= level;
761
-        if(s->error_recognition>=3){
762
-            if(level<0){
763
-                av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
764
-                return -1;
765
-            }
766
-            if(level*scale > 2048 + scale){
767
-                av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
768
-                return -1;
769
-            }
770
-        }
771
-    }
772
-    level *=scale;
773
-    if(level&(~2047)){
774
-        if(level<0)
775
-            level=0;
776
-        else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
777
-            level=2047;
778
-    }
779
-    dc_val[0]= level;
780
-
781
-    return ret;
782
-}
783
-
784 705
 #if CONFIG_ENCODERS
785 706
 
786
-/**
787
- * encodes the dc value.
788
- * @param n block index (0-3 are luma, 4-5 are chroma)
789
- */
790
-static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
791
-{
792
-#if 1
793
-    level+=256;
794
-    if (n < 4) {
795
-        /* luminance */
796
-        put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
797
-    } else {
798
-        /* chrominance */
799
-        put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
800
-    }
801
-#else
802
-    int size, v;
803
-    /* find number of bits */
804
-    size = 0;
805
-    v = abs(level);
806
-    while (v) {
807
-        v >>= 1;
808
-        size++;
809
-    }
810
-
811
-    if (n < 4) {
812
-        /* luminance */
813
-        put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
814
-    } else {
815
-        /* chrominance */
816
-        put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
817
-    }
818
-
819
-    /* encode remaining bits */
820
-    if (size > 0) {
821
-        if (level < 0)
822
-            level = (-level) ^ ((1 << size) - 1);
823
-        put_bits(&s->pb, size, level);
824
-        if (size > 8)
825
-            put_bits(&s->pb, 1, 1);
826
-    }
827
-#endif
828
-}
829
-
830
-static inline int mpeg4_get_dc_length(int level, int n){
831
-    if (n < 4) {
832
-        return uni_DCtab_lum_len[level + 256];
833
-    } else {
834
-        return uni_DCtab_chrom_len[level + 256];
835
-    }
836
-}
837
-
838
-/**
839
- * encodes a 8x8 block
840
- * @param n block index (0-3 are luma, 4-5 are chroma)
841
- */
842
-static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
843
-                               uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
844
-{
845
-    int i, last_non_zero;
846
-#if 0 //variables for the outcommented version
847
-    int code, sign, last;
848
-#endif
849
-    const RLTable *rl;
850
-    uint32_t *bits_tab;
851
-    uint8_t *len_tab;
852
-    const int last_index = s->block_last_index[n];
853
-
854
-    if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
855
-        /* mpeg4 based DC predictor */
856
-        mpeg4_encode_dc(dc_pb, intra_dc, n);
857
-        if(last_index<1) return;
858
-        i = 1;
859
-        rl = &rl_intra;
860
-        bits_tab= uni_mpeg4_intra_rl_bits;
861
-        len_tab = uni_mpeg4_intra_rl_len;
862
-    } else {
863
-        if(last_index<0) return;
864
-        i = 0;
865
-        rl = &rl_inter;
866
-        bits_tab= uni_mpeg4_inter_rl_bits;
867
-        len_tab = uni_mpeg4_inter_rl_len;
868
-    }
869
-
870
-    /* AC coefs */
871
-    last_non_zero = i - 1;
872
-#if 1
873
-    for (; i < last_index; i++) {
874
-        int level = block[ scan_table[i] ];
875
-        if (level) {
876
-            int run = i - last_non_zero - 1;
877
-            level+=64;
878
-            if((level&(~127)) == 0){
879
-                const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
880
-                put_bits(ac_pb, len_tab[index], bits_tab[index]);
881
-            }else{ //ESC3
882
-                put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
883
-            }
884
-            last_non_zero = i;
885
-        }
886
-    }
887
-    /*if(i<=last_index)*/{
888
-        int level = block[ scan_table[i] ];
889
-        int run = i - last_non_zero - 1;
890
-        level+=64;
891
-        if((level&(~127)) == 0){
892
-            const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
893
-            put_bits(ac_pb, len_tab[index], bits_tab[index]);
894
-        }else{ //ESC3
895
-            put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
896
-        }
897
-    }
898
-#else
899
-    for (; i <= last_index; i++) {
900
-        const int slevel = block[ scan_table[i] ];
901
-        if (slevel) {
902
-            int level;
903
-            int run = i - last_non_zero - 1;
904
-            last = (i == last_index);
905
-            sign = 0;
906
-            level = slevel;
907
-            if (level < 0) {
908
-                sign = 1;
909
-                level = -level;
910
-            }
911
-            code = get_rl_index(rl, last, run, level);
912
-            put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
913
-            if (code == rl->n) {
914
-                int level1, run1;
915
-                level1 = level - rl->max_level[last][run];
916
-                if (level1 < 1)
917
-                    goto esc2;
918
-                code = get_rl_index(rl, last, run, level1);
919
-                if (code == rl->n) {
920
-                esc2:
921
-                    put_bits(ac_pb, 1, 1);
922
-                    if (level > MAX_LEVEL)
923
-                        goto esc3;
924
-                    run1 = run - rl->max_run[last][level] - 1;
925
-                    if (run1 < 0)
926
-                        goto esc3;
927
-                    code = get_rl_index(rl, last, run1, level);
928
-                    if (code == rl->n) {
929
-                    esc3:
930
-                        /* third escape */
931
-                        put_bits(ac_pb, 1, 1);
932
-                        put_bits(ac_pb, 1, last);
933
-                        put_bits(ac_pb, 6, run);
934
-                        put_bits(ac_pb, 1, 1);
935
-                        put_sbits(ac_pb, 12, slevel);
936
-                        put_bits(ac_pb, 1, 1);
937
-                    } else {
938
-                        /* second escape */
939
-                        put_bits(ac_pb, 1, 0);
940
-                        put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
941
-                        put_bits(ac_pb, 1, sign);
942
-                    }
943
-                } else {
944
-                    /* first escape */
945
-                    put_bits(ac_pb, 1, 0);
946
-                    put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
947
-                    put_bits(ac_pb, 1, sign);
948
-                }
949
-            } else {
950
-                put_bits(ac_pb, 1, sign);
951
-            }
952
-            last_non_zero = i;
953
-        }
954
-    }
955
-#endif
956
-}
957
-
958
-static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
959
-                               uint8_t *scan_table)
960
-{
961
-    int i, last_non_zero;
962
-    uint8_t *len_tab;
963
-    const int last_index = s->block_last_index[n];
964
-    int len=0;
965
-
966
-    if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
967
-        /* mpeg4 based DC predictor */
968
-        len += mpeg4_get_dc_length(intra_dc, n);
969
-        if(last_index<1) return len;
970
-        i = 1;
971
-        len_tab = uni_mpeg4_intra_rl_len;
972
-    } else {
973
-        if(last_index<0) return 0;
974
-        i = 0;
975
-        len_tab = uni_mpeg4_inter_rl_len;
976
-    }
977
-
978
-    /* AC coefs */
979
-    last_non_zero = i - 1;
980
-    for (; i < last_index; i++) {
981
-        int level = block[ scan_table[i] ];
982
-        if (level) {
983
-            int run = i - last_non_zero - 1;
984
-            level+=64;
985
-            if((level&(~127)) == 0){
986
-                const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
987
-                len += len_tab[index];
988
-            }else{ //ESC3
989
-                len += 7+2+1+6+1+12+1;
990
-            }
991
-            last_non_zero = i;
992
-        }
993
-    }
994
-    /*if(i<=last_index)*/{
995
-        int level = block[ scan_table[i] ];
996
-        int run = i - last_non_zero - 1;
997
-        level+=64;
998
-        if((level&(~127)) == 0){
999
-            const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
1000
-            len += len_tab[index];
1001
-        }else{ //ESC3
1002
-            len += 7+2+1+6+1+12+1;
1003
-        }
1004
-    }
1005
-
1006
-    return len;
1007
-}
1008
-
1009
-static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
1010
-    int l, bit_size, code;
1011
-
1012
-    if (val == 0) {
1013
-        return mvtab[0][1];
1014
-    } else {
1015
-        bit_size = f_code - 1;
1016
-        /* modulo encoding */
1017
-        l= INT_BIT - 6 - bit_size;
1018
-        val = (val<<l)>>l;
1019
-        val--;
1020
-        code = (val >> bit_size) + 1;
1021
-
1022
-        return mvtab[code][1] + 1 + bit_size;
1023
-    }
1024
-}
1025
-
1026
-static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
1027
-    if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
1028
-        skip_put_bits(&s->pb,
1029
-            h263_get_motion_length(s, x, f_code)
1030
-           +h263_get_motion_length(s, y, f_code));
1031
-    }else{
1032
-        ff_h263_encode_motion(s, x, f_code);
1033
-        ff_h263_encode_motion(s, y, f_code);
1034
-    }
1035
-}
1036
-
1037
-static inline int get_p_cbp(MpegEncContext * s,
1038
-                      DCTELEM block[6][64],
1039
-                      int motion_x, int motion_y){
1040
-    int cbp, i;
1041
-
1042
-    if(s->flags & CODEC_FLAG_CBP_RD){
1043
-        int best_cbpy_score= INT_MAX;
1044
-        int best_cbpc_score= INT_MAX;
1045
-        int cbpc = (-1), cbpy= (-1);
1046
-        const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
1047
-        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
1048
-
1049
-        for(i=0; i<4; i++){
1050
-            int score= inter_MCBPC_bits[i + offset] * lambda;
1051
-            if(i&1) score += s->coded_score[5];
1052
-            if(i&2) score += s->coded_score[4];
1053
-
1054
-            if(score < best_cbpc_score){
1055
-                best_cbpc_score= score;
1056
-                cbpc= i;
1057
-            }
1058
-        }
1059
-
1060
-        for(i=0; i<16; i++){
1061
-            int score= cbpy_tab[i ^ 0xF][1] * lambda;
1062
-            if(i&1) score += s->coded_score[3];
1063
-            if(i&2) score += s->coded_score[2];
1064
-            if(i&4) score += s->coded_score[1];
1065
-            if(i&8) score += s->coded_score[0];
1066
-
1067
-            if(score < best_cbpy_score){
1068
-                best_cbpy_score= score;
1069
-                cbpy= i;
1070
-            }
1071
-        }
1072
-        cbp= cbpc + 4*cbpy;
1073
-        if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
1074
-            if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
1075
-                cbp= 0;
1076
-        }
1077
-
1078
-        for (i = 0; i < 6; i++) {
1079
-            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
1080
-                s->block_last_index[i]= -1;
1081
-                s->dsp.clear_block(s->block[i]);
1082
-            }
1083
-        }
1084
-    }else{
1085
-        cbp= 0;
1086
-        for (i = 0; i < 6; i++) {
1087
-            if (s->block_last_index[i] >= 0)
1088
-                cbp |= 1 << (5 - i);
1089
-        }
1090
-    }
1091
-    return cbp;
1092
-}
1093
-
1094
-static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
1095
-                            int motion_x, int motion_y, int mb_type){
1096
-    int cbp=0, i;
1097
-
1098
-    if(s->flags & CODEC_FLAG_CBP_RD){
1099
-        int score=0;
1100
-        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
1101
-
1102
-        for(i=0; i<6; i++){
1103
-            if(s->coded_score[i] < 0){
1104
-                score += s->coded_score[i];
1105
-                cbp |= 1 << (5 - i);
1106
-            }
1107
-        }
1108
-
1109
-        if(cbp){
1110
-            int zero_score= -6;
1111
-            if ((motion_x | motion_y | s->dquant | mb_type) == 0){
1112
-                zero_score-= 4; //2*MV + mb_type + cbp bit
1113
-            }
1114
-
1115
-            zero_score*= lambda;
1116
-            if(zero_score <= score){
1117
-                cbp=0;
1118
-            }
1119
-        }
1120
-
1121
-        for (i = 0; i < 6; i++) {
1122
-            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
1123
-                s->block_last_index[i]= -1;
1124
-                s->dsp.clear_block(s->block[i]);
1125
-            }
1126
-        }
1127
-    }else{
1128
-        for (i = 0; i < 6; i++) {
1129
-            if (s->block_last_index[i] >= 0)
1130
-                cbp |= 1 << (5 - i);
1131
-        }
1132
-    }
1133
-    return cbp;
1134
-}
1135
-
1136
-static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
1137
-                               uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
1138
-    int i;
1139
-
1140
-    if(scan_table){
1141
-        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
1142
-            for (i = 0; i < 6; i++) {
1143
-                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
1144
-            }
1145
-        }else{
1146
-            /* encode each block */
1147
-            for (i = 0; i < 6; i++) {
1148
-                mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
1149
-            }
1150
-        }
1151
-    }else{
1152
-        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
1153
-            for (i = 0; i < 6; i++) {
1154
-                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
1155
-            }
1156
-        }else{
1157
-            /* encode each block */
1158
-            for (i = 0; i < 6; i++) {
1159
-                mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
1160
-            }
1161
-        }
1162
-    }
1163
-}
1164
-
1165 707
 static const int dquant_code[5]= {1,0,9,2,3};
1166 708
 
1167
-void mpeg4_encode_mb(MpegEncContext * s,
1168
-                    DCTELEM block[6][64],
1169
-                    int motion_x, int motion_y)
1170
-{
1171
-    int cbpc, cbpy, pred_x, pred_y;
1172
-    PutBitContext * const pb2    = s->data_partitioning                         ? &s->pb2    : &s->pb;
1173
-    PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
1174
-    PutBitContext * const dc_pb  = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2    : &s->pb;
1175
-    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
1176
-
1177
-    if (!s->mb_intra) {
1178
-        int i, cbp;
1179
-
1180
-        if(s->pict_type==FF_B_TYPE){
1181
-            static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
1182
-            int mb_type=  mb_type_table[s->mv_dir];
1183
-
1184
-            if(s->mb_x==0){
1185
-                for(i=0; i<2; i++){
1186
-                    s->last_mv[i][0][0]=
1187
-                    s->last_mv[i][0][1]=
1188
-                    s->last_mv[i][1][0]=
1189
-                    s->last_mv[i][1][1]= 0;
1190
-                }
1191
-            }
1192
-
1193
-            assert(s->dquant>=-2 && s->dquant<=2);
1194
-            assert((s->dquant&1)==0);
1195
-            assert(mb_type>=0);
1196
-
1197
-            /* nothing to do if this MB was skipped in the next P Frame */
1198
-            if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
1199
-                s->skip_count++;
1200
-                s->mv[0][0][0]=
1201
-                s->mv[0][0][1]=
1202
-                s->mv[1][0][0]=
1203
-                s->mv[1][0][1]= 0;
1204
-                s->mv_dir= MV_DIR_FORWARD; //doesn't matter
1205
-                s->qscale -= s->dquant;
1206
-//                s->mb_skipped=1;
1207
-
1208
-                return;
1209
-            }
1210
-
1211
-            cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
1212
-
1213
-            if ((cbp | motion_x | motion_y | mb_type) ==0) {
1214
-                /* direct MB with MV={0,0} */
1215
-                assert(s->dquant==0);
1216
-
1217
-                put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
1218
-
1219
-                if(interleaved_stats){
1220
-                    s->misc_bits++;
1221
-                    s->last_bits++;
1222
-                }
1223
-                s->skip_count++;
1224
-                return;
1225
-            }
1226
-
1227
-            put_bits(&s->pb, 1, 0);     /* mb coded modb1=0 */
1228
-            put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
1229
-            put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
1230
-            if(cbp) put_bits(&s->pb, 6, cbp);
1231
-
1232
-            if(cbp && mb_type){
1233
-                if(s->dquant)
1234
-                    put_bits(&s->pb, 2, (s->dquant>>2)+3);
1235
-                else
1236
-                    put_bits(&s->pb, 1, 0);
1237
-            }else
1238
-                s->qscale -= s->dquant;
1239
-
1240
-            if(!s->progressive_sequence){
1241
-                if(cbp)
1242
-                    put_bits(&s->pb, 1, s->interlaced_dct);
1243
-                if(mb_type) // not direct mode
1244
-                    put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
1245
-            }
1246
-
1247
-            if(interleaved_stats){
1248
-                s->misc_bits+= get_bits_diff(s);
1249
-            }
1250
-
1251
-            if(mb_type == 0){
1252
-                assert(s->mv_dir & MV_DIRECT);
1253
-                ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
1254
-                s->b_count++;
1255
-                s->f_count++;
1256
-            }else{
1257
-                assert(mb_type > 0 && mb_type < 4);
1258
-                if(s->mv_type != MV_TYPE_FIELD){
1259
-                    if(s->mv_dir & MV_DIR_FORWARD){
1260
-                        ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
1261
-                                                        s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
1262
-                        s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
1263
-                        s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
1264
-                        s->f_count++;
1265
-                    }
1266
-                    if(s->mv_dir & MV_DIR_BACKWARD){
1267
-                        ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
1268
-                                                        s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
1269
-                        s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
1270
-                        s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
1271
-                        s->b_count++;
1272
-                    }
1273
-                }else{
1274
-                    if(s->mv_dir & MV_DIR_FORWARD){
1275
-                        put_bits(&s->pb, 1, s->field_select[0][0]);
1276
-                        put_bits(&s->pb, 1, s->field_select[0][1]);
1277
-                    }
1278
-                    if(s->mv_dir & MV_DIR_BACKWARD){
1279
-                        put_bits(&s->pb, 1, s->field_select[1][0]);
1280
-                        put_bits(&s->pb, 1, s->field_select[1][1]);
1281
-                    }
1282
-                    if(s->mv_dir & MV_DIR_FORWARD){
1283
-                        for(i=0; i<2; i++){
1284
-                            ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0]  ,
1285
-                                                            s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1286
-                            s->last_mv[0][i][0]= s->mv[0][i][0];
1287
-                            s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1288
-                        }
1289
-                        s->f_count++;
1290
-                    }
1291
-                    if(s->mv_dir & MV_DIR_BACKWARD){
1292
-                        for(i=0; i<2; i++){
1293
-                            ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0]  ,
1294
-                                                            s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1295
-                            s->last_mv[1][i][0]= s->mv[1][i][0];
1296
-                            s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1297
-                        }
1298
-                        s->b_count++;
1299
-                    }
1300
-                }
1301
-            }
1302
-
1303
-            if(interleaved_stats){
1304
-                s->mv_bits+= get_bits_diff(s);
1305
-            }
1306
-
1307
-            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1308
-
1309
-            if(interleaved_stats){
1310
-                s->p_tex_bits+= get_bits_diff(s);
1311
-            }
1312
-
1313
-        }else{ /* s->pict_type==FF_B_TYPE */
1314
-            cbp= get_p_cbp(s, block, motion_x, motion_y);
1315
-
1316
-            if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1317
-                /* check if the B frames can skip it too, as we must skip it if we skip here
1318
-                   why didn't they just compress the skip-mb bits instead of reusing them ?! */
1319
-                if(s->max_b_frames>0){
1320
-                    int i;
1321
-                    int x,y, offset;
1322
-                    uint8_t *p_pic;
1323
-
1324
-                    x= s->mb_x*16;
1325
-                    y= s->mb_y*16;
1326
-                    if(x+16 > s->width)  x= s->width-16;
1327
-                    if(y+16 > s->height) y= s->height-16;
1328
-
1329
-                    offset= x + y*s->linesize;
1330
-                    p_pic= s->new_picture.data[0] + offset;
1331
-
1332
-                    s->mb_skipped=1;
1333
-                    for(i=0; i<s->max_b_frames; i++){
1334
-                        uint8_t *b_pic;
1335
-                        int diff;
1336
-                        Picture *pic= s->reordered_input_picture[i+1];
1337
-
1338
-                        if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1339
-
1340
-                        b_pic= pic->data[0] + offset;
1341
-                        if(pic->type != FF_BUFFER_TYPE_SHARED)
1342
-                            b_pic+= INPLACE_OFFSET;
1343
-                        diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1344
-                        if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1345
-                            s->mb_skipped=0;
1346
-                            break;
1347
-                        }
1348
-                    }
1349
-                }else
1350
-                    s->mb_skipped=1;
1351
-
1352
-                if(s->mb_skipped==1){
1353
-                    /* skip macroblock */
1354
-                    put_bits(&s->pb, 1, 1);
1355
-
1356
-                    if(interleaved_stats){
1357
-                        s->misc_bits++;
1358
-                        s->last_bits++;
1359
-                    }
1360
-                    s->skip_count++;
1361
-
1362
-                    return;
1363
-                }
1364
-            }
1365
-
1366
-            put_bits(&s->pb, 1, 0);     /* mb coded */
1367
-            cbpc = cbp & 3;
1368
-            cbpy = cbp >> 2;
1369
-            cbpy ^= 0xf;
1370
-            if(s->mv_type==MV_TYPE_16X16){
1371
-                if(s->dquant) cbpc+= 8;
1372
-                put_bits(&s->pb,
1373
-                        inter_MCBPC_bits[cbpc],
1374
-                        inter_MCBPC_code[cbpc]);
1375
-
1376
-                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1377
-                if(s->dquant)
1378
-                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
1379
-
1380
-                if(!s->progressive_sequence){
1381
-                    if(cbp)
1382
-                        put_bits(pb2, 1, s->interlaced_dct);
1383
-                    put_bits(pb2, 1, 0);
1384
-                }
1385
-
1386
-                if(interleaved_stats){
1387
-                    s->misc_bits+= get_bits_diff(s);
1388
-                }
1389
-
1390
-                /* motion vectors: 16x16 mode */
1391
-                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1392
-
1393
-                ff_h263_encode_motion_vector(s, motion_x - pred_x,
1394
-                                                motion_y - pred_y, s->f_code);
1395
-            }else if(s->mv_type==MV_TYPE_FIELD){
1396
-                if(s->dquant) cbpc+= 8;
1397
-                put_bits(&s->pb,
1398
-                        inter_MCBPC_bits[cbpc],
1399
-                        inter_MCBPC_code[cbpc]);
1400
-
1401
-                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1402
-                if(s->dquant)
1403
-                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
1404
-
1405
-                assert(!s->progressive_sequence);
1406
-                if(cbp)
1407
-                    put_bits(pb2, 1, s->interlaced_dct);
1408
-                put_bits(pb2, 1, 1);
1409
-
1410
-                if(interleaved_stats){
1411
-                    s->misc_bits+= get_bits_diff(s);
1412
-                }
1413
-
1414
-                /* motion vectors: 16x8 interlaced mode */
1415
-                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1416
-                pred_y /=2;
1417
-
1418
-                put_bits(&s->pb, 1, s->field_select[0][0]);
1419
-                put_bits(&s->pb, 1, s->field_select[0][1]);
1420
-
1421
-                ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1422
-                                                s->mv[0][0][1] - pred_y, s->f_code);
1423
-                ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1424
-                                                s->mv[0][1][1] - pred_y, s->f_code);
1425
-            }else{
1426
-                assert(s->mv_type==MV_TYPE_8X8);
1427
-                put_bits(&s->pb,
1428
-                        inter_MCBPC_bits[cbpc+16],
1429
-                        inter_MCBPC_code[cbpc+16]);
1430
-                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1431
-
1432
-                if(!s->progressive_sequence){
1433
-                    if(cbp)
1434
-                        put_bits(pb2, 1, s->interlaced_dct);
1435
-                }
1436
-
1437
-                if(interleaved_stats){
1438
-                    s->misc_bits+= get_bits_diff(s);
1439
-                }
1440
-
1441
-                for(i=0; i<4; i++){
1442
-                    /* motion vectors: 8x8 mode*/
1443
-                    h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1444
-
1445
-                    ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1446
-                                                    s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1447
-                }
1448
-            }
1449
-
1450
-            if(interleaved_stats){
1451
-                s->mv_bits+= get_bits_diff(s);
1452
-            }
1453
-
1454
-            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1455
-
1456
-            if(interleaved_stats){
1457
-                s->p_tex_bits+= get_bits_diff(s);
1458
-            }
1459
-            s->f_count++;
1460
-        }
1461
-    } else {
1462
-        int cbp;
1463
-        int dc_diff[6];   //dc values with the dc prediction subtracted
1464
-        int dir[6];  //prediction direction
1465
-        int zigzag_last_index[6];
1466
-        uint8_t *scan_table[6];
1467
-        int i;
1468
-
1469
-        for(i=0; i<6; i++){
1470
-            dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1471
-        }
1472
-
1473
-        if(s->flags & CODEC_FLAG_AC_PRED){
1474
-            s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1475
-        }else{
1476
-            for(i=0; i<6; i++)
1477
-                scan_table[i]= s->intra_scantable.permutated;
1478
-        }
1479
-
1480
-        /* compute cbp */
1481
-        cbp = 0;
1482
-        for (i = 0; i < 6; i++) {
1483
-            if (s->block_last_index[i] >= 1)
1484
-                cbp |= 1 << (5 - i);
1485
-        }
1486
-
1487
-        cbpc = cbp & 3;
1488
-        if (s->pict_type == FF_I_TYPE) {
1489
-            if(s->dquant) cbpc+=4;
1490
-            put_bits(&s->pb,
1491
-                intra_MCBPC_bits[cbpc],
1492
-                intra_MCBPC_code[cbpc]);
1493
-        } else {
1494
-            if(s->dquant) cbpc+=8;
1495
-            put_bits(&s->pb, 1, 0);     /* mb coded */
1496
-            put_bits(&s->pb,
1497
-                inter_MCBPC_bits[cbpc + 4],
1498
-                inter_MCBPC_code[cbpc + 4]);
1499
-        }
1500
-        put_bits(pb2, 1, s->ac_pred);
1501
-        cbpy = cbp >> 2;
1502
-        put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1503
-        if(s->dquant)
1504
-            put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1505
-
1506
-        if(!s->progressive_sequence){
1507
-            put_bits(dc_pb, 1, s->interlaced_dct);
1508
-        }
1509
-
1510
-        if(interleaved_stats){
1511
-            s->misc_bits+= get_bits_diff(s);
1512
-        }
1513
-
1514
-        mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1515
-
1516
-        if(interleaved_stats){
1517
-            s->i_tex_bits+= get_bits_diff(s);
1518
-        }
1519
-        s->i_count++;
1520
-
1521
-        /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1522
-        if(s->ac_pred)
1523
-            restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1524
-    }
1525
-}
1526
-
1527 709
 /**
1528 710
  * encodes a 8x8 block.
1529 711
  * @param block the 8x8 block
... ...
@@ -2155,259 +1126,6 @@ int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
2155 2155
 #if CONFIG_ENCODERS
2156 2156
 
2157 2157
 /***************************************************/
2158
-/**
2159
- * add mpeg4 stuffing bits (01...1)
2160
- */
2161
-void ff_mpeg4_stuffing(PutBitContext * pbc)
2162
-{
2163
-    int length;
2164
-    put_bits(pbc, 1, 0);
2165
-    length= (-put_bits_count(pbc))&7;
2166
-    if(length) put_bits(pbc, length, (1<<length)-1);
2167
-}
2168
-
2169
-/* must be called before writing the header */
2170
-void ff_set_mpeg4_time(MpegEncContext * s){
2171
-    if(s->pict_type==FF_B_TYPE){
2172
-        ff_mpeg4_init_direct_mv(s);
2173
-    }else{
2174
-        s->last_time_base= s->time_base;
2175
-        s->time_base= s->time/s->avctx->time_base.den;
2176
-    }
2177
-}
2178
-
2179
-static void mpeg4_encode_gop_header(MpegEncContext * s){
2180
-    int hours, minutes, seconds;
2181
-    int64_t time;
2182
-
2183
-    put_bits(&s->pb, 16, 0);
2184
-    put_bits(&s->pb, 16, GOP_STARTCODE);
2185
-
2186
-    time= s->current_picture_ptr->pts;
2187
-    if(s->reordered_input_picture[1])
2188
-        time= FFMIN(time, s->reordered_input_picture[1]->pts);
2189
-    time= time*s->avctx->time_base.num;
2190
-
2191
-    seconds= time/s->avctx->time_base.den;
2192
-    minutes= seconds/60; seconds %= 60;
2193
-    hours= minutes/60; minutes %= 60;
2194
-    hours%=24;
2195
-
2196
-    put_bits(&s->pb, 5, hours);
2197
-    put_bits(&s->pb, 6, minutes);
2198
-    put_bits(&s->pb, 1, 1);
2199
-    put_bits(&s->pb, 6, seconds);
2200
-
2201
-    put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2202
-    put_bits(&s->pb, 1, 0); //broken link == NO
2203
-
2204
-    s->last_time_base= time / s->avctx->time_base.den;
2205
-
2206
-    ff_mpeg4_stuffing(&s->pb);
2207
-}
2208
-
2209
-static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2210
-    int profile_and_level_indication;
2211
-    int vo_ver_id;
2212
-
2213
-    if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2214
-        profile_and_level_indication = s->avctx->profile << 4;
2215
-    }else if(s->max_b_frames || s->quarter_sample){
2216
-        profile_and_level_indication= 0xF0; // adv simple
2217
-    }else{
2218
-        profile_and_level_indication= 0x00; // simple
2219
-    }
2220
-
2221
-    if(s->avctx->level != FF_LEVEL_UNKNOWN){
2222
-        profile_and_level_indication |= s->avctx->level;
2223
-    }else{
2224
-        profile_and_level_indication |= 1; //level 1
2225
-    }
2226
-
2227
-    if(profile_and_level_indication>>4 == 0xF){
2228
-        vo_ver_id= 5;
2229
-    }else{
2230
-        vo_ver_id= 1;
2231
-    }
2232
-
2233
-    //FIXME levels
2234
-
2235
-    put_bits(&s->pb, 16, 0);
2236
-    put_bits(&s->pb, 16, VOS_STARTCODE);
2237
-
2238
-    put_bits(&s->pb, 8, profile_and_level_indication);
2239
-
2240
-    put_bits(&s->pb, 16, 0);
2241
-    put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2242
-
2243
-    put_bits(&s->pb, 1, 1);
2244
-        put_bits(&s->pb, 4, vo_ver_id);
2245
-        put_bits(&s->pb, 3, 1); //priority
2246
-
2247
-    put_bits(&s->pb, 4, 1); //visual obj type== video obj
2248
-
2249
-    put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2250
-
2251
-    ff_mpeg4_stuffing(&s->pb);
2252
-}
2253
-
2254
-static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2255
-{
2256
-    int vo_ver_id;
2257
-
2258
-    if (!CONFIG_MPEG4_ENCODER)  return;
2259
-
2260
-    if(s->max_b_frames || s->quarter_sample){
2261
-        vo_ver_id= 5;
2262
-        s->vo_type= ADV_SIMPLE_VO_TYPE;
2263
-    }else{
2264
-        vo_ver_id= 1;
2265
-        s->vo_type= SIMPLE_VO_TYPE;
2266
-    }
2267
-
2268
-    put_bits(&s->pb, 16, 0);
2269
-    put_bits(&s->pb, 16, 0x100 + vo_number);        /* video obj */
2270
-    put_bits(&s->pb, 16, 0);
2271
-    put_bits(&s->pb, 16, 0x120 + vol_number);       /* video obj layer */
2272
-
2273
-    put_bits(&s->pb, 1, 0);             /* random access vol */
2274
-    put_bits(&s->pb, 8, s->vo_type);    /* video obj type indication */
2275
-    if(s->workaround_bugs & FF_BUG_MS) {
2276
-        put_bits(&s->pb, 1, 0);         /* is obj layer id= no */
2277
-    } else {
2278
-        put_bits(&s->pb, 1, 1);         /* is obj layer id= yes */
2279
-        put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2280
-        put_bits(&s->pb, 3, 1);         /* is obj layer priority */
2281
-    }
2282
-
2283
-    s->aspect_ratio_info= aspect_to_info(s->avctx->sample_aspect_ratio);
2284
-
2285
-    put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2286
-    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2287
-        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2288
-        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2289
-    }
2290
-
2291
-    if(s->workaround_bugs & FF_BUG_MS) { //
2292
-        put_bits(&s->pb, 1, 0);         /* vol control parameters= no @@@ */
2293
-    } else {
2294
-        put_bits(&s->pb, 1, 1);         /* vol control parameters= yes */
2295
-        put_bits(&s->pb, 2, 1);         /* chroma format YUV 420/YV12 */
2296
-        put_bits(&s->pb, 1, s->low_delay);
2297
-        put_bits(&s->pb, 1, 0);         /* vbv parameters= no */
2298
-    }
2299
-
2300
-    put_bits(&s->pb, 2, RECT_SHAPE);    /* vol shape= rectangle */
2301
-    put_bits(&s->pb, 1, 1);             /* marker bit */
2302
-
2303
-    put_bits(&s->pb, 16, s->avctx->time_base.den);
2304
-    if (s->time_increment_bits < 1)
2305
-        s->time_increment_bits = 1;
2306
-    put_bits(&s->pb, 1, 1);             /* marker bit */
2307
-    put_bits(&s->pb, 1, 0);             /* fixed vop rate=no */
2308
-    put_bits(&s->pb, 1, 1);             /* marker bit */
2309
-    put_bits(&s->pb, 13, s->width);     /* vol width */
2310
-    put_bits(&s->pb, 1, 1);             /* marker bit */
2311
-    put_bits(&s->pb, 13, s->height);    /* vol height */
2312
-    put_bits(&s->pb, 1, 1);             /* marker bit */
2313
-    put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2314
-    put_bits(&s->pb, 1, 1);             /* obmc disable */
2315
-    if (vo_ver_id == 1) {
2316
-        put_bits(&s->pb, 1, s->vol_sprite_usage);       /* sprite enable */
2317
-    }else{
2318
-        put_bits(&s->pb, 2, s->vol_sprite_usage);       /* sprite enable */
2319
-    }
2320
-
2321
-    put_bits(&s->pb, 1, 0);             /* not 8 bit == false */
2322
-    put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2323
-
2324
-    if(s->mpeg_quant){
2325
-        ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2326
-        ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2327
-    }
2328
-
2329
-    if (vo_ver_id != 1)
2330
-        put_bits(&s->pb, 1, s->quarter_sample);
2331
-    put_bits(&s->pb, 1, 1);             /* complexity estimation disable */
2332
-    s->resync_marker= s->rtp_mode;
2333
-    put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2334
-    put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2335
-    if(s->data_partitioning){
2336
-        put_bits(&s->pb, 1, 0);         /* no rvlc */
2337
-    }
2338
-
2339
-    if (vo_ver_id != 1){
2340
-        put_bits(&s->pb, 1, 0);         /* newpred */
2341
-        put_bits(&s->pb, 1, 0);         /* reduced res vop */
2342
-    }
2343
-    put_bits(&s->pb, 1, 0);             /* scalability */
2344
-
2345
-    ff_mpeg4_stuffing(&s->pb);
2346
-
2347
-    /* user data */
2348
-    if(!(s->flags & CODEC_FLAG_BITEXACT)){
2349
-        put_bits(&s->pb, 16, 0);
2350
-        put_bits(&s->pb, 16, 0x1B2);    /* user_data */
2351
-        ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2352
-    }
2353
-}
2354
-
2355
-/* write mpeg4 VOP header */
2356
-void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2357
-{
2358
-    int time_incr;
2359
-    int time_div, time_mod;
2360
-
2361
-    if(s->pict_type==FF_I_TYPE){
2362
-        if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2363
-            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2364
-                mpeg4_encode_visual_object_header(s);
2365
-            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2366
-                mpeg4_encode_vol_header(s, 0, 0);
2367
-        }
2368
-        if(!(s->workaround_bugs & FF_BUG_MS))
2369
-            mpeg4_encode_gop_header(s);
2370
-    }
2371
-
2372
-    s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2373
-
2374
-    put_bits(&s->pb, 16, 0);                /* vop header */
2375
-    put_bits(&s->pb, 16, VOP_STARTCODE);    /* vop header */
2376
-    put_bits(&s->pb, 2, s->pict_type - 1);  /* pict type: I = 0 , P = 1 */
2377
-
2378
-    assert(s->time>=0);
2379
-    time_div= s->time/s->avctx->time_base.den;
2380
-    time_mod= s->time%s->avctx->time_base.den;
2381
-    time_incr= time_div - s->last_time_base;
2382
-    assert(time_incr >= 0);
2383
-    while(time_incr--)
2384
-        put_bits(&s->pb, 1, 1);
2385
-
2386
-    put_bits(&s->pb, 1, 0);
2387
-
2388
-    put_bits(&s->pb, 1, 1);                             /* marker */
2389
-    put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2390
-    put_bits(&s->pb, 1, 1);                             /* marker */
2391
-    put_bits(&s->pb, 1, 1);                             /* vop coded */
2392
-    if (    s->pict_type == FF_P_TYPE
2393
-        || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2394
-        put_bits(&s->pb, 1, s->no_rounding);    /* rounding type */
2395
-    }
2396
-    put_bits(&s->pb, 3, 0);     /* intra dc VLC threshold */
2397
-    if(!s->progressive_sequence){
2398
-         put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2399
-         put_bits(&s->pb, 1, s->alternate_scan);
2400
-    }
2401
-    //FIXME sprite stuff
2402
-
2403
-    put_bits(&s->pb, 5, s->qscale);
2404
-
2405
-    if (s->pict_type != FF_I_TYPE)
2406
-        put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2407
-    if (s->pict_type == FF_B_TYPE)
2408
-        put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2409
-}
2410
-
2411 2158
 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
2412 2159
 {
2413 2160
     int range, l, bit_size, sign, code, bits;
... ...
@@ -2479,139 +1197,6 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s)
2479 2479
     }
2480 2480
 }
2481 2481
 
2482
-static void init_uni_dc_tab(void)
2483
-{
2484
-    int level, uni_code, uni_len;
2485
-
2486
-    for(level=-256; level<256; level++){
2487
-        int size, v, l;
2488
-        /* find number of bits */
2489
-        size = 0;
2490
-        v = abs(level);
2491
-        while (v) {
2492
-            v >>= 1;
2493
-            size++;
2494
-        }
2495
-
2496
-        if (level < 0)
2497
-            l= (-level) ^ ((1 << size) - 1);
2498
-        else
2499
-            l= level;
2500
-
2501
-        /* luminance */
2502
-        uni_code= DCtab_lum[size][0];
2503
-        uni_len = DCtab_lum[size][1];
2504
-
2505
-        if (size > 0) {
2506
-            uni_code<<=size; uni_code|=l;
2507
-            uni_len+=size;
2508
-            if (size > 8){
2509
-                uni_code<<=1; uni_code|=1;
2510
-                uni_len++;
2511
-            }
2512
-        }
2513
-        uni_DCtab_lum_bits[level+256]= uni_code;
2514
-        uni_DCtab_lum_len [level+256]= uni_len;
2515
-
2516
-        /* chrominance */
2517
-        uni_code= DCtab_chrom[size][0];
2518
-        uni_len = DCtab_chrom[size][1];
2519
-
2520
-        if (size > 0) {
2521
-            uni_code<<=size; uni_code|=l;
2522
-            uni_len+=size;
2523
-            if (size > 8){
2524
-                uni_code<<=1; uni_code|=1;
2525
-                uni_len++;
2526
-            }
2527
-        }
2528
-        uni_DCtab_chrom_bits[level+256]= uni_code;
2529
-        uni_DCtab_chrom_len [level+256]= uni_len;
2530
-
2531
-    }
2532
-}
2533
-
2534
-static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
2535
-    int slevel, run, last;
2536
-
2537
-    assert(MAX_LEVEL >= 64);
2538
-    assert(MAX_RUN   >= 63);
2539
-
2540
-    for(slevel=-64; slevel<64; slevel++){
2541
-        if(slevel==0) continue;
2542
-        for(run=0; run<64; run++){
2543
-            for(last=0; last<=1; last++){
2544
-                const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
2545
-                int level= slevel < 0 ? -slevel : slevel;
2546
-                int sign= slevel < 0 ? 1 : 0;
2547
-                int bits, len, code;
2548
-                int level1, run1;
2549
-
2550
-                len_tab[index]= 100;
2551
-
2552
-                /* ESC0 */
2553
-                code= get_rl_index(rl, last, run, level);
2554
-                bits= rl->table_vlc[code][0];
2555
-                len=  rl->table_vlc[code][1];
2556
-                bits=bits*2+sign; len++;
2557
-
2558
-                if(code!=rl->n && len < len_tab[index]){
2559
-                    bits_tab[index]= bits;
2560
-                    len_tab [index]= len;
2561
-                }
2562
-                /* ESC1 */
2563
-                bits= rl->table_vlc[rl->n][0];
2564
-                len=  rl->table_vlc[rl->n][1];
2565
-                bits=bits*2;    len++; //esc1
2566
-                level1= level - rl->max_level[last][run];
2567
-                if(level1>0){
2568
-                    code= get_rl_index(rl, last, run, level1);
2569
-                    bits<<= rl->table_vlc[code][1];
2570
-                    len  += rl->table_vlc[code][1];
2571
-                    bits += rl->table_vlc[code][0];
2572
-                    bits=bits*2+sign; len++;
2573
-
2574
-                    if(code!=rl->n && len < len_tab[index]){
2575
-                        bits_tab[index]= bits;
2576
-                        len_tab [index]= len;
2577
-                    }
2578
-                }
2579
-                /* ESC2 */
2580
-                bits= rl->table_vlc[rl->n][0];
2581
-                len=  rl->table_vlc[rl->n][1];
2582
-                bits=bits*4+2;    len+=2; //esc2
2583
-                run1 = run - rl->max_run[last][level] - 1;
2584
-                if(run1>=0){
2585
-                    code= get_rl_index(rl, last, run1, level);
2586
-                    bits<<= rl->table_vlc[code][1];
2587
-                    len  += rl->table_vlc[code][1];
2588
-                    bits += rl->table_vlc[code][0];
2589
-                    bits=bits*2+sign; len++;
2590
-
2591
-                    if(code!=rl->n && len < len_tab[index]){
2592
-                        bits_tab[index]= bits;
2593
-                        len_tab [index]= len;
2594
-                    }
2595
-                }
2596
-                /* ESC3 */
2597
-                bits= rl->table_vlc[rl->n][0];
2598
-                len = rl->table_vlc[rl->n][1];
2599
-                bits=bits*4+3;    len+=2; //esc3
2600
-                bits=bits*2+last; len++;
2601
-                bits=bits*64+run; len+=6;
2602
-                bits=bits*2+1;    len++;  //marker
2603
-                bits=bits*4096+(slevel&0xfff); len+=12;
2604
-                bits=bits*2+1;    len++;  //marker
2605
-
2606
-                if(len < len_tab[index]){
2607
-                    bits_tab[index]= bits;
2608
-                    len_tab [index]= len;
2609
-                }
2610
-            }
2611
-        }
2612
-    }
2613
-}
2614
-
2615 2482
 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
2616 2483
     int slevel, run, last;
2617 2484
 
... ...
@@ -2662,14 +1247,8 @@ void h263_encode_init(MpegEncContext *s)
2662 2662
     if (!done) {
2663 2663
         done = 1;
2664 2664
 
2665
-        init_uni_dc_tab();
2666
-
2667 2665
         init_rl(&rl_inter, static_rl_table_store[0]);
2668
-        init_rl(&rl_intra, static_rl_table_store[1]);
2669
-        init_rl(&rl_intra_aic, static_rl_table_store[2]);
2670
-
2671
-        init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2672
-        init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2666
+        init_rl(&rl_intra_aic, static_rl_table_store[1]);
2673 2667
 
2674 2668
         init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2675 2669
         init_uni_h263_rl_tab(&rl_inter    , NULL, uni_h263_inter_rl_len);
... ...
@@ -2690,32 +1269,6 @@ void h263_encode_init(MpegEncContext *s)
2690 2690
     switch(s->codec_id){
2691 2691
     case CODEC_ID_MPEG4:
2692 2692
         s->fcode_tab= fcode_tab;
2693
-        s->min_qcoeff= -2048;
2694
-        s->max_qcoeff=  2047;
2695
-        s->intra_ac_vlc_length     = uni_mpeg4_intra_rl_len;
2696
-        s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2697
-        s->inter_ac_vlc_length     = uni_mpeg4_inter_rl_len;
2698
-        s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2699
-        s->luma_dc_vlc_length= uni_DCtab_lum_len;
2700
-        s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2701
-        s->ac_esc_length= 7+2+1+6+1+12+1;
2702
-        s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2703
-        s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2704
-
2705
-        if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2706
-
2707
-            s->avctx->extradata= av_malloc(1024);
2708
-            init_put_bits(&s->pb, s->avctx->extradata, 1024);
2709
-
2710
-            if(!(s->workaround_bugs & FF_BUG_MS))
2711
-                mpeg4_encode_visual_object_header(s);
2712
-            mpeg4_encode_vol_header(s, 0, 0);
2713
-
2714
-//            ff_mpeg4_stuffing(&s->pb); ?
2715
-            flush_put_bits(&s->pb);
2716
-            s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2717
-        }
2718
-
2719 2693
         break;
2720 2694
     case CODEC_ID_H263P:
2721 2695
         if(s->umvplus)
... ...
@@ -2749,76 +1302,13 @@ void h263_encode_init(MpegEncContext *s)
2749 2749
 }
2750 2750
 #endif //CONFIG_ENCODERS
2751 2751
 
2752
-/**
2753
- * predicts the ac.
2754
- * @param n block index (0-3 are luma, 4-5 are chroma)
2755
- * @param dir the ac prediction direction
2756
- */
2757
-void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2758
-                   int dir)
2759
-{
2760
-    int i;
2761
-    int16_t *ac_val, *ac_val1;
2762
-    int8_t * const qscale_table= s->current_picture.qscale_table;
2763
-
2764
-    /* find prediction */
2765
-    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2766
-    ac_val1 = ac_val;
2767
-    if (s->ac_pred) {
2768
-        if (dir == 0) {
2769
-            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2770
-            /* left prediction */
2771
-            ac_val -= 16;
2772
-
2773
-            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2774
-                /* same qscale */
2775
-                for(i=1;i<8;i++) {
2776
-                    block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2777
-                }
2778
-            }else{
2779
-                /* different qscale, we must rescale */
2780
-                for(i=1;i<8;i++) {
2781
-                    block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2782
-                }
2783
-            }
2784
-        } else {
2785
-            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2786
-            /* top prediction */
2787
-            ac_val -= 16 * s->block_wrap[n];
2788
-
2789
-            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2790
-                /* same qscale */
2791
-                for(i=1;i<8;i++) {
2792
-                    block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2793
-                }
2794
-            }else{
2795
-                /* different qscale, we must rescale */
2796
-                for(i=1;i<8;i++) {
2797
-                    block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2798
-                }
2799
-            }
2800
-        }
2801
-    }
2802
-    /* left copy */
2803
-    for(i=1;i<8;i++)
2804
-        ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];
2805
-
2806
-    /* top copy */
2807
-    for(i=1;i<8;i++)
2808
-        ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];
2809
-
2810
-}
2811
-
2812 2752
 /***********************************************/
2813 2753
 /* decoding */
2814 2754
 
2815
-static VLC intra_MCBPC_vlc;
2816
-static VLC inter_MCBPC_vlc;
2817
-static VLC cbpy_vlc;
2755
+VLC intra_MCBPC_vlc;
2756
+VLC inter_MCBPC_vlc;
2757
+VLC cbpy_vlc;
2818 2758
 static VLC mv_vlc;
2819
-static VLC dc_lum, dc_chrom;
2820
-static VLC sprite_trajectory;
2821
-static VLC mb_type_b_vlc;
2822 2759
 static VLC h263_mbtype_b_vlc;
2823 2760
 static VLC cbpc_b_vlc;
2824 2761
 
... ...
@@ -2845,27 +1335,9 @@ void h263_decode_init_vlc(MpegEncContext *s)
2845 2845
                  &mvtab[0][1], 2, 1,
2846 2846
                  &mvtab[0][0], 2, 1, 538);
2847 2847
         init_rl(&rl_inter, static_rl_table_store[0]);
2848
-        init_rl(&rl_intra, static_rl_table_store[1]);
2849
-        init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2850
-        init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2851
-        init_rl(&rl_intra_aic, static_rl_table_store[2]);
2848
+        init_rl(&rl_intra_aic, static_rl_table_store[1]);
2852 2849
         INIT_VLC_RL(rl_inter, 554);
2853
-        INIT_VLC_RL(rl_intra, 554);
2854
-        INIT_VLC_RL(rvlc_rl_inter, 1072);
2855
-        INIT_VLC_RL(rvlc_rl_intra, 1072);
2856 2850
         INIT_VLC_RL(rl_intra_aic, 554);
2857
-        INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2858
-                 &DCtab_lum[0][1], 2, 1,
2859
-                 &DCtab_lum[0][0], 2, 1, 512);
2860
-        INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2861
-                 &DCtab_chrom[0][1], 2, 1,
2862
-                 &DCtab_chrom[0][0], 2, 1, 512);
2863
-        INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2864
-                 &sprite_trajectory_tab[0][1], 4, 2,
2865
-                 &sprite_trajectory_tab[0][0], 4, 2, 128);
2866
-        INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2867
-                 &mb_type_b_tab[0][1], 2, 1,
2868
-                 &mb_type_b_tab[0][0], 2, 1, 16);
2869 2851
         INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2870 2852
                  &h263_mbtype_b_tab[0][1], 2, 1,
2871 2853
                  &h263_mbtype_b_tab[0][0], 2, 1, 80);
... ...
@@ -2974,438 +1446,6 @@ static inline void memsetw(short *tab, int val, int n)
2974 2974
         tab[i] = val;
2975 2975
 }
2976 2976
 
2977
-#if CONFIG_ENCODERS
2978
-
2979
-void ff_mpeg4_init_partitions(MpegEncContext *s)
2980
-{
2981
-    uint8_t *start= put_bits_ptr(&s->pb);
2982
-    uint8_t *end= s->pb.buf_end;
2983
-    int size= end - start;
2984
-    int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
2985
-    int tex_size= (size - 2*pb_size)&(~3);
2986
-
2987
-    set_put_bits_buffer_size(&s->pb, pb_size);
2988
-    init_put_bits(&s->tex_pb, start + pb_size           , tex_size);
2989
-    init_put_bits(&s->pb2   , start + pb_size + tex_size, pb_size);
2990
-}
2991
-
2992
-void ff_mpeg4_merge_partitions(MpegEncContext *s)
2993
-{
2994
-    const int pb2_len   = put_bits_count(&s->pb2   );
2995
-    const int tex_pb_len= put_bits_count(&s->tex_pb);
2996
-    const int bits= put_bits_count(&s->pb);
2997
-
2998
-    if(s->pict_type==FF_I_TYPE){
2999
-        put_bits(&s->pb, 19, DC_MARKER);
3000
-        s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3001
-        s->i_tex_bits+= tex_pb_len;
3002
-    }else{
3003
-        put_bits(&s->pb, 17, MOTION_MARKER);
3004
-        s->misc_bits+=17 + pb2_len;
3005
-        s->mv_bits+= bits - s->last_bits;
3006
-        s->p_tex_bits+= tex_pb_len;
3007
-    }
3008
-
3009
-    flush_put_bits(&s->pb2);
3010
-    flush_put_bits(&s->tex_pb);
3011
-
3012
-    set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3013
-    ff_copy_bits(&s->pb, s->pb2.buf   , pb2_len);
3014
-    ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3015
-    s->last_bits= put_bits_count(&s->pb);
3016
-}
3017
-
3018
-#endif //CONFIG_ENCODERS
3019
-
3020
-int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3021
-    switch(s->pict_type){
3022
-        case FF_I_TYPE:
3023
-            return 16;
3024
-        case FF_P_TYPE:
3025
-        case FF_S_TYPE:
3026
-            return s->f_code+15;
3027
-        case FF_B_TYPE:
3028
-            return FFMAX3(s->f_code, s->b_code, 2) + 15;
3029
-        default:
3030
-            return -1;
3031
-    }
3032
-}
3033
-
3034
-#if CONFIG_ENCODERS
3035
-
3036
-void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3037
-{
3038
-    int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3039
-
3040
-    put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3041
-    put_bits(&s->pb, 1, 1);
3042
-
3043
-    put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3044
-    put_bits(&s->pb, s->quant_precision, s->qscale);
3045
-    put_bits(&s->pb, 1, 0); /* no HEC */
3046
-}
3047
-
3048
-#endif //CONFIG_ENCODERS
3049
-
3050
-/**
3051
- * check if the next stuff is a resync marker or the end.
3052
- * @return 0 if not
3053
- */
3054
-static inline int mpeg4_is_resync(MpegEncContext *s){
3055
-    int bits_count= get_bits_count(&s->gb);
3056
-    int v= show_bits(&s->gb, 16);
3057
-
3058
-    if(s->workaround_bugs&FF_BUG_NO_PADDING){
3059
-        return 0;
3060
-    }
3061
-
3062
-    while(v<=0xFF){
3063
-        if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3064
-            break;
3065
-        skip_bits(&s->gb, 8+s->pict_type);
3066
-        bits_count+= 8+s->pict_type;
3067
-        v= show_bits(&s->gb, 16);
3068
-    }
3069
-
3070
-    if(bits_count + 8 >= s->gb.size_in_bits){
3071
-        v>>=8;
3072
-        v|= 0x7F >> (7-(bits_count&7));
3073
-
3074
-        if(v==0x7F)
3075
-            return 1;
3076
-    }else{
3077
-        if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3078
-            int len;
3079
-            GetBitContext gb= s->gb;
3080
-
3081
-            skip_bits(&s->gb, 1);
3082
-            align_get_bits(&s->gb);
3083
-
3084
-            for(len=0; len<32; len++){
3085
-                if(get_bits1(&s->gb)) break;
3086
-            }
3087
-
3088
-            s->gb= gb;
3089
-
3090
-            if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3091
-                return 1;
3092
-        }
3093
-    }
3094
-    return 0;
3095
-}
3096
-
3097
-static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
3098
-{
3099
-    int i;
3100
-    int a= 2<<s->sprite_warping_accuracy;
3101
-    int rho= 3-s->sprite_warping_accuracy;
3102
-    int r=16/a;
3103
-    const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3104
-    int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3105
-    int sprite_ref[4][2];
3106
-    int virtual_ref[2][2];
3107
-    int w2, h2, w3, h3;
3108
-    int alpha=0, beta=0;
3109
-    int w= s->width;
3110
-    int h= s->height;
3111
-    int min_ab;
3112
-
3113
-    for(i=0; i<s->num_sprite_warping_points; i++){
3114
-        int length;
3115
-        int x=0, y=0;
3116
-
3117
-        length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
3118
-        if(length){
3119
-            x= get_xbits(gb, length);
3120
-        }
3121
-        if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
3122
-
3123
-        length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
3124
-        if(length){
3125
-            y=get_xbits(gb, length);
3126
-        }
3127
-        skip_bits1(gb); /* marker bit */
3128
-        s->sprite_traj[i][0]= d[i][0]= x;
3129
-        s->sprite_traj[i][1]= d[i][1]= y;
3130
-    }
3131
-    for(; i<4; i++)
3132
-        s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
3133
-
3134
-    while((1<<alpha)<w) alpha++;
3135
-    while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3136
-    w2= 1<<alpha;
3137
-    h2= 1<<beta;
3138
-
3139
-// Note, the 4th point isn't used for GMC
3140
-    if(s->divx_version==500 && s->divx_build==413){
3141
-        sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3142
-        sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3143
-        sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3144
-        sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3145
-        sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3146
-        sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3147
-    } else {
3148
-        sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3149
-        sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3150
-        sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3151
-        sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3152
-        sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3153
-        sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3154
-    }
3155
-/*    sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3156
-    sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3157
-
3158
-// this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3159
-// perhaps it should be reordered to be more readable ...
3160
-// the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3161
-// so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3162
-    virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3163
-        + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
3164
-    virtual_ref[0][1]= 16*vop_ref[0][1]
3165
-        + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
3166
-    virtual_ref[1][0]= 16*vop_ref[0][0]
3167
-        + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
3168
-    virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3169
-        + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
3170
-
3171
-    switch(s->num_sprite_warping_points)
3172
-    {
3173
-        case 0:
3174
-            s->sprite_offset[0][0]= 0;
3175
-            s->sprite_offset[0][1]= 0;
3176
-            s->sprite_offset[1][0]= 0;
3177
-            s->sprite_offset[1][1]= 0;
3178
-            s->sprite_delta[0][0]= a;
3179
-            s->sprite_delta[0][1]= 0;
3180
-            s->sprite_delta[1][0]= 0;
3181
-            s->sprite_delta[1][1]= a;
3182
-            s->sprite_shift[0]= 0;
3183
-            s->sprite_shift[1]= 0;
3184
-            break;
3185
-        case 1: //GMC only
3186
-            s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3187
-            s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3188
-            s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3189
-            s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3190
-            s->sprite_delta[0][0]= a;
3191
-            s->sprite_delta[0][1]= 0;
3192
-            s->sprite_delta[1][0]= 0;
3193
-            s->sprite_delta[1][1]= a;
3194
-            s->sprite_shift[0]= 0;
3195
-            s->sprite_shift[1]= 0;
3196
-            break;
3197
-        case 2:
3198
-            s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3199
-                                                  + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3200
-                                                  + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
3201
-                                                  + (1<<(alpha+rho-1));
3202
-            s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3203
-                                                  + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3204
-                                                  + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
3205
-                                                  + (1<<(alpha+rho-1));
3206
-            s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3207
-                                     +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3208
-                                     +2*w2*r*sprite_ref[0][0]
3209
-                                     - 16*w2
3210
-                                     + (1<<(alpha+rho+1)));
3211
-            s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3212
-                                     +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3213
-                                     +2*w2*r*sprite_ref[0][1]
3214
-                                     - 16*w2
3215
-                                     + (1<<(alpha+rho+1)));
3216
-            s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3217
-            s->sprite_delta[0][1]=   (+r*sprite_ref[0][1] - virtual_ref[0][1]);
3218
-            s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3219
-            s->sprite_delta[1][1]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3220
-
3221
-            s->sprite_shift[0]= alpha+rho;
3222
-            s->sprite_shift[1]= alpha+rho+2;
3223
-            break;
3224
-        case 3:
3225
-            min_ab= FFMIN(alpha, beta);
3226
-            w3= w2>>min_ab;
3227
-            h3= h2>>min_ab;
3228
-            s->sprite_offset[0][0]=  (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
3229
-                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
3230
-                                   + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
3231
-                                   + (1<<(alpha+beta+rho-min_ab-1));
3232
-            s->sprite_offset[0][1]=  (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
3233
-                                   + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
3234
-                                   + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
3235
-                                   + (1<<(alpha+beta+rho-min_ab-1));
3236
-            s->sprite_offset[1][0]=  (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
3237
-                                   + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
3238
-                                   + 2*w2*h3*r*sprite_ref[0][0]
3239
-                                   - 16*w2*h3
3240
-                                   + (1<<(alpha+beta+rho-min_ab+1));
3241
-            s->sprite_offset[1][1]=  (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
3242
-                                   + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
3243
-                                   + 2*w2*h3*r*sprite_ref[0][1]
3244
-                                   - 16*w2*h3
3245
-                                   + (1<<(alpha+beta+rho-min_ab+1));
3246
-            s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
3247
-            s->sprite_delta[0][1]=   (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
3248
-            s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
3249
-            s->sprite_delta[1][1]=   (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
3250
-
3251
-            s->sprite_shift[0]= alpha + beta + rho - min_ab;
3252
-            s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
3253
-            break;
3254
-    }
3255
-    /* try to simplify the situation */
3256
-    if(   s->sprite_delta[0][0] == a<<s->sprite_shift[0]
3257
-       && s->sprite_delta[0][1] == 0
3258
-       && s->sprite_delta[1][0] == 0
3259
-       && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
3260
-    {
3261
-        s->sprite_offset[0][0]>>=s->sprite_shift[0];
3262
-        s->sprite_offset[0][1]>>=s->sprite_shift[0];
3263
-        s->sprite_offset[1][0]>>=s->sprite_shift[1];
3264
-        s->sprite_offset[1][1]>>=s->sprite_shift[1];
3265
-        s->sprite_delta[0][0]= a;
3266
-        s->sprite_delta[0][1]= 0;
3267
-        s->sprite_delta[1][0]= 0;
3268
-        s->sprite_delta[1][1]= a;
3269
-        s->sprite_shift[0]= 0;
3270
-        s->sprite_shift[1]= 0;
3271
-        s->real_sprite_warping_points=1;
3272
-    }
3273
-    else{
3274
-        int shift_y= 16 - s->sprite_shift[0];
3275
-        int shift_c= 16 - s->sprite_shift[1];
3276
-        for(i=0; i<2; i++){
3277
-            s->sprite_offset[0][i]<<= shift_y;
3278
-            s->sprite_offset[1][i]<<= shift_c;
3279
-            s->sprite_delta[0][i]<<= shift_y;
3280
-            s->sprite_delta[1][i]<<= shift_y;
3281
-            s->sprite_shift[i]= 16;
3282
-        }
3283
-        s->real_sprite_warping_points= s->num_sprite_warping_points;
3284
-    }
3285
-}
3286
-
3287
-/**
3288
- * decodes the next video packet.
3289
- * @return <0 if something went wrong
3290
- */
3291
-static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3292
-{
3293
-    int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3294
-    int header_extension=0, mb_num, len;
3295
-
3296
-    /* is there enough space left for a video packet + header */
3297
-    if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3298
-
3299
-    for(len=0; len<32; len++){
3300
-        if(get_bits1(&s->gb)) break;
3301
-    }
3302
-
3303
-    if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3304
-        av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3305
-        return -1;
3306
-    }
3307
-
3308
-    if(s->shape != RECT_SHAPE){
3309
-        header_extension= get_bits1(&s->gb);
3310
-        //FIXME more stuff here
3311
-    }
3312
-
3313
-    mb_num= get_bits(&s->gb, mb_num_bits);
3314
-    if(mb_num>=s->mb_num){
3315
-        av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3316
-        return -1;
3317
-    }
3318
-    if(s->pict_type == FF_B_TYPE){
3319
-        while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3320
-        if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3321
-    }
3322
-
3323
-    s->mb_x= mb_num % s->mb_width;
3324
-    s->mb_y= mb_num / s->mb_width;
3325
-
3326
-    if(s->shape != BIN_ONLY_SHAPE){
3327
-        int qscale= get_bits(&s->gb, s->quant_precision);
3328
-        if(qscale)
3329
-            s->chroma_qscale=s->qscale= qscale;
3330
-    }
3331
-
3332
-    if(s->shape == RECT_SHAPE){
3333
-        header_extension= get_bits1(&s->gb);
3334
-    }
3335
-    if(header_extension){
3336
-        int time_increment;
3337
-        int time_incr=0;
3338
-
3339
-        while (get_bits1(&s->gb) != 0)
3340
-            time_incr++;
3341
-
3342
-        check_marker(&s->gb, "before time_increment in video packed header");
3343
-        time_increment= get_bits(&s->gb, s->time_increment_bits);
3344
-        check_marker(&s->gb, "before vop_coding_type in video packed header");
3345
-
3346
-        skip_bits(&s->gb, 2); /* vop coding type */
3347
-        //FIXME not rect stuff here
3348
-
3349
-        if(s->shape != BIN_ONLY_SHAPE){
3350
-            skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3351
-//FIXME don't just ignore everything
3352
-            if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3353
-                mpeg4_decode_sprite_trajectory(s, &s->gb);
3354
-                av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3355
-            }
3356
-
3357
-            //FIXME reduced res stuff here
3358
-
3359
-            if (s->pict_type != FF_I_TYPE) {
3360
-                int f_code = get_bits(&s->gb, 3);       /* fcode_for */
3361
-                if(f_code==0){
3362
-                    av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3363
-                }
3364
-            }
3365
-            if (s->pict_type == FF_B_TYPE) {
3366
-                int b_code = get_bits(&s->gb, 3);
3367
-                if(b_code==0){
3368
-                    av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3369
-                }
3370
-            }
3371
-        }
3372
-    }
3373
-    //FIXME new-pred stuff
3374
-
3375
-    return 0;
3376
-}
3377
-
3378
-void ff_mpeg4_clean_buffers(MpegEncContext *s)
3379
-{
3380
-    int c_wrap, c_xy, l_wrap, l_xy;
3381
-
3382
-    l_wrap= s->b8_stride;
3383
-    l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3384
-    c_wrap= s->mb_stride;
3385
-    c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3386
-
3387
-#if 0
3388
-    /* clean DC */
3389
-    memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3390
-    memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3391
-    memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3392
-#endif
3393
-
3394
-    /* clean AC */
3395
-    memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3396
-    memset(s->ac_val[1] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
3397
-    memset(s->ac_val[2] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
3398
-
3399
-    /* clean MV */
3400
-    // we can't clear the MVs as they might be needed by a b frame
3401
-//    memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3402
-//    memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3403
-    s->last_mv[0][0][0]=
3404
-    s->last_mv[0][0][1]=
3405
-    s->last_mv[1][0][0]=
3406
-    s->last_mv[1][0][1]= 0;
3407
-}
3408
-
3409 2977
 /**
3410 2978
  * finds the next resync_marker
3411 2979
  * @param p pointer to buffer to scan
... ...
@@ -3473,7 +1513,7 @@ int ff_h263_resync(MpegEncContext *s){
3473 3473
     return -1;
3474 3474
 }
3475 3475
 
3476
-static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3476
+int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3477 3477
 {
3478 3478
     int code, val, sign, shift, l;
3479 3479
     code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
... ...
@@ -3510,745 +1550,6 @@ static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3510 3510
     return val;
3511 3511
 }
3512 3512
 
3513
-/**
3514
- * gets the average motion vector for a GMC MB.
3515
- * @param n either 0 for the x component or 1 for y
3516
- * @returns the average MV for a GMC MB
3517
- */
3518
-static inline int get_amv(MpegEncContext *s, int n){
3519
-    int x, y, mb_v, sum, dx, dy, shift;
3520
-    int len = 1 << (s->f_code + 4);
3521
-    const int a= s->sprite_warping_accuracy;
3522
-
3523
-    if(s->workaround_bugs & FF_BUG_AMV)
3524
-        len >>= s->quarter_sample;
3525
-
3526
-    if(s->real_sprite_warping_points==1){
3527
-        if(s->divx_version==500 && s->divx_build==413)
3528
-            sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3529
-        else
3530
-            sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3531
-    }else{
3532
-        dx= s->sprite_delta[n][0];
3533
-        dy= s->sprite_delta[n][1];
3534
-        shift= s->sprite_shift[0];
3535
-        if(n) dy -= 1<<(shift + a + 1);
3536
-        else  dx -= 1<<(shift + a + 1);
3537
-        mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3538
-
3539
-        sum=0;
3540
-        for(y=0; y<16; y++){
3541
-            int v;
3542
-
3543
-            v= mb_v + dy*y;
3544
-            //XXX FIXME optimize
3545
-            for(x=0; x<16; x++){
3546
-                sum+= v>>shift;
3547
-                v+= dx;
3548
-            }
3549
-        }
3550
-        sum= RSHIFT(sum, a+8-s->quarter_sample);
3551
-    }
3552
-
3553
-    if      (sum < -len) sum= -len;
3554
-    else if (sum >= len) sum= len-1;
3555
-
3556
-    return sum;
3557
-}
3558
-
3559
-/**
3560
- * decodes the dc value.
3561
- * @param n block index (0-3 are luma, 4-5 are chroma)
3562
- * @param dir_ptr the prediction direction will be stored here
3563
- * @return the quantized dc
3564
- */
3565
-static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3566
-{
3567
-    int level, code;
3568
-
3569
-    if (n < 4)
3570
-        code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3571
-    else
3572
-        code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3573
-    if (code < 0 || code > 9 /* && s->nbit<9 */){
3574
-        av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
3575
-        return -1;
3576
-    }
3577
-    if (code == 0) {
3578
-        level = 0;
3579
-    } else {
3580
-        if(IS_3IV1){
3581
-            if(code==1)
3582
-                level= 2*get_bits1(&s->gb)-1;
3583
-            else{
3584
-                if(get_bits1(&s->gb))
3585
-                    level = get_bits(&s->gb, code-1) + (1<<(code-1));
3586
-                else
3587
-                    level = -get_bits(&s->gb, code-1) - (1<<(code-1));
3588
-            }
3589
-        }else{
3590
-            level = get_xbits(&s->gb, code);
3591
-        }
3592
-
3593
-        if (code > 8){
3594
-            if(get_bits1(&s->gb)==0){ /* marker */
3595
-                if(s->error_recognition>=2){
3596
-                    av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
3597
-                    return -1;
3598
-                }
3599
-            }
3600
-        }
3601
-    }
3602
-
3603
-    return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
3604
-}
3605
-
3606
-/**
3607
- * decodes first partition.
3608
- * @return number of MBs decoded or <0 if an error occurred
3609
- */
3610
-static int mpeg4_decode_partition_a(MpegEncContext *s){
3611
-    int mb_num;
3612
-    static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3613
-
3614
-    /* decode first partition */
3615
-    mb_num=0;
3616
-    s->first_slice_line=1;
3617
-    for(; s->mb_y<s->mb_height; s->mb_y++){
3618
-        ff_init_block_index(s);
3619
-        for(; s->mb_x<s->mb_width; s->mb_x++){
3620
-            const int xy= s->mb_x + s->mb_y*s->mb_stride;
3621
-            int cbpc;
3622
-            int dir=0;
3623
-
3624
-            mb_num++;
3625
-            ff_update_block_index(s);
3626
-            if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3627
-                s->first_slice_line=0;
3628
-
3629
-            if(s->pict_type==FF_I_TYPE){
3630
-                int i;
3631
-
3632
-                do{
3633
-                    if(show_bits_long(&s->gb, 19)==DC_MARKER){
3634
-                        return mb_num-1;
3635
-                    }
3636
-
3637
-                    cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3638
-                    if (cbpc < 0){
3639
-                        av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3640
-                        return -1;
3641
-                    }
3642
-                }while(cbpc == 8);
3643
-
3644
-                s->cbp_table[xy]= cbpc & 3;
3645
-                s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3646
-                s->mb_intra = 1;
3647
-
3648
-                if(cbpc & 4) {
3649
-                    ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3650
-                }
3651
-                s->current_picture.qscale_table[xy]= s->qscale;
3652
-
3653
-                s->mbintra_table[xy]= 1;
3654
-                for(i=0; i<6; i++){
3655
-                    int dc_pred_dir;
3656
-                    int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3657
-                    if(dc < 0){
3658
-                        av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3659
-                        return -1;
3660
-                    }
3661
-                    dir<<=1;
3662
-                    if(dc_pred_dir) dir|=1;
3663
-                }
3664
-                s->pred_dir_table[xy]= dir;
3665
-            }else{ /* P/S_TYPE */
3666
-                int mx, my, pred_x, pred_y, bits;
3667
-                int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3668
-                const int stride= s->b8_stride*2;
3669
-
3670
-try_again:
3671
-                bits= show_bits(&s->gb, 17);
3672
-                if(bits==MOTION_MARKER){
3673
-                    return mb_num-1;
3674
-                }
3675
-                skip_bits1(&s->gb);
3676
-                if(bits&0x10000){
3677
-                    /* skip mb */
3678
-                    if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3679
-                        s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3680
-                        mx= get_amv(s, 0);
3681
-                        my= get_amv(s, 1);
3682
-                    }else{
3683
-                        s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3684
-                        mx=my=0;
3685
-                    }
3686
-                    mot_val[0       ]= mot_val[2       ]=
3687
-                    mot_val[0+stride]= mot_val[2+stride]= mx;
3688
-                    mot_val[1       ]= mot_val[3       ]=
3689
-                    mot_val[1+stride]= mot_val[3+stride]= my;
3690
-
3691
-                    if(s->mbintra_table[xy])
3692
-                        ff_clean_intra_table_entries(s);
3693
-                    continue;
3694
-                }
3695
-
3696
-                cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3697
-                if (cbpc < 0){
3698
-                    av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3699
-                    return -1;
3700
-                }
3701
-                if(cbpc == 20)
3702
-                    goto try_again;
3703
-
3704
-                s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3705
-
3706
-                s->mb_intra = ((cbpc & 4) != 0);
3707
-
3708
-                if(s->mb_intra){
3709
-                    s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3710
-                    s->mbintra_table[xy]= 1;
3711
-                    mot_val[0       ]= mot_val[2       ]=
3712
-                    mot_val[0+stride]= mot_val[2+stride]= 0;
3713
-                    mot_val[1       ]= mot_val[3       ]=
3714
-                    mot_val[1+stride]= mot_val[3+stride]= 0;
3715
-                }else{
3716
-                    if(s->mbintra_table[xy])
3717
-                        ff_clean_intra_table_entries(s);
3718
-
3719
-                    if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3720
-                        s->mcsel= get_bits1(&s->gb);
3721
-                    else s->mcsel= 0;
3722
-
3723
-                    if ((cbpc & 16) == 0) {
3724
-                        /* 16x16 motion prediction */
3725
-
3726
-                        h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3727
-                        if(!s->mcsel){
3728
-                            mx = h263_decode_motion(s, pred_x, s->f_code);
3729
-                            if (mx >= 0xffff)
3730
-                                return -1;
3731
-
3732
-                            my = h263_decode_motion(s, pred_y, s->f_code);
3733
-                            if (my >= 0xffff)
3734
-                                return -1;
3735
-                            s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3736
-                        } else {
3737
-                            mx = get_amv(s, 0);
3738
-                            my = get_amv(s, 1);
3739
-                            s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3740
-                        }
3741
-
3742
-                        mot_val[0       ]= mot_val[2       ] =
3743
-                        mot_val[0+stride]= mot_val[2+stride]= mx;
3744
-                        mot_val[1       ]= mot_val[3       ]=
3745
-                        mot_val[1+stride]= mot_val[3+stride]= my;
3746
-                    } else {
3747
-                        int i;
3748
-                        s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3749
-                        for(i=0;i<4;i++) {
3750
-                            int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3751
-                            mx = h263_decode_motion(s, pred_x, s->f_code);
3752
-                            if (mx >= 0xffff)
3753
-                                return -1;
3754
-
3755
-                            my = h263_decode_motion(s, pred_y, s->f_code);
3756
-                            if (my >= 0xffff)
3757
-                                return -1;
3758
-                            mot_val[0] = mx;
3759
-                            mot_val[1] = my;
3760
-                        }
3761
-                    }
3762
-                }
3763
-            }
3764
-        }
3765
-        s->mb_x= 0;
3766
-    }
3767
-
3768
-    return mb_num;
3769
-}
3770
-
3771
-/**
3772
- * decode second partition.
3773
- * @return <0 if an error occurred
3774
- */
3775
-static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3776
-    int mb_num=0;
3777
-    static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3778
-
3779
-    s->mb_x= s->resync_mb_x;
3780
-    s->first_slice_line=1;
3781
-    for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3782
-        ff_init_block_index(s);
3783
-        for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3784
-            const int xy= s->mb_x + s->mb_y*s->mb_stride;
3785
-
3786
-            mb_num++;
3787
-            ff_update_block_index(s);
3788
-            if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3789
-                s->first_slice_line=0;
3790
-
3791
-            if(s->pict_type==FF_I_TYPE){
3792
-                int ac_pred= get_bits1(&s->gb);
3793
-                int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3794
-                if(cbpy<0){
3795
-                    av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3796
-                    return -1;
3797
-                }
3798
-
3799
-                s->cbp_table[xy]|= cbpy<<2;
3800
-                s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3801
-            }else{ /* P || S_TYPE */
3802
-                if(IS_INTRA(s->current_picture.mb_type[xy])){
3803
-                    int dir=0,i;
3804
-                    int ac_pred = get_bits1(&s->gb);
3805
-                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3806
-
3807
-                    if(cbpy<0){
3808
-                        av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3809
-                        return -1;
3810
-                    }
3811
-
3812
-                    if(s->cbp_table[xy] & 8) {
3813
-                        ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3814
-                    }
3815
-                    s->current_picture.qscale_table[xy]= s->qscale;
3816
-
3817
-                    for(i=0; i<6; i++){
3818
-                        int dc_pred_dir;
3819
-                        int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3820
-                        if(dc < 0){
3821
-                            av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3822
-                            return -1;
3823
-                        }
3824
-                        dir<<=1;
3825
-                        if(dc_pred_dir) dir|=1;
3826
-                    }
3827
-                    s->cbp_table[xy]&= 3; //remove dquant
3828
-                    s->cbp_table[xy]|= cbpy<<2;
3829
-                    s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3830
-                    s->pred_dir_table[xy]= dir;
3831
-                }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3832
-                    s->current_picture.qscale_table[xy]= s->qscale;
3833
-                    s->cbp_table[xy]= 0;
3834
-                }else{
3835
-                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3836
-
3837
-                    if(cbpy<0){
3838
-                        av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3839
-                        return -1;
3840
-                    }
3841
-
3842
-                    if(s->cbp_table[xy] & 8) {
3843
-                        ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3844
-                    }
3845
-                    s->current_picture.qscale_table[xy]= s->qscale;
3846
-
3847
-                    s->cbp_table[xy]&= 3; //remove dquant
3848
-                    s->cbp_table[xy]|= (cbpy^0xf)<<2;
3849
-                }
3850
-            }
3851
-        }
3852
-        if(mb_num >= mb_count) return 0;
3853
-        s->mb_x= 0;
3854
-    }
3855
-    return 0;
3856
-}
3857
-
3858
-/**
3859
- * decodes the first & second partition
3860
- * @return <0 if error (and sets error type in the error_status_table)
3861
- */
3862
-int ff_mpeg4_decode_partitions(MpegEncContext *s)
3863
-{
3864
-    int mb_num;
3865
-    const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3866
-    const int part_a_end  = s->pict_type==FF_I_TYPE ? (DC_END  |MV_END)   : MV_END;
3867
-
3868
-    mb_num= mpeg4_decode_partition_a(s);
3869
-    if(mb_num<0){
3870
-        ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3871
-        return -1;
3872
-    }
3873
-
3874
-    if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3875
-        av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3876
-        ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3877
-        return -1;
3878
-    }
3879
-
3880
-    s->mb_num_left= mb_num;
3881
-
3882
-    if(s->pict_type==FF_I_TYPE){
3883
-        while(show_bits(&s->gb, 9) == 1)
3884
-            skip_bits(&s->gb, 9);
3885
-        if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3886
-            av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3887
-            return -1;
3888
-        }
3889
-    }else{
3890
-        while(show_bits(&s->gb, 10) == 1)
3891
-            skip_bits(&s->gb, 10);
3892
-        if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3893
-            av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3894
-            return -1;
3895
-        }
3896
-    }
3897
-    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3898
-
3899
-    if( mpeg4_decode_partition_b(s, mb_num) < 0){
3900
-        if(s->pict_type==FF_P_TYPE)
3901
-            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3902
-        return -1;
3903
-    }else{
3904
-        if(s->pict_type==FF_P_TYPE)
3905
-            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3906
-    }
3907
-
3908
-    return 0;
3909
-}
3910
-
3911
-/**
3912
- * decodes a block.
3913
- * @return <0 if an error occurred
3914
- */
3915
-static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3916
-                              int n, int coded, int intra, int rvlc)
3917
-{
3918
-    int level, i, last, run;
3919
-    int dc_pred_dir;
3920
-    RLTable * rl;
3921
-    RL_VLC_ELEM * rl_vlc;
3922
-    const uint8_t * scan_table;
3923
-    int qmul, qadd;
3924
-
3925
-    //Note intra & rvlc should be optimized away if this is inlined
3926
-
3927
-    if(intra) {
3928
-      if(s->use_intra_dc_vlc){
3929
-        /* DC coef */
3930
-        if(s->partitioned_frame){
3931
-            level = s->dc_val[0][ s->block_index[n] ];
3932
-            if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3933
-            else    level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3934
-            dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3935
-        }else{
3936
-            level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3937
-            if (level < 0)
3938
-                return -1;
3939
-        }
3940
-        block[0] = level;
3941
-        i = 0;
3942
-      }else{
3943
-            i = -1;
3944
-            ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
3945
-      }
3946
-      if (!coded)
3947
-          goto not_coded;
3948
-
3949
-      if(rvlc){
3950
-          rl = &rvlc_rl_intra;
3951
-          rl_vlc = rvlc_rl_intra.rl_vlc[0];
3952
-      }else{
3953
-          rl = &rl_intra;
3954
-          rl_vlc = rl_intra.rl_vlc[0];
3955
-      }
3956
-      if (s->ac_pred) {
3957
-          if (dc_pred_dir == 0)
3958
-              scan_table = s->intra_v_scantable.permutated; /* left */
3959
-          else
3960
-              scan_table = s->intra_h_scantable.permutated; /* top */
3961
-      } else {
3962
-            scan_table = s->intra_scantable.permutated;
3963
-      }
3964
-      qmul=1;
3965
-      qadd=0;
3966
-    } else {
3967
-        i = -1;
3968
-        if (!coded) {
3969
-            s->block_last_index[n] = i;
3970
-            return 0;
3971
-        }
3972
-        if(rvlc) rl = &rvlc_rl_inter;
3973
-        else     rl = &rl_inter;
3974
-
3975
-        scan_table = s->intra_scantable.permutated;
3976
-
3977
-        if(s->mpeg_quant){
3978
-            qmul=1;
3979
-            qadd=0;
3980
-            if(rvlc){
3981
-                rl_vlc = rvlc_rl_inter.rl_vlc[0];
3982
-            }else{
3983
-                rl_vlc = rl_inter.rl_vlc[0];
3984
-            }
3985
-        }else{
3986
-            qmul = s->qscale << 1;
3987
-            qadd = (s->qscale - 1) | 1;
3988
-            if(rvlc){
3989
-                rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
3990
-            }else{
3991
-                rl_vlc = rl_inter.rl_vlc[s->qscale];
3992
-            }
3993
-        }
3994
-    }
3995
-  {
3996
-    OPEN_READER(re, &s->gb);
3997
-    for(;;) {
3998
-        UPDATE_CACHE(re, &s->gb);
3999
-        GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4000
-        if (level==0) {
4001
-          /* escape */
4002
-          if(rvlc){
4003
-                if(SHOW_UBITS(re, &s->gb, 1)==0){
4004
-                    av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4005
-                    return -1;
4006
-                }; SKIP_CACHE(re, &s->gb, 1);
4007
-
4008
-                last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4009
-                run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4010
-                SKIP_COUNTER(re, &s->gb, 1+1+6);
4011
-                UPDATE_CACHE(re, &s->gb);
4012
-
4013
-                if(SHOW_UBITS(re, &s->gb, 1)==0){
4014
-                    av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4015
-                    return -1;
4016
-                }; SKIP_CACHE(re, &s->gb, 1);
4017
-
4018
-                level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4019
-
4020
-                if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4021
-                    av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4022
-                    return -1;
4023
-                }; SKIP_CACHE(re, &s->gb, 5);
4024
-
4025
-                level=  level * qmul + qadd;
4026
-                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4027
-                SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4028
-
4029
-                i+= run + 1;
4030
-                if(last) i+=192;
4031
-          }else{
4032
-            int cache;
4033
-            cache= GET_CACHE(re, &s->gb);
4034
-
4035
-            if(IS_3IV1)
4036
-                cache ^= 0xC0000000;
4037
-
4038
-            if (cache&0x80000000) {
4039
-                if (cache&0x40000000) {
4040
-                    /* third escape */
4041
-                    SKIP_CACHE(re, &s->gb, 2);
4042
-                    last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4043
-                    run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4044
-                    SKIP_COUNTER(re, &s->gb, 2+1+6);
4045
-                    UPDATE_CACHE(re, &s->gb);
4046
-
4047
-                    if(IS_3IV1){
4048
-                        level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4049
-                    }else{
4050
-                        if(SHOW_UBITS(re, &s->gb, 1)==0){
4051
-                            av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4052
-                            return -1;
4053
-                        }; SKIP_CACHE(re, &s->gb, 1);
4054
-
4055
-                        level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4056
-
4057
-                        if(SHOW_UBITS(re, &s->gb, 1)==0){
4058
-                            av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4059
-                            return -1;
4060
-                        }; LAST_SKIP_CACHE(re, &s->gb, 1);
4061
-
4062
-                        SKIP_COUNTER(re, &s->gb, 1+12+1);
4063
-                    }
4064
-
4065
-#if 0
4066
-                    if(s->error_recognition >= FF_ER_COMPLIANT){
4067
-                        const int abs_level= FFABS(level);
4068
-                        if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4069
-                            const int run1= run - rl->max_run[last][abs_level] - 1;
4070
-                            if(abs_level <= rl->max_level[last][run]){
4071
-                                av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4072
-                                return -1;
4073
-                            }
4074
-                            if(s->error_recognition > FF_ER_COMPLIANT){
4075
-                                if(abs_level <= rl->max_level[last][run]*2){
4076
-                                    av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4077
-                                    return -1;
4078
-                                }
4079
-                                if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4080
-                                    av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4081
-                                    return -1;
4082
-                                }
4083
-                            }
4084
-                        }
4085
-                    }
4086
-#endif
4087
-                    if (level>0) level= level * qmul + qadd;
4088
-                    else         level= level * qmul - qadd;
4089
-
4090
-                    if((unsigned)(level + 2048) > 4095){
4091
-                        if(s->error_recognition > FF_ER_COMPLIANT){
4092
-                            if(level > 2560 || level<-2560){
4093
-                                av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4094
-                                return -1;
4095
-                            }
4096
-                        }
4097
-                        level= level<0 ? -2048 : 2047;
4098
-                    }
4099
-
4100
-                    i+= run + 1;
4101
-                    if(last) i+=192;
4102
-                } else {
4103
-                    /* second escape */
4104
-#if MIN_CACHE_BITS < 20
4105
-                    LAST_SKIP_BITS(re, &s->gb, 2);
4106
-                    UPDATE_CACHE(re, &s->gb);
4107
-#else
4108
-                    SKIP_BITS(re, &s->gb, 2);
4109
-#endif
4110
-                    GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4111
-                    i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4112
-                    level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4113
-                    LAST_SKIP_BITS(re, &s->gb, 1);
4114
-                }
4115
-            } else {
4116
-                /* first escape */
4117
-#if MIN_CACHE_BITS < 19
4118
-                LAST_SKIP_BITS(re, &s->gb, 1);
4119
-                UPDATE_CACHE(re, &s->gb);
4120
-#else
4121
-                SKIP_BITS(re, &s->gb, 1);
4122
-#endif
4123
-                GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4124
-                i+= run;
4125
-                level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4126
-                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4127
-                LAST_SKIP_BITS(re, &s->gb, 1);
4128
-            }
4129
-          }
4130
-        } else {
4131
-            i+= run;
4132
-            level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4133
-            LAST_SKIP_BITS(re, &s->gb, 1);
4134
-        }
4135
-        if (i > 62){
4136
-            i-= 192;
4137
-            if(i&(~63)){
4138
-                av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4139
-                return -1;
4140
-            }
4141
-
4142
-            block[scan_table[i]] = level;
4143
-            break;
4144
-        }
4145
-
4146
-        block[scan_table[i]] = level;
4147
-    }
4148
-    CLOSE_READER(re, &s->gb);
4149
-  }
4150
- not_coded:
4151
-    if (intra) {
4152
-        if(!s->use_intra_dc_vlc){
4153
-            block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
4154
-
4155
-            i -= i>>31; //if(i == -1) i=0;
4156
-        }
4157
-
4158
-        mpeg4_pred_ac(s, block, n, dc_pred_dir);
4159
-        if (s->ac_pred) {
4160
-            i = 63; /* XXX: not optimal */
4161
-        }
4162
-    }
4163
-    s->block_last_index[n] = i;
4164
-    return 0;
4165
-}
4166
-
4167
-/**
4168
- * decode partition C of one MB.
4169
- * @return <0 if an error occurred
4170
- */
4171
-static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
4172
-{
4173
-    int cbp, mb_type;
4174
-    const int xy= s->mb_x + s->mb_y*s->mb_stride;
4175
-
4176
-    mb_type= s->current_picture.mb_type[xy];
4177
-    cbp = s->cbp_table[xy];
4178
-
4179
-    s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4180
-
4181
-    if(s->current_picture.qscale_table[xy] != s->qscale){
4182
-        ff_set_qscale(s, s->current_picture.qscale_table[xy] );
4183
-    }
4184
-
4185
-    if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4186
-        int i;
4187
-        for(i=0; i<4; i++){
4188
-            s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
4189
-            s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
4190
-        }
4191
-        s->mb_intra = IS_INTRA(mb_type);
4192
-
4193
-        if (IS_SKIP(mb_type)) {
4194
-            /* skip mb */
4195
-            for(i=0;i<6;i++)
4196
-                s->block_last_index[i] = -1;
4197
-            s->mv_dir = MV_DIR_FORWARD;
4198
-            s->mv_type = MV_TYPE_16X16;
4199
-            if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4200
-                s->mcsel=1;
4201
-                s->mb_skipped = 0;
4202
-            }else{
4203
-                s->mcsel=0;
4204
-                s->mb_skipped = 1;
4205
-            }
4206
-        }else if(s->mb_intra){
4207
-            s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
4208
-        }else if(!s->mb_intra){
4209
-//            s->mcsel= 0; //FIXME do we need to init that
4210
-
4211
-            s->mv_dir = MV_DIR_FORWARD;
4212
-            if (IS_8X8(mb_type)) {
4213
-                s->mv_type = MV_TYPE_8X8;
4214
-            } else {
4215
-                s->mv_type = MV_TYPE_16X16;
4216
-            }
4217
-        }
4218
-    } else { /* I-Frame */
4219
-        s->mb_intra = 1;
4220
-        s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
4221
-    }
4222
-
4223
-    if (!IS_SKIP(mb_type)) {
4224
-        int i;
4225
-        s->dsp.clear_blocks(s->block[0]);
4226
-        /* decode each block */
4227
-        for (i = 0; i < 6; i++) {
4228
-            if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
4229
-                av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
4230
-                return -1;
4231
-            }
4232
-            cbp+=cbp;
4233
-        }
4234
-    }
4235
-
4236
-    /* per-MB end of slice check */
4237
-
4238
-    if(--s->mb_num_left <= 0){
4239
-        if(mpeg4_is_resync(s))
4240
-            return SLICE_END;
4241
-        else
4242
-            return SLICE_NOEND;
4243
-    }else{
4244
-        if(mpeg4_is_resync(s)){
4245
-            const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4246
-            if(s->cbp_table[xy+delta])
4247
-                return SLICE_END;
4248
-        }
4249
-        return SLICE_OK;
4250
-    }
4251
-}
4252 3513
 
4253 3514
 /* Decodes RVLC of H.263+ UMV */
4254 3515
 static int h263p_decode_umotion(MpegEncContext * s, int pred)
... ...
@@ -4807,335 +2108,6 @@ end:
4807 4807
     return SLICE_OK;
4808 4808
 }
4809 4809
 
4810
-int ff_mpeg4_decode_mb(MpegEncContext *s,
4811
-                      DCTELEM block[6][64])
4812
-{
4813
-    int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4814
-    int16_t *mot_val;
4815
-    static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4816
-    const int xy= s->mb_x + s->mb_y * s->mb_stride;
4817
-
4818
-    assert(s->h263_pred);
4819
-
4820
-    if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4821
-        do{
4822
-            if (get_bits1(&s->gb)) {
4823
-                /* skip mb */
4824
-                s->mb_intra = 0;
4825
-                for(i=0;i<6;i++)
4826
-                    s->block_last_index[i] = -1;
4827
-                s->mv_dir = MV_DIR_FORWARD;
4828
-                s->mv_type = MV_TYPE_16X16;
4829
-                if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4830
-                    s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4831
-                    s->mcsel=1;
4832
-                    s->mv[0][0][0]= get_amv(s, 0);
4833
-                    s->mv[0][0][1]= get_amv(s, 1);
4834
-
4835
-                    s->mb_skipped = 0;
4836
-                }else{
4837
-                    s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4838
-                    s->mcsel=0;
4839
-                    s->mv[0][0][0] = 0;
4840
-                    s->mv[0][0][1] = 0;
4841
-                    s->mb_skipped = 1;
4842
-                }
4843
-                goto end;
4844
-            }
4845
-            cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4846
-            if (cbpc < 0){
4847
-                av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4848
-                return -1;
4849
-            }
4850
-        }while(cbpc == 20);
4851
-
4852
-        s->dsp.clear_blocks(s->block[0]);
4853
-        dquant = cbpc & 8;
4854
-        s->mb_intra = ((cbpc & 4) != 0);
4855
-        if (s->mb_intra) goto intra;
4856
-
4857
-        if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4858
-            s->mcsel= get_bits1(&s->gb);
4859
-        else s->mcsel= 0;
4860
-        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4861
-
4862
-        cbp = (cbpc & 3) | (cbpy << 2);
4863
-        if (dquant) {
4864
-            ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4865
-        }
4866
-        if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4867
-            s->interlaced_dct= get_bits1(&s->gb);
4868
-
4869
-        s->mv_dir = MV_DIR_FORWARD;
4870
-        if ((cbpc & 16) == 0) {
4871
-            if(s->mcsel){
4872
-                s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4873
-                /* 16x16 global motion prediction */
4874
-                s->mv_type = MV_TYPE_16X16;
4875
-                mx= get_amv(s, 0);
4876
-                my= get_amv(s, 1);
4877
-                s->mv[0][0][0] = mx;
4878
-                s->mv[0][0][1] = my;
4879
-            }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4880
-                s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4881
-                /* 16x8 field motion prediction */
4882
-                s->mv_type= MV_TYPE_FIELD;
4883
-
4884
-                s->field_select[0][0]= get_bits1(&s->gb);
4885
-                s->field_select[0][1]= get_bits1(&s->gb);
4886
-
4887
-                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4888
-
4889
-                for(i=0; i<2; i++){
4890
-                    mx = h263_decode_motion(s, pred_x, s->f_code);
4891
-                    if (mx >= 0xffff)
4892
-                        return -1;
4893
-
4894
-                    my = h263_decode_motion(s, pred_y/2, s->f_code);
4895
-                    if (my >= 0xffff)
4896
-                        return -1;
4897
-
4898
-                    s->mv[0][i][0] = mx;
4899
-                    s->mv[0][i][1] = my;
4900
-                }
4901
-            }else{
4902
-                s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4903
-                /* 16x16 motion prediction */
4904
-                s->mv_type = MV_TYPE_16X16;
4905
-                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4906
-                mx = h263_decode_motion(s, pred_x, s->f_code);
4907
-
4908
-                if (mx >= 0xffff)
4909
-                    return -1;
4910
-
4911
-                my = h263_decode_motion(s, pred_y, s->f_code);
4912
-
4913
-                if (my >= 0xffff)
4914
-                    return -1;
4915
-                s->mv[0][0][0] = mx;
4916
-                s->mv[0][0][1] = my;
4917
-            }
4918
-        } else {
4919
-            s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4920
-            s->mv_type = MV_TYPE_8X8;
4921
-            for(i=0;i<4;i++) {
4922
-                mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4923
-                mx = h263_decode_motion(s, pred_x, s->f_code);
4924
-                if (mx >= 0xffff)
4925
-                    return -1;
4926
-
4927
-                my = h263_decode_motion(s, pred_y, s->f_code);
4928
-                if (my >= 0xffff)
4929
-                    return -1;
4930
-                s->mv[0][i][0] = mx;
4931
-                s->mv[0][i][1] = my;
4932
-                mot_val[0] = mx;
4933
-                mot_val[1] = my;
4934
-            }
4935
-        }
4936
-    } else if(s->pict_type==FF_B_TYPE) {
4937
-        int modb1; // first bit of modb
4938
-        int modb2; // second bit of modb
4939
-        int mb_type;
4940
-
4941
-        s->mb_intra = 0; //B-frames never contain intra blocks
4942
-        s->mcsel=0;      //     ...               true gmc blocks
4943
-
4944
-        if(s->mb_x==0){
4945
-            for(i=0; i<2; i++){
4946
-                s->last_mv[i][0][0]=
4947
-                s->last_mv[i][0][1]=
4948
-                s->last_mv[i][1][0]=
4949
-                s->last_mv[i][1][1]= 0;
4950
-            }
4951
-        }
4952
-
4953
-        /* if we skipped it in the future P Frame than skip it now too */
4954
-        s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4955
-
4956
-        if(s->mb_skipped){
4957
-                /* skip mb */
4958
-            for(i=0;i<6;i++)
4959
-                s->block_last_index[i] = -1;
4960
-
4961
-            s->mv_dir = MV_DIR_FORWARD;
4962
-            s->mv_type = MV_TYPE_16X16;
4963
-            s->mv[0][0][0] = 0;
4964
-            s->mv[0][0][1] = 0;
4965
-            s->mv[1][0][0] = 0;
4966
-            s->mv[1][0][1] = 0;
4967
-            s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4968
-            goto end;
4969
-        }
4970
-
4971
-        modb1= get_bits1(&s->gb);
4972
-        if(modb1){
4973
-            mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4974
-            cbp=0;
4975
-        }else{
4976
-            modb2= get_bits1(&s->gb);
4977
-            mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4978
-            if(mb_type<0){
4979
-                av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4980
-                return -1;
4981
-            }
4982
-            mb_type= mb_type_b_map[ mb_type ];
4983
-            if(modb2) cbp= 0;
4984
-            else{
4985
-                s->dsp.clear_blocks(s->block[0]);
4986
-                cbp= get_bits(&s->gb, 6);
4987
-            }
4988
-
4989
-            if ((!IS_DIRECT(mb_type)) && cbp) {
4990
-                if(get_bits1(&s->gb)){
4991
-                    ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4992
-                }
4993
-            }
4994
-
4995
-            if(!s->progressive_sequence){
4996
-                if(cbp)
4997
-                    s->interlaced_dct= get_bits1(&s->gb);
4998
-
4999
-                if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
5000
-                    mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
5001
-                    mb_type &= ~MB_TYPE_16x16;
5002
-
5003
-                    if(USES_LIST(mb_type, 0)){
5004
-                        s->field_select[0][0]= get_bits1(&s->gb);
5005
-                        s->field_select[0][1]= get_bits1(&s->gb);
5006
-                    }
5007
-                    if(USES_LIST(mb_type, 1)){
5008
-                        s->field_select[1][0]= get_bits1(&s->gb);
5009
-                        s->field_select[1][1]= get_bits1(&s->gb);
5010
-                    }
5011
-                }
5012
-            }
5013
-
5014
-            s->mv_dir = 0;
5015
-            if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
5016
-                s->mv_type= MV_TYPE_16X16;
5017
-
5018
-                if(USES_LIST(mb_type, 0)){
5019
-                    s->mv_dir = MV_DIR_FORWARD;
5020
-
5021
-                    mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
5022
-                    my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
5023
-                    s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
5024
-                    s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
5025
-                }
5026
-
5027
-                if(USES_LIST(mb_type, 1)){
5028
-                    s->mv_dir |= MV_DIR_BACKWARD;
5029
-
5030
-                    mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
5031
-                    my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
5032
-                    s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
5033
-                    s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
5034
-                }
5035
-            }else if(!IS_DIRECT(mb_type)){
5036
-                s->mv_type= MV_TYPE_FIELD;
5037
-
5038
-                if(USES_LIST(mb_type, 0)){
5039
-                    s->mv_dir = MV_DIR_FORWARD;
5040
-
5041
-                    for(i=0; i<2; i++){
5042
-                        mx = h263_decode_motion(s, s->last_mv[0][i][0]  , s->f_code);
5043
-                        my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
5044
-                        s->last_mv[0][i][0]=  s->mv[0][i][0] = mx;
5045
-                        s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
5046
-                    }
5047
-                }
5048
-
5049
-                if(USES_LIST(mb_type, 1)){
5050
-                    s->mv_dir |= MV_DIR_BACKWARD;
5051
-
5052
-                    for(i=0; i<2; i++){
5053
-                        mx = h263_decode_motion(s, s->last_mv[1][i][0]  , s->b_code);
5054
-                        my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
5055
-                        s->last_mv[1][i][0]=  s->mv[1][i][0] = mx;
5056
-                        s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
5057
-                    }
5058
-                }
5059
-            }
5060
-        }
5061
-
5062
-        if(IS_DIRECT(mb_type)){
5063
-            if(IS_SKIP(mb_type))
5064
-                mx=my=0;
5065
-            else{
5066
-                mx = h263_decode_motion(s, 0, 1);
5067
-                my = h263_decode_motion(s, 0, 1);
5068
-            }
5069
-
5070
-            s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5071
-            mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
5072
-        }
5073
-        s->current_picture.mb_type[xy]= mb_type;
5074
-    } else { /* I-Frame */
5075
-        do{
5076
-            cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
5077
-            if (cbpc < 0){
5078
-                av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
5079
-                return -1;
5080
-            }
5081
-        }while(cbpc == 8);
5082
-
5083
-        dquant = cbpc & 4;
5084
-        s->mb_intra = 1;
5085
-intra:
5086
-        s->ac_pred = get_bits1(&s->gb);
5087
-        if(s->ac_pred)
5088
-            s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
5089
-        else
5090
-            s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
5091
-
5092
-        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
5093
-        if(cbpy<0){
5094
-            av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
5095
-            return -1;
5096
-        }
5097
-        cbp = (cbpc & 3) | (cbpy << 2);
5098
-
5099
-        s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
5100
-
5101
-        if (dquant) {
5102
-            ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
5103
-        }
5104
-
5105
-        if(!s->progressive_sequence)
5106
-            s->interlaced_dct= get_bits1(&s->gb);
5107
-
5108
-        s->dsp.clear_blocks(s->block[0]);
5109
-        /* decode each block */
5110
-        for (i = 0; i < 6; i++) {
5111
-            if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
5112
-                return -1;
5113
-            cbp+=cbp;
5114
-        }
5115
-        goto end;
5116
-    }
5117
-
5118
-    /* decode each block */
5119
-    for (i = 0; i < 6; i++) {
5120
-        if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
5121
-            return -1;
5122
-        cbp+=cbp;
5123
-    }
5124
-end:
5125
-
5126
-        /* per-MB end of slice check */
5127
-    if(s->codec_id==CODEC_ID_MPEG4){
5128
-        if(mpeg4_is_resync(s)){
5129
-            const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
5130
-            if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
5131
-                return SLICE_OK;
5132
-            return SLICE_END;
5133
-        }
5134
-    }
5135
-
5136
-    return SLICE_OK;
5137
-}
5138
-
5139 4810
 /* most is hardcoded. should extend to handle all h263 streams */
5140 4811
 int h263_decode_picture_header(MpegEncContext *s)
5141 4812
 {
... ...
@@ -5294,7 +2266,7 @@ int h263_decode_picture_header(MpegEncContext *s)
5294 5294
                     s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5295 5295
                     s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5296 5296
                 }else{
5297
-                    s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5297
+                    s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info];
5298 5298
                 }
5299 5299
             } else {
5300 5300
                 width = h263_format[format][0];
... ...
@@ -5403,688 +2375,4 @@ int h263_decode_picture_header(MpegEncContext *s)
5403 5403
     return 0;
5404 5404
 }
5405 5405
 
5406
-static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5407
-    int hours, minutes, seconds;
5408
-
5409
-    hours= get_bits(gb, 5);
5410
-    minutes= get_bits(gb, 6);
5411
-    skip_bits1(gb);
5412
-    seconds= get_bits(gb, 6);
5413
-
5414
-    s->time_base= seconds + 60*(minutes + 60*hours);
5415
-
5416
-    skip_bits1(gb);
5417
-    skip_bits1(gb);
5418
-
5419
-    return 0;
5420
-}
5421
-
5422
-static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5423
-    int width, height, vo_ver_id;
5424
-
5425
-    /* vol header */
5426
-    skip_bits(gb, 1); /* random access */
5427
-    s->vo_type= get_bits(gb, 8);
5428
-    if (get_bits1(gb) != 0) { /* is_ol_id */
5429
-        vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5430
-        skip_bits(gb, 3); /* vo_priority */
5431
-    } else {
5432
-        vo_ver_id = 1;
5433
-    }
5434
-    s->aspect_ratio_info= get_bits(gb, 4);
5435
-    if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5436
-        s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5437
-        s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5438
-    }else{
5439
-        s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5440
-    }
5441
-
5442
-    if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5443
-        int chroma_format= get_bits(gb, 2);
5444
-        if(chroma_format!=CHROMA_420){
5445
-            av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5446
-        }
5447
-        s->low_delay= get_bits1(gb);
5448
-        if(get_bits1(gb)){ /* vbv parameters */
5449
-            get_bits(gb, 15);   /* first_half_bitrate */
5450
-            skip_bits1(gb);     /* marker */
5451
-            get_bits(gb, 15);   /* latter_half_bitrate */
5452
-            skip_bits1(gb);     /* marker */
5453
-            get_bits(gb, 15);   /* first_half_vbv_buffer_size */
5454
-            skip_bits1(gb);     /* marker */
5455
-            get_bits(gb, 3);    /* latter_half_vbv_buffer_size */
5456
-            get_bits(gb, 11);   /* first_half_vbv_occupancy */
5457
-            skip_bits1(gb);     /* marker */
5458
-            get_bits(gb, 15);   /* latter_half_vbv_occupancy */
5459
-            skip_bits1(gb);     /* marker */
5460
-        }
5461
-    }else{
5462
-        // set low delay flag only once the smartest? low delay detection won't be overriden
5463
-        if(s->picture_number==0)
5464
-            s->low_delay=0;
5465
-    }
5466 5406
 
5467
-    s->shape = get_bits(gb, 2); /* vol shape */
5468
-    if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5469
-    if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5470
-        av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5471
-        skip_bits(gb, 4);  //video_object_layer_shape_extension
5472
-    }
5473
-
5474
-    check_marker(gb, "before time_increment_resolution");
5475
-
5476
-    s->avctx->time_base.den = get_bits(gb, 16);
5477
-    if(!s->avctx->time_base.den){
5478
-        av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5479
-        return -1;
5480
-    }
5481
-
5482
-    s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5483
-    if (s->time_increment_bits < 1)
5484
-        s->time_increment_bits = 1;
5485
-
5486
-    check_marker(gb, "before fixed_vop_rate");
5487
-
5488
-    if (get_bits1(gb) != 0) {   /* fixed_vop_rate  */
5489
-        s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5490
-    }else
5491
-        s->avctx->time_base.num = 1;
5492
-
5493
-    s->t_frame=0;
5494
-
5495
-    if (s->shape != BIN_ONLY_SHAPE) {
5496
-        if (s->shape == RECT_SHAPE) {
5497
-            skip_bits1(gb);   /* marker */
5498
-            width = get_bits(gb, 13);
5499
-            skip_bits1(gb);   /* marker */
5500
-            height = get_bits(gb, 13);
5501
-            skip_bits1(gb);   /* marker */
5502
-            if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5503
-                s->width = width;
5504
-                s->height = height;
5505
-            }
5506
-        }
5507
-
5508
-        s->progressive_sequence=
5509
-        s->progressive_frame= get_bits1(gb)^1;
5510
-        s->interlaced_dct=0;
5511
-        if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5512
-            av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n");   /* OBMC Disable */
5513
-        if (vo_ver_id == 1) {
5514
-            s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5515
-        } else {
5516
-            s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5517
-        }
5518
-        if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5519
-        if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5520
-            if(s->vol_sprite_usage==STATIC_SPRITE){
5521
-                s->sprite_width = get_bits(gb, 13);
5522
-                skip_bits1(gb); /* marker */
5523
-                s->sprite_height= get_bits(gb, 13);
5524
-                skip_bits1(gb); /* marker */
5525
-                s->sprite_left  = get_bits(gb, 13);
5526
-                skip_bits1(gb); /* marker */
5527
-                s->sprite_top   = get_bits(gb, 13);
5528
-                skip_bits1(gb); /* marker */
5529
-            }
5530
-            s->num_sprite_warping_points= get_bits(gb, 6);
5531
-            if(s->num_sprite_warping_points > 3){
5532
-                av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5533
-                s->num_sprite_warping_points= 0;
5534
-                return -1;
5535
-            }
5536
-            s->sprite_warping_accuracy = get_bits(gb, 2);
5537
-            s->sprite_brightness_change= get_bits1(gb);
5538
-            if(s->vol_sprite_usage==STATIC_SPRITE)
5539
-                s->low_latency_sprite= get_bits1(gb);
5540
-        }
5541
-        // FIXME sadct disable bit if verid!=1 && shape not rect
5542
-
5543
-        if (get_bits1(gb) == 1) {   /* not_8_bit */
5544
-            s->quant_precision = get_bits(gb, 4); /* quant_precision */
5545
-            if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5546
-            if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5547
-        } else {
5548
-            s->quant_precision = 5;
5549
-        }
5550
-
5551
-        // FIXME a bunch of grayscale shape things
5552
-
5553
-        if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5554
-            int i, v;
5555
-
5556
-            /* load default matrixes */
5557
-            for(i=0; i<64; i++){
5558
-                int j= s->dsp.idct_permutation[i];
5559
-                v= ff_mpeg4_default_intra_matrix[i];
5560
-                s->intra_matrix[j]= v;
5561
-                s->chroma_intra_matrix[j]= v;
5562
-
5563
-                v= ff_mpeg4_default_non_intra_matrix[i];
5564
-                s->inter_matrix[j]= v;
5565
-                s->chroma_inter_matrix[j]= v;
5566
-            }
5567
-
5568
-            /* load custom intra matrix */
5569
-            if(get_bits1(gb)){
5570
-                int last=0;
5571
-                for(i=0; i<64; i++){
5572
-                    int j;
5573
-                    v= get_bits(gb, 8);
5574
-                    if(v==0) break;
5575
-
5576
-                    last= v;
5577
-                    j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5578
-                    s->intra_matrix[j]= v;
5579
-                    s->chroma_intra_matrix[j]= v;
5580
-                }
5581
-
5582
-                /* replicate last value */
5583
-                for(; i<64; i++){
5584
-                    int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5585
-                    s->intra_matrix[j]= last;
5586
-                    s->chroma_intra_matrix[j]= last;
5587
-                }
5588
-            }
5589
-
5590
-            /* load custom non intra matrix */
5591
-            if(get_bits1(gb)){
5592
-                int last=0;
5593
-                for(i=0; i<64; i++){
5594
-                    int j;
5595
-                    v= get_bits(gb, 8);
5596
-                    if(v==0) break;
5597
-
5598
-                    last= v;
5599
-                    j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5600
-                    s->inter_matrix[j]= v;
5601
-                    s->chroma_inter_matrix[j]= v;
5602
-                }
5603
-
5604
-                /* replicate last value */
5605
-                for(; i<64; i++){
5606
-                    int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5607
-                    s->inter_matrix[j]= last;
5608
-                    s->chroma_inter_matrix[j]= last;
5609
-                }
5610
-            }
5611
-
5612
-            // FIXME a bunch of grayscale shape things
5613
-        }
5614
-
5615
-        if(vo_ver_id != 1)
5616
-             s->quarter_sample= get_bits1(gb);
5617
-        else s->quarter_sample=0;
5618
-
5619
-        if(!get_bits1(gb)){
5620
-            int pos= get_bits_count(gb);
5621
-            int estimation_method= get_bits(gb, 2);
5622
-            if(estimation_method<2){
5623
-                if(!get_bits1(gb)){
5624
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5625
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5626
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5627
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5628
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5629
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5630
-                }
5631
-                if(!get_bits1(gb)){
5632
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5633
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5634
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5635
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5636
-                }
5637
-                if(!check_marker(gb, "in complexity estimation part 1")){
5638
-                    skip_bits_long(gb, pos - get_bits_count(gb));
5639
-                    goto no_cplx_est;
5640
-                }
5641
-                if(!get_bits1(gb)){
5642
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5643
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5644
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5645
-                    s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5646
-                }
5647
-                if(!get_bits1(gb)){
5648
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5649
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5650
-                    s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5651
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5652
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5653
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5654
-                }
5655
-                if(!check_marker(gb, "in complexity estimation part 2")){
5656
-                    skip_bits_long(gb, pos - get_bits_count(gb));
5657
-                    goto no_cplx_est;
5658
-                }
5659
-                if(estimation_method==1){
5660
-                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5661
-                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5662
-                }
5663
-            }else
5664
-                av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5665
-        }else{
5666
-no_cplx_est:
5667
-            s->cplx_estimation_trash_i=
5668
-            s->cplx_estimation_trash_p=
5669
-            s->cplx_estimation_trash_b= 0;
5670
-        }
5671
-
5672
-        s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5673
-
5674
-        s->data_partitioning= get_bits1(gb);
5675
-        if(s->data_partitioning){
5676
-            s->rvlc= get_bits1(gb);
5677
-        }
5678
-
5679
-        if(vo_ver_id != 1) {
5680
-            s->new_pred= get_bits1(gb);
5681
-            if(s->new_pred){
5682
-                av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5683
-                skip_bits(gb, 2); /* requested upstream message type */
5684
-                skip_bits1(gb); /* newpred segment type */
5685
-            }
5686
-            s->reduced_res_vop= get_bits1(gb);
5687
-            if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5688
-        }
5689
-        else{
5690
-            s->new_pred=0;
5691
-            s->reduced_res_vop= 0;
5692
-        }
5693
-
5694
-        s->scalability= get_bits1(gb);
5695
-
5696
-        if (s->scalability) {
5697
-            GetBitContext bak= *gb;
5698
-            int ref_layer_id;
5699
-            int ref_layer_sampling_dir;
5700
-            int h_sampling_factor_n;
5701
-            int h_sampling_factor_m;
5702
-            int v_sampling_factor_n;
5703
-            int v_sampling_factor_m;
5704
-
5705
-            s->hierachy_type= get_bits1(gb);
5706
-            ref_layer_id= get_bits(gb, 4);
5707
-            ref_layer_sampling_dir= get_bits1(gb);
5708
-            h_sampling_factor_n= get_bits(gb, 5);
5709
-            h_sampling_factor_m= get_bits(gb, 5);
5710
-            v_sampling_factor_n= get_bits(gb, 5);
5711
-            v_sampling_factor_m= get_bits(gb, 5);
5712
-            s->enhancement_type= get_bits1(gb);
5713
-
5714
-            if(   h_sampling_factor_n==0 || h_sampling_factor_m==0
5715
-               || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5716
-                /* illegal scalability header (VERY broken encoder),
5717
-                 * trying to workaround */
5718
-                s->scalability=0;
5719
-                *gb= bak;
5720
-            }else
5721
-                av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5722
-
5723
-            // bin shape stuff FIXME
5724
-        }
5725
-    }
5726
-    return 0;
5727
-}
5728
-
5729
-/**
5730
- * decodes the user data stuff in the header.
5731
- * Also initializes divx/xvid/lavc_version/build.
5732
- */
5733
-static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5734
-    char buf[256];
5735
-    int i;
5736
-    int e;
5737
-    int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5738
-    char last;
5739
-
5740
-    for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5741
-        if(show_bits(gb, 23) == 0) break;
5742
-        buf[i]= get_bits(gb, 8);
5743
-    }
5744
-    buf[i]=0;
5745
-
5746
-    /* divx detection */
5747
-    e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5748
-    if(e<2)
5749
-        e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5750
-    if(e>=2){
5751
-        s->divx_version= ver;
5752
-        s->divx_build= build;
5753
-        s->divx_packed= e==3 && last=='p';
5754
-        if(s->divx_packed && !s->showed_packed_warning) {
5755
-            av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5756
-            s->showed_packed_warning=1;
5757
-        }
5758
-    }
5759
-
5760
-    /* ffmpeg detection */
5761
-    e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5762
-    if(e!=4)
5763
-        e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5764
-    if(e!=4){
5765
-        e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5766
-        if (e>1)
5767
-            build= (ver<<16) + (ver2<<8) + ver3;
5768
-    }
5769
-    if(e!=4){
5770
-        if(strcmp(buf, "ffmpeg")==0){
5771
-            s->lavc_build= 4600;
5772
-        }
5773
-    }
5774
-    if(e==4){
5775
-        s->lavc_build= build;
5776
-    }
5777
-
5778
-    /* Xvid detection */
5779
-    e=sscanf(buf, "XviD%d", &build);
5780
-    if(e==1){
5781
-        s->xvid_build= build;
5782
-    }
5783
-
5784
-    return 0;
5785
-}
5786
-
5787
-static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5788
-    int time_incr, time_increment;
5789
-
5790
-    s->pict_type = get_bits(gb, 2) + FF_I_TYPE;        /* pict type: I = 0 , P = 1 */
5791
-    if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5792
-        av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5793
-        s->low_delay=0;
5794
-    }
5795
-
5796
-    s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5797
-    if(s->partitioned_frame)
5798
-        s->decode_mb= mpeg4_decode_partitioned_mb;
5799
-    else
5800
-        s->decode_mb= ff_mpeg4_decode_mb;
5801
-
5802
-    time_incr=0;
5803
-    while (get_bits1(gb) != 0)
5804
-        time_incr++;
5805
-
5806
-    check_marker(gb, "before time_increment");
5807
-
5808
-    if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5809
-        av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5810
-
5811
-        for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5812
-            if (    s->pict_type == FF_P_TYPE
5813
-                || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
5814
-                if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
5815
-            }else
5816
-                if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
5817
-        }
5818
-
5819
-        av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5820
-    }
5821
-
5822
-    if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5823
-    else time_increment= get_bits(gb, s->time_increment_bits);
5824
-
5825
-    if(s->pict_type!=FF_B_TYPE){
5826
-        s->last_time_base= s->time_base;
5827
-        s->time_base+= time_incr;
5828
-        s->time= s->time_base*s->avctx->time_base.den + time_increment;
5829
-        if(s->workaround_bugs&FF_BUG_UMP4){
5830
-            if(s->time < s->last_non_b_time){
5831
-                /* header is not mpeg-4-compatible, broken encoder,
5832
-                 * trying to workaround */
5833
-                s->time_base++;
5834
-                s->time+= s->avctx->time_base.den;
5835
-            }
5836
-        }
5837
-        s->pp_time= s->time - s->last_non_b_time;
5838
-        s->last_non_b_time= s->time;
5839
-    }else{
5840
-        s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5841
-        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5842
-        if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5843
-            /* messed up order, maybe after seeking? skipping current b-frame */
5844
-            return FRAME_SKIPPED;
5845
-        }
5846
-        ff_mpeg4_init_direct_mv(s);
5847
-
5848
-        if(s->t_frame==0) s->t_frame= s->pb_time;
5849
-        if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5850
-        s->pp_field_time= (  ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5851
-                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5852
-        s->pb_field_time= (  ROUNDED_DIV(s->time, s->t_frame)
5853
-                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5854
-        if(!s->progressive_sequence){
5855
-            if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5856
-                return FRAME_SKIPPED;
5857
-        }
5858
-    }
5859
-
5860
-    if(s->avctx->time_base.num)
5861
-        s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5862
-    else
5863
-        s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5864
-    if(s->avctx->debug&FF_DEBUG_PTS)
5865
-        av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5866
-
5867
-    check_marker(gb, "before vop_coded");
5868
-
5869
-    /* vop coded */
5870
-    if (get_bits1(gb) != 1){
5871
-        if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5872
-            av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5873
-        return FRAME_SKIPPED;
5874
-    }
5875
-    if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5876
-                          || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5877
-        /* rounding type for motion estimation */
5878
-        s->no_rounding = get_bits1(gb);
5879
-    } else {
5880
-        s->no_rounding = 0;
5881
-    }
5882
-//FIXME reduced res stuff
5883
-
5884
-     if (s->shape != RECT_SHAPE) {
5885
-         if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
5886
-             int width, height, hor_spat_ref, ver_spat_ref;
5887
-
5888
-             width = get_bits(gb, 13);
5889
-             skip_bits1(gb);   /* marker */
5890
-             height = get_bits(gb, 13);
5891
-             skip_bits1(gb);   /* marker */
5892
-             hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5893
-             skip_bits1(gb);   /* marker */
5894
-             ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5895
-         }
5896
-         skip_bits1(gb); /* change_CR_disable */
5897
-
5898
-         if (get_bits1(gb) != 0) {
5899
-             skip_bits(gb, 8); /* constant_alpha_value */
5900
-         }
5901
-     }
5902
-//FIXME complexity estimation stuff
5903
-
5904
-     if (s->shape != BIN_ONLY_SHAPE) {
5905
-         skip_bits_long(gb, s->cplx_estimation_trash_i);
5906
-         if(s->pict_type != FF_I_TYPE)
5907
-            skip_bits_long(gb, s->cplx_estimation_trash_p);
5908
-         if(s->pict_type == FF_B_TYPE)
5909
-            skip_bits_long(gb, s->cplx_estimation_trash_b);
5910
-
5911
-         s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5912
-         if(!s->progressive_sequence){
5913
-             s->top_field_first= get_bits1(gb);
5914
-             s->alternate_scan= get_bits1(gb);
5915
-         }else
5916
-             s->alternate_scan= 0;
5917
-     }
5918
-
5919
-     if(s->alternate_scan){
5920
-         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);
5921
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);
5922
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5923
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5924
-     } else{
5925
-         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);
5926
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);
5927
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5928
-         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5929
-     }
5930
-
5931
-     if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5932
-         mpeg4_decode_sprite_trajectory(s, gb);
5933
-         if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5934
-         if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5935
-     }
5936
-
5937
-     if (s->shape != BIN_ONLY_SHAPE) {
5938
-         s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5939
-         if(s->qscale==0){
5940
-             av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5941
-             return -1; // makes no sense to continue, as there is nothing left from the image then
5942
-         }
5943
-
5944
-         if (s->pict_type != FF_I_TYPE) {
5945
-             s->f_code = get_bits(gb, 3);       /* fcode_for */
5946
-             if(s->f_code==0){
5947
-                 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5948
-                 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5949
-             }
5950
-         }else
5951
-             s->f_code=1;
5952
-
5953
-         if (s->pict_type == FF_B_TYPE) {
5954
-             s->b_code = get_bits(gb, 3);
5955
-         }else
5956
-             s->b_code=1;
5957
-
5958
-         if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5959
-             av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d\n",
5960
-                 s->qscale, s->f_code, s->b_code,
5961
-                 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
5962
-                 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5963
-                 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5964
-                 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b);
5965
-         }
5966
-
5967
-         if(!s->scalability){
5968
-             if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
5969
-                 skip_bits1(gb); // vop shape coding type
5970
-             }
5971
-         }else{
5972
-             if(s->enhancement_type){
5973
-                 int load_backward_shape= get_bits1(gb);
5974
-                 if(load_backward_shape){
5975
-                     av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
5976
-                 }
5977
-             }
5978
-             skip_bits(gb, 2); //ref_select_code
5979
-         }
5980
-     }
5981
-     /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
5982
-     // note we cannot detect divx5 without b-frames easily (although it's buggy too)
5983
-     if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
5984
-         av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
5985
-         s->low_delay=1;
5986
-     }
5987
-
5988
-     s->picture_number++; // better than pic number==0 always ;)
5989
-
5990
-     s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5991
-     s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5992
-
5993
-     if(s->workaround_bugs&FF_BUG_EDGE){
5994
-         s->h_edge_pos= s->width;
5995
-         s->v_edge_pos= s->height;
5996
-     }
5997
-     return 0;
5998
-}
5999
-
6000
-/**
6001
- * decode mpeg4 headers
6002
- * @return <0 if no VOP found (or a damaged one)
6003
- *         FRAME_SKIPPED if a not coded VOP is found
6004
- *         0 if a VOP is found
6005
- */
6006
-int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6007
-{
6008
-    int startcode, v;
6009
-
6010
-    /* search next start code */
6011
-    align_get_bits(gb);
6012
-
6013
-    if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6014
-        skip_bits(gb, 24);
6015
-        if(get_bits(gb, 8) == 0xF0)
6016
-            goto end;
6017
-    }
6018
-
6019
-    startcode = 0xff;
6020
-    for(;;) {
6021
-        if(get_bits_count(gb) >= gb->size_in_bits){
6022
-            if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6023
-                av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6024
-                return FRAME_SKIPPED; //divx bug
6025
-            }else
6026
-                return -1; //end of stream
6027
-        }
6028
-
6029
-        /* use the bits after the test */
6030
-        v = get_bits(gb, 8);
6031
-        startcode = ((startcode << 8) | v) & 0xffffffff;
6032
-
6033
-        if((startcode&0xFFFFFF00) != 0x100)
6034
-            continue; //no startcode
6035
-
6036
-        if(s->avctx->debug&FF_DEBUG_STARTCODE){
6037
-            av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6038
-            if     (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6039
-            else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6040
-            else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6041
-            else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6042
-            else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6043
-            else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6044
-            else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6045
-            else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6046
-            else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6047
-            else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6048
-            else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6049
-            else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6050
-            else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6051
-            else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6052
-            else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6053
-            else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6054
-            else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6055
-            else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6056
-            else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6057
-            else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6058
-            else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6059
-            else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6060
-            else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6061
-            else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6062
-            else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6063
-            else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6064
-            else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6065
-            av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6066
-        }
6067
-
6068
-        if(startcode >= 0x120 && startcode <= 0x12F){
6069
-            if(decode_vol_header(s, gb) < 0)
6070
-                return -1;
6071
-        }
6072
-        else if(startcode == USER_DATA_STARTCODE){
6073
-            decode_user_data(s, gb);
6074
-        }
6075
-        else if(startcode == GOP_STARTCODE){
6076
-            mpeg4_decode_gop_header(s, gb);
6077
-        }
6078
-        else if(startcode == VOP_STARTCODE){
6079
-            break;
6080
-        }
6081
-
6082
-        align_get_bits(gb);
6083
-        startcode = 0xff;
6084
-    }
6085
-end:
6086
-    if(s->flags& CODEC_FLAG_LOW_DELAY)
6087
-        s->low_delay=1;
6088
-    s->avctx->has_b_frames= !s->low_delay;
6089
-    return decode_vop_header(s, gb);
6090
-}
6091 5407
new file mode 100644
... ...
@@ -0,0 +1,178 @@
0
+/*
1
+ * H263 internal header
2
+ *
3
+ * This file is part of FFmpeg.
4
+ *
5
+ * FFmpeg 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.1 of the License, or (at your option) any later version.
9
+ *
10
+ * FFmpeg 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.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with FFmpeg; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ */
19
+#ifndef AVCODEC_H263_H
20
+#define AVCODEC_H263_H
21
+
22
+// The defines below define the number of bits that are read at once for
23
+// reading vlc values. Changing these may improve speed and data cache needs
24
+// be aware though that decreasing them may need the number of stages that is
25
+// passed to get_vlc* to be increased.
26
+#define INTRA_MCBPC_VLC_BITS 6
27
+#define INTER_MCBPC_VLC_BITS 7
28
+#define CBPY_VLC_BITS 6
29
+#define TEX_VLC_BITS 9
30
+
31
+extern const AVRational ff_h263_pixel_aspect[16];
32
+extern const uint8_t cbpy_tab[16][2];
33
+
34
+extern const uint8_t mvtab[33][2];
35
+
36
+extern const uint8_t intra_MCBPC_code[9];
37
+extern const uint8_t intra_MCBPC_bits[9];
38
+
39
+extern const uint8_t inter_MCBPC_code[28];
40
+extern const uint8_t inter_MCBPC_bits[28];
41
+
42
+extern VLC intra_MCBPC_vlc;
43
+extern VLC inter_MCBPC_vlc;
44
+extern VLC cbpy_vlc;
45
+
46
+extern RLTable rl_inter;
47
+
48
+int h263_decode_motion(MpegEncContext * s, int pred, int f_code);
49
+av_const int ff_h263_aspect_to_info(AVRational aspect);
50
+
51
+static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
52
+    int l, bit_size, code;
53
+
54
+    if (val == 0) {
55
+        return mvtab[0][1];
56
+    } else {
57
+        bit_size = f_code - 1;
58
+        /* modulo encoding */
59
+        l= INT_BIT - 6 - bit_size;
60
+        val = (val<<l)>>l;
61
+        val--;
62
+        code = (val >> bit_size) + 1;
63
+
64
+        return mvtab[code][1] + 1 + bit_size;
65
+    }
66
+}
67
+
68
+static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
69
+    if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
70
+        skip_put_bits(&s->pb,
71
+            h263_get_motion_length(s, x, f_code)
72
+           +h263_get_motion_length(s, y, f_code));
73
+    }else{
74
+        ff_h263_encode_motion(s, x, f_code);
75
+        ff_h263_encode_motion(s, y, f_code);
76
+    }
77
+}
78
+
79
+static inline int get_p_cbp(MpegEncContext * s,
80
+                      DCTELEM block[6][64],
81
+                      int motion_x, int motion_y){
82
+    int cbp, i;
83
+
84
+    if(s->flags & CODEC_FLAG_CBP_RD){
85
+        int best_cbpy_score= INT_MAX;
86
+        int best_cbpc_score= INT_MAX;
87
+        int cbpc = (-1), cbpy= (-1);
88
+        const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
89
+        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
90
+
91
+        for(i=0; i<4; i++){
92
+            int score= inter_MCBPC_bits[i + offset] * lambda;
93
+            if(i&1) score += s->coded_score[5];
94
+            if(i&2) score += s->coded_score[4];
95
+
96
+            if(score < best_cbpc_score){
97
+                best_cbpc_score= score;
98
+                cbpc= i;
99
+            }
100
+        }
101
+
102
+        for(i=0; i<16; i++){
103
+            int score= cbpy_tab[i ^ 0xF][1] * lambda;
104
+            if(i&1) score += s->coded_score[3];
105
+            if(i&2) score += s->coded_score[2];
106
+            if(i&4) score += s->coded_score[1];
107
+            if(i&8) score += s->coded_score[0];
108
+
109
+            if(score < best_cbpy_score){
110
+                best_cbpy_score= score;
111
+                cbpy= i;
112
+            }
113
+        }
114
+        cbp= cbpc + 4*cbpy;
115
+        if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
116
+            if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
117
+                cbp= 0;
118
+        }
119
+
120
+        for (i = 0; i < 6; i++) {
121
+            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
122
+                s->block_last_index[i]= -1;
123
+                s->dsp.clear_block(s->block[i]);
124
+            }
125
+        }
126
+    }else{
127
+        cbp= 0;
128
+        for (i = 0; i < 6; i++) {
129
+            if (s->block_last_index[i] >= 0)
130
+                cbp |= 1 << (5 - i);
131
+        }
132
+    }
133
+    return cbp;
134
+}
135
+
136
+static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
137
+                            int motion_x, int motion_y, int mb_type){
138
+    int cbp=0, i;
139
+
140
+    if(s->flags & CODEC_FLAG_CBP_RD){
141
+        int score=0;
142
+        const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
143
+
144
+        for(i=0; i<6; i++){
145
+            if(s->coded_score[i] < 0){
146
+                score += s->coded_score[i];
147
+                cbp |= 1 << (5 - i);
148
+            }
149
+        }
150
+
151
+        if(cbp){
152
+            int zero_score= -6;
153
+            if ((motion_x | motion_y | s->dquant | mb_type) == 0){
154
+                zero_score-= 4; //2*MV + mb_type + cbp bit
155
+            }
156
+
157
+            zero_score*= lambda;
158
+            if(zero_score <= score){
159
+                cbp=0;
160
+            }
161
+        }
162
+
163
+        for (i = 0; i < 6; i++) {
164
+            if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
165
+                s->block_last_index[i]= -1;
166
+                s->dsp.clear_block(s->block[i]);
167
+            }
168
+        }
169
+    }else{
170
+        for (i = 0; i < 6; i++) {
171
+            if (s->block_last_index[i] >= 0)
172
+                cbp |= 1 << (5 - i);
173
+        }
174
+    }
175
+    return cbp;
176
+}
177
+#endif
... ...
@@ -177,7 +177,7 @@ const int8_t inter_run[102] = {
177 177
  35, 36, 37, 38, 39, 40,
178 178
 };
179 179
 
180
-static RLTable rl_inter = {
180
+RLTable rl_inter = {
181 181
     102,
182 182
     58,
183 183
     inter_vlc,
... ...
@@ -313,4 +313,23 @@ const uint8_t ff_h263_loop_filter_strength[32]={
313 313
     0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11,11,12,12,12
314 314
 };
315 315
 
316
+const AVRational ff_h263_pixel_aspect[16]={
317
+ {0, 1},
318
+ {1, 1},
319
+ {12, 11},
320
+ {10, 11},
321
+ {16, 11},
322
+ {40, 33},
323
+ {0, 1},
324
+ {0, 1},
325
+ {0, 1},
326
+ {0, 1},
327
+ {0, 1},
328
+ {0, 1},
329
+ {0, 1},
330
+ {0, 1},
331
+ {0, 1},
332
+ {0, 1},
333
+};
334
+
316 335
 #endif /* AVCODEC_H263DATA_H */
... ...
@@ -34,6 +34,7 @@
34 34
 #include "msmpeg4.h"
35 35
 #include "vdpau_internal.h"
36 36
 #include "flv.h"
37
+#include "mpeg4video.h"
37 38
 
38 39
 //#define DEBUG
39 40
 //#define PRINT_FRAME_TIME
... ...
@@ -64,11 +65,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
64 64
         avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
65 65
         break;
66 66
     case CODEC_ID_MPEG4:
67
-        s->decode_mb= ff_mpeg4_decode_mb;
68
-        s->time_increment_bits = 4; /* default value for broken headers */
69
-        s->h263_pred = 1;
70
-        s->low_delay = 0; //default, might be overriden in the vol header during header parsing
71
-        avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
72 67
         break;
73 68
     case CODEC_ID_MSMPEG4V1:
74 69
         s->h263_msmpeg4 = 1;
... ...
@@ -731,21 +727,6 @@ av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
731 731
     return get_consumed_bytes(s, buf_size);
732 732
 }
733 733
 
734
-AVCodec mpeg4_decoder = {
735
-    "mpeg4",
736
-    CODEC_TYPE_VIDEO,
737
-    CODEC_ID_MPEG4,
738
-    sizeof(MpegEncContext),
739
-    ff_h263_decode_init,
740
-    NULL,
741
-    ff_h263_decode_end,
742
-    ff_h263_decode_frame,
743
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
744
-    .flush= ff_mpeg_flush,
745
-    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
746
-    .pix_fmts= ff_hwaccel_pixfmt_list_420,
747
-};
748
-
749 734
 AVCodec h263_decoder = {
750 735
     "h263",
751 736
     CODEC_TYPE_VIDEO,
... ...
@@ -816,19 +797,3 @@ AVCodec wmv1_decoder = {
816 816
     .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
817 817
     .pix_fmts= ff_pixfmt_list_420,
818 818
 };
819
-
820
-#if CONFIG_MPEG4_VDPAU_DECODER
821
-AVCodec mpeg4_vdpau_decoder = {
822
-    "mpeg4_vdpau",
823
-    CODEC_TYPE_VIDEO,
824
-    CODEC_ID_MPEG4,
825
-    sizeof(MpegEncContext),
826
-    ff_h263_decode_init,
827
-    NULL,
828
-    ff_h263_decode_end,
829
-    ff_h263_decode_frame,
830
-    CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
831
-    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 (VDPAU)"),
832
-    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_VDPAU_MPEG4, PIX_FMT_NONE},
833
-};
834
-#endif
... ...
@@ -31,43 +31,6 @@
31 31
 #include <stdint.h>
32 32
 #include "mpegvideo.h"
33 33
 
34
-// shapes
35
-#define RECT_SHAPE       0
36
-#define BIN_SHAPE        1
37
-#define BIN_ONLY_SHAPE   2
38
-#define GRAY_SHAPE       3
39
-
40
-#define SIMPLE_VO_TYPE             1
41
-#define CORE_VO_TYPE               3
42
-#define MAIN_VO_TYPE               4
43
-#define NBIT_VO_TYPE               5
44
-#define ARTS_VO_TYPE               10
45
-#define ACE_VO_TYPE                12
46
-#define ADV_SIMPLE_VO_TYPE         17
47
-
48
-// aspect_ratio_info
49
-#define EXTENDED_PAR 15
50
-
51
-//vol_sprite_usage / sprite_enable
52
-#define STATIC_SPRITE 1
53
-#define GMC_SPRITE 2
54
-
55
-#define MOTION_MARKER 0x1F001
56
-#define DC_MARKER     0x6B001
57
-
58
-static const int mb_type_b_map[4]= {
59
-    MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
60
-    MB_TYPE_L0L1 | MB_TYPE_16x16,
61
-    MB_TYPE_L1 | MB_TYPE_16x16,
62
-    MB_TYPE_L0 | MB_TYPE_16x16,
63
-};
64
-
65
-#define VOS_STARTCODE        0x1B0
66
-#define USER_DATA_STARTCODE  0x1B2
67
-#define GOP_STARTCODE        0x1B3
68
-#define VISUAL_OBJ_STARTCODE 0x1B5
69
-#define VOP_STARTCODE        0x1B6
70
-
71 34
 /* dc encoding for mpeg4 */
72 35
 const uint8_t DCtab_lum[13][2] =
73 36
 {
... ...
@@ -143,7 +106,7 @@ const int8_t intra_run[102] = {
143 143
  15, 16, 17, 18, 19, 20,
144 144
 };
145 145
 
146
-static RLTable rl_intra = {
146
+RLTable rl_intra = {
147 147
     102,
148 148
     67,
149 149
     intra_vlc,
... ...
@@ -152,7 +115,7 @@ static RLTable rl_intra = {
152 152
 };
153 153
 
154 154
 /* Note this is identical to the intra rvlc except that it is reordered. */
155
-static const uint16_t inter_rvlc[170][2]={
155
+const uint16_t inter_rvlc[170][2]={
156 156
 {0x0006,  3},{0x0001,  4},{0x0004,  5},{0x001C,  7},
157 157
 {0x003C,  8},{0x003D,  8},{0x007C,  9},{0x00FC, 10},
158 158
 {0x00FD, 10},{0x01FC, 11},{0x01FD, 11},{0x03FC, 12},
... ...
@@ -198,7 +161,7 @@ static const uint16_t inter_rvlc[170][2]={
198 198
 {0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
199 199
 };
200 200
 
201
-static const int8_t inter_rvlc_run[169]={
201
+const int8_t inter_rvlc_run[169]={
202 202
  0,  0,  0,  0,  0,  0,  0,  0,
203 203
  0,  0,  0,  0,  0,  0,  0,  0,
204 204
  0,  0,  0,  1,  1,  1,  1,  1,
... ...
@@ -223,7 +186,7 @@ static const int8_t inter_rvlc_run[169]={
223 223
 43, 44,
224 224
 };
225 225
 
226
-static const int8_t inter_rvlc_level[169]={
226
+const int8_t inter_rvlc_level[169]={
227 227
  1,  2,  3,  4,  5,  6,  7,  8,
228 228
  9, 10, 11, 12, 13, 14, 15, 16,
229 229
 17, 18, 19,  1,  2,  3,  4,  5,
... ...
@@ -248,7 +211,7 @@ static const int8_t inter_rvlc_level[169]={
248 248
  1,  1,
249 249
 };
250 250
 
251
-static RLTable rvlc_rl_inter = {
251
+RLTable rvlc_rl_inter = {
252 252
     169,
253 253
     103,
254 254
     inter_rvlc,
... ...
@@ -256,7 +219,7 @@ static RLTable rvlc_rl_inter = {
256 256
     inter_rvlc_level,
257 257
 };
258 258
 
259
-static const uint16_t intra_rvlc[170][2]={
259
+const uint16_t intra_rvlc[170][2]={
260 260
 {0x0006,  3},{0x0007,  3},{0x000A,  4},{0x0009,  5},
261 261
 {0x0014,  6},{0x0015,  6},{0x0034,  7},{0x0074,  8},
262 262
 {0x0075,  8},{0x00DD,  9},{0x00EC,  9},{0x01EC, 10},
... ...
@@ -302,7 +265,7 @@ static const uint16_t intra_rvlc[170][2]={
302 302
 {0x3F7C, 15},{0x3F7D, 15},{0x0000,  4}
303 303
 };
304 304
 
305
-static const int8_t intra_rvlc_run[169]={
305
+const int8_t intra_rvlc_run[169]={
306 306
  0,  0,  0,  0,  0,  0,  0,  0,
307 307
  0,  0,  0,  0,  0,  0,  0,  0,
308 308
  0,  0,  0,  0,  0,  0,  0,  0,
... ...
@@ -327,7 +290,7 @@ static const int8_t intra_rvlc_run[169]={
327 327
 43, 44,
328 328
 };
329 329
 
330
-static const int8_t intra_rvlc_level[169]={
330
+const int8_t intra_rvlc_level[169]={
331 331
  1,  2,  3,  4,  5,  6,  7,  8,
332 332
  9, 10, 11, 12, 13, 14, 15, 16,
333 333
 17, 18, 19, 20, 21, 22, 23, 24,
... ...
@@ -352,7 +315,7 @@ static const int8_t intra_rvlc_level[169]={
352 352
  1,  1,
353 353
 };
354 354
 
355
-static RLTable rvlc_rl_intra = {
355
+RLTable rvlc_rl_intra = {
356 356
     169,
357 357
     103,
358 358
     intra_rvlc,
... ...
@@ -360,35 +323,16 @@ static RLTable rvlc_rl_intra = {
360 360
     intra_rvlc_level,
361 361
 };
362 362
 
363
-static const uint16_t sprite_trajectory_tab[15][2] = {
363
+const uint16_t sprite_trajectory_tab[15][2] = {
364 364
  {0x00, 2}, {0x02, 3},  {0x03, 3},  {0x04, 3}, {0x05, 3}, {0x06, 3},
365 365
  {0x0E, 4}, {0x1E, 5},  {0x3E, 6},  {0x7E, 7}, {0xFE, 8},
366 366
  {0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12},
367 367
 };
368 368
 
369
-static const uint8_t mb_type_b_tab[4][2] = {
369
+const uint8_t mb_type_b_tab[4][2] = {
370 370
  {1, 1}, {1, 2}, {1, 3}, {1, 4},
371 371
 };
372 372
 
373
-static const AVRational pixel_aspect[16]={
374
- {0, 1},
375
- {1, 1},
376
- {12, 11},
377
- {10, 11},
378
- {16, 11},
379
- {40, 33},
380
- {0, 1},
381
- {0, 1},
382
- {0, 1},
383
- {0, 1},
384
- {0, 1},
385
- {0, 1},
386
- {0, 1},
387
- {0, 1},
388
- {0, 1},
389
- {0, 1},
390
-};
391
-
392 373
 /* these matrixes will be permuted for the idct */
393 374
 const int16_t ff_mpeg4_default_intra_matrix[64] = {
394 375
   8, 17, 18, 19, 21, 23, 25, 27,
... ...
@@ -425,7 +369,7 @@ const uint16_t ff_mpeg4_resync_prefix[8]={
425 425
     0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
426 426
 };
427 427
 
428
-static const uint8_t mpeg4_dc_threshold[8]={
428
+const uint8_t mpeg4_dc_threshold[8]={
429 429
     99, 13, 15, 17, 19, 21, 23, 0
430 430
 };
431 431
 
432 432
new file mode 100644
... ...
@@ -0,0 +1,72 @@
0
+/*
1
+ * MPEG4 decoder / encoder common code.
2
+ * Copyright (c) 2000,2001 Fabrice Bellard
3
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
4
+ *
5
+ * This file is part of FFmpeg.
6
+ *
7
+ * FFmpeg is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * FFmpeg is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with FFmpeg; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+#include "mpegvideo.h"
23
+#include "mpeg4video.h"
24
+#include "mpeg4data.h"
25
+
26
+uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3];
27
+
28
+int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
29
+    switch(s->pict_type){
30
+        case FF_I_TYPE:
31
+            return 16;
32
+        case FF_P_TYPE:
33
+        case FF_S_TYPE:
34
+            return s->f_code+15;
35
+        case FF_B_TYPE:
36
+            return FFMAX3(s->f_code, s->b_code, 2) + 15;
37
+        default:
38
+            return -1;
39
+    }
40
+}
41
+
42
+void ff_mpeg4_clean_buffers(MpegEncContext *s)
43
+{
44
+    int c_wrap, c_xy, l_wrap, l_xy;
45
+
46
+    l_wrap= s->b8_stride;
47
+    l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
48
+    c_wrap= s->mb_stride;
49
+    c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
50
+
51
+#if 0
52
+    /* clean DC */
53
+    memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
54
+    memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
55
+    memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
56
+#endif
57
+
58
+    /* clean AC */
59
+    memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
60
+    memset(s->ac_val[1] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
61
+    memset(s->ac_val[2] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
62
+
63
+    /* clean MV */
64
+    // we can't clear the MVs as they might be needed by a b frame
65
+//    memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
66
+//    memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
67
+    s->last_mv[0][0][0]=
68
+    s->last_mv[0][0][1]=
69
+    s->last_mv[1][0][0]=
70
+    s->last_mv[1][0][1]= 0;
71
+}
0 72
new file mode 100644
... ...
@@ -0,0 +1,197 @@
0
+/*
1
+ * MPEG4 encoder/decoder internal header.
2
+ * Copyright (c) 2000,2001 Fabrice Bellard
3
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
4
+ *
5
+ * This file is part of FFmpeg.
6
+ *
7
+ * FFmpeg is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * FFmpeg is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with FFmpeg; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+#ifndef AVCODEC_MPEG4VIDEO_H
23
+#define AVCODEC_MPEG4VIDEO_H
24
+
25
+// shapes
26
+#define RECT_SHAPE       0
27
+#define BIN_SHAPE        1
28
+#define BIN_ONLY_SHAPE   2
29
+#define GRAY_SHAPE       3
30
+
31
+#define SIMPLE_VO_TYPE             1
32
+#define CORE_VO_TYPE               3
33
+#define MAIN_VO_TYPE               4
34
+#define NBIT_VO_TYPE               5
35
+#define ARTS_VO_TYPE               10
36
+#define ACE_VO_TYPE                12
37
+#define ADV_SIMPLE_VO_TYPE         17
38
+
39
+// aspect_ratio_info
40
+#define EXTENDED_PAR 15
41
+
42
+//vol_sprite_usage / sprite_enable
43
+#define STATIC_SPRITE 1
44
+#define GMC_SPRITE 2
45
+
46
+#define MOTION_MARKER 0x1F001
47
+#define DC_MARKER     0x6B001
48
+
49
+#define VOS_STARTCODE        0x1B0
50
+#define USER_DATA_STARTCODE  0x1B2
51
+#define GOP_STARTCODE        0x1B3
52
+#define VISUAL_OBJ_STARTCODE 0x1B5
53
+#define VOP_STARTCODE        0x1B6
54
+
55
+/* dc encoding for mpeg4 */
56
+extern const uint8_t DCtab_lum[13][2];
57
+extern const uint8_t DCtab_chrom[13][2];
58
+
59
+extern const uint16_t intra_vlc[103][2];
60
+extern const int8_t intra_level[102];
61
+extern const int8_t intra_run[102];
62
+extern RLTable rl_intra;
63
+
64
+/* Note this is identical to the intra rvlc except that it is reordered. */
65
+extern const uint16_t inter_rvlc[170][2];
66
+extern const int8_t inter_rvlc_run[169];
67
+extern const int8_t inter_rvlc_level[169];
68
+extern RLTable rvlc_rl_inter;
69
+
70
+extern const uint16_t intra_rvlc[170][2];
71
+extern const int8_t intra_rvlc_run[169];
72
+extern const int8_t intra_rvlc_level[169];
73
+extern RLTable rvlc_rl_intra;
74
+
75
+extern const uint16_t sprite_trajectory_tab[15][2];
76
+extern const uint8_t mb_type_b_tab[4][2];
77
+extern const AVRational pixel_aspect[16];
78
+
79
+/* these matrixes will be permuted for the idct */
80
+extern const int16_t ff_mpeg4_default_intra_matrix[64];
81
+extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
82
+
83
+extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
84
+extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
85
+extern const uint16_t ff_mpeg4_resync_prefix[8];
86
+
87
+extern const uint8_t mpeg4_dc_threshold[8];
88
+
89
+void mpeg4_encode_mb(MpegEncContext *s,
90
+                    DCTELEM block[6][64],
91
+                    int motion_x, int motion_y);
92
+void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
93
+                   int dir);
94
+void ff_set_mpeg4_time(MpegEncContext * s);
95
+void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
96
+
97
+int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
98
+void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
99
+void ff_mpeg4_clean_buffers(MpegEncContext *s);
100
+void ff_mpeg4_stuffing(PutBitContext * pbc);
101
+void ff_mpeg4_init_partitions(MpegEncContext *s);
102
+void ff_mpeg4_merge_partitions(MpegEncContext *s);
103
+void ff_clean_mpeg4_qscales(MpegEncContext *s);
104
+int ff_mpeg4_decode_partitions(MpegEncContext *s);
105
+int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
106
+int mpeg4_decode_video_packet_header(MpegEncContext *s);
107
+
108
+extern uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3];
109
+
110
+
111
+#if 0 //3IV1 is quite rare and it slows things down a tiny bit
112
+#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
113
+#else
114
+#define IS_3IV1 0
115
+#endif
116
+
117
+
118
+/**
119
+ * predicts the dc.
120
+ * encoding quantized level -> quantized diff
121
+ * decoding quantized diff -> quantized level
122
+ * @param n block index (0-3 are luma, 4-5 are chroma)
123
+ * @param dir_ptr pointer to an integer where the prediction direction will be stored
124
+ */
125
+static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
126
+{
127
+    int a, b, c, wrap, pred, scale, ret;
128
+    int16_t *dc_val;
129
+
130
+    /* find prediction */
131
+    if (n < 4) {
132
+        scale = s->y_dc_scale;
133
+    } else {
134
+        scale = s->c_dc_scale;
135
+    }
136
+    if(IS_3IV1)
137
+        scale= 8;
138
+
139
+    wrap= s->block_wrap[n];
140
+    dc_val = s->dc_val[0] + s->block_index[n];
141
+
142
+    /* B C
143
+     * A X
144
+     */
145
+    a = dc_val[ - 1];
146
+    b = dc_val[ - 1 - wrap];
147
+    c = dc_val[ - wrap];
148
+
149
+    /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
150
+    if(s->first_slice_line && n!=3){
151
+        if(n!=2) b=c= 1024;
152
+        if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
153
+    }
154
+    if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
155
+        if(n==0 || n==4 || n==5)
156
+            b=1024;
157
+    }
158
+
159
+    if (abs(a - b) < abs(b - c)) {
160
+        pred = c;
161
+        *dir_ptr = 1; /* top */
162
+    } else {
163
+        pred = a;
164
+        *dir_ptr = 0; /* left */
165
+    }
166
+    /* we assume pred is positive */
167
+    pred = FASTDIV((pred + (scale >> 1)), scale);
168
+
169
+    if(encoding){
170
+        ret = level - pred;
171
+    }else{
172
+        level += pred;
173
+        ret= level;
174
+        if(s->error_recognition>=3){
175
+            if(level<0){
176
+                av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
177
+                return -1;
178
+            }
179
+            if(level*scale > 2048 + scale){
180
+                av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
181
+                return -1;
182
+            }
183
+        }
184
+    }
185
+    level *=scale;
186
+    if(level&(~2047)){
187
+        if(level<0)
188
+            level=0;
189
+        else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
190
+            level=2047;
191
+    }
192
+    dc_val[0]= level;
193
+
194
+    return ret;
195
+}
196
+#endif
0 197
new file mode 100644
... ...
@@ -0,0 +1,2262 @@
0
+/*
1
+ * MPEG4 decoder.
2
+ * Copyright (c) 2000,2001 Fabrice Bellard
3
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
4
+ *
5
+ * This file is part of FFmpeg.
6
+ *
7
+ * FFmpeg is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * FFmpeg is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with FFmpeg; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+#include "mpegvideo.h"
23
+#include "mpeg4video.h"
24
+#include "h263.h"
25
+
26
+// The defines below define the number of bits that are read at once for
27
+// reading vlc values. Changing these may improve speed and data cache needs
28
+// be aware though that decreasing them may need the number of stages that is
29
+// passed to get_vlc* to be increased.
30
+#define SPRITE_TRAJ_VLC_BITS 6
31
+#define DC_VLC_BITS 9
32
+#define MB_TYPE_B_VLC_BITS 4
33
+
34
+
35
+static VLC dc_lum, dc_chrom;
36
+static VLC sprite_trajectory;
37
+static VLC mb_type_b_vlc;
38
+
39
+static const int mb_type_b_map[4]= {
40
+    MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
41
+    MB_TYPE_L0L1 | MB_TYPE_16x16,
42
+    MB_TYPE_L1 | MB_TYPE_16x16,
43
+    MB_TYPE_L0 | MB_TYPE_16x16,
44
+};
45
+
46
+/**
47
+ * predicts the ac.
48
+ * @param n block index (0-3 are luma, 4-5 are chroma)
49
+ * @param dir the ac prediction direction
50
+ */
51
+void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
52
+                   int dir)
53
+{
54
+    int i;
55
+    int16_t *ac_val, *ac_val1;
56
+    int8_t * const qscale_table= s->current_picture.qscale_table;
57
+
58
+    /* find prediction */
59
+    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
60
+    ac_val1 = ac_val;
61
+    if (s->ac_pred) {
62
+        if (dir == 0) {
63
+            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
64
+            /* left prediction */
65
+            ac_val -= 16;
66
+
67
+            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
68
+                /* same qscale */
69
+                for(i=1;i<8;i++) {
70
+                    block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
71
+                }
72
+            }else{
73
+                /* different qscale, we must rescale */
74
+                for(i=1;i<8;i++) {
75
+                    block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
76
+                }
77
+            }
78
+        } else {
79
+            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
80
+            /* top prediction */
81
+            ac_val -= 16 * s->block_wrap[n];
82
+
83
+            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
84
+                /* same qscale */
85
+                for(i=1;i<8;i++) {
86
+                    block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
87
+                }
88
+            }else{
89
+                /* different qscale, we must rescale */
90
+                for(i=1;i<8;i++) {
91
+                    block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
92
+                }
93
+            }
94
+        }
95
+    }
96
+    /* left copy */
97
+    for(i=1;i<8;i++)
98
+        ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];
99
+
100
+    /* top copy */
101
+    for(i=1;i<8;i++)
102
+        ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];
103
+
104
+}
105
+
106
+/**
107
+ * check if the next stuff is a resync marker or the end.
108
+ * @return 0 if not
109
+ */
110
+static inline int mpeg4_is_resync(MpegEncContext *s){
111
+    int bits_count= get_bits_count(&s->gb);
112
+    int v= show_bits(&s->gb, 16);
113
+
114
+    if(s->workaround_bugs&FF_BUG_NO_PADDING){
115
+        return 0;
116
+    }
117
+
118
+    while(v<=0xFF){
119
+        if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
120
+            break;
121
+        skip_bits(&s->gb, 8+s->pict_type);
122
+        bits_count+= 8+s->pict_type;
123
+        v= show_bits(&s->gb, 16);
124
+    }
125
+
126
+    if(bits_count + 8 >= s->gb.size_in_bits){
127
+        v>>=8;
128
+        v|= 0x7F >> (7-(bits_count&7));
129
+
130
+        if(v==0x7F)
131
+            return 1;
132
+    }else{
133
+        if(v == ff_mpeg4_resync_prefix[bits_count&7]){
134
+            int len;
135
+            GetBitContext gb= s->gb;
136
+
137
+            skip_bits(&s->gb, 1);
138
+            align_get_bits(&s->gb);
139
+
140
+            for(len=0; len<32; len++){
141
+                if(get_bits1(&s->gb)) break;
142
+            }
143
+
144
+            s->gb= gb;
145
+
146
+            if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
147
+                return 1;
148
+        }
149
+    }
150
+    return 0;
151
+}
152
+
153
+static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
154
+{
155
+    int i;
156
+    int a= 2<<s->sprite_warping_accuracy;
157
+    int rho= 3-s->sprite_warping_accuracy;
158
+    int r=16/a;
159
+    const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
160
+    int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
161
+    int sprite_ref[4][2];
162
+    int virtual_ref[2][2];
163
+    int w2, h2, w3, h3;
164
+    int alpha=0, beta=0;
165
+    int w= s->width;
166
+    int h= s->height;
167
+    int min_ab;
168
+
169
+    for(i=0; i<s->num_sprite_warping_points; i++){
170
+        int length;
171
+        int x=0, y=0;
172
+
173
+        length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
174
+        if(length){
175
+            x= get_xbits(gb, length);
176
+        }
177
+        if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
178
+
179
+        length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
180
+        if(length){
181
+            y=get_xbits(gb, length);
182
+        }
183
+        skip_bits1(gb); /* marker bit */
184
+        s->sprite_traj[i][0]= d[i][0]= x;
185
+        s->sprite_traj[i][1]= d[i][1]= y;
186
+    }
187
+    for(; i<4; i++)
188
+        s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
189
+
190
+    while((1<<alpha)<w) alpha++;
191
+    while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
192
+    w2= 1<<alpha;
193
+    h2= 1<<beta;
194
+
195
+// Note, the 4th point isn't used for GMC
196
+    if(s->divx_version==500 && s->divx_build==413){
197
+        sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
198
+        sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
199
+        sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
200
+        sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
201
+        sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
202
+        sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
203
+    } else {
204
+        sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
205
+        sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
206
+        sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
207
+        sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
208
+        sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
209
+        sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
210
+    }
211
+/*    sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
212
+    sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
213
+
214
+// this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
215
+// perhaps it should be reordered to be more readable ...
216
+// the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
217
+// so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
218
+    virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
219
+        + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
220
+    virtual_ref[0][1]= 16*vop_ref[0][1]
221
+        + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
222
+    virtual_ref[1][0]= 16*vop_ref[0][0]
223
+        + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
224
+    virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
225
+        + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
226
+
227
+    switch(s->num_sprite_warping_points)
228
+    {
229
+        case 0:
230
+            s->sprite_offset[0][0]= 0;
231
+            s->sprite_offset[0][1]= 0;
232
+            s->sprite_offset[1][0]= 0;
233
+            s->sprite_offset[1][1]= 0;
234
+            s->sprite_delta[0][0]= a;
235
+            s->sprite_delta[0][1]= 0;
236
+            s->sprite_delta[1][0]= 0;
237
+            s->sprite_delta[1][1]= a;
238
+            s->sprite_shift[0]= 0;
239
+            s->sprite_shift[1]= 0;
240
+            break;
241
+        case 1: //GMC only
242
+            s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
243
+            s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
244
+            s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
245
+            s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
246
+            s->sprite_delta[0][0]= a;
247
+            s->sprite_delta[0][1]= 0;
248
+            s->sprite_delta[1][0]= 0;
249
+            s->sprite_delta[1][1]= a;
250
+            s->sprite_shift[0]= 0;
251
+            s->sprite_shift[1]= 0;
252
+            break;
253
+        case 2:
254
+            s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
255
+                                                  + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
256
+                                                  + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
257
+                                                  + (1<<(alpha+rho-1));
258
+            s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
259
+                                                  + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
260
+                                                  + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
261
+                                                  + (1<<(alpha+rho-1));
262
+            s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
263
+                                     +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
264
+                                     +2*w2*r*sprite_ref[0][0]
265
+                                     - 16*w2
266
+                                     + (1<<(alpha+rho+1)));
267
+            s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
268
+                                     +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
269
+                                     +2*w2*r*sprite_ref[0][1]
270
+                                     - 16*w2
271
+                                     + (1<<(alpha+rho+1)));
272
+            s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
273
+            s->sprite_delta[0][1]=   (+r*sprite_ref[0][1] - virtual_ref[0][1]);
274
+            s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1]);
275
+            s->sprite_delta[1][1]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
276
+
277
+            s->sprite_shift[0]= alpha+rho;
278
+            s->sprite_shift[1]= alpha+rho+2;
279
+            break;
280
+        case 3:
281
+            min_ab= FFMIN(alpha, beta);
282
+            w3= w2>>min_ab;
283
+            h3= h2>>min_ab;
284
+            s->sprite_offset[0][0]=  (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
285
+                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
286
+                                   + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
287
+                                   + (1<<(alpha+beta+rho-min_ab-1));
288
+            s->sprite_offset[0][1]=  (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
289
+                                   + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
290
+                                   + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
291
+                                   + (1<<(alpha+beta+rho-min_ab-1));
292
+            s->sprite_offset[1][0]=  (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
293
+                                   + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
294
+                                   + 2*w2*h3*r*sprite_ref[0][0]
295
+                                   - 16*w2*h3
296
+                                   + (1<<(alpha+beta+rho-min_ab+1));
297
+            s->sprite_offset[1][1]=  (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
298
+                                   + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
299
+                                   + 2*w2*h3*r*sprite_ref[0][1]
300
+                                   - 16*w2*h3
301
+                                   + (1<<(alpha+beta+rho-min_ab+1));
302
+            s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
303
+            s->sprite_delta[0][1]=   (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
304
+            s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
305
+            s->sprite_delta[1][1]=   (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
306
+
307
+            s->sprite_shift[0]= alpha + beta + rho - min_ab;
308
+            s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
309
+            break;
310
+    }
311
+    /* try to simplify the situation */
312
+    if(   s->sprite_delta[0][0] == a<<s->sprite_shift[0]
313
+       && s->sprite_delta[0][1] == 0
314
+       && s->sprite_delta[1][0] == 0
315
+       && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
316
+    {
317
+        s->sprite_offset[0][0]>>=s->sprite_shift[0];
318
+        s->sprite_offset[0][1]>>=s->sprite_shift[0];
319
+        s->sprite_offset[1][0]>>=s->sprite_shift[1];
320
+        s->sprite_offset[1][1]>>=s->sprite_shift[1];
321
+        s->sprite_delta[0][0]= a;
322
+        s->sprite_delta[0][1]= 0;
323
+        s->sprite_delta[1][0]= 0;
324
+        s->sprite_delta[1][1]= a;
325
+        s->sprite_shift[0]= 0;
326
+        s->sprite_shift[1]= 0;
327
+        s->real_sprite_warping_points=1;
328
+    }
329
+    else{
330
+        int shift_y= 16 - s->sprite_shift[0];
331
+        int shift_c= 16 - s->sprite_shift[1];
332
+        for(i=0; i<2; i++){
333
+            s->sprite_offset[0][i]<<= shift_y;
334
+            s->sprite_offset[1][i]<<= shift_c;
335
+            s->sprite_delta[0][i]<<= shift_y;
336
+            s->sprite_delta[1][i]<<= shift_y;
337
+            s->sprite_shift[i]= 16;
338
+        }
339
+        s->real_sprite_warping_points= s->num_sprite_warping_points;
340
+    }
341
+}
342
+
343
+/**
344
+ * decodes the next video packet.
345
+ * @return <0 if something went wrong
346
+ */
347
+int mpeg4_decode_video_packet_header(MpegEncContext *s)
348
+{
349
+    int mb_num_bits= av_log2(s->mb_num - 1) + 1;
350
+    int header_extension=0, mb_num, len;
351
+
352
+    /* is there enough space left for a video packet + header */
353
+    if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
354
+
355
+    for(len=0; len<32; len++){
356
+        if(get_bits1(&s->gb)) break;
357
+    }
358
+
359
+    if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
360
+        av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
361
+        return -1;
362
+    }
363
+
364
+    if(s->shape != RECT_SHAPE){
365
+        header_extension= get_bits1(&s->gb);
366
+        //FIXME more stuff here
367
+    }
368
+
369
+    mb_num= get_bits(&s->gb, mb_num_bits);
370
+    if(mb_num>=s->mb_num){
371
+        av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
372
+        return -1;
373
+    }
374
+    if(s->pict_type == FF_B_TYPE){
375
+        while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
376
+        if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
377
+    }
378
+
379
+    s->mb_x= mb_num % s->mb_width;
380
+    s->mb_y= mb_num / s->mb_width;
381
+
382
+    if(s->shape != BIN_ONLY_SHAPE){
383
+        int qscale= get_bits(&s->gb, s->quant_precision);
384
+        if(qscale)
385
+            s->chroma_qscale=s->qscale= qscale;
386
+    }
387
+
388
+    if(s->shape == RECT_SHAPE){
389
+        header_extension= get_bits1(&s->gb);
390
+    }
391
+    if(header_extension){
392
+        int time_increment;
393
+        int time_incr=0;
394
+
395
+        while (get_bits1(&s->gb) != 0)
396
+            time_incr++;
397
+
398
+        check_marker(&s->gb, "before time_increment in video packed header");
399
+        time_increment= get_bits(&s->gb, s->time_increment_bits);
400
+        check_marker(&s->gb, "before vop_coding_type in video packed header");
401
+
402
+        skip_bits(&s->gb, 2); /* vop coding type */
403
+        //FIXME not rect stuff here
404
+
405
+        if(s->shape != BIN_ONLY_SHAPE){
406
+            skip_bits(&s->gb, 3); /* intra dc vlc threshold */
407
+//FIXME don't just ignore everything
408
+            if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
409
+                mpeg4_decode_sprite_trajectory(s, &s->gb);
410
+                av_log(s->avctx, AV_LOG_ERROR, "untested\n");
411
+            }
412
+
413
+            //FIXME reduced res stuff here
414
+
415
+            if (s->pict_type != FF_I_TYPE) {
416
+                int f_code = get_bits(&s->gb, 3);       /* fcode_for */
417
+                if(f_code==0){
418
+                    av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
419
+                }
420
+            }
421
+            if (s->pict_type == FF_B_TYPE) {
422
+                int b_code = get_bits(&s->gb, 3);
423
+                if(b_code==0){
424
+                    av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
425
+                }
426
+            }
427
+        }
428
+    }
429
+    //FIXME new-pred stuff
430
+
431
+    return 0;
432
+}
433
+
434
+/**
435
+ * gets the average motion vector for a GMC MB.
436
+ * @param n either 0 for the x component or 1 for y
437
+ * @returns the average MV for a GMC MB
438
+ */
439
+static inline int get_amv(MpegEncContext *s, int n){
440
+    int x, y, mb_v, sum, dx, dy, shift;
441
+    int len = 1 << (s->f_code + 4);
442
+    const int a= s->sprite_warping_accuracy;
443
+
444
+    if(s->workaround_bugs & FF_BUG_AMV)
445
+        len >>= s->quarter_sample;
446
+
447
+    if(s->real_sprite_warping_points==1){
448
+        if(s->divx_version==500 && s->divx_build==413)
449
+            sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
450
+        else
451
+            sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
452
+    }else{
453
+        dx= s->sprite_delta[n][0];
454
+        dy= s->sprite_delta[n][1];
455
+        shift= s->sprite_shift[0];
456
+        if(n) dy -= 1<<(shift + a + 1);
457
+        else  dx -= 1<<(shift + a + 1);
458
+        mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
459
+
460
+        sum=0;
461
+        for(y=0; y<16; y++){
462
+            int v;
463
+
464
+            v= mb_v + dy*y;
465
+            //XXX FIXME optimize
466
+            for(x=0; x<16; x++){
467
+                sum+= v>>shift;
468
+                v+= dx;
469
+            }
470
+        }
471
+        sum= RSHIFT(sum, a+8-s->quarter_sample);
472
+    }
473
+
474
+    if      (sum < -len) sum= -len;
475
+    else if (sum >= len) sum= len-1;
476
+
477
+    return sum;
478
+}
479
+
480
+/**
481
+ * decodes the dc value.
482
+ * @param n block index (0-3 are luma, 4-5 are chroma)
483
+ * @param dir_ptr the prediction direction will be stored here
484
+ * @return the quantized dc
485
+ */
486
+static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
487
+{
488
+    int level, code;
489
+
490
+    if (n < 4)
491
+        code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
492
+    else
493
+        code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
494
+    if (code < 0 || code > 9 /* && s->nbit<9 */){
495
+        av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
496
+        return -1;
497
+    }
498
+    if (code == 0) {
499
+        level = 0;
500
+    } else {
501
+        if(IS_3IV1){
502
+            if(code==1)
503
+                level= 2*get_bits1(&s->gb)-1;
504
+            else{
505
+                if(get_bits1(&s->gb))
506
+                    level = get_bits(&s->gb, code-1) + (1<<(code-1));
507
+                else
508
+                    level = -get_bits(&s->gb, code-1) - (1<<(code-1));
509
+            }
510
+        }else{
511
+            level = get_xbits(&s->gb, code);
512
+        }
513
+
514
+        if (code > 8){
515
+            if(get_bits1(&s->gb)==0){ /* marker */
516
+                if(s->error_recognition>=2){
517
+                    av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
518
+                    return -1;
519
+                }
520
+            }
521
+        }
522
+    }
523
+
524
+    return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
525
+}
526
+
527
+/**
528
+ * decodes first partition.
529
+ * @return number of MBs decoded or <0 if an error occurred
530
+ */
531
+static int mpeg4_decode_partition_a(MpegEncContext *s){
532
+    int mb_num;
533
+    static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
534
+
535
+    /* decode first partition */
536
+    mb_num=0;
537
+    s->first_slice_line=1;
538
+    for(; s->mb_y<s->mb_height; s->mb_y++){
539
+        ff_init_block_index(s);
540
+        for(; s->mb_x<s->mb_width; s->mb_x++){
541
+            const int xy= s->mb_x + s->mb_y*s->mb_stride;
542
+            int cbpc;
543
+            int dir=0;
544
+
545
+            mb_num++;
546
+            ff_update_block_index(s);
547
+            if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
548
+                s->first_slice_line=0;
549
+
550
+            if(s->pict_type==FF_I_TYPE){
551
+                int i;
552
+
553
+                do{
554
+                    if(show_bits_long(&s->gb, 19)==DC_MARKER){
555
+                        return mb_num-1;
556
+                    }
557
+
558
+                    cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
559
+                    if (cbpc < 0){
560
+                        av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
561
+                        return -1;
562
+                    }
563
+                }while(cbpc == 8);
564
+
565
+                s->cbp_table[xy]= cbpc & 3;
566
+                s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
567
+                s->mb_intra = 1;
568
+
569
+                if(cbpc & 4) {
570
+                    ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
571
+                }
572
+                s->current_picture.qscale_table[xy]= s->qscale;
573
+
574
+                s->mbintra_table[xy]= 1;
575
+                for(i=0; i<6; i++){
576
+                    int dc_pred_dir;
577
+                    int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
578
+                    if(dc < 0){
579
+                        av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
580
+                        return -1;
581
+                    }
582
+                    dir<<=1;
583
+                    if(dc_pred_dir) dir|=1;
584
+                }
585
+                s->pred_dir_table[xy]= dir;
586
+            }else{ /* P/S_TYPE */
587
+                int mx, my, pred_x, pred_y, bits;
588
+                int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
589
+                const int stride= s->b8_stride*2;
590
+
591
+try_again:
592
+                bits= show_bits(&s->gb, 17);
593
+                if(bits==MOTION_MARKER){
594
+                    return mb_num-1;
595
+                }
596
+                skip_bits1(&s->gb);
597
+                if(bits&0x10000){
598
+                    /* skip mb */
599
+                    if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
600
+                        s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
601
+                        mx= get_amv(s, 0);
602
+                        my= get_amv(s, 1);
603
+                    }else{
604
+                        s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
605
+                        mx=my=0;
606
+                    }
607
+                    mot_val[0       ]= mot_val[2       ]=
608
+                    mot_val[0+stride]= mot_val[2+stride]= mx;
609
+                    mot_val[1       ]= mot_val[3       ]=
610
+                    mot_val[1+stride]= mot_val[3+stride]= my;
611
+
612
+                    if(s->mbintra_table[xy])
613
+                        ff_clean_intra_table_entries(s);
614
+                    continue;
615
+                }
616
+
617
+                cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
618
+                if (cbpc < 0){
619
+                    av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
620
+                    return -1;
621
+                }
622
+                if(cbpc == 20)
623
+                    goto try_again;
624
+
625
+                s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
626
+
627
+                s->mb_intra = ((cbpc & 4) != 0);
628
+
629
+                if(s->mb_intra){
630
+                    s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
631
+                    s->mbintra_table[xy]= 1;
632
+                    mot_val[0       ]= mot_val[2       ]=
633
+                    mot_val[0+stride]= mot_val[2+stride]= 0;
634
+                    mot_val[1       ]= mot_val[3       ]=
635
+                    mot_val[1+stride]= mot_val[3+stride]= 0;
636
+                }else{
637
+                    if(s->mbintra_table[xy])
638
+                        ff_clean_intra_table_entries(s);
639
+
640
+                    if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
641
+                        s->mcsel= get_bits1(&s->gb);
642
+                    else s->mcsel= 0;
643
+
644
+                    if ((cbpc & 16) == 0) {
645
+                        /* 16x16 motion prediction */
646
+
647
+                        h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
648
+                        if(!s->mcsel){
649
+                            mx = h263_decode_motion(s, pred_x, s->f_code);
650
+                            if (mx >= 0xffff)
651
+                                return -1;
652
+
653
+                            my = h263_decode_motion(s, pred_y, s->f_code);
654
+                            if (my >= 0xffff)
655
+                                return -1;
656
+                            s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
657
+                        } else {
658
+                            mx = get_amv(s, 0);
659
+                            my = get_amv(s, 1);
660
+                            s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
661
+                        }
662
+
663
+                        mot_val[0       ]= mot_val[2       ] =
664
+                        mot_val[0+stride]= mot_val[2+stride]= mx;
665
+                        mot_val[1       ]= mot_val[3       ]=
666
+                        mot_val[1+stride]= mot_val[3+stride]= my;
667
+                    } else {
668
+                        int i;
669
+                        s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
670
+                        for(i=0;i<4;i++) {
671
+                            int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
672
+                            mx = h263_decode_motion(s, pred_x, s->f_code);
673
+                            if (mx >= 0xffff)
674
+                                return -1;
675
+
676
+                            my = h263_decode_motion(s, pred_y, s->f_code);
677
+                            if (my >= 0xffff)
678
+                                return -1;
679
+                            mot_val[0] = mx;
680
+                            mot_val[1] = my;
681
+                        }
682
+                    }
683
+                }
684
+            }
685
+        }
686
+        s->mb_x= 0;
687
+    }
688
+
689
+    return mb_num;
690
+}
691
+
692
+/**
693
+ * decode second partition.
694
+ * @return <0 if an error occurred
695
+ */
696
+static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
697
+    int mb_num=0;
698
+    static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
699
+
700
+    s->mb_x= s->resync_mb_x;
701
+    s->first_slice_line=1;
702
+    for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
703
+        ff_init_block_index(s);
704
+        for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
705
+            const int xy= s->mb_x + s->mb_y*s->mb_stride;
706
+
707
+            mb_num++;
708
+            ff_update_block_index(s);
709
+            if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
710
+                s->first_slice_line=0;
711
+
712
+            if(s->pict_type==FF_I_TYPE){
713
+                int ac_pred= get_bits1(&s->gb);
714
+                int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
715
+                if(cbpy<0){
716
+                    av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
717
+                    return -1;
718
+                }
719
+
720
+                s->cbp_table[xy]|= cbpy<<2;
721
+                s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
722
+            }else{ /* P || S_TYPE */
723
+                if(IS_INTRA(s->current_picture.mb_type[xy])){
724
+                    int dir=0,i;
725
+                    int ac_pred = get_bits1(&s->gb);
726
+                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
727
+
728
+                    if(cbpy<0){
729
+                        av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
730
+                        return -1;
731
+                    }
732
+
733
+                    if(s->cbp_table[xy] & 8) {
734
+                        ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
735
+                    }
736
+                    s->current_picture.qscale_table[xy]= s->qscale;
737
+
738
+                    for(i=0; i<6; i++){
739
+                        int dc_pred_dir;
740
+                        int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
741
+                        if(dc < 0){
742
+                            av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
743
+                            return -1;
744
+                        }
745
+                        dir<<=1;
746
+                        if(dc_pred_dir) dir|=1;
747
+                    }
748
+                    s->cbp_table[xy]&= 3; //remove dquant
749
+                    s->cbp_table[xy]|= cbpy<<2;
750
+                    s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
751
+                    s->pred_dir_table[xy]= dir;
752
+                }else if(IS_SKIP(s->current_picture.mb_type[xy])){
753
+                    s->current_picture.qscale_table[xy]= s->qscale;
754
+                    s->cbp_table[xy]= 0;
755
+                }else{
756
+                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
757
+
758
+                    if(cbpy<0){
759
+                        av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
760
+                        return -1;
761
+                    }
762
+
763
+                    if(s->cbp_table[xy] & 8) {
764
+                        ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
765
+                    }
766
+                    s->current_picture.qscale_table[xy]= s->qscale;
767
+
768
+                    s->cbp_table[xy]&= 3; //remove dquant
769
+                    s->cbp_table[xy]|= (cbpy^0xf)<<2;
770
+                }
771
+            }
772
+        }
773
+        if(mb_num >= mb_count) return 0;
774
+        s->mb_x= 0;
775
+    }
776
+    return 0;
777
+}
778
+
779
+/**
780
+ * decodes the first & second partition
781
+ * @return <0 if error (and sets error type in the error_status_table)
782
+ */
783
+int ff_mpeg4_decode_partitions(MpegEncContext *s)
784
+{
785
+    int mb_num;
786
+    const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
787
+    const int part_a_end  = s->pict_type==FF_I_TYPE ? (DC_END  |MV_END)   : MV_END;
788
+
789
+    mb_num= mpeg4_decode_partition_a(s);
790
+    if(mb_num<0){
791
+        ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
792
+        return -1;
793
+    }
794
+
795
+    if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
796
+        av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
797
+        ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
798
+        return -1;
799
+    }
800
+
801
+    s->mb_num_left= mb_num;
802
+
803
+    if(s->pict_type==FF_I_TYPE){
804
+        while(show_bits(&s->gb, 9) == 1)
805
+            skip_bits(&s->gb, 9);
806
+        if(get_bits_long(&s->gb, 19)!=DC_MARKER){
807
+            av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
808
+            return -1;
809
+        }
810
+    }else{
811
+        while(show_bits(&s->gb, 10) == 1)
812
+            skip_bits(&s->gb, 10);
813
+        if(get_bits(&s->gb, 17)!=MOTION_MARKER){
814
+            av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
815
+            return -1;
816
+        }
817
+    }
818
+    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
819
+
820
+    if( mpeg4_decode_partition_b(s, mb_num) < 0){
821
+        if(s->pict_type==FF_P_TYPE)
822
+            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
823
+        return -1;
824
+    }else{
825
+        if(s->pict_type==FF_P_TYPE)
826
+            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
827
+    }
828
+
829
+    return 0;
830
+}
831
+
832
+/**
833
+ * decodes a block.
834
+ * @return <0 if an error occurred
835
+ */
836
+static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
837
+                              int n, int coded, int intra, int rvlc)
838
+{
839
+    int level, i, last, run;
840
+    int dc_pred_dir;
841
+    RLTable * rl;
842
+    RL_VLC_ELEM * rl_vlc;
843
+    const uint8_t * scan_table;
844
+    int qmul, qadd;
845
+
846
+    //Note intra & rvlc should be optimized away if this is inlined
847
+
848
+    if(intra) {
849
+      if(s->use_intra_dc_vlc){
850
+        /* DC coef */
851
+        if(s->partitioned_frame){
852
+            level = s->dc_val[0][ s->block_index[n] ];
853
+            if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
854
+            else    level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
855
+            dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
856
+        }else{
857
+            level = mpeg4_decode_dc(s, n, &dc_pred_dir);
858
+            if (level < 0)
859
+                return -1;
860
+        }
861
+        block[0] = level;
862
+        i = 0;
863
+      }else{
864
+            i = -1;
865
+            ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
866
+      }
867
+      if (!coded)
868
+          goto not_coded;
869
+
870
+      if(rvlc){
871
+          rl = &rvlc_rl_intra;
872
+          rl_vlc = rvlc_rl_intra.rl_vlc[0];
873
+      }else{
874
+          rl = &rl_intra;
875
+          rl_vlc = rl_intra.rl_vlc[0];
876
+      }
877
+      if (s->ac_pred) {
878
+          if (dc_pred_dir == 0)
879
+              scan_table = s->intra_v_scantable.permutated; /* left */
880
+          else
881
+              scan_table = s->intra_h_scantable.permutated; /* top */
882
+      } else {
883
+            scan_table = s->intra_scantable.permutated;
884
+      }
885
+      qmul=1;
886
+      qadd=0;
887
+    } else {
888
+        i = -1;
889
+        if (!coded) {
890
+            s->block_last_index[n] = i;
891
+            return 0;
892
+        }
893
+        if(rvlc) rl = &rvlc_rl_inter;
894
+        else     rl = &rl_inter;
895
+
896
+        scan_table = s->intra_scantable.permutated;
897
+
898
+        if(s->mpeg_quant){
899
+            qmul=1;
900
+            qadd=0;
901
+            if(rvlc){
902
+                rl_vlc = rvlc_rl_inter.rl_vlc[0];
903
+            }else{
904
+                rl_vlc = rl_inter.rl_vlc[0];
905
+            }
906
+        }else{
907
+            qmul = s->qscale << 1;
908
+            qadd = (s->qscale - 1) | 1;
909
+            if(rvlc){
910
+                rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
911
+            }else{
912
+                rl_vlc = rl_inter.rl_vlc[s->qscale];
913
+            }
914
+        }
915
+    }
916
+  {
917
+    OPEN_READER(re, &s->gb);
918
+    for(;;) {
919
+        UPDATE_CACHE(re, &s->gb);
920
+        GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
921
+        if (level==0) {
922
+          /* escape */
923
+          if(rvlc){
924
+                if(SHOW_UBITS(re, &s->gb, 1)==0){
925
+                    av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
926
+                    return -1;
927
+                }; SKIP_CACHE(re, &s->gb, 1);
928
+
929
+                last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
930
+                run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
931
+                SKIP_COUNTER(re, &s->gb, 1+1+6);
932
+                UPDATE_CACHE(re, &s->gb);
933
+
934
+                if(SHOW_UBITS(re, &s->gb, 1)==0){
935
+                    av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
936
+                    return -1;
937
+                }; SKIP_CACHE(re, &s->gb, 1);
938
+
939
+                level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
940
+
941
+                if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
942
+                    av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
943
+                    return -1;
944
+                }; SKIP_CACHE(re, &s->gb, 5);
945
+
946
+                level=  level * qmul + qadd;
947
+                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
948
+                SKIP_COUNTER(re, &s->gb, 1+11+5+1);
949
+
950
+                i+= run + 1;
951
+                if(last) i+=192;
952
+          }else{
953
+            int cache;
954
+            cache= GET_CACHE(re, &s->gb);
955
+
956
+            if(IS_3IV1)
957
+                cache ^= 0xC0000000;
958
+
959
+            if (cache&0x80000000) {
960
+                if (cache&0x40000000) {
961
+                    /* third escape */
962
+                    SKIP_CACHE(re, &s->gb, 2);
963
+                    last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
964
+                    run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
965
+                    SKIP_COUNTER(re, &s->gb, 2+1+6);
966
+                    UPDATE_CACHE(re, &s->gb);
967
+
968
+                    if(IS_3IV1){
969
+                        level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
970
+                    }else{
971
+                        if(SHOW_UBITS(re, &s->gb, 1)==0){
972
+                            av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
973
+                            return -1;
974
+                        }; SKIP_CACHE(re, &s->gb, 1);
975
+
976
+                        level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
977
+
978
+                        if(SHOW_UBITS(re, &s->gb, 1)==0){
979
+                            av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
980
+                            return -1;
981
+                        }; LAST_SKIP_CACHE(re, &s->gb, 1);
982
+
983
+                        SKIP_COUNTER(re, &s->gb, 1+12+1);
984
+                    }
985
+
986
+#if 0
987
+                    if(s->error_recognition >= FF_ER_COMPLIANT){
988
+                        const int abs_level= FFABS(level);
989
+                        if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
990
+                            const int run1= run - rl->max_run[last][abs_level] - 1;
991
+                            if(abs_level <= rl->max_level[last][run]){
992
+                                av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
993
+                                return -1;
994
+                            }
995
+                            if(s->error_recognition > FF_ER_COMPLIANT){
996
+                                if(abs_level <= rl->max_level[last][run]*2){
997
+                                    av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
998
+                                    return -1;
999
+                                }
1000
+                                if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
1001
+                                    av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
1002
+                                    return -1;
1003
+                                }
1004
+                            }
1005
+                        }
1006
+                    }
1007
+#endif
1008
+                    if (level>0) level= level * qmul + qadd;
1009
+                    else         level= level * qmul - qadd;
1010
+
1011
+                    if((unsigned)(level + 2048) > 4095){
1012
+                        if(s->error_recognition > FF_ER_COMPLIANT){
1013
+                            if(level > 2560 || level<-2560){
1014
+                                av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
1015
+                                return -1;
1016
+                            }
1017
+                        }
1018
+                        level= level<0 ? -2048 : 2047;
1019
+                    }
1020
+
1021
+                    i+= run + 1;
1022
+                    if(last) i+=192;
1023
+                } else {
1024
+                    /* second escape */
1025
+#if MIN_CACHE_BITS < 20
1026
+                    LAST_SKIP_BITS(re, &s->gb, 2);
1027
+                    UPDATE_CACHE(re, &s->gb);
1028
+#else
1029
+                    SKIP_BITS(re, &s->gb, 2);
1030
+#endif
1031
+                    GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
1032
+                    i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
1033
+                    level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1034
+                    LAST_SKIP_BITS(re, &s->gb, 1);
1035
+                }
1036
+            } else {
1037
+                /* first escape */
1038
+#if MIN_CACHE_BITS < 19
1039
+                LAST_SKIP_BITS(re, &s->gb, 1);
1040
+                UPDATE_CACHE(re, &s->gb);
1041
+#else
1042
+                SKIP_BITS(re, &s->gb, 1);
1043
+#endif
1044
+                GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
1045
+                i+= run;
1046
+                level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1047
+                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1048
+                LAST_SKIP_BITS(re, &s->gb, 1);
1049
+            }
1050
+          }
1051
+        } else {
1052
+            i+= run;
1053
+            level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1054
+            LAST_SKIP_BITS(re, &s->gb, 1);
1055
+        }
1056
+        if (i > 62){
1057
+            i-= 192;
1058
+            if(i&(~63)){
1059
+                av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1060
+                return -1;
1061
+            }
1062
+
1063
+            block[scan_table[i]] = level;
1064
+            break;
1065
+        }
1066
+
1067
+        block[scan_table[i]] = level;
1068
+    }
1069
+    CLOSE_READER(re, &s->gb);
1070
+  }
1071
+ not_coded:
1072
+    if (intra) {
1073
+        if(!s->use_intra_dc_vlc){
1074
+            block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
1075
+
1076
+            i -= i>>31; //if(i == -1) i=0;
1077
+        }
1078
+
1079
+        mpeg4_pred_ac(s, block, n, dc_pred_dir);
1080
+        if (s->ac_pred) {
1081
+            i = 63; /* XXX: not optimal */
1082
+        }
1083
+    }
1084
+    s->block_last_index[n] = i;
1085
+    return 0;
1086
+}
1087
+
1088
+/**
1089
+ * decode partition C of one MB.
1090
+ * @return <0 if an error occurred
1091
+ */
1092
+static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
1093
+{
1094
+    int cbp, mb_type;
1095
+    const int xy= s->mb_x + s->mb_y*s->mb_stride;
1096
+
1097
+    mb_type= s->current_picture.mb_type[xy];
1098
+    cbp = s->cbp_table[xy];
1099
+
1100
+    s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
1101
+
1102
+    if(s->current_picture.qscale_table[xy] != s->qscale){
1103
+        ff_set_qscale(s, s->current_picture.qscale_table[xy] );
1104
+    }
1105
+
1106
+    if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
1107
+        int i;
1108
+        for(i=0; i<4; i++){
1109
+            s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
1110
+            s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
1111
+        }
1112
+        s->mb_intra = IS_INTRA(mb_type);
1113
+
1114
+        if (IS_SKIP(mb_type)) {
1115
+            /* skip mb */
1116
+            for(i=0;i<6;i++)
1117
+                s->block_last_index[i] = -1;
1118
+            s->mv_dir = MV_DIR_FORWARD;
1119
+            s->mv_type = MV_TYPE_16X16;
1120
+            if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
1121
+                s->mcsel=1;
1122
+                s->mb_skipped = 0;
1123
+            }else{
1124
+                s->mcsel=0;
1125
+                s->mb_skipped = 1;
1126
+            }
1127
+        }else if(s->mb_intra){
1128
+            s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
1129
+        }else if(!s->mb_intra){
1130
+//            s->mcsel= 0; //FIXME do we need to init that
1131
+
1132
+            s->mv_dir = MV_DIR_FORWARD;
1133
+            if (IS_8X8(mb_type)) {
1134
+                s->mv_type = MV_TYPE_8X8;
1135
+            } else {
1136
+                s->mv_type = MV_TYPE_16X16;
1137
+            }
1138
+        }
1139
+    } else { /* I-Frame */
1140
+        s->mb_intra = 1;
1141
+        s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
1142
+    }
1143
+
1144
+    if (!IS_SKIP(mb_type)) {
1145
+        int i;
1146
+        s->dsp.clear_blocks(s->block[0]);
1147
+        /* decode each block */
1148
+        for (i = 0; i < 6; i++) {
1149
+            if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
1150
+                av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
1151
+                return -1;
1152
+            }
1153
+            cbp+=cbp;
1154
+        }
1155
+    }
1156
+
1157
+    /* per-MB end of slice check */
1158
+
1159
+    if(--s->mb_num_left <= 0){
1160
+        if(mpeg4_is_resync(s))
1161
+            return SLICE_END;
1162
+        else
1163
+            return SLICE_NOEND;
1164
+    }else{
1165
+        if(mpeg4_is_resync(s)){
1166
+            const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
1167
+            if(s->cbp_table[xy+delta])
1168
+                return SLICE_END;
1169
+        }
1170
+        return SLICE_OK;
1171
+    }
1172
+}
1173
+
1174
+static int mpeg4_decode_mb(MpegEncContext *s,
1175
+                      DCTELEM block[6][64])
1176
+{
1177
+    int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
1178
+    int16_t *mot_val;
1179
+    static int8_t quant_tab[4] = { -1, -2, 1, 2 };
1180
+    const int xy= s->mb_x + s->mb_y * s->mb_stride;
1181
+
1182
+    assert(s->h263_pred);
1183
+
1184
+    if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
1185
+        do{
1186
+            if (get_bits1(&s->gb)) {
1187
+                /* skip mb */
1188
+                s->mb_intra = 0;
1189
+                for(i=0;i<6;i++)
1190
+                    s->block_last_index[i] = -1;
1191
+                s->mv_dir = MV_DIR_FORWARD;
1192
+                s->mv_type = MV_TYPE_16X16;
1193
+                if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
1194
+                    s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
1195
+                    s->mcsel=1;
1196
+                    s->mv[0][0][0]= get_amv(s, 0);
1197
+                    s->mv[0][0][1]= get_amv(s, 1);
1198
+
1199
+                    s->mb_skipped = 0;
1200
+                }else{
1201
+                    s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
1202
+                    s->mcsel=0;
1203
+                    s->mv[0][0][0] = 0;
1204
+                    s->mv[0][0][1] = 0;
1205
+                    s->mb_skipped = 1;
1206
+                }
1207
+                goto end;
1208
+            }
1209
+            cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
1210
+            if (cbpc < 0){
1211
+                av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
1212
+                return -1;
1213
+            }
1214
+        }while(cbpc == 20);
1215
+
1216
+        s->dsp.clear_blocks(s->block[0]);
1217
+        dquant = cbpc & 8;
1218
+        s->mb_intra = ((cbpc & 4) != 0);
1219
+        if (s->mb_intra) goto intra;
1220
+
1221
+        if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
1222
+            s->mcsel= get_bits1(&s->gb);
1223
+        else s->mcsel= 0;
1224
+        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
1225
+
1226
+        cbp = (cbpc & 3) | (cbpy << 2);
1227
+        if (dquant) {
1228
+            ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
1229
+        }
1230
+        if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
1231
+            s->interlaced_dct= get_bits1(&s->gb);
1232
+
1233
+        s->mv_dir = MV_DIR_FORWARD;
1234
+        if ((cbpc & 16) == 0) {
1235
+            if(s->mcsel){
1236
+                s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
1237
+                /* 16x16 global motion prediction */
1238
+                s->mv_type = MV_TYPE_16X16;
1239
+                mx= get_amv(s, 0);
1240
+                my= get_amv(s, 1);
1241
+                s->mv[0][0][0] = mx;
1242
+                s->mv[0][0][1] = my;
1243
+            }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
1244
+                s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
1245
+                /* 16x8 field motion prediction */
1246
+                s->mv_type= MV_TYPE_FIELD;
1247
+
1248
+                s->field_select[0][0]= get_bits1(&s->gb);
1249
+                s->field_select[0][1]= get_bits1(&s->gb);
1250
+
1251
+                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1252
+
1253
+                for(i=0; i<2; i++){
1254
+                    mx = h263_decode_motion(s, pred_x, s->f_code);
1255
+                    if (mx >= 0xffff)
1256
+                        return -1;
1257
+
1258
+                    my = h263_decode_motion(s, pred_y/2, s->f_code);
1259
+                    if (my >= 0xffff)
1260
+                        return -1;
1261
+
1262
+                    s->mv[0][i][0] = mx;
1263
+                    s->mv[0][i][1] = my;
1264
+                }
1265
+            }else{
1266
+                s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
1267
+                /* 16x16 motion prediction */
1268
+                s->mv_type = MV_TYPE_16X16;
1269
+                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1270
+                mx = h263_decode_motion(s, pred_x, s->f_code);
1271
+
1272
+                if (mx >= 0xffff)
1273
+                    return -1;
1274
+
1275
+                my = h263_decode_motion(s, pred_y, s->f_code);
1276
+
1277
+                if (my >= 0xffff)
1278
+                    return -1;
1279
+                s->mv[0][0][0] = mx;
1280
+                s->mv[0][0][1] = my;
1281
+            }
1282
+        } else {
1283
+            s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
1284
+            s->mv_type = MV_TYPE_8X8;
1285
+            for(i=0;i<4;i++) {
1286
+                mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1287
+                mx = h263_decode_motion(s, pred_x, s->f_code);
1288
+                if (mx >= 0xffff)
1289
+                    return -1;
1290
+
1291
+                my = h263_decode_motion(s, pred_y, s->f_code);
1292
+                if (my >= 0xffff)
1293
+                    return -1;
1294
+                s->mv[0][i][0] = mx;
1295
+                s->mv[0][i][1] = my;
1296
+                mot_val[0] = mx;
1297
+                mot_val[1] = my;
1298
+            }
1299
+        }
1300
+    } else if(s->pict_type==FF_B_TYPE) {
1301
+        int modb1; // first bit of modb
1302
+        int modb2; // second bit of modb
1303
+        int mb_type;
1304
+
1305
+        s->mb_intra = 0; //B-frames never contain intra blocks
1306
+        s->mcsel=0;      //     ...               true gmc blocks
1307
+
1308
+        if(s->mb_x==0){
1309
+            for(i=0; i<2; i++){
1310
+                s->last_mv[i][0][0]=
1311
+                s->last_mv[i][0][1]=
1312
+                s->last_mv[i][1][0]=
1313
+                s->last_mv[i][1][1]= 0;
1314
+            }
1315
+        }
1316
+
1317
+        /* if we skipped it in the future P Frame than skip it now too */
1318
+        s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
1319
+
1320
+        if(s->mb_skipped){
1321
+                /* skip mb */
1322
+            for(i=0;i<6;i++)
1323
+                s->block_last_index[i] = -1;
1324
+
1325
+            s->mv_dir = MV_DIR_FORWARD;
1326
+            s->mv_type = MV_TYPE_16X16;
1327
+            s->mv[0][0][0] = 0;
1328
+            s->mv[0][0][1] = 0;
1329
+            s->mv[1][0][0] = 0;
1330
+            s->mv[1][0][1] = 0;
1331
+            s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
1332
+            goto end;
1333
+        }
1334
+
1335
+        modb1= get_bits1(&s->gb);
1336
+        if(modb1){
1337
+            mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
1338
+            cbp=0;
1339
+        }else{
1340
+            modb2= get_bits1(&s->gb);
1341
+            mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
1342
+            if(mb_type<0){
1343
+                av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
1344
+                return -1;
1345
+            }
1346
+            mb_type= mb_type_b_map[ mb_type ];
1347
+            if(modb2) cbp= 0;
1348
+            else{
1349
+                s->dsp.clear_blocks(s->block[0]);
1350
+                cbp= get_bits(&s->gb, 6);
1351
+            }
1352
+
1353
+            if ((!IS_DIRECT(mb_type)) && cbp) {
1354
+                if(get_bits1(&s->gb)){
1355
+                    ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
1356
+                }
1357
+            }
1358
+
1359
+            if(!s->progressive_sequence){
1360
+                if(cbp)
1361
+                    s->interlaced_dct= get_bits1(&s->gb);
1362
+
1363
+                if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
1364
+                    mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
1365
+                    mb_type &= ~MB_TYPE_16x16;
1366
+
1367
+                    if(USES_LIST(mb_type, 0)){
1368
+                        s->field_select[0][0]= get_bits1(&s->gb);
1369
+                        s->field_select[0][1]= get_bits1(&s->gb);
1370
+                    }
1371
+                    if(USES_LIST(mb_type, 1)){
1372
+                        s->field_select[1][0]= get_bits1(&s->gb);
1373
+                        s->field_select[1][1]= get_bits1(&s->gb);
1374
+                    }
1375
+                }
1376
+            }
1377
+
1378
+            s->mv_dir = 0;
1379
+            if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
1380
+                s->mv_type= MV_TYPE_16X16;
1381
+
1382
+                if(USES_LIST(mb_type, 0)){
1383
+                    s->mv_dir = MV_DIR_FORWARD;
1384
+
1385
+                    mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
1386
+                    my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
1387
+                    s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
1388
+                    s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
1389
+                }
1390
+
1391
+                if(USES_LIST(mb_type, 1)){
1392
+                    s->mv_dir |= MV_DIR_BACKWARD;
1393
+
1394
+                    mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
1395
+                    my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
1396
+                    s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
1397
+                    s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
1398
+                }
1399
+            }else if(!IS_DIRECT(mb_type)){
1400
+                s->mv_type= MV_TYPE_FIELD;
1401
+
1402
+                if(USES_LIST(mb_type, 0)){
1403
+                    s->mv_dir = MV_DIR_FORWARD;
1404
+
1405
+                    for(i=0; i<2; i++){
1406
+                        mx = h263_decode_motion(s, s->last_mv[0][i][0]  , s->f_code);
1407
+                        my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
1408
+                        s->last_mv[0][i][0]=  s->mv[0][i][0] = mx;
1409
+                        s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
1410
+                    }
1411
+                }
1412
+
1413
+                if(USES_LIST(mb_type, 1)){
1414
+                    s->mv_dir |= MV_DIR_BACKWARD;
1415
+
1416
+                    for(i=0; i<2; i++){
1417
+                        mx = h263_decode_motion(s, s->last_mv[1][i][0]  , s->b_code);
1418
+                        my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
1419
+                        s->last_mv[1][i][0]=  s->mv[1][i][0] = mx;
1420
+                        s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
1421
+                    }
1422
+                }
1423
+            }
1424
+        }
1425
+
1426
+        if(IS_DIRECT(mb_type)){
1427
+            if(IS_SKIP(mb_type))
1428
+                mx=my=0;
1429
+            else{
1430
+                mx = h263_decode_motion(s, 0, 1);
1431
+                my = h263_decode_motion(s, 0, 1);
1432
+            }
1433
+
1434
+            s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
1435
+            mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
1436
+        }
1437
+        s->current_picture.mb_type[xy]= mb_type;
1438
+    } else { /* I-Frame */
1439
+        do{
1440
+            cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
1441
+            if (cbpc < 0){
1442
+                av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
1443
+                return -1;
1444
+            }
1445
+        }while(cbpc == 8);
1446
+
1447
+        dquant = cbpc & 4;
1448
+        s->mb_intra = 1;
1449
+intra:
1450
+        s->ac_pred = get_bits1(&s->gb);
1451
+        if(s->ac_pred)
1452
+            s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
1453
+        else
1454
+            s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
1455
+
1456
+        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
1457
+        if(cbpy<0){
1458
+            av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
1459
+            return -1;
1460
+        }
1461
+        cbp = (cbpc & 3) | (cbpy << 2);
1462
+
1463
+        s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
1464
+
1465
+        if (dquant) {
1466
+            ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
1467
+        }
1468
+
1469
+        if(!s->progressive_sequence)
1470
+            s->interlaced_dct= get_bits1(&s->gb);
1471
+
1472
+        s->dsp.clear_blocks(s->block[0]);
1473
+        /* decode each block */
1474
+        for (i = 0; i < 6; i++) {
1475
+            if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
1476
+                return -1;
1477
+            cbp+=cbp;
1478
+        }
1479
+        goto end;
1480
+    }
1481
+
1482
+    /* decode each block */
1483
+    for (i = 0; i < 6; i++) {
1484
+        if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
1485
+            return -1;
1486
+        cbp+=cbp;
1487
+    }
1488
+end:
1489
+
1490
+        /* per-MB end of slice check */
1491
+    if(s->codec_id==CODEC_ID_MPEG4){
1492
+        if(mpeg4_is_resync(s)){
1493
+            const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
1494
+            if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
1495
+                return SLICE_OK;
1496
+            return SLICE_END;
1497
+        }
1498
+    }
1499
+
1500
+    return SLICE_OK;
1501
+}
1502
+
1503
+
1504
+static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
1505
+    int hours, minutes, seconds;
1506
+
1507
+    hours= get_bits(gb, 5);
1508
+    minutes= get_bits(gb, 6);
1509
+    skip_bits1(gb);
1510
+    seconds= get_bits(gb, 6);
1511
+
1512
+    s->time_base= seconds + 60*(minutes + 60*hours);
1513
+
1514
+    skip_bits1(gb);
1515
+    skip_bits1(gb);
1516
+
1517
+    return 0;
1518
+}
1519
+
1520
+static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
1521
+    int width, height, vo_ver_id;
1522
+
1523
+    /* vol header */
1524
+    skip_bits(gb, 1); /* random access */
1525
+    s->vo_type= get_bits(gb, 8);
1526
+    if (get_bits1(gb) != 0) { /* is_ol_id */
1527
+        vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
1528
+        skip_bits(gb, 3); /* vo_priority */
1529
+    } else {
1530
+        vo_ver_id = 1;
1531
+    }
1532
+    s->aspect_ratio_info= get_bits(gb, 4);
1533
+    if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
1534
+        s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
1535
+        s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
1536
+    }else{
1537
+        s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info];
1538
+    }
1539
+
1540
+    if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
1541
+        int chroma_format= get_bits(gb, 2);
1542
+        if(chroma_format!=CHROMA_420){
1543
+            av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
1544
+        }
1545
+        s->low_delay= get_bits1(gb);
1546
+        if(get_bits1(gb)){ /* vbv parameters */
1547
+            get_bits(gb, 15);   /* first_half_bitrate */
1548
+            skip_bits1(gb);     /* marker */
1549
+            get_bits(gb, 15);   /* latter_half_bitrate */
1550
+            skip_bits1(gb);     /* marker */
1551
+            get_bits(gb, 15);   /* first_half_vbv_buffer_size */
1552
+            skip_bits1(gb);     /* marker */
1553
+            get_bits(gb, 3);    /* latter_half_vbv_buffer_size */
1554
+            get_bits(gb, 11);   /* first_half_vbv_occupancy */
1555
+            skip_bits1(gb);     /* marker */
1556
+            get_bits(gb, 15);   /* latter_half_vbv_occupancy */
1557
+            skip_bits1(gb);     /* marker */
1558
+        }
1559
+    }else{
1560
+        // set low delay flag only once the smartest? low delay detection won't be overriden
1561
+        if(s->picture_number==0)
1562
+            s->low_delay=0;
1563
+    }
1564
+
1565
+    s->shape = get_bits(gb, 2); /* vol shape */
1566
+    if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
1567
+    if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
1568
+        av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
1569
+        skip_bits(gb, 4);  //video_object_layer_shape_extension
1570
+    }
1571
+
1572
+    check_marker(gb, "before time_increment_resolution");
1573
+
1574
+    s->avctx->time_base.den = get_bits(gb, 16);
1575
+    if(!s->avctx->time_base.den){
1576
+        av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
1577
+        return -1;
1578
+    }
1579
+
1580
+    s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1581
+    if (s->time_increment_bits < 1)
1582
+        s->time_increment_bits = 1;
1583
+
1584
+    check_marker(gb, "before fixed_vop_rate");
1585
+
1586
+    if (get_bits1(gb) != 0) {   /* fixed_vop_rate  */
1587
+        s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
1588
+    }else
1589
+        s->avctx->time_base.num = 1;
1590
+
1591
+    s->t_frame=0;
1592
+
1593
+    if (s->shape != BIN_ONLY_SHAPE) {
1594
+        if (s->shape == RECT_SHAPE) {
1595
+            skip_bits1(gb);   /* marker */
1596
+            width = get_bits(gb, 13);
1597
+            skip_bits1(gb);   /* marker */
1598
+            height = get_bits(gb, 13);
1599
+            skip_bits1(gb);   /* marker */
1600
+            if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
1601
+                s->width = width;
1602
+                s->height = height;
1603
+            }
1604
+        }
1605
+
1606
+        s->progressive_sequence=
1607
+        s->progressive_frame= get_bits1(gb)^1;
1608
+        s->interlaced_dct=0;
1609
+        if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
1610
+            av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n");   /* OBMC Disable */
1611
+        if (vo_ver_id == 1) {
1612
+            s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
1613
+        } else {
1614
+            s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
1615
+        }
1616
+        if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
1617
+        if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
1618
+            if(s->vol_sprite_usage==STATIC_SPRITE){
1619
+                s->sprite_width = get_bits(gb, 13);
1620
+                skip_bits1(gb); /* marker */
1621
+                s->sprite_height= get_bits(gb, 13);
1622
+                skip_bits1(gb); /* marker */
1623
+                s->sprite_left  = get_bits(gb, 13);
1624
+                skip_bits1(gb); /* marker */
1625
+                s->sprite_top   = get_bits(gb, 13);
1626
+                skip_bits1(gb); /* marker */
1627
+            }
1628
+            s->num_sprite_warping_points= get_bits(gb, 6);
1629
+            if(s->num_sprite_warping_points > 3){
1630
+                av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
1631
+                s->num_sprite_warping_points= 0;
1632
+                return -1;
1633
+            }
1634
+            s->sprite_warping_accuracy = get_bits(gb, 2);
1635
+            s->sprite_brightness_change= get_bits1(gb);
1636
+            if(s->vol_sprite_usage==STATIC_SPRITE)
1637
+                s->low_latency_sprite= get_bits1(gb);
1638
+        }
1639
+        // FIXME sadct disable bit if verid!=1 && shape not rect
1640
+
1641
+        if (get_bits1(gb) == 1) {   /* not_8_bit */
1642
+            s->quant_precision = get_bits(gb, 4); /* quant_precision */
1643
+            if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
1644
+            if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
1645
+        } else {
1646
+            s->quant_precision = 5;
1647
+        }
1648
+
1649
+        // FIXME a bunch of grayscale shape things
1650
+
1651
+        if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
1652
+            int i, v;
1653
+
1654
+            /* load default matrixes */
1655
+            for(i=0; i<64; i++){
1656
+                int j= s->dsp.idct_permutation[i];
1657
+                v= ff_mpeg4_default_intra_matrix[i];
1658
+                s->intra_matrix[j]= v;
1659
+                s->chroma_intra_matrix[j]= v;
1660
+
1661
+                v= ff_mpeg4_default_non_intra_matrix[i];
1662
+                s->inter_matrix[j]= v;
1663
+                s->chroma_inter_matrix[j]= v;
1664
+            }
1665
+
1666
+            /* load custom intra matrix */
1667
+            if(get_bits1(gb)){
1668
+                int last=0;
1669
+                for(i=0; i<64; i++){
1670
+                    int j;
1671
+                    v= get_bits(gb, 8);
1672
+                    if(v==0) break;
1673
+
1674
+                    last= v;
1675
+                    j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
1676
+                    s->intra_matrix[j]= v;
1677
+                    s->chroma_intra_matrix[j]= v;
1678
+                }
1679
+
1680
+                /* replicate last value */
1681
+                for(; i<64; i++){
1682
+                    int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
1683
+                    s->intra_matrix[j]= last;
1684
+                    s->chroma_intra_matrix[j]= last;
1685
+                }
1686
+            }
1687
+
1688
+            /* load custom non intra matrix */
1689
+            if(get_bits1(gb)){
1690
+                int last=0;
1691
+                for(i=0; i<64; i++){
1692
+                    int j;
1693
+                    v= get_bits(gb, 8);
1694
+                    if(v==0) break;
1695
+
1696
+                    last= v;
1697
+                    j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
1698
+                    s->inter_matrix[j]= v;
1699
+                    s->chroma_inter_matrix[j]= v;
1700
+                }
1701
+
1702
+                /* replicate last value */
1703
+                for(; i<64; i++){
1704
+                    int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
1705
+                    s->inter_matrix[j]= last;
1706
+                    s->chroma_inter_matrix[j]= last;
1707
+                }
1708
+            }
1709
+
1710
+            // FIXME a bunch of grayscale shape things
1711
+        }
1712
+
1713
+        if(vo_ver_id != 1)
1714
+             s->quarter_sample= get_bits1(gb);
1715
+        else s->quarter_sample=0;
1716
+
1717
+        if(!get_bits1(gb)){
1718
+            int pos= get_bits_count(gb);
1719
+            int estimation_method= get_bits(gb, 2);
1720
+            if(estimation_method<2){
1721
+                if(!get_bits1(gb)){
1722
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
1723
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
1724
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
1725
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
1726
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
1727
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
1728
+                }
1729
+                if(!get_bits1(gb)){
1730
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
1731
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
1732
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
1733
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
1734
+                }
1735
+                if(!check_marker(gb, "in complexity estimation part 1")){
1736
+                    skip_bits_long(gb, pos - get_bits_count(gb));
1737
+                    goto no_cplx_est;
1738
+                }
1739
+                if(!get_bits1(gb)){
1740
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
1741
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
1742
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
1743
+                    s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
1744
+                }
1745
+                if(!get_bits1(gb)){
1746
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
1747
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
1748
+                    s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
1749
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
1750
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
1751
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
1752
+                }
1753
+                if(!check_marker(gb, "in complexity estimation part 2")){
1754
+                    skip_bits_long(gb, pos - get_bits_count(gb));
1755
+                    goto no_cplx_est;
1756
+                }
1757
+                if(estimation_method==1){
1758
+                    s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
1759
+                    s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
1760
+                }
1761
+            }else
1762
+                av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
1763
+        }else{
1764
+no_cplx_est:
1765
+            s->cplx_estimation_trash_i=
1766
+            s->cplx_estimation_trash_p=
1767
+            s->cplx_estimation_trash_b= 0;
1768
+        }
1769
+
1770
+        s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
1771
+
1772
+        s->data_partitioning= get_bits1(gb);
1773
+        if(s->data_partitioning){
1774
+            s->rvlc= get_bits1(gb);
1775
+        }
1776
+
1777
+        if(vo_ver_id != 1) {
1778
+            s->new_pred= get_bits1(gb);
1779
+            if(s->new_pred){
1780
+                av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
1781
+                skip_bits(gb, 2); /* requested upstream message type */
1782
+                skip_bits1(gb); /* newpred segment type */
1783
+            }
1784
+            s->reduced_res_vop= get_bits1(gb);
1785
+            if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
1786
+        }
1787
+        else{
1788
+            s->new_pred=0;
1789
+            s->reduced_res_vop= 0;
1790
+        }
1791
+
1792
+        s->scalability= get_bits1(gb);
1793
+
1794
+        if (s->scalability) {
1795
+            GetBitContext bak= *gb;
1796
+            int ref_layer_id;
1797
+            int ref_layer_sampling_dir;
1798
+            int h_sampling_factor_n;
1799
+            int h_sampling_factor_m;
1800
+            int v_sampling_factor_n;
1801
+            int v_sampling_factor_m;
1802
+
1803
+            s->hierachy_type= get_bits1(gb);
1804
+            ref_layer_id= get_bits(gb, 4);
1805
+            ref_layer_sampling_dir= get_bits1(gb);
1806
+            h_sampling_factor_n= get_bits(gb, 5);
1807
+            h_sampling_factor_m= get_bits(gb, 5);
1808
+            v_sampling_factor_n= get_bits(gb, 5);
1809
+            v_sampling_factor_m= get_bits(gb, 5);
1810
+            s->enhancement_type= get_bits1(gb);
1811
+
1812
+            if(   h_sampling_factor_n==0 || h_sampling_factor_m==0
1813
+               || v_sampling_factor_n==0 || v_sampling_factor_m==0){
1814
+                /* illegal scalability header (VERY broken encoder),
1815
+                 * trying to workaround */
1816
+                s->scalability=0;
1817
+                *gb= bak;
1818
+            }else
1819
+                av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
1820
+
1821
+            // bin shape stuff FIXME
1822
+        }
1823
+    }
1824
+    return 0;
1825
+}
1826
+
1827
+/**
1828
+ * decodes the user data stuff in the header.
1829
+ * Also initializes divx/xvid/lavc_version/build.
1830
+ */
1831
+static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
1832
+    char buf[256];
1833
+    int i;
1834
+    int e;
1835
+    int ver = 0, build = 0, ver2 = 0, ver3 = 0;
1836
+    char last;
1837
+
1838
+    for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
1839
+        if(show_bits(gb, 23) == 0) break;
1840
+        buf[i]= get_bits(gb, 8);
1841
+    }
1842
+    buf[i]=0;
1843
+
1844
+    /* divx detection */
1845
+    e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
1846
+    if(e<2)
1847
+        e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
1848
+    if(e>=2){
1849
+        s->divx_version= ver;
1850
+        s->divx_build= build;
1851
+        s->divx_packed= e==3 && last=='p';
1852
+        if(s->divx_packed && !s->showed_packed_warning) {
1853
+            av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
1854
+            s->showed_packed_warning=1;
1855
+        }
1856
+    }
1857
+
1858
+    /* ffmpeg detection */
1859
+    e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
1860
+    if(e!=4)
1861
+        e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
1862
+    if(e!=4){
1863
+        e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
1864
+        if (e>1)
1865
+            build= (ver<<16) + (ver2<<8) + ver3;
1866
+    }
1867
+    if(e!=4){
1868
+        if(strcmp(buf, "ffmpeg")==0){
1869
+            s->lavc_build= 4600;
1870
+        }
1871
+    }
1872
+    if(e==4){
1873
+        s->lavc_build= build;
1874
+    }
1875
+
1876
+    /* Xvid detection */
1877
+    e=sscanf(buf, "XviD%d", &build);
1878
+    if(e==1){
1879
+        s->xvid_build= build;
1880
+    }
1881
+
1882
+    return 0;
1883
+}
1884
+
1885
+static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
1886
+    int time_incr, time_increment;
1887
+
1888
+    s->pict_type = get_bits(gb, 2) + FF_I_TYPE;        /* pict type: I = 0 , P = 1 */
1889
+    if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
1890
+        av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
1891
+        s->low_delay=0;
1892
+    }
1893
+
1894
+    s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
1895
+    if(s->partitioned_frame)
1896
+        s->decode_mb= mpeg4_decode_partitioned_mb;
1897
+    else
1898
+        s->decode_mb= mpeg4_decode_mb;
1899
+
1900
+    time_incr=0;
1901
+    while (get_bits1(gb) != 0)
1902
+        time_incr++;
1903
+
1904
+    check_marker(gb, "before time_increment");
1905
+
1906
+    if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
1907
+        av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
1908
+
1909
+        for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
1910
+            if (    s->pict_type == FF_P_TYPE
1911
+                || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1912
+                if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
1913
+            }else
1914
+                if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
1915
+        }
1916
+
1917
+        av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
1918
+    }
1919
+
1920
+    if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
1921
+    else time_increment= get_bits(gb, s->time_increment_bits);
1922
+
1923
+    if(s->pict_type!=FF_B_TYPE){
1924
+        s->last_time_base= s->time_base;
1925
+        s->time_base+= time_incr;
1926
+        s->time= s->time_base*s->avctx->time_base.den + time_increment;
1927
+        if(s->workaround_bugs&FF_BUG_UMP4){
1928
+            if(s->time < s->last_non_b_time){
1929
+                /* header is not mpeg-4-compatible, broken encoder,
1930
+                 * trying to workaround */
1931
+                s->time_base++;
1932
+                s->time+= s->avctx->time_base.den;
1933
+            }
1934
+        }
1935
+        s->pp_time= s->time - s->last_non_b_time;
1936
+        s->last_non_b_time= s->time;
1937
+    }else{
1938
+        s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
1939
+        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1940
+        if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
1941
+            /* messed up order, maybe after seeking? skipping current b-frame */
1942
+            return FRAME_SKIPPED;
1943
+        }
1944
+        ff_mpeg4_init_direct_mv(s);
1945
+
1946
+        if(s->t_frame==0) s->t_frame= s->pb_time;
1947
+        if(s->t_frame==0) s->t_frame=1; // 1/0 protection
1948
+        s->pp_field_time= (  ROUNDED_DIV(s->last_non_b_time, s->t_frame)
1949
+                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
1950
+        s->pb_field_time= (  ROUNDED_DIV(s->time, s->t_frame)
1951
+                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
1952
+        if(!s->progressive_sequence){
1953
+            if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
1954
+                return FRAME_SKIPPED;
1955
+        }
1956
+    }
1957
+
1958
+    if(s->avctx->time_base.num)
1959
+        s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
1960
+    else
1961
+        s->current_picture_ptr->pts= AV_NOPTS_VALUE;
1962
+    if(s->avctx->debug&FF_DEBUG_PTS)
1963
+        av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
1964
+
1965
+    check_marker(gb, "before vop_coded");
1966
+
1967
+    /* vop coded */
1968
+    if (get_bits1(gb) != 1){
1969
+        if(s->avctx->debug&FF_DEBUG_PICT_INFO)
1970
+            av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
1971
+        return FRAME_SKIPPED;
1972
+    }
1973
+    if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
1974
+                          || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
1975
+        /* rounding type for motion estimation */
1976
+        s->no_rounding = get_bits1(gb);
1977
+    } else {
1978
+        s->no_rounding = 0;
1979
+    }
1980
+//FIXME reduced res stuff
1981
+
1982
+     if (s->shape != RECT_SHAPE) {
1983
+         if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
1984
+             int width, height, hor_spat_ref, ver_spat_ref;
1985
+
1986
+             width = get_bits(gb, 13);
1987
+             skip_bits1(gb);   /* marker */
1988
+             height = get_bits(gb, 13);
1989
+             skip_bits1(gb);   /* marker */
1990
+             hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
1991
+             skip_bits1(gb);   /* marker */
1992
+             ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
1993
+         }
1994
+         skip_bits1(gb); /* change_CR_disable */
1995
+
1996
+         if (get_bits1(gb) != 0) {
1997
+             skip_bits(gb, 8); /* constant_alpha_value */
1998
+         }
1999
+     }
2000
+//FIXME complexity estimation stuff
2001
+
2002
+     if (s->shape != BIN_ONLY_SHAPE) {
2003
+         skip_bits_long(gb, s->cplx_estimation_trash_i);
2004
+         if(s->pict_type != FF_I_TYPE)
2005
+            skip_bits_long(gb, s->cplx_estimation_trash_p);
2006
+         if(s->pict_type == FF_B_TYPE)
2007
+            skip_bits_long(gb, s->cplx_estimation_trash_b);
2008
+
2009
+         s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
2010
+         if(!s->progressive_sequence){
2011
+             s->top_field_first= get_bits1(gb);
2012
+             s->alternate_scan= get_bits1(gb);
2013
+         }else
2014
+             s->alternate_scan= 0;
2015
+     }
2016
+
2017
+     if(s->alternate_scan){
2018
+         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);
2019
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);
2020
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
2021
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2022
+     } else{
2023
+         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);
2024
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);
2025
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
2026
+         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2027
+     }
2028
+
2029
+     if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
2030
+         mpeg4_decode_sprite_trajectory(s, gb);
2031
+         if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
2032
+         if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
2033
+     }
2034
+
2035
+     if (s->shape != BIN_ONLY_SHAPE) {
2036
+         s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
2037
+         if(s->qscale==0){
2038
+             av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
2039
+             return -1; // makes no sense to continue, as there is nothing left from the image then
2040
+         }
2041
+
2042
+         if (s->pict_type != FF_I_TYPE) {
2043
+             s->f_code = get_bits(gb, 3);       /* fcode_for */
2044
+             if(s->f_code==0){
2045
+                 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
2046
+                 return -1; // makes no sense to continue, as the MV decoding will break very quickly
2047
+             }
2048
+         }else
2049
+             s->f_code=1;
2050
+
2051
+         if (s->pict_type == FF_B_TYPE) {
2052
+             s->b_code = get_bits(gb, 3);
2053
+         }else
2054
+             s->b_code=1;
2055
+
2056
+         if(s->avctx->debug&FF_DEBUG_PICT_INFO){
2057
+             av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d\n",
2058
+                 s->qscale, s->f_code, s->b_code,
2059
+                 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
2060
+                 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
2061
+                 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
2062
+                 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b);
2063
+         }
2064
+
2065
+         if(!s->scalability){
2066
+             if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
2067
+                 skip_bits1(gb); // vop shape coding type
2068
+             }
2069
+         }else{
2070
+             if(s->enhancement_type){
2071
+                 int load_backward_shape= get_bits1(gb);
2072
+                 if(load_backward_shape){
2073
+                     av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
2074
+                 }
2075
+             }
2076
+             skip_bits(gb, 2); //ref_select_code
2077
+         }
2078
+     }
2079
+     /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
2080
+     // note we cannot detect divx5 without b-frames easily (although it's buggy too)
2081
+     if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
2082
+         av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
2083
+         s->low_delay=1;
2084
+     }
2085
+
2086
+     s->picture_number++; // better than pic number==0 always ;)
2087
+
2088
+     s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
2089
+     s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2090
+
2091
+     if(s->workaround_bugs&FF_BUG_EDGE){
2092
+         s->h_edge_pos= s->width;
2093
+         s->v_edge_pos= s->height;
2094
+     }
2095
+     return 0;
2096
+}
2097
+
2098
+/**
2099
+ * decode mpeg4 headers
2100
+ * @return <0 if no VOP found (or a damaged one)
2101
+ *         FRAME_SKIPPED if a not coded VOP is found
2102
+ *         0 if a VOP is found
2103
+ */
2104
+int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
2105
+{
2106
+    int startcode, v;
2107
+
2108
+    /* search next start code */
2109
+    align_get_bits(gb);
2110
+
2111
+    if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
2112
+        skip_bits(gb, 24);
2113
+        if(get_bits(gb, 8) == 0xF0)
2114
+            goto end;
2115
+    }
2116
+
2117
+    startcode = 0xff;
2118
+    for(;;) {
2119
+        if(get_bits_count(gb) >= gb->size_in_bits){
2120
+            if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
2121
+                av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
2122
+                return FRAME_SKIPPED; //divx bug
2123
+            }else
2124
+                return -1; //end of stream
2125
+        }
2126
+
2127
+        /* use the bits after the test */
2128
+        v = get_bits(gb, 8);
2129
+        startcode = ((startcode << 8) | v) & 0xffffffff;
2130
+
2131
+        if((startcode&0xFFFFFF00) != 0x100)
2132
+            continue; //no startcode
2133
+
2134
+        if(s->avctx->debug&FF_DEBUG_STARTCODE){
2135
+            av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
2136
+            if     (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
2137
+            else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
2138
+            else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
2139
+            else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
2140
+            else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
2141
+            else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
2142
+            else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
2143
+            else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
2144
+            else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
2145
+            else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
2146
+            else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
2147
+            else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
2148
+            else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
2149
+            else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
2150
+            else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
2151
+            else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
2152
+            else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
2153
+            else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
2154
+            else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
2155
+            else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
2156
+            else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
2157
+            else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
2158
+            else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
2159
+            else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
2160
+            else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
2161
+            else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
2162
+            else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
2163
+            av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
2164
+        }
2165
+
2166
+        if(startcode >= 0x120 && startcode <= 0x12F){
2167
+            if(decode_vol_header(s, gb) < 0)
2168
+                return -1;
2169
+        }
2170
+        else if(startcode == USER_DATA_STARTCODE){
2171
+            decode_user_data(s, gb);
2172
+        }
2173
+        else if(startcode == GOP_STARTCODE){
2174
+            mpeg4_decode_gop_header(s, gb);
2175
+        }
2176
+        else if(startcode == VOP_STARTCODE){
2177
+            break;
2178
+        }
2179
+
2180
+        align_get_bits(gb);
2181
+        startcode = 0xff;
2182
+    }
2183
+end:
2184
+    if(s->flags& CODEC_FLAG_LOW_DELAY)
2185
+        s->low_delay=1;
2186
+    s->avctx->has_b_frames= !s->low_delay;
2187
+    return decode_vop_header(s, gb);
2188
+}
2189
+
2190
+static av_cold int decode_init(AVCodecContext *avctx)
2191
+{
2192
+    MpegEncContext *s = avctx->priv_data;
2193
+    int ret;
2194
+    static int done = 0;
2195
+
2196
+    if((ret=ff_h263_decode_init(avctx)) < 0)
2197
+        return ret;
2198
+
2199
+    if (!done) {
2200
+        done = 1;
2201
+
2202
+        init_rl(&rl_intra, ff_mpeg4_static_rl_table_store[0]);
2203
+        init_rl(&rvlc_rl_inter, ff_mpeg4_static_rl_table_store[1]);
2204
+        init_rl(&rvlc_rl_intra, ff_mpeg4_static_rl_table_store[2]);
2205
+        INIT_VLC_RL(rl_intra, 554);
2206
+        INIT_VLC_RL(rvlc_rl_inter, 1072);
2207
+        INIT_VLC_RL(rvlc_rl_intra, 1072);
2208
+        INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2209
+                 &DCtab_lum[0][1], 2, 1,
2210
+                 &DCtab_lum[0][0], 2, 1, 512);
2211
+        INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2212
+                 &DCtab_chrom[0][1], 2, 1,
2213
+                 &DCtab_chrom[0][0], 2, 1, 512);
2214
+        INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2215
+                 &sprite_trajectory_tab[0][1], 4, 2,
2216
+                 &sprite_trajectory_tab[0][0], 4, 2, 128);
2217
+        INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2218
+                 &mb_type_b_tab[0][1], 2, 1,
2219
+                 &mb_type_b_tab[0][0], 2, 1, 16);
2220
+    }
2221
+
2222
+    s->h263_pred = 1;
2223
+    s->low_delay = 0; //default, might be overriden in the vol header during header parsing
2224
+    s->decode_mb= mpeg4_decode_mb;
2225
+    s->time_increment_bits = 4; /* default value for broken headers */
2226
+    avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
2227
+
2228
+    return 0;
2229
+}
2230
+
2231
+AVCodec mpeg4_decoder = {
2232
+    "mpeg4",
2233
+    CODEC_TYPE_VIDEO,
2234
+    CODEC_ID_MPEG4,
2235
+    sizeof(MpegEncContext),
2236
+    decode_init,
2237
+    NULL,
2238
+    ff_h263_decode_end,
2239
+    ff_h263_decode_frame,
2240
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
2241
+    .flush= ff_mpeg_flush,
2242
+    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
2243
+    .pix_fmts= ff_hwaccel_pixfmt_list_420,
2244
+};
2245
+
2246
+
2247
+#if CONFIG_MPEG4_VDPAU_DECODER
2248
+AVCodec mpeg4_vdpau_decoder = {
2249
+    "mpeg4_vdpau",
2250
+    CODEC_TYPE_VIDEO,
2251
+    CODEC_ID_MPEG4,
2252
+    sizeof(MpegEncContext),
2253
+    decode_init,
2254
+    NULL,
2255
+    ff_h263_decode_end,
2256
+    ff_h263_decode_frame,
2257
+    CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
2258
+    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 (VDPAU)"),
2259
+    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_VDPAU_MPEG4, PIX_FMT_NONE},
2260
+};
2261
+#endif
0 2262
new file mode 100644
... ...
@@ -0,0 +1,1351 @@
0
+/*
1
+ * MPEG4 encoder.
2
+ * Copyright (c) 2000,2001 Fabrice Bellard
3
+ * Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
4
+ *
5
+ * This file is part of FFmpeg.
6
+ *
7
+ * FFmpeg is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * FFmpeg is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with FFmpeg; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+#include "mpegvideo.h"
23
+#include "h263.h"
24
+#include "mpeg4video.h"
25
+
26
+//The uni_DCtab_* tables below contain unified bits+length tables to encode DC
27
+//differences in mpeg4. Unified in the sense that the specification specifies
28
+//this encoding in several steps.
29
+static uint8_t uni_DCtab_lum_len[512];
30
+static uint8_t uni_DCtab_chrom_len[512];
31
+static uint16_t uni_DCtab_lum_bits[512];
32
+static uint16_t uni_DCtab_chrom_bits[512];
33
+
34
+//unified encoding tables for run length encoding of coefficients
35
+//unified in the sense that the specification specifies the encoding in several steps.
36
+static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
37
+static uint8_t  uni_mpeg4_intra_rl_len [64*64*2*2];
38
+static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
39
+static uint8_t  uni_mpeg4_inter_rl_len [64*64*2*2];
40
+//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
41
+//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
42
+#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
43
+
44
+/* mpeg4
45
+inter
46
+max level: 24/6
47
+max run: 53/63
48
+
49
+intra
50
+max level: 53/16
51
+max run: 29/41
52
+*/
53
+
54
+
55
+/**
56
+ * Returns the number of bits that encoding the 8x8 block in block would need.
57
+ * @param[in]  block_last_index last index in scantable order that refers to a non zero element in block.
58
+ */
59
+static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
60
+    int last=0;
61
+    int j;
62
+    int rate=0;
63
+
64
+    for(j=1; j<=block_last_index; j++){
65
+        const int index= scantable[j];
66
+        int level= block[index];
67
+        if(level){
68
+            level+= 64;
69
+            if((level&(~127)) == 0){
70
+                if(j<block_last_index) rate+= s->intra_ac_vlc_length     [UNI_AC_ENC_INDEX(j-last-1, level)];
71
+                else                   rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
72
+            }else
73
+                rate += s->ac_esc_length;
74
+
75
+            last= j;
76
+        }
77
+    }
78
+
79
+    return rate;
80
+}
81
+
82
+
83
+/**
84
+ * Restores the ac coefficients in block that have been changed by decide_ac_pred().
85
+ * This function also restores s->block_last_index.
86
+ * @param[in,out] block MB coefficients, these will be restored
87
+ * @param[in] dir ac prediction direction for each 8x8 block
88
+ * @param[out] st scantable for each 8x8 block
89
+ * @param[in] zigzag_last_index index refering to the last non zero coefficient in zigzag order
90
+ */
91
+static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], const int zigzag_last_index[6])
92
+{
93
+    int i, n;
94
+    memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
95
+
96
+    for(n=0; n<6; n++){
97
+        int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
98
+
99
+        st[n]= s->intra_scantable.permutated;
100
+        if(dir[n]){
101
+            /* top prediction */
102
+            for(i=1; i<8; i++){
103
+                block[n][s->dsp.idct_permutation[i   ]] = ac_val[i+8];
104
+            }
105
+        }else{
106
+            /* left prediction */
107
+            for(i=1; i<8; i++){
108
+                block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i  ];
109
+            }
110
+        }
111
+    }
112
+}
113
+
114
+/**
115
+ * Returns the optimal value (0 or 1) for the ac_pred element for the given MB in mpeg4.
116
+ * This function will also update s->block_last_index and s->ac_val.
117
+ * @param[in,out] block MB coefficients, these will be updated if 1 is returned
118
+ * @param[in] dir ac prediction direction for each 8x8 block
119
+ * @param[out] st scantable for each 8x8 block
120
+ * @param[out] zigzag_last_index index refering to the last non zero coefficient in zigzag order
121
+ */
122
+static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], const int dir[6], uint8_t *st[6], int zigzag_last_index[6])
123
+{
124
+    int score= 0;
125
+    int i, n;
126
+    int8_t * const qscale_table= s->current_picture.qscale_table;
127
+
128
+    memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
129
+
130
+    for(n=0; n<6; n++){
131
+        int16_t *ac_val, *ac_val1;
132
+
133
+        score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
134
+
135
+        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
136
+        ac_val1= ac_val;
137
+        if(dir[n]){
138
+            const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
139
+            /* top prediction */
140
+            ac_val-= s->block_wrap[n]*16;
141
+            if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
142
+                /* same qscale */
143
+                for(i=1; i<8; i++){
144
+                    const int level= block[n][s->dsp.idct_permutation[i   ]];
145
+                    block[n][s->dsp.idct_permutation[i   ]] = level - ac_val[i+8];
146
+                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
147
+                    ac_val1[i+8]= level;
148
+                }
149
+            }else{
150
+                /* different qscale, we must rescale */
151
+                for(i=1; i<8; i++){
152
+                    const int level= block[n][s->dsp.idct_permutation[i   ]];
153
+                    block[n][s->dsp.idct_permutation[i   ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
154
+                    ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
155
+                    ac_val1[i+8]= level;
156
+                }
157
+            }
158
+            st[n]= s->intra_h_scantable.permutated;
159
+        }else{
160
+            const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
161
+            /* left prediction */
162
+            ac_val-= 16;
163
+            if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
164
+                /* same qscale */
165
+                for(i=1; i<8; i++){
166
+                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
167
+                    block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
168
+                    ac_val1[i  ]= level;
169
+                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
170
+                }
171
+            }else{
172
+                /* different qscale, we must rescale */
173
+                for(i=1; i<8; i++){
174
+                    const int level= block[n][s->dsp.idct_permutation[i<<3]];
175
+                    block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
176
+                    ac_val1[i  ]= level;
177
+                    ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
178
+                }
179
+            }
180
+            st[n]= s->intra_v_scantable.permutated;
181
+        }
182
+
183
+        for(i=63; i>0; i--) //FIXME optimize
184
+            if(block[n][ st[n][i] ]) break;
185
+        s->block_last_index[n]= i;
186
+
187
+        score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
188
+    }
189
+
190
+    if(score < 0){
191
+        return 1;
192
+    }else{
193
+        restore_ac_coeffs(s, block, dir, st, zigzag_last_index);
194
+        return 0;
195
+    }
196
+}
197
+
198
+/**
199
+ * modify mb_type & qscale so that encoding is acually possible in mpeg4
200
+ */
201
+void ff_clean_mpeg4_qscales(MpegEncContext *s){
202
+    int i;
203
+    int8_t * const qscale_table= s->current_picture.qscale_table;
204
+
205
+    ff_clean_h263_qscales(s);
206
+
207
+    if(s->pict_type== FF_B_TYPE){
208
+        int odd=0;
209
+        /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
210
+
211
+        for(i=0; i<s->mb_num; i++){
212
+            int mb_xy= s->mb_index2xy[i];
213
+            odd += qscale_table[mb_xy]&1;
214
+        }
215
+
216
+        if(2*odd > s->mb_num) odd=1;
217
+        else                  odd=0;
218
+
219
+        for(i=0; i<s->mb_num; i++){
220
+            int mb_xy= s->mb_index2xy[i];
221
+            if((qscale_table[mb_xy]&1) != odd)
222
+                qscale_table[mb_xy]++;
223
+            if(qscale_table[mb_xy] > 31)
224
+                qscale_table[mb_xy]= 31;
225
+        }
226
+
227
+        for(i=1; i<s->mb_num; i++){
228
+            int mb_xy= s->mb_index2xy[i];
229
+            if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
230
+                s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
231
+            }
232
+        }
233
+    }
234
+}
235
+
236
+
237
+/**
238
+ * encodes the dc value.
239
+ * @param n block index (0-3 are luma, 4-5 are chroma)
240
+ */
241
+static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
242
+{
243
+#if 1
244
+    level+=256;
245
+    if (n < 4) {
246
+        /* luminance */
247
+        put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
248
+    } else {
249
+        /* chrominance */
250
+        put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
251
+    }
252
+#else
253
+    int size, v;
254
+    /* find number of bits */
255
+    size = 0;
256
+    v = abs(level);
257
+    while (v) {
258
+        v >>= 1;
259
+        size++;
260
+    }
261
+
262
+    if (n < 4) {
263
+        /* luminance */
264
+        put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
265
+    } else {
266
+        /* chrominance */
267
+        put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
268
+    }
269
+
270
+    /* encode remaining bits */
271
+    if (size > 0) {
272
+        if (level < 0)
273
+            level = (-level) ^ ((1 << size) - 1);
274
+        put_bits(&s->pb, size, level);
275
+        if (size > 8)
276
+            put_bits(&s->pb, 1, 1);
277
+    }
278
+#endif
279
+}
280
+
281
+static inline int mpeg4_get_dc_length(int level, int n){
282
+    if (n < 4) {
283
+        return uni_DCtab_lum_len[level + 256];
284
+    } else {
285
+        return uni_DCtab_chrom_len[level + 256];
286
+    }
287
+}
288
+
289
+/**
290
+ * encodes a 8x8 block
291
+ * @param n block index (0-3 are luma, 4-5 are chroma)
292
+ */
293
+static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
294
+                               uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
295
+{
296
+    int i, last_non_zero;
297
+#if 0 //variables for the outcommented version
298
+    int code, sign, last;
299
+#endif
300
+    const RLTable *rl;
301
+    uint32_t *bits_tab;
302
+    uint8_t *len_tab;
303
+    const int last_index = s->block_last_index[n];
304
+
305
+    if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
306
+        /* mpeg4 based DC predictor */
307
+        mpeg4_encode_dc(dc_pb, intra_dc, n);
308
+        if(last_index<1) return;
309
+        i = 1;
310
+        rl = &rl_intra;
311
+        bits_tab= uni_mpeg4_intra_rl_bits;
312
+        len_tab = uni_mpeg4_intra_rl_len;
313
+    } else {
314
+        if(last_index<0) return;
315
+        i = 0;
316
+        rl = &rl_inter;
317
+        bits_tab= uni_mpeg4_inter_rl_bits;
318
+        len_tab = uni_mpeg4_inter_rl_len;
319
+    }
320
+
321
+    /* AC coefs */
322
+    last_non_zero = i - 1;
323
+#if 1
324
+    for (; i < last_index; i++) {
325
+        int level = block[ scan_table[i] ];
326
+        if (level) {
327
+            int run = i - last_non_zero - 1;
328
+            level+=64;
329
+            if((level&(~127)) == 0){
330
+                const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
331
+                put_bits(ac_pb, len_tab[index], bits_tab[index]);
332
+            }else{ //ESC3
333
+                put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
334
+            }
335
+            last_non_zero = i;
336
+        }
337
+    }
338
+    /*if(i<=last_index)*/{
339
+        int level = block[ scan_table[i] ];
340
+        int run = i - last_non_zero - 1;
341
+        level+=64;
342
+        if((level&(~127)) == 0){
343
+            const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
344
+            put_bits(ac_pb, len_tab[index], bits_tab[index]);
345
+        }else{ //ESC3
346
+            put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
347
+        }
348
+    }
349
+#else
350
+    for (; i <= last_index; i++) {
351
+        const int slevel = block[ scan_table[i] ];
352
+        if (slevel) {
353
+            int level;
354
+            int run = i - last_non_zero - 1;
355
+            last = (i == last_index);
356
+            sign = 0;
357
+            level = slevel;
358
+            if (level < 0) {
359
+                sign = 1;
360
+                level = -level;
361
+            }
362
+            code = get_rl_index(rl, last, run, level);
363
+            put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
364
+            if (code == rl->n) {
365
+                int level1, run1;
366
+                level1 = level - rl->max_level[last][run];
367
+                if (level1 < 1)
368
+                    goto esc2;
369
+                code = get_rl_index(rl, last, run, level1);
370
+                if (code == rl->n) {
371
+                esc2:
372
+                    put_bits(ac_pb, 1, 1);
373
+                    if (level > MAX_LEVEL)
374
+                        goto esc3;
375
+                    run1 = run - rl->max_run[last][level] - 1;
376
+                    if (run1 < 0)
377
+                        goto esc3;
378
+                    code = get_rl_index(rl, last, run1, level);
379
+                    if (code == rl->n) {
380
+                    esc3:
381
+                        /* third escape */
382
+                        put_bits(ac_pb, 1, 1);
383
+                        put_bits(ac_pb, 1, last);
384
+                        put_bits(ac_pb, 6, run);
385
+                        put_bits(ac_pb, 1, 1);
386
+                        put_sbits(ac_pb, 12, slevel);
387
+                        put_bits(ac_pb, 1, 1);
388
+                    } else {
389
+                        /* second escape */
390
+                        put_bits(ac_pb, 1, 0);
391
+                        put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
392
+                        put_bits(ac_pb, 1, sign);
393
+                    }
394
+                } else {
395
+                    /* first escape */
396
+                    put_bits(ac_pb, 1, 0);
397
+                    put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
398
+                    put_bits(ac_pb, 1, sign);
399
+                }
400
+            } else {
401
+                put_bits(ac_pb, 1, sign);
402
+            }
403
+            last_non_zero = i;
404
+        }
405
+    }
406
+#endif
407
+}
408
+
409
+static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
410
+                               uint8_t *scan_table)
411
+{
412
+    int i, last_non_zero;
413
+    uint8_t *len_tab;
414
+    const int last_index = s->block_last_index[n];
415
+    int len=0;
416
+
417
+    if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
418
+        /* mpeg4 based DC predictor */
419
+        len += mpeg4_get_dc_length(intra_dc, n);
420
+        if(last_index<1) return len;
421
+        i = 1;
422
+        len_tab = uni_mpeg4_intra_rl_len;
423
+    } else {
424
+        if(last_index<0) return 0;
425
+        i = 0;
426
+        len_tab = uni_mpeg4_inter_rl_len;
427
+    }
428
+
429
+    /* AC coefs */
430
+    last_non_zero = i - 1;
431
+    for (; i < last_index; i++) {
432
+        int level = block[ scan_table[i] ];
433
+        if (level) {
434
+            int run = i - last_non_zero - 1;
435
+            level+=64;
436
+            if((level&(~127)) == 0){
437
+                const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
438
+                len += len_tab[index];
439
+            }else{ //ESC3
440
+                len += 7+2+1+6+1+12+1;
441
+            }
442
+            last_non_zero = i;
443
+        }
444
+    }
445
+    /*if(i<=last_index)*/{
446
+        int level = block[ scan_table[i] ];
447
+        int run = i - last_non_zero - 1;
448
+        level+=64;
449
+        if((level&(~127)) == 0){
450
+            const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
451
+            len += len_tab[index];
452
+        }else{ //ESC3
453
+            len += 7+2+1+6+1+12+1;
454
+        }
455
+    }
456
+
457
+    return len;
458
+}
459
+
460
+static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
461
+                               uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
462
+    int i;
463
+
464
+    if(scan_table){
465
+        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
466
+            for (i = 0; i < 6; i++) {
467
+                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
468
+            }
469
+        }else{
470
+            /* encode each block */
471
+            for (i = 0; i < 6; i++) {
472
+                mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
473
+            }
474
+        }
475
+    }else{
476
+        if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
477
+            for (i = 0; i < 6; i++) {
478
+                skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
479
+            }
480
+        }else{
481
+            /* encode each block */
482
+            for (i = 0; i < 6; i++) {
483
+                mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
484
+            }
485
+        }
486
+    }
487
+}
488
+
489
+//FIXME this is duplicated to h263.c
490
+static const int dquant_code[5]= {1,0,9,2,3};
491
+
492
+void mpeg4_encode_mb(MpegEncContext * s,
493
+                    DCTELEM block[6][64],
494
+                    int motion_x, int motion_y)
495
+{
496
+    int cbpc, cbpy, pred_x, pred_y;
497
+    PutBitContext * const pb2    = s->data_partitioning                         ? &s->pb2    : &s->pb;
498
+    PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
499
+    PutBitContext * const dc_pb  = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2    : &s->pb;
500
+    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
501
+
502
+    if (!s->mb_intra) {
503
+        int i, cbp;
504
+
505
+        if(s->pict_type==FF_B_TYPE){
506
+            static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
507
+            int mb_type=  mb_type_table[s->mv_dir];
508
+
509
+            if(s->mb_x==0){
510
+                for(i=0; i<2; i++){
511
+                    s->last_mv[i][0][0]=
512
+                    s->last_mv[i][0][1]=
513
+                    s->last_mv[i][1][0]=
514
+                    s->last_mv[i][1][1]= 0;
515
+                }
516
+            }
517
+
518
+            assert(s->dquant>=-2 && s->dquant<=2);
519
+            assert((s->dquant&1)==0);
520
+            assert(mb_type>=0);
521
+
522
+            /* nothing to do if this MB was skipped in the next P Frame */
523
+            if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
524
+                s->skip_count++;
525
+                s->mv[0][0][0]=
526
+                s->mv[0][0][1]=
527
+                s->mv[1][0][0]=
528
+                s->mv[1][0][1]= 0;
529
+                s->mv_dir= MV_DIR_FORWARD; //doesn't matter
530
+                s->qscale -= s->dquant;
531
+//                s->mb_skipped=1;
532
+
533
+                return;
534
+            }
535
+
536
+            cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
537
+
538
+            if ((cbp | motion_x | motion_y | mb_type) ==0) {
539
+                /* direct MB with MV={0,0} */
540
+                assert(s->dquant==0);
541
+
542
+                put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
543
+
544
+                if(interleaved_stats){
545
+                    s->misc_bits++;
546
+                    s->last_bits++;
547
+                }
548
+                s->skip_count++;
549
+                return;
550
+            }
551
+
552
+            put_bits(&s->pb, 1, 0);     /* mb coded modb1=0 */
553
+            put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
554
+            put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
555
+            if(cbp) put_bits(&s->pb, 6, cbp);
556
+
557
+            if(cbp && mb_type){
558
+                if(s->dquant)
559
+                    put_bits(&s->pb, 2, (s->dquant>>2)+3);
560
+                else
561
+                    put_bits(&s->pb, 1, 0);
562
+            }else
563
+                s->qscale -= s->dquant;
564
+
565
+            if(!s->progressive_sequence){
566
+                if(cbp)
567
+                    put_bits(&s->pb, 1, s->interlaced_dct);
568
+                if(mb_type) // not direct mode
569
+                    put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
570
+            }
571
+
572
+            if(interleaved_stats){
573
+                s->misc_bits+= get_bits_diff(s);
574
+            }
575
+
576
+            if(mb_type == 0){
577
+                assert(s->mv_dir & MV_DIRECT);
578
+                ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
579
+                s->b_count++;
580
+                s->f_count++;
581
+            }else{
582
+                assert(mb_type > 0 && mb_type < 4);
583
+                if(s->mv_type != MV_TYPE_FIELD){
584
+                    if(s->mv_dir & MV_DIR_FORWARD){
585
+                        ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
586
+                                                        s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
587
+                        s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
588
+                        s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
589
+                        s->f_count++;
590
+                    }
591
+                    if(s->mv_dir & MV_DIR_BACKWARD){
592
+                        ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
593
+                                                        s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
594
+                        s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
595
+                        s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
596
+                        s->b_count++;
597
+                    }
598
+                }else{
599
+                    if(s->mv_dir & MV_DIR_FORWARD){
600
+                        put_bits(&s->pb, 1, s->field_select[0][0]);
601
+                        put_bits(&s->pb, 1, s->field_select[0][1]);
602
+                    }
603
+                    if(s->mv_dir & MV_DIR_BACKWARD){
604
+                        put_bits(&s->pb, 1, s->field_select[1][0]);
605
+                        put_bits(&s->pb, 1, s->field_select[1][1]);
606
+                    }
607
+                    if(s->mv_dir & MV_DIR_FORWARD){
608
+                        for(i=0; i<2; i++){
609
+                            ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0]  ,
610
+                                                            s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
611
+                            s->last_mv[0][i][0]= s->mv[0][i][0];
612
+                            s->last_mv[0][i][1]= s->mv[0][i][1]*2;
613
+                        }
614
+                        s->f_count++;
615
+                    }
616
+                    if(s->mv_dir & MV_DIR_BACKWARD){
617
+                        for(i=0; i<2; i++){
618
+                            ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0]  ,
619
+                                                            s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
620
+                            s->last_mv[1][i][0]= s->mv[1][i][0];
621
+                            s->last_mv[1][i][1]= s->mv[1][i][1]*2;
622
+                        }
623
+                        s->b_count++;
624
+                    }
625
+                }
626
+            }
627
+
628
+            if(interleaved_stats){
629
+                s->mv_bits+= get_bits_diff(s);
630
+            }
631
+
632
+            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
633
+
634
+            if(interleaved_stats){
635
+                s->p_tex_bits+= get_bits_diff(s);
636
+            }
637
+
638
+        }else{ /* s->pict_type==FF_B_TYPE */
639
+            cbp= get_p_cbp(s, block, motion_x, motion_y);
640
+
641
+            if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
642
+                /* check if the B frames can skip it too, as we must skip it if we skip here
643
+                   why didn't they just compress the skip-mb bits instead of reusing them ?! */
644
+                if(s->max_b_frames>0){
645
+                    int i;
646
+                    int x,y, offset;
647
+                    uint8_t *p_pic;
648
+
649
+                    x= s->mb_x*16;
650
+                    y= s->mb_y*16;
651
+                    if(x+16 > s->width)  x= s->width-16;
652
+                    if(y+16 > s->height) y= s->height-16;
653
+
654
+                    offset= x + y*s->linesize;
655
+                    p_pic= s->new_picture.data[0] + offset;
656
+
657
+                    s->mb_skipped=1;
658
+                    for(i=0; i<s->max_b_frames; i++){
659
+                        uint8_t *b_pic;
660
+                        int diff;
661
+                        Picture *pic= s->reordered_input_picture[i+1];
662
+
663
+                        if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
664
+
665
+                        b_pic= pic->data[0] + offset;
666
+                        if(pic->type != FF_BUFFER_TYPE_SHARED)
667
+                            b_pic+= INPLACE_OFFSET;
668
+                        diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
669
+                        if(diff>s->qscale*70){ //FIXME check that 70 is optimal
670
+                            s->mb_skipped=0;
671
+                            break;
672
+                        }
673
+                    }
674
+                }else
675
+                    s->mb_skipped=1;
676
+
677
+                if(s->mb_skipped==1){
678
+                    /* skip macroblock */
679
+                    put_bits(&s->pb, 1, 1);
680
+
681
+                    if(interleaved_stats){
682
+                        s->misc_bits++;
683
+                        s->last_bits++;
684
+                    }
685
+                    s->skip_count++;
686
+
687
+                    return;
688
+                }
689
+            }
690
+
691
+            put_bits(&s->pb, 1, 0);     /* mb coded */
692
+            cbpc = cbp & 3;
693
+            cbpy = cbp >> 2;
694
+            cbpy ^= 0xf;
695
+            if(s->mv_type==MV_TYPE_16X16){
696
+                if(s->dquant) cbpc+= 8;
697
+                put_bits(&s->pb,
698
+                        inter_MCBPC_bits[cbpc],
699
+                        inter_MCBPC_code[cbpc]);
700
+
701
+                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
702
+                if(s->dquant)
703
+                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
704
+
705
+                if(!s->progressive_sequence){
706
+                    if(cbp)
707
+                        put_bits(pb2, 1, s->interlaced_dct);
708
+                    put_bits(pb2, 1, 0);
709
+                }
710
+
711
+                if(interleaved_stats){
712
+                    s->misc_bits+= get_bits_diff(s);
713
+                }
714
+
715
+                /* motion vectors: 16x16 mode */
716
+                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
717
+
718
+                ff_h263_encode_motion_vector(s, motion_x - pred_x,
719
+                                                motion_y - pred_y, s->f_code);
720
+            }else if(s->mv_type==MV_TYPE_FIELD){
721
+                if(s->dquant) cbpc+= 8;
722
+                put_bits(&s->pb,
723
+                        inter_MCBPC_bits[cbpc],
724
+                        inter_MCBPC_code[cbpc]);
725
+
726
+                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
727
+                if(s->dquant)
728
+                    put_bits(pb2, 2, dquant_code[s->dquant+2]);
729
+
730
+                assert(!s->progressive_sequence);
731
+                if(cbp)
732
+                    put_bits(pb2, 1, s->interlaced_dct);
733
+                put_bits(pb2, 1, 1);
734
+
735
+                if(interleaved_stats){
736
+                    s->misc_bits+= get_bits_diff(s);
737
+                }
738
+
739
+                /* motion vectors: 16x8 interlaced mode */
740
+                h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
741
+                pred_y /=2;
742
+
743
+                put_bits(&s->pb, 1, s->field_select[0][0]);
744
+                put_bits(&s->pb, 1, s->field_select[0][1]);
745
+
746
+                ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
747
+                                                s->mv[0][0][1] - pred_y, s->f_code);
748
+                ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
749
+                                                s->mv[0][1][1] - pred_y, s->f_code);
750
+            }else{
751
+                assert(s->mv_type==MV_TYPE_8X8);
752
+                put_bits(&s->pb,
753
+                        inter_MCBPC_bits[cbpc+16],
754
+                        inter_MCBPC_code[cbpc+16]);
755
+                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
756
+
757
+                if(!s->progressive_sequence){
758
+                    if(cbp)
759
+                        put_bits(pb2, 1, s->interlaced_dct);
760
+                }
761
+
762
+                if(interleaved_stats){
763
+                    s->misc_bits+= get_bits_diff(s);
764
+                }
765
+
766
+                for(i=0; i<4; i++){
767
+                    /* motion vectors: 8x8 mode*/
768
+                    h263_pred_motion(s, i, 0, &pred_x, &pred_y);
769
+
770
+                    ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
771
+                                                    s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
772
+                }
773
+            }
774
+
775
+            if(interleaved_stats){
776
+                s->mv_bits+= get_bits_diff(s);
777
+            }
778
+
779
+            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
780
+
781
+            if(interleaved_stats){
782
+                s->p_tex_bits+= get_bits_diff(s);
783
+            }
784
+            s->f_count++;
785
+        }
786
+    } else {
787
+        int cbp;
788
+        int dc_diff[6];   //dc values with the dc prediction subtracted
789
+        int dir[6];  //prediction direction
790
+        int zigzag_last_index[6];
791
+        uint8_t *scan_table[6];
792
+        int i;
793
+
794
+        for(i=0; i<6; i++){
795
+            dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
796
+        }
797
+
798
+        if(s->flags & CODEC_FLAG_AC_PRED){
799
+            s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
800
+        }else{
801
+            for(i=0; i<6; i++)
802
+                scan_table[i]= s->intra_scantable.permutated;
803
+        }
804
+
805
+        /* compute cbp */
806
+        cbp = 0;
807
+        for (i = 0; i < 6; i++) {
808
+            if (s->block_last_index[i] >= 1)
809
+                cbp |= 1 << (5 - i);
810
+        }
811
+
812
+        cbpc = cbp & 3;
813
+        if (s->pict_type == FF_I_TYPE) {
814
+            if(s->dquant) cbpc+=4;
815
+            put_bits(&s->pb,
816
+                intra_MCBPC_bits[cbpc],
817
+                intra_MCBPC_code[cbpc]);
818
+        } else {
819
+            if(s->dquant) cbpc+=8;
820
+            put_bits(&s->pb, 1, 0);     /* mb coded */
821
+            put_bits(&s->pb,
822
+                inter_MCBPC_bits[cbpc + 4],
823
+                inter_MCBPC_code[cbpc + 4]);
824
+        }
825
+        put_bits(pb2, 1, s->ac_pred);
826
+        cbpy = cbp >> 2;
827
+        put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
828
+        if(s->dquant)
829
+            put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
830
+
831
+        if(!s->progressive_sequence){
832
+            put_bits(dc_pb, 1, s->interlaced_dct);
833
+        }
834
+
835
+        if(interleaved_stats){
836
+            s->misc_bits+= get_bits_diff(s);
837
+        }
838
+
839
+        mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
840
+
841
+        if(interleaved_stats){
842
+            s->i_tex_bits+= get_bits_diff(s);
843
+        }
844
+        s->i_count++;
845
+
846
+        /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
847
+        if(s->ac_pred)
848
+            restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
849
+    }
850
+}
851
+
852
+/**
853
+ * add mpeg4 stuffing bits (01...1)
854
+ */
855
+void ff_mpeg4_stuffing(PutBitContext * pbc)
856
+{
857
+    int length;
858
+    put_bits(pbc, 1, 0);
859
+    length= (-put_bits_count(pbc))&7;
860
+    if(length) put_bits(pbc, length, (1<<length)-1);
861
+}
862
+
863
+/* must be called before writing the header */
864
+void ff_set_mpeg4_time(MpegEncContext * s){
865
+    if(s->pict_type==FF_B_TYPE){
866
+        ff_mpeg4_init_direct_mv(s);
867
+    }else{
868
+        s->last_time_base= s->time_base;
869
+        s->time_base= s->time/s->avctx->time_base.den;
870
+    }
871
+}
872
+
873
+static void mpeg4_encode_gop_header(MpegEncContext * s){
874
+    int hours, minutes, seconds;
875
+    int64_t time;
876
+
877
+    put_bits(&s->pb, 16, 0);
878
+    put_bits(&s->pb, 16, GOP_STARTCODE);
879
+
880
+    time= s->current_picture_ptr->pts;
881
+    if(s->reordered_input_picture[1])
882
+        time= FFMIN(time, s->reordered_input_picture[1]->pts);
883
+    time= time*s->avctx->time_base.num;
884
+
885
+    seconds= time/s->avctx->time_base.den;
886
+    minutes= seconds/60; seconds %= 60;
887
+    hours= minutes/60; minutes %= 60;
888
+    hours%=24;
889
+
890
+    put_bits(&s->pb, 5, hours);
891
+    put_bits(&s->pb, 6, minutes);
892
+    put_bits(&s->pb, 1, 1);
893
+    put_bits(&s->pb, 6, seconds);
894
+
895
+    put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
896
+    put_bits(&s->pb, 1, 0); //broken link == NO
897
+
898
+    s->last_time_base= time / s->avctx->time_base.den;
899
+
900
+    ff_mpeg4_stuffing(&s->pb);
901
+}
902
+
903
+static void mpeg4_encode_visual_object_header(MpegEncContext * s){
904
+    int profile_and_level_indication;
905
+    int vo_ver_id;
906
+
907
+    if(s->avctx->profile != FF_PROFILE_UNKNOWN){
908
+        profile_and_level_indication = s->avctx->profile << 4;
909
+    }else if(s->max_b_frames || s->quarter_sample){
910
+        profile_and_level_indication= 0xF0; // adv simple
911
+    }else{
912
+        profile_and_level_indication= 0x00; // simple
913
+    }
914
+
915
+    if(s->avctx->level != FF_LEVEL_UNKNOWN){
916
+        profile_and_level_indication |= s->avctx->level;
917
+    }else{
918
+        profile_and_level_indication |= 1; //level 1
919
+    }
920
+
921
+    if(profile_and_level_indication>>4 == 0xF){
922
+        vo_ver_id= 5;
923
+    }else{
924
+        vo_ver_id= 1;
925
+    }
926
+
927
+    //FIXME levels
928
+
929
+    put_bits(&s->pb, 16, 0);
930
+    put_bits(&s->pb, 16, VOS_STARTCODE);
931
+
932
+    put_bits(&s->pb, 8, profile_and_level_indication);
933
+
934
+    put_bits(&s->pb, 16, 0);
935
+    put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
936
+
937
+    put_bits(&s->pb, 1, 1);
938
+        put_bits(&s->pb, 4, vo_ver_id);
939
+        put_bits(&s->pb, 3, 1); //priority
940
+
941
+    put_bits(&s->pb, 4, 1); //visual obj type== video obj
942
+
943
+    put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
944
+
945
+    ff_mpeg4_stuffing(&s->pb);
946
+}
947
+
948
+static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
949
+{
950
+    int vo_ver_id;
951
+
952
+    if (!CONFIG_MPEG4_ENCODER)  return;
953
+
954
+    if(s->max_b_frames || s->quarter_sample){
955
+        vo_ver_id= 5;
956
+        s->vo_type= ADV_SIMPLE_VO_TYPE;
957
+    }else{
958
+        vo_ver_id= 1;
959
+        s->vo_type= SIMPLE_VO_TYPE;
960
+    }
961
+
962
+    put_bits(&s->pb, 16, 0);
963
+    put_bits(&s->pb, 16, 0x100 + vo_number);        /* video obj */
964
+    put_bits(&s->pb, 16, 0);
965
+    put_bits(&s->pb, 16, 0x120 + vol_number);       /* video obj layer */
966
+
967
+    put_bits(&s->pb, 1, 0);             /* random access vol */
968
+    put_bits(&s->pb, 8, s->vo_type);    /* video obj type indication */
969
+    if(s->workaround_bugs & FF_BUG_MS) {
970
+        put_bits(&s->pb, 1, 0);         /* is obj layer id= no */
971
+    } else {
972
+        put_bits(&s->pb, 1, 1);         /* is obj layer id= yes */
973
+        put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
974
+        put_bits(&s->pb, 3, 1);         /* is obj layer priority */
975
+    }
976
+
977
+    s->aspect_ratio_info= ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio);
978
+
979
+    put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
980
+    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
981
+        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
982
+        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
983
+    }
984
+
985
+    if(s->workaround_bugs & FF_BUG_MS) { //
986
+        put_bits(&s->pb, 1, 0);         /* vol control parameters= no @@@ */
987
+    } else {
988
+        put_bits(&s->pb, 1, 1);         /* vol control parameters= yes */
989
+        put_bits(&s->pb, 2, 1);         /* chroma format YUV 420/YV12 */
990
+        put_bits(&s->pb, 1, s->low_delay);
991
+        put_bits(&s->pb, 1, 0);         /* vbv parameters= no */
992
+    }
993
+
994
+    put_bits(&s->pb, 2, RECT_SHAPE);    /* vol shape= rectangle */
995
+    put_bits(&s->pb, 1, 1);             /* marker bit */
996
+
997
+    put_bits(&s->pb, 16, s->avctx->time_base.den);
998
+    if (s->time_increment_bits < 1)
999
+        s->time_increment_bits = 1;
1000
+    put_bits(&s->pb, 1, 1);             /* marker bit */
1001
+    put_bits(&s->pb, 1, 0);             /* fixed vop rate=no */
1002
+    put_bits(&s->pb, 1, 1);             /* marker bit */
1003
+    put_bits(&s->pb, 13, s->width);     /* vol width */
1004
+    put_bits(&s->pb, 1, 1);             /* marker bit */
1005
+    put_bits(&s->pb, 13, s->height);    /* vol height */
1006
+    put_bits(&s->pb, 1, 1);             /* marker bit */
1007
+    put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1008
+    put_bits(&s->pb, 1, 1);             /* obmc disable */
1009
+    if (vo_ver_id == 1) {
1010
+        put_bits(&s->pb, 1, s->vol_sprite_usage);       /* sprite enable */
1011
+    }else{
1012
+        put_bits(&s->pb, 2, s->vol_sprite_usage);       /* sprite enable */
1013
+    }
1014
+
1015
+    put_bits(&s->pb, 1, 0);             /* not 8 bit == false */
1016
+    put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1017
+
1018
+    if(s->mpeg_quant){
1019
+        ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
1020
+        ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
1021
+    }
1022
+
1023
+    if (vo_ver_id != 1)
1024
+        put_bits(&s->pb, 1, s->quarter_sample);
1025
+    put_bits(&s->pb, 1, 1);             /* complexity estimation disable */
1026
+    s->resync_marker= s->rtp_mode;
1027
+    put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1028
+    put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1029
+    if(s->data_partitioning){
1030
+        put_bits(&s->pb, 1, 0);         /* no rvlc */
1031
+    }
1032
+
1033
+    if (vo_ver_id != 1){
1034
+        put_bits(&s->pb, 1, 0);         /* newpred */
1035
+        put_bits(&s->pb, 1, 0);         /* reduced res vop */
1036
+    }
1037
+    put_bits(&s->pb, 1, 0);             /* scalability */
1038
+
1039
+    ff_mpeg4_stuffing(&s->pb);
1040
+
1041
+    /* user data */
1042
+    if(!(s->flags & CODEC_FLAG_BITEXACT)){
1043
+        put_bits(&s->pb, 16, 0);
1044
+        put_bits(&s->pb, 16, 0x1B2);    /* user_data */
1045
+        ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
1046
+    }
1047
+}
1048
+
1049
+/* write mpeg4 VOP header */
1050
+void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1051
+{
1052
+    int time_incr;
1053
+    int time_div, time_mod;
1054
+
1055
+    if(s->pict_type==FF_I_TYPE){
1056
+        if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
1057
+            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
1058
+                mpeg4_encode_visual_object_header(s);
1059
+            if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
1060
+                mpeg4_encode_vol_header(s, 0, 0);
1061
+        }
1062
+        if(!(s->workaround_bugs & FF_BUG_MS))
1063
+            mpeg4_encode_gop_header(s);
1064
+    }
1065
+
1066
+    s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
1067
+
1068
+    put_bits(&s->pb, 16, 0);                /* vop header */
1069
+    put_bits(&s->pb, 16, VOP_STARTCODE);    /* vop header */
1070
+    put_bits(&s->pb, 2, s->pict_type - 1);  /* pict type: I = 0 , P = 1 */
1071
+
1072
+    assert(s->time>=0);
1073
+    time_div= s->time/s->avctx->time_base.den;
1074
+    time_mod= s->time%s->avctx->time_base.den;
1075
+    time_incr= time_div - s->last_time_base;
1076
+    assert(time_incr >= 0);
1077
+    while(time_incr--)
1078
+        put_bits(&s->pb, 1, 1);
1079
+
1080
+    put_bits(&s->pb, 1, 0);
1081
+
1082
+    put_bits(&s->pb, 1, 1);                             /* marker */
1083
+    put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1084
+    put_bits(&s->pb, 1, 1);                             /* marker */
1085
+    put_bits(&s->pb, 1, 1);                             /* vop coded */
1086
+    if (    s->pict_type == FF_P_TYPE
1087
+        || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1088
+        put_bits(&s->pb, 1, s->no_rounding);    /* rounding type */
1089
+    }
1090
+    put_bits(&s->pb, 3, 0);     /* intra dc VLC threshold */
1091
+    if(!s->progressive_sequence){
1092
+         put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
1093
+         put_bits(&s->pb, 1, s->alternate_scan);
1094
+    }
1095
+    //FIXME sprite stuff
1096
+
1097
+    put_bits(&s->pb, 5, s->qscale);
1098
+
1099
+    if (s->pict_type != FF_I_TYPE)
1100
+        put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1101
+    if (s->pict_type == FF_B_TYPE)
1102
+        put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1103
+}
1104
+
1105
+
1106
+static void init_uni_dc_tab(void)
1107
+{
1108
+    int level, uni_code, uni_len;
1109
+
1110
+    for(level=-256; level<256; level++){
1111
+        int size, v, l;
1112
+        /* find number of bits */
1113
+        size = 0;
1114
+        v = abs(level);
1115
+        while (v) {
1116
+            v >>= 1;
1117
+            size++;
1118
+        }
1119
+
1120
+        if (level < 0)
1121
+            l= (-level) ^ ((1 << size) - 1);
1122
+        else
1123
+            l= level;
1124
+
1125
+        /* luminance */
1126
+        uni_code= DCtab_lum[size][0];
1127
+        uni_len = DCtab_lum[size][1];
1128
+
1129
+        if (size > 0) {
1130
+            uni_code<<=size; uni_code|=l;
1131
+            uni_len+=size;
1132
+            if (size > 8){
1133
+                uni_code<<=1; uni_code|=1;
1134
+                uni_len++;
1135
+            }
1136
+        }
1137
+        uni_DCtab_lum_bits[level+256]= uni_code;
1138
+        uni_DCtab_lum_len [level+256]= uni_len;
1139
+
1140
+        /* chrominance */
1141
+        uni_code= DCtab_chrom[size][0];
1142
+        uni_len = DCtab_chrom[size][1];
1143
+
1144
+        if (size > 0) {
1145
+            uni_code<<=size; uni_code|=l;
1146
+            uni_len+=size;
1147
+            if (size > 8){
1148
+                uni_code<<=1; uni_code|=1;
1149
+                uni_len++;
1150
+            }
1151
+        }
1152
+        uni_DCtab_chrom_bits[level+256]= uni_code;
1153
+        uni_DCtab_chrom_len [level+256]= uni_len;
1154
+
1155
+    }
1156
+}
1157
+
1158
+static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1159
+    int slevel, run, last;
1160
+
1161
+    assert(MAX_LEVEL >= 64);
1162
+    assert(MAX_RUN   >= 63);
1163
+
1164
+    for(slevel=-64; slevel<64; slevel++){
1165
+        if(slevel==0) continue;
1166
+        for(run=0; run<64; run++){
1167
+            for(last=0; last<=1; last++){
1168
+                const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1169
+                int level= slevel < 0 ? -slevel : slevel;
1170
+                int sign= slevel < 0 ? 1 : 0;
1171
+                int bits, len, code;
1172
+                int level1, run1;
1173
+
1174
+                len_tab[index]= 100;
1175
+
1176
+                /* ESC0 */
1177
+                code= get_rl_index(rl, last, run, level);
1178
+                bits= rl->table_vlc[code][0];
1179
+                len=  rl->table_vlc[code][1];
1180
+                bits=bits*2+sign; len++;
1181
+
1182
+                if(code!=rl->n && len < len_tab[index]){
1183
+                    bits_tab[index]= bits;
1184
+                    len_tab [index]= len;
1185
+                }
1186
+                /* ESC1 */
1187
+                bits= rl->table_vlc[rl->n][0];
1188
+                len=  rl->table_vlc[rl->n][1];
1189
+                bits=bits*2;    len++; //esc1
1190
+                level1= level - rl->max_level[last][run];
1191
+                if(level1>0){
1192
+                    code= get_rl_index(rl, last, run, level1);
1193
+                    bits<<= rl->table_vlc[code][1];
1194
+                    len  += rl->table_vlc[code][1];
1195
+                    bits += rl->table_vlc[code][0];
1196
+                    bits=bits*2+sign; len++;
1197
+
1198
+                    if(code!=rl->n && len < len_tab[index]){
1199
+                        bits_tab[index]= bits;
1200
+                        len_tab [index]= len;
1201
+                    }
1202
+                }
1203
+                /* ESC2 */
1204
+                bits= rl->table_vlc[rl->n][0];
1205
+                len=  rl->table_vlc[rl->n][1];
1206
+                bits=bits*4+2;    len+=2; //esc2
1207
+                run1 = run - rl->max_run[last][level] - 1;
1208
+                if(run1>=0){
1209
+                    code= get_rl_index(rl, last, run1, level);
1210
+                    bits<<= rl->table_vlc[code][1];
1211
+                    len  += rl->table_vlc[code][1];
1212
+                    bits += rl->table_vlc[code][0];
1213
+                    bits=bits*2+sign; len++;
1214
+
1215
+                    if(code!=rl->n && len < len_tab[index]){
1216
+                        bits_tab[index]= bits;
1217
+                        len_tab [index]= len;
1218
+                    }
1219
+                }
1220
+                /* ESC3 */
1221
+                bits= rl->table_vlc[rl->n][0];
1222
+                len = rl->table_vlc[rl->n][1];
1223
+                bits=bits*4+3;    len+=2; //esc3
1224
+                bits=bits*2+last; len++;
1225
+                bits=bits*64+run; len+=6;
1226
+                bits=bits*2+1;    len++;  //marker
1227
+                bits=bits*4096+(slevel&0xfff); len+=12;
1228
+                bits=bits*2+1;    len++;  //marker
1229
+
1230
+                if(len < len_tab[index]){
1231
+                    bits_tab[index]= bits;
1232
+                    len_tab [index]= len;
1233
+                }
1234
+            }
1235
+        }
1236
+    }
1237
+}
1238
+
1239
+static av_cold int encode_init(AVCodecContext *avctx)
1240
+{
1241
+    MpegEncContext *s = avctx->priv_data;
1242
+    int ret;
1243
+    static int done = 0;
1244
+
1245
+    if((ret=MPV_encode_init(avctx)) < 0)
1246
+        return ret;
1247
+
1248
+    if (!done) {
1249
+        done = 1;
1250
+
1251
+        init_uni_dc_tab();
1252
+
1253
+        init_rl(&rl_intra, ff_mpeg4_static_rl_table_store[0]);
1254
+
1255
+        init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1256
+        init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1257
+    }
1258
+
1259
+    s->min_qcoeff= -2048;
1260
+    s->max_qcoeff=  2047;
1261
+    s->intra_ac_vlc_length     = uni_mpeg4_intra_rl_len;
1262
+    s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1263
+    s->inter_ac_vlc_length     = uni_mpeg4_inter_rl_len;
1264
+    s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1265
+    s->luma_dc_vlc_length= uni_DCtab_lum_len;
1266
+    s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1267
+    s->ac_esc_length= 7+2+1+6+1+12+1;
1268
+    s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
1269
+    s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1270
+
1271
+    if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
1272
+
1273
+        s->avctx->extradata= av_malloc(1024);
1274
+        init_put_bits(&s->pb, s->avctx->extradata, 1024);
1275
+
1276
+        if(!(s->workaround_bugs & FF_BUG_MS))
1277
+            mpeg4_encode_visual_object_header(s);
1278
+        mpeg4_encode_vol_header(s, 0, 0);
1279
+
1280
+//            ff_mpeg4_stuffing(&s->pb); ?
1281
+        flush_put_bits(&s->pb);
1282
+        s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
1283
+    }
1284
+    return 0;
1285
+}
1286
+
1287
+void ff_mpeg4_init_partitions(MpegEncContext *s)
1288
+{
1289
+    uint8_t *start= put_bits_ptr(&s->pb);
1290
+    uint8_t *end= s->pb.buf_end;
1291
+    int size= end - start;
1292
+    int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
1293
+    int tex_size= (size - 2*pb_size)&(~3);
1294
+
1295
+    set_put_bits_buffer_size(&s->pb, pb_size);
1296
+    init_put_bits(&s->tex_pb, start + pb_size           , tex_size);
1297
+    init_put_bits(&s->pb2   , start + pb_size + tex_size, pb_size);
1298
+}
1299
+
1300
+void ff_mpeg4_merge_partitions(MpegEncContext *s)
1301
+{
1302
+    const int pb2_len   = put_bits_count(&s->pb2   );
1303
+    const int tex_pb_len= put_bits_count(&s->tex_pb);
1304
+    const int bits= put_bits_count(&s->pb);
1305
+
1306
+    if(s->pict_type==FF_I_TYPE){
1307
+        put_bits(&s->pb, 19, DC_MARKER);
1308
+        s->misc_bits+=19 + pb2_len + bits - s->last_bits;
1309
+        s->i_tex_bits+= tex_pb_len;
1310
+    }else{
1311
+        put_bits(&s->pb, 17, MOTION_MARKER);
1312
+        s->misc_bits+=17 + pb2_len;
1313
+        s->mv_bits+= bits - s->last_bits;
1314
+        s->p_tex_bits+= tex_pb_len;
1315
+    }
1316
+
1317
+    flush_put_bits(&s->pb2);
1318
+    flush_put_bits(&s->tex_pb);
1319
+
1320
+    set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
1321
+    ff_copy_bits(&s->pb, s->pb2.buf   , pb2_len);
1322
+    ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
1323
+    s->last_bits= put_bits_count(&s->pb);
1324
+}
1325
+
1326
+
1327
+void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
1328
+{
1329
+    int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1330
+
1331
+    put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
1332
+    put_bits(&s->pb, 1, 1);
1333
+
1334
+    put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
1335
+    put_bits(&s->pb, s->quant_precision, s->qscale);
1336
+    put_bits(&s->pb, 1, 0); /* no HEC */
1337
+}
1338
+
1339
+AVCodec mpeg4_encoder = {
1340
+    "mpeg4",
1341
+    CODEC_TYPE_VIDEO,
1342
+    CODEC_ID_MPEG4,
1343
+    sizeof(MpegEncContext),
1344
+    encode_init,
1345
+    MPV_encode_picture,
1346
+    MPV_encode_end,
1347
+    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
1348
+    .capabilities= CODEC_CAP_DELAY,
1349
+    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
1350
+};
... ...
@@ -782,11 +782,7 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s);
782 782
 void ff_mpeg1_clean_buffers(MpegEncContext *s);
783 783
 int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s);
784 784
 
785
-extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
786
-extern const uint8_t ff_mpeg4_c_dc_scale_table[32];
787 785
 extern const uint8_t ff_aic_dc_scale_table[32];
788
-extern const int16_t ff_mpeg4_default_intra_matrix[64];
789
-extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
790 786
 extern const uint8_t ff_h263_chroma_qscale_table[32];
791 787
 extern const uint8_t ff_h263_loop_filter_strength[32];
792 788
 
... ...
@@ -810,22 +806,14 @@ int ff_h263_decode_end(AVCodecContext *avctx);
810 810
 void h263_encode_mb(MpegEncContext *s,
811 811
                     DCTELEM block[6][64],
812 812
                     int motion_x, int motion_y);
813
-void mpeg4_encode_mb(MpegEncContext *s,
814
-                    DCTELEM block[6][64],
815
-                    int motion_x, int motion_y);
816 813
 void h263_encode_picture_header(MpegEncContext *s, int picture_number);
817 814
 void h263_encode_gob_header(MpegEncContext * s, int mb_line);
818 815
 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
819 816
                         int *px, int *py);
820
-void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
821
-                   int dir);
822
-void ff_set_mpeg4_time(MpegEncContext * s);
823
-void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
824 817
 void h263_encode_init(MpegEncContext *s);
825 818
 void h263_decode_init_vlc(MpegEncContext *s);
826 819
 int h263_decode_picture_header(MpegEncContext *s);
827 820
 int ff_h263_decode_gob_header(MpegEncContext *s);
828
-int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
829 821
 void ff_h263_update_motion_val(MpegEncContext * s);
830 822
 void ff_h263_loop_filter(MpegEncContext * s);
831 823
 void ff_set_qscale(MpegEncContext * s, int qscale);
... ...
@@ -840,8 +828,6 @@ void ff_h263_show_pict_info(MpegEncContext *s);
840 840
 int ff_intel_h263_decode_picture_header(MpegEncContext *s);
841 841
 int ff_h263_decode_mb(MpegEncContext *s,
842 842
                       DCTELEM block[6][64]);
843
-int ff_mpeg4_decode_mb(MpegEncContext *s,
844
-                      DCTELEM block[6][64]);
845 843
 
846 844
 /**
847 845
  * Returns the value of the 3bit "source format" syntax element.
... ...
@@ -850,15 +836,7 @@ int ff_mpeg4_decode_mb(MpegEncContext *s,
850 850
  */
851 851
 int av_const h263_get_picture_format(int width, int height);
852 852
 
853
-void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
854
-void ff_mpeg4_clean_buffers(MpegEncContext *s);
855
-void ff_mpeg4_stuffing(PutBitContext * pbc);
856
-void ff_mpeg4_init_partitions(MpegEncContext *s);
857
-void ff_mpeg4_merge_partitions(MpegEncContext *s);
858
-void ff_clean_mpeg4_qscales(MpegEncContext *s);
859 853
 void ff_clean_h263_qscales(MpegEncContext *s);
860
-int ff_mpeg4_decode_partitions(MpegEncContext *s);
861
-int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
862 854
 int ff_h263_resync(MpegEncContext *s);
863 855
 const uint8_t *ff_h263_find_resync_marker(const uint8_t *p, const uint8_t *end);
864 856
 int ff_h263_get_gob_height(MpegEncContext *s);
... ...
@@ -36,6 +36,7 @@
36 36
 #include "faandct.h"
37 37
 #include "aandcttab.h"
38 38
 #include "flv.h"
39
+#include "mpeg4video.h"
39 40
 #include <limits.h>
40 41
 
41 42
 //#undef NDEBUG
... ...
@@ -3781,19 +3782,6 @@ AVCodec h263p_encoder = {
3781 3781
     .long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
3782 3782
 };
3783 3783
 
3784
-AVCodec mpeg4_encoder = {
3785
-    "mpeg4",
3786
-    CODEC_TYPE_VIDEO,
3787
-    CODEC_ID_MPEG4,
3788
-    sizeof(MpegEncContext),
3789
-    MPV_encode_init,
3790
-    MPV_encode_picture,
3791
-    MPV_encode_end,
3792
-    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
3793
-    .capabilities= CODEC_CAP_DELAY,
3794
-    .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
3795
-};
3796
-
3797 3784
 AVCodec msmpeg4v1_encoder = {
3798 3785
     "msmpeg4v1",
3799 3786
     CODEC_TYPE_VIDEO,
... ...
@@ -32,6 +32,8 @@
32 32
 #include "mpegvideo.h"
33 33
 #include "msmpeg4.h"
34 34
 #include "libavutil/x86_cpu.h"
35
+#include "h263.h"
36
+#include "mpeg4video.h"
35 37
 
36 38
 /*
37 39
  * You can also call this codec : MPEG4 with a twist !
... ...
@@ -43,7 +45,6 @@
43 43
 //#define DEBUG
44 44
 
45 45
 #define DC_VLC_BITS 9
46
-#define CBPY_VLC_BITS 6
47 46
 #define V1_INTRA_CBPC_VLC_BITS 6
48 47
 #define V1_INTER_CBPC_VLC_BITS 6
49 48
 #define V2_INTRA_CBPC_VLC_BITS 3
... ...
@@ -1059,7 +1060,6 @@ else
1059 1059
 VLC ff_mb_non_intra_vlc[4];
1060 1060
 static VLC v2_dc_lum_vlc;
1061 1061
 static VLC v2_dc_chroma_vlc;
1062
-static VLC cbpy_vlc;
1063 1062
 static VLC v2_intra_cbpc_vlc;
1064 1063
 static VLC v2_mb_type_vlc;
1065 1064
 static VLC v2_mv_vlc;
... ...
@@ -52,19 +52,6 @@ extern VLC ff_msmp4_dc_chroma_vlc[2];
52 52
 /* intra picture macroblock coded block pattern */
53 53
 extern const uint16_t ff_msmp4_mb_i_table[64][2];
54 54
 
55
-extern const uint8_t cbpy_tab[16][2];
56
-
57
-extern const uint8_t DCtab_lum[13][2];
58
-extern const uint8_t DCtab_chrom[13][2];
59
-
60
-extern const uint8_t mvtab[33][2];
61
-
62
-extern const uint8_t intra_MCBPC_code[9];
63
-extern const uint8_t intra_MCBPC_bits[9];
64
-
65
-extern const uint8_t inter_MCBPC_code[28];
66
-extern const uint8_t inter_MCBPC_bits[28];
67
-
68 55
 #define WMV1_SCANTABLE_COUNT 4
69 56
 
70 57
 extern const uint8_t wmv1_scantable[WMV1_SCANTABLE_COUNT][64];