Add some more convertors (for YV12). this is getting silly...

Original commit message from CVS:
Add some more convertors (for YV12). this is getting silly...
This commit is contained in:
Wim Taymans 2002-07-11 13:31:04 +00:00
parent 69650ae8f9
commit 69287d0558

View file

@ -52,13 +52,20 @@
: Max(-128.0, ((x) * chromaCorrect))) : Max(-128.0, ((x) * chromaCorrect)))
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);
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);
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);
#ifdef HAVE_LIBMMX #ifdef HAVE_LIBMMX
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);
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);
#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_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 #endif
static void gst_colorspace_yuv_to_rgb16(GstColorSpaceYUVTables *tables, 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); g_return_val_if_fail (to_space == GST_STR_FOURCC ("RGB "), NULL);
switch(from_space) { switch(from_space) {
case GST_MAKE_FOURCC ('Y','V','1','2'):
case GST_MAKE_FOURCC ('I','4','2','0'): case GST_MAKE_FOURCC ('I','4','2','0'):
{ {
gint red_mask; gint red_mask;
@ -141,27 +149,42 @@ gst_colorspace_yuv2rgb_get_converter (GstCaps *from, GstCaps *to)
switch(to_bpp) { switch(to_bpp) {
case 32: case 32:
#ifdef HAVE_LIBMMX #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) ) { (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 else
#endif #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; break;
case 24: 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; break;
case 15: case 15:
case 16: case 16:
#ifdef HAVE_LIBMMX #ifdef HAVE_LIBMMX
if (red_mask == 0xf800 && green_mask == 0x07e0 && blue_mask == 0x001f && if (red_mask == 0xf800 && green_mask == 0x07e0 && blue_mask == 0x001f &&
(gst_cpu_get_flags () & GST_CPU_FLAG_MMX) ) { (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 else
#endif #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; break;
default: default:
g_print("gst_colorspace_yuv2rgb not implemented\n"); g_print("gst_colorspace_yuv2rgb not implemented\n");
@ -178,10 +201,10 @@ gst_colorspace_yuv2rgb_get_converter (GstCaps *from, GstCaps *to)
return new; 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; int size;
GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb32"); GST_DEBUG (0,"gst_colorspace_I420_to_rgb32");
size = space->width * space->height; 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; int size;
GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb24"); GST_DEBUG (0,"gst_colorspace_I420_to_rgb24");
size = space->width * space->height; 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; int size;
GST_DEBUG (0,"gst_colorspace_yuv420P_to_rgb16"); GST_DEBUG (0,"gst_colorspace_I420_to_rgb16");
size = space->width * space->height; size = space->width * space->height;
@ -228,9 +251,9 @@ static void gst_colorspace_yuv420P_to_rgb16(GstColorSpaceConverter *space, unsig
} }
#ifdef HAVE_LIBMMX #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; 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; size = space->width * space->height;
@ -243,9 +266,9 @@ static void gst_colorspace_yuv420P_to_bgr32_mmx(GstColorSpaceConverter *space, u
space->width); 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; 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; size = space->width * space->height;
@ -256,11 +279,94 @@ static void gst_colorspace_yuv420P_to_bgr16_mmx(GstColorSpaceConverter *space, u
dest, dest,
space->height, space->height,
space->width); space->width);
GST_DEBUG (0,"gst_colorspace_yuv420P_to_bgr16_mmx done"); GST_DEBUG (0,"gst_colorspace_I420_to_bgr16_mmx done");
} }
#endif #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. * How many 1 bits are there in the longword.
* Low performance, do not call often. * Low performance, do not call often.