]> git.sesse.net Git - ffmpeg/blobdiff - libswscale/yuv2rgb.c
Add PIX_FMT_ARGB encoding to qtrle.
[ffmpeg] / libswscale / yuv2rgb.c
index d8438c0c6695ce95cb64b0fa8ab835f33163db9c..96649296ff364a4e50f3e16e8f101fbb5a6d39cf 100644 (file)
@@ -80,6 +80,16 @@ const int32_t ff_yuv2rgb_coeffs[8][4] = {
     Y = ysrc[2*i+1-o];                                  \
     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[]){\
@@ -129,14 +139,37 @@ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSlic
     ENDYUV2RGBLINE(dst_delta)\
     ENDYUV2RGBFUNC()
 
+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,0);
     PUTRGB(dst_2,py_2,0,1);
 
-    LOADCHROMA(1);
-    PUTRGB(dst_2,py_2,1,1);
-    PUTRGB(dst_1,py_1,1,0);
     LOADCHROMA(1);
     PUTRGB(dst_2,py_2,1,1);
     PUTRGB(dst_1,py_1,1,0);
@@ -163,9 +196,6 @@ YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1)
     PUTRGBA(dst_1,py_1,pa_1,0,0,24);
     PUTRGBA(dst_2,py_2,pa_2,0,1,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);
@@ -194,9 +224,6 @@ YUV2RGBFUNC(yuva2argb_c, uint32_t, 1)
     PUTRGBA(dst_1,py_1,pa_1,0,0,0);
     PUTRGBA(dst_2,py_2,pa_2,0,1,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);
@@ -484,7 +511,7 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *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
@@ -500,6 +527,8 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
     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:
@@ -673,6 +702,7 @@ av_cold int ff_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;