diff options
author | David Schleef <ds@schleef.org> | 2011-12-31 17:14:24 -0800 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2012-01-22 15:52:15 -0800 |
commit | e2e6fdcb6b265db201f191952aeed429e85e834e (patch) | |
tree | 0525c39588a46bf2d88fdfa1f710bcc692e69624 | |
parent | 4eb4602746e6d9ed78b2d822d189a33e099f8836 (diff) |
!colorspace: fix odd size problems
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | gst/colorspace/colorspace.c | 217 | ||||
-rw-r--r-- | gst/colorspace/gstcolorspaceorc.orc | 4 |
3 files changed, 173 insertions, 50 deletions
diff --git a/configure.ac b/configure.ac index a0f0c3935..69a020ffc 100644 --- a/configure.ac +++ b/configure.ac @@ -257,7 +257,7 @@ AC_SUBST(EXIF_CFLAGS) AM_CONDITIONAL(USE_EXIF, test "x$HAVE_EXIF" = "xyes") dnl Orc -ORC_CHECK([0.4.11]) +ORC_CHECK([0.4.16]) dnl set license and copyright notice GST_LICENSE="LGPL" diff --git a/gst/colorspace/colorspace.c b/gst/colorspace/colorspace.c index e1f630275..ad7ce2e75 100644 --- a/gst/colorspace/colorspace.c +++ b/gst/colorspace/colorspace.c @@ -1870,8 +1870,9 @@ convert_I420_YUY2 (ColorspaceConvert * convert, guint8 * dest, /* now handle last line */ if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_YUY2 (convert, dest, convert->tmpline, convert->height - 1); + cogorc_convert_I420_YUY2 (FRAME_GET_LINE (dest, 0, i), convert->tmpline, FRAME_GET_LINE (src, 0, i), FRAME_GET_LINE (src, 0, i), /* note i, not i+1 */ + FRAME_GET_LINE (src, 1, i >> 1), + FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2); } } @@ -1892,8 +1893,9 @@ convert_I420_UYVY (ColorspaceConvert * convert, guint8 * dest, /* now handle last line */ if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_UYVY (convert, dest, convert->tmpline, convert->height - 1); + cogorc_convert_I420_UYVY (FRAME_GET_LINE (dest, 0, i), convert->tmpline, FRAME_GET_LINE (src, 0, i), FRAME_GET_LINE (src, 0, i), /* note i, not i+1 */ + FRAME_GET_LINE (src, 1, i >> 1), + FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2); } } @@ -1914,8 +1916,9 @@ convert_I420_AYUV (ColorspaceConvert * convert, guint8 * dest, /* now handle last line */ if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); + cogorc_convert_I420_AYUV (FRAME_GET_LINE (dest, 0, i), convert->tmpline, FRAME_GET_LINE (src, 0, i), FRAME_GET_LINE (src, 0, i), /* note i, not i+1 */ + FRAME_GET_LINE (src, 1, i >> 1), + FRAME_GET_LINE (src, 2, i >> 1), convert->width); } } @@ -1949,17 +1952,43 @@ convert_I420_Y444 (ColorspaceConvert * convert, guint8 * dest, cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 1, 0), 2 * convert->dest_stride[1], FRAME_GET_LINE (dest, 1, 1), 2 * convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], (convert->width + 1) / 2, convert->height / 2); + convert->src_stride[1], convert->width / 2, convert->height / 2); cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 2, 0), 2 * convert->dest_stride[2], FRAME_GET_LINE (dest, 2, 1), 2 * convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height / 2); + convert->src_stride[2], convert->width / 2, convert->height / 2); + + /* now handle last column */ + if (convert->width & 1) { + int i; + for (i = 0; i < convert->height; i++) { + guint8 *d; + const guint8 *s; + d = FRAME_GET_LINE (dest, 1, i); + s = FRAME_GET_LINE (src, 1, i / 2); + *d = *s; + d = FRAME_GET_LINE (dest, 2, i); + s = FRAME_GET_LINE (src, 2, i / 2); + *d = *s; + } + } /* now handle last line */ if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_Y444 (convert, dest, convert->tmpline, convert->height - 1); + int i; + guint8 *d; + const guint8 *s; + d = FRAME_GET_LINE (dest, 1, convert->height - 1); + s = FRAME_GET_LINE (src, 1, (convert->height - 1) / 2); + for (i = 0; i < convert->width; i++) { + d[i] = s[i / 2]; + } + d = FRAME_GET_LINE (dest, 2, convert->height - 1); + s = FRAME_GET_LINE (src, 2, (convert->height - 1) / 2); + for (i = 0; i < convert->width; i++) { + d[i] = s[i / 2]; + } } } @@ -1983,9 +2012,13 @@ convert_YUY2_I420 (ColorspaceConvert * convert, guint8 * dest, } /* now handle last line */ - if (convert->height & 1) { - getline_YUY2 (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); + if (convert->width & 1) { + cogorc_convert_YUY2_I420 (FRAME_GET_LINE (dest, 0, i), + convert->tmpline, + FRAME_GET_LINE (dest, 1, i >> 1), + FRAME_GET_LINE (dest, 2, i >> 1), + FRAME_GET_LINE (src, 0, i), + FRAME_GET_LINE (src, 0, i), (convert->width + 1) / 2); } } @@ -1995,13 +2028,23 @@ convert_YUY2_AYUV (ColorspaceConvert * convert, guint8 * dest, { cogorc_convert_YUY2_AYUV (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); + convert->src_stride[0], convert->width / 2, convert->height); - /* now handle last line */ - if (convert->height & 1) { - getline_YUY2 (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); + /* now handle last column */ + if (convert->width & 1) { + int i; + for (i = 0; i < convert->height; i++) { + guint8 *d; + const guint8 *s; + d = FRAME_GET_LINE (dest, 0, i); + s = FRAME_GET_LINE (src, 0, i); + d += (convert->width - 1) * 4; + s += (convert->width / 2 - 1) * 4; + d[0] = 0xff; + d[1] = s[0]; + d[2] = s[1]; + d[3] = s[3]; + } } } @@ -2045,8 +2088,12 @@ convert_UYVY_I420 (ColorspaceConvert * convert, guint8 * dest, /* now handle last line */ if (convert->height & 1) { - getline_UYVY (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); + cogorc_convert_UYVY_I420 (FRAME_GET_LINE (dest, 0, i), + convert->tmpline, + FRAME_GET_LINE (dest, 1, i >> 1), + FRAME_GET_LINE (dest, 2, i >> 1), + FRAME_GET_LINE (src, 0, i), + FRAME_GET_LINE (src, 0, i), (convert->width + 1) / 2); } } @@ -2056,13 +2103,24 @@ convert_UYVY_AYUV (ColorspaceConvert * convert, guint8 * dest, { cogorc_convert_UYVY_AYUV (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); + convert->src_stride[0], convert->width / 2, + convert->width & 1 ? convert->height - 1 : convert->height); - /* now handle last line */ - if (convert->height & 1) { - getline_UYVY (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); + /* now handle last column */ + if (convert->width & 1) { + int i; + for (i = 0; i < convert->height; i++) { + guint8 *d; + const guint8 *s; + d = FRAME_GET_LINE (dest, 0, i); + s = FRAME_GET_LINE (src, 0, i); + d += (convert->width - 1) * 4; + s += (convert->width / 2 - 1) * 4; + d[0] = 0xff; + d[1] = s[1]; + d[2] = s[0]; + d[3] = s[2]; + } } } @@ -2136,13 +2194,29 @@ convert_AYUV_Y42B (ColorspaceConvert * convert, guint8 * dest, convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); + convert->src_stride[0], convert->width / 2, convert->height); - /* now handle last line */ + /* now handle last column */ if (convert->height & 1) { - getline_AYUV (convert, convert->tmpline, src, convert->height - 1); - putline_Y42B (convert, dest, convert->tmpline, convert->height - 1); + int i; + for (i = 0; i < convert->height; i++) { + guint8 *d; + const guint8 *s; + s = FRAME_GET_LINE (src, 0, i); + s += (convert->width - 1) * 4; + + d = FRAME_GET_LINE (dest, 0, i); + d += convert->width - 1; + d[0] = s[1]; + + d = FRAME_GET_LINE (dest, 1, i); + d += convert->width / 2 - 1; + d[0] = s[2]; + + d = FRAME_GET_LINE (dest, 2, i); + d += convert->width / 2 - 1; + d[0] = s[3]; + } } } @@ -2169,19 +2243,38 @@ convert_Y42B_I420 (ColorspaceConvert * convert, guint8 * dest, cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 1, 0), convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), 2 * convert->src_stride[1], FRAME_GET_LINE (src, 1, 1), - 2 * convert->src_stride[1], (convert->width + 1) / 2, - convert->height / 2); + 2 * convert->src_stride[1], convert->width / 2, + (convert->height + 1) / 2); cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 2, 0), convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), 2 * convert->src_stride[2], FRAME_GET_LINE (src, 2, 1), - 2 * convert->src_stride[2], (convert->width + 1) / 2, - convert->height / 2); - - /* now handle last line */ - if (convert->height & 1) { - getline_Y42B (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); + 2 * convert->src_stride[2], convert->width / 2, + (convert->height + 1) / 2); + + /* now handle last column */ + if (convert->width & 1) { + int i; + for (i = 0; i < (convert->height + 1) / 2; i++) { + guint8 *d; + const guint8 *s1, *s2; + + s1 = FRAME_GET_LINE (src, 1, i * 2); + s2 = FRAME_GET_LINE (src, 1, i * 2 + 1); + d = FRAME_GET_LINE (dest, 1, i); + s1 += convert->width / 2; + s2 += convert->width / 2; + d += convert->width / 2; + d[0] = (s1[0] + s2[0] + 1) / 2; + + s1 = FRAME_GET_LINE (src, 2, i * 2); + s2 = FRAME_GET_LINE (src, 2, i * 2 + 1); + d = FRAME_GET_LINE (dest, 2, i); + s1 += convert->width / 2; + s2 += convert->width / 2; + d += convert->width / 2; + d[0] = (s1[0] + s2[0] + 1) / 2; + } } } @@ -2247,19 +2340,49 @@ convert_Y444_I420 (ColorspaceConvert * convert, guint8 * dest, cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 1, 0), convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), 2 * convert->src_stride[1], FRAME_GET_LINE (src, 1, 1), - 2 * convert->src_stride[1], (convert->width + 1) / 2, - convert->height / 2); + 2 * convert->src_stride[1], convert->width / 2, convert->height / 2); cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 2, 0), convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), 2 * convert->src_stride[2], FRAME_GET_LINE (src, 2, 1), - 2 * convert->src_stride[2], (convert->width + 1) / 2, - convert->height / 2); + 2 * convert->src_stride[2], convert->width / 2, convert->height / 2); + + /* now handle last column */ + if (convert->width & 1) { + int i; + for (i = 0; i < (convert->height + 1) / 2; i++) { + guint8 *d; + const guint8 *s1, *s2; + + s1 = FRAME_GET_LINE (src, 1, i * 2); + s2 = FRAME_GET_LINE (src, 1, i * 2 + 1); + d = FRAME_GET_LINE (dest, 1, i); + s1 += convert->width / 2; + s2 += convert->width / 2; + d += convert->width / 2; + d[0] = (s1[0] + s2[0] + 1) / 2; + + s1 = FRAME_GET_LINE (src, 2, i * 2); + s2 = FRAME_GET_LINE (src, 2, i * 2 + 1); + d = FRAME_GET_LINE (dest, 2, i); + s1 += convert->width / 2; + s2 += convert->width / 2; + d += convert->width / 2; + d[0] = (s1[0] + s2[0] + 1) / 2; + } + } /* now handle last line */ if (convert->height & 1) { - getline_Y444 (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); + int i; + guint8 *d; + const guint8 *s; + s = FRAME_GET_LINE (src, 1, convert->height - 1); + d = FRAME_GET_LINE (dest, 1, convert->height / 2); + for (i = 0; i < convert->width / 2; i++) { + d[i] = (s[i * 2] + s[i * 2 + 1] + 1) / 2; + } + } } diff --git a/gst/colorspace/gstcolorspaceorc.orc b/gst/colorspace/gstcolorspaceorc.orc index 086990e15..f52af43f2 100644 --- a/gst/colorspace/gstcolorspaceorc.orc +++ b/gst/colorspace/gstcolorspaceorc.orc @@ -616,7 +616,7 @@ avgub d, s1, s2 .function cogorc_convert_YUY2_AYUV .flags 2d -.dest 8 ayuv guint8 +.dest 8 ayuv align 4 guint8 .source 4 yuy2 guint8 .const 2 c255 0xff .temp 2 yy @@ -632,7 +632,7 @@ x2 mergewl ayuv, ayay, uvuv .function cogorc_convert_UYVY_AYUV .flags 2d -.dest 8 ayuv guint8 +.dest 8 ayuv align 4 guint8 .source 4 uyvy guint8 .const 2 c255 0xff .temp 2 yy |