xserver/hw/kdrive/src kxv.c,1.9,1.10 kxv.h,1.4,1.5

Eric Anholt xserver-commit at pdx.freedesktop.org
Thu May 13 15:57:17 PDT 2004


Committed by: anholt

Update of /cvs/xserver/xserver/hw/kdrive/src
In directory pdx:/home/anholt/xserver/hw/kdrive/src

Modified Files:
	kxv.c kxv.h 
Log Message:
Add generic functions for copying packed/planar XV data, copied
from mach64.


Index: kxv.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kxv.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- a/kxv.c	10 Nov 2003 20:35:05 -0000	1.9
+++ b/kxv.c	13 May 2004 22:57:15 -0000	1.10
@@ -56,6 +56,7 @@
 #include <X11/extensions/Xvproto.h>
 
 #include "kxv.h"
+#include "fourcc.h"
 
 
 /* XvScreenRec fields */
@@ -1777,3 +1778,144 @@
    *num = OffscreenImages[pScreen->myNum].num;
    return OffscreenImages[pScreen->myNum].images;
 }
+
+/****************  Common video manipulation functions *******************/
+
+void
+KdXVCopyPackedData(KdScreenInfo *screen, CARD8 *src, CARD8 *dst, int randr,
+    int srcPitch, int dstPitch, int srcW, int srcH, int top, int left,
+    int h, int w)
+{
+    int srcDown = srcPitch, srcRight = 2, srcNext;
+    int p;
+
+    switch (randr & RR_Rotate_All) {
+    case RR_Rotate_0:
+	srcDown = srcPitch;
+	srcRight = 2;
+	break;
+    case RR_Rotate_90:
+	src += (srcH - 1) * 2;
+	srcDown = -2;
+	srcRight = srcPitch;
+	break;
+    case RR_Rotate_180:
+	src += srcPitch * (srcH - 1) + (srcW - 1) * 2;
+	srcDown = -srcPitch;
+	srcRight = -2;
+	break;
+    case RR_Rotate_270:
+	src += srcPitch * (srcW - 1);
+	srcDown = 2;
+	srcRight = -srcPitch;
+	break;
+    }
+
+    src = src + top * srcDown + left * srcRight;
+
+    w >>= 1;
+    srcRight >>= 1;
+    srcNext = srcRight >> 1;
+    while (h--) {
+	CARD16 *s = (CARD16 *)src;
+	CARD32 *d = (CARD32 *)dst;
+	p = w;
+	while (p--) {
+	    *d++ = s[0] | (s[srcNext] << 16);
+	    s += srcRight;
+	}
+	src += srcPitch;
+	dst += dstPitch;
+    }
+}
+
+void
+KdXVCopyPlanarData(KdScreenInfo *screen, CARD8 *src, CARD8 *dst, int randr,
+    int srcPitch, int srcPitch2, int dstPitch, int srcW, int srcH, int height,
+    int top, int left, int h, int w, int id)
+{
+    int i, j;
+    CARD8 *src1, *src2, *src3, *dst1;
+    int srcDown = srcPitch, srcDown2 = srcPitch2;
+    int srcRight = 2, srcRight2 = 1, srcNext = 1;
+
+    /* compute source data pointers */
+    src1 = src;
+    src2 = src1 + height * srcPitch;
+    src3 = src2 + (height >> 1) * srcPitch2;
+    switch (randr & RR_Rotate_All) {
+    case RR_Rotate_0:
+	srcDown = srcPitch;
+	srcDown2 = srcPitch2;
+	srcRight = 2;
+	srcRight2 = 1;
+	srcNext = 1;
+	break;
+    case RR_Rotate_90:
+	src1 = src1 + srcH - 1;
+	src2 = src2 + (srcH >> 1) - 1;
+	src3 = src3 + (srcH >> 1) - 1;
+	srcDown = -1;
+	srcDown2 = -1;
+	srcRight = srcPitch * 2;
+	srcRight2 = srcPitch2;
+	srcNext = srcPitch;
+	break;
+    case RR_Rotate_180:
+	src1 = src1 + srcPitch * (srcH - 1) + (srcW - 1);
+	src2 = src2 + srcPitch2 * ((srcH >> 1) - 1) + ((srcW >> 1) - 1);
+	src3 = src3 + srcPitch2 * ((srcH >> 1) - 1) + ((srcW >> 1) - 1);
+	srcDown = -srcPitch;
+	srcDown2 = -srcPitch2;
+	srcRight = -2;
+	srcRight2 = -1;
+	srcNext = -1;
+	break;
+    case RR_Rotate_270:
+	src1 = src1 + srcPitch * (srcW - 1);
+	src2 = src2 + srcPitch2 * ((srcW >> 1) - 1);
+	src3 = src3 + srcPitch2 * ((srcW >> 1) - 1);
+	srcDown = 1;
+	srcDown2 = 1;
+	srcRight = -srcPitch * 2;
+	srcRight2 = -srcPitch2;
+	srcNext = -srcPitch;
+	break;
+    }
+
+    /* adjust for origin */
+    src1 += top * srcDown + left * srcNext;
+    src2 += (top >> 1) * srcDown2 + (left >> 1) * srcRight2;
+    src3 += (top >> 1) * srcDown2 + (left >> 1) * srcRight2;
+
+    if (id == FOURCC_I420) {
+	CARD8 *srct = src2;
+	src2 = src3;
+	src3 = srct;
+    }
+
+    dst1 = dst;
+
+    w >>= 1;
+    for (j = 0; j < h; j++) {
+	CARD32 *dst = (CARD32 *)dst1;
+	CARD8 *s1l = src1;
+	CARD8 *s1r = src1 + srcNext;
+	CARD8 *s2 = src2;
+	CARD8 *s3 = src3;
+
+	for (i = 0; i < w; i++) {
+	    *dst++ = *s1l | (*s1r << 16) | (*s3 << 8) | (*s2 << 24);
+	    s1l += srcRight;
+	    s1r += srcRight;
+	    s2 += srcRight2;
+	    s3 += srcRight2;
+	}
+	src1 += srcDown;
+	dst1 += dstPitch;
+	if (j & 1) {
+	    src2 += srcDown2;
+	    src3 += srcDown2;
+	}
+    }
+}

Index: kxv.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/src/kxv.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- a/kxv.h	10 Nov 2003 20:35:05 -0000	1.4
+++ b/kxv.h	13 May 2004 22:57:15 -0000	1.5
@@ -245,7 +245,17 @@
    ScreenPtr pScreen,
    int *num
 );
-   
+
+void
+KdXVCopyPackedData(KdScreenInfo *screen, CARD8 *src, CARD8 *dst, int randr,
+   int srcPitch, int dstPitch, int srcW, int srcH, int top, int left,
+   int h, int w);
+
+void
+KdXVCopyPlanarData(KdScreenInfo *screen, CARD8 *src, CARD8 *dst, int randr,
+   int srcPitch, int srcPitch2, int dstPitch, int srcW, int srcH, int height,
+   int top, int left, int h, int w, int id);
+
 KdVideoAdaptorPtr KdXVAllocateVideoAdaptorRec(KdScreenInfo * screen);
 
 void KdXVFreeVideoAdaptorRec(KdVideoAdaptorPtr ptr);




More information about the xserver-commit mailing list