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

Janusz Krzysztofik jkrzyszt
Mon Mar 1 02:09:56 CET 2010


In order to play video on a 12-bit display, like OMAP1 frambuffer with 12-bit 
LCD controller that my Amstrad Delta videophone is equipped with, one or more 
libswscale converters with rgb444 output pixel format support are required. 
This patch adds such support to the unaccelerated path of the unscaled yuv2rgb 
special converter.

Created and tested against ffmpeg svn revision 22124, on to off:
	[PATCH v2] Add initial support for 12-bit color mode.

Tested on Amstrad Delta with 24bpp IJPG and MP43 sourcers using patched 
mplayer video output drivers.

Signed-off-by: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>

---
Forgot to turn off line wrapping before sending it out, sorry.

Thanks,
Janusz


diff -upr trunk/doc/swscale.txt trunk.rgb12/doc/swscale.txt
--- trunk/doc/swscale.txt	2010-02-24 15:55:28.000000000 +0100
+++ trunk.rgb12/doc/swscale.txt	2010-02-25 04:31:55.000000000 +0100
@@ -30,7 +30,7 @@ slices, that is, consecutive non-overlap
 
 special converter
     These generally are unscaled converters of common
-    formats, like YUV 4:2:0/4:2:2 -> RGB15/16/24/32. Though it could also
+    formats, like YUV 4:2:0/4:2:2 -> RGB12/15/16/24/32. Though it could also
     in principle contain scalers optimized for specific common cases.
 
 Main path
diff -upr trunk/libswscale/swscale.c trunk.rgb12/libswscale/swscale.c
--- trunk/libswscale/swscale.c	2010-02-24 15:55:47.000000000 +0100
+++ trunk.rgb12/libswscale/swscale.c	2010-02-25 11:30:58.000000000 +0100
@@ -23,11 +23,11 @@
 
 /*
   supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR32_1, BGR24, BGR16, BGR15, RGB32, RGB32_1, RGB24, Y8/Y800, YVU9/IF09, PAL8
-  supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09
+  supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,12,15,16,24,32}, Y8/Y800, YVU9/IF09
   {BGR,RGB}{1,4,8,15,16} support dithering
 
   unscaled special converters (YV12=I420=IYUV, Y800=Y8)
-  YV12 -> {BGR,RGB}{1,4,8,15,16,24,32}
+  YV12 -> {BGR,RGB}{1,4,8,12,15,16,24,32}
   x -> x
   YUV9 -> YV12
   YUV9/YV12 -> Y800
diff -upr trunk/libswscale/swscale_internal.h trunk.rgb12/libswscale/swscale_internal.h
--- trunk/libswscale/swscale_internal.h	2010-02-24 15:55:47.000000000 +0100
+++ trunk.rgb12/libswscale/swscale_internal.h	2010-02-25 02:10:33.000000000 +0100
@@ -393,6 +393,7 @@ const char *sws_format_name(enum PixelFo
         || (x)==PIX_FMT_RGB24       \
         || (x)==PIX_FMT_RGB565      \
         || (x)==PIX_FMT_RGB555      \
+        || (x)==PIX_FMT_RGB444      \
         || (x)==PIX_FMT_RGB8        \
         || (x)==PIX_FMT_RGB4        \
         || (x)==PIX_FMT_RGB4_BYTE   \
@@ -405,6 +406,7 @@ const char *sws_format_name(enum PixelFo
         || (x)==PIX_FMT_BGR24       \
         || (x)==PIX_FMT_BGR565      \
         || (x)==PIX_FMT_BGR555      \
+        || (x)==PIX_FMT_BGR444      \
         || (x)==PIX_FMT_BGR8        \
         || (x)==PIX_FMT_BGR4        \
         || (x)==PIX_FMT_BGR4_BYTE   \
diff -upr trunk/libswscale/yuv2rgb.c trunk.rgb12/libswscale/yuv2rgb.c
--- trunk/libswscale/yuv2rgb.c	2010-02-24 15:55:47.000000000 +0100
+++ trunk.rgb12/libswscale/yuv2rgb.c	2010-02-25 04:21:14.000000000 +0100
@@ -551,7 +551,9 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsConte
     case PIX_FMT_RGB565:
     case PIX_FMT_BGR565:
     case PIX_FMT_RGB555:
-    case PIX_FMT_BGR555:     return yuv2rgb_c_16;
+    case PIX_FMT_BGR555:
+    case PIX_FMT_RGB444:
+    case PIX_FMT_BGR444:     return yuv2rgb_c_16;
     case PIX_FMT_RGB8:
     case PIX_FMT_BGR8:       return yuv2rgb_c_8_ordered_dither;
     case PIX_FMT_RGB4:
@@ -598,6 +600,7 @@ av_cold int ff_yuv2rgb_c_init_tables(Sws
                         || c->dstFormat==PIX_FMT_BGR24
                         || c->dstFormat==PIX_FMT_RGB565
                         || c->dstFormat==PIX_FMT_RGB555
+                        || c->dstFormat==PIX_FMT_RGB444
                         || c->dstFormat==PIX_FMT_RGB8
                         || c->dstFormat==PIX_FMT_RGB4
                         || c->dstFormat==PIX_FMT_RGB4_BYTE
@@ -694,6 +697,25 @@ av_cold int ff_yuv2rgb_c_init_tables(Sws
         fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048);
         fill_gv_table(c->table_gV, 1, cgv);
         break;
+    case 12:
+        rbase = isRgb ? 8 : 0;
+        gbase = 4;
+        bbase = isRgb ? 0 : 8;
+        c->yuvTable = av_malloc(1024*3*2);
+        y_table16 = c->yuvTable;
+        yb = -(384<<16) - oy;
+        for (i = 0; i < 1024; i++) {
+            uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
+            y_table16[i     ] = (yval >> 4)          << rbase;
+            y_table16[i+1024] = (yval >> 4) << gbase;
+            y_table16[i+2048] = (yval >> 4)          << bbase;
+            yb += cy;
+        }
+        fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
+        fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
+        fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
+        fill_gv_table(c->table_gV, 2, cgv);
+        break;
     case 15:
     case 16:
         rbase = isRgb ? bpp - 5 : 0;



More information about the ffmpeg-devel mailing list