changeset 18322:62cdcca26777

Fix some bugs handling input that is not aligned at 16 bytes or has stride!=width.
author pacman
date Thu, 27 Apr 2006 21:42:41 +0000
parents 22be226a5cf5
children d0180ac33e32
files postproc/yuv2rgb_altivec.c
diffstat 1 files changed, 11 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/postproc/yuv2rgb_altivec.c	Thu Apr 27 19:42:36 2006 +0000
+++ b/postproc/yuv2rgb_altivec.c	Thu Apr 27 21:42:41 2006 +0000
@@ -278,7 +278,7 @@
   vector signed short R1,G1,B1;						   \
   vector unsigned char R,G,B;						   \
 									   \
-  vector unsigned char *uivP, *vivP;			   		   \
+  vector unsigned char *y1ivP, *y2ivP, *uivP, *vivP;			   \
   vector unsigned char align_perm;					   \
 									   \
   vector signed short 							   \
@@ -292,7 +292,7 @@
   vector unsigned short lCSHIFT = c->CSHIFT;				   \
 									   \
   ubyte *y1i   = in[0];							   \
-  ubyte *y2i   = in[0]+w;						   \
+  ubyte *y2i   = in[0]+instrides[0];					   \
   ubyte *ui    = in[1];							   \
   ubyte *vi    = in[2];							   \
 									   \
@@ -304,7 +304,7 @@
         (oplanes[0]+srcSliceY*outstrides[0]+outstrides[0]);		   \
 									   \
 									   \
-  instrides_scl[0] = instrides[0];					   \
+  instrides_scl[0] = instrides[0]*2-w;  /* the loop moves y{1,2}i by w */  \
   instrides_scl[1] = instrides[1]-w/2;  /* the loop moves ui by w/2 */	   \
   instrides_scl[2] = instrides[2]-w/2;  /* the loop moves vi by w/2 */	   \
 									   \
@@ -315,11 +315,17 @@
 									   \
     for (j=0;j<w/16;j++) {						   \
 									   \
-      y0 = vec_ldl (0,y1i);						   \
-      y1 = vec_ldl (0,y2i);						   \
+      y1ivP = (vector unsigned char *)y1i;				   \
+      y2ivP = (vector unsigned char *)y2i;				   \
       uivP = (vector unsigned char *)ui;				   \
       vivP = (vector unsigned char *)vi;				   \
 									   \
+      align_perm = vec_lvsl (0, y1i);					   \
+      y0 = (vector unsigned char)vec_perm (y1ivP[0], y1ivP[1], align_perm);\
+									   \
+      align_perm = vec_lvsl (0, y2i);					   \
+      y1 = (vector unsigned char)vec_perm (y2ivP[0], y2ivP[1], align_perm);\
+									   \
       align_perm = vec_lvsl (0, ui);					   \
       u = (vector signed char)vec_perm (uivP[0], uivP[1], align_perm);	   \
 									   \