From: David S. <dsc...@us...> - 2002-07-26 22:19:10
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Fri Jul 26 2002 15:19:09 PDT Log message: New plugin for generating a test video stream Added files: gst/videotestsrc: Makefile.am gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== --- NEW FILE: Makefile.am --- plugindir = $(libdir)/gst plugin_LTLIBRARIES = libgstvideotestsrc.la libgstvideotestsrc_la_SOURCES = \ gstvideotestsrc.c libgstvideotestsrc_la_CFLAGS = -O2 $(FOMIT_FRAME_POINTER) -funroll-all-loops -finline-functions -ffast-math $(GST_CFLAGS) libgstvideotestsrc_la_LIBADD = libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = gstvideotestsrc.h --- NEW FILE: gstvideotestsrc.c --- /* GStreamer * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /*#define DEBUG_ENABLED */ #include <gstvideotestsrc.h> #include <stdlib.h> /* elementfactory information */ static GstElementDetails videotestsrc_details = { "Video test source", "Source/Video", "Creates a test video stream", VERSION, "David A. Schleef <ds...@sc...>", "(C) 2002", }; /* GstVideotestsrc signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_WIDTH, ARG_HEIGHT, ARG_METHOD, /* FILL ME */ }; GST_PAD_TEMPLATE_FACTORY (src_templ, "src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_CAPS_NEW ( "videotestsrc_caps", "video/raw", "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), "width", GST_PROPS_INT(640), "height", GST_PROPS_INT(480) ) ) #define GST_TYPE_VIDEOTESTSRC_METHOD (gst_videotestsrc_method_get_type()) static GType gst_videotestsrc_method_get_type (void) { static GType videotestsrc_method_type = 0; static GEnumValue videotestsrc_methods[] = { { GST_VIDEOTESTSRC_POINT_SAMPLE, "0", "Point Sample" }, { GST_VIDEOTESTSRC_NEAREST, "1", "Nearest" }, { GST_VIDEOTESTSRC_BILINEAR, "2", "Bilinear" }, { GST_VIDEOTESTSRC_BICUBIC, "3", "Bicubic" }, { 0, NULL, NULL }, }; if (!videotestsrc_method_type) { videotestsrc_method_type = g_enum_register_static ("GstVideotestsrcMethod", videotestsrc_methods); } return videotestsrc_method_type; } static void gst_videotestsrc_class_init (GstVideotestsrcClass *klass); static void gst_videotestsrc_init (GstVideotestsrc *videotestsrc); static void gst_videotestsrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_videotestsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static GstBuffer * gst_videotestsrc_get (GstPad *pad); static GstElementClass *parent_class = NULL; void gst_videotestsrc_setup (GstVideotestsrc *v); static void random_chars(unsigned char *dest, int nbytes); static void gst_videotestsrc_random_yuv (GstVideotestsrc *v, unsigned char *dest, int w, int h); GType gst_videotestsrc_get_type (void) { static GType videotestsrc_type = 0; if (!videotestsrc_type) { static const GTypeInfo videotestsrc_info = { sizeof(GstVideotestsrcClass), NULL, NULL, (GClassInitFunc)gst_videotestsrc_class_init, NULL, NULL, sizeof(GstVideotestsrc), 0, (GInstanceInitFunc)gst_videotestsrc_init, }; videotestsrc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVideotestsrc", &videotestsrc_info, 0); } return videotestsrc_type; } static void gst_videotestsrc_class_init (GstVideotestsrcClass *klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass*)klass; gstelement_class = (GstElementClass*)klass; g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_WIDTH, g_param_spec_int("width","width","width", G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HEIGHT, g_param_spec_int("height","height","height", G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_METHOD, g_param_spec_enum("method","method","method", GST_TYPE_VIDEOTESTSRC_METHOD,0,G_PARAM_READWRITE)); /* CHECKME! */ parent_class = g_type_class_ref(GST_TYPE_ELEMENT); gobject_class->set_property = gst_videotestsrc_set_property; gobject_class->get_property = gst_videotestsrc_get_property; } static GstPadConnectReturn gst_videotestsrc_srcconnect (GstPad *pad, GstCaps *caps) { GstVideotestsrc *videotestsrc; GST_DEBUG(0,"gst_videotestsrc_srcconnect"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); #if 0 if (!GST_CAPS_IS_FIXED (caps)) { return GST_PAD_CONNECT_DELAYED; } #endif gst_caps_get_fourcc_int (caps, "format", &videotestsrc->format); gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "height", &videotestsrc->height); gst_videotestsrc_setup(videotestsrc); GST_DEBUG (0,"size %d x %d",videotestsrc->width, videotestsrc->height); return GST_PAD_CONNECT_OK; } static void gst_videotestsrc_init (GstVideotestsrc *videotestsrc) { GST_DEBUG(0,"gst_videotestsrc_init"); /*gst_pad_set_negotiate_function(videotestsrc->sinkpad,videotestsrc_negotiate_sink); */ //gst_element_add_pad(GST_ELEMENT(videotestsrc),videotestsrc->sinkpad); //gst_pad_set_chain_function(videotestsrc->sinkpad,gst_videotestsrc_chain); videotestsrc->srcpad = gst_pad_new_from_template ( GST_PAD_TEMPLATE_GET (src_templ), "src"); /*gst_pad_set_negotiate_function(videotestsrc->srcpad,videotestsrc_negotiate_src); */ gst_element_add_pad(GST_ELEMENT(videotestsrc),videotestsrc->srcpad); gst_pad_set_get_function(videotestsrc->srcpad,gst_videotestsrc_get); gst_pad_set_connect_function(videotestsrc->srcpad,gst_videotestsrc_srcconnect); videotestsrc->width = 640; videotestsrc->height = 480; } static GstBuffer * gst_videotestsrc_get (GstPad *pad) { GstVideotestsrc *videotestsrc; gulong newsize; GstBuffer *buf; GST_DEBUG (0,"gst_videotestsrc_get"); g_return_val_if_fail (pad != NULL, NULL); g_return_val_if_fail (GST_IS_PAD (pad), NULL); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); newsize = videotestsrc->width*videotestsrc->height + videotestsrc->width*videotestsrc->height/2; GST_DEBUG(0,"size=%ld %dx%d",newsize, videotestsrc->width, videotestsrc->height); buf = gst_buffer_new(); /* XXX this is wrong for anything but I420 */ GST_BUFFER_SIZE(buf) = newsize; GST_BUFFER_DATA(buf) = g_malloc (newsize); g_return_val_if_fail(GST_BUFFER_DATA(buf) != NULL, NULL); //GST_BUFFER_TIMESTAMP(buf) = GST_BUFFER_TIMESTAMP(buf); gst_videotestsrc_random_yuv(videotestsrc, (void *)GST_BUFFER_DATA(buf), videotestsrc->width, videotestsrc->height); return buf; } static void gst_videotestsrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GstVideotestsrc *src; /* it's not null if we got it, but it might not be ours */ g_return_if_fail(GST_IS_VIDEOTESTSRC(object)); src = GST_VIDEOTESTSRC(object); GST_DEBUG(0,"gst_videotestsrc_set_property"); switch (prop_id) { case ARG_WIDTH: src->width = g_value_get_int (value); break; case ARG_HEIGHT: src->height = g_value_get_int (value); break; case ARG_METHOD: src->method = g_value_get_enum (value); break; default: break; } } static void gst_videotestsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GstVideotestsrc *src; /* it's not null if we got it, but it might not be ours */ g_return_if_fail(GST_IS_VIDEOTESTSRC(object)); src = GST_VIDEOTESTSRC(object); switch (prop_id) { case ARG_WIDTH: g_value_set_int (value, src->width); break; case ARG_HEIGHT: g_value_set_int (value, src->height); break; case ARG_METHOD: g_value_set_enum (value, src->method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean plugin_init (GModule *module, GstPlugin *plugin) { GstElementFactory *factory; /* create an elementfactory for the videotestsrc element */ factory = gst_element_factory_new("videotestsrc",GST_TYPE_VIDEOTESTSRC, &videotestsrc_details); g_return_val_if_fail(factory != NULL, FALSE); gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_templ)); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); return TRUE; } GstPluginDesc plugin_desc = { GST_VERSION_MAJOR, GST_VERSION_MINOR, "videotestsrc", plugin_init }; /* Non-GST specific stuff */ void gst_videotestsrc_setup (GstVideotestsrc *v) { } static void random_chars(unsigned char *dest, int nbytes) { int i; for(i=0;i<nbytes;i++){ dest[i] = random(); } } static int u_colors[] = { 128, 0, 192, 0, 255, 64, 255 }; static int v_colors[] = { 128, 192, 0, 0, 255, 255, 64 }; static void gst_videotestsrc_random_yuv (GstVideotestsrc *v, unsigned char *dest, int w, int h) { unsigned char *up = dest + w*h; unsigned char *vp = up + w*h/4; int w7; int i,j; memset(dest,255,w*h/2); random_chars(dest + w*h/2,w*h/2); //random_chars(dest + w*h, w*h/4); memset(dest + w*h, 128, w*h/4); //random_chars(dest + w*h + w*h/4, w*h/4); memset(dest + w*h + w*h/4, 128, w*h/4); w7 = w/2/7 + 1; for(i=0;i<7;i++){ for(j=0;j<w7;j++){ up[i*w7 + j] = u_colors[i]; vp[i*w7 + j] = v_colors[i]; } } for(i=0;i<h/4;i++){ memcpy(up+(w/2)*i, up, w/2); memcpy(vp+(w/2)*i, vp, w/2); } } --- NEW FILE: gstvideotestsrc.h --- /* GStreamer * Copyright (C) <2002> David A. Schleef <ds...@sc...> * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_VIDEOTESTSRC_H__ #define __GST_VIDEOTESTSRC_H__ #include <config.h> #include <gst/gst.h> #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GST_TYPE_VIDEOTESTSRC \ (gst_videotestsrc_get_type()) #define GST_VIDEOTESTSRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEOTESTSRC,GstVideotestsrc)) #define GST_VIDEOTESTSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEOTESTSRC,GstVideotestsrc)) #define GST_IS_VIDEOTESTSRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOTESTSRC)) #define GST_IS_VIDEOTESTSRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOTESTSRC)) typedef enum { GST_VIDEOTESTSRC_POINT_SAMPLE, GST_VIDEOTESTSRC_NEAREST, GST_VIDEOTESTSRC_BILINEAR, GST_VIDEOTESTSRC_BICUBIC } GstVideoTestSrcMethod; typedef struct _GstVideotestsrc GstVideotestsrc; typedef struct _GstVideotestsrcClass GstVideotestsrcClass; struct _GstVideotestsrc { GstElement element; GstPad *sinkpad,*srcpad; /* video state */ guint32 format; gint width; gint height; GstVideoTestSrcMethod method; /* private */ guchar *temp; }; struct _GstVideotestsrcClass { GstElementClass parent_class; }; GType gst_videotestsrc_get_type(void); void gst_videotestsrc_setup(GstVideotestsrc *); #define gst_videotestsrc_scale(scale, src, dest) (scale)->scale_cc((scale), (src), (dest)) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GST_VIDEOTESTSRC_H__ */ |
From: David S. <dsc...@us...> - 2002-07-28 04:23:24
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sat Jul 27 2002 21:23:19 PDT Log message: Added reasonable values for primaries in YUV space. Added second reverse blue pattern. Added a crummy but very fast RNG to replace calls to random(). Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstvideotestsrc.c 26 Jul 2002 22:18:57 -0000 1.1 +++ gstvideotestsrc.c 28 Jul 2002 04:23:07 -0000 1.2 @@ -306,29 +306,61 @@ } - static void random_chars(unsigned char *dest, int nbytes) { int i; + static unsigned int state; for(i=0;i<nbytes;i++){ - dest[i] = random(); + state *= 1103515245; + state += 12345; + dest[i] = (state>>16); } } -static int u_colors[] = { 128, 0, 192, 0, 255, 64, 255 }; -static int v_colors[] = { 128, 192, 0, 0, 255, 255, 64 }; +static void +paint_rect_random (unsigned char *dest, int stride, int x, int y, int w, int h) +{ + unsigned char *d = dest + stride*y + x; + int i; + + for(i=0;i<h;i++){ + random_chars(d,w); + d += stride; + } +} + +static void +paint_rect (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char color) +{ + unsigned char *d = dest + stride*y + x; + int i; + + for(i=0;i<h;i++){ + memset(d,color,w); + d += stride; + } +} + +/* wht yel cya grn mag red blu blk -I Q */ +static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 0, 0, 0 }; +static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; +static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; static void gst_videotestsrc_random_yuv (GstVideotestsrc *v, unsigned char *dest, int w, int h) { + unsigned char *yp = dest; unsigned char *up = dest + w*h; unsigned char *vp = up + w*h/4; - int w7; - int i,j; + //int h24 = h/24; + //int j,k; + int i; + int y1,y2; - memset(dest,255,w*h/2); +#if 0 + //memset(dest,255,w*h/2); random_chars(dest + w*h/2,w*h/2); //random_chars(dest + w*h, w*h/4); @@ -336,17 +368,56 @@ //random_chars(dest + w*h + w*h/4, w*h/4); memset(dest + w*h + w*h/4, 128, w*h/4); +#endif - w7 = w/2/7 + 1; + y1 = h/3; + y2 = h*0.375; + + /* color bars */ for(i=0;i<7;i++){ - for(j=0;j<w7;j++){ - up[i*w7 + j] = u_colors[i]; - vp[i*w7 + j] = v_colors[i]; + int x1 = i*(w/2)/7; + int x2 = (i+1)*(w/2)/7; + paint_rect(yp, w, x1*2, 0, (x2-x1)*2, y1*2, y_colors[i]); + paint_rect(up, w/2, x1, 0, x2-x1, y1, u_colors[i]); + paint_rect(vp, w/2, x1, 0, x2-x1, y1, v_colors[i]); + } + + /* inverse blue bars */ + for(i=0;i<7;i++){ + int x1 = i*(w/2)/7; + int x2 = (i+1)*(w/2)/7; + int k; + if(i&1){ + k = 7; + }else{ + k = 6-i; } + paint_rect(yp, w, x1*2, y1*2, (x2-x1)*2, (y2-y1)*2, y_colors[k]); + paint_rect(up, w/2, x1, y1, x2-x1, y2-y1, u_colors[k]); + paint_rect(vp, w/2, x1, y1, x2-x1, y2-y1, v_colors[k]); } - for(i=0;i<h/4;i++){ - memcpy(up+(w/2)*i, up, w/2); - memcpy(vp+(w/2)*i, vp, w/2); + + /* -I, white, Q regions */ + for(i=0;i<3;i++){ + int x1 = i*(w/2)/6; + int x2 = (i+1)*(w/2)/6; + int k; + + if(i==0){ k = 8; } + else if(i==1){ k = 0; } + else k = 9; + + paint_rect(yp, w, x1*2, y2*2, (x2-x1)*2, h-y2*2, y_colors[k]); + paint_rect(up, w/2, x1, y2, x2-x1, h/2-y2, u_colors[k]); + paint_rect(vp, w/2, x1, y2, x2-x1, h/2-y2, v_colors[k]); + } + + { + int x1 = 3*(w/2)/6; + int x2 = w/2; + paint_rect_random(yp, w, x1*2, y2*2, (x2-x1)*2, h-y2*2); + paint_rect(up, w/2, x1, y2, x2-x1, h/2-y2, u_colors[0]); + paint_rect(vp, w/2, x1, y2, x2-x1, h/2-y2, v_colors[0]); } } |
From: David S. <dsc...@us...> - 2002-07-30 01:25:39
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Mon Jul 29 2002 18:25:38 PDT Log message: Add timestamping Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.3&r2=1.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstvideotestsrc.c 28 Jul 2002 13:40:53 -0000 1.3 +++ gstvideotestsrc.c 30 Jul 2002 01:25:26 -0000 1.4 @@ -186,6 +186,9 @@ videotestsrc->width = 640; videotestsrc->height = 480; + + videotestsrc->timestamp = 0; + videotestsrc->interval = GST_SECOND/30; } @@ -214,7 +217,9 @@ GST_BUFFER_SIZE(buf) = newsize; GST_BUFFER_DATA(buf) = g_malloc (newsize); g_return_val_if_fail(GST_BUFFER_DATA(buf) != NULL, NULL); - //GST_BUFFER_TIMESTAMP(buf) = GST_BUFFER_TIMESTAMP(buf); + + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP(buf) = videotestsrc->timestamp; gst_videotestsrc_random_yuv(videotestsrc, (void *)GST_BUFFER_DATA(buf), videotestsrc->width, videotestsrc->height); @@ -345,7 +350,7 @@ } /* wht yel cya grn mag red blu blk -I Q */ -static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 0, 0, 0 }; +static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstvideotestsrc.h 26 Jul 2002 22:18:57 -0000 1.1 +++ gstvideotestsrc.h 30 Jul 2002 01:25:26 -0000 1.2 @@ -65,6 +65,9 @@ GstVideoTestSrcMethod method; /* private */ + gint64 timestamp; + gint64 interval; + guchar *temp; }; |
From: David S. <dsc...@us...> - 2002-07-30 07:17:49
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Jul 30 2002 00:17:49 PDT Log message: Will now negotiate I420, YV12, and RGB Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.4&r2=1.5 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstvideotestsrc.c 30 Jul 2002 01:25:26 -0000 1.4 +++ gstvideotestsrc.c 30 Jul 2002 07:17:37 -0000 1.5 @@ -57,7 +57,11 @@ GST_CAPS_NEW ( "videotestsrc_caps", "video/raw", - "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), + "format", GST_PROPS_LIST( + GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), + GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')), + GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R','G','B',' ')) + ), "width", GST_PROPS_INT(640), "height", GST_PROPS_INT(480) ) @@ -93,7 +97,9 @@ void gst_videotestsrc_setup (GstVideotestsrc *v); static void random_chars(unsigned char *dest, int nbytes); -static void gst_videotestsrc_random_yuv (GstVideotestsrc *v, unsigned char *dest, int w, int h); +void gst_videotestsrc_smpte_I420 (GstVideotestsrc *v, unsigned char *dest, int w, int h); +void gst_videotestsrc_smpte_YV12 (GstVideotestsrc *v, unsigned char *dest, int w, int h); +void gst_videotestsrc_smpte_RGB (GstVideotestsrc *v, unsigned char *dest, int w, int h); GType @@ -161,7 +167,28 @@ gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "height", &videotestsrc->height); - gst_videotestsrc_setup(videotestsrc); + GST_DEBUG (0,"format is 0x%08x\n",videotestsrc->format); + + switch(videotestsrc->format){ + case GST_MAKE_FOURCC('R','G','B',' '): + videotestsrc->make_image = gst_videotestsrc_smpte_RGB; + videotestsrc->bpp = 16; + break; + case GST_MAKE_FOURCC('I','4','2','0'): + videotestsrc->make_image = gst_videotestsrc_smpte_I420; + videotestsrc->bpp = 12; + break; + case GST_MAKE_FOURCC('Y','U','Y','V'): + //videotestsrc->make_image = gst_videotestsrc_smpte_YUYV; + return GST_PAD_CONNECT_REFUSED; + break; + case GST_MAKE_FOURCC('Y','V','1','2'): + videotestsrc->make_image = gst_videotestsrc_smpte_YV12; + videotestsrc->bpp = 12; + break; + default: + return GST_PAD_CONNECT_REFUSED; + } GST_DEBUG (0,"size %d x %d",videotestsrc->width, videotestsrc->height); @@ -184,6 +211,14 @@ gst_pad_set_get_function(videotestsrc->srcpad,gst_videotestsrc_get); gst_pad_set_connect_function(videotestsrc->srcpad,gst_videotestsrc_srcconnect); +#if 0 + "bpp", GST_PROPS_INT(16), + "depth", GST_PROPS_INT(16), + "endianness", GST_PROPS_INT(1234), + "red_mask", GST_PROPS_INT(63488), + "green_mask", GST_PROPS_INT(2016), + "blue_mask", GST_PROPS_INT(31), +#endif videotestsrc->width = 640; videotestsrc->height = 480; @@ -206,14 +241,18 @@ videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); +#if 0 + /* XXX this is wrong for anything but I420 */ newsize = videotestsrc->width*videotestsrc->height + videotestsrc->width*videotestsrc->height/2; +#endif + /* XXX this is wrong for anything but RGB16 */ + newsize = (videotestsrc->width*videotestsrc->height*videotestsrc->bpp)>>3; GST_DEBUG(0,"size=%ld %dx%d",newsize, videotestsrc->width, videotestsrc->height); buf = gst_buffer_new(); - /* XXX this is wrong for anything but I420 */ GST_BUFFER_SIZE(buf) = newsize; GST_BUFFER_DATA(buf) = g_malloc (newsize); g_return_val_if_fail(GST_BUFFER_DATA(buf) != NULL, NULL); @@ -221,7 +260,7 @@ videotestsrc->timestamp += videotestsrc->interval; GST_BUFFER_TIMESTAMP(buf) = videotestsrc->timestamp; - gst_videotestsrc_random_yuv(videotestsrc, (void *)GST_BUFFER_DATA(buf), + videotestsrc->make_image(videotestsrc, (void *)GST_BUFFER_DATA(buf), videotestsrc->width, videotestsrc->height); return buf; @@ -349,32 +388,118 @@ } } +static void +paint_rect2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) +{ + unsigned char *d = dest + stride*y + x*2; + unsigned char *dp; + int i,j; + + for(i=0;i<h;i++){ + dp = d; + for(j=0;j<w;j++){ + *dp++ = col[0]; + *dp++ = col[1]; + } + d += stride; + } +} +static void +paint_rect3 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) +{ + unsigned char *d = dest + stride*y + x*3; + unsigned char *dp; + int i,j; + + for(i=0;i<h;i++){ + dp = d; + for(j=0;j<w;j++){ + *dp++ = col[0]; + *dp++ = col[1]; + *dp++ = col[2]; + } + d += stride; + } +} + /* wht yel cya grn mag red blu blk -I Q */ static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; -static void -gst_videotestsrc_random_yuv (GstVideotestsrc *v, unsigned char *dest, int w, int h) +void +gst_videotestsrc_smpte_I420 (GstVideotestsrc *v, unsigned char *dest, int w, int h) { unsigned char *yp = dest; unsigned char *up = dest + w*h; - unsigned char *vp = up + w*h/4; + unsigned char *vp = dest + w*h + w*h/4; //int h24 = h/24; //int j,k; int i; int y1,y2; -#if 0 - //memset(dest,255,w*h/2); - random_chars(dest + w*h/2,w*h/2); + y1 = h/3; + y2 = h*0.375; - //random_chars(dest + w*h, w*h/4); - memset(dest + w*h, 128, w*h/4); - - //random_chars(dest + w*h + w*h/4, w*h/4); - memset(dest + w*h + w*h/4, 128, w*h/4); -#endif + /* color bars */ + for(i=0;i<7;i++){ + int x1 = i*(w/2)/7; + int x2 = (i+1)*(w/2)/7; + paint_rect(yp, w, x1*2, 0, (x2-x1)*2, y1*2, y_colors[i]); + paint_rect(up, w/2, x1, 0, x2-x1, y1, u_colors[i]); + paint_rect(vp, w/2, x1, 0, x2-x1, y1, v_colors[i]); + } + + /* inverse blue bars */ + for(i=0;i<7;i++){ + int x1 = i*(w/2)/7; + int x2 = (i+1)*(w/2)/7; + int k; + if(i&1){ + k = 7; + }else{ + k = 6-i; + } + paint_rect(yp, w, x1*2, y1*2, (x2-x1)*2, (y2-y1)*2, y_colors[k]); + paint_rect(up, w/2, x1, y1, x2-x1, y2-y1, u_colors[k]); + paint_rect(vp, w/2, x1, y1, x2-x1, y2-y1, v_colors[k]); + } + + /* -I, white, Q regions */ + for(i=0;i<3;i++){ + int x1 = i*(w/2)/6; + int x2 = (i+1)*(w/2)/6; + int k; + + if(i==0){ k = 8; } + else if(i==1){ k = 0; } + else k = 9; + + paint_rect(yp, w, x1*2, y2*2, (x2-x1)*2, h-y2*2, y_colors[k]); + paint_rect(up, w/2, x1, y2, x2-x1, h/2-y2, u_colors[k]); + paint_rect(vp, w/2, x1, y2, x2-x1, h/2-y2, v_colors[k]); + } + + { + int x1 = 3*(w/2)/6; + int x2 = w/2; + paint_rect_random(yp, w, x1*2, y2*2, (x2-x1)*2, h-y2*2); + paint_rect(up, w/2, x1, y2, x2-x1, h/2-y2, u_colors[0]); + paint_rect(vp, w/2, x1, y2, x2-x1, h/2-y2, v_colors[0]); + } +} + +/* same as I420, but with U and V swapped */ +void +gst_videotestsrc_smpte_YV12 (GstVideotestsrc *v, unsigned char *dest, int w, int h) +{ + unsigned char *yp = dest; + unsigned char *up = dest + w*h + w*h/4; + unsigned char *vp = dest + w*h; + //int h24 = h/24; + //int j,k; + int i; + int y1,y2; y1 = h/3; y2 = h*0.375; @@ -424,6 +549,71 @@ paint_rect_random(yp, w, x1*2, y2*2, (x2-x1)*2, h-y2*2); paint_rect(up, w/2, x1, y2, x2-x1, h/2-y2, u_colors[0]); paint_rect(vp, w/2, x1, y2, x2-x1, h/2-y2, v_colors[0]); + } +} + +/* wht yel cya grn mag red blu blk -I Q */ +static int r_colors[] = { 255, 255, 0, 0, 255, 255, 0, 0, 0, 0 }; +static int g_colors[] = { 255, 255, 255, 255, 0, 0, 0, 0, 0, 128 }; +static int b_colors[] = { 255, 0, 255, 0, 255, 0, 255, 0, 128, 255 }; + +void +gst_videotestsrc_smpte_RGB (GstVideotestsrc *v, unsigned char *dest, int w, int h) +{ + int i; + int y1,y2; + + y1 = h*2/3; + y2 = h*0.75; + + /* color bars */ + for(i=0;i<7;i++){ + int x1 = i*w/7; + int x2 = (i+1)*w/7; + unsigned char col[2]; + + col[0] = (g_colors[i]&0xe0) | (b_colors[i]>>3); + col[1] = (r_colors[i]&0xf8) | (g_colors[i]>>5); + paint_rect2(dest, w*2, x1, 0, x2-x1, y1, col); + } + + /* inverse blue bars */ + for(i=0;i<7;i++){ + int x1 = i*w/7; + int x2 = (i+1)*w/7; + unsigned char col[2]; + int k; + + if(i&1){ + k = 7; + }else{ + k = 6-i; + } + col[0] = (g_colors[k]&0xe0) | (b_colors[k]>>3); + col[1] = (r_colors[k]&0xf8) | (g_colors[k]>>5); + paint_rect2(dest, w*2, x1, y1, x2-x1, y2-y1, col); + } + + /* -I, white, Q regions */ + for(i=0;i<3;i++){ + int x1 = i*w/6; + int x2 = (i+1)*w/6; + unsigned char col[2]; + int k; + + if(i==0){ k = 8; } + else if(i==1){ k = 0; } + else k = 9; + + col[0] = (g_colors[k]&0xe0) | (b_colors[k]>>3); + col[1] = (r_colors[k]&0xf8) | (g_colors[k]>>5); + paint_rect2(dest, w*2, x1, y2, x2-x1, h-y2, col); + } + + { + int x1 = w/2; + int x2 = w-1; + paint_rect_random(dest, w*2, x1*2, y2, (x2-x1)*2, h-y2); } } Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstvideotestsrc.h 30 Jul 2002 01:25:26 -0000 1.2 +++ gstvideotestsrc.h 30 Jul 2002 07:17:37 -0000 1.3 @@ -67,8 +67,9 @@ /* private */ gint64 timestamp; gint64 interval; + gint bpp; - guchar *temp; + void (*make_image)(GstVideotestsrc *v, unsigned char *dest, int w, int h); }; struct _GstVideotestsrcClass { |
From: David S. <dsc...@us...> - 2002-07-30 07:38:13
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Jul 30 2002 00:38:13 PDT Log message: Use bufferpool, if available Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstvideotestsrc.c 30 Jul 2002 07:17:37 -0000 1.5 +++ gstvideotestsrc.c 30 Jul 2002 07:38:01 -0000 1.6 @@ -87,6 +87,7 @@ static void gst_videotestsrc_class_init (GstVideotestsrcClass *klass); static void gst_videotestsrc_init (GstVideotestsrc *videotestsrc); +static GstElementStateReturn gst_videotestsrc_change_state (GstElement *element); static void gst_videotestsrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_videotestsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); @@ -147,6 +148,7 @@ gobject_class->set_property = gst_videotestsrc_set_property; gobject_class->get_property = gst_videotestsrc_get_property; + gstelement_class->change_state = gst_videotestsrc_change_state; } static GstPadConnectReturn @@ -195,6 +197,27 @@ return GST_PAD_CONNECT_OK; } +static GstElementStateReturn +gst_videotestsrc_change_state (GstElement *element) +{ + GstVideotestsrc *v; + + v = GST_VIDEOTESTSRC(element); + + switch(GST_STATE_TRANSITION(element)){ + case GST_STATE_PAUSED_TO_PLAYING: + v->pool = gst_pad_get_bufferpool(v->srcpad); + break; + case GST_STATE_PLAYING_TO_PAUSED: + v->pool = NULL; + break; + } + + parent_class->change_state(element); + + return GST_STATE_SUCCESS; +} + static void gst_videotestsrc_init (GstVideotestsrc *videotestsrc) { @@ -224,6 +247,8 @@ videotestsrc->timestamp = 0; videotestsrc->interval = GST_SECOND/30; + + videotestsrc->pool = NULL; } @@ -252,9 +277,15 @@ GST_DEBUG(0,"size=%ld %dx%d",newsize, videotestsrc->width, videotestsrc->height); - buf = gst_buffer_new(); - GST_BUFFER_SIZE(buf) = newsize; - GST_BUFFER_DATA(buf) = g_malloc (newsize); + buf = NULL; + if(videotestsrc->pool){ + buf = gst_buffer_new_from_pool(videotestsrc->pool, 0, 0); + } + if(!buf){ + buf = gst_buffer_new(); + GST_BUFFER_SIZE(buf) = newsize; + GST_BUFFER_DATA(buf) = g_malloc (newsize); + } g_return_val_if_fail(GST_BUFFER_DATA(buf) != NULL, NULL); videotestsrc->timestamp += videotestsrc->interval; Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstvideotestsrc.h 30 Jul 2002 07:17:37 -0000 1.3 +++ gstvideotestsrc.h 30 Jul 2002 07:38:01 -0000 1.4 @@ -69,6 +69,8 @@ gint64 interval; gint bpp; + GstBufferPool *pool; + void (*make_image)(GstVideotestsrc *v, unsigned char *dest, int w, int h); }; |
From: David S. <dsc...@us...> - 2002-10-04 06:50:04
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Thu Oct 03 2002 23:50:03 PDT Log message: Lots of new goodness. Will negotiate caps and output images in about 20 different formats. Some code cleanup. Fixed YUV color values for -I and Q. Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstvideotestsrc.c 18 Sep 2002 19:02:47 -0000 1.7 +++ gstvideotestsrc.c 4 Oct 2002 06:49:51 -0000 1.8 @@ -24,6 +24,28 @@ #include <string.h> #include <stdlib.h> +typedef struct paintinfo_struct paintinfo; +struct paintinfo_struct +{ + unsigned char *dest; + unsigned char *yp, *up, *vp; + int width; + int height; + int Y, U, V; [...1282 lines suppressed...] + + p->Y = static_y; + p->U = i * 17; + for (j = 0; j < 16; j++) { + int y1 = (j * h) >> 4; + int y2 = ((j + 1) * h) >> 4; + + p->V = j * 17; + for (k = y1; k < y2; k++) { + p->paint_hline (p, x1, k, (x2 - x1)); + } + } + } + + static_y += 17; + if (static_y >= 256) + static_y = 0; +} +#endif Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstvideotestsrc.h 30 Jul 2002 07:38:01 -0000 1.4 +++ gstvideotestsrc.h 4 Oct 2002 06:49:51 -0000 1.5 @@ -62,7 +62,7 @@ guint32 format; gint width; gint height; - GstVideoTestSrcMethod method; + gint forced_format; /* private */ gint64 timestamp; @@ -78,10 +78,9 @@ GstElementClass parent_class; }; -GType gst_videotestsrc_get_type(void); +static GType gst_videotestsrc_get_type(void); -void gst_videotestsrc_setup(GstVideotestsrc *); -#define gst_videotestsrc_scale(scale, src, dest) (scale)->scale_cc((scale), (src), (dest)) +static void gst_videotestsrc_setup(GstVideotestsrc *); #ifdef __cplusplus } |
From: David S. <dsc...@us...> - 2002-10-23 04:36:08
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Oct 22 2002 21:36:08 PDT Log message: add black, superblack, darkgrey areas Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstvideotestsrc.c 15 Oct 2002 20:44:15 -0000 1.9 +++ gstvideotestsrc.c 23 Oct 2002 04:35:55 -0000 1.10 @@ -567,10 +567,25 @@ } } -/* wht yel cya grn mag red blu blk -I Q */ -static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 16 }; -static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 198, 235 }; -static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 21, 198 }; +enum { + COLOR_WHITE = 0, + COLOR_YELLOW, + COLOR_CYAN, + COLOR_GREEN, + COLOR_MAGENTA, + COLOR_RED, + COLOR_BLUE, + COLOR_BLACK, + COLOR_NEG_I, + COLOR_POS_Q, + COLOR_SUPER_BLACK, + COLOR_DARK_GREY, +}; + +/* wht yel cya grn mag red blu blk -I Q, superblack, dark grey */ +static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 16, 0, 32 }; +static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 198, 235, 128, 128 }; +static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 21, 198, 128, 128 }; static void paint_setup_I420 (paintinfo * p, char *dest); static void paint_setup_YV12 (paintinfo * p, char *dest); @@ -741,8 +756,30 @@ } } + /* superblack, black, dark grey */ + for (i = 0; i < 3; i++) { + int x1 = w/2 + i * w / 12; + int x2 = w/2 + (i + 1) * w / 12; + int k; + + if (i == 0) { + k = COLOR_SUPER_BLACK; + } else if (i == 1) { + k = COLOR_BLACK; + } else + k = COLOR_DARK_GREY; + + p->Y = y_colors[k]; + p->U = u_colors[k]; + p->V = v_colors[k]; + + for (j = y2; j < h; j++) { + p->paint_hline (p, x1, j, (x2 - x1)); + } + } + { - int x1 = w / 2; + int x1 = w*3 / 4; p->U = u_colors[0]; p->V = v_colors[0]; |
From: David S. <dsc...@us...> - 2002-10-23 06:03:16
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Oct 22 2002 23:03:15 PDT Log message: add rate parameter Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstvideotestsrc.c 23 Oct 2002 04:35:55 -0000 1.10 +++ gstvideotestsrc.c 23 Oct 2002 06:03:03 -0000 1.11 @@ -72,6 +72,7 @@ ARG_WIDTH, ARG_HEIGHT, ARG_FOURCC, + ARG_RATE, /* FILL ME */ }; @@ -145,6 +146,9 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FOURCC, g_param_spec_string ("fourcc", "fourcc", "fourcc", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, + g_param_spec_int ("rate", "Rate", "Frame rate", + 0, 100, 30, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); @@ -280,8 +284,9 @@ videotestsrc->width = 640; videotestsrc->height = 480; + videotestsrc->rate = 30; videotestsrc->timestamp = 0; - videotestsrc->interval = GST_SECOND / 1; + videotestsrc->interval = GST_SECOND / videotestsrc->rate; videotestsrc->pool = NULL; } @@ -351,6 +356,10 @@ printf ("forcing FOURCC to 0x%08x\n", src->forced_format); } break; + case ARG_RATE: + src->rate = g_value_get_int (value); + src->interval = GST_SECOND/src->rate; + break; default: break; } @@ -375,6 +384,9 @@ case ARG_FOURCC: /* FIXME */ /* g_value_set_int (value, src->forced_format); */ + break; + case ARG_RATE: + g_value_set_int (value, src->rate); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstvideotestsrc.h 4 Oct 2002 06:49:51 -0000 1.5 +++ gstvideotestsrc.h 23 Oct 2002 06:03:03 -0000 1.6 @@ -68,6 +68,7 @@ gint64 timestamp; gint64 interval; gint bpp; + int rate; GstBufferPool *pool; |
From: David S. <dsc...@us...> - 2002-11-09 01:21:13
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Fri Nov 08 2002 17:21:12 PST Log message: Fix divide by zero bug when rate==0 Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstvideotestsrc.c 30 Oct 2002 09:16:03 -0000 1.12 +++ gstvideotestsrc.c 9 Nov 2002 01:21:00 -0000 1.13 @@ -152,7 +152,7 @@ NULL, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, g_param_spec_int ("rate", "Rate", "Frame rate", - 0, 100, 30, G_PARAM_READWRITE)); + 1, 100, 30, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); |
From: David S. <dsc...@us...> - 2003-04-16 07:53:10
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Wed Apr 16 2003 00:53:08 PDT Log message: Significant improvements to videotestsrc. More modular, handles RGB formats. Modified files: gst/videotestsrc: Makefile.am gstvideotestsrc.c gstvideotestsrc.h Added files: gst/videotestsrc: videotestsrc.c videotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am.diff?r1=1.2&r2=1.3 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.17&r2=1.18 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.8&r2=1.9 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile.am 8 Dec 2002 14:49:57 -0000 1.2 +++ Makefile.am 16 Apr 2003 07:52:52 -0000 1.3 @@ -3,10 +3,11 @@ plugin_LTLIBRARIES = libgstvideotestsrc.la libgstvideotestsrc_la_SOURCES = \ - gstvideotestsrc.c + gstvideotestsrc.c \ + videotestsrc.c libgstvideotestsrc_la_CFLAGS = -O2 $(FOMIT_FRAME_POINTER) -funroll-all-loops -finline-functions -ffast-math $(GST_CFLAGS) libgstvideotestsrc_la_LIBADD = libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstvideotestsrc.h +noinst_HEADERS = gstvideotestsrc.h videotestsrc.h Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstvideotestsrc.c 11 Feb 2003 21:31:27 -0000 1.17 +++ gstvideotestsrc.c 16 Apr 2003 07:52:52 -0000 1.18 @@ -20,32 +20,11 @@ /*#define DEBUG_ENABLED */ #include <gstvideotestsrc.h> +#include <videotestsrc.h> #include <string.h> #include <stdlib.h> -typedef struct paintinfo_struct paintinfo; -struct paintinfo_struct -{ - unsigned char *dest; - unsigned char *yp, *up, *vp; - int width; - int height; - int Y, U, V; - void (*paint_hline) (paintinfo * p, int x, int y, int w); -}; - -struct fourcc_list_struct -{ - char *fourcc; - int bitspp; - void (*paint_setup) (paintinfo * p, char *dest); - void (*paint_hline) (paintinfo * p, int x, int y, int w); -}; -static struct fourcc_list_struct fourcc_list[]; -static int n_fourccs; - -static int paintrect_find_fourcc (int find_fourcc); /* elementfactory information */ @@ -76,21 +55,9 @@ /* FILL ME */ }; -GST_PAD_TEMPLATE_FACTORY (videotestsrc_src_template_factory, - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ("videotestsrc_src", - "video/raw", - "width", GST_PROPS_INT_RANGE (0, G_MAXINT), - "height", GST_PROPS_INT_RANGE (0, G_MAXINT) - ) - ); - static void gst_videotestsrc_class_init (GstVideotestsrcClass * klass); static void gst_videotestsrc_init (GstVideotestsrc * videotestsrc); static GstElementStateReturn gst_videotestsrc_change_state (GstElement * element); -static void gst_videotestsrc_set_clock (GstElement *element, GstClock *clock); static void gst_videotestsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -101,16 +68,27 @@ static GstElementClass *parent_class = NULL; -static void gst_videotestsrc_setup (GstVideotestsrc * v); -static void random_chars (unsigned char *dest, int nbytes); -static void gst_videotestsrc_smpte_yuv (GstVideotestsrc * v, unsigned char *dest, int w, int h); -static void gst_videotestsrc_smpte_RGB (GstVideotestsrc * v, unsigned char *dest, int w, int h); -#if 0 -static void gst_videotestsrc_colors_yuv (GstVideotestsrc * v, unsigned char *dest, int w, int h); -#endif +static GstCaps * gst_videotestsrc_get_capslist (void); -static GType +static GstPadTemplate * +videotestsrc_src_template_factory(void) +{ + static GstPadTemplate *templ = NULL; + + if(!templ){ + GstCaps *caps = GST_CAPS_NEW("ack","video/raw", + "width", GST_PROPS_INT_RANGE (0, G_MAXINT), + "height", GST_PROPS_INT_RANGE (0, G_MAXINT)); + + caps = gst_caps_intersect(caps, gst_videotestsrc_get_capslist ()); + + templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); + } + return templ; +} + +GType gst_videotestsrc_get_type (void) { static GType videotestsrc_type = 0; @@ -161,17 +139,6 @@ gobject_class->get_property = gst_videotestsrc_get_property; gstelement_class->change_state = gst_videotestsrc_change_state; - gstelement_class->set_clock = gst_videotestsrc_set_clock; -} - -static void -gst_videotestsrc_set_clock (GstElement *element, GstClock *clock) -{ - GstVideotestsrc *v; - - v = GST_VIDEOTESTSRC (element); - - gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock); } static GstPadLinkReturn @@ -182,38 +149,30 @@ GST_DEBUG (0, "gst_videotestsrc_srcconnect"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); -#if 0 - if (!GST_CAPS_IS_FIXED (caps)) { + gst_caps_debug(caps,"moo"); + + videotestsrc->fourcc = paintinfo_find_by_caps(caps); + if(!videotestsrc->fourcc){ return GST_PAD_LINK_DELAYED; } -#endif - gst_caps_get_fourcc_int (caps, "format", &videotestsrc->format); + printf ("videotestsrc: using fourcc element %p %s\n", + videotestsrc->fourcc, videotestsrc->fourcc->name); + gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "height", &videotestsrc->height); - GST_DEBUG (0, "format is 0x%08x\n", videotestsrc->format); - - printf ("videotestsrc: caps FOURCC 0x%08x, forced FOURCC 0x%08x\n", - videotestsrc->format, videotestsrc->forced_format); - +#if 0 + /* FIXME */ if (videotestsrc->forced_format && videotestsrc->format != videotestsrc->forced_format) { return GST_PAD_LINK_REFUSED; } +#endif - printf ("videotestsrc: using FOURCC 0x%08x\n", videotestsrc->format); - - if (videotestsrc->format == GST_MAKE_FOURCC ('R', 'G', 'B', ' ')) { - videotestsrc->make_image = gst_videotestsrc_smpte_RGB; - videotestsrc->bpp = 16; - } else { - int index; - - index = paintrect_find_fourcc (videotestsrc->format); - videotestsrc->make_image = gst_videotestsrc_smpte_yuv; - /* videotestsrc->make_image = gst_videotestsrc_colors_yuv; */ - videotestsrc->bpp = fourcc_list[index].bitspp; - } + videotestsrc->make_image = gst_videotestsrc_smpte; + videotestsrc->make_image = gst_videotestsrc_snow; + /* videotestsrc->make_image = gst_videotestsrc_colors_yuv; */ + videotestsrc->bpp = videotestsrc->fourcc->bitspp; GST_DEBUG (0, "size %d x %d", videotestsrc->width, videotestsrc->height); @@ -251,16 +210,9 @@ if (capslist) return capslist; - for (i = 0; i < n_fourccs; i++) { - char *s = fourcc_list[i].fourcc; - int fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); - - caps = GST_CAPS_NEW ("videotestsrc_filter", - "video/raw", - "format", GST_PROPS_FOURCC (fourcc), - "width", GST_PROPS_INT (640), - "height", GST_PROPS_INT (480)); - capslist = gst_caps_append (capslist, caps); + for(i=0;i<n_fourccs;i++){ + caps = paint_get_caps(fourcc_list + i); + capslist = gst_caps_append(capslist, caps); } return capslist; @@ -270,18 +222,24 @@ gst_videotestsrc_getcaps (GstPad * pad, GstCaps * caps) { GstVideotestsrc *vts; + GstCaps *caps1; + GstCaps *caps2; vts = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); - if (vts->forced_format != 0) { - return GST_CAPS_NEW ("videotestsrc_filter", - "video/raw", - "format", GST_PROPS_FOURCC (vts->forced_format), - "width", GST_PROPS_INT (640), - "height", GST_PROPS_INT (480)); + if (vts->forced_format != NULL) { + struct fourcc_list_struct *fourcc; + fourcc = paintrect_find_name (vts->forced_format); + caps1 = paint_get_caps(fourcc); } else { - return gst_caps_ref (gst_videotestsrc_get_capslist ()); + caps1 = gst_videotestsrc_get_capslist (); } + + caps2 = GST_CAPS_NEW("ack","video/raw", + "width", GST_PROPS_INT (640), + "height", GST_PROPS_INT (480)); + + return gst_caps_intersect(caps1,caps2); } static void @@ -314,7 +272,6 @@ GstVideotestsrc *videotestsrc; gulong newsize; GstBuffer *buf; - GstClockTimeDiff jitter = 0; GST_DEBUG (0, "gst_videotestsrc_get"); @@ -338,22 +295,11 @@ } g_return_val_if_fail (GST_BUFFER_DATA (buf) != NULL, NULL); + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (buf), videotestsrc->width, videotestsrc->height); - - do { - GstClockID id; - - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; - - if (videotestsrc->clock) { - id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); - gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); - gst_clock_id_free (id); - } - } - while (jitter > 100 * GST_MSECOND); return buf; } @@ -363,7 +309,6 @@ GParamSpec * pspec) { GstVideotestsrc *src; - const gchar *s; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEOTESTSRC (object)); @@ -378,11 +323,8 @@ src->height = g_value_get_int (value); break; case ARG_FOURCC: - s = g_value_get_string (value); - if (strlen (s) == 4) { - src->forced_format = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); - printf ("forcing FOURCC to 0x%08x\n", src->forced_format); - } + src->forced_format = g_strdup(g_value_get_string (value)); + printf ("forcing FOURCC to \"%s\"\n", src->forced_format); break; case ARG_RATE: src->rate = g_value_get_int (value); @@ -448,630 +390,4 @@ }; - -/* Non-GST specific stuff */ - -static void -gst_videotestsrc_setup (GstVideotestsrc * v) -{ - -} - -static unsigned char -random_char (void) -{ - static unsigned int state; - - state *= 1103515245; - state += 12345; - return (state >> 16); -} - -static void -random_chars (unsigned char *dest, int nbytes) -{ - int i; - static unsigned int state; - - for (i = 0; i < nbytes; i++) { - state *= 1103515245; - state += 12345; - dest[i] = (state >> 16); - } -} - -static void -memset_str2 (unsigned char *dest, unsigned char val, int n) -{ - int i; - - for (i = 0; i < n; i++) { - *dest = val; - dest += 2; - } -} - -static void -memset_str3 (unsigned char *dest, unsigned char val, int n) -{ - int i; - - for (i = 0; i < n; i++) { - *dest = val; - dest += 3; - } -} - -static void -memset_str4 (unsigned char *dest, unsigned char val, int n) -{ - int i; - - for (i = 0; i < n; i++) { - *dest = val; - dest += 4; - } -} - -static void -paint_rect_random (unsigned char *dest, int stride, int x, int y, int w, int h) -{ - unsigned char *d = dest + stride * y + x; - int i; - - for (i = 0; i < h; i++) { - random_chars (d, w); - d += stride; - } -} - -#if 0 -static void -paint_rect (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char color) -{ - unsigned char *d = dest + stride * y + x; - int i; - - for (i = 0; i < h; i++) { - memset (d, color, w); - d += stride; - } -} -#endif - -static void -paint_rect_s2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) -{ - unsigned char *d = dest + stride * y + x * 2; - unsigned char *dp; - int i, j; - - for (i = 0; i < h; i++) { - dp = d; - for (j = 0; j < w; j++) { - *dp = col; - dp += 2; - } - d += stride; - } -} - -static void -paint_rect2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) -{ - unsigned char *d = dest + stride * y + x * 2; - unsigned char *dp; - int i, j; - - for (i = 0; i < h; i++) { - dp = d; - for (j = 0; j < w; j++) { - *dp++ = col[0]; - *dp++ = col[1]; - } - d += stride; - } -} -static void -paint_rect3 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) -{ - unsigned char *d = dest + stride * y + x * 3; - unsigned char *dp; - int i, j; - - for (i = 0; i < h; i++) { - dp = d; - for (j = 0; j < w; j++) { - *dp++ = col[0]; - *dp++ = col[1]; - *dp++ = col[2]; - } - d += stride; - } -} - -static void -paint_rect_s4 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) -{ - unsigned char *d = dest + stride * y + x * 4; - unsigned char *dp; - int i, j; - - for (i = 0; i < h; i++) { - dp = d; - for (j = 0; j < w; j++) { - *dp = col; - dp += 4; - } - d += stride; - } -} - -enum { - COLOR_WHITE = 0, - COLOR_YELLOW, - COLOR_CYAN, - COLOR_GREEN, - COLOR_MAGENTA, - COLOR_RED, - COLOR_BLUE, - COLOR_BLACK, - COLOR_NEG_I, - COLOR_POS_Q, - COLOR_SUPER_BLACK, - COLOR_DARK_GREY, -}; - -/* wht yel cya grn mag red blu blk -I Q, superblack, dark grey */ -static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 16, 0, 32 }; -static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 198, 235, 128, 128 }; -static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 21, 198, 128, 128 }; - -static void paint_setup_I420 (paintinfo * p, char *dest); -static void paint_setup_YV12 (paintinfo * p, char *dest); -static void paint_setup_YUY2 (paintinfo * p, char *dest); -static void paint_setup_UYVY (paintinfo * p, char *dest); -static void paint_setup_YVYU (paintinfo * p, char *dest); -static void paint_setup_Y800 (paintinfo * p, char *dest); -static void paint_setup_IMC1 (paintinfo * p, char *dest); -static void paint_setup_IMC2 (paintinfo * p, char *dest); -static void paint_setup_IMC3 (paintinfo * p, char *dest); -static void paint_setup_IMC4 (paintinfo * p, char *dest); - -static void paint_hline_I420 (paintinfo * p, int x, int y, int w); -static void paint_hline_YUY2 (paintinfo * p, int x, int y, int w); -static void paint_hline_Y800 (paintinfo * p, int x, int y, int w); -static void paint_hline_IMC1 (paintinfo * p, int x, int y, int w); - -static struct fourcc_list_struct fourcc_list[] = { -/* packed */ - {"YUY2", 16, paint_setup_YUY2, paint_hline_YUY2}, - {"UYVY", 16, paint_setup_UYVY, paint_hline_YUY2}, - {"Y422", 16, paint_setup_UYVY, paint_hline_YUY2}, - {"UYNV", 16, paint_setup_UYVY, paint_hline_YUY2}, - {"YVYU", 16, paint_setup_YVYU, paint_hline_YUY2}, - - /* interlaced */ - /*{ "IUYV", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ - - /* inverted */ - /*{ "cyuv", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ - - /*{ "Y41P", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ - - /* interlaced */ - /*{ "IY41", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ - - /*{ "Y211", 8, paint_setup_YVYU, paint_hline_YUY2 }, */ - - /*{ "Y41T", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ - /*{ "Y42P", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ - /*{ "CLJR", 8, paint_setup_YVYU, paint_hline_YUY2 }, */ - /*{ "IYU1", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ - /*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ - -/* planar */ - /* YVU9 */ - /* YUV9 */ - /* IF09 */ - /* YV12 */ - {"YV12", 12, paint_setup_YV12, paint_hline_I420}, - /* I420 */ - {"I420", 12, paint_setup_I420, paint_hline_I420}, - /* IYUV (same as I420) */ - {"IYUV", 12, paint_setup_I420, paint_hline_I420}, - /* NV12 */ - /* NV21 */ - /* IMC1 */ - {"IMC1", 16, paint_setup_IMC1, paint_hline_IMC1}, - /* IMC2 */ - {"IMC2", 12, paint_setup_IMC2, paint_hline_IMC1}, - /* IMC3 */ - {"IMC3", 16, paint_setup_IMC3, paint_hline_IMC1}, - /* IMC4 */ - {"IMC4", 12, paint_setup_IMC4, paint_hline_IMC1}, - /* CLPL */ - /* Y41B */ - /* Y42B */ - /* Y800 grayscale */ - {"Y800", 8, paint_setup_Y800, paint_hline_Y800}, - /* Y8 same as Y800 */ - {"Y8 ", 8, paint_setup_Y800, paint_hline_Y800}, - - /*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ -}; -static int n_fourccs = sizeof (fourcc_list) / sizeof (fourcc_list[0]); - -static int -paintrect_find_fourcc (int find_fourcc) -{ - int i; - - for (i = 0; i < n_fourccs; i++) { - char *s; - int fourcc; - - s = fourcc_list[i].fourcc; - fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); - if (find_fourcc == fourcc) { - return i; - } - } - return -1; -} - -static void -gst_videotestsrc_smpte_yuv (GstVideotestsrc * v, unsigned char *dest, int w, int h) -{ - int index; - int i; - int y1, y2; - int j; - paintinfo pi; - paintinfo *p = π - - p->width = w; - p->height = h; - index = paintrect_find_fourcc (v->format); - if (index < 0) - return; - - fourcc_list[index].paint_setup (p, dest); - p->paint_hline = fourcc_list[index].paint_hline; - - y1 = 2 * h / 3; - y2 = h * 0.75; - - /* color bars */ - for (i = 0; i < 7; i++) { - int x1 = i * w / 7; - int x2 = (i + 1) * w / 7; - - p->Y = y_colors[i]; - p->U = u_colors[i]; - p->V = v_colors[i]; - for (j = 0; j < y1; j++) { - p->paint_hline (p, x1, j, (x2 - x1)); - } - } - - /* inverse blue bars */ - for (i = 0; i < 7; i++) { - int x1 = i * w / 7; - int x2 = (i + 1) * w / 7; - int k; - - if (i & 1) { - k = 7; - } else { - k = 6 - i; - } - p->Y = y_colors[k]; - p->U = u_colors[k]; - p->V = v_colors[k]; - for (j = y1; j < y2; j++) { - p->paint_hline (p, x1, j, (x2 - x1)); - } - } - - /* -I, white, Q regions */ - for (i = 0; i < 3; i++) { - int x1 = i * w / 6; - int x2 = (i + 1) * w / 6; - int k; - - if (i == 0) { - k = 8; - } else if (i == 1) { - k = 0; - } else - k = 9; - - p->Y = y_colors[k]; - p->U = u_colors[k]; - p->V = v_colors[k]; - - for (j = y2; j < h; j++) { - p->paint_hline (p, x1, j, (x2 - x1)); - } - } - - /* superblack, black, dark grey */ - for (i = 0; i < 3; i++) { - int x1 = w/2 + i * w / 12; - int x2 = w/2 + (i + 1) * w / 12; - int k; - - if (i == 0) { - k = COLOR_SUPER_BLACK; - } else if (i == 1) { - k = COLOR_BLACK; - } else - k = COLOR_DARK_GREY; - - p->Y = y_colors[k]; - p->U = u_colors[k]; - p->V = v_colors[k]; - - for (j = y2; j < h; j++) { - p->paint_hline (p, x1, j, (x2 - x1)); - } - } - - { - int x1 = w*3 / 4; - - p->U = u_colors[0]; - p->V = v_colors[0]; - - for (i = x1; i < w; i++) { - for (j = y2; j < h; j++) { - p->Y = random_char (); - p->paint_hline (p, i, j, 1); - } - } - - } -} - -static void -paint_setup_I420 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + p->width * p->height; - p->vp = dest + p->width * p->height + p->width * p->height / 4; -} - -static void -paint_hline_I420 (paintinfo * p, int x, int y, int w) -{ - int x1 = x / 2; - int x2 = (x + w) / 2; - int offset = y * p->width; - int offset1 = (y / 2) * (p->width / 2); - - memset (p->yp + offset + x, p->Y, w); - memset (p->up + offset1 + x1, p->U, x2 - x1); - memset (p->vp + offset1 + x1, p->V, x2 - x1); -} - -static void -paint_setup_YV12 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + p->width * p->height + p->width * p->height / 4; - p->vp = dest + p->width * p->height; -} - -static void -paint_setup_YUY2 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + 1; - p->vp = dest + 3; -} - -static void -paint_setup_UYVY (paintinfo * p, char *dest) -{ - p->yp = dest + 1; - p->up = dest; - p->vp = dest + 2; -} - -static void -paint_setup_YVYU (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + 3; - p->vp = dest + 1; -} - -static void -paint_hline_YUY2 (paintinfo * p, int x, int y, int w) -{ - int x1 = x / 2; - int x2 = (x + w) / 2; - int offset; - - offset = y * p->width * 2; - memset_str2 (p->yp + offset + x * 2, p->Y, w); - memset_str4 (p->up + offset + x1 * 4, p->U, x2 - x1); - memset_str4 (p->vp + offset + x1 * 4, p->V, x2 - x1); -} - -static void -paint_setup_Y800 (paintinfo * p, char *dest) -{ - p->yp = dest; -} - -static void -paint_hline_Y800 (paintinfo * p, int x, int y, int w) -{ - int offset = y * p->width; - - memset (p->yp + offset + x, p->Y, w); -} - -static void -paint_setup_IMC1 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + p->width * p->height; - p->vp = dest + p->width * p->height + p->width * p->height / 2; -} - -static void -paint_setup_IMC2 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->vp = dest + p->width * p->height; - p->up = dest + p->width * p->height + p->width / 2; -} - -static void -paint_setup_IMC3 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->up = dest + p->width * p->height + p->width * p->height / 2; - p->vp = dest + p->width * p->height; -} - -static void -paint_setup_IMC4 (paintinfo * p, char *dest) -{ - p->yp = dest; - p->vp = dest + p->width * p->height + p->width / 2; - p->up = dest + p->width * p->height; -} - -static void -paint_hline_IMC1 (paintinfo * p, int x, int y, int w) -{ - int x1 = x / 2; - int x2 = (x + w) / 2; - int offset = y * p->width; - int offset1 = (y / 2) * p->width; - - memset (p->yp + offset + x, p->Y, w); - memset (p->up + offset1 + x1, p->U, x2 - x1); - memset (p->vp + offset1 + x1, p->V, x2 - x1); -} - - - -/* wht yel cya grn mag red blu blk -I Q */ -static int r_colors[] = { 255, 255, 0, 0, 255, 255, 0, 0, 0, 0 }; -static int g_colors[] = { 255, 255, 255, 255, 0, 0, 0, 0, 0, 128 }; -static int b_colors[] = { 255, 0, 255, 0, 255, 0, 255, 0, 128, 255 }; - -static void -gst_videotestsrc_smpte_RGB (GstVideotestsrc * v, unsigned char *dest, int w, int h) -{ - int i; - int y1, y2; - - y1 = h * 2 / 3; - y2 = h * 0.75; - - /* color bars */ - for (i = 0; i < 7; i++) { - int x1 = i * w / 7; - int x2 = (i + 1) * w / 7; - unsigned char col[2]; - - col[0] = (g_colors[i] & 0xe0) | (b_colors[i] >> 3); - col[1] = (r_colors[i] & 0xf8) | (g_colors[i] >> 5); - paint_rect2 (dest, w * 2, x1, 0, x2 - x1, y1, col); - } - - /* inverse blue bars */ - for (i = 0; i < 7; i++) { - int x1 = i * w / 7; - int x2 = (i + 1) * w / 7; - unsigned char col[2]; - int k; - - if (i & 1) { - k = 7; - } else { - k = 6 - i; - } - col[0] = (g_colors[k] & 0xe0) | (b_colors[k] >> 3); - col[1] = (r_colors[k] & 0xf8) | (g_colors[k] >> 5); - paint_rect2 (dest, w * 2, x1, y1, x2 - x1, y2 - y1, col); - } - - /* -I, white, Q regions */ - for (i = 0; i < 3; i++) { - int x1 = i * w / 6; - int x2 = (i + 1) * w / 6; - unsigned char col[2]; - int k; - - if (i == 0) { - k = 8; - } else if (i == 1) { - k = 0; - } else - k = 9; - - col[0] = (g_colors[k] & 0xe0) | (b_colors[k] >> 3); - col[1] = (r_colors[k] & 0xf8) | (g_colors[k] >> 5); - paint_rect2 (dest, w * 2, x1, y2, x2 - x1, h - y2, col); - } - - { - int x1 = w / 2; - int x2 = w - 1; - - paint_rect_random (dest, w * 2, x1 * 2, y2, (x2 - x1) * 2, h - y2); - } -} - -#ifdef unused -static void -gst_videotestsrc_colors_yuv (GstVideotestsrc * v, unsigned char *dest, int w, int h) -{ - int index; - int i; - int j; - int k; - paintinfo pi; - paintinfo *p = π - static int static_y = 0; - - p->width = w; - p->height = h; - index = paintrect_find_fourcc (v->format); - if (index < 0) - return; - - fourcc_list[index].paint_setup (p, dest); - p->paint_hline = fourcc_list[index].paint_hline; - - /* color bars */ - for (i = 0; i < 16; i++) { - int x1 = (i * w) >> 4; - int x2 = ((i + 1) * w) >> 4; - - p->Y = static_y; - p->U = i * 17; - for (j = 0; j < 16; j++) { - int y1 = (j * h) >> 4; - int y2 = ((j + 1) * h) >> 4; - - p->V = j * 17; - for (k = y1; k < y2; k++) { - p->paint_hline (p, x1, k, (x2 - x1)); - } - } - } - - static_y += 17; - if (static_y >= 256) - static_y = 0; -} -#endif Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstvideotestsrc.h 11 Feb 2003 21:31:28 -0000 1.8 +++ gstvideotestsrc.h 16 Apr 2003 07:52:53 -0000 1.9 @@ -55,10 +55,11 @@ GstPad *sinkpad,*srcpad; /* video state */ - guint32 format; + char *format_name; gint width; gint height; - gint forced_format; + char *forced_format; + struct fourcc_list_struct *fourcc; /* private */ gint64 timestamp; @@ -76,9 +77,7 @@ GstElementClass parent_class; }; -static GType gst_videotestsrc_get_type(void); - -static void gst_videotestsrc_setup(GstVideotestsrc *); +GType gst_videotestsrc_get_type(void); G_END_DECLS --- NEW FILE: videotestsrc.c --- /* GStreamer * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* non-GST-specific stuff */ /*#define DEBUG_ENABLED */ #include <gstvideotestsrc.h> #include <videotestsrc.h> #include <string.h> #include <stdlib.h> struct fourcc_list_struct * paintrect_find_fourcc (int find_fourcc); struct fourcc_list_struct * paintrect_find_name (char *name); struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps); GstCaps *paint_get_caps(struct fourcc_list_struct *format); static void gst_videotestsrc_setup (GstVideotestsrc * v) { } static unsigned char random_char (void) { static unsigned int state; state *= 1103515245; state += 12345; return (state >> 16); } static void random_chars (unsigned char *dest, int nbytes) { int i; static unsigned int state; for (i = 0; i < nbytes; i++) { state *= 1103515245; state += 12345; dest[i] = (state >> 16); } } static void memset_str2 (unsigned char *dest, unsigned char val, int n) { int i; for (i = 0; i < n; i++) { *dest = val; dest += 2; } } static void memset_str3 (unsigned char *dest, unsigned char val, int n) { int i; for (i = 0; i < n; i++) { *dest = val; dest += 3; } } static void memset_str4 (unsigned char *dest, unsigned char val, int n) { int i; for (i = 0; i < n; i++) { *dest = val; dest += 4; } } static void paint_rect_random (unsigned char *dest, int stride, int x, int y, int w, int h) { unsigned char *d = dest + stride * y + x; int i; for (i = 0; i < h; i++) { random_chars (d, w); d += stride; } } #if 0 static void paint_rect (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char color) { unsigned char *d = dest + stride * y + x; int i; for (i = 0; i < h; i++) { memset (d, color, w); d += stride; } } #endif static void paint_rect_s2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) { unsigned char *d = dest + stride * y + x * 2; unsigned char *dp; int i, j; for (i = 0; i < h; i++) { dp = d; for (j = 0; j < w; j++) { *dp = col; dp += 2; } d += stride; } } static void paint_rect2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { unsigned char *d = dest + stride * y + x * 2; unsigned char *dp; int i, j; for (i = 0; i < h; i++) { dp = d; for (j = 0; j < w; j++) { *dp++ = col[0]; *dp++ = col[1]; } d += stride; } } static void paint_rect3 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { unsigned char *d = dest + stride * y + x * 3; unsigned char *dp; int i, j; for (i = 0; i < h; i++) { dp = d; for (j = 0; j < w; j++) { *dp++ = col[0]; *dp++ = col[1]; *dp++ = col[2]; } d += stride; } } static void paint_rect4 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { unsigned char *d = dest + stride * y + x * 4; unsigned char *dp; int i, j; for (i = 0; i < h; i++) { dp = d; for (j = 0; j < w; j++) { *dp++ = col[0]; *dp++ = col[1]; *dp++ = col[2]; *dp++ = col[3]; } d += stride; } } static void paint_rect_s4 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) { unsigned char *d = dest + stride * y + x * 4; unsigned char *dp; int i, j; for (i = 0; i < h; i++) { dp = d; for (j = 0; j < w; j++) { *dp = col; dp += 4; } d += stride; } } enum { COLOR_WHITE = 0, COLOR_YELLOW, COLOR_CYAN, COLOR_GREEN, COLOR_MAGENTA, COLOR_RED, COLOR_BLUE, COLOR_BLACK, COLOR_NEG_I, COLOR_POS_Q, COLOR_SUPER_BLACK, COLOR_DARK_GREY, }; static struct vts_color_struct vts_colors[] = { /* 100% white */ { 255, 128, 128, 255, 255, 255 }, /* yellow */ { 226, 0, 155, 255, 255, 0 }, /* cyan */ { 179, 170, 0, 0, 255, 255 }, /* green */ { 150, 46, 21, 0, 255, 0 }, /* magenta */ { 105, 212, 235, 255, 0, 255 }, /* red */ { 76, 85, 255, 255, 0, 0 }, /* blue */ { 29, 255, 107, 0, 0, 255 }, /* black */ { 16, 128, 128, 0, 0, 0 }, /* -I */ { 16, 198, 21, 0, 0, 128 }, /* +Q */ { 16, 235, 198, 0, 128, 255 }, /* superblack */ { 0, 128, 128, 0, 0, 0 }, /* 5% grey */ { 32, 128, 128, 32, 32, 32 }, }; #if 0 /* wht yel cya grn mag red blu blk -I Q, superblack, dark grey */ static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 16, 0, 32 }; static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 198, 235, 128, 128 }; static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 21, 198, 128, 128 }; /* wht yel cya grn mag red blu blk -I Q superblack, dark grey */ static int r_colors[] = { 255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 32 }; static int g_colors[] = { 255, 255, 255, 255, 0, 0, 0, 0, 0, 128, 0, 32 }; static int b_colors[] = { 255, 0, 255, 0, 255, 0, 255, 0, 128, 255, 0, 32 }; #endif static void paint_setup_I420 (paintinfo * p, char *dest); static void paint_setup_YV12 (paintinfo * p, char *dest); static void paint_setup_YUY2 (paintinfo * p, char *dest); static void paint_setup_UYVY (paintinfo * p, char *dest); static void paint_setup_YVYU (paintinfo * p, char *dest); static void paint_setup_Y800 (paintinfo * p, char *dest); static void paint_setup_IMC1 (paintinfo * p, char *dest); static void paint_setup_IMC2 (paintinfo * p, char *dest); static void paint_setup_IMC3 (paintinfo * p, char *dest); static void paint_setup_IMC4 (paintinfo * p, char *dest); static void paint_setup_xRGB8888 (paintinfo * p, char *dest); static void paint_setup_xBGR8888 (paintinfo * p, char *dest); static void paint_setup_RGBx8888 (paintinfo * p, char *dest); static void paint_setup_BGRx8888 (paintinfo * p, char *dest); static void paint_setup_RGB888 (paintinfo * p, char *dest); static void paint_setup_BGR888 (paintinfo * p, char *dest); static void paint_setup_RGB565 (paintinfo * p, char *dest); static void paint_setup_xRGB1555 (paintinfo * p, char *dest); static void paint_hline_I420 (paintinfo * p, int x, int y, int w); static void paint_hline_YUY2 (paintinfo * p, int x, int y, int w); static void paint_hline_Y800 (paintinfo * p, int x, int y, int w); static void paint_hline_IMC1 (paintinfo * p, int x, int y, int w); static void paint_hline_str4 (paintinfo * p, int x, int y, int w); static void paint_hline_str3 (paintinfo * p, int x, int y, int w); static void paint_hline_RGB565 (paintinfo * p, int x, int y, int w); static void paint_hline_xRGB1555 (paintinfo * p, int x, int y, int w); struct fourcc_list_struct fourcc_list[] = { /* packed */ {"YUY2", "YUY2", 16, paint_setup_YUY2, paint_hline_YUY2}, {"UYVY", "UYVY", 16, paint_setup_UYVY, paint_hline_YUY2}, {"Y422", "Y422", 16, paint_setup_UYVY, paint_hline_YUY2}, {"UYNV", "UYNV", 16, paint_setup_UYVY, paint_hline_YUY2}, /* FIXME: UYNV? */ {"YVYU", "YVYU", 16, paint_setup_YVYU, paint_hline_YUY2}, /* interlaced */ /*{ "IUYV", "IUY2", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ /* inverted */ /*{ "cyuv", "cyuv", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "Y41P", "Y41P", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ /* interlaced */ /*{ "IY41", "IY41", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "Y211", "Y211", 8, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "Y41T", "Y41T", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "Y42P", "Y42P", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "CLJR", "CLJR", 8, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "IYU1", "IYU1", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "IYU2", "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ /* planar */ /* YVU9 */ /* YUV9 */ /* IF09 */ /* YV12 */ {"YV12", "YV12", 12, paint_setup_YV12, paint_hline_I420}, /* I420 */ {"I420", "I420", 12, paint_setup_I420, paint_hline_I420}, /* IYUV (same as I420) */ {"IYUV", "IYUV", 12, paint_setup_I420, paint_hline_I420}, /* NV12 */ /* NV21 */ /* IMC1 */ {"IMC1", "IMC1", 16, paint_setup_IMC1, paint_hline_IMC1}, /* IMC2 */ {"IMC2", "IMC2", 12, paint_setup_IMC2, paint_hline_IMC1}, /* IMC3 */ {"IMC3", "IMC3", 16, paint_setup_IMC3, paint_hline_IMC1}, /* IMC4 */ {"IMC4", "IMC4", 12, paint_setup_IMC4, paint_hline_IMC1}, /* CLPL */ /* Y41B */ /* Y42B */ /* Y800 grayscale */ {"Y800", "Y800", 8, paint_setup_Y800, paint_hline_Y800}, /* Y8 same as Y800 */ {"Y8 ", "Y8 ", 8, paint_setup_Y800, paint_hline_Y800}, /*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ {"RGB ", "xRGB8888", 32, paint_setup_xRGB8888, paint_hline_str4, 1, 24, 0x00ff0000, 0x0000ff00, 0x000000ff }, {"RGB ", "xBGR8888", 32, paint_setup_xBGR8888, paint_hline_str4, 1, 24, 0x000000ff, 0x0000ff00, 0x00ff0000 }, {"RGB ", "RGBx8888", 32, paint_setup_RGBx8888, paint_hline_str4, 1, 24, 0xff000000, 0x00ff0000, 0x0000ff00 }, {"RGB ", "BGRx8888", 32, paint_setup_BGRx8888, paint_hline_str4, 1, 24, 0x0000ff00, 0x00ff0000, 0xff000000 }, {"RGB ", "RGB888", 24, paint_setup_RGB888, paint_hline_str3, 1, 24, 0x00ff0000, 0x0000ff00, 0x000000ff }, {"RGB ", "BGR888", 24, paint_setup_BGR888, paint_hline_str3, 1, 24, 0x000000ff, 0x0000ff00, 0x00ff0000 }, {"RGB ", "RGB565", 16, paint_setup_RGB565, paint_hline_RGB565, 1, 16, 0x0000f800, 0x000007e0, 0x0000001f }, {"RGB ", "xRGB1555", 16, paint_setup_xRGB1555, paint_hline_xRGB1555, 1, 15, 0x00007c00, 0x000003e0, 0x0000001f }, }; int n_fourccs = sizeof (fourcc_list) / sizeof (fourcc_list[0]); struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps) { int i; for (i = 0; i < n_fourccs; i++) { GstCaps *c; c = gst_caps_intersect(caps,paint_get_caps(fourcc_list + i)); if(c){ return fourcc_list + i; } } return NULL; } struct fourcc_list_struct * paintrect_find_fourcc (int find_fourcc) { int i; for (i = 0; i < n_fourccs; i++) { char *s; int fourcc; s = fourcc_list[i].fourcc; fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); if (find_fourcc == fourcc) { /* If YUV format, it's good */ if(!fourcc_list[i].ext_caps){ return fourcc_list + i; } return fourcc_list + i; } } return NULL; } struct fourcc_list_struct * paintrect_find_name (char *name) { int i; for (i = 0; i < n_fourccs; i++) { if(strcmp(name,fourcc_list[i].name)==0){ return fourcc_list + i; } } return NULL; } GstCaps *paint_get_caps(struct fourcc_list_struct *format) { unsigned int fourcc; GstCaps *caps; fourcc = GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], format->fourcc[3]); if(format->ext_caps){ caps = GST_CAPS_NEW ("videotestsrc_filter", "video/raw", "format", GST_PROPS_FOURCC (fourcc), "bpp", GST_PROPS_INT(format->bitspp), "depth", GST_PROPS_INT(format->depth), "red_mask", GST_PROPS_INT(format->red_mask), "green_mask", GST_PROPS_INT(format->green_mask), "blue_mask", GST_PROPS_INT(format->blue_mask)); }else{ caps = GST_CAPS_NEW ("videotestsrc_filter", "video/raw", "format", GST_PROPS_FOURCC (fourcc)); } return caps; } void gst_videotestsrc_smpte (GstVideotestsrc * v, unsigned char *dest, int w, int h) { int i; int y1, y2; int j; paintinfo pi; paintinfo *p = π struct fourcc_list_struct *fourcc; p->width = w; p->height = h; fourcc = v->fourcc; if (fourcc == NULL) return; fourcc->paint_setup (p, dest); p->paint_hline = fourcc->paint_hline; y1 = 2 * h / 3; y2 = h * 0.75; /* color bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; p->color = vts_colors + i; for (j = 0; j < y1; j++) { p->paint_hline (p, x1, j, (x2 - x1)); } } /* inverse blue bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; int k; if (i & 1) { k = 7; } else { k = 6 - i; } p->color = vts_colors + k; for (j = y1; j < y2; j++) { p->paint_hline (p, x1, j, (x2 - x1)); } } /* -I, white, Q regions */ for (i = 0; i < 3; i++) { int x1 = i * w / 6; int x2 = (i + 1) * w / 6; int k; if (i == 0) { k = 8; } else if (i == 1) { k = 0; } else k = 9; p->color = vts_colors + k; for (j = y2; j < h; j++) { p->paint_hline (p, x1, j, (x2 - x1)); } } /* superblack, black, dark grey */ for (i = 0; i < 3; i++) { int x1 = w/2 + i * w / 12; int x2 = w/2 + (i + 1) * w / 12; int k; if (i == 0) { k = COLOR_SUPER_BLACK; } else if (i == 1) { k = COLOR_BLACK; } else k = COLOR_DARK_GREY; p->color = vts_colors + k; for (j = y2; j < h; j++) { p->paint_hline (p, x1, j, (x2 - x1)); } } { int x1 = w*3 / 4; struct vts_color_struct color; color = vts_colors[COLOR_BLACK]; p->color = &color; for (i = x1; i < w; i++) { for (j = y2; j < h; j++) { /* FIXME not strictly correct */ color.Y = random_char (); color.R = color.Y; color.G = color.Y; color.B = color.Y; p->paint_hline (p, i, j, 1); } } } } void gst_videotestsrc_snow (GstVideotestsrc * v, unsigned char *dest, int w, int h) { int i; int j; paintinfo pi; paintinfo *p = π struct fourcc_list_struct *fourcc; struct vts_color_struct color; p->width = w; p->height = h; fourcc = v->fourcc; if (fourcc == NULL) return; fourcc->paint_setup (p, dest); p->paint_hline = fourcc->paint_hline; color = vts_colors[COLOR_BLACK]; p->color = &color; for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { /* FIXME not strictly correct */ color.Y = random_char (); color.R = color.Y; color.G = color.Y; color.B = color.Y; p->paint_hline (p, i, j, 1); } } } static void paint_setup_I420 (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + p->width * p->height; p->vp = dest + p->width * p->height + p->width * p->height / 4; } static void paint_hline_I420 (paintinfo * p, int x, int y, int w) { int x1 = x / 2; int x2 = (x + w) / 2; int offset = y * p->width; int offset1 = (y / 2) * (p->width / 2); memset (p->yp + offset + x, p->color->Y, w); memset (p->up + offset1 + x1, p->color->U, x2 - x1); memset (p->vp + offset1 + x1, p->color->V, x2 - x1); } static void paint_setup_YV12 (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + p->width * p->height + p->width * p->height / 4; p->vp = dest + p->width * p->height; } static void paint_setup_YUY2 (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + 1; p->vp = dest + 3; } static void paint_setup_UYVY (paintinfo * p, char *dest) { p->yp = dest + 1; p->up = dest; p->vp = dest + 2; } static void paint_setup_YVYU (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + 3; p->vp = dest + 1; } static void paint_hline_YUY2 (paintinfo * p, int x, int y, int w) { int x1 = x / 2; int x2 = (x + w) / 2; int offset; offset = y * p->width * 2; memset_str2 (p->yp + offset + x * 2, p->color->Y, w); memset_str4 (p->up + offset + x1 * 4, p->color->U, x2 - x1); memset_str4 (p->vp + offset + x1 * 4, p->color->V, x2 - x1); } static void paint_setup_Y800 (paintinfo * p, char *dest) { p->yp = dest; } static void paint_hline_Y800 (paintinfo * p, int x, int y, int w) { int offset = y * p->width; memset (p->yp + offset + x, p->color->Y, w); } static void paint_setup_IMC1 (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + p->width * p->height; p->vp = dest + p->width * p->height + p->width * p->height / 2; } static void paint_setup_IMC2 (paintinfo * p, char *dest) { p->yp = dest; p->vp = dest + p->width * p->height; p->up = dest + p->width * p->height + p->width / 2; } static void paint_setup_IMC3 (paintinfo * p, char *dest) { p->yp = dest; p->up = dest + p->width * p->height + p->width * p->height / 2; p->vp = dest + p->width * p->height; } static void paint_setup_IMC4 (paintinfo * p, char *dest) { p->yp = dest; p->vp = dest + p->width * p->height + p->width / 2; p->up = dest + p->width * p->height; } static void paint_hline_IMC1 (paintinfo * p, int x, int y, int w) { int x1 = x / 2; int x2 = (x + w) / 2; int offset = y * p->width; int offset1 = (y / 2) * p->width; memset (p->yp + offset + x, p->color->Y, w); memset (p->up + offset1 + x1, p->color->U, x2 - x1); memset (p->vp + offset1 + x1, p->color->V, x2 - x1); } static void paint_setup_xRGB8888 (paintinfo * p, char *dest) { p->yp = dest + 1; p->up = dest + 2; p->vp = dest + 3; } static void paint_setup_xBGR8888 (paintinfo * p, char *dest) { p->yp = dest + 3; p->up = dest + 2; p->vp = dest + 1; } static void paint_setup_RGBx8888 (paintinfo * p, char *dest) { p->yp = dest + 0; p->up = dest + 1; p->vp = dest + 2; } static void paint_setup_BGRx8888 (paintinfo * p, char *dest) { p->yp = dest + 2; p->up = dest + 1; p->vp = dest + 0; } static void paint_setup_RGB888 (paintinfo * p, char *dest) { p->yp = dest + 0; p->up = dest + 1; p->vp = dest + 2; p->stride = (p->width*3 + 1)&(~0x3); } static void paint_setup_BGR888 (paintinfo * p, char *dest) { p->yp = dest + 2; p->up = dest + 1; p->vp = dest + 0; p->stride = (p->width*3 + 1)&(~0x3); } static void paint_hline_str4 (paintinfo * p, int x, int y, int w) { int offset = y * p->width * 4; memset_str4 (p->yp + offset + x * 4, p->color->R, w); memset_str4 (p->up + offset + x * 4, p->color->G, w); memset_str4 (p->vp + offset + x * 4, p->color->B, w); } static void paint_hline_str3 (paintinfo * p, int x, int y, int w) { int offset = y * p->stride; memset_str3 (p->yp + offset + x * 3, p->color->R, w); memset_str3 (p->up + offset + x * 3, p->color->G, w); memset_str3 (p->vp + offset + x * 3, p->color->B, w); } static void paint_setup_RGB565 (paintinfo * p, char *dest) { p->yp = dest; p->stride = (p->width*2 + 1)&(~0x3); } static void paint_hline_RGB565 (paintinfo * p, int x, int y, int w) { int offset = y * p->stride; unsigned int a,b; a = (p->color->R&0xf8) | (p->color->G>>5); b = ((p->color->G<<3)&0xe0) | (p->color->B>>3); memset_str2 (p->yp + offset + x * 2 + 0, a, w); memset_str2 (p->yp + offset + x * 2 + 1, b, w); } static void paint_setup_xRGB1555 (paintinfo * p, char *dest) { p->yp = dest; p->stride = (p->width*2 + 1)&(~0x3); } static void paint_hline_xRGB1555 (paintinfo * p, int x, int y, int w) { int offset = y * p->stride; unsigned int a,b; a = ((p->color->R>>1)&0x7c) | (p->color->G>>6); b = ((p->color->G<<2)&0xe0) | (p->color->B>>3); memset_str2 (p->yp + offset + x * 2 + 0, a, w); memset_str2 (p->yp + offset + x * 2 + 1, b, w); } #if 0 #ifdef unused static void gst_videotestsrc_smpte_RGB (GstVideotestsrc * v, unsigned char *dest, int w, int h) { int i; int y1, y2; y1 = h * 2 / 3; y2 = h * 0.75; /* color bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; unsigned char col[2]; col[0] = (g_colors[i] & 0xe0) | (b_colors[i] >> 3); col[1] = (r_colors[i] & 0xf8) | (g_colors[i] >> 5); paint_rect2 (dest, w * 2, x1, 0, x2 - x1, y1, col); } /* inverse blue bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; unsigned char col[2]; int k; if (i & 1) { k = 7; } else { k = 6 - i; } col[0] = (g_colors[k] & 0xe0) | (b_colors[k] >> 3); col[1] = (r_colors[k] & 0xf8) | (g_colors[k] >> 5); paint_rect2 (dest, w * 2, x1, y1, x2 - x1, y2 - y1, col); } /* -I, white, Q regions */ for (i = 0; i < 3; i++) { int x1 = i * w / 6; int x2 = (i + 1) * w / 6; unsigned char col[2]; int k; if (i == 0) { k = 8; } else if (i == 1) { k = 0; } else { k = 9; } col[0] = (g_colors[k] & 0xe0) | (b_colors[k] >> 3); col[1] = (r_colors[k] & 0xf8) | (g_colors[k] >> 5); paint_rect2 (dest, w * 2, x1, y2, x2 - x1, h - y2, col); } { int x1 = w / 2; int x2 = w - 1; paint_rect_random (dest, w * 2, x1 * 2, y2, (x2 - x1) * 2, h - y2); } } #endif static void gst_videotestsrc_smpte_RGB (GstVideotestsrc * v, unsigned char *dest, int w, int h) { int i; int y1, y2; y1 = h * 2 / 3; y2 = h * 0.75; /* color bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; unsigned char col[2]; col[0] = 0; col[1] = r_colors[i]; col[2] = g_colors[i]; col[3] = b_colors[i]; paint_rect4 (dest, w * 4, x1, 0, x2 - x1, y1, col); } /* inverse blue bars */ for (i = 0; i < 7; i++) { int x1 = i * w / 7; int x2 = (i + 1) * w / 7; unsigned char col[2]; int k; if (i & 1) { k = 7; } else { k = 6 - i; } col[0] = 0; col[1] = r_colors[k]; col[2] = g_colors[k]; col[3] = b_colors[k]; paint_rect4 (dest, w * 4, x1, y1, x2 - x1, y2 - y1, col); } /* -I, white, Q regions */ for (i = 0; i < 3; i++) { int x1 = i * w / 6; int x2 = (i + 1) * w / 6; unsigned char col[2]; int k; if (i == 0) { k = 8; } else if (i == 1) { k = 0; } else { k = 9; } col[0] = 0; col[1] = r_colors[k]; col[2] = g_colors[k]; col[3] = b_colors[k]; paint_rect4 (dest, w * 4, x1, y2, x2 - x1, h - y2, col); } { int x1 = w / 2; int x2 = w - 1; paint_rect_random (dest, w * 4, x1 * 4, y2, (x2 - x1) * 4, h - y2); } } #endif --- NEW FILE: videotestsrc.h --- /* GStreamer * Copyright (C) <2003> David A. Schleef <ds...@sc...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __VIDEOTESTSRC_H__ #define __VIDEOTESTSRC_H__ struct vts_color_struct{ int Y,U,V; int R,G,B; }; typedef struct paintinfo_struct paintinfo; struct paintinfo_struct { unsigned char *dest; unsigned char *yp, *up, *vp; int width; int height; struct vts_color_struct *color; void (*paint_hline) (paintinfo * p, int x, int y, int w); int stride; }; struct fourcc_list_struct { char *fourcc; char *name; int bitspp; void (*paint_setup) (paintinfo * p, char *dest); void (*paint_hline) (paintinfo * p, int x, int y, int w); int ext_caps; int depth; unsigned int red_mask; unsigned int green_mask; unsigned int blue_mask; }; struct fourcc_list_struct * paintrect_find_fourcc (int find_fourcc); struct fourcc_list_struct * paintrect_find_name (char *name); struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps); GstCaps *paint_get_caps(struct fourcc_list_struct *format); void gst_videotestsrc_smpte (GstVideotestsrc * v, unsigned char *dest, int w, int h); void gst_videotestsrc_snow (GstVideotestsrc * v, unsigned char *dest, int w, int h); extern struct fourcc_list_struct fourcc_list[]; extern int n_fourccs; #endif |
From: David S. <dsc...@us...> - 2003-04-17 07:34:33
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Thu Apr 17 2003 00:34:31 PDT Log message: Fix height/width caps negotiation Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstvideotestsrc.c 16 Apr 2003 07:52:52 -0000 1.18 +++ gstvideotestsrc.c 17 Apr 2003 07:34:18 -0000 1.19 @@ -149,8 +149,6 @@ GST_DEBUG (0, "gst_videotestsrc_srcconnect"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); - gst_caps_debug(caps,"moo"); - videotestsrc->fourcc = paintinfo_find_by_caps(caps); if(!videotestsrc->fourcc){ return GST_PAD_LINK_DELAYED; @@ -162,16 +160,8 @@ gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "height", &videotestsrc->height); -#if 0 - /* FIXME */ - if (videotestsrc->forced_format && videotestsrc->format != videotestsrc->forced_format) { - return GST_PAD_LINK_REFUSED; - } -#endif - videotestsrc->make_image = gst_videotestsrc_smpte; videotestsrc->make_image = gst_videotestsrc_snow; - /* videotestsrc->make_image = gst_videotestsrc_colors_yuv; */ videotestsrc->bpp = videotestsrc->fourcc->bitspp; GST_DEBUG (0, "size %d x %d", videotestsrc->width, videotestsrc->height); @@ -235,9 +225,15 @@ caps1 = gst_videotestsrc_get_capslist (); } - caps2 = GST_CAPS_NEW("ack","video/raw", - "width", GST_PROPS_INT (640), - "height", GST_PROPS_INT (480)); + if(vts->width){ + caps2 = GST_CAPS_NEW("ack","video/raw", + "width",GST_PROPS_INT(vts->width), + "height",GST_PROPS_INT(vts->height)); + }else{ + caps2 = GST_CAPS_NEW("ack","video/raw", + "width",GST_PROPS_INT_RANGE(16,4096), + "height",GST_PROPS_INT_RANGE(16,4096)); + } return gst_caps_intersect(caps1,caps2); } @@ -249,7 +245,6 @@ videotestsrc->srcpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (videotestsrc_src_template_factory), "src"); - /*gst_pad_set_negotiate_function(videotestsrc->srcpad,videotestsrc_negotiate_src); */ gst_pad_set_getcaps_function (videotestsrc->srcpad, gst_videotestsrc_getcaps); gst_element_add_pad (GST_ELEMENT (videotestsrc), videotestsrc->srcpad); gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get); |
From: David S. <dsc...@us...> - 2003-04-22 22:21:27
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Apr 22 2003 15:21:26 PDT Log message: Added a test pattern for black. Made it the default (temporarily) Modified files: gst/videotestsrc: gstvideotestsrc.c videotestsrc.c videotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.19&r2=1.20 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstvideotestsrc.c 17 Apr 2003 07:34:18 -0000 1.19 +++ gstvideotestsrc.c 22 Apr 2003 22:21:07 -0000 1.20 @@ -161,7 +161,7 @@ gst_caps_get_int (caps, "height", &videotestsrc->height); videotestsrc->make_image = gst_videotestsrc_smpte; - videotestsrc->make_image = gst_videotestsrc_snow; + videotestsrc->make_image = gst_videotestsrc_black; videotestsrc->bpp = videotestsrc->fourcc->bitspp; GST_DEBUG (0, "size %d x %d", videotestsrc->width, videotestsrc->height); Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- videotestsrc.c 16 Apr 2003 07:52:54 -0000 1.1 +++ videotestsrc.c 22 Apr 2003 22:21:08 -0000 1.2 @@ -586,6 +586,31 @@ } } +void +gst_videotestsrc_black (GstVideotestsrc * v, unsigned char *dest, int w, int h) +{ + int i; + paintinfo pi; + paintinfo *p = π + struct fourcc_list_struct *fourcc; + struct vts_color_struct color; + + p->width = w; + p->height = h; + fourcc = v->fourcc; + if (fourcc == NULL) + return; + + fourcc->paint_setup (p, dest); + p->paint_hline = fourcc->paint_hline; + + color = vts_colors[COLOR_BLACK]; + + for (i = 0; i < w; i++) { + p->paint_hline (p, i, 0, w); + } +} + static void paint_setup_I420 (paintinfo * p, char *dest) { Index: videotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- videotestsrc.h 16 Apr 2003 07:52:54 -0000 1.1 +++ videotestsrc.h 22 Apr 2003 22:21:08 -0000 1.2 @@ -57,6 +57,7 @@ GstCaps *paint_get_caps(struct fourcc_list_struct *format); void gst_videotestsrc_smpte (GstVideotestsrc * v, unsigned char *dest, int w, int h); void gst_videotestsrc_snow (GstVideotestsrc * v, unsigned char *dest, int w, int h); +void gst_videotestsrc_black (GstVideotestsrc * v, unsigned char *dest, int w, int h); extern struct fourcc_list_struct fourcc_list[]; extern int n_fourccs; |
From: David S. <dsc...@us...> - 2003-04-23 07:38:59
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Wed Apr 23 2003 00:38:45 PDT Log message: Add parameter to set the type of test pattern. Fix black test pattern. Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h videotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.20&r2=1.21 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.9&r2=1.10 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstvideotestsrc.c 22 Apr 2003 22:21:07 -0000 1.20 +++ gstvideotestsrc.c 23 Apr 2003 07:38:32 -0000 1.21 @@ -52,6 +52,7 @@ ARG_HEIGHT, ARG_FOURCC, ARG_RATE, + ARG_TYPE, /* FILL ME */ }; @@ -59,6 +60,7 @@ static void gst_videotestsrc_init (GstVideotestsrc * videotestsrc); static GstElementStateReturn gst_videotestsrc_change_state (GstElement * element); +static void gst_videotestsrc_set_pattern (GstVideotestsrc *src, int pattern_type); static void gst_videotestsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_videotestsrc_get_property (GObject * object, guint prop_id, GValue * value, @@ -77,7 +79,7 @@ static GstPadTemplate *templ = NULL; if(!templ){ - GstCaps *caps = GST_CAPS_NEW("ack","video/raw", + GstCaps *caps = GST_CAPS_NEW("src","video/raw", "width", GST_PROPS_INT_RANGE (0, G_MAXINT), "height", GST_PROPS_INT_RANGE (0, G_MAXINT)); @@ -111,6 +113,25 @@ return videotestsrc_type; } +#define GST_TYPE_VIDEOTESTSRC_PATTERN (gst_videotestsrc_pattern_get_type ()) +static GType +gst_videotestsrc_pattern_get_type (void) +{ + static GType videotestsrc_pattern_type = 0; + static GEnumValue pattern_types[] = { + { GST_VIDEOTESTSRC_SMPTE, "smpte", "SMPTE 100% color bars" }, + { GST_VIDEOTESTSRC_SNOW, "snow", "Random (television snow)" }, + { GST_VIDEOTESTSRC_BLACK, "black", "0% Black" }, + { 0, NULL, NULL }, + }; + + if (!videotestsrc_pattern_type){ + videotestsrc_pattern_type = g_enum_register_static("GstVideotestsrcPattern", + pattern_types); + } + return videotestsrc_pattern_type; +} + static void gst_videotestsrc_class_init (GstVideotestsrcClass * klass) { @@ -132,6 +153,9 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, g_param_spec_int ("rate", "Rate", "Frame rate", 1, 100, 30, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, + g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate", + GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); @@ -160,8 +184,6 @@ gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "height", &videotestsrc->height); - videotestsrc->make_image = gst_videotestsrc_smpte; - videotestsrc->make_image = gst_videotestsrc_black; videotestsrc->bpp = videotestsrc->fourcc->bitspp; GST_DEBUG (0, "size %d x %d", videotestsrc->width, videotestsrc->height); @@ -258,6 +280,7 @@ videotestsrc->interval = GST_SECOND / videotestsrc->rate; videotestsrc->pool = NULL; + gst_videotestsrc_set_pattern(videotestsrc, GST_VIDEOTESTSRC_SMPTE); } @@ -300,6 +323,27 @@ } static void +gst_videotestsrc_set_pattern (GstVideotestsrc *src, int pattern_type) +{ + src->type = pattern_type; + + g_print("setting pattern to %d\n",pattern_type); + switch(pattern_type){ + case GST_VIDEOTESTSRC_SMPTE: + src->make_image = gst_videotestsrc_smpte; + break; + case GST_VIDEOTESTSRC_SNOW: + src->make_image = gst_videotestsrc_snow; + break; + case GST_VIDEOTESTSRC_BLACK: + src->make_image = gst_videotestsrc_black; + break; + default: + g_assert_not_reached(); + } +} + +static void gst_videotestsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { @@ -325,6 +369,9 @@ src->rate = g_value_get_int (value); src->interval = GST_SECOND/src->rate; break; + case ARG_TYPE: + gst_videotestsrc_set_pattern (src, g_value_get_enum (value)); + break; default: break; } @@ -352,6 +399,9 @@ break; case ARG_RATE: g_value_set_int (value, src->rate); + break; + case ARG_TYPE: + g_value_set_enum (value, src->type); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstvideotestsrc.h 16 Apr 2003 07:52:53 -0000 1.9 +++ gstvideotestsrc.h 23 Apr 2003 07:38:32 -0000 1.10 @@ -40,11 +40,10 @@ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOTESTSRC)) typedef enum { - GST_VIDEOTESTSRC_POINT_SAMPLE, - GST_VIDEOTESTSRC_NEAREST, - GST_VIDEOTESTSRC_BILINEAR, - GST_VIDEOTESTSRC_BICUBIC -} GstVideoTestSrcMethod; + GST_VIDEOTESTSRC_SMPTE, + GST_VIDEOTESTSRC_SNOW, + GST_VIDEOTESTSRC_BLACK, +} GstVideotestsrcPattern; typedef struct _GstVideotestsrc GstVideotestsrc; typedef struct _GstVideotestsrcClass GstVideotestsrcClass; @@ -66,6 +65,7 @@ gint64 interval; gint bpp; int rate; + int type; GstClock *clock; GstBufferPool *pool; Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- videotestsrc.c 22 Apr 2003 22:21:08 -0000 1.2 +++ videotestsrc.c 23 Apr 2003 07:38:32 -0000 1.3 @@ -593,7 +593,6 @@ paintinfo pi; paintinfo *p = π struct fourcc_list_struct *fourcc; - struct vts_color_struct color; p->width = w; p->height = h; @@ -604,10 +603,10 @@ fourcc->paint_setup (p, dest); p->paint_hline = fourcc->paint_hline; - color = vts_colors[COLOR_BLACK]; + p->color = vts_colors + COLOR_BLACK; - for (i = 0; i < w; i++) { - p->paint_hline (p, i, 0, w); + for (i = 0; i < h; i++) { + p->paint_hline (p, 0, i, w); } } |
From: David S. <dsc...@us...> - 2003-05-01 06:24:49
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Wed Apr 30 2003 23:24:46 PDT Log message: restore wtay's clocking changes in 1.17->1.18 Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstvideotestsrc.c 23 Apr 2003 07:38:32 -0000 1.21 +++ gstvideotestsrc.c 1 May 2003 06:24:34 -0000 1.22 @@ -59,6 +59,7 @@ static void gst_videotestsrc_class_init (GstVideotestsrcClass * klass); static void gst_videotestsrc_init (GstVideotestsrc * videotestsrc); static GstElementStateReturn gst_videotestsrc_change_state (GstElement * element); +static void gst_videotestsrc_set_clock (GstElement *element, GstClock *clock); static void gst_videotestsrc_set_pattern (GstVideotestsrc *src, int pattern_type); static void gst_videotestsrc_set_property (GObject * object, guint prop_id, @@ -163,6 +164,17 @@ gobject_class->get_property = gst_videotestsrc_get_property; gstelement_class->change_state = gst_videotestsrc_change_state; + gstelement_class->set_clock = gst_videotestsrc_set_clock; +} + +static void +gst_videotestsrc_set_clock (GstElement *element, GstClock *clock) +{ + GstVideotestsrc *v; + + v = GST_VIDEOTESTSRC (element); + + gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock); } static GstPadLinkReturn @@ -290,6 +302,7 @@ GstVideotestsrc *videotestsrc; gulong newsize; GstBuffer *buf; + GstClockTimeDiff jitter = 0; GST_DEBUG (0, "gst_videotestsrc_get"); @@ -313,11 +326,22 @@ } g_return_val_if_fail (GST_BUFFER_DATA (buf) != NULL, NULL); - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; - videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (buf), videotestsrc->width, videotestsrc->height); + + do { + GstClockID id; + + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + + if (videotestsrc->clock) { + id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); + gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); + gst_clock_id_free (id); + } + } + while (jitter > 100 * GST_MSECOND); return buf; } |
From: David S. <dsc...@us...> - 2003-05-13 07:14:49
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue May 13 2003 00:14:49 PDT Log message: code cleanup. Changed g_print to GST_DEBUG(). Fixed RGB caps to work with 0.6. Modified files: gst/videotestsrc: gstvideotestsrc.c videotestsrc.c videotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.23&r2=1.24 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.3&r2=1.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstvideotestsrc.c 10 May 2003 17:37:27 -0000 1.23 +++ gstvideotestsrc.c 13 May 2003 07:14:35 -0000 1.24 @@ -174,7 +174,11 @@ v = GST_VIDEOTESTSRC (element); +#if GST_VERSION_MINOR > 6 gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock); +#else + gst_object_swap ((GstObject **)&v->clock, (GstObject *)clock); +#endif } static GstPadLinkReturn @@ -190,7 +194,7 @@ return GST_PAD_LINK_DELAYED; } - printf ("videotestsrc: using fourcc element %p %s\n", + GST_DEBUG (0,"videotestsrc: using fourcc element %p %s\n", videotestsrc->fourcc, videotestsrc->fourcc->name); gst_caps_get_int (caps, "width", &videotestsrc->width); @@ -320,8 +324,7 @@ if (videotestsrc->pool) { buf = gst_buffer_new_from_pool (videotestsrc->pool, 0, 0); /* if the buffer we get is too small, make our own */ - if (GST_BUFFER_SIZE (buf) < newsize) - { + if (buf && GST_BUFFER_SIZE (buf) < newsize){ gst_buffer_unref (buf); buf = NULL; } @@ -358,7 +361,7 @@ { src->type = pattern_type; - g_print("setting pattern to %d\n",pattern_type); + GST_DEBUG (0,"setting pattern to %d\n",pattern_type); switch(pattern_type){ case GST_VIDEOTESTSRC_SMPTE: src->make_image = gst_videotestsrc_smpte; @@ -379,6 +382,7 @@ GParamSpec * pspec) { GstVideotestsrc *src; + const char *format; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEOTESTSRC (object)); @@ -393,8 +397,13 @@ src->height = g_value_get_int (value); break; case ARG_FOURCC: - src->forced_format = g_strdup(g_value_get_string (value)); - printf ("forcing FOURCC to \"%s\"\n", src->forced_format); + format = g_value_get_string (value); + if(paintrect_find_name (format) != NULL){ + src->forced_format = g_strdup(format); + GST_DEBUG (0,"forcing format to \"%s\"\n", format); + }else{ + GST_DEBUG (0,"unknown format \"%s\"\n", format); + } break; case ARG_RATE: src->rate = g_value_get_int (value); @@ -425,8 +434,7 @@ g_value_set_int (value, src->height); break; case ARG_FOURCC: - /* FIXME */ - /* g_value_set_int (value, src->forced_format); */ + g_value_set_string (value, src->forced_format); break; case ARG_RATE: g_value_set_int (value, src->rate); Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- videotestsrc.c 23 Apr 2003 07:38:32 -0000 1.3 +++ videotestsrc.c 13 May 2003 07:14:36 -0000 1.4 @@ -26,18 +26,14 @@ #include <string.h> #include <stdlib.h> -struct fourcc_list_struct * paintrect_find_fourcc (int find_fourcc); -struct fourcc_list_struct * paintrect_find_name (char *name); -struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps); -GstCaps *paint_get_caps(struct fourcc_list_struct *format); - - +#if 0 static void gst_videotestsrc_setup (GstVideotestsrc * v) { } +#endif static unsigned char random_char (void) @@ -49,6 +45,7 @@ return (state >> 16); } +#if 0 static void random_chars (unsigned char *dest, int nbytes) { @@ -61,6 +58,7 @@ dest[i] = (state >> 16); } } +#endif static void memset_str2 (unsigned char *dest, unsigned char val, int n) @@ -95,6 +93,7 @@ } } +#if 0 static void paint_rect_random (unsigned char *dest, int stride, int x, int y, int w, int h) { @@ -106,6 +105,7 @@ d += stride; } } +#endif #if 0 static void @@ -121,6 +121,7 @@ } #endif +#if 0 static void paint_rect_s2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) { @@ -137,7 +138,9 @@ d += stride; } } +#endif +#if 0 static void paint_rect2 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { @@ -154,6 +157,9 @@ d += stride; } } +#endif + +#if 0 static void paint_rect3 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { @@ -171,6 +177,9 @@ d += stride; } } +#endif + +#if 0 static void paint_rect4 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char *col) { @@ -189,7 +198,9 @@ d += stride; } } +#endif +#if 0 static void paint_rect_s4 (unsigned char *dest, int stride, int x, int y, int w, int h, unsigned char col) { @@ -206,6 +217,7 @@ d += stride; } } +#endif enum { COLOR_WHITE = 0, @@ -405,7 +417,7 @@ return NULL; } -struct fourcc_list_struct * paintrect_find_name (char *name) +struct fourcc_list_struct * paintrect_find_name (const char *name) { int i; @@ -426,14 +438,55 @@ fourcc = GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], format->fourcc[3]); if(format->ext_caps){ +#if GST_VERSION_MINOR > 6 caps = GST_CAPS_NEW ("videotestsrc_filter", "video/raw", "format", GST_PROPS_FOURCC (fourcc), "bpp", GST_PROPS_INT(format->bitspp), + "endianness", GST_PROPS_INT(G_BIG_ENDIAN), "depth", GST_PROPS_INT(format->depth), "red_mask", GST_PROPS_INT(format->red_mask), "green_mask", GST_PROPS_INT(format->green_mask), "blue_mask", GST_PROPS_INT(format->blue_mask)); +#else + guint32 red_mask; + guint32 green_mask; + guint32 blue_mask; + guint32 endianness; + + if(format->bitspp==16){ + endianness = G_BYTE_ORDER; + red_mask = format->red_mask; + green_mask = format->green_mask; + blue_mask = format->blue_mask; + }else if(format->bitspp==24){ + endianness = G_BYTE_ORDER; +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + red_mask = GUINT32_SWAP_LE_BE(format->red_mask)>>8; + green_mask = GUINT32_SWAP_LE_BE(format->green_mask)>>8; + blue_mask = GUINT32_SWAP_LE_BE(format->blue_mask)>>8; +#else + red_mask = format->red_mask; + green_mask = format->green_mask; + blue_mask = format->blue_mask; +#endif + }else{ + endianness = G_BYTE_ORDER; + red_mask = GUINT32_FROM_BE(format->red_mask); + green_mask = GUINT32_FROM_BE(format->green_mask); + blue_mask = GUINT32_FROM_BE(format->blue_mask); + } + + caps = GST_CAPS_NEW ("videotestsrc_filter", + "video/raw", + "format", GST_PROPS_FOURCC (fourcc), + "bpp", GST_PROPS_INT(format->bitspp), + "endianness", GST_PROPS_INT(endianness), + "depth", GST_PROPS_INT(format->depth), + "red_mask", GST_PROPS_INT(red_mask), + "green_mask", GST_PROPS_INT(green_mask), + "blue_mask", GST_PROPS_INT(blue_mask)); +#endif }else{ caps = GST_CAPS_NEW ("videotestsrc_filter", "video/raw", @@ -821,8 +874,13 @@ a = (p->color->R&0xf8) | (p->color->G>>5); b = ((p->color->G<<3)&0xe0) | (p->color->B>>3); +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + memset_str2 (p->yp + offset + x * 2 + 0, b, w); + memset_str2 (p->yp + offset + x * 2 + 1, a, w); +#else memset_str2 (p->yp + offset + x * 2 + 0, a, w); memset_str2 (p->yp + offset + x * 2 + 1, b, w); +#endif } static void @@ -841,8 +899,13 @@ a = ((p->color->R>>1)&0x7c) | (p->color->G>>6); b = ((p->color->G<<2)&0xe0) | (p->color->B>>3); +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + memset_str2 (p->yp + offset + x * 2 + 0, b, w); + memset_str2 (p->yp + offset + x * 2 + 1, a, w); +#else memset_str2 (p->yp + offset + x * 2 + 0, a, w); memset_str2 (p->yp + offset + x * 2 + 1, b, w); +#endif } #if 0 Index: videotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- videotestsrc.h 22 Apr 2003 22:21:08 -0000 1.2 +++ videotestsrc.h 13 May 2003 07:14:36 -0000 1.3 @@ -52,7 +52,7 @@ }; struct fourcc_list_struct * paintrect_find_fourcc (int find_fourcc); -struct fourcc_list_struct * paintrect_find_name (char *name); +struct fourcc_list_struct * paintrect_find_name (const char *name); struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps); GstCaps *paint_get_caps(struct fourcc_list_struct *format); void gst_videotestsrc_smpte (GstVideotestsrc * v, unsigned char *dest, int w, int h); |
From: David S. <dsc...@us...> - 2003-05-13 07:16:29
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue May 13 2003 00:15:57 PDT Branch: BRANCH-GSTREAMER-0_6 Log message: Backport from HEAD. Fixes #111632 Modified files: gst/videotestsrc: Makefile.am gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am.diff?r1=1.2&r2=1.2.8.1 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.15.4.1&r2=1.15.4.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.7&r2=1.7.10.1 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am,v retrieving revision 1.2 retrieving revision 1.2.8.1 diff -u -d -r1.2 -r1.2.8.1 --- Makefile.am 8 Dec 2002 14:49:57 -0000 1.2 +++ Makefile.am 13 May 2003 07:15:43 -0000 1.2.8.1 @@ -3,10 +3,11 @@ plugin_LTLIBRARIES = libgstvideotestsrc.la libgstvideotestsrc_la_SOURCES = \ - gstvideotestsrc.c + gstvideotestsrc.c \ + videotestsrc.c -libgstvideotestsrc_la_CFLAGS = -O2 $(FOMIT_FRAME_POINTER) -funroll-all-loops -finline-functions -ffast-math $(GST_CFLAGS) +libgstvideotestsrc_la_CFLAGS = $(GST_CFLAGS) libgstvideotestsrc_la_LIBADD = libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstvideotestsrc.h +noinst_HEADERS = gstvideotestsrc.h videotestsrc.h Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.15.4.1 retrieving revision 1.15.4.2 diff -u -d -r1.15.4.1 -r1.15.4.2 --- gstvideotestsrc.c 10 May 2003 16:08:58 -0000 1.15.4.1 +++ gstvideotestsrc.c 13 May 2003 07:15:44 -0000 1.15.4.2 @@ -20,32 +20,11 @@ /*#define DEBUG_ENABLED */ #include <gstvideotestsrc.h> +#include <videotestsrc.h> #include <string.h> #include <stdlib.h> -typedef struct paintinfo_struct paintinfo; -struct paintinfo_struct -{ [...1026 lines suppressed...] - - p->Y = static_y; - p->U = i * 17; - for (j = 0; j < 16; j++) { - int y1 = (j * h) >> 4; - int y2 = ((j + 1) * h) >> 4; - - p->V = j * 17; - for (k = y1; k < y2; k++) { - p->paint_hline (p, x1, k, (x2 - x1)); - } - } - } - - static_y += 17; - if (static_y >= 256) - static_y = 0; -} -#endif Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.7 retrieving revision 1.7.10.1 diff -u -d -r1.7 -r1.7.10.1 --- gstvideotestsrc.h 30 Oct 2002 09:17:12 -0000 1.7 +++ gstvideotestsrc.h 13 May 2003 07:15:44 -0000 1.7.10.1 @@ -40,11 +40,10 @@ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOTESTSRC)) typedef enum { - GST_VIDEOTESTSRC_POINT_SAMPLE, - GST_VIDEOTESTSRC_NEAREST, - GST_VIDEOTESTSRC_BILINEAR, - GST_VIDEOTESTSRC_BICUBIC -} GstVideoTestSrcMethod; + GST_VIDEOTESTSRC_SMPTE, + GST_VIDEOTESTSRC_SNOW, + GST_VIDEOTESTSRC_BLACK, +} GstVideotestsrcPattern; typedef struct _GstVideotestsrc GstVideotestsrc; typedef struct _GstVideotestsrcClass GstVideotestsrcClass; @@ -55,16 +54,19 @@ GstPad *sinkpad,*srcpad; /* video state */ - guint32 format; + char *format_name; gint width; gint height; - gint forced_format; + char *forced_format; + struct fourcc_list_struct *fourcc; /* private */ gint64 timestamp; gint64 interval; gint bpp; int rate; + int type; + GstClock *clock; GstBufferPool *pool; @@ -75,9 +77,7 @@ GstElementClass parent_class; }; -static GType gst_videotestsrc_get_type(void); - -static void gst_videotestsrc_setup(GstVideotestsrc *); +GType gst_videotestsrc_get_type(void); G_END_DECLS |
From: David S. <dsc...@us...> - 2003-05-14 18:43:51
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Wed May 14 2003 11:43:49 PDT Log message: Fix issues with invalid fourcc parameters. Modified files: gst/videotestsrc: gstvideotestsrc.c videotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.24&r2=1.25 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstvideotestsrc.c 13 May 2003 07:14:35 -0000 1.24 +++ gstvideotestsrc.c 14 May 2003 18:43:36 -0000 1.25 @@ -255,11 +255,18 @@ vts = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); + caps1 = NULL; + if (vts->forced_format != NULL) { struct fourcc_list_struct *fourcc; + fourcc = paintrect_find_name (vts->forced_format); - caps1 = paint_get_caps(fourcc); - } else { + if (fourcc) { + caps1 = paint_get_caps(fourcc); + } + } + + if (caps1 == NULL) { caps1 = gst_videotestsrc_get_capslist (); } Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- videotestsrc.c 13 May 2003 07:14:36 -0000 1.4 +++ videotestsrc.c 14 May 2003 18:43:36 -0000 1.5 @@ -435,6 +435,8 @@ unsigned int fourcc; GstCaps *caps; + g_return_val_if_fail(format, NULL); + fourcc = GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], format->fourcc[3]); if(format->ext_caps){ |
From: David S. <dsc...@us...> - 2003-05-18 01:43:59
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sat May 17 2003 18:43:58 PDT Branch: BRANCH-GSTREAMER-0_6 Log message: If negotiated caps are chained, iterate through the list and call try_set_caps() on each one. Modified files: gst/videotestsrc: gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.15.4.2&r2=1.15.4.3 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.15.4.2 retrieving revision 1.15.4.3 diff -u -d -r1.15.4.2 -r1.15.4.3 --- gstvideotestsrc.c 13 May 2003 07:15:44 -0000 1.15.4.2 +++ gstvideotestsrc.c 18 May 2003 01:43:46 -0000 1.15.4.3 @@ -189,6 +189,28 @@ GST_DEBUG (0, "gst_videotestsrc_srcconnect"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); + if(!GST_CAPS_IS_FIXED(caps)){ + GST_DEBUG (0, "caps not fixed\n"); + return GST_PAD_LINK_DELAYED; + } + + if(GST_CAPS_IS_CHAINED(caps)){ + GstCaps *caps1 = gst_caps_copy_1(caps); + GstPadLinkReturn ret; + + GST_DEBUG (0, "caps chained\n"); + + ret = gst_pad_try_set_caps(pad, caps1); + GST_DEBUG (0, "try_set_caps returned %d\n", ret); + + if(ret!=GST_PAD_LINK_OK){ + gst_caps_unref(caps1); + return ret; + } + + caps = caps1; + } + videotestsrc->fourcc = paintinfo_find_by_caps(caps); if(!videotestsrc->fourcc){ return GST_PAD_LINK_DELAYED; |
From: David S. <dsc...@us...> - 2003-05-18 23:20:38
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sun May 18 2003 16:20:37 PDT Log message: Add sync parameter Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.25&r2=1.26 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstvideotestsrc.c 14 May 2003 18:43:36 -0000 1.25 +++ gstvideotestsrc.c 18 May 2003 23:20:24 -0000 1.26 @@ -53,6 +53,7 @@ ARG_FOURCC, ARG_RATE, ARG_TYPE, + ARG_SYNC, /* FILL ME */ }; @@ -157,6 +158,9 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate", GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, + g_param_spec_boolean ("sync", "Sync", "Synchronize to clock", + TRUE, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); @@ -296,6 +300,8 @@ gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get); gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_srcconnect); + videotestsrc->sync = TRUE; + videotestsrc->width = 640; videotestsrc->height = 480; @@ -346,19 +352,20 @@ videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (buf), videotestsrc->width, videotestsrc->height); - do { - GstClockID id; + if (videotestsrc->sync){ + do { + GstClockID id; - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; - if (videotestsrc->clock) { - id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); - gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); - gst_clock_id_free (id); - } + if (videotestsrc->clock) { + id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); + gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); + gst_clock_id_free (id); + } + } while (jitter > 100 * GST_MSECOND); } - while (jitter > 100 * GST_MSECOND); return buf; } @@ -419,6 +426,9 @@ case ARG_TYPE: gst_videotestsrc_set_pattern (src, g_value_get_enum (value)); break; + case ARG_SYNC: + src->sync = g_value_get_boolean (value); + break; default: break; } @@ -448,6 +458,9 @@ break; case ARG_TYPE: g_value_set_enum (value, src->type); + break; + case ARG_SYNC: + g_value_set_boolean (value, src->sync); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstvideotestsrc.h 23 Apr 2003 07:38:32 -0000 1.10 +++ gstvideotestsrc.h 18 May 2003 23:20:24 -0000 1.11 @@ -61,6 +61,7 @@ struct fourcc_list_struct *fourcc; /* private */ + gboolean sync; gint64 timestamp; gint64 interval; gint bpp; |
From: David S. <dsc...@us...> - 2003-05-21 06:22:14
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue May 20 2003 23:15:22 PDT Branch: BRANCH-GSTREAMER-0_6 Log message: Merge sync parameter patch from HEAD. Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.15.4.3&r2=1.15.4.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.7.10.1&r2=1.7.10.2 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.15.4.3 retrieving revision 1.15.4.4 diff -u -d -r1.15.4.3 -r1.15.4.4 --- gstvideotestsrc.c 18 May 2003 01:43:46 -0000 1.15.4.3 +++ gstvideotestsrc.c 21 May 2003 06:15:08 -0000 1.15.4.4 @@ -53,6 +53,7 @@ ARG_FOURCC, ARG_RATE, ARG_TYPE, + ARG_SYNC, /* FILL ME */ }; @@ -157,6 +158,9 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate", GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, + g_param_spec_boolean ("sync", "Sync", "Synchronize to clock", + TRUE, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_ELEMENT); @@ -311,6 +315,8 @@ gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get); gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_srcconnect); + videotestsrc->sync = TRUE; + videotestsrc->width = 640; videotestsrc->height = 480; @@ -361,19 +367,20 @@ videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (buf), videotestsrc->width, videotestsrc->height); - do { - GstClockID id; + if (videotestsrc->sync){ + do { + GstClockID id; - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; - if (videotestsrc->clock) { - id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); - gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); - gst_clock_id_free (id); - } + if (videotestsrc->clock) { + id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); + gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); + gst_clock_id_free (id); + } + } while (jitter > 100 * GST_MSECOND); } - while (jitter > 100 * GST_MSECOND); return buf; } @@ -434,6 +441,9 @@ case ARG_TYPE: gst_videotestsrc_set_pattern (src, g_value_get_enum (value)); break; + case ARG_SYNC: + src->sync = g_value_get_boolean (value); + break; default: break; } @@ -463,6 +473,9 @@ break; case ARG_TYPE: g_value_set_enum (value, src->type); + break; + case ARG_SYNC: + g_value_set_boolean (value, src->sync); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.7.10.1 retrieving revision 1.7.10.2 diff -u -d -r1.7.10.1 -r1.7.10.2 --- gstvideotestsrc.h 13 May 2003 07:15:44 -0000 1.7.10.1 +++ gstvideotestsrc.h 21 May 2003 06:15:09 -0000 1.7.10.2 @@ -61,6 +61,7 @@ struct fourcc_list_struct *fourcc; /* private */ + gboolean sync; gint64 timestamp; gint64 interval; gint bpp; |
From: David S. <dsc...@us...> - 2003-07-08 07:40:23
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Tue Jul 08 2003 00:40:22 PDT Log message: Fixes from caps changes Modified files: gst/videotestsrc: gstvideotestsrc.c videotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.31&r2=1.32 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstvideotestsrc.c 6 Jul 2003 20:49:48 -0000 1.31 +++ gstvideotestsrc.c 8 Jul 2003 07:40:09 -0000 1.32 @@ -88,12 +88,12 @@ if(!templ){ GstCaps *caps; GstCaps *caps1 = GST_CAPS_NEW("src","video/x-raw-yuv", - "width", GST_PROPS_INT_RANGE (0, G_MAXINT), - "height", GST_PROPS_INT_RANGE (0, G_MAXINT), + "width", GST_PROPS_INT_RANGE (1, G_MAXINT), + "height", GST_PROPS_INT_RANGE (1, G_MAXINT), "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); GstCaps *caps2 = GST_CAPS_NEW("src","video/x-raw-rgb", - "width", GST_PROPS_INT_RANGE (0, G_MAXINT), - "height", GST_PROPS_INT_RANGE (0, G_MAXINT), + "width", GST_PROPS_INT_RANGE (1, G_MAXINT), + "height", GST_PROPS_INT_RANGE (1, G_MAXINT), "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); caps = gst_caps_intersect(caps1, gst_videotestsrc_get_capslist ()); @@ -214,6 +214,12 @@ GstCaps *caps1 = gst_caps_copy_1(caps); GstPadLinkReturn ret; + gst_caps_set(caps1, "framerate", GST_PROPS_FLOAT((float)videotestsrc->rate)); + gst_caps_set(caps1, "width", GST_PROPS_INT(videotestsrc->width)); + gst_caps_set(caps1, "height", GST_PROPS_INT(videotestsrc->height)); + + //g_print("%s\n", gst_caps_to_string(caps1)); + ret = gst_pad_try_set_caps(pad, caps1); if (ret != GST_PAD_LINK_OK && @@ -234,17 +240,22 @@ } if (caps == NULL) { - GST_DEBUG ( - "videotestsrc: no suitable opposite-side caps found"); + GST_DEBUG ("videotestsrc: no suitable opposite-side caps found"); return GST_PAD_LINK_REFUSED; } GST_DEBUG ("videotestsrc: using fourcc element %p %s\n", videotestsrc->fourcc, videotestsrc->fourcc->name); - gst_caps_get_int (caps, "width", &videotestsrc->width); - gst_caps_get_int (caps, "height", &videotestsrc->height); - gst_caps_get_float (caps, "framerate", &videotestsrc->rate); + if(videotestsrc->width==0){ + gst_caps_get_int (caps, "width", &videotestsrc->width); + } + if(videotestsrc->height==0){ + gst_caps_get_int (caps, "height", &videotestsrc->height); + } + if(videotestsrc->rate==0){ + gst_caps_get_float (caps, "framerate", &videotestsrc->rate); + } videotestsrc->bpp = videotestsrc->fourcc->bitspp; @@ -332,11 +343,11 @@ GST_CAPS_NEW("ack","video/x-raw-yuv", "width",GST_PROPS_INT_RANGE(16,4096), "height",GST_PROPS_INT_RANGE(16,4096), - "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT)), + "framerate", GST_PROPS_FLOAT(vts->rate)), GST_CAPS_NEW("ack","video/x-raw-rgb", "width",GST_PROPS_INT_RANGE(16,4096), "height",GST_PROPS_INT_RANGE(16,4096), - "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT))); + "framerate", GST_PROPS_FLOAT(vts->rate))); } /* ref intersection and return it */ @@ -389,7 +400,7 @@ newsize = (videotestsrc->width * videotestsrc->height * videotestsrc->bpp) >> 3; - GST_DEBUG ("size=%ld %dx%d", newsize, videotestsrc->width, videotestsrc->height); + GST_DEBUG ("size=%ld %dx%d\n", newsize, videotestsrc->width, videotestsrc->height); buf = NULL; if (videotestsrc->pool) { Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- videotestsrc.c 6 Jul 2003 20:49:48 -0000 1.6 +++ videotestsrc.c 8 Jul 2003 07:40:09 -0000 1.7 @@ -379,15 +379,33 @@ struct fourcc_list_struct *paintinfo_find_by_caps(GstCaps *caps) { int i; + const char *mimetype = gst_caps_get_mime(caps); + guint32 format; - for (i = 0; i < n_fourccs; i++) { - GstCaps *c; - - c = gst_caps_intersect(caps,paint_get_caps(fourcc_list + i)); - if(c){ - return fourcc_list + i; + if(strcmp(mimetype, "video/x-raw-yuv")==0){ + char *s; + int fourcc; + + gst_caps_get(caps, "format", &format); + for (i = 0; i < n_fourccs; i++) { + s = fourcc_list[i].fourcc; + g_print("testing " GST_FOURCC_FORMAT " and %s\n", + GST_FOURCC_ARGS(format), s); + fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); + if(fourcc == format){ + return fourcc_list + i; + } } + }else if(strcmp(mimetype, "video/x-raw-yuv")==0){ + g_warning("video/x-raw-rgb not implemented"); + return NULL; + }else{ + g_warning("unknown format"); + return NULL; } + + g_warning("format not found"); + return NULL; } |
From: David S. <dsc...@us...> - 2003-07-14 08:36:20
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Mon Jul 14 2003 01:36:15 PDT Log message: Caps fixes. Change meaning of parameters to "default" size and rate. Minor fixes with timestamps. Added 'YUV9', 'YVU9', and 'IYU2' formats. Modified files: gst/videotestsrc: gstvideotestsrc.c gstvideotestsrc.h videotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.32&r2=1.33 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h.diff?r1=1.12&r2=1.13 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstvideotestsrc.c 8 Jul 2003 07:40:09 -0000 1.32 +++ gstvideotestsrc.c 14 Jul 2003 08:36:03 -0000 1.33 @@ -78,6 +78,7 @@ static GstElementClass *parent_class = NULL; static GstCaps * gst_videotestsrc_get_capslist (void); +static GstCaps * gst_videotestsrc_get_capslist_size (int height, int width, float rate); static GstPadTemplate * @@ -87,22 +88,8 @@ if(!templ){ GstCaps *caps; - GstCaps *caps1 = GST_CAPS_NEW("src","video/x-raw-yuv", - "width", GST_PROPS_INT_RANGE (1, G_MAXINT), - "height", GST_PROPS_INT_RANGE (1, G_MAXINT), - "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); - GstCaps *caps2 = GST_CAPS_NEW("src","video/x-raw-rgb", - "width", GST_PROPS_INT_RANGE (1, G_MAXINT), - "height", GST_PROPS_INT_RANGE (1, G_MAXINT), - "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); - caps = gst_caps_intersect(caps1, gst_videotestsrc_get_capslist ()); - gst_caps_unref (caps1); - caps1 = caps; - caps = gst_caps_intersect(caps2, gst_videotestsrc_get_capslist ()); - gst_caps_unref (caps2); - caps2 = caps; - caps = gst_caps_append(caps1, caps2); + caps = gst_videotestsrc_get_capslist_size(0,0,0.0); templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); } @@ -161,16 +148,16 @@ gstelement_class = (GstElementClass *) klass; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, - g_param_spec_int ("width", "width", "width", - G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_param_spec_int ("width", "width", "Default width", + 1, G_MAXINT, 320, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT, - g_param_spec_int ("height", "height", "height", - G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_param_spec_int ("height", "height", "Default height", + 1, G_MAXINT, 240, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FOURCC, g_param_spec_string ("fourcc", "fourcc", "fourcc", NULL, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, - g_param_spec_float ("fps", "FPS", "Frame rate", + g_param_spec_float ("fps", "FPS", "Default frame rate", 0., G_MAXFLOAT, 30., G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate", @@ -206,19 +193,28 @@ gst_videotestsrc_srcconnect (GstPad * pad, GstCaps * caps) { GstVideotestsrc *videotestsrc; + GstCaps *caps1; GST_DEBUG ("gst_videotestsrc_srcconnect"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); for ( ; caps != NULL; caps = caps->next) { - GstCaps *caps1 = gst_caps_copy_1(caps); GstPadLinkReturn ret; - gst_caps_set(caps1, "framerate", GST_PROPS_FLOAT((float)videotestsrc->rate)); - gst_caps_set(caps1, "width", GST_PROPS_INT(videotestsrc->width)); - gst_caps_set(caps1, "height", GST_PROPS_INT(videotestsrc->height)); + caps1 = gst_caps_copy_1(caps); - //g_print("%s\n", gst_caps_to_string(caps1)); + if(!gst_caps_has_fixed_property(caps1, "framerate")){ + gst_caps_set(caps1, "framerate", GST_PROPS_FLOAT(videotestsrc->default_rate)); + } + if(!gst_caps_has_fixed_property(caps1, "width")){ + gst_caps_set(caps1, "width", GST_PROPS_INT(videotestsrc->default_width)); + } + if(!gst_caps_has_fixed_property(caps1, "height")){ + gst_caps_set(caps1, "height", GST_PROPS_INT(videotestsrc->default_height)); + } + + gst_caps_ref(caps1); + gst_caps_sink(caps1); ret = gst_pad_try_set_caps(pad, caps1); @@ -234,8 +230,8 @@ continue; } - /* if we get here, it's allright */ - gst_caps_unref(caps1); + /* if we get here, it's OK */ + //gst_caps_unref(caps1); break; } @@ -244,18 +240,14 @@ return GST_PAD_LINK_REFUSED; } - GST_DEBUG ("videotestsrc: using fourcc element %p %s\n", - videotestsrc->fourcc, videotestsrc->fourcc->name); + g_return_val_if_fail(videotestsrc->fourcc, GST_PAD_LINK_REFUSED); - if(videotestsrc->width==0){ - gst_caps_get_int (caps, "width", &videotestsrc->width); - } - if(videotestsrc->height==0){ - gst_caps_get_int (caps, "height", &videotestsrc->height); - } - if(videotestsrc->rate==0){ - gst_caps_get_float (caps, "framerate", &videotestsrc->rate); - } + //g_print ("videotestsrc: using fourcc element %p %s\n", + // videotestsrc->fourcc, videotestsrc->fourcc->name); + + gst_caps_get_int (caps1, "width", &videotestsrc->width); + gst_caps_get_int (caps1, "height", &videotestsrc->height); + gst_caps_get_float (caps1, "framerate", &videotestsrc->rate); videotestsrc->bpp = videotestsrc->fourcc->bitspp; @@ -293,28 +285,73 @@ GstCaps *caps; int i; - if (capslist) - return capslist; + if(!capslist){ + for(i=0;i<n_fourccs;i++){ + caps = paint_get_caps(fourcc_list + i); + capslist = gst_caps_append(capslist, caps); + } + } - for(i=0;i<n_fourccs;i++){ - caps = paint_get_caps(fourcc_list + i); - capslist = gst_caps_append(capslist, caps); + g_return_val_if_fail(capslist->refcount > 0, NULL); + + return gst_caps_ref(capslist); +} + +static GstCaps * +gst_videotestsrc_get_capslist_size (int height, int width, float rate) +{ + GstCaps *capslist; + GstCaps *caps; + GstCaps *caps_yuv_mask; + GstCaps *caps_rgb_mask; + GstCaps *caps_yuv; + GstCaps *caps_rgb; + + caps_rgb_mask = GST_CAPS_NEW("src","video/x-raw-rgb", + "width", GST_PROPS_INT_RANGE (1, G_MAXINT), + "height", GST_PROPS_INT_RANGE (1, G_MAXINT), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); + caps_yuv_mask = GST_CAPS_NEW("src","video/x-raw-yuv", + "width", GST_PROPS_INT_RANGE (1, G_MAXINT), + "height", GST_PROPS_INT_RANGE (1, G_MAXINT), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); + + if(height){ + gst_caps_set(caps_rgb_mask, "height", GST_PROPS_INT(height)); + gst_caps_set(caps_yuv_mask, "height", GST_PROPS_INT(height)); + } + if(width){ + gst_caps_set(caps_rgb_mask, "width", GST_PROPS_INT(width)); + gst_caps_set(caps_yuv_mask, "width", GST_PROPS_INT(width)); + } + if(rate > 0){ + gst_caps_set(caps_rgb_mask, "framerate", GST_PROPS_FLOAT(rate)); + gst_caps_set(caps_yuv_mask, "framerate", GST_PROPS_FLOAT(rate)); } - return capslist; + capslist = gst_videotestsrc_get_capslist (); + g_return_val_if_fail(capslist->refcount > 0, NULL); + caps_yuv = gst_caps_intersect(caps_yuv_mask, capslist); + caps_rgb = gst_caps_intersect(caps_rgb_mask, capslist); + caps = gst_caps_append(caps_yuv, caps_rgb); + + //gst_caps_unref (capslist); + //gst_caps_unref (caps_yuv_mask); + //gst_caps_unref (caps_rgb_mask); + + g_return_val_if_fail(caps->refcount > 0, NULL); + + return caps; } static GstCaps * gst_videotestsrc_getcaps (GstPad * pad, GstCaps * caps) { GstVideotestsrc *vts; - GstCaps *caps1; - GstCaps *caps2; vts = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); - caps1 = NULL; - +#if 0 if (vts->forced_format != NULL) { struct fourcc_list_struct *fourcc; @@ -323,35 +360,13 @@ caps1 = paint_get_caps(fourcc); } } +#endif - if (caps1 == NULL) { - caps1 = gst_videotestsrc_get_capslist (); - } + caps = gst_videotestsrc_get_capslist_size (vts->width, vts->height, vts->rate); - if(vts->width){ - caps2 = gst_caps_append( - GST_CAPS_NEW("ack","video/x-raw-yuv", - "width",GST_PROPS_INT(vts->width), - "height",GST_PROPS_INT(vts->height), - "framerate", GST_PROPS_FLOAT(vts->rate)), - GST_CAPS_NEW("ack","video/x-raw-rgb", - "width",GST_PROPS_INT(vts->width), - "height",GST_PROPS_INT(vts->height), - "framerate", GST_PROPS_FLOAT(vts->rate))); - }else{ - caps2 = gst_caps_append( - GST_CAPS_NEW("ack","video/x-raw-yuv", - "width",GST_PROPS_INT_RANGE(16,4096), - "height",GST_PROPS_INT_RANGE(16,4096), - "framerate", GST_PROPS_FLOAT(vts->rate)), - GST_CAPS_NEW("ack","video/x-raw-rgb", - "width",GST_PROPS_INT_RANGE(16,4096), - "height",GST_PROPS_INT_RANGE(16,4096), - "framerate", GST_PROPS_FLOAT(vts->rate))); - } + g_return_val_if_fail(caps->refcount > 0, NULL); - /* ref intersection and return it */ - return gst_caps_ref (gst_caps_intersect(caps1,caps2)); + return caps; } static void @@ -369,17 +384,18 @@ videotestsrc->pool = NULL; gst_videotestsrc_set_pattern(videotestsrc, GST_VIDEOTESTSRC_SMPTE); gst_videotestsrc_reset (videotestsrc); + + videotestsrc->sync = TRUE; + videotestsrc->default_width = 320; + videotestsrc->default_height = 240; + videotestsrc->default_rate = 30.; } static void gst_videotestsrc_reset (GstVideotestsrc *videotestsrc) { - videotestsrc->sync = TRUE; - videotestsrc->width = 640; - videotestsrc->height = 480; - videotestsrc->rate = 30.; - videotestsrc->timestamp = 0; - videotestsrc->interval = GST_SECOND / videotestsrc->rate; + videotestsrc->timestamp_offset = 0; + videotestsrc->n_frames = 0; } @@ -398,7 +414,10 @@ videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); + g_return_val_if_fail (videotestsrc->fourcc != NULL, NULL); + newsize = (videotestsrc->width * videotestsrc->height * videotestsrc->bpp) >> 3; + g_return_val_if_fail (newsize > 0, NULL); GST_DEBUG ("size=%ld %dx%d\n", newsize, videotestsrc->width, videotestsrc->height); @@ -425,15 +444,22 @@ do { GstClockID id; - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp_offset + + (videotestsrc->n_frames * GST_SECOND)/(double)videotestsrc->rate; + videotestsrc->n_frames++; + /* FIXME this is not correct if we do QoS */ if (videotestsrc->clock) { - id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); + id = gst_clock_new_single_shot_id (videotestsrc->clock, + GST_BUFFER_TIMESTAMP (buf)); gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); gst_clock_id_free (id); } } while (jitter > 100 * GST_MSECOND); + }else{ + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp_offset + + (videotestsrc->n_frames * GST_SECOND)/(double)videotestsrc->rate; + videotestsrc->n_frames++; } return buf; @@ -474,10 +500,10 @@ GST_DEBUG ("gst_videotestsrc_set_property"); switch (prop_id) { case ARG_WIDTH: - src->width = g_value_get_int (value); + src->default_width = g_value_get_int (value); break; case ARG_HEIGHT: - src->height = g_value_get_int (value); + src->default_height = g_value_get_int (value); break; case ARG_FOURCC: format = g_value_get_string (value); @@ -489,8 +515,7 @@ } break; case ARG_RATE: - src->rate = g_value_get_float (value); - src->interval = GST_SECOND/src->rate; + src->default_rate = g_value_get_float (value); break; case ARG_TYPE: gst_videotestsrc_set_pattern (src, g_value_get_enum (value)); @@ -514,16 +539,16 @@ switch (prop_id) { case ARG_WIDTH: - g_value_set_int (value, src->width); + g_value_set_int (value, src->default_width); break; case ARG_HEIGHT: - g_value_set_int (value, src->height); + g_value_set_int (value, src->default_height); break; case ARG_FOURCC: g_value_set_string (value, src->forced_format); break; case ARG_RATE: - g_value_set_float (value, src->rate); + g_value_set_float (value, src->default_rate); break; case ARG_TYPE: g_value_set_enum (value, src->type); Index: gstvideotestsrc.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstvideotestsrc.h 6 Jul 2003 20:49:48 -0000 1.12 +++ gstvideotestsrc.h 14 Jul 2003 08:36:03 -0000 1.13 @@ -53,6 +53,12 @@ GstPad *sinkpad,*srcpad; + /* parameters */ + gint default_width; + gint default_height; + gboolean sync; + gfloat default_rate; + /* video state */ char *format_name; gint width; @@ -61,9 +67,8 @@ struct fourcc_list_struct *fourcc; /* private */ - gboolean sync; - gint64 timestamp; - gint64 interval; + gint64 timestamp_offset; + gint64 n_frames; gint bpp; gfloat rate; int type; Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- videotestsrc.c 8 Jul 2003 07:40:09 -0000 1.7 +++ videotestsrc.c 14 Jul 2003 08:36:03 -0000 1.8 @@ -281,11 +281,14 @@ static void paint_setup_YUY2 (paintinfo * p, char *dest); static void paint_setup_UYVY (paintinfo * p, char *dest); static void paint_setup_YVYU (paintinfo * p, char *dest); +static void paint_setup_IYU2 (paintinfo * p, char *dest); static void paint_setup_Y800 (paintinfo * p, char *dest); static void paint_setup_IMC1 (paintinfo * p, char *dest); static void paint_setup_IMC2 (paintinfo * p, char *dest); static void paint_setup_IMC3 (paintinfo * p, char *dest); static void paint_setup_IMC4 (paintinfo * p, char *dest); +static void paint_setup_YUV9 (paintinfo * p, char *dest); +static void paint_setup_YVU9 (paintinfo * p, char *dest); static void paint_setup_xRGB8888 (paintinfo * p, char *dest); static void paint_setup_xBGR8888 (paintinfo * p, char *dest); static void paint_setup_RGBx8888 (paintinfo * p, char *dest); @@ -297,8 +300,10 @@ static void paint_hline_I420 (paintinfo * p, int x, int y, int w); static void paint_hline_YUY2 (paintinfo * p, int x, int y, int w); +static void paint_hline_IYU2 (paintinfo * p, int x, int y, int w); static void paint_hline_Y800 (paintinfo * p, int x, int y, int w); static void paint_hline_IMC1 (paintinfo * p, int x, int y, int w); +static void paint_hline_YUV9 (paintinfo * p, int x, int y, int w); static void paint_hline_str4 (paintinfo * p, int x, int y, int w); static void paint_hline_str3 (paintinfo * p, int x, int y, int w); static void paint_hline_RGB565 (paintinfo * p, int x, int y, int w); @@ -329,11 +334,13 @@ /*{ "Y42P", "Y42P", 16, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "CLJR", "CLJR", 8, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "IYU1", "IYU1", 12, paint_setup_YVYU, paint_hline_YUY2 }, */ - /*{ "IYU2", "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ + { "IYU2", "IYU2", 24, paint_setup_IYU2, paint_hline_IYU2 }, /* planar */ /* YVU9 */ + {"YVU9", "YVU9", 9, paint_setup_YVU9, paint_hline_YUV9}, /* YUV9 */ + {"YUV9", "YUV9", 9, paint_setup_YUV9, paint_hline_YUV9}, /* IF09 */ /* YV12 */ {"YV12", "YV12", 12, paint_setup_YV12, paint_hline_I420}, @@ -355,8 +362,6 @@ /* Y800 grayscale */ {"Y800", "Y800", 8, paint_setup_Y800, paint_hline_Y800}, - /*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ - {"RGB ", "xRGB8888", 32, paint_setup_xRGB8888, paint_hline_str4, 1, 24, 0x00ff0000, 0x0000ff00, 0x000000ff }, {"RGB ", "xBGR8888", 32, paint_setup_xBGR8888, paint_hline_str4, 1, 24, @@ -389,14 +394,13 @@ gst_caps_get(caps, "format", &format); for (i = 0; i < n_fourccs; i++) { s = fourcc_list[i].fourcc; - g_print("testing " GST_FOURCC_FORMAT " and %s\n", - GST_FOURCC_ARGS(format), s); + //g_print("testing " GST_FOURCC_FORMAT " and %s\n", GST_FOURCC_ARGS(format), s); fourcc = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]); if(fourcc == format){ return fourcc_list + i; } } - }else if(strcmp(mimetype, "video/x-raw-yuv")==0){ + }else if(strcmp(mimetype, "video/x-raw-rgb")==0){ g_warning("video/x-raw-rgb not implemented"); return NULL; }else{ @@ -744,6 +748,25 @@ } static void +paint_setup_IYU2 (paintinfo * p, char *dest) +{ + p->yp = dest + 1; + p->up = dest + 0; + p->vp = dest + 2; +} + +static void +paint_hline_IYU2 (paintinfo * p, int x, int y, int w) +{ + int offset; + + offset = y * p->width * 3; + memset_str3 (p->yp + offset + x * 3, p->color->Y, w); + memset_str3 (p->up + offset + x * 3, p->color->U, w); + memset_str3 (p->vp + offset + x * 3, p->color->V, w); +} + +static void paint_setup_Y800 (paintinfo * p, char *dest) { p->yp = dest; @@ -796,6 +819,35 @@ int x2 = (x + w) / 2; int offset = y * p->width; int offset1 = (y / 2) * p->width; + + memset (p->yp + offset + x, p->color->Y, w); + memset (p->up + offset1 + x1, p->color->U, x2 - x1); + memset (p->vp + offset1 + x1, p->color->V, x2 - x1); +} + +static void +paint_setup_YVU9 (paintinfo * p, char *dest) +{ + p->yp = dest; + p->vp = dest + p->width * p->height; + p->up = dest + p->width * p->height + (p->width/4) * (p->height/4); +} + +static void +paint_setup_YUV9 (paintinfo * p, char *dest) +{ + p->yp = dest; + p->up = dest + p->width * p->height; + p->vp = dest + p->width * p->height + (p->width/4) * (p->height/4); +} + +static void +paint_hline_YUV9 (paintinfo * p, int x, int y, int w) +{ + int x1 = x / 4; + int x2 = (x + w) / 4; + int offset = y * p->width; + int offset1 = (y / 4) * (p->width / 4); memset (p->yp + offset + x, p->color->Y, w); memset (p->up + offset1 + x1, p->color->U, x2 - x1); |
From: David S. <dsc...@us...> - 2003-07-27 05:31:14
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sat Jul 26 2003 22:31:13 PDT Log message: Fix handling of RGB caps Modified files: gst/videotestsrc: gstvideotestsrc.c videotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.33&r2=1.34 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstvideotestsrc.c 14 Jul 2003 08:36:03 -0000 1.33 +++ gstvideotestsrc.c 27 Jul 2003 05:31:01 -0000 1.34 @@ -268,6 +268,7 @@ v->pool = gst_pad_get_bufferpool (v->srcpad); break; case GST_STATE_PLAYING_TO_PAUSED: + gst_buffer_pool_unref(v->pool); v->pool = NULL; break; case GST_STATE_READY_TO_NULL: @@ -419,7 +420,7 @@ newsize = (videotestsrc->width * videotestsrc->height * videotestsrc->bpp) >> 3; g_return_val_if_fail (newsize > 0, NULL); - GST_DEBUG ("size=%ld %dx%d\n", newsize, videotestsrc->width, videotestsrc->height); + GST_DEBUG ("size=%ld %dx%d", newsize, videotestsrc->width, videotestsrc->height); buf = NULL; if (videotestsrc->pool) { @@ -431,9 +432,7 @@ } } if (!buf) { - buf = gst_buffer_new (); - GST_BUFFER_SIZE (buf) = newsize; - GST_BUFFER_DATA (buf) = g_malloc (newsize); + buf = gst_buffer_new_and_alloc (newsize); } g_return_val_if_fail (GST_BUFFER_DATA (buf) != NULL, NULL); Index: videotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/videotestsrc.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- videotestsrc.c 14 Jul 2003 08:36:03 -0000 1.8 +++ videotestsrc.c 27 Jul 2003 05:31:01 -0000 1.9 @@ -385,11 +385,11 @@ { int i; const char *mimetype = gst_caps_get_mime(caps); - guint32 format; if(strcmp(mimetype, "video/x-raw-yuv")==0){ char *s; int fourcc; + guint32 format; gst_caps_get(caps, "format", &format); for (i = 0; i < n_fourccs; i++) { @@ -401,7 +401,28 @@ } } }else if(strcmp(mimetype, "video/x-raw-rgb")==0){ - g_warning("video/x-raw-rgb not implemented"); + int red_mask; + int green_mask; + int blue_mask; + int depth; + int bpp; + + gst_caps_get(caps, "red_mask", &red_mask, + "green_mask", &green_mask, + "blue_mask", &blue_mask, + "depth", &depth, + "bpp", &bpp); + for (i = 0; i < n_fourccs; i++) { + if (strcmp(fourcc_list[i].fourcc, "RGB ") == 0 && + fourcc_list[i].red_mask == red_mask && + fourcc_list[i].green_mask == green_mask && + fourcc_list[i].blue_mask == blue_mask && + fourcc_list[i].depth == depth && + fourcc_list[i].bitspp == bpp){ + return fourcc_list + i; + + } + } return NULL; }else{ g_warning("unknown format"); @@ -458,53 +479,21 @@ fourcc = GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], format->fourcc[3]); if(format->ext_caps){ -#if GST_VERSION_MINOR > 6 - caps = GST_CAPS_NEW ("videotestsrc_filter", - "video/x-raw-rgb", - "bpp", GST_PROPS_INT(format->bitspp), - "endianness", GST_PROPS_INT(G_BIG_ENDIAN), - "depth", GST_PROPS_INT(format->depth), - "red_mask", GST_PROPS_INT(format->red_mask), - "green_mask", GST_PROPS_INT(format->green_mask), - "blue_mask", GST_PROPS_INT(format->blue_mask)); -#else - guint32 red_mask; - guint32 green_mask; - guint32 blue_mask; - guint32 endianness; + int endianness; if(format->bitspp==16){ - endianness = G_BYTE_ORDER; - red_mask = format->red_mask; - green_mask = format->green_mask; - blue_mask = format->blue_mask; - }else if(format->bitspp==24){ - endianness = G_BYTE_ORDER; -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - red_mask = GUINT32_SWAP_LE_BE(format->red_mask)>>8; - green_mask = GUINT32_SWAP_LE_BE(format->green_mask)>>8; - blue_mask = GUINT32_SWAP_LE_BE(format->blue_mask)>>8; -#else - red_mask = format->red_mask; - green_mask = format->green_mask; - blue_mask = format->blue_mask; -#endif + endianness = G_BYTE_ORDER; }else{ - endianness = G_BYTE_ORDER; - red_mask = GUINT32_FROM_BE(format->red_mask); - green_mask = GUINT32_FROM_BE(format->green_mask); - blue_mask = GUINT32_FROM_BE(format->blue_mask); + endianness = G_BIG_ENDIAN; } - caps = GST_CAPS_NEW ("videotestsrc_filter", "video/x-raw-rgb", "bpp", GST_PROPS_INT(format->bitspp), "endianness", GST_PROPS_INT(endianness), "depth", GST_PROPS_INT(format->depth), - "red_mask", GST_PROPS_INT(red_mask), - "green_mask", GST_PROPS_INT(green_mask), - "blue_mask", GST_PROPS_INT(blue_mask)); -#endif + "red_mask", GST_PROPS_INT(format->red_mask), + "green_mask", GST_PROPS_INT(format->green_mask), + "blue_mask", GST_PROPS_INT(format->blue_mask)); }else{ caps = GST_CAPS_NEW ("videotestsrc_filter", "video/x-raw-yuv", |
From: David S. <dsc...@us...> - 2003-08-09 23:47:08
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sat Aug 09 2003 16:47:07 PDT Log message: Remove redundant plugindir definition Modified files: gst/videotestsrc: Makefile.am Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Makefile.am 21 May 2003 15:16:50 -0000 1.4 +++ Makefile.am 9 Aug 2003 23:46:33 -0000 1.5 @@ -1,4 +1,3 @@ -plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@ plugin_LTLIBRARIES = libgstvideotestsrc.la |
From: David S. <dsc...@us...> - 2003-09-11 19:25:54
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Thu Sep 11 2003 12:25:53 PDT Log message: Add unlink function to properly handle unreffing bufferpools. Modified files: gst/videotestsrc: Makefile.am gstvideotestsrc.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c.diff?r1=1.34&r2=1.35 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Makefile.am 9 Aug 2003 23:46:33 -0000 1.5 +++ Makefile.am 11 Sep 2003 19:25:39 -0000 1.6 @@ -5,7 +5,7 @@ gstvideotestsrc.c \ videotestsrc.c -libgstvideotestsrc_la_CFLAGS = -O2 $(FOMIT_FRAME_POINTER) $(GST_OPT_CFLAGS) $(GST_FUNROLL_CFLAGS) $(GST_CFLAGS) +libgstvideotestsrc_la_CFLAGS = $(GST_CFLAGS) libgstvideotestsrc_la_LIBADD = libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) Index: gstvideotestsrc.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/videotestsrc/gstvideotestsrc.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstvideotestsrc.c 27 Jul 2003 05:31:01 -0000 1.34 +++ gstvideotestsrc.c 11 Sep 2003 19:25:40 -0000 1.35 @@ -73,8 +73,6 @@ static GstBuffer *gst_videotestsrc_get (GstPad * pad); -static void gst_videotestsrc_reset (GstVideotestsrc *videotestsrc); - static GstElementClass *parent_class = NULL; static GstCaps * gst_videotestsrc_get_capslist (void); @@ -182,20 +180,16 @@ v = GST_VIDEOTESTSRC (element); -#if GST_VERSION_MINOR > 6 gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock); -#else - gst_object_swap ((GstObject **)&v->clock, (GstObject *)clock); -#endif } static GstPadLinkReturn -gst_videotestsrc_srcconnect (GstPad * pad, GstCaps * caps) +gst_videotestsrc_src_link (GstPad * pad, GstCaps * caps) { GstVideotestsrc *videotestsrc; GstCaps *caps1; - GST_DEBUG ("gst_videotestsrc_srcconnect"); + GST_DEBUG ("gst_videotestsrc_src_link"); videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); for ( ; caps != NULL; caps = caps->next) { @@ -253,26 +247,44 @@ GST_DEBUG ("size %d x %d", videotestsrc->width, videotestsrc->height); + videotestsrc->pool = gst_pad_get_bufferpool (videotestsrc->srcpad); + return GST_PAD_LINK_DONE; } +static void +gst_videotestsrc_src_unlink (GstPad * pad) +{ + GstVideotestsrc *videotestsrc; + + videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad)); + + if (videotestsrc->pool) { + gst_buffer_pool_unref (videotestsrc->pool); + } +} + static GstElementStateReturn gst_videotestsrc_change_state (GstElement * element) { - GstVideotestsrc *v; + GstVideotestsrc *videotestsrc; - v = GST_VIDEOTESTSRC (element); + videotestsrc = GST_VIDEOTESTSRC (element); switch (GST_STATE_TRANSITION (element)) { + case GST_STATE_NULL_TO_READY: + break; + case GST_STATE_READY_TO_PAUSED: + break; case GST_STATE_PAUSED_TO_PLAYING: - v->pool = gst_pad_get_bufferpool (v->srcpad); break; case GST_STATE_PLAYING_TO_PAUSED: - gst_buffer_pool_unref(v->pool); - v->pool = NULL; + break; + case GST_STATE_PAUSED_TO_READY: + videotestsrc->timestamp_offset = 0; + videotestsrc->n_frames = 0; break; case GST_STATE_READY_TO_NULL: - gst_videotestsrc_reset (v); break; } @@ -380,23 +392,16 @@ gst_pad_set_getcaps_function (videotestsrc->srcpad, gst_videotestsrc_getcaps); gst_element_add_pad (GST_ELEMENT (videotestsrc), videotestsrc->srcpad); gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get); - gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_srcconnect); + gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_src_link); + gst_pad_set_unlink_function (videotestsrc->srcpad, gst_videotestsrc_src_unlink); videotestsrc->pool = NULL; gst_videotestsrc_set_pattern(videotestsrc, GST_VIDEOTESTSRC_SMPTE); - gst_videotestsrc_reset (videotestsrc); videotestsrc->sync = TRUE; videotestsrc->default_width = 320; videotestsrc->default_height = 240; videotestsrc->default_rate = 30.; -} - -static void -gst_videotestsrc_reset (GstVideotestsrc *videotestsrc) -{ - videotestsrc->timestamp_offset = 0; - videotestsrc->n_frames = 0; } |