2009-09-21 18:33:50 +00:00
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
2009-10-08 21:33:28 +00:00
|
|
|
#include "gstcms.h"
|
|
|
|
|
2009-09-21 18:33:50 +00:00
|
|
|
#define SCALE 256
|
|
|
|
|
|
|
|
void
|
|
|
|
get_taps (double *taps, double x)
|
|
|
|
{
|
|
|
|
taps[3] = x * x * (x - 1);
|
|
|
|
taps[2] = x * (-x * x + x + 1);
|
|
|
|
x = 1 - x;
|
|
|
|
taps[1] = x * (-x * x + x + 1);
|
|
|
|
taps[0] = x * x * (x - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
g_print ("/* This file is autogenerated. Do not edit.*/\n");
|
|
|
|
g_print ("#include <glib.h>\n");
|
|
|
|
g_print ("gint8 cog_resample_table_4tap[256][4] = {\n");
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
|
|
double x = i / 256.0;
|
|
|
|
double taps[4];
|
|
|
|
int t[4];
|
|
|
|
int sum;
|
|
|
|
|
|
|
|
get_taps (taps, x);
|
|
|
|
taps[0] *= SCALE;
|
|
|
|
taps[1] *= SCALE;
|
|
|
|
taps[2] *= SCALE;
|
|
|
|
taps[3] *= SCALE;
|
|
|
|
|
|
|
|
t[0] = floor (taps[0]);
|
|
|
|
t[1] = floor (taps[1]);
|
|
|
|
t[2] = floor (taps[2]);
|
|
|
|
t[3] = floor (taps[3]);
|
|
|
|
sum = t[0] + t[1] + t[2] + t[3];
|
|
|
|
|
|
|
|
for (; sum < SCALE; sum++) {
|
|
|
|
int i;
|
|
|
|
double max = 0;
|
|
|
|
int max_i = -1;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
if (max_i == -1 || (t[i] < taps[i] && (taps[i] - t[i]) > max)) {
|
|
|
|
max_i = i;
|
|
|
|
max = taps[i] - t[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
t[max_i]++;
|
|
|
|
}
|
|
|
|
sum = t[0] + t[1] + t[2] + t[3];
|
|
|
|
|
|
|
|
g_print (" { %d, %d, %d, %d }, /* %d %d */\n",
|
|
|
|
t[0], t[1], t[2], t[3], t[2] + t[0], t[1] + t[3]);
|
|
|
|
#if 0
|
|
|
|
g_print ("/* %.3f %.3f %.3f %.3f %d */\n",
|
|
|
|
taps[0] - t[0], taps[1] - t[1], taps[2] - t[2], taps[3] - t[3], sum);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
g_print ("};\n");
|
|
|
|
g_print ("\n");
|
|
|
|
|
2009-10-08 21:33:28 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
int cm, bits;
|
|
|
|
|
|
|
|
for (cm = 0; cm < 2; cm++) {
|
|
|
|
for (bits = 6; bits <= 8; bits += 2) {
|
|
|
|
|
|
|
|
ColorMatrix matrix;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* At this point, everything is in YCbCr
|
|
|
|
* All components are in the range [0,255]
|
|
|
|
*/
|
|
|
|
color_matrix_set_identity (&matrix);
|
|
|
|
|
|
|
|
/* offset required to get input video black to (0.,0.,0.) */
|
|
|
|
/* we don't do this because the code does it for us */
|
|
|
|
color_matrix_offset_components (&matrix, -16, -128, -128);
|
|
|
|
|
|
|
|
color_matrix_scale_components (&matrix, (1 / 219.0), (1 / 224.0),
|
|
|
|
(1 / 224.0));
|
|
|
|
|
|
|
|
/* colour matrix, YCbCr -> RGB */
|
|
|
|
/* Requires Y in [0,1.0], Cb&Cr in [-0.5,0.5] */
|
|
|
|
if (cm) {
|
|
|
|
color_matrix_YCbCr_to_RGB (&matrix, 0.2126, 0.0722); /* HD */
|
|
|
|
} else {
|
|
|
|
color_matrix_YCbCr_to_RGB (&matrix, 0.2990, 0.1140); /* SD */
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We are now in RGB space
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* scale to output range. */
|
|
|
|
color_matrix_scale_components (&matrix, 255.0, 255.0, 255.0);
|
|
|
|
|
|
|
|
/* because we're doing 8-bit matrix coefficients */
|
|
|
|
color_matrix_scale_components (&matrix, 1 << bits, 1 << bits,
|
|
|
|
1 << bits);
|
|
|
|
|
|
|
|
g_print ("static const int cog_ycbcr_to_rgb_matrix_%dbit_%s[] = {\n",
|
|
|
|
bits, cm ? "hdtv" : "sdtv");
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[0][0] - ((bits == 8) ? 256 : 0)),
|
|
|
|
(int) rint (matrix.m[0][1]),
|
|
|
|
(int) rint (matrix.m[0][2] - ((bits == 8) ? 256 : 0)),
|
|
|
|
(int) rint (matrix.m[0][3]));
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[1][0] - ((bits == 8) ? 256 : 0)),
|
|
|
|
(int) rint (matrix.m[1][1]),
|
|
|
|
(int) rint (matrix.m[1][2]), (int) rint (matrix.m[1][3]));
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[2][0] - ((bits == 8) ? 256 : 0)),
|
|
|
|
(int) rint (matrix.m[2][1] - ((bits == 8) ? 512 : 0)),
|
|
|
|
(int) rint (matrix.m[2][2]), (int) rint (matrix.m[2][3]));
|
|
|
|
g_print ("};\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-08 22:18:04 +00:00
|
|
|
{
|
|
|
|
int cm, bits;
|
|
|
|
|
|
|
|
for (cm = 0; cm < 2; cm++) {
|
|
|
|
for (bits = 8; bits <= 8; bits += 1) {
|
|
|
|
|
|
|
|
ColorMatrix matrix;
|
|
|
|
|
|
|
|
color_matrix_set_identity (&matrix);
|
|
|
|
|
|
|
|
color_matrix_scale_components (&matrix, (1 / 255.0), (1 / 255.0),
|
|
|
|
(1 / 255.0));
|
|
|
|
|
|
|
|
/* colour matrix, RGB -> YCbCr */
|
|
|
|
if (cm) {
|
|
|
|
color_matrix_RGB_to_YCbCr (&matrix, 0.2126, 0.0722); /* HD */
|
|
|
|
} else {
|
|
|
|
color_matrix_RGB_to_YCbCr (&matrix, 0.2990, 0.1140); /* SD */
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We are now in YCbCr space
|
|
|
|
*/
|
|
|
|
|
|
|
|
color_matrix_scale_components (&matrix, 219.0, 224.0, 224.0);
|
|
|
|
|
|
|
|
color_matrix_offset_components (&matrix, 16, 128, 128);
|
|
|
|
|
|
|
|
/* because we're doing 8-bit matrix coefficients */
|
|
|
|
color_matrix_scale_components (&matrix, 1 << bits, 1 << bits,
|
|
|
|
1 << bits);
|
|
|
|
|
|
|
|
g_print ("static const int cog_rgb_to_ycbcr_matrix_%dbit_%s[] = {\n",
|
|
|
|
bits, cm ? "hdtv" : "sdtv");
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[0][0]),
|
|
|
|
(int) rint (matrix.m[0][1]),
|
|
|
|
(int) rint (matrix.m[0][2]), (int) rint (matrix.m[0][3]));
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[1][0]),
|
|
|
|
(int) rint (matrix.m[1][1]),
|
|
|
|
(int) rint (matrix.m[1][2]), (int) rint (matrix.m[1][3]));
|
|
|
|
g_print (" %d, %d, %d, %d,\n",
|
|
|
|
(int) rint (matrix.m[2][0]),
|
|
|
|
(int) rint (matrix.m[2][1]),
|
|
|
|
(int) rint (matrix.m[2][2]), (int) rint (matrix.m[2][3]));
|
|
|
|
g_print ("};\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-08 21:33:28 +00:00
|
|
|
|
2009-09-21 18:33:50 +00:00
|
|
|
return 0;
|
|
|
|
}
|