Mercurial > mplayer.hg
diff postproc/swscale.c @ 17588:79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
once when the scaler is initialized, instead of building them and freeing
them over and over. This gives massive performance improvements.
patch by Alan Curry, pacman*at*TheWorld*dot*com
author | diego |
---|---|
date | Sat, 11 Feb 2006 14:16:10 +0000 |
parents | f580a7755ac5 |
children | 3a67b7ce8b3b |
line wrap: on
line diff
--- a/postproc/swscale.c Sat Feb 11 13:42:54 2006 +0000 +++ b/postproc/swscale.c Sat Feb 11 14:16:10 2006 +0000 @@ -2110,6 +2110,25 @@ c->chrSrcH, c->chrDstH, filterAlign, (1<<12)-4, (flags&SWS_BICUBLIN) ? (flags|SWS_BILINEAR) : flags, srcFilter->chrV, dstFilter->chrV, c->param); + +#ifdef HAVE_ALTIVEC + c->vYCoeffsBank = memalign (16, sizeof (vector signed short)*c->vLumFilterSize*c->dstH); + c->vCCoeffsBank = memalign (16, sizeof (vector signed short)*c->vChrFilterSize*c->dstH); + + for (i=0;i<c->vLumFilterSize*c->dstH;i++) { + int j; + short *p = (short *)&c->vYCoeffsBank[i]; + for (j=0;j<8;j++) + p[j] = c->vLumFilter[i]; + } + + for (i=0;i<c->vChrFilterSize*c->dstH;i++) { + int j; + short *p = (short *)&c->vCCoeffsBank[i]; + for (j=0;j<8;j++) + p[j] = c->vChrFilter[i]; + } +#endif } // Calculate Buffer Sizes so that they won't run out while handling these damn slices @@ -2644,6 +2663,12 @@ c->hLumFilter = NULL; if(c->hChrFilter) free(c->hChrFilter); c->hChrFilter = NULL; +#ifdef HAVE_ALTIVEC + if(c->vYCoeffsBank) free(c->vYCoeffsBank); + c->vYCoeffsBank = NULL; + if(c->vCCoeffsBank) free(c->vCCoeffsBank); + c->vCCoeffsBank = NULL; +#endif if(c->vLumFilterPos) free(c->vLumFilterPos); c->vLumFilterPos = NULL;