mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-03 14:36:45 +08:00
uyvy output support in swscaler
Originally committed as revision 11069 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
@ -41,6 +41,9 @@ void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, unsigned src_size);
|
|||||||
void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
||||||
unsigned int width, unsigned int height,
|
unsigned int width, unsigned int height,
|
||||||
int lumStride, int chromStride, int dstStride);
|
int lumStride, int chromStride, int dstStride);
|
||||||
|
void (*yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
||||||
|
unsigned int width, unsigned int height,
|
||||||
|
int lumStride, int chromStride, int dstStride);
|
||||||
void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
||||||
unsigned int width, unsigned int height,
|
unsigned int width, unsigned int height,
|
||||||
int lumStride, int chromStride, int dstStride);
|
int lumStride, int chromStride, int dstStride);
|
||||||
@ -213,6 +216,7 @@ void sws_rgb2rgb_init(int flags){
|
|||||||
rgb32tobgr16= rgb32tobgr16_MMX2;
|
rgb32tobgr16= rgb32tobgr16_MMX2;
|
||||||
rgb32tobgr15= rgb32tobgr15_MMX2;
|
rgb32tobgr15= rgb32tobgr15_MMX2;
|
||||||
yv12toyuy2= yv12toyuy2_MMX2;
|
yv12toyuy2= yv12toyuy2_MMX2;
|
||||||
|
yv12touyvy= yv12touyvy_MMX2;
|
||||||
yuv422ptoyuy2= yuv422ptoyuy2_MMX2;
|
yuv422ptoyuy2= yuv422ptoyuy2_MMX2;
|
||||||
yuy2toyv12= yuy2toyv12_MMX2;
|
yuy2toyv12= yuy2toyv12_MMX2;
|
||||||
uyvytoyv12= uyvytoyv12_MMX2;
|
uyvytoyv12= uyvytoyv12_MMX2;
|
||||||
@ -242,6 +246,7 @@ void sws_rgb2rgb_init(int flags){
|
|||||||
rgb32tobgr16= rgb32tobgr16_3DNOW;
|
rgb32tobgr16= rgb32tobgr16_3DNOW;
|
||||||
rgb32tobgr15= rgb32tobgr15_3DNOW;
|
rgb32tobgr15= rgb32tobgr15_3DNOW;
|
||||||
yv12toyuy2= yv12toyuy2_3DNOW;
|
yv12toyuy2= yv12toyuy2_3DNOW;
|
||||||
|
yv12touyvy= yv12touyvy_3DNOW;
|
||||||
yuv422ptoyuy2= yuv422ptoyuy2_3DNOW;
|
yuv422ptoyuy2= yuv422ptoyuy2_3DNOW;
|
||||||
yuy2toyv12= yuy2toyv12_3DNOW;
|
yuy2toyv12= yuy2toyv12_3DNOW;
|
||||||
uyvytoyv12= uyvytoyv12_3DNOW;
|
uyvytoyv12= uyvytoyv12_3DNOW;
|
||||||
@ -271,6 +276,7 @@ void sws_rgb2rgb_init(int flags){
|
|||||||
rgb32tobgr16= rgb32tobgr16_MMX;
|
rgb32tobgr16= rgb32tobgr16_MMX;
|
||||||
rgb32tobgr15= rgb32tobgr15_MMX;
|
rgb32tobgr15= rgb32tobgr15_MMX;
|
||||||
yv12toyuy2= yv12toyuy2_MMX;
|
yv12toyuy2= yv12toyuy2_MMX;
|
||||||
|
yv12touyvy= yv12touyvy_MMX;
|
||||||
yuv422ptoyuy2= yuv422ptoyuy2_MMX;
|
yuv422ptoyuy2= yuv422ptoyuy2_MMX;
|
||||||
yuy2toyv12= yuy2toyv12_MMX;
|
yuy2toyv12= yuy2toyv12_MMX;
|
||||||
uyvytoyv12= uyvytoyv12_MMX;
|
uyvytoyv12= uyvytoyv12_MMX;
|
||||||
@ -302,6 +308,7 @@ void sws_rgb2rgb_init(int flags){
|
|||||||
rgb32tobgr16= rgb32tobgr16_C;
|
rgb32tobgr16= rgb32tobgr16_C;
|
||||||
rgb32tobgr15= rgb32tobgr15_C;
|
rgb32tobgr15= rgb32tobgr15_C;
|
||||||
yv12toyuy2= yv12toyuy2_C;
|
yv12toyuy2= yv12toyuy2_C;
|
||||||
|
yv12touyvy= yv12touyvy_C;
|
||||||
yuv422ptoyuy2= yuv422ptoyuy2_C;
|
yuv422ptoyuy2= yuv422ptoyuy2_C;
|
||||||
yuy2toyv12= yuy2toyv12_C;
|
yuy2toyv12= yuy2toyv12_C;
|
||||||
// uyvytoyv12= uyvytoyv12_C;
|
// uyvytoyv12= uyvytoyv12_C;
|
||||||
|
@ -1568,6 +1568,64 @@ static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
|
|||||||
RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);
|
RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void RENAME(yuvPlanartouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
||||||
|
unsigned int width, unsigned int height,
|
||||||
|
int lumStride, int chromStride, int dstStride, int vertLumPerChroma)
|
||||||
|
{
|
||||||
|
unsigned y;
|
||||||
|
const unsigned chromWidth= width>>1;
|
||||||
|
for(y=0; y<height; y++)
|
||||||
|
{
|
||||||
|
#if __WORDSIZE >= 64
|
||||||
|
int i;
|
||||||
|
uint64_t *ldst = (uint64_t *) dst;
|
||||||
|
const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc;
|
||||||
|
for(i = 0; i < chromWidth; i += 2){
|
||||||
|
uint64_t k, l;
|
||||||
|
k = uc[0] + (yc[0] << 8) +
|
||||||
|
(vc[0] << 16) + (yc[1] << 24);
|
||||||
|
l = uc[1] + (yc[2] << 8) +
|
||||||
|
(vc[1] << 16) + (yc[3] << 24);
|
||||||
|
*ldst++ = k + (l << 32);
|
||||||
|
yc += 4;
|
||||||
|
uc += 2;
|
||||||
|
vc += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
int i, *idst = (int32_t *) dst;
|
||||||
|
const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc;
|
||||||
|
for(i = 0; i < chromWidth; i++){
|
||||||
|
*idst++ = uc[0] + (yc[0] << 8) +
|
||||||
|
(vc[0] << 16) + (yc[1] << 24);
|
||||||
|
yc += 2;
|
||||||
|
uc++;
|
||||||
|
vc++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if((y&(vertLumPerChroma-1))==(vertLumPerChroma-1) )
|
||||||
|
{
|
||||||
|
usrc += chromStride;
|
||||||
|
vsrc += chromStride;
|
||||||
|
}
|
||||||
|
ysrc += lumStride;
|
||||||
|
dst += dstStride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* height should be a multiple of 2 and width should be a multiple of 16 (if this is a
|
||||||
|
* problem for anyone then tell me, and ill fix it)
|
||||||
|
*/
|
||||||
|
static inline void RENAME(yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
|
||||||
|
unsigned int width, unsigned int height,
|
||||||
|
int lumStride, int chromStride, int dstStride)
|
||||||
|
{
|
||||||
|
//FIXME interpolate chroma
|
||||||
|
RENAME(yuvPlanartouyvy)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* width should be a multiple of 16
|
* width should be a multiple of 16
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
supported Input formats: YV12, I420/IYUV, YUY2, UYVY, 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, UYVY, {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
|
||||||
|
|
||||||
unscaled special converters (YV12=I420=IYUV, Y800=Y8)
|
unscaled special converters (YV12=I420=IYUV, Y800=Y8)
|
||||||
@ -107,7 +107,7 @@ untested special converters
|
|||||||
|| (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\
|
|| (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\
|
||||||
|| (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\
|
|| (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\
|
||||||
|| (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P)
|
|| (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P)
|
||||||
#define isSupportedOut(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_YUY2\
|
#define isSupportedOut(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY\
|
||||||
|| (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)
|
||||||
@ -503,6 +503,14 @@ static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilt
|
|||||||
((uint8_t*)dest)[2*i2+3]= V;\
|
((uint8_t*)dest)[2*i2+3]= V;\
|
||||||
} \
|
} \
|
||||||
break;\
|
break;\
|
||||||
|
case IMGFMT_UYVY:\
|
||||||
|
func2\
|
||||||
|
((uint8_t*)dest)[2*i2+0]= U;\
|
||||||
|
((uint8_t*)dest)[2*i2+1]= Y1;\
|
||||||
|
((uint8_t*)dest)[2*i2+2]= V;\
|
||||||
|
((uint8_t*)dest)[2*i2+3]= Y2;\
|
||||||
|
} \
|
||||||
|
break;\
|
||||||
}\
|
}\
|
||||||
|
|
||||||
|
|
||||||
@ -647,6 +655,14 @@ static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **l
|
|||||||
((uint8_t*)dest)[2*i2+3]= V;
|
((uint8_t*)dest)[2*i2+3]= V;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IMGFMT_UYVY:
|
||||||
|
YSCALE_YUV_2_PACKEDX_C(void)
|
||||||
|
((uint8_t*)dest)[2*i2+0]= U;
|
||||||
|
((uint8_t*)dest)[2*i2+1]= Y1;
|
||||||
|
((uint8_t*)dest)[2*i2+2]= V;
|
||||||
|
((uint8_t*)dest)[2*i2+3]= Y2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1336,6 +1352,15 @@ static int PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], i
|
|||||||
return srcSliceH;
|
return srcSliceH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int PlanarToUyvyWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||||
|
int srcSliceH, uint8_t* dstParam[], int dstStride[]){
|
||||||
|
uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
|
||||||
|
|
||||||
|
yv12touyvy( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] );
|
||||||
|
|
||||||
|
return srcSliceH;
|
||||||
|
}
|
||||||
|
|
||||||
/* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */
|
/* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */
|
||||||
static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||||
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
||||||
@ -1821,9 +1846,13 @@ SwsContext *sws_getContext(int srcW, int srcH, int origSrcFormat, int dstW, int
|
|||||||
c->swScale= rgb2rgbWrapper;
|
c->swScale= rgb2rgbWrapper;
|
||||||
|
|
||||||
/* yv12_to_yuy2 */
|
/* yv12_to_yuy2 */
|
||||||
if(srcFormat == IMGFMT_YV12 && dstFormat == IMGFMT_YUY2)
|
if(srcFormat == IMGFMT_YV12 &&
|
||||||
|
(dstFormat == IMGFMT_YUY2 || dstFormat == IMGFMT_UYVY))
|
||||||
{
|
{
|
||||||
c->swScale= PlanarToYuy2Wrapper;
|
if (dstFormat == IMGFMT_YUY2)
|
||||||
|
c->swScale= PlanarToYuy2Wrapper;
|
||||||
|
else
|
||||||
|
c->swScale= PlanarToUyvyWrapper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user