From abe4b0b235d8f4fcf33915e354fadf4bbe45d65c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 29 May 2012 15:12:16 +0200 Subject: [PATCH] video: fill in the pack/unpack functions Add support for supporting chroma subsampling correctly in the pack function. Fill in the pack and unpack functions for most formats. Add some missing pack/unpack functions to the orc file. --- gst-libs/gst/video/Makefile.am | 10 +- gst-libs/gst/video/video.c | 1344 +++++++++++++++++++++++++++++-- gst-libs/gst/video/video.h | 23 +- gst-libs/gst/video/videoblendorc-dist.c | 434 ++++++++++ gst-libs/gst/video/videoblendorc-dist.h | 2 + gst-libs/gst/video/videoblendorc.orc | 33 + 6 files changed, 1756 insertions(+), 90 deletions(-) diff --git a/gst-libs/gst/video/Makefile.am b/gst-libs/gst/video/Makefile.am index 8799952..ee096f8 100644 --- a/gst-libs/gst/video/Makefile.am +++ b/gst-libs/gst/video/Makefile.am @@ -1,4 +1,7 @@ # variables used for enum generation +ORC_SOURCE=videoblendorc +include $(top_srcdir)/common/orc.mak + glib_enum_headers = video.h colorbalance.h navigation.h glib_enum_define = GST_VIDEO glib_gen_prefix = gst_video @@ -28,7 +31,7 @@ libgstvideo_@GST_API_VERSION@_la_SOURCES = \ gstvideoencoder.c \ gstvideoutils.c -nodist_libgstvideo_@GST_API_VERSION@_la_SOURCES = $(BUILT_SOURCES) +nodist_libgstvideo_@GST_API_VERSION@_la_SOURCES = $(BUILT_SOURCES) $(ORC_NODIST_SOURCES) libgstvideo_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/video libgstvideo_@GST_API_VERSION@include_HEADERS = \ @@ -47,8 +50,9 @@ libgstvideo_@GST_API_VERSION@include_HEADERS = \ gstvideoutils.h nodist_libgstvideo_@GST_API_VERSION@include_HEADERS = $(built_headers) -libgstvideo_@GST_API_VERSION@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -libgstvideo_@GST_API_VERSION@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) +libgstvideo_@GST_API_VERSION@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) \ + $(ORC_CFLAGS) +libgstvideo_@GST_API_VERSION@_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) libgstvideo_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS) include $(top_srcdir)/common/gst-glib-gen.mak diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c index 20003a8..57a51b6 100644 --- a/gst-libs/gst/video/video.c +++ b/gst-libs/gst/video/video.c @@ -28,10 +28,1197 @@ #include "video.h" #include "gstvideometa.h" +/** + * SECTION:gstvideo + * @short_description: Support library for video operations + * + * + * + * This library contains some helper functions and includes the + * videosink and videofilter base classes. + * + * + */ + GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); static int fill_planes (GstVideoInfo * info); +#include "videoblendorc.h" + +/* Line conversion to AYUV */ + +#define GET_PLANE_STRIDE(plane) (stride(plane)) +#define GET_PLANE_LINE(plane, line) \ + (gpointer)(((guint8*)(data[plane])) + stride[plane] * (line)) + +#define GET_COMP_STRIDE(comp) \ + GST_VIDEO_FORMAT_INFO_STRIDE (info, stride, comp) +#define GET_COMP_DATA(comp) \ + GST_VIDEO_FORMAT_INFO_DATA (info, data, comp) + +#define GET_COMP_LINE(comp, line) \ + (gpointer)(((guint8*)GET_COMP_DATA (comp)) + \ + GET_COMP_STRIDE(comp) * (line)) + +#define GET_STRIDE() GET_PLANE_STRIDE (0) +#define GET_LINE(line) GET_PLANE_LINE (0, line) + +#define GET_Y_LINE(line) GET_COMP_LINE(GST_VIDEO_COMP_Y, line) +#define GET_U_LINE(line) GET_COMP_LINE(GST_VIDEO_COMP_U, line) +#define GET_V_LINE(line) GET_COMP_LINE(GST_VIDEO_COMP_V, line) +#define GET_A_LINE(line) GET_COMP_LINE(GST_VIDEO_COMP_A, line) + +#define GET_Y_STRIDE() GET_COMP_STRIDE(GST_VIDEO_COMP_Y) +#define GET_U_STRIDE() GET_COMP_STRIDE(GST_VIDEO_COMP_U) +#define GET_V_STRIDE() GET_COMP_STRIDE(GST_VIDEO_COMP_V) +#define GET_A_STRIDE() GET_COMP_STRIDE(GST_VIDEO_COMP_A) + +#define PACK_420 GST_VIDEO_FORMAT_AYUV, unpack_planar_420, pack_planar_420 +static void +unpack_planar_420 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_I420 (dest, + GET_Y_LINE (y), GET_U_LINE (y >> 1), GET_V_LINE (y >> 1), width); +} + +static void +pack_planar_420 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_I420 (GET_Y_LINE (y), + GET_U_LINE (y >> 1), GET_V_LINE (y >> 1), src, width / 2); +} + +#define PACK_YUY2 GST_VIDEO_FORMAT_AYUV, unpack_YUY2, pack_YUY2 +static void +unpack_YUY2 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_YUY2 (dest, GET_LINE (y), width / 2); +} + +static void +pack_YUY2 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_YUY2 (GET_LINE (y), src, width / 2); +} + +#define PACK_UYVY GST_VIDEO_FORMAT_AYUV, unpack_UYVY, pack_UYVY +static void +unpack_UYVY (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_UYVY (dest, GET_LINE (y), width / 2); +} + +static void +pack_UYVY (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_UYVY (GET_LINE (y), src, width / 2); +} + +#define PACK_YVYU GST_VIDEO_FORMAT_AYUV, unpack_YVYU, pack_YVYU +static void +unpack_YVYU (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_YVYU (dest, GET_LINE (y), width / 2); +} + +static void +pack_YVYU (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_YVYU (GET_LINE (y), src, width / 2); +} + +#define PACK_v308 GST_VIDEO_FORMAT_AYUV, unpack_v308, pack_v308 +static void +unpack_v308 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = s[i * 3 + 0]; + d[i * 4 + 2] = s[i * 3 + 1]; + d[i * 4 + 3] = s[i * 3 + 2]; + } +} + +static void +pack_v308 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i * 3 + 0] = s[i * 4 + 1]; + d[i * 3 + 1] = s[i * 4 + 2]; + d[i * 3 + 2] = s[i * 4 + 3]; + } +} + +#define PACK_AYUV GST_VIDEO_FORMAT_AYUV, unpack_copy4, pack_copy4 +#define PACK_ARGB GST_VIDEO_FORMAT_ARGB, unpack_copy4, pack_copy4 +static void +unpack_copy4 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + memcpy (dest, GET_LINE (y), width * 4); +} + +static void +pack_copy4 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + memcpy (GET_LINE (y), src, width * 4); +} + +#define PACK_v210 GST_VIDEO_FORMAT_AYUV64, unpack_v210, pack_v210 +static void +unpack_v210 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint16 *d = dest; + + for (i = 0; i < width; i += 6) { + guint32 a0, a1, a2, a3; + guint16 y0, y1, y2, y3, y4, y5; + guint16 u0, u2, u4; + guint16 v0, v2, v4; + + a0 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 0); + a1 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 4); + a2 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 8); + a3 = GST_READ_UINT32_LE (s + (i / 6) * 16 + 12); + + u0 = ((a0 >> 0) & 0x3ff) << 6; + y0 = ((a0 >> 10) & 0x3ff) << 6; + v0 = ((a0 >> 20) & 0x3ff) << 6; + y1 = ((a1 >> 0) & 0x3ff) << 6; + + u2 = ((a1 >> 10) & 0x3ff) << 6; + y2 = ((a1 >> 20) & 0x3ff) << 6; + v2 = ((a2 >> 0) & 0x3ff) << 6; + y3 = ((a2 >> 10) & 0x3ff) << 6; + + u4 = ((a2 >> 20) & 0x3ff) << 6; + y4 = ((a3 >> 0) & 0x3ff) << 6; + v4 = ((a3 >> 10) & 0x3ff) << 6; + y5 = ((a3 >> 20) & 0x3ff) << 6; + + d[4 * (i + 0) + 0] = 0xffff; + d[4 * (i + 0) + 1] = y0; + d[4 * (i + 0) + 2] = u0; + d[4 * (i + 0) + 3] = v0; + + d[4 * (i + 1) + 0] = 0xffff; + d[4 * (i + 1) + 1] = y1; + d[4 * (i + 1) + 2] = u0; + d[4 * (i + 1) + 3] = v0; + + d[4 * (i + 2) + 0] = 0xffff; + d[4 * (i + 2) + 1] = y2; + d[4 * (i + 2) + 2] = u2; + d[4 * (i + 2) + 3] = v2; + + d[4 * (i + 3) + 0] = 0xffff; + d[4 * (i + 3) + 1] = y3; + d[4 * (i + 3) + 2] = u2; + d[4 * (i + 3) + 3] = v2; + + d[4 * (i + 4) + 0] = 0xffff; + d[4 * (i + 4) + 1] = y4; + d[4 * (i + 4) + 2] = u4; + d[4 * (i + 4) + 3] = v4; + + d[4 * (i + 5) + 0] = 0xffff; + d[4 * (i + 5) + 1] = y5; + d[4 * (i + 5) + 2] = u4; + d[4 * (i + 5) + 3] = v4; + } +} + +static void +pack_v210 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint16 *s = src; + + for (i = 0; i < width; i += 6) { + guint32 a0, a1, a2, a3; + guint16 y0, y1, y2, y3, y4, y5; + guint16 u0, u1, u2; + guint16 v0, v1, v2; + + y0 = s[4 * (i + 0) + 1] >> 6; + y1 = s[4 * (i + 1) + 1] >> 6; + y2 = s[4 * (i + 2) + 1] >> 6; + y3 = s[4 * (i + 3) + 1] >> 6; + y4 = s[4 * (i + 4) + 1] >> 6; + y5 = s[4 * (i + 5) + 1] >> 6; + + u0 = (s[4 * (i + 0) + 2] + s[4 * (i + 1) + 2] + 1) >> 7; + u1 = (s[4 * (i + 2) + 2] + s[4 * (i + 3) + 2] + 1) >> 7; + u2 = (s[4 * (i + 4) + 2] + s[4 * (i + 5) + 2] + 1) >> 7; + + v0 = (s[4 * (i + 0) + 3] + s[4 * (i + 1) + 3] + 1) >> 7; + v1 = (s[4 * (i + 2) + 3] + s[4 * (i + 3) + 3] + 1) >> 7; + v2 = (s[4 * (i + 4) + 3] + s[4 * (i + 5) + 3] + 1) >> 7; + + a0 = u0 | (y0 << 10) | (v0 << 20); + a1 = y1 | (u1 << 10) | (y2 << 20); + a2 = v1 | (y3 << 10) | (u2 << 20); + a3 = y4 | (v2 << 10) | (y5 << 20); + + GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 0, a0); + GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 4, a1); + GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 8, a2); + GST_WRITE_UINT32_LE (d + (i / 6) * 16 + 12, a3); + } +} + +#define PACK_v216 GST_VIDEO_FORMAT_AYUV64, unpack_v216, pack_v216 +static void +unpack_v216 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint16 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xffff; + d[i * 4 + 1] = GST_READ_UINT16_LE (s + i * 4 + 2); + d[i * 4 + 2] = GST_READ_UINT16_LE (s + (i >> 1) * 8 + 0); + d[i * 4 + 3] = GST_READ_UINT16_LE (s + (i >> 1) * 8 + 4); + } +} + +static void +pack_v216 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint16 *s = src; + + for (i = 0; i < width / 2; i++) { + GST_WRITE_UINT16_LE (d + i * 8 + 0, s[(i * 2 + 0) * 4 + 2]); + GST_WRITE_UINT16_LE (d + i * 8 + 2, s[(i * 2 + 0) * 4 + 1]); + GST_WRITE_UINT16_LE (d + i * 8 + 4, s[(i * 2 + 0) * 4 + 3]); + GST_WRITE_UINT16_LE (d + i * 8 + 6, s[(i * 2 + 1) * 4 + 1]); + } +} + +#define PACK_Y41B GST_VIDEO_FORMAT_AYUV, unpack_Y41B, pack_Y41B +static void +unpack_Y41B (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_YUV9 (dest, + GET_Y_LINE (y), GET_U_LINE (y), GET_V_LINE (y), width / 2); +} + +static void +pack_Y41B (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *destY = GET_Y_LINE (y); + guint8 *destU = GET_U_LINE (y); + guint8 *destV = GET_V_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width - 3; i += 4) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + destY[i + 2] = s[i * 4 + 9]; + destY[i + 3] = s[i * 4 + 13]; + + destU[i >> 2] = + (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14] + 2) >> 2; + destV[i >> 2] = + (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15] + 2) >> 2; + } + + if (i == width - 3) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + destY[i + 2] = s[i * 4 + 9]; + + destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + 1) / 3; + destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + 1) / 3; + } else if (i == width - 2) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + + destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1; + destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1; + } else if (i == width - 1) { + destY[i + 1] = s[i * 4 + 5]; + + destU[i >> 2] = s[i * 4 + 2]; + destV[i >> 2] = s[i * 4 + 3]; + } +} + +#define PACK_Y42B GST_VIDEO_FORMAT_AYUV, unpack_Y42B, pack_Y42B +static void +unpack_Y42B (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_Y42B (dest, + GET_Y_LINE (y), GET_U_LINE (y), GET_V_LINE (y), width / 2); +} + +static void +pack_Y42B (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_Y42B (GET_Y_LINE (y), + GET_U_LINE (y), GET_V_LINE (y), src, width / 2); +} + +#define PACK_Y444 GST_VIDEO_FORMAT_AYUV, unpack_Y444, pack_Y444 +static void +unpack_Y444 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_Y444 (dest, + GET_Y_LINE (y), GET_U_LINE (y), GET_V_LINE (y), width); +} + +static void +pack_Y444 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_Y444 (GET_Y_LINE (y), + GET_U_LINE (y), GET_V_LINE (y), src, width); +} + +#define PACK_Y800 GST_VIDEO_FORMAT_AYUV, unpack_Y800, pack_Y800 +static void +unpack_Y800 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_Y800 (dest, GET_LINE (y), width); +} + +static void +pack_Y800 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_Y800 (GET_LINE (y), src, width); +} + +#define PACK_GRAY8 GST_VIDEO_FORMAT_UNKNOWN, NULL, NULL +#define PACK_GRAY16_LE GST_VIDEO_FORMAT_UNKNOWN, NULL, NULL +#define PACK_GRAY16_BE GST_VIDEO_FORMAT_UNKNOWN, NULL, NULL + +#define PACK_Y16 GST_VIDEO_FORMAT_AYUV, unpack_Y16, pack_Y16 +static void +unpack_Y16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_Y16 (dest, GET_LINE (y), width); +} + +static void +pack_Y16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_Y16 (GET_LINE (y), src, width); +} + +#define PACK_RGB16 GST_VIDEO_FORMAT_ARGB, unpack_RGB16, pack_RGB16 +static void +unpack_RGB16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint16 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = ((s[i] >> 11) & 0x1f) << 3; + d[i * 4 + 2] = ((s[i] >> 5) & 0x3f) << 2; + d[i * 4 + 3] = ((s[i]) & 0x1f) << 3; + } +} + +static void +pack_RGB16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i] = ((s[i * 4 + 1] >> 3) << 11) | + ((s[i * 4 + 2] >> 2) << 5) | (s[i * 4 + 3] >> 3); + } +} + +#define PACK_BGR16 GST_VIDEO_FORMAT_ARGB, unpack_BGR16, pack_BGR16 +static void +unpack_BGR16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint16 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 3] = ((s[i] >> 11) & 0x1f) << 3; + d[i * 4 + 2] = ((s[i] >> 5) & 0x3f) << 2; + d[i * 4 + 1] = ((s[i]) & 0x1f) << 3; + } +} + +static void +pack_BGR16 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i] = ((s[i * 4 + 3] >> 3) << 11) | + ((s[i * 4 + 2] >> 2) << 5) | (s[i * 4 + 1] >> 3); + } +} + +#define PACK_RGB15 GST_VIDEO_FORMAT_ARGB, unpack_RGB15, pack_RGB15 +static void +unpack_RGB15 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint16 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = ((s[i] >> 10) & 0x1f) << 3; + d[i * 4 + 2] = ((s[i] >> 5) & 0x1f) << 3; + d[i * 4 + 3] = ((s[i]) & 0x1f) << 3; + } +} + +static void +pack_RGB15 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i] = ((s[i * 4 + 1] >> 3) << 10) | + ((s[i * 4 + 2] >> 3) << 5) | (s[i * 4 + 3] >> 3); + } +} + +#define PACK_BGR15 GST_VIDEO_FORMAT_ARGB, unpack_BGR15, pack_BGR15 +static void +unpack_BGR15 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint16 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 3] = ((s[i] >> 10) & 0x1f) << 3; + d[i * 4 + 2] = ((s[i] >> 5) & 0x1f) << 3; + d[i * 4 + 1] = ((s[i]) & 0x1f) << 3; + } +} + +static void +pack_BGR15 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i] = ((s[i * 4 + 3] >> 3) << 10) | + ((s[i * 4 + 2] >> 3) << 5) | (s[i * 4 + 1] >> 3); + } +} + +#define PACK_BGRA GST_VIDEO_FORMAT_ARGB, unpack_BGRA, pack_BGRA +static void +unpack_BGRA (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_BGRA (dest, GET_LINE (y), width); +} + +static void +pack_BGRA (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_BGRA (GET_LINE (y), src, width); +} + +#define PACK_ABGR GST_VIDEO_FORMAT_ARGB, unpack_ABGR, pack_ABGR +static void +unpack_ABGR (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_ABGR (dest, GET_LINE (y), width); +} + +static void +pack_ABGR (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_ABGR (GET_LINE (y), src, width); +} + +#define PACK_RGBA GST_VIDEO_FORMAT_ARGB, unpack_RGBA, pack_RGBA +static void +unpack_RGBA (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_RGBA (dest, GET_LINE (y), width); +} + +static void +pack_RGBA (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_RGBA (GET_LINE (y), src, width); +} + +#define PACK_RGB GST_VIDEO_FORMAT_ARGB, unpack_RGB, pack_RGB +static void +unpack_RGB (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = s[i * 3 + 0]; + d[i * 4 + 2] = s[i * 3 + 1]; + d[i * 4 + 3] = s[i * 3 + 2]; + } +} + +static void +pack_RGB (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i * 3 + 0] = s[i * 4 + 1]; + d[i * 3 + 1] = s[i * 4 + 2]; + d[i * 3 + 2] = s[i * 4 + 3]; + } +} + +#define PACK_BGR GST_VIDEO_FORMAT_ARGB, unpack_BGR, pack_BGR +static void +unpack_BGR (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = s[i * 3 + 2]; + d[i * 4 + 2] = s[i * 3 + 1]; + d[i * 4 + 3] = s[i * 3 + 0]; + } +} + +static void +pack_BGR (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width; i++) { + d[i * 3 + 0] = s[i * 4 + 3]; + d[i * 3 + 1] = s[i * 4 + 2]; + d[i * 3 + 2] = s[i * 4 + 1]; + } +} + +#define PACK_NV12 GST_VIDEO_FORMAT_AYUV, unpack_NV12, pack_NV12 +static void +unpack_NV12 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_NV12 (dest, + GET_PLANE_LINE (0, y), GET_PLANE_LINE (1, y >> 1), width / 2); +} + +static void +pack_NV12 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_NV12 (GET_PLANE_LINE (0, y), + GET_PLANE_LINE (1, y >> 1), src, width / 2); +} + +#define PACK_NV21 GST_VIDEO_FORMAT_AYUV, unpack_NV21, pack_NV21 +static void +unpack_NV21 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_NV21 (dest, + GET_PLANE_LINE (0, y), GET_PLANE_LINE (1, y >> 1), width / 2); +} + +static void +pack_NV21 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_NV21 (GET_PLANE_LINE (0, y), + GET_PLANE_LINE (1, y >> 1), src, width / 2); +} + +#define PACK_UYVP GST_VIDEO_FORMAT_AYUV64, unpack_UYVP, pack_UYVP +static void +unpack_UYVP (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint16 *d = dest; + + for (i = 0; i < width; i += 2) { + guint16 y0, y1; + guint16 u0; + guint16 v0; + + u0 = (s[(i / 2) * 5 + 0] << 2) | (s[(i / 2) * 5 + 1] >> 6); + y0 = ((s[(i / 2) * 5 + 1] & 0x3f) << 4) | (s[(i / 2) * 5 + 2] >> 4); + v0 = ((s[(i / 2) * 5 + 2] & 0x0f) << 6) | (s[(i / 2) * 5 + 3] >> 2); + y1 = ((s[(i / 2) * 5 + 3] & 0x03) << 8) | s[(i / 2) * 5 + 4]; + + d[i * 4 + 0] = 0xffff; + d[i * 4 + 1] = y0 << 6; + d[i * 4 + 2] = u0 << 6; + d[i * 4 + 3] = v0 << 6; + d[i * 4 + 4] = 0xffff; + d[i * 4 + 5] = y1 << 6; + d[i * 4 + 6] = u0 << 6; + d[i * 4 + 7] = v0 << 6; + } +} + +static void +pack_UYVP (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint16 *s = src; + + for (i = 0; i < width; i += 2) { + guint16 y0, y1; + guint16 u0; + guint16 v0; + + y0 = s[4 * (i + 0) + 1]; + y1 = s[4 * (i + 1) + 1]; + u0 = (s[4 * (i + 0) + 2] + s[4 * (i + 1) + 2] + 1) >> 1; + v0 = (s[4 * (i + 0) + 3] + s[4 * (i + 1) + 3] + 1) >> 1; + + d[(i / 2) * 5 + 0] = u0 >> 8; + d[(i / 2) * 5 + 1] = (u0 & 0xc0) | y0 >> 10; + d[(i / 2) * 5 + 2] = ((y0 & 0x3c0) >> 2) | (v0 >> 12); + d[(i / 2) * 5 + 3] = ((v0 & 0xfc0) >> 4) | (y1 >> 14); + d[(i / 2) * 5 + 4] = (y1 >> 6); + } +} + +#define PACK_A420 GST_VIDEO_FORMAT_AYUV, unpack_A420, pack_A420 +static void +unpack_A420 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_A420 (dest, + GET_Y_LINE (y), GET_U_LINE (y >> 1), GET_V_LINE (y >> 1), GET_A_LINE (y), + width); +} + +static void +pack_A420 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + cogorc_putline_A420 (GET_Y_LINE (y), + GET_U_LINE (y >> 1), GET_V_LINE (y >> 1), GET_A_LINE (y), src, width / 2); +} + +#define PACK_RGB8P GST_VIDEO_FORMAT_ARGB, unpack_RGB8P, pack_RGB8P +static void +unpack_RGB8P (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + const guint32 *p = data[1]; + guint8 *d = dest; + + for (i = 0; i < width; i++) { + guint32 v = p[s[i]]; + d[i * 4 + 0] = (v >> 24) & 0xff; + d[i * 4 + 1] = (v >> 16) & 0xff; + d[i * 4 + 2] = (v >> 8) & 0xff; + d[i * 4 + 3] = (v) & 0xff; + } +} + +static void +pack_RGB8P (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint8 *s = src; + + /* Use our poor man's palette, taken from ffmpegcolorspace too */ + for (i = 0; i < width; i++) { + /* crude approximation for alpha ! */ + if (s[i * 4 + 0] < 0x80) + d[i] = 6 * 6 * 6; + else + d[i] = + ((((s[i * 4 + 1]) / 47) % 6) * 6 * 6 + (((s[i * 4 + + 2]) / 47) % 6) * 6 + (((s[i * 4 + 3]) / 47) % 6)); + } +} + +#define PACK_410 GST_VIDEO_FORMAT_AYUV, unpack_410, pack_410 +static void +unpack_410 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + cogorc_getline_YUV9 (dest, + GET_Y_LINE (y), GET_U_LINE (y >> 2), GET_V_LINE (y >> 2), width / 2); +} + +static void +pack_410 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *destY = GET_Y_LINE (y); + guint8 *destU = GET_U_LINE (y >> 2); + guint8 *destV = GET_V_LINE (y >> 2); + const guint8 *s = src; + + for (i = 0; i < width - 3; i += 4) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + destY[i + 2] = s[i * 4 + 9]; + destY[i + 3] = s[i * 4 + 13]; + if (y % 4 == 0) { + destU[i >> 2] = + (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14]) >> 2; + destV[i >> 2] = + (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15]) >> 2; + } + } + + if (i == width - 3) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + destY[i + 2] = s[i * 4 + 9]; + if (y % 4 == 0) { + destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10]) / 3; + destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11]) / 3; + } + } else if (i == width - 2) { + destY[i] = s[i * 4 + 1]; + destY[i + 1] = s[i * 4 + 5]; + if (y % 4 == 0) { + destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6]) >> 1; + destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7]) >> 1; + } + } else if (i == width - 1) { + destY[i] = s[i * 4 + 1]; + destU[i >> 2] = s[i * 4 + 2]; + destV[i >> 2] = s[i * 4 + 3]; + } +} + +#define PACK_IYU1 GST_VIDEO_FORMAT_AYUV, unpack_IYU1, pack_IYU1 +static void +unpack_IYU1 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint8 *d = dest; + + for (i = 0; i < width - 3; i += 4) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 4] = 0xff; + d[i * 4 + 8] = 0xff; + d[i * 4 + 12] = 0xff; + d[i * 4 + 1] = s[(i >> 2) * 6 + 1]; + d[i * 4 + 5] = s[(i >> 2) * 6 + 2]; + d[i * 4 + 9] = s[(i >> 2) * 6 + 4]; + d[i * 4 + 13] = s[(i >> 2) * 6 + 5]; + d[i * 4 + 2] = d[i * 4 + 6] = d[i * 4 + 10] = d[i * 4 + 14] = + s[(i >> 2) * 6 + 0]; + d[i * 4 + 3] = d[i * 4 + 7] = d[i * 4 + 11] = d[i * 4 + 15] = + s[(i >> 2) * 6 + 3]; + } + + if (i == width - 3) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 4] = 0xff; + d[i * 4 + 8] = 0xff; + d[i * 4 + 1] = s[(i >> 2) * 6 + 1]; + d[i * 4 + 5] = s[(i >> 2) * 6 + 2]; + d[i * 4 + 9] = s[(i >> 2) * 6 + 4]; + d[i * 4 + 2] = d[i * 4 + 6] = d[i * 4 + 10] = s[(i >> 2) * 6 + 0]; + d[i * 4 + 3] = d[i * 4 + 7] = d[i * 4 + 11] = s[(i >> 2) * 6 + 3]; + } else if (i == width - 2) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 4] = 0xff; + d[i * 4 + 1] = s[(i >> 2) * 6 + 1]; + d[i * 4 + 5] = s[(i >> 2) * 6 + 2]; + d[i * 4 + 2] = d[i * 4 + 6] = s[(i >> 2) * 6 + 0]; + d[i * 4 + 3] = d[i * 4 + 7] = s[(i >> 2) * 6 + 3]; + } else if (i == width - 1) { + d[i * 4 + 0] = 0xff; + d[i * 4 + 1] = s[(i >> 2) * 6 + 1]; + d[i * 4 + 2] = s[(i >> 2) * 6 + 0]; + d[i * 4 + 3] = s[(i >> 2) * 6 + 3]; + } +} + +static void +pack_IYU1 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint8 *s = src; + + for (i = 0; i < width - 3; i += 4) { + d[(i >> 2) * 6 + 1] = s[i * 4 + 1]; + d[(i >> 2) * 6 + 2] = s[i * 4 + 5]; + d[(i >> 2) * 6 + 4] = s[i * 4 + 9]; + d[(i >> 2) * 6 + 5] = s[i * 4 + 13]; + d[(i >> 2) * 6 + 0] = + (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14]) >> 2; + d[(i >> 2) * 6 + 3] = + (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15]) >> 2; + } + + if (i == width - 3) { + d[(i >> 2) * 6 + 1] = s[i * 4 + 1]; + d[(i >> 2) * 6 + 2] = s[i * 4 + 5]; + d[(i >> 2) * 6 + 4] = s[i * 4 + 9]; + d[(i >> 2) * 6 + 0] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10]) / 3; + d[(i >> 2) * 6 + 3] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11]) / 3; + } else if (i == width - 2) { + d[(i >> 2) * 6 + 1] = s[i * 4 + 1]; + d[(i >> 2) * 6 + 2] = s[i * 4 + 5]; + d[(i >> 2) * 6 + 0] = (s[i * 4 + 2] + s[i * 4 + 6]) >> 1; + d[(i >> 2) * 6 + 3] = (s[i * 4 + 3] + s[i * 4 + 7]) >> 1; + } else if (i == width - 1) { + d[(i >> 2) * 6 + 1] = s[i * 4 + 1]; + d[(i >> 2) * 6 + 0] = s[i * 4 + 2]; + d[(i >> 2) * 6 + 3] = s[i * 4 + 3]; + } +} + +#define PACK_ARGB64 GST_VIDEO_FORMAT_ARGB64, unpack_copy8, pack_copy8 +#define PACK_AYUV64 GST_VIDEO_FORMAT_AYUV64, unpack_copy8, pack_copy8 +static void +unpack_copy8 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + memcpy (dest, GET_LINE (y), width * 8); +} + +static void +pack_copy8 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + memcpy (GET_LINE (y), src, width * 8); +} + +#define PACK_r210 GST_VIDEO_FORMAT_AYUV64, unpack_r210, pack_r210 +static void +unpack_r210 (GstVideoFormatInfo * info, GstVideoPackFlags flags, gpointer dest, + const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + const guint8 *s = GET_LINE (y); + guint16 *d = dest; + + for (i = 0; i < width; i++) { + guint32 x; + d[i * 4 + 0] = 0xffff; + x = GST_READ_UINT32_BE (s + i * 4); + d[i * 4 + 1] = ((x >> 14) & 0xffc0) | (x >> 24); + d[i * 4 + 2] = ((x >> 4) & 0xffc0) | ((x >> 14) & 0x3f); + d[i * 4 + 3] = ((x << 6) & 0xffc0) | ((x >> 4) & 0x3f); + } +} + +static void +pack_r210 (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint8 *d = GET_LINE (y); + const guint16 *s = src; + + for (i = 0; i < width; i++) { + guint32 x = 0; + x |= (s[i * 4 + 1] & 0xffc0) << 14; + x |= (s[i * 4 + 2] & 0xffc0) << 4; + x |= (s[i * 4 + 3] & 0xffc0) >> 6; + GST_WRITE_UINT32_BE (d + i * 4, x); + } +} + +#define PACK_I420_10LE GST_VIDEO_FORMAT_AYUV64, unpack_I420_10LE, pack_I420_10LE +static void +unpack_I420_10LE (GstVideoFormatInfo * info, GstVideoPackFlags flags, + gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + guint16 *srcY = GET_Y_LINE (y); + guint16 *srcU = GET_U_LINE (y >> 1); + guint16 *srcV = GET_V_LINE (y >> 1); + guint16 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xffff; + d[i * 4 + 1] = GST_READ_UINT16_LE (srcY + i) << 6; + d[i * 4 + 2] = GST_READ_UINT16_LE (srcU + (i >> 1)) << 6; + d[i * 4 + 3] = GST_READ_UINT16_LE (srcV + (i >> 1)) << 6; + } +} + +static void +pack_I420_10LE (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *destY = GET_Y_LINE (y); + guint16 *destU = GET_U_LINE (y >> 1); + guint16 *destV = GET_V_LINE (y >> 1); + guint16 Y0, Y1, U, V; + const guint16 *s = src; + + for (i = 0; i < width - 1; i += 2) { + Y0 = (s[i * 4 + 1]) >> 6; + Y1 = (s[i * 4 + 5]) >> 6; + U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6; + V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6; + + GST_WRITE_UINT16_LE (destY + i + 0, Y0); + GST_WRITE_UINT16_LE (destY + i + 1, Y1); + GST_WRITE_UINT16_LE (destU + (i >> 1), U); + GST_WRITE_UINT16_LE (destV + (i >> 1), V); + } + if (i == width - 1) { + Y0 = s[i * 4 + 1] >> 6; + U = s[i * 4 + 2] >> 6; + V = s[i * 4 + 3] >> 6; + + GST_WRITE_UINT16_LE (destY + i, Y0); + GST_WRITE_UINT16_LE (destU + (i >> 1), U); + GST_WRITE_UINT16_LE (destV + (i >> 1), V); + } +} + +#define PACK_I420_10BE GST_VIDEO_FORMAT_AYUV64, unpack_I420_10BE, pack_I420_10BE +static void +unpack_I420_10BE (GstVideoFormatInfo * info, GstVideoPackFlags flags, + gpointer dest, const gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], gint x, gint y, gint width) +{ + int i; + guint16 *srcY = GET_Y_LINE (y); + guint16 *srcU = GET_U_LINE (y >> 1); + guint16 *srcV = GET_V_LINE (y >> 1); + guint16 *d = dest; + + for (i = 0; i < width; i++) { + d[i * 4 + 0] = 0xffff; + d[i * 4 + 1] = GST_READ_UINT16_BE (srcY + i) << 6; + d[i * 4 + 2] = GST_READ_UINT16_BE (srcU + (i >> 1)) << 6; + d[i * 4 + 3] = GST_READ_UINT16_BE (srcV + (i >> 1)) << 6; + } +} + +static void +pack_I420_10BE (GstVideoFormatInfo * info, GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], + const gint stride[GST_VIDEO_MAX_PLANES], GstVideoChromaSite chroma_site, + gint y, gint width) +{ + int i; + guint16 *destY = GET_Y_LINE (y); + guint16 *destU = GET_U_LINE (y >> 1); + guint16 *destV = GET_V_LINE (y >> 1); + guint16 Y0, Y1, U, V; + const guint16 *s = src; + + for (i = 0; i < width - 1; i += 2) { + Y0 = s[i * 4 + 1] >> 6; + Y1 = s[i * 4 + 5] >> 6; + U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6; + V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6; + + GST_WRITE_UINT16_BE (destY + i + 0, Y0); + GST_WRITE_UINT16_BE (destY + i + 1, Y1); + GST_WRITE_UINT16_BE (destU + (i >> 1), U); + GST_WRITE_UINT16_BE (destV + (i >> 1), V); + } + if (i == width - 1) { + Y0 = s[i * 4 + 1] >> 6; + U = s[i * 4 + 2] >> 6; + V = s[i * 4 + 3] >> 6; + + GST_WRITE_UINT16_BE (destY + i, Y0); + GST_WRITE_UINT16_BE (destU + (i >> 1), U); + GST_WRITE_UINT16_BE (destV + (i >> 1), V); + } +} + typedef struct { guint32 fourcc; @@ -102,26 +1289,26 @@ typedef struct #define SUB4444 { 0, 0, 0, 0 }, { 0, 0, 0, 0 } #define SUB4204 { 0, 1, 1, 0 }, { 0, 1, 1, 0 } -#define MAKE_YUV_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub ) \ - { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV, depth, pstride, plane, offs, sub } } -#define MAKE_YUV_LE_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub ) \ - { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub } } -#define MAKE_YUVA_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub) \ - { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } } -#define MAKE_YUV_C_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub) \ - { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_COMPLEX, depth, pstride, plane, offs, sub } } - -#define MAKE_RGB_FORMAT(name, desc, depth, pstride, plane, offs, sub) \ - { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB, depth, pstride, plane, offs, sub } } -#define MAKE_RGB_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub) \ - { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub } } -#define MAKE_RGBA_FORMAT(name, desc, depth, pstride, plane, offs, sub) \ - { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub } } - -#define MAKE_GRAY_FORMAT(name, desc, depth, pstride, plane, offs, sub) \ - { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY, depth, pstride, plane, offs, sub } } -#define MAKE_GRAY_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub) \ - { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub } } +#define MAKE_YUV_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack ) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV, depth, pstride, plane, offs, sub, pack } } +#define MAKE_YUV_LE_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack ) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } } +#define MAKE_YUVA_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub, pack } } +#define MAKE_YUV_C_FORMAT(name, desc, fourcc, depth, pstride, plane, offs, sub, pack) \ + { fourcc, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_YUV | GST_VIDEO_FORMAT_FLAG_COMPLEX, depth, pstride, plane, offs, sub, pack } } + +#define MAKE_RGB_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB, depth, pstride, plane, offs, sub, pack } } +#define MAKE_RGB_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } } +#define MAKE_RGBA_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_ALPHA, depth, pstride, plane, offs, sub, pack } } + +#define MAKE_GRAY_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY, depth, pstride, plane, offs, sub, pack } } +#define MAKE_GRAY_LE_FORMAT(name, desc, depth, pstride, plane, offs, sub, pack) \ + { 0x00000000, {GST_VIDEO_FORMAT_ ##name, G_STRINGIFY(name), desc, GST_VIDEO_FORMAT_FLAG_GRAY | GST_VIDEO_FORMAT_FLAG_LE, depth, pstride, plane, offs, sub, pack } } static VideoFormat formats[] = { {0x00000000, {GST_VIDEO_FORMAT_UNKNOWN, "UNKNOWN", "unknown video", 0, DPTH0, @@ -129,141 +1316,138 @@ static VideoFormat formats[] = { OFFS0}}, {0x00000000, {GST_VIDEO_FORMAT_ENCODED, "ENCODED", "encoded video", GST_VIDEO_FORMAT_FLAG_COMPLEX, DPTH0, PSTR0, PLANE_NA, OFFS0}}, + MAKE_YUV_FORMAT (I420, "raw video", GST_MAKE_FOURCC ('I', '4', '2', '0'), DPTH888, PSTR111, - PLANE012, OFFS0, SUB420), + PLANE012, OFFS0, SUB420, PACK_420), MAKE_YUV_FORMAT (YV12, "raw video", GST_MAKE_FOURCC ('Y', 'V', '1', '2'), DPTH888, PSTR111, - PLANE021, OFFS0, SUB420), + PLANE021, OFFS0, SUB420, PACK_420), MAKE_YUV_FORMAT (YUY2, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), DPTH888, PSTR244, - PLANE0, OFFS013, SUB422), + PLANE0, OFFS013, SUB422, PACK_YUY2), MAKE_YUV_FORMAT (UYVY, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), DPTH888, PSTR244, - PLANE0, OFFS102, SUB422), + PLANE0, OFFS102, SUB422, PACK_UYVY), MAKE_YUVA_FORMAT (AYUV, "raw video", GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'), DPTH8888, - PSTR4444, PLANE0, OFFS1230, SUB4444), + PSTR4444, PLANE0, OFFS1230, SUB4444, PACK_AYUV), MAKE_RGB_FORMAT (RGBx, "raw video", DPTH888, PSTR444, PLANE0, OFFS012, - SUB444), + SUB444, PACK_RGBA), MAKE_RGB_FORMAT (BGRx, "raw video", DPTH888, PSTR444, PLANE0, OFFS210, - SUB444), + SUB444, PACK_BGRA), MAKE_RGB_FORMAT (xRGB, "raw video", DPTH888, PSTR444, PLANE0, OFFS123, - SUB444), + SUB444, PACK_ARGB), MAKE_RGB_FORMAT (xBGR, "raw video", DPTH888, PSTR444, PLANE0, OFFS321, - SUB444), + SUB444, PACK_ABGR), MAKE_RGBA_FORMAT (RGBA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS0123, - SUB4444), + SUB4444, PACK_RGBA), MAKE_RGBA_FORMAT (BGRA, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS2103, - SUB4444), + SUB4444, PACK_BGRA), MAKE_RGBA_FORMAT (ARGB, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS1230, - SUB4444), + SUB4444, PACK_ARGB), MAKE_RGBA_FORMAT (ABGR, "raw video", DPTH8888, PSTR4444, PLANE0, OFFS3210, - SUB4444), - MAKE_RGB_FORMAT (RGB, "raw video", DPTH888, PSTR333, PLANE0, OFFS012, SUB444), - MAKE_RGB_FORMAT (BGR, "raw video", DPTH888, PSTR333, PLANE0, OFFS210, SUB444), + SUB4444, PACK_ABGR), + MAKE_RGB_FORMAT (RGB, "raw video", DPTH888, PSTR333, PLANE0, OFFS012, SUB444, + PACK_RGB), + MAKE_RGB_FORMAT (BGR, "raw video", DPTH888, PSTR333, PLANE0, OFFS210, SUB444, + PACK_BGR), MAKE_YUV_FORMAT (Y41B, "raw video", GST_MAKE_FOURCC ('Y', '4', '1', 'B'), DPTH888, PSTR111, - PLANE012, OFFS0, SUB411), + PLANE012, OFFS0, SUB411, PACK_Y41B), MAKE_YUV_FORMAT (Y42B, "raw video", GST_MAKE_FOURCC ('Y', '4', '2', 'B'), DPTH888, PSTR111, - PLANE012, OFFS0, SUB422), + PLANE012, OFFS0, SUB422, PACK_Y42B), MAKE_YUV_FORMAT (YVYU, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'), DPTH888, PSTR244, - PLANE0, OFFS031, SUB422), + PLANE0, OFFS031, SUB422, PACK_YVYU), MAKE_YUV_FORMAT (Y444, "raw video", GST_MAKE_FOURCC ('Y', '4', '4', '4'), DPTH888, PSTR111, - PLANE012, OFFS0, SUB444), + PLANE012, OFFS0, SUB444, PACK_Y444), MAKE_YUV_C_FORMAT (v210, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '0'), DPTH10_10_10, - PSTR0, PLANE0, OFFS0, SUB422), + PSTR0, PLANE0, OFFS0, SUB422, PACK_v210), MAKE_YUV_FORMAT (v216, "raw video", GST_MAKE_FOURCC ('v', '2', '1', '6'), DPTH16_16_16, - PSTR488, PLANE0, OFFS204, SUB422), + PSTR488, PLANE0, OFFS204, SUB422, PACK_v216), MAKE_YUV_FORMAT (NV12, "raw video", GST_MAKE_FOURCC ('N', 'V', '1', '2'), DPTH888, PSTR122, - PLANE011, OFFS001, SUB420), + PLANE011, OFFS001, SUB420, PACK_NV12), MAKE_YUV_FORMAT (NV21, "raw video", GST_MAKE_FOURCC ('N', 'V', '2', '1'), DPTH888, PSTR122, - PLANE011, OFFS010, SUB420), + PLANE011, OFFS010, SUB420, PACK_NV21), - MAKE_GRAY_FORMAT (GRAY8, "raw video", DPTH8, PSTR1, PLANE0, OFFS0, SUB4), - MAKE_GRAY_FORMAT (GRAY16_BE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, SUB4), + MAKE_GRAY_FORMAT (GRAY8, "raw video", DPTH8, PSTR1, PLANE0, OFFS0, SUB4, + PACK_GRAY8), + MAKE_GRAY_FORMAT (GRAY16_BE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, SUB4, + PACK_GRAY16_BE), MAKE_GRAY_LE_FORMAT (GRAY16_LE, "raw video", DPTH16, PSTR2, PLANE0, OFFS0, - SUB4), + SUB4, PACK_GRAY16_LE), MAKE_YUV_FORMAT (v308, "raw video", GST_MAKE_FOURCC ('v', '3', '0', '8'), DPTH888, PSTR333, - PLANE0, OFFS012, SUB444), + PLANE0, OFFS012, SUB444, PACK_v308), MAKE_YUV_FORMAT (Y800, "raw video", GST_MAKE_FOURCC ('Y', '8', '0', '0'), DPTH8, PSTR1, - PLANE0, OFFS0, SUB4), + PLANE0, OFFS0, SUB4, PACK_Y800), MAKE_YUV_FORMAT (Y16, "raw video", GST_MAKE_FOURCC ('Y', '1', '6', ' '), DPTH16, PSTR2, - PLANE0, OFFS0, SUB4), + PLANE0, OFFS0, SUB4, PACK_Y16), #if G_BYTE_ORDER == G_LITTLE_ENDIAN MAKE_RGB_LE_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, - SUB444), + SUB444, PACK_RGB16), MAKE_RGB_LE_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, - SUB444), + SUB444, PACK_BGR16), MAKE_RGB_LE_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, - SUB444), + SUB444, PACK_RGB15), MAKE_RGB_LE_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, - SUB444), + SUB444, PACK_BGR15), #else - MAKE_RGB_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444), - MAKE_RGB_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444), - MAKE_RGB_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444), - MAKE_RGB_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444), + MAKE_RGB_FORMAT (RGB16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444, + PACK_RGB16), + MAKE_RGB_FORMAT (BGR16, "raw video", DPTH565, PSTR222, PLANE0, OFFS0, SUB444, + PACK_BGR16), + MAKE_RGB_FORMAT (RGB15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444, + PACK_RGB15), + MAKE_RGB_FORMAT (BGR15, "raw video", DPTH555, PSTR222, PLANE0, OFFS0, SUB444, + PACK_BGR15), #endif MAKE_YUV_C_FORMAT (UYVP, "raw video", GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'), DPTH10_10_10, - PSTR0, PLANE0, OFFS0, SUB422), + PSTR0, PLANE0, OFFS0, SUB422, PACK_UYVP), MAKE_YUVA_FORMAT (A420, "raw video", GST_MAKE_FOURCC ('A', '4', '2', '0'), DPTH8888, - PSTR1111, PLANE0123, OFFS0, SUB4204), + PSTR1111, PLANE0123, OFFS0, SUB4204, PACK_A420), MAKE_RGBA_FORMAT (RGB8_PALETTED, "raw video", DPTH8888, PSTR1111, PLANE0, - OFFS0, SUB4444), + OFFS0, SUB4444, PACK_RGB8P), MAKE_YUV_FORMAT (YUV9, "raw video", GST_MAKE_FOURCC ('Y', 'U', 'V', '9'), DPTH888, PSTR111, - PLANE012, OFFS0, SUB410), + PLANE012, OFFS0, SUB410, PACK_410), MAKE_YUV_FORMAT (YVU9, "raw video", GST_MAKE_FOURCC ('Y', 'V', 'U', '9'), DPTH888, PSTR111, - PLANE021, OFFS0, SUB410), + PLANE021, OFFS0, SUB410, PACK_410), MAKE_YUV_FORMAT (IYU1, "raw video", GST_MAKE_FOURCC ('I', 'Y', 'U', '1'), DPTH888, PSTR0, - PLANE0, OFFS104, SUB411), + PLANE0, OFFS104, SUB411, PACK_IYU1), MAKE_RGBA_FORMAT (ARGB64, "raw video", DPTH16_16_16_16, PSTR8888, PLANE0, OFFS2460, - SUB444), + SUB444, PACK_ARGB64), MAKE_YUVA_FORMAT (AYUV64, "raw video", 0x00000000, DPTH16_16_16_16, PSTR8888, PLANE0, - OFFS2460, SUB444), + OFFS2460, SUB444, PACK_AYUV64), MAKE_YUV_FORMAT (r210, "raw video", GST_MAKE_FOURCC ('r', '2', '1', '0'), DPTH10_10_10, - PSTR444, PLANE0, OFFS0, SUB444), + PSTR444, PLANE0, OFFS0, SUB444, PACK_r210), MAKE_YUV_FORMAT (I420_10BE, "raw video", 0x00000000, DPTH10_10_10, - PSTR222, PLANE012, OFFS0, SUB420), + PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_10BE), MAKE_YUV_LE_FORMAT (I420_10LE, "raw video", 0x00000000, DPTH10_10_10, - PSTR222, PLANE012, OFFS0, SUB420), + PSTR222, PLANE012, OFFS0, SUB420, PACK_I420_10LE), }; /** - * SECTION:gstvideo - * @short_description: Support library for video operations - * - * - * - * This library contains some helper functions and includes the - * videosink and videofilter base classes. - * - * - */ - -/** * gst_video_calculate_display_ratio: * @dar_n: Numerator of the calculated display_ratio * @dar_d: Denominator of the calculated display_ratio diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 5f9c42c..df3cae2 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -130,6 +130,8 @@ typedef enum { #define GST_VIDEO_MAX_COMPONENTS 4 typedef struct _GstVideoFormatInfo GstVideoFormatInfo; +typedef struct _GstVideoColorimetry GstVideoColorimetry; +typedef enum _GstVideoChromaSite GstVideoChromaSite; /** * GstVideoFormatFlags: @@ -207,21 +209,28 @@ typedef void (*GstVideoFormatUnpack) (GstVideoFormatInfo *info, * @info: a #GstVideoFormatInfo * @flags: flags to control the packing * @src: a source array + * @sstride: the source array stride * @data: pointers to the destination data planes * @stride: strides of the destination planes - * @x: the x position in the image to pack to + * @chroma_site: the chroma siting of the target when subsampled * @y: the y position in the image to pack to * @width: the amount of pixels to pack. * * Packs @width pixels from @src to the given planes and strides in the * format @info. The pixels from source have each component interleaved * and will be packed into the planes in @data. + * + * When @info refers to a format with a h_sub != 0, this function operates on + * (1 << h_sub) lines meaning that @src should contain at least (1 << h_sub) + * lines with a stride of @sstride and @y should be a multiple of (1 << h_sub). */ typedef void (*GstVideoFormatPack) (GstVideoFormatInfo *info, - GstVideoPackFlags flags, const gpointer src, + GstVideoPackFlags flags, + const gpointer src, gint sstride, gpointer data[GST_VIDEO_MAX_PLANES], const gint stride[GST_VIDEO_MAX_PLANES], - gint x, gint y, gint width); + GstVideoChromaSite chroma_site, + gint y, gint width); /** * GstVideoFormatInfo: @@ -382,7 +391,7 @@ typedef enum { * * Various Chroma sitings. */ -typedef enum { +enum _GstVideoChromaSite { GST_VIDEO_CHROMA_SITE_UNKNOWN = 0, GST_VIDEO_CHROMA_SITE_NONE = (1 << 0), GST_VIDEO_CHROMA_SITE_H_COSITED = (1 << 1), @@ -393,7 +402,7 @@ typedef enum { GST_VIDEO_CHROMA_SITE_JPEG = (GST_VIDEO_CHROMA_SITE_NONE), GST_VIDEO_CHROMA_SITE_MPEG2 = (GST_VIDEO_CHROMA_SITE_H_COSITED), GST_VIDEO_CHROMA_SITE_DV = (GST_VIDEO_CHROMA_SITE_COSITED | GST_VIDEO_CHROMA_SITE_ALT_LINE), -} GstVideoChromaSite; +}; /** * GstVideoColorRange: @@ -500,12 +509,12 @@ typedef enum { * * Structure describing the color info. */ -typedef struct { +struct _GstVideoColorimetry { GstVideoColorRange range; GstVideoColorMatrix matrix; GstVideoTransferFunction transfer; GstVideoColorPrimaries primaries; -} GstVideoColorimetry; +}; /* predefined colorimetry */ #define GST_VIDEO_COLORIMETRY_BT601 "bt601" diff --git a/gst-libs/gst/video/videoblendorc-dist.c b/gst-libs/gst/video/videoblendorc-dist.c index 01b73f1..afadde7 100644 --- a/gst-libs/gst/video/videoblendorc-dist.c +++ b/gst-libs/gst/video/videoblendorc-dist.c @@ -99,6 +99,10 @@ void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); +void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, int n); +void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, int n); void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); @@ -2044,6 +2048,436 @@ cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, #endif +/* cogorc_getline_YVYU */ +#ifdef DISABLE_ORC +void +cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + int n) +{ + int i; + orc_union64 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union32 var36; + orc_union16 var37; + orc_union64 var38; + orc_union16 var39; + orc_union16 var40; + orc_union16 var41; + orc_union32 var42; + orc_union32 var43; + + ptr0 = (orc_union64 *) d1; + ptr4 = (orc_union32 *) s1; + + /* 3: loadpb */ + var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var36 = ptr4[i]; + /* 1: splitwb */ + { + orc_union16 _src; + _src.i = var36.x2[0]; + var39.x2[0] = _src.x2[1]; + var40.x2[0] = _src.x2[0]; + } + { + orc_union16 _src; + _src.i = var36.x2[1]; + var39.x2[1] = _src.x2[1]; + var40.x2[1] = _src.x2[0]; + } + /* 2: swapw */ + var41.i = ORC_SWAP_W (var39.i); + /* 4: mergebw */ + { + orc_union16 _dest; + _dest.x2[0] = var37.x2[0]; + _dest.x2[1] = var40.x2[0]; + var42.x2[0] = _dest.i; + } + { + orc_union16 _dest; + _dest.x2[0] = var37.x2[1]; + _dest.x2[1] = var40.x2[1]; + var42.x2[1] = _dest.i; + } + /* 5: mergewl */ + { + orc_union32 _dest; + _dest.x2[0] = var41.i; + _dest.x2[1] = var41.i; + var43.i = _dest.i; + } + /* 6: mergewl */ + { + orc_union32 _dest; + _dest.x2[0] = var42.x2[0]; + _dest.x2[1] = var43.x2[0]; + var38.x2[0] = _dest.i; + } + { + orc_union32 _dest; + _dest.x2[0] = var42.x2[1]; + _dest.x2[1] = var43.x2[1]; + var38.x2[1] = _dest.i; + } + /* 7: storeq */ + ptr0[i] = var38; + } + +} + +#else +static void +_backup_cogorc_getline_YVYU (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union64 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union32 var36; + orc_union16 var37; + orc_union64 var38; + orc_union16 var39; + orc_union16 var40; + orc_union16 var41; + orc_union32 var42; + orc_union32 var43; + + ptr0 = (orc_union64 *) ex->arrays[0]; + ptr4 = (orc_union32 *) ex->arrays[4]; + + /* 3: loadpb */ + var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var36 = ptr4[i]; + /* 1: splitwb */ + { + orc_union16 _src; + _src.i = var36.x2[0]; + var39.x2[0] = _src.x2[1]; + var40.x2[0] = _src.x2[0]; + } + { + orc_union16 _src; + _src.i = var36.x2[1]; + var39.x2[1] = _src.x2[1]; + var40.x2[1] = _src.x2[0]; + } + /* 2: swapw */ + var41.i = ORC_SWAP_W (var39.i); + /* 4: mergebw */ + { + orc_union16 _dest; + _dest.x2[0] = var37.x2[0]; + _dest.x2[1] = var40.x2[0]; + var42.x2[0] = _dest.i; + } + { + orc_union16 _dest; + _dest.x2[0] = var37.x2[1]; + _dest.x2[1] = var40.x2[1]; + var42.x2[1] = _dest.i; + } + /* 5: mergewl */ + { + orc_union32 _dest; + _dest.x2[0] = var41.i; + _dest.x2[1] = var41.i; + var43.i = _dest.i; + } + /* 6: mergewl */ + { + orc_union32 _dest; + _dest.x2[0] = var42.x2[0]; + _dest.x2[1] = var43.x2[0]; + var38.x2[0] = _dest.i; + } + { + orc_union32 _dest; + _dest.x2[0] = var42.x2[1]; + _dest.x2[1] = var43.x2[1]; + var38.x2[1] = _dest.i; + } + /* 7: storeq */ + ptr0[i] = var38; + } + +} + +void +cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "cogorc_getline_YVYU"); + orc_program_set_backup_function (p, _backup_cogorc_getline_YVYU); + orc_program_add_destination (p, 8, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 2, 0x000000ff, "c1"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 4, "t3"); + orc_program_add_temporary (p, 4, "t4"); + + orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, + ORC_VAR_D1); + orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, + ORC_VAR_D1); + orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, + ORC_VAR_D1); + orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* cogorc_putline_YVYU */ +#ifdef DISABLE_ORC +void +cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + int n) +{ + int i; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union64 *ORC_RESTRICT ptr4; + orc_union64 var37; + orc_union32 var38; + orc_union32 var39; + orc_union32 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + + ptr0 = (orc_union32 *) d1; + ptr4 = (orc_union64 *) s1; + + + for (i = 0; i < n; i++) { + /* 0: loadq */ + var37 = ptr4[i]; + /* 1: splitlw */ + { + orc_union32 _src; + _src.i = var37.x2[0]; + var39.x2[0] = _src.x2[1]; + var40.x2[0] = _src.x2[0]; + } + { + orc_union32 _src; + _src.i = var37.x2[1]; + var39.x2[1] = _src.x2[1]; + var40.x2[1] = _src.x2[0]; + } + /* 2: splitlw */ + { + orc_union32 _src; + _src.i = var39.i; + var41.i = _src.x2[1]; + var42.i = _src.x2[0]; + } + /* 3: avgub */ + var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; + var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; + /* 4: select1wb */ + { + orc_union16 _src; + _src.i = var40.x2[0]; + var44.x2[0] = _src.x2[1]; + } + { + orc_union16 _src; + _src.i = var40.x2[1]; + var44.x2[1] = _src.x2[1]; + } + /* 5: swapw */ + var45.i = ORC_SWAP_W (var43.i); + /* 6: mergebw */ + { + orc_union16 _dest; + _dest.x2[0] = var44.x2[0]; + _dest.x2[1] = var45.x2[0]; + var38.x2[0] = _dest.i; + } + { + orc_union16 _dest; + _dest.x2[0] = var44.x2[1]; + _dest.x2[1] = var45.x2[1]; + var38.x2[1] = _dest.i; + } + /* 7: storel */ + ptr0[i] = var38; + } + +} + +#else +static void +_backup_cogorc_putline_YVYU (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union64 *ORC_RESTRICT ptr4; + orc_union64 var37; + orc_union32 var38; + orc_union32 var39; + orc_union32 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + + ptr0 = (orc_union32 *) ex->arrays[0]; + ptr4 = (orc_union64 *) ex->arrays[4]; + + + for (i = 0; i < n; i++) { + /* 0: loadq */ + var37 = ptr4[i]; + /* 1: splitlw */ + { + orc_union32 _src; + _src.i = var37.x2[0]; + var39.x2[0] = _src.x2[1]; + var40.x2[0] = _src.x2[0]; + } + { + orc_union32 _src; + _src.i = var37.x2[1]; + var39.x2[1] = _src.x2[1]; + var40.x2[1] = _src.x2[0]; + } + /* 2: splitlw */ + { + orc_union32 _src; + _src.i = var39.i; + var41.i = _src.x2[1]; + var42.i = _src.x2[0]; + } + /* 3: avgub */ + var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; + var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; + /* 4: select1wb */ + { + orc_union16 _src; + _src.i = var40.x2[0]; + var44.x2[0] = _src.x2[1]; + } + { + orc_union16 _src; + _src.i = var40.x2[1]; + var44.x2[1] = _src.x2[1]; + } + /* 5: swapw */ + var45.i = ORC_SWAP_W (var43.i); + /* 6: mergebw */ + { + orc_union16 _dest; + _dest.x2[0] = var44.x2[0]; + _dest.x2[1] = var45.x2[0]; + var38.x2[0] = _dest.i; + } + { + orc_union16 _dest; + _dest.x2[0] = var44.x2[1]; + _dest.x2[1] = var45.x2[1]; + var38.x2[1] = _dest.i; + } + /* 7: storel */ + ptr0[i] = var38; + } + +} + +void +cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "cogorc_putline_YVYU"); + orc_program_set_backup_function (p, _backup_cogorc_putline_YVYU); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 8, "s1"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 2, "t3"); + orc_program_add_temporary (p, 4, "t4"); + orc_program_add_temporary (p, 4, "t5"); + + orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, + ORC_VAR_D1); + orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, + ORC_VAR_D1, ORC_VAR_D1); + orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + + func = p->code_exec; + func (ex); +} +#endif + + /* cogorc_getline_YUV9 */ #ifdef DISABLE_ORC void diff --git a/gst-libs/gst/video/videoblendorc-dist.h b/gst-libs/gst/video/videoblendorc-dist.h index ce7caab..9f4b1bb 100644 --- a/gst-libs/gst/video/videoblendorc-dist.h +++ b/gst-libs/gst/video/videoblendorc-dist.h @@ -75,6 +75,8 @@ void cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT void cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); +void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); +void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); void cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); void cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); diff --git a/gst-libs/gst/video/videoblendorc.orc b/gst-libs/gst/video/videoblendorc.orc index 2bdae90..7042318 100644 --- a/gst-libs/gst/video/videoblendorc.orc +++ b/gst-libs/gst/video/videoblendorc.orc @@ -160,6 +160,39 @@ mergewl uvuv, uv, uv x2 mergewl ayuv, ayay, uvuv +.function cogorc_getline_YVYU +.dest 8 ayuv guint8 +.source 4 uyvy guint8 +.const 2 c255 0xff +.temp 2 yy +.temp 2 uv +.temp 4 ayay +.temp 4 uvuv + +x2 splitwb uv, yy, uyvy +swapw uv, uv +x2 mergebw ayay, c255, yy +mergewl uvuv, uv, uv +x2 mergewl ayuv, ayay, uvuv + + +.function cogorc_putline_YVYU +.dest 4 yuy2 guint8 +.source 8 ayuv guint8 +.temp 2 yy +.temp 2 uv1 +.temp 2 uv2 +.temp 4 ayay +.temp 4 uvuv + +x2 splitlw uvuv, ayay, ayuv +splitlw uv1, uv2, uvuv +x2 avgub uv1, uv1, uv2 +x2 select1wb yy, ayay +swapw uv1, uv1 +x2 mergebw yuy2, yy, uv1 + + .function cogorc_getline_YUV9 .dest 8 d guint8 .source 2 y guint8 -- 2.7.4