static void videoconvert_convert_generic (VideoConvert * convert,
GstVideoFrame * dest, const GstVideoFrame * src);
-static void videoconvert_convert_matrix (VideoConvert * convert);
-static void videoconvert_convert_matrix16 (VideoConvert * convert);
+static void videoconvert_convert_matrix (VideoConvert * convert,
+ guint8 * pixels);
+static void videoconvert_convert_matrix16 (VideoConvert * convert,
+ guint16 * pixels);
static gboolean videoconvert_convert_lookup_fastpath (VideoConvert * convert);
static gboolean videoconvert_convert_compute_matrix (VideoConvert * convert);
-static void videoconvert_dither_none (VideoConvert * convert, int j);
-static void videoconvert_dither_verterr (VideoConvert * convert, int j);
-static void videoconvert_dither_halftone (VideoConvert * convert, int j);
+static void videoconvert_dither_verterr (VideoConvert * convert,
+ guint16 * pixels, int j);
+static void videoconvert_dither_halftone (VideoConvert * convert,
+ guint16 * pixels, int j);
VideoConvert *
convert->in_info = *in_info;
convert->out_info = *out_info;
- convert->dither16 = videoconvert_dither_none;
+ convert->dither16 = NULL;
if (!videoconvert_convert_lookup_fastpath (convert)) {
convert->convert = videoconvert_convert_generic;
switch (type) {
case 0:
default:
- convert->dither16 = videoconvert_dither_none;
+ convert->dither16 = NULL;
break;
case 1:
convert->dither16 = videoconvert_dither_verterr;
convert->convert (convert, dest, src);
}
-void
-videoconvert_convert_matrix (VideoConvert * convert)
+static void
+videoconvert_convert_matrix (VideoConvert * convert, guint8 * pixels)
{
int i;
int r, g, b;
int y, u, v;
- guint8 *tmpline = convert->tmpline;
for (i = 0; i < convert->width; i++) {
- r = tmpline[i * 4 + 1];
- g = tmpline[i * 4 + 2];
- b = tmpline[i * 4 + 3];
+ r = pixels[i * 4 + 1];
+ g = pixels[i * 4 + 2];
+ b = pixels[i * 4 + 3];
y = (convert->cmatrix[0][0] * r + convert->cmatrix[0][1] * g +
convert->cmatrix[0][2] * b + convert->cmatrix[0][3]) >> 8;
v = (convert->cmatrix[2][0] * r + convert->cmatrix[2][1] * g +
convert->cmatrix[2][2] * b + convert->cmatrix[2][3]) >> 8;
- tmpline[i * 4 + 1] = CLAMP (y, 0, 255);
- tmpline[i * 4 + 2] = CLAMP (u, 0, 255);
- tmpline[i * 4 + 3] = CLAMP (v, 0, 255);
+ pixels[i * 4 + 1] = CLAMP (y, 0, 255);
+ pixels[i * 4 + 2] = CLAMP (u, 0, 255);
+ pixels[i * 4 + 3] = CLAMP (v, 0, 255);
}
}
-void
-videoconvert_convert_matrix16 (VideoConvert * convert)
+static void
+videoconvert_convert_matrix16 (VideoConvert * convert, guint16 * pixels)
{
int i;
int r, g, b;
int y, u, v;
- guint16 *tmpline = convert->tmpline16;
for (i = 0; i < convert->width; i++) {
- r = tmpline[i * 4 + 1];
- g = tmpline[i * 4 + 2];
- b = tmpline[i * 4 + 3];
+ r = pixels[i * 4 + 1];
+ g = pixels[i * 4 + 2];
+ b = pixels[i * 4 + 3];
y = (convert->cmatrix[0][0] * r + convert->cmatrix[0][1] * g +
convert->cmatrix[0][2] * b + convert->cmatrix[0][3]) >> 8;
v = (convert->cmatrix[2][0] * r + convert->cmatrix[2][1] * g +
convert->cmatrix[2][2] * b + convert->cmatrix[2][3]) >> 8;
- tmpline[i * 4 + 1] = CLAMP (y, 0, 65535);
- tmpline[i * 4 + 2] = CLAMP (u, 0, 65535);
- tmpline[i * 4 + 3] = CLAMP (v, 0, 65535);
+ pixels[i * 4 + 1] = CLAMP (y, 0, 65535);
+ pixels[i * 4 + 2] = CLAMP (u, 0, 65535);
+ pixels[i * 4 + 3] = CLAMP (v, 0, 65535);
}
}
-static void
-matrix_identity (VideoConvert * convert)
-{
- /* do nothing */
-}
-
static gboolean
get_Kr_Kb (GstVideoColorMatrix matrix, gdouble * Kr, gdouble * Kb)
{
if (in_info->colorimetry.range == out_info->colorimetry.range &&
in_info->colorimetry.matrix == out_info->colorimetry.matrix) {
GST_DEBUG ("using identity color transform");
- convert->matrix = matrix_identity;
- convert->matrix16 = matrix_identity;
+ convert->matrix = NULL;
+ convert->matrix16 = NULL;
return TRUE;
}
}
static void
-videoconvert_dither_none (VideoConvert * convert, int j)
-{
-}
-
-static void
-videoconvert_dither_verterr (VideoConvert * convert, int j)
+videoconvert_dither_verterr (VideoConvert * convert, guint16 * pixels, int j)
{
int i;
guint16 *tmpline = convert->tmpline16;
}
static void
-videoconvert_dither_halftone (VideoConvert * convert, int j)
+videoconvert_dither_halftone (VideoConvert * convert, guint16 * pixels, int j)
{
int i;
guint16 *tmpline = convert->tmpline16;
}
if (out_bits == 16 || in_bits == 16) {
- convert->matrix16 (convert);
- convert->dither16 (convert, j);
+ if (convert->matrix16)
+ convert->matrix16 (convert, convert->tmpline16);
+ if (convert->dither16)
+ convert->dither16 (convert, convert->tmpline16, j);
} else {
- convert->matrix (convert);
+ if (convert->matrix)
+ convert->matrix (convert, convert->tmpline);
}
if (out_bits == 16) {