[FFmpeg-devel] [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:05:39 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>
---
Hi,
I decided to start with this single basic converter that gives me enough
support to be able to display my video sources on my device.
I tried to extend the lavf regression tests with rgb444 but it breaks because
of input format support still missing.
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