From e77ef2755a98c70e5841e192cef69ad3079789de Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Thu, 23 Mar 2006 21:54:46 +0000 Subject: [PATCH] prefetch pixels for future motion compensation. 4-10% faster mpeg1/2/4 decoding (on an athlon-xp). Originally committed as revision 5204 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegvideo.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index bfa58e826b..c4f83c9e80 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -3359,6 +3359,18 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s, pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy); } +static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){ + /* fetch pixels for estimated mv 4 macroblocks ahead + * optimized for 64byte cache lines */ + const int shift = s->quarter_sample ? 2 : 1; + const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8; + const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y; + int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64; + s->dsp.prefetch(pix[0]+off, s->linesize, 4); + off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64; + s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2); +} + /** * motion compensation of a single macroblock * @param s context @@ -3383,6 +3395,8 @@ static inline void MPV_motion(MpegEncContext *s, mb_x = s->mb_x; mb_y = s->mb_y; + prefetch_motion(s, ref_picture, dir); + if(s->obmc && s->pict_type != B_TYPE){ int16_t mv_cache[4][4][2]; const int xy= s->mb_x + s->mb_y*s->mb_stride;