summaryrefslogtreecommitdiff
path: root/postproc/swscale.c
diff options
context:
space:
mode:
authorAlan Curry <pacman@world.std.com>2006-02-11 14:16:10 +0000
committerDiego Biurrun <diego@biurrun.de>2006-02-11 14:16:10 +0000
commitd33d485e83e02ed7f367ee543592b053d45c62fc (patch)
tree34ea4626f4becfe9df4c19837e8958fa361838c2 /postproc/swscale.c
parentc9fa86df9d47ac9e2e89c4d83303d5aa00bde4bd (diff)
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 Originally committed as revision 17589 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
Diffstat (limited to 'postproc/swscale.c')
-rw-r--r--postproc/swscale.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/postproc/swscale.c b/postproc/swscale.c
index e4537f7bf2..6f9c203a2a 100644
--- a/postproc/swscale.c
+++ b/postproc/swscale.c
@@ -2110,6 +2110,25 @@ SwsContext *sws_getContext(int srcW, int srcH, int origSrcFormat, int dstW, int
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 @@ void sws_freeContext(SwsContext *c){
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;