[FFmpeg-devel] [PATCH] libswscale: Extend the generic path of the yuv2rgb converter with support for rgb444 output format

Janusz Krzysztofik jkrzyszt
Sat Mar 6 02:43:03 CET 2010


In order to play different video sources on a 12-bit display, like OMAP1 
frambuffer with 12-bit LCD controller that my Amstrad Delta videophone is 
equipped with, more rgb444 support is required in addition to that already 
added to the unaccelerated path of the unscaled yuv2rgb special converter. 

This patch tries to provide necessary support for the generic (slower) code 
path.

Created and tested against libswscale svn revision 30842.

Tested on Amstrad Delta, using patched mplayer video output drivers, with 
24bpp IJPG sourcers that required scaling and with 8bpp RGB (gif) source.

Signed-off-by: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>
---
--- trunk/libswscale/swscale.c.orig	2010-03-05 14:13:14.000000000 +0100
+++ trunk/libswscale/swscale.c	2010-03-05 20:31:46.000000000 +0100
@@ -39,7 +39,7 @@
 
 /*
 tested special converters (most are tested actually, but I did not write it down ...)
- YV12 -> BGR16
+ YV12 -> BGR12/BGR16
  YV12 -> YV12
  BGR15 -> BGR16
  BGR16 -> BGR16
@@ -806,6 +806,23 @@ static inline void yuv2nv12XinC(const in
             }\
         }\
         break;\
+    case PIX_FMT_RGB444BE:\
+    case PIX_FMT_RGB444LE:\
+    case PIX_FMT_BGR444BE:\
+    case PIX_FMT_BGR444LE:\
+        {\
+            const int dr1= dither_4x4_16[y&3    ][0];\
+            const int dg1= dither_4x4_16[y&3    ][1];\
+            const int db1= dither_4x4_16[(y&3)^3][0];\
+            const int dr2= dither_4x4_16[y&3    ][1];\
+            const int dg2= dither_4x4_16[y&3    ][0];\
+            const int db2= dither_4x4_16[(y&3)^3][1];\
+            func(uint16_t,0)\
+                ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
+                ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
+            }\
+        }\
+        break;\
     case PIX_FMT_RGB8:\
     case PIX_FMT_BGR8:\
         {\
--- trunk/libswscale/utils.c.orig	2010-03-05 14:13:14.000000000 +0100
+++ trunk/libswscale/utils.c	2010-03-05 20:31:46.000000000 +0100
@@ -1115,7 +1115,9 @@ SwsContext *sws_getContext(int srcW, int
         av_log(c, AV_LOG_INFO, "from %s to %s%s ",
                sws_format_name(srcFormat),
 #ifdef DITHER1XBPP
-               dstFormat == PIX_FMT_BGR555 || dstFormat == PIX_FMT_BGR565 ? "dithered " : "",
+               dstFormat == PIX_FMT_BGR555 || dstFormat == PIX_FMT_BGR565 ||
+               dstFormat == PIX_FMT_RGB444BE || dstFormat == PIX_FMT_RGB444LE ||
+               dstFormat == PIX_FMT_BGR444BE || dstFormat == PIX_FMT_BGR444LE ? "dithered " : "",
 #else
                "",
 #endif
@@ -1184,6 +1186,9 @@ SwsContext *sws_getContext(int srcW, int
             av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR16 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
         else if (dstFormat==PIX_FMT_BGR555)
             av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR15 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
+        else if (dstFormat == PIX_FMT_RGB444BE || dstFormat == PIX_FMT_RGB444LE ||
+                 dstFormat == PIX_FMT_BGR444BE || dstFormat == PIX_FMT_BGR444LE)
+            av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR12 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
 
         av_log(c, AV_LOG_VERBOSE, "%dx%d -> %dx%d\n", srcW, srcH, dstW, dstH);
         av_log(c, AV_LOG_DEBUG, "lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",



More information about the ffmpeg-devel mailing list