*
* Copyright (C) 2009 Konstantin Shishkov
*
- * MMX/MMX2 template stuff (needed for fast movntq support),
* 1,4,8bpp support and context / deglobalize stuff
* by Michael Niedermayer (michaelni@gmx.at)
*
#include "swscale_internal.h"
#include "libavutil/x86_cpu.h"
-#define DITHER1XBPP // only for MMX
-
extern const uint8_t dither_8x8_32[8][8];
extern const uint8_t dither_8x8_73[8][8];
extern const uint8_t dither_8x8_220[8][8];
-#if HAVE_MMX && CONFIG_GPL
-
-/* hope these constant values are cache line aligned */
-DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL;
-DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL;
-DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL;
-
-//MMX versions
-#undef RENAME
-#undef HAVE_MMX2
-#undef HAVE_AMD3DNOW
-#define HAVE_MMX2 0
-#define HAVE_AMD3DNOW 0
-#define RENAME(a) a ## _MMX
-#include "yuv2rgb_template.c"
-
-//MMX2 versions
-#undef RENAME
-#undef HAVE_MMX2
-#define HAVE_MMX2 1
-#define RENAME(a) a ## _MMX2
-#include "yuv2rgb_template.c"
-
-#endif /* HAVE_MMX && CONFIG_GPL */
-
const int32_t ff_yuv2rgb_coeffs[8][4] = {
{117504, 138453, 13954, 34903}, /* no sequence_display_extension */
{117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
g = (void *)(c->table_gU[U] + c->table_gV[V]); \
b = (void *)c->table_bU[U];
-#define PUTRGB(dst,src,i,o) \
- Y = src[2*i+o]; \
+#define PUTRGB(dst,src,i) \
+ Y = src[2*i]; \
dst[2*i ] = r[Y] + g[Y] + b[Y]; \
- Y = src[2*i+1-o]; \
+ Y = src[2*i+1]; \
dst[2*i+1] = r[Y] + g[Y] + b[Y];
#define PUTRGB24(dst,src,i) \
Y = src[2*i+1]; \
dst[6*i+3] = b[Y]; dst[6*i+4] = g[Y]; dst[6*i+5] = r[Y];
-#define PUTRGBA(dst,ysrc,asrc,i,o,s) \
- Y = ysrc[2*i+o]; \
+#define PUTRGBA(dst,ysrc,asrc,i,s) \
+ Y = ysrc[2*i]; \
dst[2*i ] = r[Y] + g[Y] + b[Y] + (asrc[2*i ]<<s); \
- Y = ysrc[2*i+1-o]; \
+ Y = ysrc[2*i+1]; \
dst[2*i+1] = r[Y] + g[Y] + b[Y] + (asrc[2*i+1]<<s);
+#define PUTRGB48(dst,src,i) \
+ Y = src[2*i]; \
+ dst[12*i+ 0] = dst[12*i+ 1] = r[Y]; \
+ dst[12*i+ 2] = dst[12*i+ 3] = g[Y]; \
+ dst[12*i+ 4] = dst[12*i+ 5] = b[Y]; \
+ Y = src[2*i+1]; \
+ dst[12*i+ 6] = dst[12*i+ 7] = r[Y]; \
+ dst[12*i+ 8] = dst[12*i+ 9] = g[Y]; \
+ dst[12*i+10] = dst[12*i+11] = b[Y];
+
#define YUV2RGBFUNC(func_name, dst_type, alpha) \
-static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, \
- int srcSliceH, uint8_t* dst[], int dstStride[]){\
+static int func_name(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY, \
+ int srcSliceH, uint8_t* dst[], int dstStride[]) \
+{\
int y;\
\
if (!alpha && c->srcFormat == PIX_FMT_YUV422P) {\
dst_type *dst_2 = (dst_type*)(dst[0] + (y+srcSliceY+1)*dstStride[0]);\
dst_type av_unused *r, *b;\
dst_type *g;\
- uint8_t *py_1 = src[0] + y*srcStride[0];\
- uint8_t *py_2 = py_1 + srcStride[0];\
- uint8_t *pu = src[1] + (y>>1)*srcStride[1];\
- uint8_t *pv = src[2] + (y>>1)*srcStride[2];\
- uint8_t av_unused *pa_1, *pa_2;\
+ const uint8_t *py_1 = src[0] + y*srcStride[0];\
+ const uint8_t *py_2 = py_1 + srcStride[0];\
+ const uint8_t *pu = src[1] + (y>>1)*srcStride[1];\
+ const uint8_t *pv = src[2] + (y>>1)*srcStride[2];\
+ const uint8_t av_unused *pa_1, *pa_2;\
unsigned int h_size = c->dstW>>3;\
- if (alpha){\
+ if (alpha) {\
pa_1 = src[3] + y*srcStride[3];\
pa_2 = pa_1 + srcStride[3];\
}\
ENDYUV2RGBLINE(dst_delta)\
ENDYUV2RGBFUNC()
-YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0)
+YUV2RGBFUNC(yuv2rgb_c_48, uint8_t, 0)
+ LOADCHROMA(0);
+ PUTRGB48(dst_1,py_1,0);
+ PUTRGB48(dst_2,py_2,0);
+
+ LOADCHROMA(1);
+ PUTRGB48(dst_2,py_2,1);
+ PUTRGB48(dst_1,py_1,1);
+
+ LOADCHROMA(2);
+ PUTRGB48(dst_1,py_1,2);
+ PUTRGB48(dst_2,py_2,2);
+
+ LOADCHROMA(3);
+ PUTRGB48(dst_2,py_2,3);
+ PUTRGB48(dst_1,py_1,3);
+ENDYUV2RGBLINE(48)
LOADCHROMA(0);
- PUTRGB(dst_1,py_1,0,0);
- PUTRGB(dst_2,py_2,0,1);
+ PUTRGB48(dst_1,py_1,0);
+ PUTRGB48(dst_2,py_2,0);
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB48(dst_2,py_2,1);
+ PUTRGB48(dst_1,py_1,1);
+ENDYUV2RGBFUNC()
+
+YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0)
+ LOADCHROMA(0);
+ PUTRGB(dst_1,py_1,0);
+ PUTRGB(dst_2,py_2,0);
+
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB(dst_2,py_2,1);
+ PUTRGB(dst_1,py_1,1);
LOADCHROMA(2);
- PUTRGB(dst_1,py_1,2,0);
- PUTRGB(dst_2,py_2,2,1);
+ PUTRGB(dst_1,py_1,2);
+ PUTRGB(dst_2,py_2,2);
LOADCHROMA(3);
- PUTRGB(dst_2,py_2,3,1);
- PUTRGB(dst_1,py_1,3,0);
+ PUTRGB(dst_2,py_2,3);
+ PUTRGB(dst_1,py_1,3);
ENDYUV2RGBLINE(8)
LOADCHROMA(0);
- PUTRGB(dst_1,py_1,0,0);
- PUTRGB(dst_2,py_2,0,1);
+ PUTRGB(dst_1,py_1,0);
+ PUTRGB(dst_2,py_2,0);
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB(dst_2,py_2,1);
+ PUTRGB(dst_1,py_1,1);
ENDYUV2RGBFUNC()
YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1)
LOADCHROMA(0);
- PUTRGBA(dst_1,py_1,pa_1,0,0,24);
- PUTRGBA(dst_2,py_2,pa_2,0,1,24);
+ PUTRGBA(dst_1,py_1,pa_1,0,24);
+ PUTRGBA(dst_2,py_2,pa_2,0,24);
LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_1,1,1,24);
- PUTRGBA(dst_1,py_1,pa_2,1,0,24);
- LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_1,1,1,24);
- PUTRGBA(dst_1,py_1,pa_2,1,0,24);
+ PUTRGBA(dst_2,py_2,pa_1,1,24);
+ PUTRGBA(dst_1,py_1,pa_2,1,24);
LOADCHROMA(2);
- PUTRGBA(dst_1,py_1,pa_1,2,0,24);
- PUTRGBA(dst_2,py_2,pa_2,2,1,24);
+ PUTRGBA(dst_1,py_1,pa_1,2,24);
+ PUTRGBA(dst_2,py_2,pa_2,2,24);
LOADCHROMA(3);
- PUTRGBA(dst_2,py_2,pa_1,3,1,24);
- PUTRGBA(dst_1,py_1,pa_2,3,0,24);
+ PUTRGBA(dst_2,py_2,pa_1,3,24);
+ PUTRGBA(dst_1,py_1,pa_2,3,24);
pa_1 += 8;\
pa_2 += 8;\
ENDYUV2RGBLINE(8)
LOADCHROMA(0);
- PUTRGBA(dst_1,py_1,pa_1,0,0,24);
- PUTRGBA(dst_2,py_2,pa_2,0,1,24);
+ PUTRGBA(dst_1,py_1,pa_1,0,24);
+ PUTRGBA(dst_2,py_2,pa_2,0,24);
LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_1,1,1,24);
- PUTRGBA(dst_1,py_1,pa_2,1,0,24);
+ PUTRGBA(dst_2,py_2,pa_1,1,24);
+ PUTRGBA(dst_1,py_1,pa_2,1,24);
ENDYUV2RGBFUNC()
YUV2RGBFUNC(yuva2argb_c, uint32_t, 1)
LOADCHROMA(0);
- PUTRGBA(dst_1,py_1,pa_1,0,0,0);
- PUTRGBA(dst_2,py_2,pa_2,0,1,0);
+ PUTRGBA(dst_1,py_1,pa_1,0,0);
+ PUTRGBA(dst_2,py_2,pa_2,0,0);
LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_2,1,1,0);
- PUTRGBA(dst_1,py_1,pa_1,1,0,0);
- LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_2,1,1,0);
- PUTRGBA(dst_1,py_1,pa_1,1,0,0);
+ PUTRGBA(dst_2,py_2,pa_2,1,0);
+ PUTRGBA(dst_1,py_1,pa_1,1,0);
LOADCHROMA(2);
- PUTRGBA(dst_1,py_1,pa_1,2,0,0);
- PUTRGBA(dst_2,py_2,pa_2,2,1,0);
+ PUTRGBA(dst_1,py_1,pa_1,2,0);
+ PUTRGBA(dst_2,py_2,pa_2,2,0);
LOADCHROMA(3);
- PUTRGBA(dst_2,py_2,pa_2,3,1,0);
- PUTRGBA(dst_1,py_1,pa_1,3,0,0);
+ PUTRGBA(dst_2,py_2,pa_2,3,0);
+ PUTRGBA(dst_1,py_1,pa_1,3,0);
pa_1 += 8;\
pa_2 += 8;\
ENDYUV2RGBLINE(8)
LOADCHROMA(0);
- PUTRGBA(dst_1,py_1,pa_1,0,0,0);
- PUTRGBA(dst_2,py_2,pa_2,0,1,0);
+ PUTRGBA(dst_1,py_1,pa_1,0,0);
+ PUTRGBA(dst_2,py_2,pa_2,0,0);
LOADCHROMA(1);
- PUTRGBA(dst_2,py_2,pa_2,1,1,0);
- PUTRGBA(dst_1,py_1,pa_1,1,0,0);
+ PUTRGBA(dst_2,py_2,pa_2,1,0);
+ PUTRGBA(dst_1,py_1,pa_1,1,0);
ENDYUV2RGBFUNC()
YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0)
// r, g, b, dst_1, dst_2
YUV2RGBFUNC(yuv2rgb_c_16, uint16_t, 0)
LOADCHROMA(0);
- PUTRGB(dst_1,py_1,0,0);
- PUTRGB(dst_2,py_2,0,1);
+ PUTRGB(dst_1,py_1,0);
+ PUTRGB(dst_2,py_2,0);
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB(dst_2,py_2,1);
+ PUTRGB(dst_1,py_1,1);
LOADCHROMA(2);
- PUTRGB(dst_1,py_1,2,0);
- PUTRGB(dst_2,py_2,2,1);
+ PUTRGB(dst_1,py_1,2);
+ PUTRGB(dst_2,py_2,2);
LOADCHROMA(3);
- PUTRGB(dst_2,py_2,3,1);
- PUTRGB(dst_1,py_1,3,0);
+ PUTRGB(dst_2,py_2,3);
+ PUTRGB(dst_1,py_1,3);
CLOSEYUV2RGBFUNC(8)
// This is exactly the same code as yuv2rgb_c_32 except for the types of
// r, g, b, dst_1, dst_2
YUV2RGBFUNC(yuv2rgb_c_8, uint8_t, 0)
LOADCHROMA(0);
- PUTRGB(dst_1,py_1,0,0);
- PUTRGB(dst_2,py_2,0,1);
+ PUTRGB(dst_1,py_1,0);
+ PUTRGB(dst_2,py_2,0);
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB(dst_2,py_2,1);
+ PUTRGB(dst_1,py_1,1);
LOADCHROMA(2);
- PUTRGB(dst_1,py_1,2,0);
- PUTRGB(dst_2,py_2,2,1);
+ PUTRGB(dst_1,py_1,2);
+ PUTRGB(dst_2,py_2,2);
LOADCHROMA(3);
- PUTRGB(dst_2,py_2,3,1);
- PUTRGB(dst_1,py_1,3,0);
+ PUTRGB(dst_2,py_2,3);
+ PUTRGB(dst_1,py_1,3);
CLOSEYUV2RGBFUNC(8)
// r, g, b, dst_1, dst_2
// r, g, b, dst_1, dst_2
YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t, 0)
LOADCHROMA(0);
- PUTRGB(dst_1,py_1,0,0);
- PUTRGB(dst_2,py_2,0,1);
+ PUTRGB(dst_1,py_1,0);
+ PUTRGB(dst_2,py_2,0);
LOADCHROMA(1);
- PUTRGB(dst_2,py_2,1,1);
- PUTRGB(dst_1,py_1,1,0);
+ PUTRGB(dst_2,py_2,1);
+ PUTRGB(dst_1,py_1,1);
LOADCHROMA(2);
- PUTRGB(dst_1,py_1,2,0);
- PUTRGB(dst_2,py_2,2,1);
+ PUTRGB(dst_1,py_1,2);
+ PUTRGB(dst_2,py_2,2);
LOADCHROMA(3);
- PUTRGB(dst_2,py_2,3,1);
- PUTRGB(dst_1,py_1,3,0);
+ PUTRGB(dst_2,py_2,3);
+ PUTRGB(dst_1,py_1,3);
CLOSEYUV2RGBFUNC(8)
YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0)
{
SwsFunc t = NULL;
#if (HAVE_MMX2 || HAVE_MMX) && CONFIG_GPL
- if (c->flags & SWS_CPU_CAPS_MMX2) {
- switch (c->dstFormat) {
- case PIX_FMT_RGB32:
- if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P){
-#if HAVE_7REGS
- return yuva420_rgb32_MMX2;
-#else
- break;
-#endif
- }else return yuv420_rgb32_MMX2;
- case PIX_FMT_BGR24: return yuv420_rgb24_MMX2;
- case PIX_FMT_RGB565: return yuv420_rgb16_MMX2;
- case PIX_FMT_RGB555: return yuv420_rgb15_MMX2;
- }
- }
- if (c->flags & SWS_CPU_CAPS_MMX) {
- switch (c->dstFormat) {
- case PIX_FMT_RGB32:
- if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P){
-#if HAVE_7REGS
- return yuva420_rgb32_MMX;
-#else
- break;
-#endif
- }else return yuv420_rgb32_MMX;
- case PIX_FMT_BGR24: return yuv420_rgb24_MMX;
- case PIX_FMT_RGB565: return yuv420_rgb16_MMX;
- case PIX_FMT_RGB555: return yuv420_rgb15_MMX;
- }
- }
+ t = ff_yuv2rgb_init_mmx(c);
#endif
#if HAVE_VIS
t = ff_yuv2rgb_init_vis(c);
#if CONFIG_MLIB
t = ff_yuv2rgb_init_mlib(c);
#endif
-#if HAVE_ALTIVEC && CONFIG_GPL
+#if HAVE_ALTIVEC
if (c->flags & SWS_CPU_CAPS_ALTIVEC)
t = ff_yuv2rgb_init_altivec(c);
#endif
av_log(c, AV_LOG_WARNING, "No accelerated colorspace conversion found.\n");
switch (c->dstFormat) {
+ case PIX_FMT_RGB48BE:
+ case PIX_FMT_RGB48LE: return yuv2rgb_c_48;
case PIX_FMT_ARGB:
case PIX_FMT_ABGR: if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) return yuva2argb_c;
case PIX_FMT_RGBA:
fill_gv_table(c->table_gV, 2, cgv);
break;
case 24:
+ case 48:
c->yuvTable = av_malloc(1024);
y_table = c->yuvTable;
yb = -(384<<16) - oy;