]> git.sesse.net Git - ffmpeg/blobdiff - libswscale/yuv2rgb.c
Const correctness for src pointer. Remove all constness related warnings in
[ffmpeg] / libswscale / yuv2rgb.c
index 65af412c2c06788391cfeb81c13d69091779bbe8..5e20dc843a37aac97445b0e6651c65cf18ab5912 100644 (file)
@@ -3,7 +3,6 @@
  *
  * 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 "rgb2rgb.h"
 #include "swscale.h"
 #include "swscale_internal.h"
-
-#define DITHER1XBPP // only for MMX
+#include "libavutil/x86_cpu.h"
 
 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) */
@@ -83,10 +56,10 @@ const int32_t ff_yuv2rgb_coeffs[8][4] = {
     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)                                  \
@@ -101,12 +74,29 @@ const int32_t ff_yuv2rgb_coeffs[8][4] = {
     Y = src[2*i+1];                                          \
     dst[6*i+3] = b[Y]; dst[6*i+4] = g[Y]; dst[6*i+5] = r[Y];
 
-#define YUV2RGBFUNC(func_name, dst_type) \
-static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, \
-                     int srcSliceH, uint8_t* dst[], int dstStride[]){\
+#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];                                    \
+    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, const uint8_t* src[], int srcStride[], int srcSliceY, \
+                     int srcSliceH, uint8_t* dst[], int dstStride[]) \
+{\
     int y;\
 \
-    if (c->srcFormat == PIX_FMT_YUV422P) {\
+    if (!alpha && c->srcFormat == PIX_FMT_YUV422P) {\
         srcStride[1] *= 2;\
         srcStride[2] *= 2;\
     }\
@@ -115,11 +105,16 @@ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSlic
         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];\
+        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) {\
+            pa_1 = src[3] + y*srcStride[3];\
+            pa_2 = pa_1 + srcStride[3];\
+        }\
         while (h_size--) {\
             int av_unused U, V;\
             int Y;\
@@ -145,36 +140,115 @@ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSlic
     ENDYUV2RGBLINE(dst_delta)\
     ENDYUV2RGBFUNC()
 
-YUV2RGBFUNC(yuv2rgb_c_32, uint32_t)
+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);
+    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);
+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);
+    PUTRGB(dst_1,py_1,1);
+
+    LOADCHROMA(2);
+    PUTRGB(dst_1,py_1,2);
+    PUTRGB(dst_2,py_2,2);
+
+    LOADCHROMA(3);
+    PUTRGB(dst_2,py_2,3);
+    PUTRGB(dst_1,py_1,3);
+ENDYUV2RGBLINE(8)
+    LOADCHROMA(0);
+    PUTRGB(dst_1,py_1,0);
+    PUTRGB(dst_2,py_2,0);
+
+    LOADCHROMA(1);
+    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,24);
+    PUTRGBA(dst_2,py_2,pa_2,0,24);
+
+    LOADCHROMA(1);
+    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,24);
+    PUTRGBA(dst_2,py_2,pa_2,2,24);
+
+    LOADCHROMA(3);
+    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);
-    PUTRGB(dst_1,py_1,0,0);
-    PUTRGB(dst_2,py_2,0,1);
+    PUTRGBA(dst_1,py_1,pa_1,0,24);
+    PUTRGBA(dst_2,py_2,pa_2,0,24);
 
     LOADCHROMA(1);
-    PUTRGB(dst_2,py_2,1,1);
-    PUTRGB(dst_1,py_1,1,0);
+    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);
+    PUTRGBA(dst_2,py_2,pa_2,0,0);
+
     LOADCHROMA(1);
-    PUTRGB(dst_2,py_2,1,1);
-    PUTRGB(dst_1,py_1,1,0);
+    PUTRGBA(dst_2,py_2,pa_2,1,0);
+    PUTRGBA(dst_1,py_1,pa_1,1,0);
 
     LOADCHROMA(2);
-    PUTRGB(dst_1,py_1,2,0);
-    PUTRGB(dst_2,py_2,2,1);
+    PUTRGBA(dst_1,py_1,pa_1,2,0);
+    PUTRGBA(dst_2,py_2,pa_2,2,0);
 
     LOADCHROMA(3);
-    PUTRGB(dst_2,py_2,3,1);
-    PUTRGB(dst_1,py_1,3,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);
-    PUTRGB(dst_1,py_1,0,0);
-    PUTRGB(dst_2,py_2,0,1);
+    PUTRGBA(dst_1,py_1,pa_1,0,0);
+    PUTRGBA(dst_2,py_2,pa_2,0,0);
 
     LOADCHROMA(1);
-    PUTRGB(dst_2,py_2,1,1);
-    PUTRGB(dst_1,py_1,1,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)
+YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0)
     LOADCHROMA(0);
     PUTRGB24(dst_1,py_1,0);
     PUTRGB24(dst_2,py_2,0);
@@ -201,7 +275,7 @@ ENDYUV2RGBLINE(24)
 ENDYUV2RGBFUNC()
 
 // only trivial mods from yuv2rgb_c_24_rgb
-YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t)
+YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0)
     LOADCHROMA(0);
     PUTBGR24(dst_1,py_1,0);
     PUTBGR24(dst_2,py_2,0);
@@ -229,46 +303,46 @@ ENDYUV2RGBFUNC()
 
 // 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_16, uint16_t)
+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)
+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
-YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t)
+YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0)
     const uint8_t *d32 = dither_8x8_32[y&7];
     const uint8_t *d64 = dither_8x8_73[y&7];
 #define PUTRGB8(dst,src,i,o)                                    \
@@ -297,7 +371,7 @@ 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_4, uint8_t)
+YUV2RGBFUNC(yuv2rgb_c_4, uint8_t, 0)
     int acc;
 #define PUTRGB4(dst,src,i)          \
     Y = src[2*i];                   \
@@ -323,7 +397,7 @@ YUV2RGBFUNC(yuv2rgb_c_4, uint8_t)
     PUTRGB4(dst_1,py_1,3);
 CLOSEYUV2RGBFUNC(4)
 
-YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t)
+YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t, 0)
     const uint8_t *d64 =  dither_8x8_73[y&7];
     const uint8_t *d128 = dither_8x8_220[y&7];
     int acc;
@@ -354,25 +428,25 @@ CLOSEYUV2RGBFUNC(4)
 
 // 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_4b, uint8_t)
+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)
+YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0)
     const uint8_t *d64 =  dither_8x8_73[y&7];
     const uint8_t *d128 = dither_8x8_220[y&7];
 
@@ -399,7 +473,7 @@ YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t)
     PUTRGB4DB(dst_1,py_1,3,6);
 CLOSEYUV2RGBFUNC(8)
 
-YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t)
+YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0)
         const uint8_t *d128 = dither_8x8_220[y&7];
         char out_1 = 0, out_2 = 0;
         g= c->table_gU[128] + c->table_gV[128];
@@ -426,41 +500,26 @@ YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t)
     dst_2[0]= out_2;
 CLOSEYUV2RGBFUNC(1)
 
-SwsFunc sws_yuv2rgb_get_func_ptr(SwsContext *c)
+SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
 {
     SwsFunc t = NULL;
 #if (HAVE_MMX2 || HAVE_MMX) && CONFIG_GPL
-    if (c->flags & SWS_CPU_CAPS_MMX2) {
-        switch (c->dstFormat) {
-        case PIX_FMT_RGB32:  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:  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 = sws_yuv2rgb_init_vis(c);
+    t = ff_yuv2rgb_init_vis(c);
 #endif
 #if CONFIG_MLIB
-    t = sws_yuv2rgb_init_mlib(c);
+    t = ff_yuv2rgb_init_mlib(c);
 #endif
-#if HAVE_ALTIVEC && CONFIG_GPL
+#if HAVE_ALTIVEC
     if (c->flags & SWS_CPU_CAPS_ALTIVEC)
-        t = sws_yuv2rgb_init_altivec(c);
+        t = ff_yuv2rgb_init_altivec(c);
 #endif
 
 #if ARCH_BFIN
     if (c->flags & SWS_CPU_CAPS_BFIN)
-        t = sws_ff_bfin_yuv2rgb_get_func_ptr(c);
+        t = ff_yuv2rgb_get_func_ptr_bfin(c);
 #endif
 
     if (t)
@@ -469,10 +528,12 @@ SwsFunc sws_yuv2rgb_get_func_ptr(SwsContext *c)
     av_log(c, AV_LOG_WARNING, "No accelerated colorspace conversion found.\n");
 
     switch (c->dstFormat) {
-    case PIX_FMT_BGR32_1:
-    case PIX_FMT_RGB32_1:
-    case PIX_FMT_BGR32:
-    case PIX_FMT_RGB32:      return yuv2rgb_c_32;
+    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:
+    case PIX_FMT_BGRA:       return (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) ? yuva2rgba_c : yuv2rgb_c_32;
     case PIX_FMT_RGB24:      return yuv2rgb_c_24_rgb;
     case PIX_FMT_BGR24:      return yuv2rgb_c_24_bgr;
     case PIX_FMT_RGB565:
@@ -517,8 +578,8 @@ static void fill_gv_table(int table[256], const int elemsize, const int inc)
     }
 }
 
-av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange,
-                                      int brightness, int contrast, int saturation)
+av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange,
+                                     int brightness, int contrast, int saturation)
 {
     const int isRgb =      c->dstFormat==PIX_FMT_RGB32
                         || c->dstFormat==PIX_FMT_RGB32_1
@@ -533,7 +594,7 @@ av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int
     uint8_t *y_table;
     uint16_t *y_table16;
     uint32_t *y_table32;
-    int i, base, rbase, gbase, bbase, abase;
+    int i, base, rbase, gbase, bbase, abase, needAlpha;
     const int yoffs = fullRange ? 384 : 326;
 
     int64_t crv =  inv_table[0];
@@ -642,6 +703,7 @@ av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int
         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;
@@ -659,13 +721,15 @@ av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int
         rbase = base + (isRgb ? 16 : 0);
         gbase = base + 8;
         bbase = base + (isRgb ? 0 : 16);
-        abase = (base + 24) & 31;
+        needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat);
+        if (!needAlpha)
+            abase = (base + 24) & 31;
         c->yuvTable = av_malloc(1024*3*4);
         y_table32 = c->yuvTable;
         yb = -(384<<16) - oy;
         for (i = 0; i < 1024; i++) {
             uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
-            y_table32[i     ] = (yval << rbase) + (255 << abase);
+            y_table32[i     ] = (yval << rbase) + (needAlpha ? 0 : (255 << abase));
             y_table32[i+1024] = yval << gbase;
             y_table32[i+2048] = yval << bbase;
             yb += cy;