From bff6ecaa9c707f31be6143946df3a7ac88ee6c9e Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 10 Jan 2002 00:53:21 +0000 Subject: [PATCH] AC table reset (memset) optimization - patch by Michael Niedermayer Originally committed as revision 251 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegvideo.c | 19 ++++++++++++++++++- libavcodec/mpegvideo.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index edd7872cc9..544d83cfdd 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -180,6 +180,12 @@ int MPV_common_init(MpegEncContext *s) s->coded_block = av_mallocz(y_size); if (!s->coded_block) goto fail; + + /* which mb is a intra block */ + s->mbintra_table = av_mallocz(y_size/4); + if (!s->mbintra_table) + goto fail; + memset(s->mbintra_table, 1, y_size/4); } /* default structure is frame */ s->picture_structure = PICT_FRAME; @@ -202,6 +208,8 @@ int MPV_common_init(MpegEncContext *s) free(s->ac_val[0]); if (s->coded_block) free(s->coded_block); + if (s->mbintra_table) + free(s->mbintra_table); if (s->mbskip_table) free(s->mbskip_table); for(i=0;i<3;i++) { @@ -226,6 +234,7 @@ void MPV_common_end(MpegEncContext *s) free(s->dc_val[0]); free(s->ac_val[0]); free(s->coded_block); + free(s->mbintra_table); } if (s->mbskip_table) free(s->mbskip_table); @@ -697,11 +706,16 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) /* update DC predictors for P macroblocks */ if (!s->mb_intra) { if (s->h263_pred) { + if(s->mbintra_table[mb_x + mb_y*s->mb_width]) + { int wrap, x, y, v; + s->mbintra_table[mb_x + mb_y*s->mb_width]=0; + wrap = 2 * s->mb_width + 2; v = 1024; x = 2 * mb_x + 1; y = 2 * mb_y + 1; + s->dc_val[0][(x) + (y) * wrap] = v; s->dc_val[0][(x + 1) + (y) * wrap] = v; s->dc_val[0][(x) + (y + 1) * wrap] = v; @@ -726,13 +740,16 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) /* ac pred */ memset(s->ac_val[1][(x) + (y) * wrap], 0, 16 * sizeof(INT16)); memset(s->ac_val[2][(x) + (y) * wrap], 0, 16 * sizeof(INT16)); + } } else { s->last_dc[0] = 128 << s->intra_dc_precision; s->last_dc[1] = 128 << s->intra_dc_precision; s->last_dc[2] = 128 << s->intra_dc_precision; } } - + else + s->mbintra_table[mb_x + mb_y*s->mb_width]=1; + /* update motion predictor */ if (s->out_format == FMT_H263) { int x, y, wrap; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index e653edb9b4..9a74b7999c 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -75,6 +75,7 @@ typedef struct MpegEncContext { int mb_skiped; /* MUST BE SET only during DECODING */ UINT8 *mbskip_table; /* used to avoid copy if macroblock skipped (for black regions for example) */ + UINT8 *mbintra_table; /* used to kill a few memsets */ int qscale; int pict_type;