# HG changeset patch # User michaelni # Date 1022022837 0 # Node ID 5c8b3a7179298d9c7f41f32ed9ab57abbfaa1b57 # Parent 8aba98b353f0cbcfcc66d90d03eac6c6f77b0232 workaround dc_scale bug in old ffmpeg msmpeg4v3 encoder (set workaround_bugs=1 for this) diff -r 8aba98b353f0 -r 5c8b3a717929 avcodec.h --- a/avcodec.h Tue May 21 23:07:26 2002 +0000 +++ b/avcodec.h Tue May 21 23:13:57 2002 +0000 @@ -5,8 +5,8 @@ #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4609 -#define LIBAVCODEC_BUILD_STR "4609" +#define LIBAVCODEC_BUILD 4610 +#define LIBAVCODEC_BUILD_STR "4610" enum CodecID { CODEC_ID_NONE, @@ -231,6 +231,8 @@ enum CodecType codec_type; /* see CODEC_TYPE_xxx */ enum CodecID codec_id; /* see CODEC_ID_xxx */ unsigned int codec_tag; /* codec tag, only used if unknown codec */ + + int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ /* Note: Below are located reserved fields for further usage It requires for ABI !!! @@ -253,7 +255,7 @@ ul_res6,ul_res7,ul_res8,ul_res9,ul_res10,ul_res11,ul_res12; unsigned int ui_res0,ui_res1,ui_res2,ui_res3,ui_res4,ui_res5, - ui_res6,ui_res7,ui_res8,ui_res9,ui_res10,ui_res11,ui_res12; + ui_res6,ui_res7,ui_res8,ui_res9,ui_res10,ui_res11; unsigned short int us_res0,us_res1,us_res2,us_res3,us_res4,us_res5, us_res6,us_res7,us_res8,us_res9,us_res10,us_res11,us_res12; diff -r 8aba98b353f0 -r 5c8b3a717929 h263dec.c --- a/h263dec.c Tue May 21 23:07:26 2002 +0000 +++ b/h263dec.c Tue May 21 23:13:57 2002 +0000 @@ -43,6 +43,7 @@ s->width = avctx->width; s->height = avctx->height; + s->workaround_bugs= avctx->workaround_bugs; /* select sub codec */ switch(avctx->codec->id) { @@ -211,7 +212,11 @@ //fprintf(stderr,"\nFrame: %d\tMB: %d",avctx->frame_number, (s->mb_y * s->mb_width) + s->mb_x); /* DCT & quantize */ if (s->h263_pred && s->msmpeg4_version!=2) { - h263_dc_scale(s); + /* old ffmpeg encoded msmpeg4v3 workaround */ + if(s->workaround_bugs==1 && s->msmpeg4_version==3) + ff_old_msmpeg4_dc_scale(s); + else + h263_dc_scale(s); } else { /* default quantization values */ s->y_dc_scale = 8; @@ -277,9 +282,9 @@ s->has_b_frames=1; for(mb_y=0; mb_ymb_height; mb_y++){ int mb_x; - int y= mb_y*16; + int y= mb_y*16 + 8; for(mb_x=0; mb_xmb_width; mb_x++){ - int x= mb_x*16; + int x= mb_x*16 + 8; uint8_t *ptr= s->last_picture[0]; int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2); int mx= (s->motion_val[xy][0]>>1) + x; @@ -299,6 +304,7 @@ int y1= y + (my-y)*i/max; ptr[y1*s->linesize + x1]+=100; } + ptr[y*s->linesize + x]+=100; s->mbskip_table[mb_x + mb_y*s->mb_width]=0; } } diff -r 8aba98b353f0 -r 5c8b3a717929 mpegvideo.h --- a/mpegvideo.h Tue May 21 23:07:26 2002 +0000 +++ b/mpegvideo.h Tue May 21 23:13:57 2002 +0000 @@ -99,6 +99,7 @@ float b_quant_factor;/* qscale factor between ips and b frames */ int rc_strategy; int b_frame_strategy; + int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ /* the following fields are managed internally by the encoder */ /* bit output */ @@ -491,6 +492,7 @@ int msmpeg4_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); int msmpeg4_decode_init_vlc(MpegEncContext *s); +void ff_old_msmpeg4_dc_scale(MpegEncContext *s); /* mjpegenc.c */ diff -r 8aba98b353f0 -r 5c8b3a717929 msmpeg4.c --- a/msmpeg4.c Tue May 21 23:07:26 2002 +0000 +++ b/msmpeg4.c Tue May 21 23:13:57 2002 +0000 @@ -15,11 +15,14 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * msmpeg4v2 stuff by Michael Niedermayer */ #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" + /* * You can also call this codec : MPEG4 with a twist ! * @@ -407,26 +410,20 @@ } } - -#if 0 -/* identical to mpeg4 for msmpeg4v3 but not msmpeg4v2 */ -void msmpeg4_dc_scale(MpegEncContext * s) +/* old ffmpeg msmpeg4v3 mode */ +void ff_old_msmpeg4_dc_scale(MpegEncContext * s) { - if (s->qscale < 5 || s->msmpeg4_version==2){ + if (s->qscale < 5){ s->y_dc_scale = 8; s->c_dc_scale = 8; }else if (s->qscale < 9){ s->y_dc_scale = 2 * s->qscale; s->c_dc_scale = (s->qscale + 13)>>1; - }else if(s->qscale < 25){ + }else{ s->y_dc_scale = s->qscale + 8; s->c_dc_scale = (s->qscale + 13)>>1; - }else{ - s->y_dc_scale = 2 * s->qscale - 16; - s->c_dc_scale = s->qscale - 6; } } -#endif /* dir = 0: left, dir = 1: top prediction */ static int msmpeg4_pred_dc(MpegEncContext * s, int n,