summaryrefslogtreecommitdiffstats
path: root/ext/hermes/yuv2rgb.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/hermes/yuv2rgb.c')
-rw-r--r--ext/hermes/yuv2rgb.c150
1 files changed, 128 insertions, 22 deletions
diff --git a/ext/hermes/yuv2rgb.c b/ext/hermes/yuv2rgb.c
index c89c35d5..55765bf5 100644
--- a/ext/hermes/yuv2rgb.c
+++ b/ext/hermes/yuv2rgb.c
@@ -52,13 +52,20 @@
: Max(-128.0, ((x) * chromaCorrect)))
-static void gst_colorspace_yuv420P_to_rgb16 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
-static void gst_colorspace_yuv420P_to_rgb24 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
-static void gst_colorspace_yuv420P_to_rgb32 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_I420_to_rgb16 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_I420_to_rgb24 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_I420_to_rgb32 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+#ifdef HAVE_LIBMMX
+static void gst_colorspace_I420_to_bgr16_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_I420_to_bgr32_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+#endif
+static void gst_colorspace_YV12_to_rgb16 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_YV12_to_rgb24 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_YV12_to_rgb32 (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
#ifdef HAVE_LIBMMX
-static void gst_colorspace_yuv420P_to_bgr16_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
-static void gst_colorspace_yuv420P_to_bgr32_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_YV12_to_bgr16_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
+static void gst_colorspace_YV12_to_bgr32_mmx (GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
#endif
static void gst_colorspace_yuv_to_rgb16(GstColorSpaceYUVTables *tables,
@@ -120,6 +127,7 @@ gst_colorspace_yuv2rgb_get_converter (GstCaps *from, GstCaps *to)
g_return_val_if_fail (to_space == GST_STR_FOURCC ("RGB "), NULL);
switch(from_space) {
+ case GST_MAKE_FOURCC ('Y','V','1','2'):
case GST_MAKE_FOURCC ('I','4','2','0'):
{
gint red_mask;
@@ -141,27 +149,42 @@ gst_colorspace_yuv2rgb_get_converter (GstCaps *from, GstCaps *to)
switch(to_bpp) {
case 32:
#ifdef HAVE_LIBMMX
- if (red_mask == 0xff0000 && green_mask == 0x00ff00 && red_mask == 0x0000ff &&
+ if (red_mask == 0xff0000 && green_mask == 0x00ff00 && blue_mask == 0x0000ff &&
(gst_cpu_get_flags () & GST_CPU_FLAG_MMX) ) {
- new->convert = gst_colorspace_yuv420P_to_bgr32_mmx;
+ if (from_space == GST_STR_FOURCC ("I420"))
+ new->convert = gst_colorspace_I420_to_bgr32_mmx;
+ else
+ new->convert = gst_colorspace_YV12_to_bgr32_mmx;
}
else
#endif
- new->convert = gst_colorspace_yuv420P_to_rgb32;
+ if (from_space == GST_STR_FOURCC ("I420"))
+ new->convert = gst_colorspace_I420_to_rgb32;
+ else
+ new->convert = gst_colorspace_YV12_to_rgb32;
break;
case 24:
- new->convert = gst_colorspace_yuv420P_to_rgb24;
+ if (from_space == GST_STR_FOURCC ("I420"))
+ new->convert = gst_colorspace_I420_to_rgb24;
+ else
+ new->convert = gst_colorspace_YV12_to_rgb24;
break;
case 15:
case 16:
#ifdef HAVE_LIBMMX
if (red_mask == 0xf800 && green_mask == 0x07e0 && blue_mask == 0x001f &&
(gst_cpu_get_flags () & GST_CPU_FLAG_MMX) ) {
- new->convert = gst_colorspace_yuv420P_to_bgr16_mmx;
+ if (from_space == GST_STR_FOURCC ("I420"))
+ new->convert = gst_colorspace_I420_to_bgr16_mmx;
+ else
+ new->convert = gst_colorspace_YV12_to_bgr16_mmx;
}
else
#endif
- new->convert = gst_colorspace_yuv420P_to_rgb16;
+ if (from_space == GST_STR_FOURCC ("I420"))
+ new->convert = gst_colorspace_I420_to_rgb16;
+ else
+ new->convert = gst_colorspace_YV12_to_rgb16;
break;
default:
g_print("gst_colorspace_yuv2rgb not implemented\n");
@@ -178,10 +201,10 @@ gst_colorspace_yuv2rgb_get_converter (GstCaps *from, GstCaps *to)
return new;
}
-static void gst_colorspace_yuv420P_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
+static void gst_colorspace_I420_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
{
int size;
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb32");
+ GST_DEBUG (0,"gst_colorspace_I420_to_rgb32");
size = space->width * space->height;
@@ -195,9 +218,9 @@ static void gst_colorspace_yuv420P_to_rgb32(GstColorSpaceConverter *space, unsig
}
-static void gst_colorspace_yuv420P_to_rgb24(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+static void gst_colorspace_I420_to_rgb24(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
int size;
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb24");
+ GST_DEBUG (0,"gst_colorspace_I420_to_rgb24");
size = space->width * space->height;
@@ -211,9 +234,9 @@ static void gst_colorspace_yuv420P_to_rgb24(GstColorSpaceConverter *space, unsig
}
-static void gst_colorspace_yuv420P_to_rgb16(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+static void gst_colorspace_I420_to_rgb16(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
int size;
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb16");
+ GST_DEBUG (0,"gst_colorspace_I420_to_rgb16");
size = space->width * space->height;
@@ -228,9 +251,9 @@ static void gst_colorspace_yuv420P_to_rgb16(GstColorSpaceConverter *space, unsig
}
#ifdef HAVE_LIBMMX
-static void gst_colorspace_yuv420P_to_bgr32_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+static void gst_colorspace_I420_to_bgr32_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
int size;
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb32_mmx");
+ GST_DEBUG (0,"gst_colorspace_I420_to_rgb32_mmx");
size = space->width * space->height;
@@ -243,9 +266,9 @@ static void gst_colorspace_yuv420P_to_bgr32_mmx(GstColorSpaceConverter *space, u
space->width);
}
-static void gst_colorspace_yuv420P_to_bgr16_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+static void gst_colorspace_I420_to_bgr16_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
int size;
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_bgr16_mmx ");
+ GST_DEBUG (0,"gst_colorspace_I420_to_bgr16_mmx ");
size = space->width * space->height;
@@ -256,11 +279,94 @@ static void gst_colorspace_yuv420P_to_bgr16_mmx(GstColorSpaceConverter *space, u
dest,
space->height,
space->width);
- GST_DEBUG (0,"gst_colorspace_yuv420P_to_bgr16_mmx done");
+ GST_DEBUG (0,"gst_colorspace_I420_to_bgr16_mmx done");
}
#endif
+
+static void gst_colorspace_YV12_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
+{
+ int size;
+ GST_DEBUG (0,"gst_colorspace_YV12_to_rgb32");
+
+ size = space->width * space->height;
+
+ gst_colorspace_yuv_to_rgb32(space->color_tables,
+ src, /* Y component */
+ src+size+(size>>2), /* cb component */
+ src+size, /* cr component */
+ dest,
+ space->height,
+ space->width);
+
+}
+
+static void gst_colorspace_YV12_to_rgb24(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+ int size;
+ GST_DEBUG (0,"gst_colorspace_YV12_to_rgb24");
+
+ size = space->width * space->height;
+
+ gst_colorspace_yuv_to_rgb24(space->color_tables,
+ src, /* Y component */
+ src+size+(size>>2), /* cb component */
+ src+size, /* cr component */
+ dest,
+ space->height,
+ space->width);
+
+}
+
+static void gst_colorspace_YV12_to_rgb16(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+ int size;
+ GST_DEBUG (0,"gst_colorspace_YV12_to_rgb16");
+
+ size = space->width * space->height;
+
+ gst_colorspace_yuv_to_rgb16(space->color_tables,
+ src, /* Y component */
+ src+size+(size>>2), /* cb component */
+ src+size, /* cr component */
+ dest,
+ space->height,
+ space->width);
+
+}
+
+#ifdef HAVE_LIBMMX
+static void gst_colorspace_YV12_to_bgr32_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+ int size;
+ GST_DEBUG (0,"gst_colorspace_YV12_to_rgb32_mmx");
+
+ size = space->width * space->height;
+
+ gst_colorspace_yuv_to_bgr32_mmx(NULL,
+ src, /* Y component */
+ src+size+(size>>2), /* cb component */
+ src+size, /* cr component */
+ dest,
+ space->height,
+ space->width);
+
+}
+static void gst_colorspace_YV12_to_bgr16_mmx(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) {
+ int size;
+ GST_DEBUG (0,"gst_colorspace_YV12_to_bgr16_mmx ");
+
+ size = space->width * space->height;
+
+ gst_colorspace_yuv_to_bgr16_mmx(NULL,
+ src, /* Y component */
+ src+size+(size>>2), /* cb component */
+ src+size, /* cr component */
+ dest,
+ space->height,
+ space->width);
+ GST_DEBUG (0,"gst_colorspace_YV12_to_bgr16_mmx done");
+
+}
+#endif
/*
* How many 1 bits are there in the longword.
* Low performance, do not call often.