diff options
Diffstat (limited to 'gst/chart/gstchart.c')
-rw-r--r-- | gst/chart/gstchart.c | 325 |
1 files changed, 163 insertions, 162 deletions
diff --git a/gst/chart/gstchart.c b/gst/chart/gstchart.c index cafc1416..21832795 100644 --- a/gst/chart/gstchart.c +++ b/gst/chart/gstchart.c @@ -33,11 +33,12 @@ typedef struct _GstChart GstChart; typedef struct _GstChartClass GstChartClass; -struct _GstChart { +struct _GstChart +{ GstElement element; /* pads */ - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* the timestamp of the next frame */ guint64 next_time; @@ -49,16 +50,17 @@ struct _GstChart { gint height; gint samplerate; - gdouble framerate; /* desired frame rate */ - gint samples_between_frames; /* number of samples between start of successive frames */ - gint samples_since_last_frame; /* number of samples between start of successive frames */ + gdouble framerate; /* desired frame rate */ + gint samples_between_frames; /* number of samples between start of successive frames */ + gint samples_since_last_frame; /* number of samples between start of successive frames */ }; -struct _GstChartClass { +struct _GstChartClass +{ GstElementClass parent_class; }; -GType gst_chart_get_type(void); +GType gst_chart_get_type (void); /* elementfactory information */ @@ -70,51 +72,50 @@ static GstElementDetails gst_chart_details = { }; /* signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_RGB_16) -); - -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) TRUE, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 8000, 96000 ], " - "channels = (int) 1") -); - -static void gst_chart_base_init (gpointer g_class); -static void gst_chart_class_init (GstChartClass *klass); -static void gst_chart_init (GstChart *chart); - -static void gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -static void gst_chart_chain (GstPad *pad, GstData *_data); - -static GstPadLinkReturn - gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps); -static GstPadLinkReturn - gst_chart_srcconnect (GstPad *pad, const GstCaps *caps); +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB_16) + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 1") + ); + +static void gst_chart_base_init (gpointer g_class); +static void gst_chart_class_init (GstChartClass * klass); +static void gst_chart_init (GstChart * chart); + +static void gst_chart_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_chart_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_chart_chain (GstPad * pad, GstData * _data); + +static GstPadLinkReturn +gst_chart_sinkconnect (GstPad * pad, const GstCaps * caps); +static GstPadLinkReturn +gst_chart_srcconnect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; @@ -125,17 +126,17 @@ gst_chart_get_type (void) if (!type) { static const GTypeInfo info = { - sizeof(GstChartClass), + sizeof (GstChartClass), gst_chart_base_init, NULL, - (GClassInitFunc)gst_chart_class_init, + (GClassInitFunc) gst_chart_class_init, NULL, NULL, - sizeof(GstChart), + sizeof (GstChart), 0, - (GInstanceInitFunc)gst_chart_init, + (GInstanceInitFunc) gst_chart_init, }; - type = g_type_register_static(GST_TYPE_ELEMENT, "GstChart", &info, 0); + type = g_type_register_static (GST_TYPE_ELEMENT, "GstChart", &info, 0); } return type; } @@ -145,36 +146,38 @@ gst_chart_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &gst_chart_details); } static void -gst_chart_class_init(GstChartClass *klass) +gst_chart_class_init (GstChartClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_chart_set_property; gobject_class->get_property = gst_chart_get_property; } static void -gst_chart_init (GstChart *chart) +gst_chart_init (GstChart * chart) { /* create the sink and src pads */ - chart->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_factory), - "sink"); - chart->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_factory), - "src"); + chart->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), + "sink"); + chart->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), + "src"); gst_element_add_pad (GST_ELEMENT (chart), chart->sinkpad); gst_element_add_pad (GST_ELEMENT (chart), chart->srcpad); @@ -191,13 +194,13 @@ gst_chart_init (GstChart *chart) chart->height = 128; chart->samplerate = -1; - chart->framerate = 25; /* desired frame rate */ - chart->samples_between_frames = 0; /* number of samples between start of successive frames */ + chart->framerate = 25; /* desired frame rate */ + chart->samples_between_frames = 0; /* number of samples between start of successive frames */ chart->samples_since_last_frame = 0; } static GstPadLinkReturn -gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_chart_sinkconnect (GstPad * pad, const GstCaps * caps) { GstChart *chart; GstStructure *structure; @@ -209,15 +212,14 @@ gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "rate", &chart->samplerate); chart->samples_between_frames = chart->samplerate / chart->framerate; - GST_DEBUG ("CHART: new sink caps: rate %d", - chart->samplerate); + GST_DEBUG ("CHART: new sink caps: rate %d", chart->samplerate); /*gst_chart_sync_parms (chart); */ /* */ return GST_PAD_LINK_OK; } static GstPadLinkReturn -gst_chart_srcconnect (GstPad *pad, const GstCaps*caps) +gst_chart_srcconnect (GstPad * pad, const GstCaps * caps) { GstChart *chart; GstStructure *structure; @@ -234,63 +236,64 @@ gst_chart_srcconnect (GstPad *pad, const GstCaps*caps) gst_structure_get_int (structure, "height", &chart->height); GST_DEBUG ("CHART: new src caps: framerate %f, %dx%d", - chart->framerate, chart->width, chart->height); + chart->framerate, chart->width, chart->height); return GST_PAD_LINK_OK; } static void -draw_chart_16bpp(guchar * output, gint width, gint height, - gint16 * src_data, gint src_size) +draw_chart_16bpp (guchar * output, gint width, gint height, + gint16 * src_data, gint src_size) { - gint i; - guint16 *colstart; - gint16 * in; - - GST_DEBUG ("CHART: drawing frame to %p, width = %d, height = %d, src_data = %p, src_size = %d", - output, width, height, src_data, src_size); - - for (colstart = (guint16 *)output, in = (gint16 *)src_data, i = 0; - i < width; - colstart++, in++, i++) { - guint16 * pos = colstart; - gint h1; - - h1 = (((gint)(*in)) * height / (1 << 16)) + height / 2; - if (h1 >= height) h1 = height; - - if (h1 < height / 2) { - while (pos < colstart + h1 * width) { - *pos = 0x0000; - pos += width; - } - while (pos < colstart + height / 2 * width) { - *pos = 0x07e0; - pos += width; - } - while (pos < colstart + height * width) { - *pos = 0x0000; - pos += width; - } - } else { - while (pos < colstart + height / 2 * width) { - *pos = 0x0000; - pos += width; - } - while (pos < colstart + h1 * width) { - *pos = 0x07e0; - pos += width; - } - while (pos < colstart + height * width) { - *pos = 0x0000; - pos += width; - } - } + gint i; + guint16 *colstart; + gint16 *in; + + GST_DEBUG + ("CHART: drawing frame to %p, width = %d, height = %d, src_data = %p, src_size = %d", + output, width, height, src_data, src_size); + + for (colstart = (guint16 *) output, in = (gint16 *) src_data, i = 0; + i < width; colstart++, in++, i++) { + guint16 *pos = colstart; + gint h1; + + h1 = (((gint) (*in)) * height / (1 << 16)) + height / 2; + if (h1 >= height) + h1 = height; + + if (h1 < height / 2) { + while (pos < colstart + h1 * width) { + *pos = 0x0000; + pos += width; + } + while (pos < colstart + height / 2 * width) { + *pos = 0x07e0; + pos += width; + } + while (pos < colstart + height * width) { + *pos = 0x0000; + pos += width; + } + } else { + while (pos < colstart + height / 2 * width) { + *pos = 0x0000; + pos += width; + } + while (pos < colstart + h1 * width) { + *pos = 0x07e0; + pos += width; + } + while (pos < colstart + height * width) { + *pos = 0x0000; + pos += width; + } } + } } static void -gst_chart_chain (GstPad *pad, GstData *_data) +gst_chart_chain (GstPad * pad, GstData * _data) { GstBuffer *bufin = GST_BUFFER (_data); GstChart *chart; @@ -302,14 +305,14 @@ gst_chart_chain (GstPad *pad, GstData *_data) g_return_if_fail (bufin != NULL); g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD(pad)); - g_return_if_fail (GST_IS_CHART(GST_OBJECT_PARENT(pad))); - chart = GST_CHART(GST_OBJECT_PARENT (pad)); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (GST_IS_CHART (GST_OBJECT_PARENT (pad))); + chart = GST_CHART (GST_OBJECT_PARENT (pad)); g_return_if_fail (chart != NULL); GST_DEBUG ("CHART: chainfunc called"); - samples_in = GST_BUFFER_SIZE (bufin) / sizeof(gint16); + samples_in = GST_BUFFER_SIZE (bufin) / sizeof (gint16); datain = (gint16 *) (GST_BUFFER_DATA (bufin)); GST_DEBUG ("input buffer has %d samples", samples_in); if (chart->next_time <= GST_BUFFER_TIMESTAMP (bufin)) { @@ -319,43 +322,45 @@ gst_chart_chain (GstPad *pad, GstData *_data) chart->samples_since_last_frame += samples_in; if (chart->samples_between_frames <= chart->samples_since_last_frame) { - chart->samples_since_last_frame = 0; - - /* get data to draw into buffer */ - if (samples_in >= chart->width) { - /* make a new buffer for the output */ - bufout = gst_buffer_new (); - sizeout = chart->bpp / 8 * chart->width * chart->height; - dataout = g_malloc (sizeout); - GST_BUFFER_SIZE(bufout) = sizeout; - GST_BUFFER_DATA(bufout) = dataout; - GST_DEBUG ("CHART: made new buffer: size %d, width %d, height %d", - sizeout, chart->width, chart->height); - - /* take data and draw to new buffer */ - /* FIXME: call different routines for different properties */ - draw_chart_16bpp(dataout, chart->width, chart->height, (gint16 *)datain, samples_in); - - gst_buffer_unref(bufin); - - /* set timestamp */ - GST_BUFFER_TIMESTAMP (bufout) = chart->next_time; - - GST_DEBUG ("CHART: outputting buffer"); - /* output buffer */ - GST_BUFFER_FLAG_SET (bufout, GST_BUFFER_READONLY); - gst_pad_push (chart->srcpad, GST_DATA (bufout)); - } + chart->samples_since_last_frame = 0; + + /* get data to draw into buffer */ + if (samples_in >= chart->width) { + /* make a new buffer for the output */ + bufout = gst_buffer_new (); + sizeout = chart->bpp / 8 * chart->width * chart->height; + dataout = g_malloc (sizeout); + GST_BUFFER_SIZE (bufout) = sizeout; + GST_BUFFER_DATA (bufout) = dataout; + GST_DEBUG ("CHART: made new buffer: size %d, width %d, height %d", + sizeout, chart->width, chart->height); + + /* take data and draw to new buffer */ + /* FIXME: call different routines for different properties */ + draw_chart_16bpp (dataout, chart->width, chart->height, (gint16 *) datain, + samples_in); + + gst_buffer_unref (bufin); + + /* set timestamp */ + GST_BUFFER_TIMESTAMP (bufout) = chart->next_time; + + GST_DEBUG ("CHART: outputting buffer"); + /* output buffer */ + GST_BUFFER_FLAG_SET (bufout, GST_BUFFER_READONLY); + gst_pad_push (chart->srcpad, GST_DATA (bufout)); + } } else { - GST_DEBUG ("CHART: skipping buffer"); - gst_buffer_unref(bufin); + GST_DEBUG ("CHART: skipping buffer"); + gst_buffer_unref (bufin); } GST_DEBUG ("CHART: exiting chainfunc"); } static void -gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_chart_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstChart *chart; @@ -370,7 +375,8 @@ gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GPa } static void -gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_chart_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstChart *chart; @@ -385,21 +391,16 @@ gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "chart", GST_RANK_NONE, GST_TYPE_CHART)) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "chart", - "Takes frames of data and outputs video frames of a chart of data", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "chart", + "Takes frames of data and outputs video frames of a chart of data", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) |