From 00494ba94f3d3feefad386b7abe56cc7d98b9950 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Tue, 22 Apr 2003 07:39:34 +0000 Subject: [PATCH] Add 16 and 15-bit RGB formats Original commit message from CVS: Add 16 and 15-bit RGB formats --- gst/videoscale/videoscale.c | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/gst/videoscale/videoscale.c b/gst/videoscale/videoscale.c index db9ad4c1ea..4bec5edc10 100644 --- a/gst/videoscale/videoscale.c +++ b/gst/videoscale/videoscale.c @@ -51,6 +51,7 @@ static void gst_videoscale_packed422 (GstVideoscale *scale, unsigned char *dest, static void gst_videoscale_packed422rev (GstVideoscale *scale, unsigned char *dest, unsigned char *src); static void gst_videoscale_32bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src); static void gst_videoscale_24bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src); +static void gst_videoscale_16bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src); static void gst_videoscale_scale_nearest_str2 (GstVideoscale *scale, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); @@ -60,6 +61,8 @@ static void gst_videoscale_scale_nearest_32bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); static void gst_videoscale_scale_nearest_24bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); +static void gst_videoscale_scale_nearest_16bit (GstVideoscale *scale, + unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); struct videoscale_format_struct videoscale_formats[] = { /* packed */ @@ -81,6 +84,8 @@ struct videoscale_format_struct videoscale_formats[] = { { "RGB ", 32, gst_videoscale_32bit, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 }, { "RGB ", 24, gst_videoscale_24bit, 24, G_BIG_ENDIAN, 0xff0000, 0x00ff00, 0x0000ff }, { "RGB ", 24, gst_videoscale_24bit, 24, G_BIG_ENDIAN, 0x0000ff, 0x00ff00, 0xff0000 }, + { "RGB ", 16, gst_videoscale_16bit, 16, G_BYTE_ORDER, 0xf800, 0x07e0, 0x001f }, + { "RGB ", 16, gst_videoscale_16bit, 15, G_BYTE_ORDER, 0x7c00, 0x03e0, 0x001f }, }; int videoscale_n_formats = sizeof(videoscale_formats)/sizeof(videoscale_formats[0]); @@ -298,6 +303,20 @@ gst_videoscale_24bit (GstVideoscale *scale, unsigned char *dest, unsigned char * } +static void +gst_videoscale_16bit (GstVideoscale *scale, unsigned char *dest, unsigned char *src) +{ + int sw = scale->from_width; + int sh = scale->from_height; + int dw = scale->to_width; + int dh = scale->to_height; + + GST_DEBUG (0,"videoscale: scaling 16bit %dx%d to %dx%d", sw, sh, dw, dh); + + gst_videoscale_scale_nearest_16bit(scale, dest, src, sw, sh, dw, dh); + +} + #define RC(x,y) *(src+(int)(x)+(int)((y)*sw)) static unsigned char @@ -671,3 +690,49 @@ gst_videoscale_scale_nearest_24bit (GstVideoscale *scale, } } +static void +gst_videoscale_scale_nearest_16bit (GstVideoscale *scale, + unsigned char *dest, + unsigned char *src, + int sw, int sh, int dw, int dh) +{ + int ypos, yinc, y; + int xpos, xinc, x; + guchar *destp = dest; + guchar *srcp = src; + + GST_DEBUG (0, "videoscale: scaling nearest %p %p %d", src, dest, dw); + + + ypos = 0x10000; + yinc = (sh<<16)/dh; + xinc = (sw<<16)/dw; + + for (y = dh; y; y--) { + + while (ypos >0x10000) { + ypos-=0x10000; + src += sw*2; + } + + xpos = 0x10000; + + srcp = src; + destp = dest; + + for ( x=dw; x; x-- ) { + while ( xpos >= 0x10000L ) { + srcp+=2; + xpos -= 0x10000L; + } + destp[0] = srcp[0]; + destp[1] = srcp[1]; + destp+=2; + xpos += xinc; + } + dest += dw*2; + + ypos += yinc; + } +} +