mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
UYVY input
Originally committed as revision 9072 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
parent
9b1663fcd0
commit
7322a67c39
@ -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
|
||||
{BGR,RGB}{1,4,8,15,16} support dithering
|
||||
|
||||
@ -105,11 +105,11 @@ untested special converters
|
||||
//FIXME replace this with something faster
|
||||
#define isPlanarYUV(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YVU9 \
|
||||
|| (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 isRGB(x) (((x)&IMGFMT_RGB_MASK)==IMGFMT_RGB)
|
||||
#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_RGB32|| (x)==IMGFMT_RGB24\
|
||||
|| (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\
|
||||
@ -118,7 +118,7 @@ untested special converters
|
||||
|| (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P\
|
||||
|| isRGB(x) || isBGR(x)\
|
||||
|| (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 BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5))
|
||||
@ -1904,6 +1904,7 @@ static int remove_dup_fourcc(int fourcc)
|
||||
|
||||
static void getSubSampleFactors(int *h, int *v, int format){
|
||||
switch(format){
|
||||
case IMGFMT_UYVY:
|
||||
case IMGFMT_YUY2:
|
||||
*h=1;
|
||||
*v=0;
|
||||
|
@ -1476,6 +1476,69 @@ static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1,
|
||||
#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)
|
||||
{
|
||||
#ifdef HAVE_MMXFIXME
|
||||
@ -2113,6 +2176,11 @@ static inline void RENAME(hyscale)(uint16_t *dst, int dstWidth, uint8_t *src, in
|
||||
RENAME(yuy2ToY)(formatConvBuffer, src, srcW);
|
||||
src= formatConvBuffer;
|
||||
}
|
||||
else if(srcFormat==IMGFMT_UYVY)
|
||||
{
|
||||
RENAME(uyvyToY)(formatConvBuffer, src, srcW);
|
||||
src= formatConvBuffer;
|
||||
}
|
||||
else if(srcFormat==IMGFMT_BGR32)
|
||||
{
|
||||
RENAME(bgr32ToY)(formatConvBuffer, src, srcW);
|
||||
@ -2265,6 +2333,12 @@ inline static void RENAME(hcscale)(uint16_t *dst, int dstWidth, uint8_t *src1, u
|
||||
src1= formatConvBuffer;
|
||||
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)
|
||||
{
|
||||
RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+2048, src1, src2, srcW);
|
||||
|
Loading…
x
Reference in New Issue
Block a user