summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/videoconvert/videoconvert.c61
-rw-r--r--gst/videoconvert/videoconvert.h2
2 files changed, 38 insertions, 25 deletions
diff --git a/gst/videoconvert/videoconvert.c b/gst/videoconvert/videoconvert.c
index 847d8434d..bd5c176bd 100644
--- a/gst/videoconvert/videoconvert.c
+++ b/gst/videoconvert/videoconvert.c
@@ -49,7 +49,7 @@ VideoConvert *
videoconvert_convert_new (GstVideoInfo * in_info, GstVideoInfo * out_info)
{
VideoConvert *convert;
- int width;
+ int width, lines;
convert = g_malloc0 (sizeof (VideoConvert));
@@ -67,9 +67,12 @@ videoconvert_convert_new (GstVideoInfo * in_info, GstVideoInfo * out_info)
convert->height = GST_VIDEO_INFO_HEIGHT (in_info);
width = convert->width;
+ lines = out_info->finfo->pack_lines;
- convert->tmpline8 = g_malloc (sizeof (guint8) * (width + 8) * 4);
- convert->tmpline16 = g_malloc (sizeof (guint16) * (width + 8) * 4);
+ convert->lines = lines;
+
+ convert->tmpline8 = g_malloc (lines * sizeof (guint8) * (width + 8) * 4);
+ convert->tmpline16 = g_malloc (lines * sizeof (guint16) * (width + 8) * 4);
convert->errline = g_malloc0 (sizeof (guint16) * width * 4);
return convert;
@@ -388,8 +391,8 @@ static void
videoconvert_convert_generic (VideoConvert * convert, GstVideoFrame * dest,
const GstVideoFrame * src)
{
- int i, j;
- gint width, height;
+ int i, j, k;
+ gint width, height, lines;
guint in_bits, out_bits;
gconstpointer pal;
gsize palsize;
@@ -402,35 +405,43 @@ videoconvert_convert_generic (VideoConvert * convert, GstVideoFrame * dest,
in_bits = convert->in_bits;
out_bits = convert->out_bits;
- tmpline8 = convert->tmpline8;
- tmpline16 = convert->tmpline16;
+ lines = convert->lines;
- for (j = 0; j < height; j++) {
- if (in_bits == 16) {
- UNPACK_FRAME (src, tmpline16, j, width);
- } else {
- UNPACK_FRAME (src, tmpline8, j, width);
+ for (j = 0; j < height; j += lines) {
+ tmpline8 = convert->tmpline8;
+ tmpline16 = convert->tmpline16;
- if (out_bits == 16)
- for (i = 0; i < width * 4; i++)
- tmpline16[i] = TO_16 (tmpline8[i]);
- }
+ for (k = 0; k < lines; k++) {
+ if (in_bits == 16) {
+ UNPACK_FRAME (src, tmpline16, j + k, width);
+ } else {
+ UNPACK_FRAME (src, tmpline8, j + k, width);
- if (out_bits == 16 || in_bits == 16) {
- if (convert->matrix16)
- convert->matrix16 (convert, tmpline16);
- if (convert->dither16)
- convert->dither16 (convert, tmpline16, j);
- } else {
- if (convert->matrix)
- convert->matrix (convert, tmpline8);
+ if (out_bits == 16)
+ for (i = 0; i < width * 4; i++)
+ tmpline16[i] = TO_16 (tmpline8[i]);
+ }
+
+ if (out_bits == 16 || in_bits == 16) {
+ if (convert->matrix16)
+ convert->matrix16 (convert, tmpline16);
+ if (convert->dither16)
+ convert->dither16 (convert, tmpline16, j);
+ } else {
+ if (convert->matrix)
+ convert->matrix (convert, tmpline8);
+ }
+ tmpline8 += width * 4;
+ tmpline16 += width * 8;
}
+ tmpline8 = convert->tmpline8;
+ tmpline16 = convert->tmpline16;
if (out_bits == 16) {
PACK_FRAME (dest, tmpline16, j, width);
} else {
if (in_bits == 16)
- for (i = 0; i < width * 4; i++)
+ for (i = 0; i < width * 4 * lines; i++)
tmpline8[i] = tmpline16[i] >> 8;
PACK_FRAME (dest, tmpline8, j, width);
diff --git a/gst/videoconvert/videoconvert.h b/gst/videoconvert/videoconvert.h
index 0b2552f92..9e9387f5e 100644
--- a/gst/videoconvert/videoconvert.h
+++ b/gst/videoconvert/videoconvert.h
@@ -46,6 +46,8 @@ struct _VideoConvert {
ColorSpaceDitherMethod dither;
+ guint lines;
+
guint8 *tmpline8;
guint16 *tmpline16;
guint16 *errline;