From 9d2a0355299c7c6004f1b804e6339e5e8759cd27 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 23 Mar 2002 20:21:33 +0000 Subject: [PATCH] fixing motion estimation with h263p hopefully Originally committed as revision 355 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h263.c | 13 +++++++++---- libavcodec/mpegvideo.c | 11 +++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 329db31..4513288 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -51,6 +51,7 @@ extern UINT32 inverse[256]; static UINT16 mv_penalty[MAX_FCODE][MAX_MV*2+1]; static UINT8 fcode_tab[MAX_MV*2+1]; +static UINT8 umv_fcode_tab[MAX_MV*2+1]; int h263_get_picture_format(int width, int height) { @@ -689,13 +690,16 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s) mv_penalty[f_code][mv+MAX_MV]= len; } } - for(f_code=MAX_FCODE; f_code>0; f_code--){ for(mv=-(16<mv_penalty= mv_penalty; + s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p - // use fcodes >1 only for mpeg4&h263 FIXME - if(!s->h263_msmpeg4) s->fcode_tab= fcode_tab; + // use fcodes >1 only for mpeg4 & h263 & h263p FIXME + if(s->h263_plus) s->fcode_tab= umv_fcode_tab; + else if(s->h263_pred) s->fcode_tab= fcode_tab; } static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 839fe1a..5a5060b 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -381,6 +381,9 @@ int MPV_encode_init(AVCodecContext *avctx) else if (s->out_format == FMT_MPEG1) mpeg1_encode_init(s); + /* dont use mv_penalty table for crap MV as it would be confused */ + if(s->full_search<4) s->mv_penalty= default_mv_penalty; + s->encoding = 1; /* init */ @@ -1126,8 +1129,8 @@ static void encode_picture(MpegEncContext *s, int picture_number) } } - /* find best f_code */ - if(s->pict_type==P_TYPE){ + /* find best f_code for ME which do unlimited searches */ + if(s->pict_type==P_TYPE && s->full_search>3){ int mv_num[8]; int i; int loose=0; @@ -1149,6 +1152,10 @@ static void encode_picture(MpegEncContext *s, int picture_number) if(loose > 10) break; //FIXME this is pretty ineffective } s->f_code= i; +/* for(i=0; i<=MAX_FCODE; i++){ + printf("%d ", mv_num[i]); + } + printf("\n");*/ }else{ s->f_code= 1; } -- 2.7.4