# HG changeset patch # User bcoudurier # Date 1220574339 0 # Node ID fe28a794c04f2a04f64ba768cb49444fda2e404e # Parent 89971b14c3358fcecbec5a577b21e34fd538e80f enable yuv422p to uyvy converter diff -r 89971b14c335 -r fe28a794c04f libswscale/rgb2rgb.c --- a/libswscale/rgb2rgb.c Thu Sep 04 23:36:17 2008 +0000 +++ b/libswscale/rgb2rgb.c Fri Sep 05 00:25:39 2008 +0000 @@ -65,6 +65,9 @@ void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, long width, long height, long lumStride, long chromStride, long dstStride); +void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, + long width, long height, + long lumStride, long chromStride, long dstStride); void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, long width, long height, long lumStride, long chromStride, long srcStride); diff -r 89971b14c335 -r fe28a794c04f libswscale/rgb2rgb.h --- a/libswscale/rgb2rgb.h Thu Sep 04 23:36:17 2008 +0000 +++ b/libswscale/rgb2rgb.h Fri Sep 05 00:25:39 2008 +0000 @@ -110,6 +110,14 @@ long lumStride, long chromStride, long dstStride); /** + * + * width should be a multiple of 16 + */ +extern void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, + long width, long height, + long lumStride, long chromStride, long dstStride); + +/** * Height should be a multiple of 2 and width should be a multiple of 2. * (If this is a problem for anyone then tell me, and I will fix it.) * Chrominance data is only taken from every second line, others are ignored. diff -r 89971b14c335 -r fe28a794c04f libswscale/rgb2rgb_template.c --- a/libswscale/rgb2rgb_template.c Thu Sep 04 23:36:17 2008 +0000 +++ b/libswscale/rgb2rgb_template.c Fri Sep 05 00:25:39 2008 +0000 @@ -1758,6 +1758,16 @@ /** * Width should be a multiple of 16. */ +static inline void RENAME(yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, + long width, long height, + long lumStride, long chromStride, long dstStride) +{ + RENAME(yuvPlanartouyvy)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 1); +} + +/** + * Width should be a multiple of 16. + */ static inline void RENAME(yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, long width, long height, long lumStride, long chromStride, long dstStride) @@ -2727,6 +2737,7 @@ yv12toyuy2 = RENAME(yv12toyuy2); yv12touyvy = RENAME(yv12touyvy); yuv422ptoyuy2 = RENAME(yuv422ptoyuy2); + yuv422ptouyvy = RENAME(yuv422ptouyvy); yuy2toyv12 = RENAME(yuy2toyv12); // uyvytoyv12 = RENAME(uyvytoyv12); // yvu9toyv12 = RENAME(yvu9toyv12); diff -r 89971b14c335 -r fe28a794c04f libswscale/swscale.c --- a/libswscale/swscale.c Thu Sep 04 23:36:17 2008 +0000 +++ b/libswscale/swscale.c Fri Sep 05 00:25:39 2008 +0000 @@ -1648,6 +1648,24 @@ return srcSliceH; } +static int YUV422PToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; + + yuv422ptoyuy2(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0]); + + return srcSliceH; +} + +static int YUV422PToUyvyWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; + + yuv422ptouyvy(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0]); + + return srcSliceH; +} + /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */ static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ @@ -2233,6 +2251,14 @@ && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)))) c->swScale= rgb2rgbWrapper; + if (srcFormat == PIX_FMT_YUV422P) + { + if (dstFormat == PIX_FMT_YUYV422) + c->swScale= YUV422PToYuy2Wrapper; + else if (dstFormat == PIX_FMT_UYVY422) + c->swScale= YUV422PToUyvyWrapper; + } + /* LQ converters if -sws 0 or -sws 4*/ if (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)){ /* yv12_to_yuy2 */