From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/src/gfx/generic/yuvtbl-gen.c | 199 +++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100755 Source/DirectFB/src/gfx/generic/yuvtbl-gen.c (limited to 'Source/DirectFB/src/gfx/generic/yuvtbl-gen.c') diff --git a/Source/DirectFB/src/gfx/generic/yuvtbl-gen.c b/Source/DirectFB/src/gfx/generic/yuvtbl-gen.c new file mode 100755 index 0000000..43a487d --- /dev/null +++ b/Source/DirectFB/src/gfx/generic/yuvtbl-gen.c @@ -0,0 +1,199 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include +#include +#include +#include + +/* YCbCr->RGB: + * Standard ITU Rec. BT.601 derived coefficients. + */ +#define Y_FACTOR 1.16400 +#define VR_FACTOR 1.59600 +#define VG_FACTOR -0.81300 +#define UG_FACTOR -0.39100 +#define UB_FACTOR 2.01800 + +/* RGB->YCbCr: + * ITU Rec. BT.601 defines the following formula for EyEcbEcr: + * + * Ey = 0.299 * R + 0.587 * G + 0.114 * B + * Ecb = (B - Ey) * 0.564 + * Ecr = (R - Ey) * 0.713 + * + * Relationship between EyEcbEcr and YCbCr: + * + * Y = Ey * 219 / 255 + 16 + * Cb = Ecb * 224 / 255 + 128 + * Cr = Ecr * 224 / 255 + 128 + * + * Therefore, to convert RGB to YCbCr, we compute Ey from R G B, + * then we derive Y Cb Cr from Ey using 3 lookup tables. + */ +#define ECB_FACTOR 0.56400 +#define ECR_FACTOR 0.71300 + + +typedef struct { + const char *type; + const char *name; + int size; + struct { + int min; + int max; + } range; + struct { + int min; + int max; + } clamp; + float sub; + float mul; + float add; +} GenTable; + + +#define N_PER_LINE 10 + +static void +dump_table( GenTable *gt ) +{ + int i, n; + + printf( "\n%s %s[%i] = {\n", gt->type, gt->name, gt->size ); + + for (i = 0, n = 0; i < gt->size; i++) { + float num; + + num = (i < gt->range.min) + ? gt->range.min + : ((i > gt->range.max) ? gt->range.max : i); + num = ((num - gt->sub) * gt->mul) + gt->add; + num = (num < gt->clamp.min) + ? gt->clamp.min + : ((num > gt->clamp.max) ? gt->clamp.max : num); + + if (n == 0) + printf( " " ); + + printf( "%4i", (int) num ); + + if (i < (gt->size-1)) { + if (++n == N_PER_LINE) { + printf( ",\n" ); + n = 0; + } else + printf( ", " ); + } else + printf( "\n" ); + } + + printf( "};\n\n" ); +} + +int +main( int argc, char **argv ) +{ + GenTable gt = { + .size = 256, + .range.min = 16, + .clamp.min = -1000, + .clamp.max = +1000, + }; + + /* headers */ + puts( "#ifndef __YUV_TABLES_H__" ); + puts( "#define __YUV_TABLES_H__" ); + puts( "" ); + +/* YUV->RGB */ + /* luma */ + gt.type = "const u16"; + gt.name = "y_for_rgb"; + gt.range.max = 235; + gt.sub = 16; + gt.mul = Y_FACTOR; + gt.add = 0; + dump_table( > ); + + /* chroma */ + gt.type = "const s16"; + gt.range.max = 240; + gt.sub = 128; + + gt.name = "cr_for_r"; + gt.mul = VR_FACTOR; + dump_table( > ); + + gt.name = "cr_for_g"; + gt.mul = VG_FACTOR; + dump_table( > ); + + gt.name = "cb_for_g"; + gt.mul = UG_FACTOR; + dump_table( > ); + + gt.name = "cb_for_b"; + gt.mul = UB_FACTOR; + dump_table( > ); + +/* RGB->YUV */ + gt.size = 256; + gt.range.min = 0; + gt.range.max = 255; + gt.clamp.min = 16; + gt.sub = 0; + + /* luma */ + gt.type = "const u16"; + gt.name = "y_from_ey"; + gt.clamp.max = 235; + gt.mul = 219.0/255.0; + gt.add = 16; + dump_table( > ); + + /* chroma */ + gt.size = 512; + gt.range.max = 511; + gt.clamp.max = 240; + gt.sub = 255; + gt.add = 128; + + /* cb */ + gt.type = "const u16"; + gt.name = "cb_from_bey"; + gt.mul = ECB_FACTOR * 224.0 / 255.0; + dump_table( > ); + + /* cr */ + gt.type = "const u16"; + gt.name = "cr_from_rey"; + gt.mul = ECR_FACTOR * 224.0 / 255.0; + dump_table( > ); + + /* end headers */ + puts( "#endif /* __YUV_TABLES_H__ */" ); + + return 0; + } -- cgit