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 <X11/extensions/Xvproto.h>
|
||||||
|
|
||||||
#include "kxv.h"
|
#include "kxv.h"
|
||||||
|
#include "fourcc.h"
|
||||||
|
|
||||||
|
|
||||||
/* XvScreenRec fields */
|
/* XvScreenRec fields */
|
||||||
|
@ -1777,3 +1778,144 @@ KdXVQueryOffscreenImages(
|
||||||
*num = OffscreenImages[pScreen->myNum].num;
|
*num = OffscreenImages[pScreen->myNum].num;
|
||||||
return OffscreenImages[pScreen->myNum].images;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -246,6 +246,16 @@ KdXVQueryOffscreenImages(
|
||||||
int *num
|
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);
|
KdVideoAdaptorPtr KdXVAllocateVideoAdaptorRec(KdScreenInfo * screen);
|
||||||
|
|
||||||
void KdXVFreeVideoAdaptorRec(KdVideoAdaptorPtr ptr);
|
void KdXVFreeVideoAdaptorRec(KdVideoAdaptorPtr ptr);
|
||||||
|
|
Loading…
Reference in New Issue