Commit b5a74ef8 authored by michael's avatar michael

UYVY input


git-svn-id: file:///var/local/repositories/mplayer/trunk/postproc@9072 b3059339-0415-0410-9bf9-f77b7e298cf2
parent 15f3fd98
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
*/ */
/* /*
supported Input formats: YV12, I420/IYUV, YUY2, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09
supported output formats: YV12, I420/IYUV, YUY2, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09 supported output formats: YV12, I420/IYUV, YUY2, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09
{BGR,RGB}{1,4,8,15,16} support dithering {BGR,RGB}{1,4,8,15,16} support dithering
...@@ -105,11 +105,11 @@ untested special converters ...@@ -105,11 +105,11 @@ untested special converters
//FIXME replace this with something faster //FIXME replace this with something faster
#define isPlanarYUV(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YVU9 \ #define isPlanarYUV(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YVU9 \
|| (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P) || (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P)
#define isYUV(x) ((x)==IMGFMT_YUY2 || isPlanarYUV(x)) #define isYUV(x) ((x)==IMGFMT_UYVY || (x)==IMGFMT_YUY2 || isPlanarYUV(x))
#define isGray(x) ((x)==IMGFMT_Y800) #define isGray(x) ((x)==IMGFMT_Y800)
#define isRGB(x) (((x)&IMGFMT_RGB_MASK)==IMGFMT_RGB) #define isRGB(x) (((x)&IMGFMT_RGB_MASK)==IMGFMT_RGB)
#define isBGR(x) (((x)&IMGFMT_BGR_MASK)==IMGFMT_BGR) #define isBGR(x) (((x)&IMGFMT_BGR_MASK)==IMGFMT_BGR)
#define isSupportedIn(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YUY2 \ #define isSupportedIn(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY\
|| (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15\ || (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15\
|| (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\ || (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\
|| (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\ || (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\
...@@ -118,7 +118,7 @@ untested special converters ...@@ -118,7 +118,7 @@ untested special converters
|| (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P\ || (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P\
|| isRGB(x) || isBGR(x)\ || isRGB(x) || isBGR(x)\
|| (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9) || (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9)
#define isPacked(x) ((x)==IMGFMT_YUY2 || isRGB(x) || isBGR(x)) #define isPacked(x) ((x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY ||isRGB(x) || isBGR(x))
#define RGB2YUV_SHIFT 16 #define RGB2YUV_SHIFT 16
#define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5)) #define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5))
...@@ -1904,6 +1904,7 @@ static int remove_dup_fourcc(int fourcc) ...@@ -1904,6 +1904,7 @@ static int remove_dup_fourcc(int fourcc)
static void getSubSampleFactors(int *h, int *v, int format){ static void getSubSampleFactors(int *h, int *v, int format){
switch(format){ switch(format){
case IMGFMT_UYVY:
case IMGFMT_YUY2: case IMGFMT_YUY2:
*h=1; *h=1;
*v=0; *v=0;
......
...@@ -1476,6 +1476,69 @@ static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, ...@@ -1476,6 +1476,69 @@ static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1,
#endif #endif
} }
//this is allmost identical to the previous, end exists only cuz yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accesses
static inline void RENAME(uyvyToY)(uint8_t *dst, uint8_t *src, int width)
{
#ifdef HAVE_MMX
asm volatile(
"movl %0, %%eax \n\t"
"1: \n\t"
"movq (%1, %%eax,2), %%mm0 \n\t"
"movq 8(%1, %%eax,2), %%mm1 \n\t"
"psrlw $8, %%mm0 \n\t"
"psrlw $8, %%mm1 \n\t"
"packuswb %%mm1, %%mm0 \n\t"
"movq %%mm0, (%2, %%eax) \n\t"
"addl $8, %%eax \n\t"
" js 1b \n\t"
: : "g" (-width), "r" (src+width*2), "r" (dst+width)
: "%eax"
);
#else
int i;
for(i=0; i<width; i++)
dst[i]= src[2*i+1];
#endif
}
static inline void RENAME(uyvyToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width)
{
#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)
asm volatile(
"movq "MANGLE(bm01010101)", %%mm4\n\t"
"movl %0, %%eax \n\t"
"1: \n\t"
"movq (%1, %%eax,4), %%mm0 \n\t"
"movq 8(%1, %%eax,4), %%mm1 \n\t"
"movq (%2, %%eax,4), %%mm2 \n\t"
"movq 8(%2, %%eax,4), %%mm3 \n\t"
PAVGB(%%mm2, %%mm0)
PAVGB(%%mm3, %%mm1)
"pand %%mm4, %%mm0 \n\t"
"pand %%mm4, %%mm1 \n\t"
"packuswb %%mm1, %%mm0 \n\t"
"movq %%mm0, %%mm1 \n\t"
"psrlw $8, %%mm0 \n\t"
"pand %%mm4, %%mm1 \n\t"
"packuswb %%mm0, %%mm0 \n\t"
"packuswb %%mm1, %%mm1 \n\t"
"movd %%mm0, (%4, %%eax) \n\t"
"movd %%mm1, (%3, %%eax) \n\t"
"addl $4, %%eax \n\t"
" js 1b \n\t"
: : "g" (-width), "r" (src1+width*4), "r" (src2+width*4), "r" (dstU+width), "r" (dstV+width)
: "%eax"
);
#else
int i;
for(i=0; i<width; i++)
{
dstU[i]= (src1[4*i + 0] + src2[4*i + 0])>>1;
dstV[i]= (src1[4*i + 2] + src2[4*i + 2])>>1;
}
#endif
}
static inline void RENAME(bgr32ToY)(uint8_t *dst, uint8_t *src, int width) static inline void RENAME(bgr32ToY)(uint8_t *dst, uint8_t *src, int width)
{ {
#ifdef HAVE_MMXFIXME #ifdef HAVE_MMXFIXME
...@@ -2113,6 +2176,11 @@ static inline void RENAME(hyscale)(uint16_t *dst, int dstWidth, uint8_t *src, in ...@@ -2113,6 +2176,11 @@ static inline void RENAME(hyscale)(uint16_t *dst, int dstWidth, uint8_t *src, in
RENAME(yuy2ToY)(formatConvBuffer, src, srcW); RENAME(yuy2ToY)(formatConvBuffer, src, srcW);
src= formatConvBuffer; src= formatConvBuffer;
} }
else if(srcFormat==IMGFMT_UYVY)
{
RENAME(uyvyToY)(formatConvBuffer, src, srcW);
src= formatConvBuffer;
}
else if(srcFormat==IMGFMT_BGR32) else if(srcFormat==IMGFMT_BGR32)
{ {
RENAME(bgr32ToY)(formatConvBuffer, src, srcW); RENAME(bgr32ToY)(formatConvBuffer, src, srcW);
...@@ -2265,6 +2333,12 @@ inline static void RENAME(hcscale)(uint16_t *dst, int dstWidth, uint8_t *src1, u ...@@ -2265,6 +2333,12 @@ inline static void RENAME(hcscale)(uint16_t *dst, int dstWidth, uint8_t *src1, u
src1= formatConvBuffer; src1= formatConvBuffer;
src2= formatConvBuffer+2048; src2= formatConvBuffer+2048;
} }
else if(srcFormat==IMGFMT_UYVY)
{
RENAME(uyvyToUV)(formatConvBuffer, formatConvBuffer+2048, src1, src2, srcW);
src1= formatConvBuffer;
src2= formatConvBuffer+2048;
}
else if(srcFormat==IMGFMT_BGR32) else if(srcFormat==IMGFMT_BGR32)
{ {
RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+2048, src1, src2, srcW); RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+2048, src1, src2, srcW);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment