diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libffmpeg/diff_to_ffmpeg_cvs.txt | 3399 |
1 files changed, 1721 insertions, 1678 deletions
diff --git a/src/libffmpeg/diff_to_ffmpeg_cvs.txt b/src/libffmpeg/diff_to_ffmpeg_cvs.txt index fe2718379..50ca49841 100644 --- a/src/libffmpeg/diff_to_ffmpeg_cvs.txt +++ b/src/libffmpeg/diff_to_ffmpeg_cvs.txt @@ -1,5 +1,6 @@ ---- /home/melanson/temp/ffmpeg/libavcodec/avcodec.h 2005-05-05 20:53:13.717837440 -0600 -+++ libavcodec/avcodec.h 2005-05-05 21:30:43.775776640 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/avcodec.h libavcodec/avcodec.h +--- /home/melanson/temp/ffmpeg/libavcodec/avcodec.h 2005-05-27 17:42:53.000000000 -0600 ++++ libavcodec/avcodec.h 2005-05-27 18:42:06.000000000 -0600 @@ -30,6 +30,13 @@ #define AV_TIME_BASE 1000000 #define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE} @@ -14,9 +15,9 @@ enum CodecID { CODEC_ID_NONE, CODEC_ID_MPEG1VIDEO, -@@ -2352,6 +2359,13 @@ - ((uint8_t*)(x))[0]) - #endif +@@ -2367,6 +2374,13 @@ + + extern unsigned int av_xiphlacing(unsigned char *s, unsigned int v); +/* unused static macro */ +#if defined(__GNUC__) && !defined(DEBUG) @@ -28,8 +29,9 @@ #ifdef __cplusplus } #endif ---- /home/melanson/temp/ffmpeg/libavcodec/common.h 2005-05-05 20:53:13.720836984 -0600 -+++ libavcodec/common.h 2005-05-05 21:30:43.776776488 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/common.h libavcodec/common.h +--- /home/melanson/temp/ffmpeg/libavcodec/common.h 2005-05-27 17:42:53.000000000 -0600 ++++ libavcodec/common.h 2005-05-27 18:42:06.000000000 -0600 @@ -6,6 +6,11 @@ #ifndef COMMON_H #define COMMON_H @@ -52,8 +54,21 @@ # endif # include <assert.h> ---- /home/melanson/temp/ffmpeg/libavcodec/dsputil.h 2005-05-05 20:53:13.734834856 -0600 -+++ libavcodec/dsputil.h 2005-05-05 21:30:43.776776488 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/dsputil.c libavcodec/dsputil.c +--- /home/melanson/temp/ffmpeg/libavcodec/dsputil.c 2005-05-27 17:42:53.000000000 -0600 ++++ libavcodec/dsputil.c 2005-05-27 18:42:06.000000000 -0600 +@@ -371,6 +371,8 @@ + assert(s>=0); + + return s>>2; ++#else ++ return 0; + #endif + } + +diff -ur /home/melanson/temp/ffmpeg/libavcodec/dsputil.h libavcodec/dsputil.h +--- /home/melanson/temp/ffmpeg/libavcodec/dsputil.h 2005-05-27 17:42:53.000000000 -0600 ++++ libavcodec/dsputil.h 2005-05-27 18:42:06.000000000 -0600 @@ -31,6 +31,9 @@ #include "common.h" #include "avcodec.h" @@ -64,8 +79,1446 @@ //#define DEBUG /* dct code */ ---- /home/melanson/temp/ffmpeg/libavcodec/motion_est.c 2005-05-05 20:53:15.023638928 -0600 -+++ libavcodec/motion_est.c 2005-05-05 21:30:43.778776184 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/h263.c libavcodec/h263.c +--- /home/melanson/temp/ffmpeg/libavcodec/h263.c 2005-05-27 17:42:53.000000000 -0600 ++++ libavcodec/h263.c 2005-05-27 18:42:06.000000000 -0600 +@@ -57,18 +57,12 @@ + static void h263_encode_block(MpegEncContext * s, DCTELEM * block, + int n); + static void h263p_encode_umotion(MpegEncContext * s, int val); +-static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, +- int n, int dc, uint8_t *scan_table, +- PutBitContext *dc_pb, PutBitContext *ac_pb); + #endif + + static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); + static int h263p_decode_umotion(MpegEncContext * s, int pred); + static int h263_decode_block(MpegEncContext * s, DCTELEM * block, + int n, int coded); +-static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); +-static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, +- int n, int coded, int intra, int rvlc); + static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, + uint8_t *scan_table); + static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr); +@@ -77,7 +71,6 @@ + static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number); + #endif //CONFIG_ENCODERS + static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb); +-static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding); + + #ifdef CONFIG_ENCODERS + static uint8_t uni_DCtab_lum_len[512]; +@@ -664,6 +657,85 @@ + } + } + ++/** ++ * predicts the dc. ++ * encoding quantized level -> quantized diff ++ * decoding quantized diff -> quantized level ++ * @param n block index (0-3 are luma, 4-5 are chroma) ++ * @param dir_ptr pointer to an integer where the prediction direction will be stored ++ */ ++static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) ++{ ++ int a, b, c, wrap, pred, scale, ret; ++ uint16_t *dc_val; ++ ++ /* find prediction */ ++ if (n < 4) { ++ scale = s->y_dc_scale; ++ } else { ++ scale = s->c_dc_scale; ++ } ++ if(IS_3IV1) ++ scale= 8; ++ ++ wrap= s->block_wrap[n]; ++ dc_val = s->dc_val[0] + s->block_index[n]; ++ ++ /* B C ++ * A X ++ */ ++ a = dc_val[ - 1]; ++ b = dc_val[ - 1 - wrap]; ++ c = dc_val[ - wrap]; ++ ++ /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ ++ if(s->first_slice_line && n!=3){ ++ if(n!=2) b=c= 1024; ++ if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; ++ } ++ if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){ ++ if(n==0 || n==4 || n==5) ++ b=1024; ++ } ++ ++ if (abs(a - b) < abs(b - c)) { ++ pred = c; ++ *dir_ptr = 1; /* top */ ++ } else { ++ pred = a; ++ *dir_ptr = 0; /* left */ ++ } ++ /* we assume pred is positive */ ++ pred = FASTDIV((pred + (scale >> 1)), scale); ++ ++ if(encoding){ ++ ret = level - pred; ++ }else{ ++ level += pred; ++ ret= level; ++ if(s->error_resilience>=3){ ++ if(level<0){ ++ av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); ++ return -1; ++ } ++ if(level*scale > 2048 + scale){ ++ av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); ++ return -1; ++ } ++ } ++ } ++ level *=scale; ++ if(level&(~2047)){ ++ if(level<0) ++ level=0; ++ else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) ++ level=2047; ++ } ++ dc_val[0]= level; ++ ++ return ret; ++} ++ + #ifdef CONFIG_ENCODERS + + static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){ +@@ -793,6 +865,179 @@ + return cbp; + } + ++/** ++ * encodes the dc value. ++ * @param n block index (0-3 are luma, 4-5 are chroma) ++ */ ++static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) ++{ ++#if 1 ++// if(level<-255 || level>255) printf("dc overflow\n"); ++ level+=256; ++ if (n < 4) { ++ /* luminance */ ++ put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); ++ } else { ++ /* chrominance */ ++ put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); ++ } ++#else ++ int size, v; ++ /* find number of bits */ ++ size = 0; ++ v = abs(level); ++ while (v) { ++ v >>= 1; ++ size++; ++ } ++ ++ if (n < 4) { ++ /* luminance */ ++ put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); ++ } else { ++ /* chrominance */ ++ put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); ++ } ++ ++ /* encode remaining bits */ ++ if (size > 0) { ++ if (level < 0) ++ level = (-level) ^ ((1 << size) - 1); ++ put_bits(&s->pb, size, level); ++ if (size > 8) ++ put_bits(&s->pb, 1, 1); ++ } ++#endif ++} ++ ++static inline int mpeg4_get_dc_length(int level, int n){ ++ if (n < 4) { ++ return uni_DCtab_lum_len[level + 256]; ++ } else { ++ return uni_DCtab_chrom_len[level + 256]; ++ } ++} ++ ++/** ++ * encodes a 8x8 block ++ * @param n block index (0-3 are luma, 4-5 are chroma) ++ */ ++static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, ++ uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) ++{ ++ int i, last_non_zero; ++#if 0 //variables for the outcommented version ++ int code, sign, last; ++#endif ++ const RLTable *rl; ++ uint32_t *bits_tab; ++ uint8_t *len_tab; ++ const int last_index = s->block_last_index[n]; ++ ++ if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away ++ /* mpeg4 based DC predictor */ ++ mpeg4_encode_dc(dc_pb, intra_dc, n); ++ if(last_index<1) return; ++ i = 1; ++ rl = &rl_intra; ++ bits_tab= uni_mpeg4_intra_rl_bits; ++ len_tab = uni_mpeg4_intra_rl_len; ++ } else { ++ if(last_index<0) return; ++ i = 0; ++ rl = &rl_inter; ++ bits_tab= uni_mpeg4_inter_rl_bits; ++ len_tab = uni_mpeg4_inter_rl_len; ++ } ++ ++ /* AC coefs */ ++ last_non_zero = i - 1; ++#if 1 ++ for (; i < last_index; i++) { ++ int level = block[ scan_table[i] ]; ++ if (level) { ++ int run = i - last_non_zero - 1; ++ level+=64; ++ if((level&(~127)) == 0){ ++ const int index= UNI_MPEG4_ENC_INDEX(0, run, level); ++ put_bits(ac_pb, len_tab[index], bits_tab[index]); ++ }else{ //ESC3 ++ 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); ++ } ++ last_non_zero = i; ++ } ++ } ++ /*if(i<=last_index)*/{ ++ int level = block[ scan_table[i] ]; ++ int run = i - last_non_zero - 1; ++ level+=64; ++ if((level&(~127)) == 0){ ++ const int index= UNI_MPEG4_ENC_INDEX(1, run, level); ++ put_bits(ac_pb, len_tab[index], bits_tab[index]); ++ }else{ //ESC3 ++ 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); ++ } ++ } ++#else ++ for (; i <= last_index; i++) { ++ const int slevel = block[ scan_table[i] ]; ++ if (slevel) { ++ int level; ++ int run = i - last_non_zero - 1; ++ last = (i == last_index); ++ sign = 0; ++ level = slevel; ++ if (level < 0) { ++ sign = 1; ++ level = -level; ++ } ++ code = get_rl_index(rl, last, run, level); ++ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); ++ if (code == rl->n) { ++ int level1, run1; ++ level1 = level - rl->max_level[last][run]; ++ if (level1 < 1) ++ goto esc2; ++ code = get_rl_index(rl, last, run, level1); ++ if (code == rl->n) { ++ esc2: ++ put_bits(ac_pb, 1, 1); ++ if (level > MAX_LEVEL) ++ goto esc3; ++ run1 = run - rl->max_run[last][level] - 1; ++ if (run1 < 0) ++ goto esc3; ++ code = get_rl_index(rl, last, run1, level); ++ if (code == rl->n) { ++ esc3: ++ /* third escape */ ++ put_bits(ac_pb, 1, 1); ++ put_bits(ac_pb, 1, last); ++ put_bits(ac_pb, 6, run); ++ put_bits(ac_pb, 1, 1); ++ put_bits(ac_pb, 12, slevel & 0xfff); ++ put_bits(ac_pb, 1, 1); ++ } else { ++ /* second escape */ ++ put_bits(ac_pb, 1, 0); ++ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); ++ put_bits(ac_pb, 1, sign); ++ } ++ } else { ++ /* first escape */ ++ put_bits(ac_pb, 1, 0); ++ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); ++ put_bits(ac_pb, 1, sign); ++ } ++ } else { ++ put_bits(ac_pb, 1, sign); ++ } ++ last_non_zero = i; ++ } ++ } ++#endif ++} ++ + static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6], + uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){ + int i; +@@ -2479,85 +2724,6 @@ + } + + /** +- * predicts the dc. +- * encoding quantized level -> quantized diff +- * decoding quantized diff -> quantized level +- * @param n block index (0-3 are luma, 4-5 are chroma) +- * @param dir_ptr pointer to an integer where the prediction direction will be stored +- */ +-static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) +-{ +- int a, b, c, wrap, pred, scale, ret; +- uint16_t *dc_val; +- +- /* find prediction */ +- if (n < 4) { +- scale = s->y_dc_scale; +- } else { +- scale = s->c_dc_scale; +- } +- if(IS_3IV1) +- scale= 8; +- +- wrap= s->block_wrap[n]; +- dc_val = s->dc_val[0] + s->block_index[n]; +- +- /* B C +- * A X +- */ +- a = dc_val[ - 1]; +- b = dc_val[ - 1 - wrap]; +- c = dc_val[ - wrap]; +- +- /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ +- if(s->first_slice_line && n!=3){ +- if(n!=2) b=c= 1024; +- if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; +- } +- if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){ +- if(n==0 || n==4 || n==5) +- b=1024; +- } +- +- if (abs(a - b) < abs(b - c)) { +- pred = c; +- *dir_ptr = 1; /* top */ +- } else { +- pred = a; +- *dir_ptr = 0; /* left */ +- } +- /* we assume pred is positive */ +- pred = FASTDIV((pred + (scale >> 1)), scale); +- +- if(encoding){ +- ret = level - pred; +- }else{ +- level += pred; +- ret= level; +- if(s->error_resilience>=3){ +- if(level<0){ +- av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); +- return -1; +- } +- if(level*scale > 2048 + scale){ +- av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); +- return -1; +- } +- } +- } +- level *=scale; +- if(level&(~2047)){ +- if(level<0) +- level=0; +- else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) +- level=2047; +- } +- dc_val[0]= level; +- +- return ret; +-} +- +-/** + * predicts the ac. + * @param n block index (0-3 are luma, 4-5 are chroma) + * @param dir the ac prediction direction +@@ -2619,179 +2785,6 @@ + + #ifdef CONFIG_ENCODERS + +-/** +- * encodes the dc value. +- * @param n block index (0-3 are luma, 4-5 are chroma) +- */ +-static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) +-{ +-#if 1 +-// if(level<-255 || level>255) printf("dc overflow\n"); +- level+=256; +- if (n < 4) { +- /* luminance */ +- put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); +- } else { +- /* chrominance */ +- put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); +- } +-#else +- int size, v; +- /* find number of bits */ +- size = 0; +- v = abs(level); +- while (v) { +- v >>= 1; +- size++; +- } +- +- if (n < 4) { +- /* luminance */ +- put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); +- } else { +- /* chrominance */ +- put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); +- } +- +- /* encode remaining bits */ +- if (size > 0) { +- if (level < 0) +- level = (-level) ^ ((1 << size) - 1); +- put_bits(&s->pb, size, level); +- if (size > 8) +- put_bits(&s->pb, 1, 1); +- } +-#endif +-} +- +-static inline int mpeg4_get_dc_length(int level, int n){ +- if (n < 4) { +- return uni_DCtab_lum_len[level + 256]; +- } else { +- return uni_DCtab_chrom_len[level + 256]; +- } +-} +- +-/** +- * encodes a 8x8 block +- * @param n block index (0-3 are luma, 4-5 are chroma) +- */ +-static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, +- uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) +-{ +- int i, last_non_zero; +-#if 0 //variables for the outcommented version +- int code, sign, last; +-#endif +- const RLTable *rl; +- uint32_t *bits_tab; +- uint8_t *len_tab; +- const int last_index = s->block_last_index[n]; +- +- if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away +- /* mpeg4 based DC predictor */ +- mpeg4_encode_dc(dc_pb, intra_dc, n); +- if(last_index<1) return; +- i = 1; +- rl = &rl_intra; +- bits_tab= uni_mpeg4_intra_rl_bits; +- len_tab = uni_mpeg4_intra_rl_len; +- } else { +- if(last_index<0) return; +- i = 0; +- rl = &rl_inter; +- bits_tab= uni_mpeg4_inter_rl_bits; +- len_tab = uni_mpeg4_inter_rl_len; +- } +- +- /* AC coefs */ +- last_non_zero = i - 1; +-#if 1 +- for (; i < last_index; i++) { +- int level = block[ scan_table[i] ]; +- if (level) { +- int run = i - last_non_zero - 1; +- level+=64; +- if((level&(~127)) == 0){ +- const int index= UNI_MPEG4_ENC_INDEX(0, run, level); +- put_bits(ac_pb, len_tab[index], bits_tab[index]); +- }else{ //ESC3 +- 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); +- } +- last_non_zero = i; +- } +- } +- /*if(i<=last_index)*/{ +- int level = block[ scan_table[i] ]; +- int run = i - last_non_zero - 1; +- level+=64; +- if((level&(~127)) == 0){ +- const int index= UNI_MPEG4_ENC_INDEX(1, run, level); +- put_bits(ac_pb, len_tab[index], bits_tab[index]); +- }else{ //ESC3 +- 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); +- } +- } +-#else +- for (; i <= last_index; i++) { +- const int slevel = block[ scan_table[i] ]; +- if (slevel) { +- int level; +- int run = i - last_non_zero - 1; +- last = (i == last_index); +- sign = 0; +- level = slevel; +- if (level < 0) { +- sign = 1; +- level = -level; +- } +- code = get_rl_index(rl, last, run, level); +- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); +- if (code == rl->n) { +- int level1, run1; +- level1 = level - rl->max_level[last][run]; +- if (level1 < 1) +- goto esc2; +- code = get_rl_index(rl, last, run, level1); +- if (code == rl->n) { +- esc2: +- put_bits(ac_pb, 1, 1); +- if (level > MAX_LEVEL) +- goto esc3; +- run1 = run - rl->max_run[last][level] - 1; +- if (run1 < 0) +- goto esc3; +- code = get_rl_index(rl, last, run1, level); +- if (code == rl->n) { +- esc3: +- /* third escape */ +- put_bits(ac_pb, 1, 1); +- put_bits(ac_pb, 1, last); +- put_bits(ac_pb, 6, run); +- put_bits(ac_pb, 1, 1); +- put_bits(ac_pb, 12, slevel & 0xfff); +- put_bits(ac_pb, 1, 1); +- } else { +- /* second escape */ +- put_bits(ac_pb, 1, 0); +- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); +- put_bits(ac_pb, 1, sign); +- } +- } else { +- /* first escape */ +- put_bits(ac_pb, 1, 0); +- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); +- put_bits(ac_pb, 1, sign); +- } +- } else { +- put_bits(ac_pb, 1, sign); +- } +- last_non_zero = i; +- } +- } +-#endif +-} +- + static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, + uint8_t *scan_table) + { +@@ -3393,10 +3386,57 @@ + } + + /** +- * decodes first partition. +- * @return number of MBs decoded or <0 if an error occured ++ * decodes the dc value. ++ * @param n block index (0-3 are luma, 4-5 are chroma) ++ * @param dir_ptr the prediction direction will be stored here ++ * @return the quantized dc + */ +-static int mpeg4_decode_partition_a(MpegEncContext *s){ ++static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) ++{ ++ int level, code; ++ ++ if (n < 4) ++ code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); ++ else ++ code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); ++ if (code < 0 || code > 9 /* && s->nbit<9 */){ ++ av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); ++ return -1; ++ } ++ if (code == 0) { ++ level = 0; ++ } else { ++ if(IS_3IV1){ ++ if(code==1) ++ level= 2*get_bits1(&s->gb)-1; ++ else{ ++ if(get_bits1(&s->gb)) ++ level = get_bits(&s->gb, code-1) + (1<<(code-1)); ++ else ++ level = -get_bits(&s->gb, code-1) - (1<<(code-1)); ++ } ++ }else{ ++ level = get_xbits(&s->gb, code); ++ } ++ ++ if (code > 8){ ++ if(get_bits1(&s->gb)==0){ /* marker */ ++ if(s->error_resilience>=2){ ++ av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); ++ return -1; ++ } ++ } ++ } ++ } ++ ++ return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); ++} ++ ++/** ++ * decodes first partition. ++ * @return number of MBs decoded or <0 if an error occured ++ */ ++static int mpeg4_decode_partition_a(MpegEncContext *s){ + int mb_num; + static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; + +@@ -3698,116 +3738,371 @@ + } + + /** +- * decode partition C of one MB. ++ * decodes a block. + * @return <0 if an error occured + */ +-static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) ++static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, ++ int n, int coded, int intra, int rvlc) + { +- int cbp, mb_type; +- const int xy= s->mb_x + s->mb_y*s->mb_stride; +- +- mb_type= s->current_picture.mb_type[xy]; +- cbp = s->cbp_table[xy]; ++ int level, i, last, run; ++ int dc_pred_dir; ++ RLTable * rl; ++ RL_VLC_ELEM * rl_vlc; ++ const uint8_t * scan_table; ++ int qmul, qadd; + +- if(s->current_picture.qscale_table[xy] != s->qscale){ +- ff_set_qscale(s, s->current_picture.qscale_table[xy] ); +- } ++ //Note intra & rvlc should be optimized away if this is inlined + +- if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { +- int i; +- for(i=0; i<4; i++){ +- s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; +- s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; ++ if(intra) { ++ if(s->qscale < s->intra_dc_threshold){ ++ /* DC coef */ ++ if(s->partitioned_frame){ ++ level = s->dc_val[0][ s->block_index[n] ]; ++ if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); ++ else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); ++ dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; ++ }else{ ++ level = mpeg4_decode_dc(s, n, &dc_pred_dir); ++ if (level < 0) ++ return -1; + } +- s->mb_intra = IS_INTRA(mb_type); ++ block[0] = level; ++ i = 0; ++ }else{ ++ i = -1; ++ } ++ if (!coded) ++ goto not_coded; ++ ++ if(rvlc){ ++ rl = &rvlc_rl_intra; ++ rl_vlc = rvlc_rl_intra.rl_vlc[0]; ++ }else{ ++ rl = &rl_intra; ++ rl_vlc = rl_intra.rl_vlc[0]; ++ } ++ if (s->ac_pred) { ++ if (dc_pred_dir == 0) ++ scan_table = s->intra_v_scantable.permutated; /* left */ ++ else ++ scan_table = s->intra_h_scantable.permutated; /* top */ ++ } else { ++ scan_table = s->intra_scantable.permutated; ++ } ++ qmul=1; ++ qadd=0; ++ } else { ++ i = -1; ++ if (!coded) { ++ s->block_last_index[n] = i; ++ return 0; ++ } ++ if(rvlc) rl = &rvlc_rl_inter; ++ else rl = &rl_inter; ++ ++ scan_table = s->intra_scantable.permutated; + +- if (IS_SKIP(mb_type)) { +- /* skip mb */ +- for(i=0;i<6;i++) +- s->block_last_index[i] = -1; +- s->mv_dir = MV_DIR_FORWARD; +- s->mv_type = MV_TYPE_16X16; +- if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ +- s->mcsel=1; +- s->mb_skipped = 0; ++ if(s->mpeg_quant){ ++ qmul=1; ++ qadd=0; ++ if(rvlc){ ++ rl_vlc = rvlc_rl_inter.rl_vlc[0]; + }else{ +- s->mcsel=0; +- s->mb_skipped = 1; ++ rl_vlc = rl_inter.rl_vlc[0]; + } +- }else if(s->mb_intra){ +- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); +- }else if(!s->mb_intra){ +-// s->mcsel= 0; //FIXME do we need to init that +- +- s->mv_dir = MV_DIR_FORWARD; +- if (IS_8X8(mb_type)) { +- s->mv_type = MV_TYPE_8X8; +- } else { +- s->mv_type = MV_TYPE_16X16; ++ }else{ ++ qmul = s->qscale << 1; ++ qadd = (s->qscale - 1) | 1; ++ if(rvlc){ ++ rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; ++ }else{ ++ rl_vlc = rl_inter.rl_vlc[s->qscale]; + } + } +- } else { /* I-Frame */ +- s->mb_intra = 1; +- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); + } ++ { ++ OPEN_READER(re, &s->gb); ++ for(;;) { ++ UPDATE_CACHE(re, &s->gb); ++ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); ++ if (level==0) { ++ /* escape */ ++ if(rvlc){ ++ if(SHOW_UBITS(re, &s->gb, 1)==0){ ++ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); ++ return -1; ++ }; SKIP_CACHE(re, &s->gb, 1); ++ ++ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); ++ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); ++ SKIP_COUNTER(re, &s->gb, 1+1+6); ++ UPDATE_CACHE(re, &s->gb); ++ ++ if(SHOW_UBITS(re, &s->gb, 1)==0){ ++ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); ++ return -1; ++ }; SKIP_CACHE(re, &s->gb, 1); ++ ++ level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); ++ ++ if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ ++ av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); ++ return -1; ++ }; SKIP_CACHE(re, &s->gb, 5); + +- if (!IS_SKIP(mb_type)) { +- int i; +- s->dsp.clear_blocks(s->block[0]); +- /* decode each block */ +- for (i = 0; i < 6; i++) { +- if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ +- av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); +- return -1; +- } +- cbp+=cbp; +- } +- } ++ level= level * qmul + qadd; ++ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); ++ SKIP_COUNTER(re, &s->gb, 1+11+5+1); + +- /* per-MB end of slice check */ ++ i+= run + 1; ++ if(last) i+=192; ++ }else{ ++ int cache; ++ cache= GET_CACHE(re, &s->gb); + +- if(--s->mb_num_left <= 0){ +-//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); +- if(mpeg4_is_resync(s)) +- return SLICE_END; +- else +- return SLICE_NOEND; +- }else{ +- if(mpeg4_is_resync(s)){ +- const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; +- if(s->cbp_table[xy+delta]) +- return SLICE_END; +- } +- return SLICE_OK; +- } +-} ++ if(IS_3IV1) ++ cache ^= 0xC0000000; + +-/** +- * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) +- */ +-static void preview_obmc(MpegEncContext *s){ +- GetBitContext gb= s->gb; +- +- int cbpc, i, pred_x, pred_y, mx, my; +- int16_t *mot_val; +- const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; +- const int stride= s->b8_stride*2; +- +- for(i=0; i<4; i++) +- s->block_index[i]+= 2; +- for(i=4; i<6; i++) +- s->block_index[i]+= 1; +- s->mb_x++; +- +- assert(s->pict_type == P_TYPE); ++ if (cache&0x80000000) { ++ if (cache&0x40000000) { ++ /* third escape */ ++ SKIP_CACHE(re, &s->gb, 2); ++ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); ++ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); ++ SKIP_COUNTER(re, &s->gb, 2+1+6); ++ UPDATE_CACHE(re, &s->gb); + +- do{ +- if (get_bits1(&s->gb)) { +- /* skip mb */ +- mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; +- mot_val[0 ]= mot_val[2 ]= +- mot_val[0+stride]= mot_val[2+stride]= 0; +- mot_val[1 ]= mot_val[3 ]= ++ if(IS_3IV1){ ++ level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); ++ }else{ ++ if(SHOW_UBITS(re, &s->gb, 1)==0){ ++ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); ++ return -1; ++ }; SKIP_CACHE(re, &s->gb, 1); ++ ++ level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); ++ ++ if(SHOW_UBITS(re, &s->gb, 1)==0){ ++ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); ++ return -1; ++ }; LAST_SKIP_CACHE(re, &s->gb, 1); ++ ++ SKIP_COUNTER(re, &s->gb, 1+12+1); ++ } ++ ++#if 0 ++ if(s->error_resilience >= FF_ER_COMPLIANT){ ++ const int abs_level= ABS(level); ++ if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ ++ const int run1= run - rl->max_run[last][abs_level] - 1; ++ if(abs_level <= rl->max_level[last][run]){ ++ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); ++ return -1; ++ } ++ if(s->error_resilience > FF_ER_COMPLIANT){ ++ if(abs_level <= rl->max_level[last][run]*2){ ++ fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); ++ return -1; ++ } ++ if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ ++ fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); ++ return -1; ++ } ++ } ++ } ++ } ++#endif ++ if (level>0) level= level * qmul + qadd; ++ else level= level * qmul - qadd; ++ ++ if((unsigned)(level + 2048) > 4095){ ++ if(s->error_resilience > FF_ER_COMPLIANT){ ++ if(level > 2560 || level<-2560){ ++ av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); ++ return -1; ++ } ++ } ++ level= level<0 ? -2048 : 2047; ++ } ++ ++ i+= run + 1; ++ if(last) i+=192; ++ } else { ++ /* second escape */ ++#if MIN_CACHE_BITS < 20 ++ LAST_SKIP_BITS(re, &s->gb, 2); ++ UPDATE_CACHE(re, &s->gb); ++#else ++ SKIP_BITS(re, &s->gb, 2); ++#endif ++ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); ++ i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing ++ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); ++ LAST_SKIP_BITS(re, &s->gb, 1); ++ } ++ } else { ++ /* first escape */ ++#if MIN_CACHE_BITS < 19 ++ LAST_SKIP_BITS(re, &s->gb, 1); ++ UPDATE_CACHE(re, &s->gb); ++#else ++ SKIP_BITS(re, &s->gb, 1); ++#endif ++ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); ++ i+= run; ++ level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing ++ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); ++ LAST_SKIP_BITS(re, &s->gb, 1); ++ } ++ } ++ } else { ++ i+= run; ++ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); ++ LAST_SKIP_BITS(re, &s->gb, 1); ++ } ++ if (i > 62){ ++ i-= 192; ++ if(i&(~63)){ ++ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); ++ return -1; ++ } ++ ++ block[scan_table[i]] = level; ++ break; ++ } ++ ++ block[scan_table[i]] = level; ++ } ++ CLOSE_READER(re, &s->gb); ++ } ++ not_coded: ++ if (intra) { ++ if(s->qscale >= s->intra_dc_threshold){ ++ block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); ++ ++ if(i == -1) i=0; ++ } ++ ++ mpeg4_pred_ac(s, block, n, dc_pred_dir); ++ if (s->ac_pred) { ++ i = 63; /* XXX: not optimal */ ++ } ++ } ++ s->block_last_index[n] = i; ++ return 0; ++} ++ ++/** ++ * decode partition C of one MB. ++ * @return <0 if an error occured ++ */ ++static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) ++{ ++ int cbp, mb_type; ++ const int xy= s->mb_x + s->mb_y*s->mb_stride; ++ ++ mb_type= s->current_picture.mb_type[xy]; ++ cbp = s->cbp_table[xy]; ++ ++ if(s->current_picture.qscale_table[xy] != s->qscale){ ++ ff_set_qscale(s, s->current_picture.qscale_table[xy] ); ++ } ++ ++ if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { ++ int i; ++ for(i=0; i<4; i++){ ++ s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; ++ s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; ++ } ++ s->mb_intra = IS_INTRA(mb_type); ++ ++ if (IS_SKIP(mb_type)) { ++ /* skip mb */ ++ for(i=0;i<6;i++) ++ s->block_last_index[i] = -1; ++ s->mv_dir = MV_DIR_FORWARD; ++ s->mv_type = MV_TYPE_16X16; ++ if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ ++ s->mcsel=1; ++ s->mb_skipped = 0; ++ }else{ ++ s->mcsel=0; ++ s->mb_skipped = 1; ++ } ++ }else if(s->mb_intra){ ++ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); ++ }else if(!s->mb_intra){ ++// s->mcsel= 0; //FIXME do we need to init that ++ ++ s->mv_dir = MV_DIR_FORWARD; ++ if (IS_8X8(mb_type)) { ++ s->mv_type = MV_TYPE_8X8; ++ } else { ++ s->mv_type = MV_TYPE_16X16; ++ } ++ } ++ } else { /* I-Frame */ ++ s->mb_intra = 1; ++ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); ++ } ++ ++ if (!IS_SKIP(mb_type)) { ++ int i; ++ s->dsp.clear_blocks(s->block[0]); ++ /* decode each block */ ++ for (i = 0; i < 6; i++) { ++ if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ ++ av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); ++ return -1; ++ } ++ cbp+=cbp; ++ } ++ } ++ ++ /* per-MB end of slice check */ ++ ++ if(--s->mb_num_left <= 0){ ++//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); ++ if(mpeg4_is_resync(s)) ++ return SLICE_END; ++ else ++ return SLICE_NOEND; ++ }else{ ++ if(mpeg4_is_resync(s)){ ++ const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; ++ if(s->cbp_table[xy+delta]) ++ return SLICE_END; ++ } ++ return SLICE_OK; ++ } ++} ++ ++/** ++ * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) ++ */ ++static void preview_obmc(MpegEncContext *s){ ++ GetBitContext gb= s->gb; ++ ++ int cbpc, i, pred_x, pred_y, mx, my; ++ int16_t *mot_val; ++ const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; ++ const int stride= s->b8_stride*2; ++ ++ for(i=0; i<4; i++) ++ s->block_index[i]+= 2; ++ for(i=4; i<6; i++) ++ s->block_index[i]+= 1; ++ s->mb_x++; ++ ++ assert(s->pict_type == P_TYPE); ++ ++ do{ ++ if (get_bits1(&s->gb)) { ++ /* skip mb */ ++ mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; ++ mot_val[0 ]= mot_val[2 ]= ++ mot_val[0+stride]= mot_val[2+stride]= 0; ++ mot_val[1 ]= mot_val[3 ]= + mot_val[1+stride]= mot_val[3+stride]= 0; + + s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; +@@ -4676,308 +4971,6 @@ + return 0; + } + +-/** +- * decodes the dc value. +- * @param n block index (0-3 are luma, 4-5 are chroma) +- * @param dir_ptr the prediction direction will be stored here +- * @return the quantized dc +- */ +-static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) +-{ +- int level, code; +- +- if (n < 4) +- code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); +- else +- code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); +- if (code < 0 || code > 9 /* && s->nbit<9 */){ +- av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); +- return -1; +- } +- if (code == 0) { +- level = 0; +- } else { +- if(IS_3IV1){ +- if(code==1) +- level= 2*get_bits1(&s->gb)-1; +- else{ +- if(get_bits1(&s->gb)) +- level = get_bits(&s->gb, code-1) + (1<<(code-1)); +- else +- level = -get_bits(&s->gb, code-1) - (1<<(code-1)); +- } +- }else{ +- level = get_xbits(&s->gb, code); +- } +- +- if (code > 8){ +- if(get_bits1(&s->gb)==0){ /* marker */ +- if(s->error_resilience>=2){ +- av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); +- return -1; +- } +- } +- } +- } +- +- return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); +-} +- +-/** +- * decodes a block. +- * @return <0 if an error occured +- */ +-static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, +- int n, int coded, int intra, int rvlc) +-{ +- int level, i, last, run; +- int dc_pred_dir; +- RLTable * rl; +- RL_VLC_ELEM * rl_vlc; +- const uint8_t * scan_table; +- int qmul, qadd; +- +- //Note intra & rvlc should be optimized away if this is inlined +- +- if(intra) { +- if(s->qscale < s->intra_dc_threshold){ +- /* DC coef */ +- if(s->partitioned_frame){ +- level = s->dc_val[0][ s->block_index[n] ]; +- if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); +- else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); +- dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; +- }else{ +- level = mpeg4_decode_dc(s, n, &dc_pred_dir); +- if (level < 0) +- return -1; +- } +- block[0] = level; +- i = 0; +- }else{ +- i = -1; +- } +- if (!coded) +- goto not_coded; +- +- if(rvlc){ +- rl = &rvlc_rl_intra; +- rl_vlc = rvlc_rl_intra.rl_vlc[0]; +- }else{ +- rl = &rl_intra; +- rl_vlc = rl_intra.rl_vlc[0]; +- } +- if (s->ac_pred) { +- if (dc_pred_dir == 0) +- scan_table = s->intra_v_scantable.permutated; /* left */ +- else +- scan_table = s->intra_h_scantable.permutated; /* top */ +- } else { +- scan_table = s->intra_scantable.permutated; +- } +- qmul=1; +- qadd=0; +- } else { +- i = -1; +- if (!coded) { +- s->block_last_index[n] = i; +- return 0; +- } +- if(rvlc) rl = &rvlc_rl_inter; +- else rl = &rl_inter; +- +- scan_table = s->intra_scantable.permutated; +- +- if(s->mpeg_quant){ +- qmul=1; +- qadd=0; +- if(rvlc){ +- rl_vlc = rvlc_rl_inter.rl_vlc[0]; +- }else{ +- rl_vlc = rl_inter.rl_vlc[0]; +- } +- }else{ +- qmul = s->qscale << 1; +- qadd = (s->qscale - 1) | 1; +- if(rvlc){ +- rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; +- }else{ +- rl_vlc = rl_inter.rl_vlc[s->qscale]; +- } +- } +- } +- { +- OPEN_READER(re, &s->gb); +- for(;;) { +- UPDATE_CACHE(re, &s->gb); +- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); +- if (level==0) { +- /* escape */ +- if(rvlc){ +- if(SHOW_UBITS(re, &s->gb, 1)==0){ +- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); +- return -1; +- }; SKIP_CACHE(re, &s->gb, 1); +- +- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); +- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); +- SKIP_COUNTER(re, &s->gb, 1+1+6); +- UPDATE_CACHE(re, &s->gb); +- +- if(SHOW_UBITS(re, &s->gb, 1)==0){ +- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); +- return -1; +- }; SKIP_CACHE(re, &s->gb, 1); +- +- level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); +- +- if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ +- av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); +- return -1; +- }; SKIP_CACHE(re, &s->gb, 5); +- +- level= level * qmul + qadd; +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); +- SKIP_COUNTER(re, &s->gb, 1+11+5+1); +- +- i+= run + 1; +- if(last) i+=192; +- }else{ +- int cache; +- cache= GET_CACHE(re, &s->gb); +- +- if(IS_3IV1) +- cache ^= 0xC0000000; +- +- if (cache&0x80000000) { +- if (cache&0x40000000) { +- /* third escape */ +- SKIP_CACHE(re, &s->gb, 2); +- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); +- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); +- SKIP_COUNTER(re, &s->gb, 2+1+6); +- UPDATE_CACHE(re, &s->gb); +- +- if(IS_3IV1){ +- level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); +- }else{ +- if(SHOW_UBITS(re, &s->gb, 1)==0){ +- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); +- return -1; +- }; SKIP_CACHE(re, &s->gb, 1); +- +- level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); +- +- if(SHOW_UBITS(re, &s->gb, 1)==0){ +- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); +- return -1; +- }; LAST_SKIP_CACHE(re, &s->gb, 1); +- +- SKIP_COUNTER(re, &s->gb, 1+12+1); +- } +- +-#if 0 +- if(s->error_resilience >= FF_ER_COMPLIANT){ +- const int abs_level= ABS(level); +- if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ +- const int run1= run - rl->max_run[last][abs_level] - 1; +- if(abs_level <= rl->max_level[last][run]){ +- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); +- return -1; +- } +- if(s->error_resilience > FF_ER_COMPLIANT){ +- if(abs_level <= rl->max_level[last][run]*2){ +- fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); +- return -1; +- } +- if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ +- fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); +- return -1; +- } +- } +- } +- } +-#endif +- if (level>0) level= level * qmul + qadd; +- else level= level * qmul - qadd; +- +- if((unsigned)(level + 2048) > 4095){ +- if(s->error_resilience > FF_ER_COMPLIANT){ +- if(level > 2560 || level<-2560){ +- av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); +- return -1; +- } +- } +- level= level<0 ? -2048 : 2047; +- } +- +- i+= run + 1; +- if(last) i+=192; +- } else { +- /* second escape */ +-#if MIN_CACHE_BITS < 20 +- LAST_SKIP_BITS(re, &s->gb, 2); +- UPDATE_CACHE(re, &s->gb); +-#else +- SKIP_BITS(re, &s->gb, 2); +-#endif +- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); +- i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); +- LAST_SKIP_BITS(re, &s->gb, 1); +- } +- } else { +- /* first escape */ +-#if MIN_CACHE_BITS < 19 +- LAST_SKIP_BITS(re, &s->gb, 1); +- UPDATE_CACHE(re, &s->gb); +-#else +- SKIP_BITS(re, &s->gb, 1); +-#endif +- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); +- i+= run; +- level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); +- LAST_SKIP_BITS(re, &s->gb, 1); +- } +- } +- } else { +- i+= run; +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); +- LAST_SKIP_BITS(re, &s->gb, 1); +- } +- if (i > 62){ +- i-= 192; +- if(i&(~63)){ +- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); +- return -1; +- } +- +- block[scan_table[i]] = level; +- break; +- } +- +- block[scan_table[i]] = level; +- } +- CLOSE_READER(re, &s->gb); +- } +- not_coded: +- if (intra) { +- if(s->qscale >= s->intra_dc_threshold){ +- block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); +- +- if(i == -1) i=0; +- } +- +- mpeg4_pred_ac(s, block, n, dc_pred_dir); +- if (s->ac_pred) { +- i = 63; /* XXX: not optimal */ +- } +- } +- s->block_last_index[n] = i; +- return 0; +-} +- + /* most is hardcoded. should extend to handle all h263 streams */ + int h263_decode_picture_header(MpegEncContext *s) + { + +diff -ur /home/melanson/temp/ffmpeg/libavcodec/mlib/dsputil_mlib.c libavcodec/mlib/dsputil_mlib.c +--- /home/melanson/temp/ffmpeg/libavcodec/mlib/dsputil_mlib.c 2004-03-14 18:21:01.000000000 -0700 ++++ libavcodec/mlib/dsputil_mlib.c 2005-05-27 19:27:22.000000000 -0600 +@@ -20,6 +20,8 @@ + #include "../dsputil.h" + #include "../mpegvideo.h" + ++#include "../../../xine-utils/xineutils.h" ++ + #include <mlib_types.h> + #include <mlib_status.h> + #include <mlib_sys.h> +@@ -419,6 +421,7 @@ + + void dsputil_init_mlib(DSPContext* c, AVCodecContext *avctx) + { ++ if (xine_mm_accel() & MM_ACCEL_MLIB) { + c->get_pixels = get_pixels_mlib; + c->diff_pixels = diff_pixels_mlib; + c->add_pixels_clamped = add_pixels_clamped_mlib; +@@ -445,10 +448,12 @@ + c->put_no_rnd_pixels_tab[1][0] = put_pixels8_mlib; + + c->bswap_buf = bswap_buf_mlib; ++ } + } + + void MPV_common_init_mlib(MpegEncContext *s) + { ++ if (xine_mm_accel() & MM_ACCEL_MLIB) { + if(s->avctx->dct_algo==FF_DCT_AUTO || s->avctx->dct_algo==FF_DCT_MLIB){ + s->dsp.fdct = ff_fdct_mlib; + } +@@ -459,4 +464,5 @@ + s->dsp.idct = ff_idct_mlib; + s->dsp.idct_permutation_type= FF_NO_IDCT_PERM; + } ++ } + } +diff -ur /home/melanson/temp/ffmpeg/libavcodec/motion_est.c libavcodec/motion_est.c +--- /home/melanson/temp/ffmpeg/libavcodec/motion_est.c 2005-05-05 20:53:15.000000000 -0600 ++++ libavcodec/motion_est.c 2005-05-27 18:42:06.000000000 -0600 @@ -20,6 +20,9 @@ * * new Motion Estimation (X1/EPZS) by Michael Niedermayer <michaelni@gmx.at> @@ -82,8 +1535,30 @@ } + +#endif /* CONFIG_ENCODERS */ ---- /home/melanson/temp/ffmpeg/libavcodec/mpeg12.c 2005-05-05 20:53:15.191613392 -0600 -+++ libavcodec/mpeg12.c 2005-05-05 21:30:43.779776032 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/motion_est_template.c libavcodec/motion_est_template.c +--- /home/melanson/temp/ffmpeg/libavcodec/motion_est_template.c 2005-04-18 20:41:45.000000000 -0600 ++++ libavcodec/motion_est_template.c 2005-05-27 18:42:06.000000000 -0600 +@@ -231,7 +231,7 @@ + return dmin; + } + +-int inline ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, ++int __inline__ ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, + int ref_index, int size, int h, int add_rate) + { + // const int check_luma= s->dsp.me_sub_cmp != s->dsp.mb_cmp; +@@ -962,7 +962,7 @@ + } + + //this function is dedicated to the braindamaged gcc +-inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, ++int __inline__ ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, + int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], + int ref_mv_scale, int size, int h) + { +diff -ur /home/melanson/temp/ffmpeg/libavcodec/mpeg12.c libavcodec/mpeg12.c +--- /home/melanson/temp/ffmpeg/libavcodec/mpeg12.c 2005-05-27 17:42:54.000000000 -0600 ++++ libavcodec/mpeg12.c 2005-05-27 18:42:06.000000000 -0600 @@ -34,6 +34,13 @@ //#include <assert.h> @@ -98,7 +1573,7 @@ /* Start codes. */ #define SEQ_END_CODE 0x000001b7 #define SEQ_START_CODE 0x000001b3 -@@ -65,21 +65,6 @@ +@@ -58,21 +65,6 @@ int component); static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code); // RAL: f_code parameter added #endif //CONFIG_ENCODERS @@ -120,7 +1595,7 @@ static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); static void exchange_uv(MpegEncContext *s); -@@ -1054,479 +1039,430 @@ +@@ -1047,479 +1039,430 @@ #define MT_16X8 2 #define MT_DMV 3 @@ -877,7 +2352,7 @@ -static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) -{ - int code, sign, val, l, shift; -- + - code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); - if (code == 0) { - return pred; @@ -924,7 +2399,7 @@ - } - return diff; -} - +- -static inline int mpeg1_decode_block_intra(MpegEncContext *s, +static inline int mpeg2_decode_block_intra(MpegEncContext *s, DCTELEM *block, @@ -969,7 +2444,7 @@ { OPEN_READER(re, &s->gb); /* now quantify & encode AC coefs */ -@@ -1540,487 +1476,536 @@ +@@ -1533,487 +1476,536 @@ i += run; j = scantable[i]; level= (level*qscale*quant_matrix[j])>>4; @@ -1165,19 +2640,15 @@ - SKIP_BITS(re, &s->gb, 2); - if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) - goto end; -- } + dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); - -- /* now quantify & encode AC coefs */ -- for(;;) { -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); ++ + assert(s->mb_skipped==0); + + if (s->mb_skip_run-- != 0) { + if(s->pict_type == I_TYPE){ + av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); + return -1; -+ } + } + + /* skip mb */ + s->mb_intra = 0; @@ -1198,36 +2669,7 @@ + s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; + } else { + int mb_type; - -- if(level != 0) { -- i += run; -- j = scantable[i]; -- level= ((level*2+1)*qscale)>>1; -- level= (level-1)|1; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- SKIP_BITS(re, &s->gb, 1); -- } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); -- if (level == -128) { -- level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); -- } else if (level == 0) { -- level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); -- } -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= -level; -- level= ((level*2+1)*qscale)>>1; -- level= (level-1)|1; -- level= -level; -- }else{ -- level= ((level*2+1)*qscale)>>1; -- level= (level-1)|1; -- } -- } ++ + if(s->mb_x) + mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; + else @@ -1241,61 +2683,20 @@ + s->mv[1][0][0] = s->last_mv[1][0][0]; + s->mv[1][0][1] = s->last_mv[1][0][1]; -- block[j] = level; -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- break; -- UPDATE_CACHE(re, &s->gb); +- /* now quantify & encode AC coefs */ +- for(;;) { +- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); + s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= + mb_type | MB_TYPE_SKIP; +// assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8)); + + if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) + s->mb_skipped = 1; - } --end: -- LAST_SKIP_BITS(re, &s->gb, 2); -- CLOSE_READER(re, &s->gb); -- } -- s->block_last_index[n] = i; -- return 0; --} - ++ } ++ + return 0; + } - --static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) --{ -- int level, i, j, run; -- RLTable *rl = &rl_mpeg1; -- uint8_t * const scantable= s->intra_scantable.permutated; -- const uint16_t *quant_matrix; -- const int qscale= s->qscale; -- int mismatch; -- -- mismatch = 1; -- -- { -- OPEN_READER(re, &s->gb); -- i = -1; -- if (n < 4) -- quant_matrix = s->inter_matrix; -- else -- quant_matrix = s->chroma_inter_matrix; -- -- /* special case for the first coef. no need to add a second vlc table */ -- UPDATE_CACHE(re, &s->gb); -- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -- level= (3*qscale*quant_matrix[0])>>5; -- if(GET_CACHE(re, &s->gb)&0x40000000) -- level= -level; -- block[0] = level; -- mismatch ^= level; -- i++; -- SKIP_BITS(re, &s->gb, 2); -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- goto end; ++ + switch(s->pict_type) { + default: + case I_TYPE: @@ -1339,11 +2740,8 @@ + if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? + !s->frame_pred_frame_dct) { + s->interlaced_dct = get_bits1(&s->gb); - } - -- /* now quantify & encode AC coefs */ -- for(;;) { -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); ++ } ++ + if (IS_QUANT(mb_type)) + s->qscale = get_qscale(s); + @@ -1355,26 +2753,24 @@ - if(level != 0) { - i += run; - j = scantable[i]; -- level= ((level*2+1)*qscale*quant_matrix[j])>>5; +- level= ((level*2+1)*qscale)>>1; +- level= (level-1)|1; - level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); - SKIP_BITS(re, &s->gb, 1); - } else { - /* escape */ - run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); - UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); +- level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); +- if (level == -128) { +- level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); +- } else if (level == 0) { +- level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); + s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = + mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); + s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = + mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); - -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= ((-level*2+1)*qscale*quant_matrix[j])>>5; -- level= -level; -- }else{ -- level= ((level*2+1)*qscale*quant_matrix[j])>>5; ++ + skip_bits1(&s->gb); /* marker */ + }else + memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ @@ -1393,88 +2789,54 @@ + if(s->flags2 & CODEC_FLAG2_FAST){ + for(i=0;i<6;i++) { + mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); -+ } + } +- i += run; +- j = scantable[i]; +- if(level<0){ +- level= -level; +- level= ((level*2+1)*qscale)>>1; +- level= (level-1)|1; +- level= -level; +- }else{ +- level= ((level*2+1)*qscale)>>1; +- level= (level-1)|1; + }else{ + for(i=0;i<mb_block_count;i++) { + if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) + return -1; } } -- if (i > 63){ -- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); -- return -1; + } else { + for(i=0;i<6;i++) { + if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) + return -1; - } -- -- mismatch ^= level; ++ } ++ } ++ } else { ++ if (mb_type & MB_TYPE_ZERO_MV){ ++ assert(mb_type & MB_TYPE_CBP); ++ ++ /* compute dct type */ ++ if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? ++ !s->frame_pred_frame_dct) { ++ s->interlaced_dct = get_bits1(&s->gb); ++ } + - block[j] = level; - if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) - break; - UPDATE_CACHE(re, &s->gb); - } +- } -end: - LAST_SKIP_BITS(re, &s->gb, 2); - CLOSE_READER(re, &s->gb); - } -- block[63] ^= (mismatch & 1); -- - s->block_last_index[n] = i; - return 0; -} -+ } else { -+ if (mb_type & MB_TYPE_ZERO_MV){ -+ assert(mb_type & MB_TYPE_CBP); - --static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) --{ -- int level, i, j, run; -- RLTable *rl = &rl_mpeg1; -- uint8_t * const scantable= s->intra_scantable.permutated; -- const int qscale= s->qscale; -- int v; -- OPEN_READER(re, &s->gb); -- i = -1; -+ /* compute dct type */ -+ if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -+ !s->frame_pred_frame_dct) { -+ s->interlaced_dct = get_bits1(&s->gb); -+ } - -- /* special case for the first coef. no need to add a second vlc table */ -- UPDATE_CACHE(re, &s->gb); -- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -- level= (3*qscale)>>1; -- if(GET_CACHE(re, &s->gb)&0x40000000) -- level= -level; -- block[0] = level; -- i++; -- SKIP_BITS(re, &s->gb, 2); -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- goto end; -- } + if (IS_QUANT(mb_type)) + s->qscale = get_qscale(s); -- /* now quantify & encode AC coefs */ -- for(;;) { -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -- -- if(level != 0) { -- i += run; -- j = scantable[i]; -- level= ((level*2+1)*qscale)>>1; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- SKIP_BITS(re, &s->gb, 1); -- } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); + s->mv_dir = MV_DIR_FORWARD; + if(s->picture_structure == PICT_FRAME) + s->mv_type = MV_TYPE_16X16; @@ -1499,22 +2861,33 @@ + motion_type = get_bits(&s->gb, 2); + } -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= ((-level*2+1)*qscale)>>1; -- level= -level; -- }else{ -- level= ((level*2+1)*qscale)>>1; +-static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, +- DCTELEM *block, +- int n) +-{ +- int level, i, j, run; +- RLTable *rl = &rl_mpeg1; +- uint8_t * const scantable= s->intra_scantable.permutated; +- const uint16_t *quant_matrix; +- const int qscale= s->qscale; +- int mismatch; + /* compute dct type */ + if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? + !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { + s->interlaced_dct = get_bits1(&s->gb); + } -+ + +- mismatch = 1; + if (IS_QUANT(mb_type)) + s->qscale = get_qscale(s); -+ + +- { +- OPEN_READER(re, &s->gb); +- i = -1; +- if (n < 4) +- quant_matrix = s->inter_matrix; +- else +- quant_matrix = s->chroma_inter_matrix; + /* motion vectors */ + s->mv_dir = 0; + for(i=0;i<2;i++) { @@ -1583,7 +2956,20 @@ + case MT_DMV: + { + int dmx, dmy, mx, my, m; -+ + +- /* special case for the first coef. no need to add a second vlc table */ +- UPDATE_CACHE(re, &s->gb); +- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { +- level= (3*qscale*quant_matrix[0])>>5; +- if(GET_CACHE(re, &s->gb)&0x40000000) +- level= -level; +- block[0] = level; +- mismatch ^= level; +- i++; +- SKIP_BITS(re, &s->gb, 2); +- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) +- goto end; +- } + mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], + s->last_mv[i][0][0]); + s->last_mv[i][0][0] = mx; @@ -1593,22 +2979,111 @@ + s->last_mv[i][0][1] >> 1); + dmy = get_dmv(s); + s->mv_type = MV_TYPE_DMV; -+ -+ + +- /* now quantify & encode AC coefs */ +- for(;;) { +- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); +- +- if(level != 0) { +- i += run; +- j = scantable[i]; +- level= ((level*2+1)*qscale*quant_matrix[j])>>5; +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); +- SKIP_BITS(re, &s->gb, 1); +- } else { +- /* escape */ +- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); +- UPDATE_CACHE(re, &s->gb); +- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); + +- i += run; +- j = scantable[i]; +- if(level<0){ +- level= ((-level*2+1)*qscale*quant_matrix[j])>>5; +- level= -level; +- }else{ +- level= ((level*2+1)*qscale*quant_matrix[j])>>5; +- } +- } +- if (i > 63){ +- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); +- return -1; +- } +- +- mismatch ^= level; +- block[j] = level; +- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) +- break; +- UPDATE_CACHE(re, &s->gb); +- } +-end: +- LAST_SKIP_BITS(re, &s->gb, 2); +- CLOSE_READER(re, &s->gb); +- } +- block[63] ^= (mismatch & 1); +- +- s->block_last_index[n] = i; +- return 0; +-} + s->last_mv[i][0][1] = my<<1; + s->last_mv[i][1][1] = my<<1; -+ + +-static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, +- DCTELEM *block, +- int n) +-{ +- int level, i, j, run; +- RLTable *rl = &rl_mpeg1; +- uint8_t * const scantable= s->intra_scantable.permutated; +- const int qscale= s->qscale; +- int v; +- OPEN_READER(re, &s->gb); +- i = -1; + s->mv[i][0][0] = mx; + s->mv[i][0][1] = my; + s->mv[i][1][0] = mx;//not used + s->mv[i][1][1] = my;//not used -+ + +- /* special case for the first coef. no need to add a second vlc table */ +- UPDATE_CACHE(re, &s->gb); +- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { +- level= (3*qscale)>>1; +- if(GET_CACHE(re, &s->gb)&0x40000000) +- level= -level; +- block[0] = level; +- i++; +- SKIP_BITS(re, &s->gb, 2); +- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) +- goto end; +- } + if (s->picture_structure == PICT_FRAME) { + mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; -+ + +- /* now quantify & encode AC coefs */ +- for(;;) { +- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); +- +- if(level != 0) { +- i += run; +- j = scantable[i]; +- level= ((level*2+1)*qscale)>>1; +- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); +- SKIP_BITS(re, &s->gb, 1); +- } else { +- /* escape */ +- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); +- UPDATE_CACHE(re, &s->gb); +- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); + //m = 1 + 2 * s->top_field_first; + m = s->top_field_first ? 1 : 3; -+ + +- i += run; +- j = scantable[i]; +- if(level<0){ +- level= ((-level*2+1)*qscale)>>1; +- level= -level; +- }else{ +- level= ((level*2+1)*qscale)>>1; + /* top -> top pred */ + s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; + s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; @@ -1894,8 +3369,9 @@ } typedef struct Mpeg1Context { ---- /home/melanson/temp/ffmpeg/libavcodec/mpegvideo.c 2005-05-05 20:53:15.787522800 -0600 -+++ libavcodec/mpegvideo.c 2005-05-05 21:35:14.680592848 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/mpegvideo.c libavcodec/mpegvideo.c +--- /home/melanson/temp/ffmpeg/libavcodec/mpegvideo.c 2005-05-27 17:42:54.000000000 -0600 ++++ libavcodec/mpegvideo.c 2005-05-27 18:42:06.000000000 -0600 @@ -38,6 +38,14 @@ //#undef NDEBUG //#include <assert.h> @@ -1911,7 +3387,7 @@ #ifdef CONFIG_ENCODERS static void encode_picture(MpegEncContext *s, int picture_number); #endif //CONFIG_ENCODERS -@@ -1103,6 +1111,8 @@ +@@ -1108,6 +1116,8 @@ s->low_delay= 0; //s->max_b_frames ? 0 : 1; avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); break; @@ -1920,7 +3396,7 @@ case CODEC_ID_MPEG2VIDEO: s->out_format = FMT_MPEG1; s->low_delay= 0; //s->max_b_frames ? 0 : 1; -@@ -1237,6 +1247,7 @@ +@@ -1242,6 +1252,7 @@ avctx->delay=0; s->low_delay=1; break; @@ -1928,7 +3404,7 @@ default: return -1; } -@@ -1258,6 +1269,8 @@ +@@ -1263,6 +1274,8 @@ ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp); ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp); @@ -1937,7 +3413,7 @@ #ifdef CONFIG_H261_ENCODER if (s->out_format == FMT_H261) ff_h261_encode_init(s); -@@ -1266,6 +1279,8 @@ +@@ -1271,6 +1284,8 @@ h263_encode_init(s); if(s->msmpeg4_version) ff_msmpeg4_encode_init(s); @@ -1946,7 +3422,7 @@ if (s->out_format == FMT_MPEG1) ff_mpeg1_encode_init(s); -@@ -1314,9 +1329,12 @@ +@@ -1319,9 +1334,12 @@ ff_rate_control_uninit(s); @@ -1959,7 +3435,7 @@ av_freep(&avctx->extradata); -@@ -2345,8 +2363,11 @@ +@@ -2350,8 +2368,11 @@ MPV_frame_end(s); @@ -1971,7 +3447,7 @@ if(s->flags&CODEC_FLAG_PASS1) ff_write_pass1_stats(s); -@@ -4285,6 +4306,8 @@ +@@ -4290,6 +4311,8 @@ case CODEC_ID_MPEG1VIDEO: case CODEC_ID_MPEG2VIDEO: mpeg1_encode_mb(s, s->block, motion_x, motion_y); break; @@ -1980,7 +3456,7 @@ case CODEC_ID_MPEG4: mpeg4_encode_mb(s, s->block, motion_x, motion_y); break; case CODEC_ID_MSMPEG4V2: -@@ -4305,6 +4328,7 @@ +@@ -4310,6 +4333,7 @@ h263_encode_mb(s, s->block, motion_x, motion_y); break; case CODEC_ID_MJPEG: mjpeg_encode_mb(s, s->block); break; @@ -1988,7 +3464,7 @@ default: assert(0); } -@@ -4520,6 +4544,8 @@ +@@ -4525,6 +4549,8 @@ +sse(s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize); } @@ -1997,7 +3473,7 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){ MpegEncContext *s= arg; -@@ -4563,6 +4589,7 @@ +@@ -4568,6 +4594,7 @@ } return 0; } @@ -2005,7 +3481,7 @@ static int mb_var_thread(AVCodecContext *c, void *arg){ MpegEncContext *s= arg; -@@ -4587,6 +4614,8 @@ +@@ -4592,6 +4619,8 @@ } static void write_slice_end(MpegEncContext *s){ @@ -2014,7 +3490,7 @@ if(s->codec_id==CODEC_ID_MPEG4){ if(s->partitioned_frame){ ff_mpeg4_merge_partitions(s); -@@ -4596,6 +4625,7 @@ +@@ -4601,6 +4630,7 @@ }else if(s->out_format == FMT_MJPEG){ ff_mjpeg_stuffing(&s->pb); } @@ -2022,7 +3498,7 @@ align_put_bits(&s->pb); flush_put_bits(&s->pb); -@@ -4649,10 +4679,13 @@ +@@ -4654,10 +4684,13 @@ case CODEC_ID_FLV1: s->gob_index = ff_h263_get_gob_height(s); break; @@ -2036,7 +3512,7 @@ } s->resync_mb_x=0; -@@ -4725,9 +4758,12 @@ +@@ -4730,9 +4763,12 @@ if(s->start_mb_y != mb_y || mb_x!=0){ write_slice_end(s); @@ -2049,7 +3525,7 @@ } assert((put_bits_count(&s->pb)&7) == 0); -@@ -4751,19 +4787,25 @@ +@@ -4756,19 +4792,25 @@ } switch(s->codec_id){ @@ -2075,7 +3551,7 @@ } if(s->flags&CODEC_FLAG_PASS1){ -@@ -4876,7 +4918,10 @@ +@@ -4881,7 +4923,10 @@ s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; s->mb_intra= 0; @@ -2086,7 +3562,7 @@ encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, &dmin, &next_block, mx, my); } -@@ -5062,7 +5107,10 @@ +@@ -5067,7 +5112,10 @@ s->mb_intra= 0; motion_x=s->b_direct_mv_table[xy][0]; motion_y=s->b_direct_mv_table[xy][1]; @@ -2098,7 +3574,7 @@ break; case CANDIDATE_MB_TYPE_BIDIR: s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; -@@ -5170,8 +5218,11 @@ +@@ -5175,8 +5223,11 @@ } //not beautiful here but we must write it before flushing so it has to be here @@ -2110,7 +3586,7 @@ write_slice_end(s); -@@ -5234,10 +5285,13 @@ +@@ -5239,10 +5290,13 @@ s->me.mb_var_sum_temp = s->me.mc_mb_var_sum_temp = 0; @@ -2124,7 +3600,7 @@ s->me.scene_change_score=0; -@@ -5256,6 +5310,8 @@ +@@ -5261,6 +5315,8 @@ ff_update_duplicate_context(s->thread_context[i], s); } @@ -2133,7 +3609,7 @@ ff_init_me(s); /* Estimate motion for every MB */ -@@ -5270,6 +5326,8 @@ +@@ -5275,6 +5331,8 @@ s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count); }else /* if(s->pict_type == I_TYPE) */{ @@ -2142,7 +3618,7 @@ /* I-Frame */ for(i=0; i<s->mb_stride*s->mb_height; i++) s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA; -@@ -5293,6 +5351,8 @@ +@@ -5298,6 +5356,8 @@ //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum); } @@ -2151,7 +3627,7 @@ if(!s->umvplus){ if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) { s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER); -@@ -5346,11 +5406,14 @@ +@@ -5351,11 +5411,14 @@ } } } @@ -2166,7 +3642,7 @@ switch(s->codec_id){ case CODEC_ID_MPEG4: ff_clean_mpeg4_qscales(s); -@@ -5361,6 +5424,7 @@ +@@ -5366,6 +5429,7 @@ ff_clean_h263_qscales(s); break; } @@ -2174,7 +3650,7 @@ s->lambda= s->lambda_table[0]; //FIXME broken -@@ -5396,6 +5460,8 @@ +@@ -5401,6 +5465,8 @@ s->last_bits= put_bits_count(&s->pb); switch(s->out_format) { @@ -2183,7 +3659,7 @@ case FMT_MJPEG: mjpeg_picture_header(s); break; -@@ -5424,11 +5490,15 @@ +@@ -5429,11 +5495,15 @@ else h263_encode_picture_header(s, picture_number); break; @@ -2199,8 +3675,25 @@ default: assert(0); } ---- /home/melanson/temp/ffmpeg/libavcodec/msmpeg4.c 2005-05-05 20:53:15.794521736 -0600 -+++ libavcodec/msmpeg4.c 2005-05-05 21:30:43.786774968 -0600 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/mpegvideo.h libavcodec/mpegvideo.h +--- /home/melanson/temp/ffmpeg/libavcodec/mpegvideo.h 2005-05-05 20:53:15.000000000 -0600 ++++ libavcodec/mpegvideo.h 2005-05-27 18:42:06.000000000 -0600 +@@ -810,10 +810,10 @@ + int16_t (*mv_table)[2], int f_code, int type, int truncate); + void ff_init_me(MpegEncContext *s); + int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); +-inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, ++extern __inline__ int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, + int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], + int ref_mv_scale, int size, int h); +-int inline ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, ++extern __inline__ int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, + int ref_index, int size, int h, int add_rate); + + /* mpeg12.c */ +diff -ur /home/melanson/temp/ffmpeg/libavcodec/msmpeg4.c libavcodec/msmpeg4.c +--- /home/melanson/temp/ffmpeg/libavcodec/msmpeg4.c 2005-05-05 20:53:15.000000000 -0600 ++++ libavcodec/msmpeg4.c 2005-05-27 18:42:06.000000000 -0600 @@ -59,9 +59,7 @@ static uint32_t v2_dc_lum_table[512][2]; static uint32_t v2_dc_chroma_table[512][2]; @@ -2212,7 +3705,7 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static int msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); -@@ -179,8 +179,11 @@ +@@ -179,8 +177,11 @@ break; #if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC9_DECODER) case 6: @@ -2224,7 +3717,7 @@ break; #endif -@@ -536,6 +534,129 @@ +@@ -533,6 +534,129 @@ } } @@ -2354,7 +3847,7 @@ void msmpeg4_encode_mb(MpegEncContext * s, DCTELEM block[6][64], int motion_x, int motion_y) -@@ -915,129 +1036,6 @@ +@@ -912,129 +1036,6 @@ } } @@ -2484,7 +3977,7 @@ /****************************************/ /* decoding stuff */ -@@ -1482,188 +1480,9 @@ +@@ -1479,188 +1480,9 @@ return val; } @@ -2676,7 +4169,7 @@ { int level, i, last, run, run_diff; int dc_pred_dir; -@@ -1912,6 +1731,186 @@ +@@ -1909,6 +1731,186 @@ return 0; } @@ -2863,1459 +4356,9 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) { int level, pred; ---- libavcodec/dsputil.c 6 May 2005 04:19:18 -0000 1.38 -+++ libavcodec/dsputil.c 7 May 2005 16:24:36 -0000 -@@ -371,6 +371,8 @@ - assert(s>=0); - - return s>>2; -+#else -+ return 0; - #endif - } - ---- libavcodec/h263.c 6 May 2005 04:19:18 -0000 1.44 -+++ libavcodec/h263.c 7 May 2005 17:03:48 -0000 -@@ -57,18 +57,12 @@ - static void h263_encode_block(MpegEncContext * s, DCTELEM * block, - int n); - static void h263p_encode_umotion(MpegEncContext * s, int val); --static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, -- int n, int dc, uint8_t *scan_table, -- PutBitContext *dc_pb, PutBitContext *ac_pb); - #endif - - static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); - static int h263p_decode_umotion(MpegEncContext * s, int pred); - static int h263_decode_block(MpegEncContext * s, DCTELEM * block, - int n, int coded); --static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); --static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, -- int n, int coded, int intra, int rvlc); - static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, - uint8_t *scan_table); - static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr); -@@ -77,7 +71,6 @@ - static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number); - #endif //CONFIG_ENCODERS - static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb); --static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding); - - #ifdef CONFIG_ENCODERS - static uint8_t uni_DCtab_lum_len[512]; -@@ -664,6 +657,85 @@ - } - } - -+/** -+ * predicts the dc. -+ * encoding quantized level -> quantized diff -+ * decoding quantized diff -> quantized level -+ * @param n block index (0-3 are luma, 4-5 are chroma) -+ * @param dir_ptr pointer to an integer where the prediction direction will be stored -+ */ -+static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) -+{ -+ int a, b, c, wrap, pred, scale, ret; -+ uint16_t *dc_val; -+ -+ /* find prediction */ -+ if (n < 4) { -+ scale = s->y_dc_scale; -+ } else { -+ scale = s->c_dc_scale; -+ } -+ if(IS_3IV1) -+ scale= 8; -+ -+ wrap= s->block_wrap[n]; -+ dc_val = s->dc_val[0] + s->block_index[n]; -+ -+ /* B C -+ * A X -+ */ -+ a = dc_val[ - 1]; -+ b = dc_val[ - 1 - wrap]; -+ c = dc_val[ - wrap]; -+ -+ /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ -+ if(s->first_slice_line && n!=3){ -+ if(n!=2) b=c= 1024; -+ if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; -+ } -+ if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){ -+ if(n==0 || n==4 || n==5) -+ b=1024; -+ } -+ -+ if (abs(a - b) < abs(b - c)) { -+ pred = c; -+ *dir_ptr = 1; /* top */ -+ } else { -+ pred = a; -+ *dir_ptr = 0; /* left */ -+ } -+ /* we assume pred is positive */ -+ pred = FASTDIV((pred + (scale >> 1)), scale); -+ -+ if(encoding){ -+ ret = level - pred; -+ }else{ -+ level += pred; -+ ret= level; -+ if(s->error_resilience>=3){ -+ if(level<0){ -+ av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ if(level*scale > 2048 + scale){ -+ av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ } -+ } -+ level *=scale; -+ if(level&(~2047)){ -+ if(level<0) -+ level=0; -+ else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) -+ level=2047; -+ } -+ dc_val[0]= level; -+ -+ return ret; -+} -+ - #ifdef CONFIG_ENCODERS - - static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){ -@@ -793,6 +865,179 @@ - return cbp; - } - -+/** -+ * encodes the dc value. -+ * @param n block index (0-3 are luma, 4-5 are chroma) -+ */ -+static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) -+{ -+#if 1 -+// if(level<-255 || level>255) printf("dc overflow\n"); -+ level+=256; -+ if (n < 4) { -+ /* luminance */ -+ put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); -+ } else { -+ /* chrominance */ -+ put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); -+ } -+#else -+ int size, v; -+ /* find number of bits */ -+ size = 0; -+ v = abs(level); -+ while (v) { -+ v >>= 1; -+ size++; -+ } -+ -+ if (n < 4) { -+ /* luminance */ -+ put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); -+ } else { -+ /* chrominance */ -+ put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); -+ } -+ -+ /* encode remaining bits */ -+ if (size > 0) { -+ if (level < 0) -+ level = (-level) ^ ((1 << size) - 1); -+ put_bits(&s->pb, size, level); -+ if (size > 8) -+ put_bits(&s->pb, 1, 1); -+ } -+#endif -+} -+ -+static inline int mpeg4_get_dc_length(int level, int n){ -+ if (n < 4) { -+ return uni_DCtab_lum_len[level + 256]; -+ } else { -+ return uni_DCtab_chrom_len[level + 256]; -+ } -+} -+ -+/** -+ * encodes a 8x8 block -+ * @param n block index (0-3 are luma, 4-5 are chroma) -+ */ -+static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, -+ uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) -+{ -+ int i, last_non_zero; -+#if 0 //variables for the outcommented version -+ int code, sign, last; -+#endif -+ const RLTable *rl; -+ uint32_t *bits_tab; -+ uint8_t *len_tab; -+ const int last_index = s->block_last_index[n]; -+ -+ if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away -+ /* mpeg4 based DC predictor */ -+ mpeg4_encode_dc(dc_pb, intra_dc, n); -+ if(last_index<1) return; -+ i = 1; -+ rl = &rl_intra; -+ bits_tab= uni_mpeg4_intra_rl_bits; -+ len_tab = uni_mpeg4_intra_rl_len; -+ } else { -+ if(last_index<0) return; -+ i = 0; -+ rl = &rl_inter; -+ bits_tab= uni_mpeg4_inter_rl_bits; -+ len_tab = uni_mpeg4_inter_rl_len; -+ } -+ -+ /* AC coefs */ -+ last_non_zero = i - 1; -+#if 1 -+ for (; i < last_index; i++) { -+ int level = block[ scan_table[i] ]; -+ if (level) { -+ int run = i - last_non_zero - 1; -+ level+=64; -+ if((level&(~127)) == 0){ -+ const int index= UNI_MPEG4_ENC_INDEX(0, run, level); -+ put_bits(ac_pb, len_tab[index], bits_tab[index]); -+ }else{ //ESC3 -+ 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); -+ } -+ last_non_zero = i; -+ } -+ } -+ /*if(i<=last_index)*/{ -+ int level = block[ scan_table[i] ]; -+ int run = i - last_non_zero - 1; -+ level+=64; -+ if((level&(~127)) == 0){ -+ const int index= UNI_MPEG4_ENC_INDEX(1, run, level); -+ put_bits(ac_pb, len_tab[index], bits_tab[index]); -+ }else{ //ESC3 -+ 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); -+ } -+ } -+#else -+ for (; i <= last_index; i++) { -+ const int slevel = block[ scan_table[i] ]; -+ if (slevel) { -+ int level; -+ int run = i - last_non_zero - 1; -+ last = (i == last_index); -+ sign = 0; -+ level = slevel; -+ if (level < 0) { -+ sign = 1; -+ level = -level; -+ } -+ code = get_rl_index(rl, last, run, level); -+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -+ if (code == rl->n) { -+ int level1, run1; -+ level1 = level - rl->max_level[last][run]; -+ if (level1 < 1) -+ goto esc2; -+ code = get_rl_index(rl, last, run, level1); -+ if (code == rl->n) { -+ esc2: -+ put_bits(ac_pb, 1, 1); -+ if (level > MAX_LEVEL) -+ goto esc3; -+ run1 = run - rl->max_run[last][level] - 1; -+ if (run1 < 0) -+ goto esc3; -+ code = get_rl_index(rl, last, run1, level); -+ if (code == rl->n) { -+ esc3: -+ /* third escape */ -+ put_bits(ac_pb, 1, 1); -+ put_bits(ac_pb, 1, last); -+ put_bits(ac_pb, 6, run); -+ put_bits(ac_pb, 1, 1); -+ put_bits(ac_pb, 12, slevel & 0xfff); -+ put_bits(ac_pb, 1, 1); -+ } else { -+ /* second escape */ -+ put_bits(ac_pb, 1, 0); -+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -+ put_bits(ac_pb, 1, sign); -+ } -+ } else { -+ /* first escape */ -+ put_bits(ac_pb, 1, 0); -+ put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -+ put_bits(ac_pb, 1, sign); -+ } -+ } else { -+ put_bits(ac_pb, 1, sign); -+ } -+ last_non_zero = i; -+ } -+ } -+#endif -+} -+ - static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6], - uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){ - int i; -@@ -2478,85 +2723,6 @@ - } - - /** -- * predicts the dc. -- * encoding quantized level -> quantized diff -- * decoding quantized diff -> quantized level -- * @param n block index (0-3 are luma, 4-5 are chroma) -- * @param dir_ptr pointer to an integer where the prediction direction will be stored -- */ --static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) --{ -- int a, b, c, wrap, pred, scale, ret; -- uint16_t *dc_val; -- -- /* find prediction */ -- if (n < 4) { -- scale = s->y_dc_scale; -- } else { -- scale = s->c_dc_scale; -- } -- if(IS_3IV1) -- scale= 8; -- -- wrap= s->block_wrap[n]; -- dc_val = s->dc_val[0] + s->block_index[n]; -- -- /* B C -- * A X -- */ -- a = dc_val[ - 1]; -- b = dc_val[ - 1 - wrap]; -- c = dc_val[ - wrap]; -- -- /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ -- if(s->first_slice_line && n!=3){ -- if(n!=2) b=c= 1024; -- if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; -- } -- if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){ -- if(n==0 || n==4 || n==5) -- b=1024; -- } -- -- if (abs(a - b) < abs(b - c)) { -- pred = c; -- *dir_ptr = 1; /* top */ -- } else { -- pred = a; -- *dir_ptr = 0; /* left */ -- } -- /* we assume pred is positive */ -- pred = FASTDIV((pred + (scale >> 1)), scale); -- -- if(encoding){ -- ret = level - pred; -- }else{ -- level += pred; -- ret= level; -- if(s->error_resilience>=3){ -- if(level<0){ -- av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); -- return -1; -- } -- if(level*scale > 2048 + scale){ -- av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); -- return -1; -- } -- } -- } -- level *=scale; -- if(level&(~2047)){ -- if(level<0) -- level=0; -- else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) -- level=2047; -- } -- dc_val[0]= level; -- -- return ret; --} -- --/** - * predicts the ac. - * @param n block index (0-3 are luma, 4-5 are chroma) - * @param dir the ac prediction direction -@@ -2618,179 +2784,6 @@ - - #ifdef CONFIG_ENCODERS - --/** -- * encodes the dc value. -- * @param n block index (0-3 are luma, 4-5 are chroma) -- */ --static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) --{ --#if 1 --// if(level<-255 || level>255) printf("dc overflow\n"); -- level+=256; -- if (n < 4) { -- /* luminance */ -- put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); -- } else { -- /* chrominance */ -- put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); -- } --#else -- int size, v; -- /* find number of bits */ -- size = 0; -- v = abs(level); -- while (v) { -- v >>= 1; -- size++; -- } -- -- if (n < 4) { -- /* luminance */ -- put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); -- } else { -- /* chrominance */ -- put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); -- } -- -- /* encode remaining bits */ -- if (size > 0) { -- if (level < 0) -- level = (-level) ^ ((1 << size) - 1); -- put_bits(&s->pb, size, level); -- if (size > 8) -- put_bits(&s->pb, 1, 1); -- } --#endif --} -- --static inline int mpeg4_get_dc_length(int level, int n){ -- if (n < 4) { -- return uni_DCtab_lum_len[level + 256]; -- } else { -- return uni_DCtab_chrom_len[level + 256]; -- } --} -- --/** -- * encodes a 8x8 block -- * @param n block index (0-3 are luma, 4-5 are chroma) -- */ --static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, -- uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) --{ -- int i, last_non_zero; --#if 0 //variables for the outcommented version -- int code, sign, last; --#endif -- const RLTable *rl; -- uint32_t *bits_tab; -- uint8_t *len_tab; -- const int last_index = s->block_last_index[n]; -- -- if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away -- /* mpeg4 based DC predictor */ -- mpeg4_encode_dc(dc_pb, intra_dc, n); -- if(last_index<1) return; -- i = 1; -- rl = &rl_intra; -- bits_tab= uni_mpeg4_intra_rl_bits; -- len_tab = uni_mpeg4_intra_rl_len; -- } else { -- if(last_index<0) return; -- i = 0; -- rl = &rl_inter; -- bits_tab= uni_mpeg4_inter_rl_bits; -- len_tab = uni_mpeg4_inter_rl_len; -- } -- -- /* AC coefs */ -- last_non_zero = i - 1; --#if 1 -- for (; i < last_index; i++) { -- int level = block[ scan_table[i] ]; -- if (level) { -- int run = i - last_non_zero - 1; -- level+=64; -- if((level&(~127)) == 0){ -- const int index= UNI_MPEG4_ENC_INDEX(0, run, level); -- put_bits(ac_pb, len_tab[index], bits_tab[index]); -- }else{ //ESC3 -- 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); -- } -- last_non_zero = i; -- } -- } -- /*if(i<=last_index)*/{ -- int level = block[ scan_table[i] ]; -- int run = i - last_non_zero - 1; -- level+=64; -- if((level&(~127)) == 0){ -- const int index= UNI_MPEG4_ENC_INDEX(1, run, level); -- put_bits(ac_pb, len_tab[index], bits_tab[index]); -- }else{ //ESC3 -- 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); -- } -- } --#else -- for (; i <= last_index; i++) { -- const int slevel = block[ scan_table[i] ]; -- if (slevel) { -- int level; -- int run = i - last_non_zero - 1; -- last = (i == last_index); -- sign = 0; -- level = slevel; -- if (level < 0) { -- sign = 1; -- level = -level; -- } -- code = get_rl_index(rl, last, run, level); -- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -- if (code == rl->n) { -- int level1, run1; -- level1 = level - rl->max_level[last][run]; -- if (level1 < 1) -- goto esc2; -- code = get_rl_index(rl, last, run, level1); -- if (code == rl->n) { -- esc2: -- put_bits(ac_pb, 1, 1); -- if (level > MAX_LEVEL) -- goto esc3; -- run1 = run - rl->max_run[last][level] - 1; -- if (run1 < 0) -- goto esc3; -- code = get_rl_index(rl, last, run1, level); -- if (code == rl->n) { -- esc3: -- /* third escape */ -- put_bits(ac_pb, 1, 1); -- put_bits(ac_pb, 1, last); -- put_bits(ac_pb, 6, run); -- put_bits(ac_pb, 1, 1); -- put_bits(ac_pb, 12, slevel & 0xfff); -- put_bits(ac_pb, 1, 1); -- } else { -- /* second escape */ -- put_bits(ac_pb, 1, 0); -- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -- put_bits(ac_pb, 1, sign); -- } -- } else { -- /* first escape */ -- put_bits(ac_pb, 1, 0); -- put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); -- put_bits(ac_pb, 1, sign); -- } -- } else { -- put_bits(ac_pb, 1, sign); -- } -- last_non_zero = i; -- } -- } --#endif --} -- - static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, - uint8_t *scan_table) - { -@@ -3392,10 +3385,57 @@ - } - - /** -- * decodes first partition. -- * @return number of MBs decoded or <0 if an error occured -+ * decodes the dc value. -+ * @param n block index (0-3 are luma, 4-5 are chroma) -+ * @param dir_ptr the prediction direction will be stored here -+ * @return the quantized dc - */ --static int mpeg4_decode_partition_a(MpegEncContext *s){ -+static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) -+{ -+ int level, code; -+ -+ if (n < 4) -+ code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); -+ else -+ code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); -+ if (code < 0 || code > 9 /* && s->nbit<9 */){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); -+ return -1; -+ } -+ if (code == 0) { -+ level = 0; -+ } else { -+ if(IS_3IV1){ -+ if(code==1) -+ level= 2*get_bits1(&s->gb)-1; -+ else{ -+ if(get_bits1(&s->gb)) -+ level = get_bits(&s->gb, code-1) + (1<<(code-1)); -+ else -+ level = -get_bits(&s->gb, code-1) - (1<<(code-1)); -+ } -+ }else{ -+ level = get_xbits(&s->gb, code); -+ } -+ -+ if (code > 8){ -+ if(get_bits1(&s->gb)==0){ /* marker */ -+ if(s->error_resilience>=2){ -+ av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); -+ return -1; -+ } -+ } -+ } -+ } -+ -+ return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); -+} -+ -+/** -+ * decodes first partition. -+ * @return number of MBs decoded or <0 if an error occured -+ */ -+static int mpeg4_decode_partition_a(MpegEncContext *s){ - int mb_num; - static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; - -@@ -3697,116 +3737,371 @@ - } - - /** -- * decode partition C of one MB. -+ * decodes a block. - * @return <0 if an error occured - */ --static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) -+static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, -+ int n, int coded, int intra, int rvlc) - { -- int cbp, mb_type; -- const int xy= s->mb_x + s->mb_y*s->mb_stride; -- -- mb_type= s->current_picture.mb_type[xy]; -- cbp = s->cbp_table[xy]; -+ int level, i, last, run; -+ int dc_pred_dir; -+ RLTable * rl; -+ RL_VLC_ELEM * rl_vlc; -+ const uint8_t * scan_table; -+ int qmul, qadd; - -- if(s->current_picture.qscale_table[xy] != s->qscale){ -- ff_set_qscale(s, s->current_picture.qscale_table[xy] ); -- } -+ //Note intra & rvlc should be optimized away if this is inlined - -- if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { -- int i; -- for(i=0; i<4; i++){ -- s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; -- s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; -+ if(intra) { -+ if(s->qscale < s->intra_dc_threshold){ -+ /* DC coef */ -+ if(s->partitioned_frame){ -+ level = s->dc_val[0][ s->block_index[n] ]; -+ if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); -+ else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); -+ dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; -+ }else{ -+ level = mpeg4_decode_dc(s, n, &dc_pred_dir); -+ if (level < 0) -+ return -1; - } -- s->mb_intra = IS_INTRA(mb_type); -+ block[0] = level; -+ i = 0; -+ }else{ -+ i = -1; -+ } -+ if (!coded) -+ goto not_coded; -+ -+ if(rvlc){ -+ rl = &rvlc_rl_intra; -+ rl_vlc = rvlc_rl_intra.rl_vlc[0]; -+ }else{ -+ rl = &rl_intra; -+ rl_vlc = rl_intra.rl_vlc[0]; -+ } -+ if (s->ac_pred) { -+ if (dc_pred_dir == 0) -+ scan_table = s->intra_v_scantable.permutated; /* left */ -+ else -+ scan_table = s->intra_h_scantable.permutated; /* top */ -+ } else { -+ scan_table = s->intra_scantable.permutated; -+ } -+ qmul=1; -+ qadd=0; -+ } else { -+ i = -1; -+ if (!coded) { -+ s->block_last_index[n] = i; -+ return 0; -+ } -+ if(rvlc) rl = &rvlc_rl_inter; -+ else rl = &rl_inter; -+ -+ scan_table = s->intra_scantable.permutated; - -- if (IS_SKIP(mb_type)) { -- /* skip mb */ -- for(i=0;i<6;i++) -- s->block_last_index[i] = -1; -- s->mv_dir = MV_DIR_FORWARD; -- s->mv_type = MV_TYPE_16X16; -- if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ -- s->mcsel=1; -- s->mb_skipped = 0; -+ if(s->mpeg_quant){ -+ qmul=1; -+ qadd=0; -+ if(rvlc){ -+ rl_vlc = rvlc_rl_inter.rl_vlc[0]; - }else{ -- s->mcsel=0; -- s->mb_skipped = 1; -+ rl_vlc = rl_inter.rl_vlc[0]; - } -- }else if(s->mb_intra){ -- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -- }else if(!s->mb_intra){ --// s->mcsel= 0; //FIXME do we need to init that -- -- s->mv_dir = MV_DIR_FORWARD; -- if (IS_8X8(mb_type)) { -- s->mv_type = MV_TYPE_8X8; -- } else { -- s->mv_type = MV_TYPE_16X16; -+ }else{ -+ qmul = s->qscale << 1; -+ qadd = (s->qscale - 1) | 1; -+ if(rvlc){ -+ rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; -+ }else{ -+ rl_vlc = rl_inter.rl_vlc[s->qscale]; - } - } -- } else { /* I-Frame */ -- s->mb_intra = 1; -- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); - } -+ { -+ OPEN_READER(re, &s->gb); -+ for(;;) { -+ UPDATE_CACHE(re, &s->gb); -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); -+ if (level==0) { -+ /* escape */ -+ if(rvlc){ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); -+ -+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -+ SKIP_COUNTER(re, &s->gb, 1+1+6); -+ UPDATE_CACHE(re, &s->gb); -+ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); -+ -+ level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); -+ -+ if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ -+ av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 5); - -- if (!IS_SKIP(mb_type)) { -- int i; -- s->dsp.clear_blocks(s->block[0]); -- /* decode each block */ -- for (i = 0; i < 6; i++) { -- if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ -- av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); -- return -1; -- } -- cbp+=cbp; -- } -- } -+ level= level * qmul + qadd; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); -+ SKIP_COUNTER(re, &s->gb, 1+11+5+1); - -- /* per-MB end of slice check */ -+ i+= run + 1; -+ if(last) i+=192; -+ }else{ -+ int cache; -+ cache= GET_CACHE(re, &s->gb); - -- if(--s->mb_num_left <= 0){ --//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); -- if(mpeg4_is_resync(s)) -- return SLICE_END; -- else -- return SLICE_NOEND; -- }else{ -- if(mpeg4_is_resync(s)){ -- const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; -- if(s->cbp_table[xy+delta]) -- return SLICE_END; -- } -- return SLICE_OK; -- } --} -+ if(IS_3IV1) -+ cache ^= 0xC0000000; - --/** -- * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) -- */ --static void preview_obmc(MpegEncContext *s){ -- GetBitContext gb= s->gb; -- -- int cbpc, i, pred_x, pred_y, mx, my; -- int16_t *mot_val; -- const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; -- const int stride= s->b8_stride*2; -- -- for(i=0; i<4; i++) -- s->block_index[i]+= 2; -- for(i=4; i<6; i++) -- s->block_index[i]+= 1; -- s->mb_x++; -- -- assert(s->pict_type == P_TYPE); -+ if (cache&0x80000000) { -+ if (cache&0x40000000) { -+ /* third escape */ -+ SKIP_CACHE(re, &s->gb, 2); -+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -+ SKIP_COUNTER(re, &s->gb, 2+1+6); -+ UPDATE_CACHE(re, &s->gb); - -- do{ -- if (get_bits1(&s->gb)) { -- /* skip mb */ -- mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; -- mot_val[0 ]= mot_val[2 ]= -- mot_val[0+stride]= mot_val[2+stride]= 0; -- mot_val[1 ]= mot_val[3 ]= -+ if(IS_3IV1){ -+ level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); -+ }else{ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); -+ -+ level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); -+ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); -+ return -1; -+ }; LAST_SKIP_CACHE(re, &s->gb, 1); -+ -+ SKIP_COUNTER(re, &s->gb, 1+12+1); -+ } -+ -+#if 0 -+ if(s->error_resilience >= FF_ER_COMPLIANT){ -+ const int abs_level= ABS(level); -+ if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ -+ const int run1= run - rl->max_run[last][abs_level] - 1; -+ if(abs_level <= rl->max_level[last][run]){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); -+ return -1; -+ } -+ if(s->error_resilience > FF_ER_COMPLIANT){ -+ if(abs_level <= rl->max_level[last][run]*2){ -+ fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); -+ return -1; -+ } -+ if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ -+ fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); -+ return -1; -+ } -+ } -+ } -+ } -+#endif -+ if (level>0) level= level * qmul + qadd; -+ else level= level * qmul - qadd; -+ -+ if((unsigned)(level + 2048) > 4095){ -+ if(s->error_resilience > FF_ER_COMPLIANT){ -+ if(level > 2560 || level<-2560){ -+ av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); -+ return -1; -+ } -+ } -+ level= level<0 ? -2048 : 2047; -+ } -+ -+ i+= run + 1; -+ if(last) i+=192; -+ } else { -+ /* second escape */ -+#if MIN_CACHE_BITS < 20 -+ LAST_SKIP_BITS(re, &s->gb, 2); -+ UPDATE_CACHE(re, &s->gb); -+#else -+ SKIP_BITS(re, &s->gb, 2); -+#endif -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -+ i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ } else { -+ /* first escape */ -+#if MIN_CACHE_BITS < 19 -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ UPDATE_CACHE(re, &s->gb); -+#else -+ SKIP_BITS(re, &s->gb, 1); -+#endif -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -+ i+= run; -+ level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ } -+ } else { -+ i+= run; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ if (i > 62){ -+ i-= 192; -+ if(i&(~63)){ -+ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ -+ block[scan_table[i]] = level; -+ break; -+ } -+ -+ block[scan_table[i]] = level; -+ } -+ CLOSE_READER(re, &s->gb); -+ } -+ not_coded: -+ if (intra) { -+ if(s->qscale >= s->intra_dc_threshold){ -+ block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); -+ -+ if(i == -1) i=0; -+ } -+ -+ mpeg4_pred_ac(s, block, n, dc_pred_dir); -+ if (s->ac_pred) { -+ i = 63; /* XXX: not optimal */ -+ } -+ } -+ s->block_last_index[n] = i; -+ return 0; -+} -+ -+/** -+ * decode partition C of one MB. -+ * @return <0 if an error occured -+ */ -+static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) -+{ -+ int cbp, mb_type; -+ const int xy= s->mb_x + s->mb_y*s->mb_stride; -+ -+ mb_type= s->current_picture.mb_type[xy]; -+ cbp = s->cbp_table[xy]; -+ -+ if(s->current_picture.qscale_table[xy] != s->qscale){ -+ ff_set_qscale(s, s->current_picture.qscale_table[xy] ); -+ } -+ -+ if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { -+ int i; -+ for(i=0; i<4; i++){ -+ s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; -+ s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; -+ } -+ s->mb_intra = IS_INTRA(mb_type); -+ -+ if (IS_SKIP(mb_type)) { -+ /* skip mb */ -+ for(i=0;i<6;i++) -+ s->block_last_index[i] = -1; -+ s->mv_dir = MV_DIR_FORWARD; -+ s->mv_type = MV_TYPE_16X16; -+ if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ -+ s->mcsel=1; -+ s->mb_skipped = 0; -+ }else{ -+ s->mcsel=0; -+ s->mb_skipped = 1; -+ } -+ }else if(s->mb_intra){ -+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -+ }else if(!s->mb_intra){ -+// s->mcsel= 0; //FIXME do we need to init that -+ -+ s->mv_dir = MV_DIR_FORWARD; -+ if (IS_8X8(mb_type)) { -+ s->mv_type = MV_TYPE_8X8; -+ } else { -+ s->mv_type = MV_TYPE_16X16; -+ } -+ } -+ } else { /* I-Frame */ -+ s->mb_intra = 1; -+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -+ } -+ -+ if (!IS_SKIP(mb_type)) { -+ int i; -+ s->dsp.clear_blocks(s->block[0]); -+ /* decode each block */ -+ for (i = 0; i < 6; i++) { -+ if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ -+ av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); -+ return -1; -+ } -+ cbp+=cbp; -+ } -+ } -+ -+ /* per-MB end of slice check */ -+ -+ if(--s->mb_num_left <= 0){ -+//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); -+ if(mpeg4_is_resync(s)) -+ return SLICE_END; -+ else -+ return SLICE_NOEND; -+ }else{ -+ if(mpeg4_is_resync(s)){ -+ const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; -+ if(s->cbp_table[xy+delta]) -+ return SLICE_END; -+ } -+ return SLICE_OK; -+ } -+} -+ -+/** -+ * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) -+ */ -+static void preview_obmc(MpegEncContext *s){ -+ GetBitContext gb= s->gb; -+ -+ int cbpc, i, pred_x, pred_y, mx, my; -+ int16_t *mot_val; -+ const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; -+ const int stride= s->b8_stride*2; -+ -+ for(i=0; i<4; i++) -+ s->block_index[i]+= 2; -+ for(i=4; i<6; i++) -+ s->block_index[i]+= 1; -+ s->mb_x++; -+ -+ assert(s->pict_type == P_TYPE); -+ -+ do{ -+ if (get_bits1(&s->gb)) { -+ /* skip mb */ -+ mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; -+ mot_val[0 ]= mot_val[2 ]= -+ mot_val[0+stride]= mot_val[2+stride]= 0; -+ mot_val[1 ]= mot_val[3 ]= - mot_val[1+stride]= mot_val[3+stride]= 0; - - s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; -@@ -4675,308 +4970,6 @@ - return 0; - } - --/** -- * decodes the dc value. -- * @param n block index (0-3 are luma, 4-5 are chroma) -- * @param dir_ptr the prediction direction will be stored here -- * @return the quantized dc -- */ --static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) --{ -- int level, code; -- -- if (n < 4) -- code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); -- else -- code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); -- if (code < 0 || code > 9 /* && s->nbit<9 */){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); -- return -1; -- } -- if (code == 0) { -- level = 0; -- } else { -- if(IS_3IV1){ -- if(code==1) -- level= 2*get_bits1(&s->gb)-1; -- else{ -- if(get_bits1(&s->gb)) -- level = get_bits(&s->gb, code-1) + (1<<(code-1)); -- else -- level = -get_bits(&s->gb, code-1) - (1<<(code-1)); -- } -- }else{ -- level = get_xbits(&s->gb, code); -- } -- -- if (code > 8){ -- if(get_bits1(&s->gb)==0){ /* marker */ -- if(s->error_resilience>=2){ -- av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); -- return -1; -- } -- } -- } -- } -- -- return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); --} -- --/** -- * decodes a block. -- * @return <0 if an error occured -- */ --static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, -- int n, int coded, int intra, int rvlc) --{ -- int level, i, last, run; -- int dc_pred_dir; -- RLTable * rl; -- RL_VLC_ELEM * rl_vlc; -- const uint8_t * scan_table; -- int qmul, qadd; -- -- //Note intra & rvlc should be optimized away if this is inlined -- -- if(intra) { -- if(s->qscale < s->intra_dc_threshold){ -- /* DC coef */ -- if(s->partitioned_frame){ -- level = s->dc_val[0][ s->block_index[n] ]; -- if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); -- else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); -- dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; -- }else{ -- level = mpeg4_decode_dc(s, n, &dc_pred_dir); -- if (level < 0) -- return -1; -- } -- block[0] = level; -- i = 0; -- }else{ -- i = -1; -- } -- if (!coded) -- goto not_coded; -- -- if(rvlc){ -- rl = &rvlc_rl_intra; -- rl_vlc = rvlc_rl_intra.rl_vlc[0]; -- }else{ -- rl = &rl_intra; -- rl_vlc = rl_intra.rl_vlc[0]; -- } -- if (s->ac_pred) { -- if (dc_pred_dir == 0) -- scan_table = s->intra_v_scantable.permutated; /* left */ -- else -- scan_table = s->intra_h_scantable.permutated; /* top */ -- } else { -- scan_table = s->intra_scantable.permutated; -- } -- qmul=1; -- qadd=0; -- } else { -- i = -1; -- if (!coded) { -- s->block_last_index[n] = i; -- return 0; -- } -- if(rvlc) rl = &rvlc_rl_inter; -- else rl = &rl_inter; -- -- scan_table = s->intra_scantable.permutated; -- -- if(s->mpeg_quant){ -- qmul=1; -- qadd=0; -- if(rvlc){ -- rl_vlc = rvlc_rl_inter.rl_vlc[0]; -- }else{ -- rl_vlc = rl_inter.rl_vlc[0]; -- } -- }else{ -- qmul = s->qscale << 1; -- qadd = (s->qscale - 1) | 1; -- if(rvlc){ -- rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; -- }else{ -- rl_vlc = rl_inter.rl_vlc[s->qscale]; -- } -- } -- } -- { -- OPEN_READER(re, &s->gb); -- for(;;) { -- UPDATE_CACHE(re, &s->gb); -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); -- if (level==0) { -- /* escape */ -- if(rvlc){ -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -- SKIP_COUNTER(re, &s->gb, 1+1+6); -- UPDATE_CACHE(re, &s->gb); -- -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); -- -- if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ -- av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 5); -- -- level= level * qmul + qadd; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); -- SKIP_COUNTER(re, &s->gb, 1+11+5+1); -- -- i+= run + 1; -- if(last) i+=192; -- }else{ -- int cache; -- cache= GET_CACHE(re, &s->gb); -- -- if(IS_3IV1) -- cache ^= 0xC0000000; -- -- if (cache&0x80000000) { -- if (cache&0x40000000) { -- /* third escape */ -- SKIP_CACHE(re, &s->gb, 2); -- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -- SKIP_COUNTER(re, &s->gb, 2+1+6); -- UPDATE_CACHE(re, &s->gb); -- -- if(IS_3IV1){ -- level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); -- }else{ -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); -- -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); -- return -1; -- }; LAST_SKIP_CACHE(re, &s->gb, 1); -- -- SKIP_COUNTER(re, &s->gb, 1+12+1); -- } -- --#if 0 -- if(s->error_resilience >= FF_ER_COMPLIANT){ -- const int abs_level= ABS(level); -- if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ -- const int run1= run - rl->max_run[last][abs_level] - 1; -- if(abs_level <= rl->max_level[last][run]){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); -- return -1; -- } -- if(s->error_resilience > FF_ER_COMPLIANT){ -- if(abs_level <= rl->max_level[last][run]*2){ -- fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); -- return -1; -- } -- if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ -- fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); -- return -1; -- } -- } -- } -- } --#endif -- if (level>0) level= level * qmul + qadd; -- else level= level * qmul - qadd; -- -- if((unsigned)(level + 2048) > 4095){ -- if(s->error_resilience > FF_ER_COMPLIANT){ -- if(level > 2560 || level<-2560){ -- av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); -- return -1; -- } -- } -- level= level<0 ? -2048 : 2047; -- } -- -- i+= run + 1; -- if(last) i+=192; -- } else { -- /* second escape */ --#if MIN_CACHE_BITS < 20 -- LAST_SKIP_BITS(re, &s->gb, 2); -- UPDATE_CACHE(re, &s->gb); --#else -- SKIP_BITS(re, &s->gb, 2); --#endif -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -- i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- } else { -- /* first escape */ --#if MIN_CACHE_BITS < 19 -- LAST_SKIP_BITS(re, &s->gb, 1); -- UPDATE_CACHE(re, &s->gb); --#else -- SKIP_BITS(re, &s->gb, 1); --#endif -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -- i+= run; -- level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- } -- } else { -- i+= run; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- if (i > 62){ -- i-= 192; -- if(i&(~63)){ -- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -- -- block[scan_table[i]] = level; -- break; -- } -- -- block[scan_table[i]] = level; -- } -- CLOSE_READER(re, &s->gb); -- } -- not_coded: -- if (intra) { -- if(s->qscale >= s->intra_dc_threshold){ -- block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); -- -- if(i == -1) i=0; -- } -- -- mpeg4_pred_ac(s, block, n, dc_pred_dir); -- if (s->ac_pred) { -- i = 63; /* XXX: not optimal */ -- } -- } -- s->block_last_index[n] = i; -- return 0; --} -- - /* most is hardcoded. should extend to handle all h263 streams */ - int h263_decode_picture_header(MpegEncContext *s) - { -@@ -5856,7 +5856,7 @@ - - s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num; - if(s->avctx->debug&FF_DEBUG_PTS) -- av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts); -+ av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %lld\n", s->current_picture_ptr->pts); - - check_marker(gb, "before vop_coded"); - ---- libavcodec/mpegvideo.h 6 May 2005 04:19:20 -0000 1.36 -+++ libavcodec/mpegvideo.h 14 May 2005 23:18:23 -0000 -@@ -810,10 +810,10 @@ - int16_t (*mv_table)[2], int f_code, int type, int truncate); - void ff_init_me(MpegEncContext *s); - int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); --inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, -+extern __inline__ int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, - int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], - int ref_mv_scale, int size, int h); --int inline ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, -+extern __inline__ int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, - int ref_index, int size, int h, int add_rate); - - /* mpeg12.c */ ---- libavcodec/motion_est_template.c 19 Apr 2005 05:20:36 -0000 1.12 -+++ libavcodec/motion_est_template.c 15 May 2005 23:07:52 -0000 -@@ -231,7 +231,7 @@ - return dmin; - } - --int inline ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, -+int __inline__ ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, - int ref_index, int size, int h, int add_rate) - { - // const int check_luma= s->dsp.me_sub_cmp != s->dsp.mb_cmp; -@@ -962,7 +962,7 @@ - } - - //this function is dedicated to the braindamaged gcc --inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, -+int __inline__ ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, - int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], - int ref_mv_scale, int size, int h) - { ---- libavcodec/snow.c 2005-05-16 15:44:13.826812894 +0100 1.2 -+++ libavcodec/snow.c 2005-05-16 15:46:47.555438283 +0100 +diff -ur /home/melanson/temp/ffmpeg/libavcodec/snow.c libavcodec/snow.c +--- /home/melanson/temp/ffmpeg/libavcodec/snow.c 2005-05-27 17:42:54.000000000 -0600 ++++ libavcodec/snow.c 2005-05-27 18:42:06.000000000 -0600 @@ -2033,6 +2033,7 @@ #define P_MV1 P[9] #define FLAG_QPEL 1 //must be 1 |