Add generic functions for copying packed/planar XV data, copied from
mach64.
This commit is contained in:
parent
2e330e980f
commit
40354e7618
|
@ -56,6 +56,7 @@ of the copyright holder.
|
|||
#include <X11/extensions/Xvproto.h>
|
||||
|
||||
#include "kxv.h"
|
||||
#include "fourcc.h"
|
||||
|
||||
|
||||
/* XvScreenRec fields */
|
||||
|
@ -1777,3 +1778,144 @@ KdXVQueryOffscreenImages(
|
|||
*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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -245,7 +245,17 @@ KdXVQueryOffscreenImages(
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue