From 5d25c00e4b613b9cdf2c04fa3a68dffa03834a68 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sun, 14 Mar 2004 22:34:33 +0000 Subject: gst-indent Original commit message from CVS: gst-indent --- ChangeLog | 4 + examples/capsfilter/capsfilter1.c | 19 +- examples/dynparams/filter.c | 294 ++-- examples/gstplay/player.c | 46 +- examples/indexing/indexmpeg.c | 141 +- examples/seeking/cdparanoia.c | 60 +- examples/seeking/cdplayer.c | 104 +- examples/seeking/seek.c | 291 ++-- examples/seeking/spider_seek.c | 127 +- examples/seeking/vorbisfile.c | 81 +- examples/stats/mp2ogg.c | 41 +- examples/switch/switcher.c | 49 +- ext/aalib/gstaasink.c | 295 ++-- ext/aalib/gstaasink.h | 66 +- ext/dv/gstdvdec.h | 85 +- ext/esd/esdmon.c | 228 ++- ext/esd/esdmon.h | 23 +- ext/esd/esdsink.c | 240 +-- ext/esd/esdsink.h | 47 +- ext/esd/gstesd.c | 31 +- ext/flac/flac_compat.h | 2 +- ext/flac/gstflac.c | 28 +- ext/flac/gstflacdec.c | 513 ++++--- ext/flac/gstflacdec.h | 55 +- ext/flac/gstflacenc.c | 646 ++++---- ext/flac/gstflacenc.h | 57 +- ext/flac/gstflactag.c | 230 +-- ext/gdk_pixbuf/gst_loader.c | 144 +- ext/gdk_pixbuf/gstgdkanimation.c | 340 +++-- ext/gdk_pixbuf/gstgdkanimation.h | 72 +- ext/gdk_pixbuf/gstgdkpixbuf.c | 304 ++-- ext/gdk_pixbuf/gstgdkpixbuf.h | 9 +- ext/jpeg/gstjpeg.c | 27 +- ext/jpeg/gstjpegdec.c | 360 ++--- ext/jpeg/gstjpegdec.h | 67 +- ext/jpeg/gstjpegenc.c | 226 +-- ext/jpeg/gstjpegenc.h | 69 +- ext/ladspa/gstladspa.c | 820 +++++----- ext/ladspa/gstladspa.h | 78 +- ext/ladspa/load.c | 121 +- ext/ladspa/search.c | 92 +- ext/ladspa/utils.h | 18 +- ext/libcaca/gstcacasink.c | 254 ++-- ext/libcaca/gstcacasink.h | 60 +- ext/libpng/gstpng.c | 14 +- ext/libpng/gstpngenc.c | 115 +- ext/libpng/gstpngenc.h | 47 +- ext/mikmod/drv_gst.c | 118 +- ext/mikmod/gstmikmod.c | 382 +++-- ext/mikmod/gstmikmod.h | 115 +- ext/mikmod/mikmod_reader.c | 99 +- ext/mikmod/mikmod_types.c | 318 ++-- ext/mikmod/mikmod_types.h | 35 +- ext/pango/gsttextoverlay.c | 901 ++++++----- ext/pango/gsttextoverlay.h | 73 +- ext/pango/gsttimeoverlay.c | 170 +-- ext/pango/gsttimeoverlay.h | 12 +- ext/raw1394/gst1394.c | 22 +- ext/raw1394/gstdv1394src.c | 408 ++--- ext/raw1394/gstdv1394src.h | 63 +- ext/shout2/gstshout2.c | 660 ++++---- ext/shout2/gstshout2.h | 64 +- ext/speex/gstspeex.c | 25 +- ext/speex/gstspeexdec.c | 125 +- ext/speex/gstspeexdec.h | 33 +- ext/speex/gstspeexenc.c | 133 +- ext/speex/gstspeexenc.h | 60 +- gst/audiofx/audiowsincband.c | 185 +-- gst/audiofx/audiowsinclimit.c | 138 +- gst/auparse/gstauparse.c | 170 +-- gst/auparse/gstauparse.h | 43 +- gst/avi/avi-ids.h | 25 +- gst/avi/gstavi.c | 26 +- gst/avi/gstavidecoder.c | 273 ++-- gst/avi/gstavidemux.c | 774 +++++----- gst/avi/gstavidemux.h | 88 +- gst/avi/gstavimux.c | 1241 +++++++-------- gst/avi/gstavimux.h | 121 +- gst/cutter/gstcutter.c | 322 ++-- gst/cutter/gstcutter.h | 59 +- gst/debug/efence.c | 308 ++-- gst/debug/efence.h | 35 +- gst/debug/gstnavigationtest.c | 179 +-- gst/debug/gstnavigationtest.h | 12 +- gst/effectv/gstaging.c | 155 +- gst/effectv/gstdice.c | 222 +-- gst/effectv/gstedge.c | 72 +- gst/effectv/gsteffectv.c | 62 +- gst/effectv/gstquark.c | 153 +- gst/effectv/gstrev.c | 83 +- gst/effectv/gstshagadelic.c | 114 +- gst/effectv/gstvertigo.c | 147 +- gst/effectv/gstwarp.c | 199 +-- gst/flx/flx_color.c | 58 +- gst/flx/flx_color.h | 28 +- gst/flx/flx_fmt.h | 197 +-- gst/flx/gstflxdec.c | 565 ++++--- gst/flx/gstflxdec.h | 60 +- gst/goom/filters.c | 764 +++++----- gst/goom/filters.h | 31 +- gst/goom/goom_core.c | 715 +++++---- gst/goom/goom_core.h | 2 +- gst/goom/goom_tools.h | 6 +- gst/goom/graphic.c | 26 +- gst/goom/graphic.h | 8 +- gst/goom/gstgoom.c | 168 +-- gst/goom/lines.c | 143 +- gst/goom/lines.h | 6 +- gst/law/alaw-decode.c | 172 ++- gst/law/alaw-decode.h | 33 +- gst/law/alaw-encode.c | 213 +-- gst/law/alaw-encode.h | 33 +- gst/law/alaw.c | 56 +- gst/law/mulaw-conversion.c | 104 +- gst/law/mulaw-conversion.h | 6 +- gst/law/mulaw-decode.c | 136 +- gst/law/mulaw-decode.h | 33 +- gst/law/mulaw-encode.c | 135 +- gst/law/mulaw-encode.h | 33 +- gst/law/mulaw.c | 60 +- gst/level/demo.c | 21 +- gst/level/gstlevel.c | 323 ++-- gst/level/gstlevel.h | 83 +- gst/level/plot.c | 43 +- gst/matroska/ebml-ids.h | 8 +- gst/matroska/ebml-read.c | 253 ++-- gst/matroska/ebml-read.h | 68 +- gst/matroska/ebml-write.c | 126 +- gst/matroska/ebml-write.h | 72 +- gst/matroska/matroska-demux.c | 2670 ++++++++++++++++----------------- gst/matroska/matroska-demux.h | 61 +- gst/matroska/matroska-ids.h | 92 +- gst/matroska/matroska-mux.c | 443 +++--- gst/matroska/matroska-mux.h | 51 +- gst/matroska/matroska.c | 20 +- gst/median/gstmedian.c | 280 ++-- gst/median/gstmedian.h | 41 +- gst/monoscope/convolve.c | 438 +++--- gst/monoscope/convolve.h | 14 +- gst/monoscope/gstmonoscope.c | 124 +- gst/monoscope/monoscope.c | 184 +-- gst/monoscope/monoscope.h | 21 +- gst/qtdemux/qtdemux.c | 2016 +++++++++++++------------ gst/qtdemux/qtdemux.h | 57 +- gst/rtp/gstrtp-common.h | 2 +- gst/rtp/gstrtp.c | 18 +- gst/rtp/gstrtpL16depay.c | 128 +- gst/rtp/gstrtpL16depay.h | 32 +- gst/rtp/gstrtpL16enc.c | 107 +- gst/rtp/gstrtpL16enc.h | 44 +- gst/rtp/gstrtpL16parse.c | 128 +- gst/rtp/gstrtpL16parse.h | 32 +- gst/rtp/gstrtpL16pay.c | 107 +- gst/rtp/gstrtpL16pay.h | 44 +- gst/rtp/gstrtpgsmdepay.c | 95 +- gst/rtp/gstrtpgsmdepay.h | 28 +- gst/rtp/gstrtpgsmenc.c | 88 +- gst/rtp/gstrtpgsmenc.h | 42 +- gst/rtp/gstrtpgsmparse.c | 95 +- gst/rtp/gstrtpgsmparse.h | 28 +- gst/rtp/gstrtpgsmpay.c | 88 +- gst/rtp/gstrtpgsmpay.h | 42 +- gst/rtp/rtp-packet.c | 189 ++- gst/rtp/rtp-packet.h | 107 +- gst/smoothwave/demo-osssrc.c | 57 +- gst/smoothwave/gstsmoothwave.c | 202 ++- gst/smoothwave/gstsmoothwave.h | 39 +- gst/smpte/barboxwipes.c | 1186 ++++++++------- gst/smpte/gstmask.c | 20 +- gst/smpte/gstmask.h | 50 +- gst/smpte/gstsmpte.c | 292 ++-- gst/smpte/gstsmpte.h | 32 +- gst/smpte/paint.c | 162 +- gst/smpte/paint.h | 31 +- gst/spectrum/gstspectrum.c | 157 +- gst/spectrum/gstspectrum.h | 33 +- gst/udp/gstudp.c | 23 +- gst/udp/gstudp.h | 5 +- gst/udp/gstudpsink.c | 325 ++-- gst/udp/gstudpsink.h | 62 +- gst/udp/gstudpsrc.c | 341 +++-- gst/udp/gstudpsrc.h | 60 +- gst/videocrop/gstvideocrop.c | 218 +-- gst/videofilter/gstgamma.c | 242 +-- gst/videofilter/gstvideobalance.c | 313 ++-- gst/videofilter/gstvideobalance.h | 15 +- gst/videofilter/gstvideofilter.c | 346 +++-- gst/videofilter/gstvideofilter.h | 43 +- gst/videofilter/gstvideoflip.c | 272 ++-- gst/videofilter/gstvideoflip.h | 15 +- gst/videofilter/gstvideotemplate.c | 132 +- gst/videoflip/gstvideoflip.c | 264 ++-- gst/videoflip/gstvideoflip.h | 20 +- gst/videoflip/videoflip.c | 138 +- gst/videoflip/videoflip.h | 24 +- gst/wavenc/gstwavenc.c | 737 +++++---- gst/wavenc/gstwavenc.h | 13 +- gst/wavenc/riff.h | 171 ++- gst/wavparse/gstwavparse.c | 1090 +++++++------- gst/wavparse/gstwavparse.h | 114 +- gst/wavparse/riff.h | 171 ++- sys/oss/gstossaudio.c | 24 +- sys/oss/gstosselement.c | 570 ++++--- sys/oss/gstosselement.h | 82 +- sys/oss/gstossmixer.c | 207 ++- sys/oss/gstossmixer.h | 23 +- sys/oss/gstosssink.c | 397 ++--- sys/oss/gstosssink.h | 40 +- sys/oss/gstosssrc.c | 332 ++-- sys/oss/gstosssrc.h | 30 +- sys/v4l2/gstv4l2.c | 22 +- sys/v4l2/gstv4l2colorbalance.c | 60 +- sys/v4l2/gstv4l2colorbalance.h | 12 +- sys/v4l2/gstv4l2element.c | 731 +++++---- sys/v4l2/gstv4l2element.h | 68 +- sys/v4l2/gstv4l2src.c | 856 ++++++----- sys/v4l2/gstv4l2src.h | 97 +- sys/v4l2/gstv4l2tuner.c | 108 +- sys/v4l2/gstv4l2tuner.h | 28 +- sys/v4l2/gstv4l2xoverlay.c | 40 +- sys/v4l2/gstv4l2xoverlay.h | 13 +- sys/v4l2/v4l2-overlay_calls.c | 144 +- sys/v4l2/v4l2_calls.c | 942 ++++++------ sys/v4l2/v4l2_calls.h | 60 +- sys/v4l2/v4l2src_calls.c | 304 ++-- sys/v4l2/v4l2src_calls.h | 41 +- tests/examples/spectrum/demo-osssrc.c | 78 +- tests/old/examples/switch/switcher.c | 49 +- 228 files changed, 20902 insertions(+), 20677 deletions(-) diff --git a/ChangeLog b/ChangeLog index f7605747..ca8989c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-03-14 Thomas Vander Stichele + + * *.c, *.h: run gst-indent + 2004-03-14 Benjamin Otte * gst/modplug/gstmodplug.cc: diff --git a/examples/capsfilter/capsfilter1.c b/examples/capsfilter/capsfilter1.c index 4d71109f..46e127a2 100644 --- a/examples/capsfilter/capsfilter1.c +++ b/examples/capsfilter/capsfilter1.c @@ -6,7 +6,7 @@ * connection would use the I420 format (assuming Xv is enabled) */ static void -new_pad_func (GstElement *element, GstPad *newpad, gpointer data) +new_pad_func (GstElement * element, GstPad * newpad, gpointer data) { GstElement *pipeline = (GstElement *) data; GstElement *queue = gst_bin_get_by_name (GST_BIN (pipeline), "queue"); @@ -19,7 +19,7 @@ new_pad_func (GstElement *element, GstPad *newpad, gpointer data) } gint -main (gint argc, gchar *argv[]) +main (gint argc, gchar * argv[]) { GstElement *pipeline; GstElement *filesrc; @@ -44,7 +44,8 @@ main (gint argc, gchar *argv[]) g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL); demux = gst_element_factory_make ("mpegdemux", "demux"); g_return_val_if_fail (demux, -1); - g_signal_connect (G_OBJECT (demux), "new_pad", G_CALLBACK (new_pad_func), pipeline); + g_signal_connect (G_OBJECT (demux), "new_pad", G_CALLBACK (new_pad_func), + pipeline); thread = gst_thread_new ("thread"); queue = gst_element_factory_make ("queue", "queue"); @@ -58,7 +59,7 @@ main (gint argc, gchar *argv[]) gst_bin_add (GST_BIN (pipeline), filesrc); gst_bin_add (GST_BIN (pipeline), demux); - + gst_bin_add (GST_BIN (thread), queue); gst_bin_add (GST_BIN (thread), mpeg2dec); gst_bin_add (GST_BIN (thread), colorspace); @@ -70,11 +71,9 @@ main (gint argc, gchar *argv[]) gst_element_link (mpeg2dec, "src", colorspace, "sink"); /* force RGB data passing between colorspace and xvideosink */ res = gst_element_link_filtered (colorspace, "src", xvideosink, "sink", - GST_CAPS_NEW ( - "filtercaps", - "video/raw", - "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")) - )); + GST_CAPS_NEW ("filtercaps", + "video/raw", "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")) + )); if (!res) { g_print ("could not connect colorspace and xvideosink\n"); return -1; @@ -83,7 +82,7 @@ main (gint argc, gchar *argv[]) gst_element_set_state (pipeline, GST_STATE_PLAYING); while (gst_bin_iterate (GST_BIN (pipeline))); - + gst_element_set_state (pipeline, GST_STATE_NULL); return 0; diff --git a/examples/dynparams/filter.c b/examples/dynparams/filter.c index ed0dd5aa..982a4c7a 100644 --- a/examples/dynparams/filter.c +++ b/examples/dynparams/filter.c @@ -18,13 +18,13 @@ struct _filter_ui GtkWidget *window; /* top-level interface window */ GtkWidget *buttons; /* all of the control buttons */ - GtkWidget *parse, *play, *stop; /* control buttons */ - + GtkWidget *parse, *play, *stop; /* control buttons */ + GtkWidget *feedback; /* here's where we'll tell you stuff */ GtkTextBuffer *fb_buffer; /* feedback buffer */ GtkWidget *selection; /* the place to input element stuff */ - GtkWidget *input, *filter, *output; /* the selection widgets */ - + GtkWidget *input, *filter, *output; /* the selection widgets */ + GtkWidget *control; /* the dynamically generated control UI */ }; @@ -33,13 +33,13 @@ typedef struct _filter_ui _filter_ui_t; /* back-end data */ struct _filter_data { - _filter_ui_t *ui; /* the UI data */ + _filter_ui_t *ui; /* the UI data */ gchar *input_pipe, *output_pipe, *filter_element; gchar *pipe_string; GList *filter_choices; gboolean playing; - GstElement *input, *output; /* these are in and out bins */ + GstElement *input, *output; /* these are in and out bins */ GstElement *pipeline; GstElement *filter; }; @@ -47,17 +47,18 @@ struct _filter_data typedef struct _filter_data _filter_data_t; /* internal prototypes when they can't be avoided */ -void cb_remove_and_destroy (GtkWidget *widget, gpointer user_data); -//void cb_dynparm_value_changed (GtkWidget *widget, gpointer user_data); -void cb_dynparm_value_changed (GtkRange *range, GstDParam *dparam); +void cb_remove_and_destroy (GtkWidget * widget, gpointer user_data); + +//void cb_dynparm_value_changed (GtkWidget *widget, gpointer user_data); +void cb_dynparm_value_changed (GtkRange * range, GstDParam * dparam); /* GStreamer helper functions go here */ - + /* go through a bin, finding the one pad that is unconnected in the given * direction, and return a ghost pad */ GstPad * -gst_bin_find_unconnected_pad (GstBin *bin, GstPadDirection direction, - gchar *name) +gst_bin_find_unconnected_pad (GstBin * bin, GstPadDirection direction, + gchar * name) { GstPad *pad = NULL; GList *elements = NULL; @@ -67,39 +68,36 @@ gst_bin_find_unconnected_pad (GstBin *bin, GstPadDirection direction, g_print ("DEBUG: find_unconnected start\n"); elements = (GList *) gst_bin_get_list (bin); /* traverse all elements looking for unconnected pads */ - while (elements && pad == NULL) - { + while (elements && pad == NULL) { element = GST_ELEMENT (elements->data); g_print ("DEBUG: looking in element %s\n", gst_element_get_name (element)); pads = gst_element_get_pad_list (element); - while (pads) - { + while (pads) { /* check if the direction matches */ - if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == direction) - { - if (GST_PAD_PEER (GST_PAD (pads->data)) == NULL) - { + if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == direction) { + if (GST_PAD_PEER (GST_PAD (pads->data)) == NULL) { /* found it ! */ g_print ("DEBUG: found an unconnected pad !\n"); pad = GST_PAD (pads->data); } } - if (pad) break; /* found one already */ + if (pad) + break; /* found one already */ pads = g_list_next (pads); } elements = g_list_next (elements); } g_print ("DEBUG: find_unconnected stop\n"); - if (pad == NULL) /* we didn't find it at all */ + if (pad == NULL) /* we didn't find it at all */ return NULL; - + pad = gst_ghost_pad_new (name, pad); return pad; } void -ui_feedback_add_text (_filter_ui_t *ui, const gchar *text) +ui_feedback_add_text (_filter_ui_t * ui, const gchar * text) { GtkTextIter iter; @@ -108,7 +106,7 @@ ui_feedback_add_text (_filter_ui_t *ui, const gchar *text) } void -ui_feedback_add (_filter_ui_t *ui, const gchar *format, ...) +ui_feedback_add (_filter_ui_t * ui, const gchar * format, ...) { va_list args; gchar *buffer = NULL; @@ -121,7 +119,7 @@ ui_feedback_add (_filter_ui_t *ui, const gchar *format, ...) } void -ui_feedback_clear (_filter_ui_t *ui) +ui_feedback_clear (_filter_ui_t * ui) { gtk_text_buffer_set_text (ui->fb_buffer, "", 0); } @@ -129,7 +127,7 @@ ui_feedback_clear (_filter_ui_t *ui) /* create the control widget using the element's dynparams * control is a vbox which we need to empty first */ void -ui_control_create (GstElement *element, GtkWidget *control, _filter_ui_t *ui) +ui_control_create (GstElement * element, GtkWidget * control, _filter_ui_t * ui) { GtkWidget *hbox = NULL; GtkWidget *widget = NULL; @@ -137,70 +135,63 @@ ui_control_create (GstElement *element, GtkWidget *control, _filter_ui_t *ui) GstDParam *dparam = NULL; GParamSpec **specs = NULL; int i = 0; - + g_assert (GTK_IS_VBOX (control)); /* empty control vbox */ g_print ("DEBUG: emptying control widget\n"); - gtk_container_foreach (GTK_CONTAINER (control), cb_remove_and_destroy, - (gpointer) control); + gtk_container_foreach (GTK_CONTAINER (control), cb_remove_and_destroy, + (gpointer) control); g_print ("DEBUG: adding label to control widget\n"); widget = gtk_label_new ("Dynamic Parameters"); gtk_container_add (GTK_CONTAINER (control), widget); gtk_widget_show (widget); - - if ((dpman = gst_dpman_get_manager (element))) - { + + if ((dpman = gst_dpman_get_manager (element))) { ui_feedback_add (ui, "Found Dynamic Parameters on filter element.\n"); specs = gst_dpman_list_dparam_specs (dpman); - for (i = 0; specs[i] != NULL; ++i) - { + for (i = 0; specs[i] != NULL; ++i) { hbox = gtk_hbox_new (FALSE, 0); widget = gtk_label_new (g_param_spec_get_name (specs[i])); gtk_container_add (GTK_CONTAINER (hbox), widget); gtk_widget_show (widget); - switch (G_PARAM_SPEC_VALUE_TYPE (specs[i])) - { - case G_TYPE_INT64: + switch (G_PARAM_SPEC_VALUE_TYPE (specs[i])) { + case G_TYPE_INT64: widget = gtk_hscale_new_with_range ( - (gdouble) (((GParamSpecInt64*)specs[i])->minimum), - (gdouble) (((GParamSpecInt64*)specs[i])->maximum), - 1.0); + (gdouble) (((GParamSpecInt64 *) specs[i])->minimum), + (gdouble) (((GParamSpecInt64 *) specs[i])->maximum), 1.0); gtk_range_set_value (GTK_RANGE (widget), - (gdouble) ((GParamSpecInt64*)specs[i])->default_value); - break; + (gdouble) ((GParamSpecInt64 *) specs[i])->default_value); + break; case G_TYPE_INT: widget = gtk_hscale_new_with_range ( - (gdouble) (((GParamSpecInt*)specs[i])->minimum), - (gdouble) (((GParamSpecInt*)specs[i])->maximum), - 1.0); + (gdouble) (((GParamSpecInt *) specs[i])->minimum), + (gdouble) (((GParamSpecInt *) specs[i])->maximum), 1.0); gtk_range_set_value (GTK_RANGE (widget), - (gdouble) ((GParamSpecInt*)specs[i])->default_value); - break; - case G_TYPE_FLOAT: + (gdouble) ((GParamSpecInt *) specs[i])->default_value); + break; + case G_TYPE_FLOAT: widget = gtk_hscale_new_with_range ( - (gdouble) (((GParamSpecFloat*)specs[i])->minimum), - (gdouble) (((GParamSpecFloat*)specs[i])->maximum), - 0.00001); + (gdouble) (((GParamSpecFloat *) specs[i])->minimum), + (gdouble) (((GParamSpecFloat *) specs[i])->maximum), 0.00001); gtk_range_set_value (GTK_RANGE (widget), - (gdouble) ((GParamSpecFloat*)specs[i])->default_value); + (gdouble) ((GParamSpecFloat *) specs[i])->default_value); break; } /* create the dparam object */ dparam = gst_dpsmooth_new (G_PARAM_SPEC_VALUE_TYPE (specs[i])); g_object_set (G_OBJECT (dparam), "update_period", 2000000LL, NULL); - g_assert (gst_dpman_attach_dparam (dpman, - (gchar *) g_param_spec_get_name (specs[i]), - dparam)); - gst_dpman_set_mode(dpman, "asynchronous"); + g_assert (gst_dpman_attach_dparam (dpman, + (gchar *) g_param_spec_get_name (specs[i]), dparam)); + gst_dpman_set_mode (dpman, "asynchronous"); g_signal_connect (widget, "value-changed", - G_CALLBACK (cb_dynparm_value_changed), dparam); + G_CALLBACK (cb_dynparm_value_changed), dparam); cb_dynparm_value_changed (GTK_RANGE (widget), dparam); - + gtk_container_add (GTK_CONTAINER (hbox), widget); - gtk_widget_show (widget); + gtk_widget_show (widget); } gtk_container_add (GTK_CONTAINER (control), hbox); gtk_widget_show (hbox); @@ -209,7 +200,7 @@ ui_control_create (GstElement *element, GtkWidget *control, _filter_ui_t *ui) /* all the pretty callbacks gather here please */ void -cb_remove_and_destroy (GtkWidget *widget, gpointer user_data) +cb_remove_and_destroy (GtkWidget * widget, gpointer user_data) { GtkContainer *container = GTK_CONTAINER (user_data); @@ -220,55 +211,51 @@ cb_remove_and_destroy (GtkWidget *widget, gpointer user_data) /* when the scale associated with a dparam changes, respond */ void -cb_dynparm_value_changed (GtkRange *range, GstDParam *dparam) +cb_dynparm_value_changed (GtkRange * range, GstDParam * dparam) { /* - GstDParam *dparam = GST_DPARAM (user_data); - GtkHScale *adj = GTK_HSCALE (widget); - */ + GstDParam *dparam = GST_DPARAM (user_data); + GtkHScale *adj = GTK_HSCALE (widget); + */ gdouble value = 0.0; + g_assert (GST_IS_DPARAM (dparam)); g_assert (GTK_IS_RANGE (range)); value = gtk_range_get_value (range); - g_print ("DEBUG: setting value to %f\n", value); + g_print ("DEBUG: setting value to %f\n", value); - switch (G_PARAM_SPEC_VALUE_TYPE (GST_DPARAM_PARAM_SPEC (dparam))) - { + switch (G_PARAM_SPEC_VALUE_TYPE (GST_DPARAM_PARAM_SPEC (dparam))) { case G_TYPE_INT64: - g_object_set (G_OBJECT (dparam), "value_int64", - (gint64) value, NULL); + g_object_set (G_OBJECT (dparam), "value_int64", (gint64) value, NULL); break; case G_TYPE_INT: - g_object_set (G_OBJECT (dparam), "value_int", - (gint) value, NULL); + g_object_set (G_OBJECT (dparam), "value_int", (gint) value, NULL); break; case G_TYPE_FLOAT: - g_object_set (G_OBJECT (dparam), "value_float", - (gfloat) value, NULL); + g_object_set (G_OBJECT (dparam), "value_float", (gfloat) value, NULL); break; } } - + void -cb_entry_activate (GtkEntry *entry, gpointer user_data) +cb_entry_activate (GtkEntry * entry, gpointer user_data) { g_print ("DEBUG: oi ! you activated an entry !\n"); g_print ("DEBUG: pipeline: %s\n", gtk_entry_get_text (entry)); } void -cb_play_clicked (GtkButton *button, gpointer *user_data) +cb_play_clicked (GtkButton * button, gpointer * user_data) { _filter_data_t *fd = (_filter_data_t *) user_data; g_return_if_fail (GST_IS_PIPELINE (fd->pipeline)); - if (GST_STATE (fd->pipeline) == GST_STATE_PLAYING) - { + if (GST_STATE (fd->pipeline) == GST_STATE_PLAYING) { ui_feedback_add (fd->ui, "Pipeline is already playing !\n"); return; } @@ -276,12 +263,11 @@ cb_play_clicked (GtkButton *button, gpointer *user_data) } void -cb_stop_clicked (GtkButton *button, gpointer *user_data) +cb_stop_clicked (GtkButton * button, gpointer * user_data) { _filter_data_t *fd = (_filter_data_t *) user_data; - if (GST_STATE (fd->pipeline) != GST_STATE_PLAYING) - { + if (GST_STATE (fd->pipeline) != GST_STATE_PLAYING) { ui_feedback_add (fd->ui, "Pipeline is not playing !\n"); return; } @@ -289,67 +275,72 @@ cb_stop_clicked (GtkButton *button, gpointer *user_data) } void -cb_parse_clicked (GtkButton *button, gpointer *user_data) +cb_parse_clicked (GtkButton * button, gpointer * user_data) { _filter_data_t *fd = (_filter_data_t *) user_data; GtkCombo *filter = GTK_COMBO (fd->ui->filter); GError *error = NULL; GstPad *src_pad, *sink_pad; - + g_print ("DEBUG: you pressed parse.\n"); ui_feedback_clear (fd->ui); ui_feedback_add (fd->ui, "Parsing pipeline ...\n"); - if (fd->input_pipe) g_free (fd->input_pipe); - if (fd->output_pipe) g_free (fd->output_pipe); - if (fd->filter_element) g_free (fd->filter_element); + if (fd->input_pipe) + g_free (fd->input_pipe); + if (fd->output_pipe) + g_free (fd->output_pipe); + if (fd->filter_element) + g_free (fd->filter_element); fd->input_pipe = g_strdup_printf ("bin.( %s )", - gtk_entry_get_text (GTK_ENTRY (fd->ui->input))); + gtk_entry_get_text (GTK_ENTRY (fd->ui->input))); fd->output_pipe = g_strdup_printf ("bin.( %s )", - gtk_entry_get_text (GTK_ENTRY (fd->ui->output))); + gtk_entry_get_text (GTK_ENTRY (fd->ui->output))); /* gtkcombo.h says I can access the entry field directly */ - fd->filter_element = g_strdup (gtk_entry_get_text (GTK_ENTRY (filter->entry))); - g_print ("Input pipeline :\t%s (%d)\n", fd->input_pipe, (int)strlen (fd->input_pipe)); - g_print ("Filter element :\t%s (%d)\n", fd->filter_element, (int)strlen (fd->filter_element)); - g_print ("Output pipeline :\t%s (%d)\n", fd->output_pipe, (int)strlen (fd->output_pipe)); + fd->filter_element = + g_strdup (gtk_entry_get_text (GTK_ENTRY (filter->entry))); + g_print ("Input pipeline :\t%s (%d)\n", fd->input_pipe, + (int) strlen (fd->input_pipe)); + g_print ("Filter element :\t%s (%d)\n", fd->filter_element, + (int) strlen (fd->filter_element)); + g_print ("Output pipeline :\t%s (%d)\n", fd->output_pipe, + (int) strlen (fd->output_pipe)); /* try to create in and out bins */ - if (strlen (fd->input_pipe) == 0) - { + if (strlen (fd->input_pipe) == 0) { ui_feedback_add (fd->ui, "Error : try setting an input pipe.\n"); return; } - if (fd->input) gst_object_unref (GST_OBJECT (fd->input)); + if (fd->input) + gst_object_unref (GST_OBJECT (fd->input)); fd->input = GST_ELEMENT (gst_parse_launch (fd->input_pipe, &error)); - if (error) - { - ui_feedback_add (fd->ui, "Error : parsing input pipeline : %s\n", - error->message); + if (error) { + ui_feedback_add (fd->ui, "Error : parsing input pipeline : %s\n", + error->message); g_error_free (error); return; } - - if (strlen (fd->output_pipe) == 0) - { + + if (strlen (fd->output_pipe) == 0) { ui_feedback_add (fd->ui, "Error : try setting an output pipe.\n"); return; } - if (fd->output) gst_object_unref (GST_OBJECT (fd->output)); + if (fd->output) + gst_object_unref (GST_OBJECT (fd->output)); fd->output = GST_ELEMENT (gst_parse_launch (fd->output_pipe, &error)); - if (error) - { - ui_feedback_add (fd->ui, "Error : parsing output pipeline : %s\n", - error->message); + if (error) { + ui_feedback_add (fd->ui, "Error : parsing output pipeline : %s\n", + error->message); g_error_free (error); return; } /* try to create filter */ - if (fd->filter) gst_object_unref (GST_OBJECT (fd->filter)); + if (fd->filter) + gst_object_unref (GST_OBJECT (fd->filter)); fd->filter = gst_element_factory_make (fd->filter_element, "filter"); - if (fd->filter == NULL) - { + if (fd->filter == NULL) { ui_feedback_add (fd->ui, "Error : could not create element %s\n", - fd->filter_element); + fd->filter_element); return; } @@ -360,35 +351,33 @@ cb_parse_clicked (GtkButton *button, gpointer *user_data) fd->pipeline = gst_thread_new ("toplevel"); /* add the players to it */ - gst_bin_add_many (GST_BIN (fd->pipeline), - fd->input, fd->filter, - fd->output, NULL); + gst_bin_add_many (GST_BIN (fd->pipeline), + fd->input, fd->filter, fd->output, NULL); /* connect filter to input and output bin */ - src_pad = gst_bin_find_unconnected_pad (GST_BIN (fd->input), GST_PAD_SRC, - "source"); - if (src_pad == NULL) - { - ui_feedback_add (fd->ui, - "Error : could not find an unconnected source pad !\n"); + src_pad = gst_bin_find_unconnected_pad (GST_BIN (fd->input), GST_PAD_SRC, + "source"); + if (src_pad == NULL) { + ui_feedback_add (fd->ui, + "Error : could not find an unconnected source pad !\n"); return; } - sink_pad = gst_bin_find_unconnected_pad (GST_BIN (fd->output), GST_PAD_SINK, - "sink"); - if (sink_pad == NULL) - { - ui_feedback_add (fd->ui, - "Error : could not find an unconnected sink pad !\n"); + sink_pad = gst_bin_find_unconnected_pad (GST_BIN (fd->output), GST_PAD_SINK, + "sink"); + if (sink_pad == NULL) { + ui_feedback_add (fd->ui, + "Error : could not find an unconnected sink pad !\n"); return; } gst_element_add_pad (fd->input, src_pad); gst_element_add_pad (fd->output, sink_pad); gst_element_link_many (fd->input, fd->filter, fd->output, NULL); - - if (fd->pipe_string) g_free (fd->pipe_string); + + if (fd->pipe_string) + g_free (fd->pipe_string); fd->pipe_string = g_strdup_printf ("%s ! %s ! %s", fd->input_pipe, - fd->filter_element, fd->output_pipe); + fd->filter_element, fd->output_pipe); g_print ("Pipeline : %s\n", fd->pipe_string); ui_feedback_add (fd->ui, "Complete parsed pipeline: %s\n", fd->pipe_string); @@ -404,12 +393,12 @@ get_filter_choices (void) choices = g_list_append (choices, "volume"); choices = g_list_append (choices, "ladspa_lpf"); choices = g_list_append (choices, "ladspa_hpf"); - + return choices; } void -init_data (_filter_data_t *fd) +init_data (_filter_data_t * fd) { fd->input_pipe = NULL; fd->output_pipe = NULL; @@ -426,11 +415,11 @@ init_data (_filter_data_t *fd) } void -create_ui (_filter_ui_t *fui, _filter_data_t *fd) +create_ui (_filter_ui_t * fui, _filter_data_t * fd) { GtkWidget *widget; /* temporary widget */ GtkWidget *vbox; /* temporary vbox */ - + g_print ("DEBUG: creating top-level window\n"); fui->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); widget = gtk_vbox_new (FALSE, 0); @@ -452,22 +441,22 @@ create_ui (_filter_ui_t *fui, _filter_data_t *fd) fui->parse = gtk_button_new_with_label ("Parse"); gtk_container_add (GTK_CONTAINER (fui->buttons), fui->parse); g_signal_connect (G_OBJECT (fui->parse), "clicked", - G_CALLBACK (cb_parse_clicked), fd); + G_CALLBACK (cb_parse_clicked), fd); fui->play = gtk_button_new_with_label ("Play"); gtk_container_add (GTK_CONTAINER (fui->buttons), fui->play); g_signal_connect (G_OBJECT (fui->play), "clicked", - G_CALLBACK (cb_play_clicked), fd); + G_CALLBACK (cb_play_clicked), fd); fui->stop = gtk_button_new_with_label ("Stop"); gtk_container_add (GTK_CONTAINER (fui->buttons), fui->stop); g_signal_connect (G_OBJECT (fui->stop), "clicked", - G_CALLBACK (cb_stop_clicked), fd); + G_CALLBACK (cb_stop_clicked), fd); /* feedback widget */ fui->fb_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (fui->feedback)); - gtk_text_buffer_set_text (fui->fb_buffer, - "Hello, and welcome to the GStreamer filter demo app !\n"\ + gtk_text_buffer_set_text (fui->fb_buffer, + "Hello, and welcome to the GStreamer filter demo app !\n" "I'll be your feedback window for today.\n", -1); - + /* selection widget */ vbox = gtk_vbox_new (FALSE, 0); widget = gtk_label_new ("Input Pipe"); @@ -476,8 +465,8 @@ create_ui (_filter_ui_t *fui, _filter_data_t *fd) gtk_entry_set_text (GTK_ENTRY (fui->input), "sinesrc"); gtk_container_add (GTK_CONTAINER (vbox), fui->input); gtk_container_add (GTK_CONTAINER (fui->selection), vbox); - g_signal_connect (G_OBJECT (fui->input), "activate", - G_CALLBACK (cb_entry_activate), NULL); + g_signal_connect (G_OBJECT (fui->input), "activate", + G_CALLBACK (cb_entry_activate), NULL); vbox = gtk_vbox_new (FALSE, 0); widget = gtk_label_new ("Filter"); @@ -491,18 +480,18 @@ create_ui (_filter_ui_t *fui, _filter_data_t *fd) widget = gtk_label_new ("Output Pipe"); gtk_container_add (GTK_CONTAINER (vbox), widget); fui->output = gtk_entry_new (); - gtk_entry_set_text (GTK_ENTRY (fui->output), "osssink fragment=1572872"); /* fixme: gconf default ? */ + gtk_entry_set_text (GTK_ENTRY (fui->output), "osssink fragment=1572872"); /* fixme: gconf default ? */ gtk_container_add (GTK_CONTAINER (vbox), fui->output); gtk_container_add (GTK_CONTAINER (fui->selection), vbox); - g_signal_connect (G_OBJECT (fui->output), "activate", - G_CALLBACK (cb_entry_activate), NULL); + g_signal_connect (G_OBJECT (fui->output), "activate", + G_CALLBACK (cb_entry_activate), NULL); /* control widget is dynamically generated */ /* - g_print ("DEBUG: labeling control area.\n"); - widget = gtk_label_new ("This is the big control area."); - gtk_container_add (GTK_CONTAINER (fui->control), widget); - */ + g_print ("DEBUG: labeling control area.\n"); + widget = gtk_label_new ("This is the big control area."); + gtk_container_add (GTK_CONTAINER (fui->control), widget); + */ } @@ -511,8 +500,8 @@ main (int argc, char *argv[]) { _filter_data_t filter_data; _filter_ui_t filter_ui; - - + + gtk_init (&argc, &argv); gst_init (&argc, &argv); gst_control_init (&argc, &argv); @@ -524,7 +513,6 @@ main (int argc, char *argv[]) gtk_widget_show_all (filter_ui.window); gtk_main (); - + return 0; } - diff --git a/examples/gstplay/player.c b/examples/gstplay/player.c index 32001a90..3272778b 100644 --- a/examples/gstplay/player.c +++ b/examples/gstplay/player.c @@ -16,14 +16,14 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + #include static GMainLoop *loop = NULL; static gint64 length = 0; static void -print_tag (const GstTagList *list, const gchar *tag, gpointer unused) +print_tag (const GstTagList * list, const gchar * tag, gpointer unused) { gint i, count; @@ -31,14 +31,14 @@ print_tag (const GstTagList *list, const gchar *tag, gpointer unused) for (i = 0; i < count; i++) { gchar *str; - + if (gst_tag_get_type (tag) == G_TYPE_STRING) { g_assert (gst_tag_list_get_string_index (list, tag, i, &str)); } else { - str = g_strdup_value_contents ( - gst_tag_list_get_value_index (list, tag, i)); + str = + g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i)); } - + if (i == 0) { g_print ("%15s: %s\n", gst_tag_get_nick (tag), str); } else { @@ -50,46 +50,46 @@ print_tag (const GstTagList *list, const gchar *tag, gpointer unused) } static void -got_found_tag (GstPlay *play,GstElement *source, GstTagList *tag_list) +got_found_tag (GstPlay * play, GstElement * source, GstTagList * tag_list) { gst_tag_list_foreach (tag_list, print_tag, NULL); } static void -got_time_tick (GstPlay *play, gint64 time_nanos) +got_time_tick (GstPlay * play, gint64 time_nanos) { g_print ("time tick %f\n", time_nanos / (float) GST_SECOND); } static void -got_stream_length (GstPlay *play, gint64 length_nanos) +got_stream_length (GstPlay * play, gint64 length_nanos) { g_print ("got length %llu\n", length_nanos); length = length_nanos; } static void -got_video_size (GstPlay *play, gint width, gint height) +got_video_size (GstPlay * play, gint width, gint height) { g_print ("got video size %d, %d\n", width, height); } static void -got_eos (GstPlay *play) +got_eos (GstPlay * play) { g_print ("End Of Stream\n"); g_main_loop_quit (loop); } static gboolean -seek_timer (GstPlay *play) +seek_timer (GstPlay * play) { gst_play_seek_to_time (play, length / 2); return FALSE; } static gboolean -idle_iterate (GstPlay *play) +idle_iterate (GstPlay * play) { gst_bin_iterate (GST_BIN (play)); return (GST_STATE (GST_ELEMENT (play)) == GST_STATE_PLAYING); @@ -114,8 +114,7 @@ main (int argc, char *argv[]) /* Creating the GstPlay object */ play = gst_play_new (&error); - if (error) - { + if (error) { g_print ("Error: could not create play object:\n%s\n", error->message); g_error_free (error); return 1; @@ -140,17 +139,16 @@ main (int argc, char *argv[]) /* gst_xml_write_file (GST_ELEMENT (play), stdout); */ g_signal_connect (G_OBJECT (play), "time_tick", - G_CALLBACK (got_time_tick), NULL); + G_CALLBACK (got_time_tick), NULL); g_signal_connect (G_OBJECT (play), "stream_length", - G_CALLBACK (got_stream_length), NULL); + G_CALLBACK (got_stream_length), NULL); g_signal_connect (G_OBJECT (play), "have_video_size", - G_CALLBACK (got_video_size), NULL); + G_CALLBACK (got_video_size), NULL); g_signal_connect (G_OBJECT (play), "found_tag", - G_CALLBACK (got_found_tag), NULL); + G_CALLBACK (got_found_tag), NULL); g_signal_connect (G_OBJECT (play), "error", - G_CALLBACK (gst_element_default_error), NULL); - g_signal_connect (G_OBJECT (play), "eos", - G_CALLBACK (got_eos), NULL); + G_CALLBACK (gst_element_default_error), NULL); + g_signal_connect (G_OBJECT (play), "eos", G_CALLBACK (got_eos), NULL); /* Change state to PLAYING */ gst_element_set_state (GST_ELEMENT (play), GST_STATE_PLAYING); @@ -163,9 +161,9 @@ main (int argc, char *argv[]) g_print ("setting pipeline to ready\n"); gst_element_set_state (GST_ELEMENT (play), GST_STATE_READY); - + /* unref - gst_object_unref (GST_OBJECT (play)); */ + gst_object_unref (GST_OBJECT (play)); */ exit (0); } diff --git a/examples/indexing/indexmpeg.c b/examples/indexing/indexmpeg.c index 29b89280..48a7ca23 100644 --- a/examples/indexing/indexmpeg.c +++ b/examples/indexing/indexmpeg.c @@ -24,26 +24,26 @@ static gboolean verbose = FALSE; static gboolean quiet = FALSE; static void -entry_added (GstIndex *index, GstIndexEntry *entry) +entry_added (GstIndex * index, GstIndexEntry * entry) { switch (entry->type) { case GST_INDEX_ENTRY_ID: - g_print ("id %d describes writer %s\n", entry->id, - GST_INDEX_ID_DESCRIPTION (entry)); + g_print ("id %d describes writer %s\n", entry->id, + GST_INDEX_ID_DESCRIPTION (entry)); break; case GST_INDEX_ENTRY_FORMAT: - g_print ("%d: registered format %d for %s\n", entry->id, - GST_INDEX_FORMAT_FORMAT (entry), - GST_INDEX_FORMAT_KEY (entry)); + g_print ("%d: registered format %d for %s\n", entry->id, + GST_INDEX_FORMAT_FORMAT (entry), GST_INDEX_FORMAT_KEY (entry)); break; case GST_INDEX_ENTRY_ASSOCIATION: { gint i; - g_print ("%p, %d: %08x ", entry, entry->id, GST_INDEX_ASSOC_FLAGS (entry)); + g_print ("%p, %d: %08x ", entry, entry->id, + GST_INDEX_ASSOC_FLAGS (entry)); for (i = 0; i < GST_INDEX_NASSOCS (entry); i++) { - g_print ("%d %lld ", GST_INDEX_ASSOC_FORMAT (entry, i), - GST_INDEX_ASSOC_VALUE (entry, i)); + g_print ("%d %lld ", GST_INDEX_ASSOC_FORMAT (entry, i), + GST_INDEX_ASSOC_VALUE (entry, i)); } g_print ("\n"); break; @@ -55,15 +55,15 @@ entry_added (GstIndex *index, GstIndexEntry *entry) typedef struct { - const gchar *padname; - GstPad *target; - GstElement *bin; - GstElement *pipeline; - GstIndex *index; + const gchar *padname; + GstPad *target; + GstElement *bin; + GstElement *pipeline; + GstIndex *index; } dyn_link; static void -dynamic_link (GstPadTemplate *templ, GstPad *newpad, gpointer data) +dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data) { dyn_link *link = (dyn_link *) data; @@ -77,27 +77,25 @@ dynamic_link (GstPadTemplate *templ, GstPad *newpad, gpointer data) } static void -setup_dynamic_linking (GstElement *pipeline, - GstElement *element, - const gchar *padname, - GstPad *target, - GstElement *bin, - GstIndex *index) +setup_dynamic_linking (GstElement * pipeline, + GstElement * element, + const gchar * padname, GstPad * target, GstElement * bin, GstIndex * index) { dyn_link *link; link = g_new0 (dyn_link, 1); - link->padname = g_strdup (padname); - link->target = target; - link->bin = bin; - link->pipeline = pipeline; - link->index = index; - - g_signal_connect (G_OBJECT (element), "new_pad", G_CALLBACK (dynamic_link), link); + link->padname = g_strdup (padname); + link->target = target; + link->bin = bin; + link->pipeline = pipeline; + link->index = index; + + g_signal_connect (G_OBJECT (element), "new_pad", G_CALLBACK (dynamic_link), + link); } -static GstElement* -make_mpeg_systems_pipeline (const gchar *path, GstIndex *index) +static GstElement * +make_mpeg_systems_pipeline (const gchar * path, GstIndex * index) { GstElement *pipeline; GstElement *src, *demux; @@ -117,12 +115,12 @@ make_mpeg_systems_pipeline (const gchar *path, GstIndex *index) } gst_element_link_pads (src, "src", demux, "sink"); - + return pipeline; } -static GstElement* -make_mpeg_decoder_pipeline (const gchar *path, GstIndex *index) +static GstElement * +make_mpeg_decoder_pipeline (const gchar * path, GstIndex * index) { GstElement *pipeline; GstElement *src, *demux; @@ -145,29 +143,27 @@ make_mpeg_decoder_pipeline (const gchar *path, GstIndex *index) video_decoder = gst_element_factory_make ("mpeg2dec", "video_decoder"); gst_bin_add (GST_BIN (video_bin), video_decoder); - - setup_dynamic_linking (pipeline, demux, "video_00", - gst_element_get_pad (video_decoder, "sink"), - video_bin, index); + + setup_dynamic_linking (pipeline, demux, "video_00", + gst_element_get_pad (video_decoder, "sink"), video_bin, index); audio_bin = gst_bin_new ("audio_bin"); audio_decoder = gst_element_factory_make ("mad", "audio_decoder"); - setup_dynamic_linking (pipeline, demux, "audio_00", - gst_element_get_pad (audio_decoder, "sink"), - audio_bin, index); + setup_dynamic_linking (pipeline, demux, "audio_00", + gst_element_get_pad (audio_decoder, "sink"), audio_bin, index); gst_bin_add (GST_BIN (audio_bin), audio_decoder); if (index) { gst_element_set_index (pipeline, index); } - + return pipeline; } static void -print_progress (GstPad *pad) +print_progress (GstPad * pad) { gint i = 0; gchar status[53]; @@ -181,14 +177,14 @@ print_progress (GstPad *pad) format = GST_FORMAT_PERCENT; res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value); if (res) { - percent = value / (2 * GST_FORMAT_PERCENT_SCALE); + percent = value / (2 * GST_FORMAT_PERCENT_SCALE); } - + for (i = 0; i < percent; i++) { - status[i+1] = '='; + status[i + 1] = '='; } for (i = percent; i < 50; i++) { - status[i+1] = ' '; + status[i + 1] = ' '; } status[51] = '|'; status[52] = 0; @@ -196,8 +192,8 @@ print_progress (GstPad *pad) g_print ("%s\r", status); } -gint -main (gint argc, gchar *argv[]) +gint +main (gint argc, gchar * argv[]) { GstElement *pipeline; GstElement *src; @@ -208,27 +204,28 @@ main (gint argc, gchar *argv[]) gboolean res; GstElement *sink; struct poptOption options[] = { - { "verbose", 'v', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &verbose, 0, - "Print index entries", NULL}, - { "quiet", 'q', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &quiet, 0, - "don't print progress bar", NULL}, - POPT_TABLEEND - }; + {"verbose", 'v', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &verbose, 0, + "Print index entries", NULL}, + {"quiet", 'q', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &quiet, 0, + "don't print progress bar", NULL}, + POPT_TABLEEND + }; if (!gst_init_check_with_popt_table (&argc, &argv, options) || argc < 3) { - g_print ("usage: %s [-v] \n" - " type can be: 0 mpeg_systems\n" - " 1 mpeg_decoder\n" - " -v : report added index entries\n" - " -q : don't print progress\n" , argv[0]); + g_print ("usage: %s [-v] \n" + " type can be: 0 mpeg_systems\n" + " 1 mpeg_decoder\n" + " -v : report added index entries\n" + " -q : don't print progress\n", argv[0]); return -1; } /* create index that elements can fill */ index = gst_index_factory_make ("memindex"); if (index) { - if (verbose) - g_signal_connect (G_OBJECT (index), "entry_added", G_CALLBACK (entry_added), NULL); + if (verbose) + g_signal_connect (G_OBJECT (index), "entry_added", + G_CALLBACK (entry_added), NULL); g_object_set (G_OBJECT (index), "resolver", 1, NULL); } @@ -247,10 +244,10 @@ main (gint argc, gchar *argv[]) } /* setup some default info/error handlers */ - g_signal_connect (G_OBJECT (pipeline), "deep_notify", - G_CALLBACK (gst_element_default_deep_notify), NULL); - g_signal_connect (G_OBJECT (pipeline), "error", - G_CALLBACK (gst_element_default_error), NULL); + g_signal_connect (G_OBJECT (pipeline), "deep_notify", + G_CALLBACK (gst_element_default_deep_notify), NULL); + g_signal_connect (G_OBJECT (pipeline), "error", + G_CALLBACK (gst_element_default_error), NULL); /* get a pad to perform progress reporting on */ src = gst_bin_get_by_name (GST_BIN (pipeline), "src"); @@ -259,7 +256,7 @@ main (gint argc, gchar *argv[]) /* prepare for iteration */ gst_element_set_state (pipeline, GST_STATE_PLAYING); - g_print ("indexing %s...\n", argv [2]); + g_print ("indexing %s...\n", argv[2]); /* run through the complete stream to let it generate an index */ while (gst_bin_iterate (GST_BIN (pipeline))) { if (!quiet && (count % 1000 == 0)) { @@ -285,24 +282,23 @@ main (gint argc, gchar *argv[]) gint total_tm; gst_index_get_writer_id (index, GST_OBJECT (src), &id); - + entry = gst_index_get_assoc_entry (index, id, GST_INDEX_LOOKUP_BEFORE, 0, - GST_FORMAT_TIME, G_MAXINT64); + GST_FORMAT_TIME, G_MAXINT64); g_assert (entry); gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &result); total_tm = result * 60 / GST_SECOND; g_print ("total time = %.2fs\n", total_tm / 60.0); } - + pad = gst_element_get_pad (src, "src"); sink = gst_element_factory_make ("fakesink", "sink"); gst_element_link_pads (src, "src", sink, "sink"); gst_bin_add (GST_BIN (pipeline), sink); - g_print ("seeking %s...\n", argv [2]); + g_print ("seeking %s...\n", argv[2]); event = gst_event_new_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, 5 * GST_SECOND); + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 5 * GST_SECOND); res = gst_pad_send_event (pad, event); if (!res) { @@ -322,4 +318,3 @@ main (gint argc, gchar *argv[]) return 1; } - diff --git a/examples/seeking/cdparanoia.c b/examples/seeking/cdparanoia.c index 646c121c..e750f346 100644 --- a/examples/seeking/cdparanoia.c +++ b/examples/seeking/cdparanoia.c @@ -3,7 +3,7 @@ #include static void -get_position_info (GstElement *cdparanoia) +get_position_info (GstElement * cdparanoia) { GstFormat track_format; const GstFormat *formats; @@ -24,14 +24,13 @@ get_position_info (GstElement *cdparanoia) definition = gst_format_get_details (*formats); format = *formats; - res = gst_pad_query (pad, GST_QUERY_POSITION, - &format, &position); + res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &position); if (format == GST_FORMAT_TIME) { position /= GST_SECOND; - g_print ("%s: %lld:%02lld", definition->nick, position/60, position%60); - } - else { + g_print ("%s: %lld:%02lld", definition->nick, position / 60, + position % 60); + } else { g_print ("%s: %lld", definition->nick, position); } @@ -44,7 +43,7 @@ get_position_info (GstElement *cdparanoia) } static void -get_track_info (GstElement *cdparanoia) +get_track_info (GstElement * cdparanoia) { GstFormat track_format; gint64 total_tracks = 0, total_time = 0; @@ -52,7 +51,7 @@ get_track_info (GstElement *cdparanoia) const GstFormat *formats; gint i; gint64 time_count = 0; - + track_format = gst_format_get_by_nick ("track"); g_assert (track_format != 0); @@ -66,26 +65,24 @@ get_track_info (GstElement *cdparanoia) gint64 total; GstFormat format; gboolean res; - + definition = gst_format_get_details (*formats); format = *formats; - res = gst_pad_query (pad, GST_QUERY_TOTAL, - &format, &total); + res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &total); if (res) { if (format == GST_FORMAT_TIME) { total /= GST_SECOND; - g_print ("%s total: %lld:%02lld\n", definition->nick, total/60, total%60); - } - else - g_print ("%s total: %lld\n", definition->nick, total); + g_print ("%s total: %lld:%02lld\n", definition->nick, total / 60, + total % 60); + } else + g_print ("%s total: %lld\n", definition->nick, total); if (format == track_format) total_tracks = total; else if (format == GST_FORMAT_TIME) total_time = total; - } - else + } else g_print ("failed to get %s total\n", definition->nick); formats++; @@ -102,11 +99,9 @@ get_track_info (GstElement *cdparanoia) GstFormat format; format = GST_FORMAT_TIME; - res = gst_pad_convert (pad, track_format, i, - &format, &time); + res = gst_pad_convert (pad, track_format, i, &format, &time); time /= GST_SECOND; - } - else { + } else { time = total_time; res = TRUE; } @@ -117,14 +112,12 @@ get_track_info (GstElement *cdparanoia) if (i > 0) { gint64 length = time - time_count; - g_print ("track %d: %lld:%02lld -> %lld:%02lld, length: %lld:%02lld\n", - i-1, - time_count / 60, time_count % 60, - time / 60, time % 60, - length / 60, length % 60); + g_print ("track %d: %lld:%02lld -> %lld:%02lld, length: %lld:%02lld\n", + i - 1, + time_count / 60, time_count % 60, + time / 60, time % 60, length / 60, length % 60); } - } - else { + } else { g_print ("could not get time for track %d\n", i); } @@ -161,7 +154,7 @@ main (int argc, char **argv) gst_element_link_pads (cdparanoia, "src", osssink, "sink"); g_signal_connect (G_OBJECT (pipeline), "deep_notify", - G_CALLBACK (gst_element_default_deep_notify), NULL); + G_CALLBACK (gst_element_default_deep_notify), NULL); gst_element_set_state (pipeline, GST_STATE_PAUSED); @@ -177,9 +170,7 @@ main (int argc, char **argv) g_print ("playing from track 3\n"); /* seek to track3 */ event = gst_event_new_seek (track_format | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - 3); + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 3); res = gst_pad_send_event (pad, event); if (!res) @@ -198,9 +189,8 @@ main (int argc, char **argv) g_print ("\nplaying from second 25 to second 29\n"); /* seek to some seconds */ event = gst_event_new_segment_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - 25 * GST_SECOND, 29 * GST_SECOND); + GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH, 25 * GST_SECOND, 29 * GST_SECOND); res = gst_pad_send_event (pad, event); if (!res) g_warning ("seek failed"); diff --git a/examples/seeking/cdplayer.c b/examples/seeking/cdplayer.c index 6ce55471..1e823cc5 100644 --- a/examples/seeking/cdplayer.c +++ b/examples/seeking/cdplayer.c @@ -15,11 +15,11 @@ static guint update_id; #define UPDATE_INTERVAL 500 -static GstElement* -make_cdaudio_pipeline (void) +static GstElement * +make_cdaudio_pipeline (void) { GstElement *cdaudio; - + cdaudio = gst_element_factory_make ("cdaudio", "cdaudio"); g_assert (cdaudio != NULL); @@ -28,9 +28,8 @@ make_cdaudio_pipeline (void) return cdaudio; } -static gchar* -format_value (GtkScale *scale, - gdouble value) +static gchar * +format_value (GtkScale * scale, gdouble value) { gint64 real; gint64 seconds; @@ -41,9 +40,7 @@ format_value (GtkScale *scale, subseconds = (gint64) real / (GST_SECOND / 100); return g_strdup_printf ("%02lld:%02lld:%02lld", - seconds/60, - seconds%60, - subseconds%100); + seconds / 60, seconds % 60, subseconds % 100); } typedef struct @@ -52,13 +49,12 @@ typedef struct const GstFormat format; } seek_format; -static seek_format seek_formats[] = -{ - { "tim", GST_FORMAT_TIME }, - { "byt", GST_FORMAT_BYTES }, - { "buf", GST_FORMAT_BUFFERS }, - { "def", GST_FORMAT_DEFAULT }, - { NULL, 0 }, +static seek_format seek_formats[] = { + {"tim", GST_FORMAT_TIME}, + {"byt", GST_FORMAT_BYTES}, + {"buf", GST_FORMAT_BUFFERS}, + {"def", GST_FORMAT_DEFAULT}, + {NULL, 0}, }; @@ -80,10 +76,9 @@ query_durations () format = seek_formats[i].format; res = gst_element_query (element, GST_QUERY_TOTAL, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } @@ -110,10 +105,9 @@ query_positions () format = seek_formats[i].format; res = gst_element_query (element, GST_QUERY_POSITION, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } @@ -123,7 +117,7 @@ query_positions () } static gboolean -update_scale (gpointer data) +update_scale (gpointer data) { GstClock *clock; guint64 position = 0; @@ -134,6 +128,7 @@ update_scale (gpointer data) if (seekable_elements) { GstElement *element = GST_ELEMENT (seekable_elements->data); + gst_element_query (element, GST_QUERY_TOTAL, &format, &duration); } if (clock) @@ -141,7 +136,8 @@ update_scale (gpointer data) if (stats) { if (clock) - g_print ("clock: %13llu (%s)\n", position, gst_object_get_name (GST_OBJECT (clock))); + g_print ("clock: %13llu (%s)\n", position, + gst_object_get_name (GST_OBJECT (clock))); query_durations (); query_positions (); } @@ -167,7 +163,7 @@ iterate (gpointer data) } static gboolean -start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gst_element_set_state (pipeline, GST_STATE_PAUSED); gtk_timeout_remove (update_id); @@ -176,7 +172,7 @@ start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) } static gboolean -stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gint64 real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100; gboolean res; @@ -188,8 +184,7 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) g_print ("seek to %lld on element %s\n", real, GST_ELEMENT_NAME (seekable)); s_event = gst_event_new_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, real); + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, real); res = gst_element_send_event (seekable, s_event); @@ -199,7 +194,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) gst_element_set_state (pipeline, GST_STATE_PLAYING); if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE)) gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); return FALSE; } @@ -211,7 +207,8 @@ play_cb (GtkButton * button, gpointer data) gst_element_set_state (pipeline, GST_STATE_PLAYING); if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE)) gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); } } @@ -236,22 +233,23 @@ stop_cb (GtkButton * button, gpointer data) int main (int argc, char **argv) { - GtkWidget *window, *hbox, *vbox, - *play_button, *pause_button, *stop_button, - *hscale; + GtkWidget *window, *hbox, *vbox, + *play_button, *pause_button, *stop_button, *hscale; struct poptOption options[] = { - {"stats", 's', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &stats, 0, - "Show element stats", NULL}, - POPT_TABLEEND - }; + {"stats", 's', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &stats, 0, + "Show element stats", NULL}, + POPT_TABLEEND + }; gst_init_with_popt_table (&argc, &argv, options); gtk_init (&argc, &argv); pipeline = make_cdaudio_pipeline (); - g_signal_connect (pipeline, "deep_notify", G_CALLBACK (gst_element_default_deep_notify), NULL); - g_signal_connect (pipeline, "error", G_CALLBACK (gst_element_default_error), NULL); + g_signal_connect (pipeline, "deep_notify", + G_CALLBACK (gst_element_default_deep_notify), NULL); + g_signal_connect (pipeline, "error", G_CALLBACK (gst_element_default_error), + NULL); /* initialize gui elements ... */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -261,17 +259,18 @@ main (int argc, char **argv) pause_button = gtk_button_new_with_label ("pause"); stop_button = gtk_button_new_with_label ("stop"); - adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); + adjustment = + GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); hscale = gtk_hscale_new (adjustment); gtk_scale_set_digits (GTK_SCALE (hscale), 2); gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_press_event", G_CALLBACK (start_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_release_event", G_CALLBACK (stop_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "format_value", G_CALLBACK (format_value), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_press_event", G_CALLBACK (start_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_release_event", G_CALLBACK (stop_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "format_value", G_CALLBACK (format_value), pipeline); /* do the packing stuff ... */ gtk_window_set_default_size (GTK_WINDOW (window), 96, 96); @@ -283,9 +282,12 @@ main (int argc, char **argv) gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2); /* connect things ... */ - g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), pipeline); - g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), pipeline); - g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), pipeline); + g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), + pipeline); + g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), + pipeline); + g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), + pipeline); g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL); /* show the gui. */ diff --git a/examples/seeking/seek.c b/examples/seeking/seek.c index 2ad1ca7f..34a6958d 100644 --- a/examples/seeking/seek.c +++ b/examples/seeking/seek.c @@ -25,26 +25,25 @@ static guint update_id; typedef struct { - const gchar *padname; - GstPad *target; - GstElement *bin; + const gchar *padname; + GstPad *target; + GstElement *bin; } dyn_link; static GstElement * -gst_element_factory_make_or_warn (gchar *type, gchar *name) +gst_element_factory_make_or_warn (gchar * type, gchar * name) { GstElement *element = gst_element_factory_make (type, name); if (!element) { - g_warning ("Failed to create element %s of type %s", - name, type); + g_warning ("Failed to create element %s of type %s", name, type); } return element; } static void -dynamic_link (GstPadTemplate *templ, GstPad *newpad, gpointer data) +dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data) { dyn_link *connect = (dyn_link *) data; @@ -60,25 +59,27 @@ dynamic_link (GstPadTemplate *templ, GstPad *newpad, gpointer data) } static void -setup_dynamic_link (GstElement *element, const gchar *padname, GstPad *target, GstElement *bin) +setup_dynamic_link (GstElement * element, const gchar * padname, + GstPad * target, GstElement * bin) { dyn_link *connect; connect = g_new0 (dyn_link, 1); - connect->padname = g_strdup (padname); - connect->target = target; - connect->bin = bin; + connect->padname = g_strdup (padname); + connect->target = target; + connect->bin = bin; - g_signal_connect (G_OBJECT (element), "new_pad", G_CALLBACK (dynamic_link), connect); + g_signal_connect (G_OBJECT (element), "new_pad", G_CALLBACK (dynamic_link), + connect); } -static GstElement* -make_mod_pipeline (const gchar *location) +static GstElement * +make_mod_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -103,13 +104,13 @@ make_mod_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_dv_pipeline (const gchar *location) +static GstElement * +make_dv_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink, *videosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -140,13 +141,13 @@ make_dv_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_wav_pipeline (const gchar *location) +static GstElement * +make_wav_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -171,13 +172,13 @@ make_wav_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_flac_pipeline (const gchar *location) +static GstElement * +make_flac_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -202,13 +203,13 @@ make_flac_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_sid_pipeline (const gchar *location) +static GstElement * +make_sid_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -233,13 +234,13 @@ make_sid_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_parse_pipeline (const gchar *location) +static GstElement * +make_parse_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *parser, *fakesink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -265,13 +266,13 @@ make_parse_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_vorbis_pipeline (const gchar *location) +static GstElement * +make_vorbis_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *audiosink; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -296,13 +297,13 @@ make_vorbis_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_mp3_pipeline (const gchar *location) +static GstElement * +make_mp3_pipeline (const gchar * location) { GstElement *pipeline; GstElement *src, *decoder, *osssink, *queue, *audio_thread; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -335,14 +336,15 @@ make_mp3_pipeline (const gchar *location) return pipeline; } -static GstElement* -make_avi_pipeline (const gchar *location) +static GstElement * +make_avi_pipeline (const gchar * location) { GstElement *pipeline, *audio_bin, *video_bin; GstElement *src, *demux, *a_decoder, *v_decoder, *audiosink, *videosink; - GstElement *a_queue = NULL, *audio_thread = NULL, *v_queue = NULL, *video_thread = NULL; + GstElement *a_queue = NULL, *audio_thread = NULL, *v_queue = + NULL, *video_thread = NULL; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -369,12 +371,14 @@ make_avi_pipeline (const gchar *location) gst_bin_add (GST_BIN (audio_thread), audiosink); gst_element_set_state (audio_bin, GST_STATE_PAUSED); - setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, "sink"), audio_bin); + setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, + "sink"), audio_bin); seekable = gst_element_get_pad (a_queue, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); video_bin = gst_bin_new ("v_decoder_bin"); //v_decoder = gst_element_factory_make_or_warn ("identity", "v_dec"); @@ -395,25 +399,27 @@ make_avi_pipeline (const gchar *location) gst_element_set_state (video_bin, GST_STATE_PAUSED); - setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, "sink"), video_bin); + setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, + "sink"), video_bin); seekable = gst_element_get_pad (v_queue, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); return pipeline; } -static GstElement* -make_mpeg_pipeline (const gchar *location) +static GstElement * +make_mpeg_pipeline (const gchar * location) { GstElement *pipeline, *audio_bin, *video_bin; GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter; GstElement *audiosink, *videosink; GstElement *a_queue, *audio_thread, *v_queue, *video_thread; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -441,12 +447,14 @@ make_mpeg_pipeline (const gchar *location) gst_bin_add (GST_BIN (audio_thread), a_queue); gst_bin_add (GST_BIN (audio_thread), audiosink); - setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, "sink"), audio_bin); + setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, + "sink"), audio_bin); seekable = gst_element_get_pad (a_queue, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); video_bin = gst_bin_new ("v_decoder_bin"); v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec"); @@ -456,30 +464,32 @@ make_mpeg_pipeline (const gchar *location) v_filter = gst_element_factory_make_or_warn ("colorspace", "v_filter"); videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink"); gst_element_link_many (v_decoder, v_queue, v_filter, NULL); - + gst_element_link (v_filter, videosink); gst_bin_add_many (GST_BIN (video_bin), v_decoder, video_thread, NULL); gst_bin_add_many (GST_BIN (video_thread), v_queue, v_filter, videosink, NULL); - setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, "sink"), video_bin); + setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, + "sink"), video_bin); seekable = gst_element_get_pad (v_queue, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); return pipeline; } -static GstElement* -make_mpegnt_pipeline (const gchar *location) +static GstElement * +make_mpegnt_pipeline (const gchar * location) { GstElement *pipeline, *audio_bin, *video_bin; GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter; GstElement *audiosink, *videosink; GstElement *a_queue, *audio_thread; GstPad *seekable; - + pipeline = gst_pipeline_new ("app"); src = gst_element_factory_make_or_warn (SOURCE, "src"); @@ -508,40 +518,43 @@ make_mpegnt_pipeline (const gchar *location) gst_bin_add (GST_BIN (audio_thread), a_queue); gst_bin_add (GST_BIN (audio_thread), audiosink); - setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, "sink"), audio_bin); + setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder, + "sink"), audio_bin); seekable = gst_element_get_pad (a_queue, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink")); video_bin = gst_bin_new ("v_decoder_bin"); v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec"); v_filter = gst_element_factory_make_or_warn ("colorspace", "v_filter"); videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink"); gst_element_link_many (v_decoder, v_filter, videosink, NULL); - + gst_bin_add_many (GST_BIN (video_bin), v_decoder, v_filter, videosink, NULL); - setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, "sink"), video_bin); + setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder, + "sink"), video_bin); seekable = gst_element_get_pad (v_decoder, "src"); seekable_pads = g_list_prepend (seekable_pads, seekable); rate_pads = g_list_prepend (rate_pads, seekable); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink")); return pipeline; } -static GstElement* -make_playerbin_pipeline (const gchar *location) +static GstElement * +make_playerbin_pipeline (const gchar * location) { return NULL; } -static gchar* -format_value (GtkScale *scale, - gdouble value) +static gchar * +format_value (GtkScale * scale, gdouble value) { gint64 real; gint64 seconds; @@ -552,9 +565,7 @@ format_value (GtkScale *scale, subseconds = (gint64) real / (GST_SECOND / 100); return g_strdup_printf ("%02lld:%02lld:%02lld", - seconds/60, - seconds%60, - subseconds%100); + seconds / 60, seconds % 60, subseconds % 100); } typedef struct @@ -563,13 +574,12 @@ typedef struct const GstFormat format; } seek_format; -static seek_format seek_formats[] = -{ - { "tim", GST_FORMAT_TIME }, - { "byt", GST_FORMAT_BYTES }, - { "buf", GST_FORMAT_BUFFERS }, - { "def", GST_FORMAT_DEFAULT }, - { NULL, 0 }, +static seek_format seek_formats[] = { + {"tim", GST_FORMAT_TIME}, + {"byt", GST_FORMAT_BYTES}, + {"buf", GST_FORMAT_BUFFERS}, + {"def", GST_FORMAT_DEFAULT}, + {NULL, 0}, }; G_GNUC_UNUSED static void @@ -588,13 +598,10 @@ query_rates (void) format = seek_formats[i].format; - if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, - &format, &value)) - { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, &value)) { + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; @@ -623,15 +630,14 @@ query_durations () format = seek_formats[i].format; res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad)); - + walk = g_list_next (walk); } } @@ -654,10 +660,9 @@ query_positions () format = seek_formats[i].format; res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } @@ -668,7 +673,7 @@ query_positions () } static gboolean -update_scale (gpointer data) +update_scale (gpointer data) { GstClock *clock; guint64 position; @@ -679,12 +684,14 @@ update_scale (gpointer data) if (seekable_pads) { GstPad *pad = GST_PAD (seekable_pads->data); + gst_pad_query (pad, GST_QUERY_TOTAL, &format, &duration); } position = gst_clock_get_time (clock); if (stats) { - g_print ("clock: %13llu (%s)\n", position, gst_object_get_name (GST_OBJECT (clock))); + g_print ("clock: %13llu (%s)\n", position, + gst_object_get_name (GST_OBJECT (clock))); query_durations (); query_positions (); query_rates (); @@ -711,7 +718,7 @@ iterate (gpointer data) } static gboolean -start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gst_element_set_state (pipeline, GST_STATE_PAUSED); gtk_timeout_remove (update_id); @@ -720,21 +727,23 @@ start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) } static gboolean -stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gint64 real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100; gboolean res; GstEvent *s_event; + #ifdef PAD_SEEK GList *walk = seekable_pads; while (walk) { GstPad *seekable = GST_PAD (walk->data); - g_print ("seek to %lld on pad %s:%s\n", real, GST_DEBUG_PAD_NAME (seekable)); - s_event = gst_event_new_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, real); + g_print ("seek to %lld on pad %s:%s\n", real, + GST_DEBUG_PAD_NAME (seekable)); + s_event = + gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH, real); res = gst_pad_send_event (seekable, s_event); @@ -746,10 +755,11 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) while (walk) { GstElement *seekable = GST_ELEMENT (walk->data); - g_print ("seek to %lld on element %s\n", real, gst_element_get_name (seekable)); - s_event = gst_event_new_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, real); + g_print ("seek to %lld on element %s\n", real, + gst_element_get_name (seekable)); + s_event = + gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH, real); res = gst_element_send_event (seekable, s_event); @@ -759,7 +769,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) gst_element_set_state (pipeline, GST_STATE_PLAYING); gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); return FALSE; } @@ -770,7 +781,8 @@ play_cb (GtkButton * button, gpointer data) if (gst_element_get_state (pipeline) != GST_STATE_PLAYING) { gst_element_set_state (pipeline, GST_STATE_PLAYING); gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); } } @@ -795,23 +807,23 @@ stop_cb (GtkButton * button, gpointer data) typedef struct { gchar *name; - GstElement* (*func) (const gchar *location); + GstElement *(*func) (const gchar * location); } Pipeline; static Pipeline pipelines[] = { - { "mp3", make_mp3_pipeline }, - { "avi", make_avi_pipeline }, - { "mpeg1", make_mpeg_pipeline }, - { "mpegparse", make_parse_pipeline }, - { "vorbis", make_vorbis_pipeline }, - { "sid", make_sid_pipeline }, - { "flac", make_flac_pipeline }, - { "wav", make_wav_pipeline }, - { "mod", make_mod_pipeline }, - { "dv", make_dv_pipeline }, - { "mpeg1nothreads", make_mpegnt_pipeline }, - { "playerbin", make_playerbin_pipeline }, - { NULL, NULL}, + {"mp3", make_mp3_pipeline}, + {"avi", make_avi_pipeline}, + {"mpeg1", make_mpeg_pipeline}, + {"mpegparse", make_parse_pipeline}, + {"vorbis", make_vorbis_pipeline}, + {"sid", make_sid_pipeline}, + {"flac", make_flac_pipeline}, + {"wav", make_wav_pipeline}, + {"mod", make_mod_pipeline}, + {"dv", make_dv_pipeline}, + {"mpeg1nothreads", make_mpegnt_pipeline}, + {"playerbin", make_playerbin_pipeline}, + {NULL, NULL}, }; #define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1) @@ -832,16 +844,15 @@ print_usage (int argc, char **argv) int main (int argc, char **argv) { - GtkWidget *window, *hbox, *vbox, - *play_button, *pause_button, *stop_button, - *hscale; + GtkWidget *window, *hbox, *vbox, + *play_button, *pause_button, *stop_button, *hscale; struct poptOption options[] = { - { "stats", 's', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &stats, 0, - "Show pad stats", NULL }, + {"stats", 's', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &stats, 0, + "Show pad stats", NULL}, POPT_TABLEEND }; gint type; - + gst_init_with_popt_table (&argc, &argv, options); gtk_init (&argc, &argv); @@ -868,17 +879,18 @@ main (int argc, char **argv) pause_button = gtk_button_new_with_label ("pause"); stop_button = gtk_button_new_with_label ("stop"); - adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); + adjustment = + GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); hscale = gtk_hscale_new (adjustment); gtk_scale_set_digits (GTK_SCALE (hscale), 2); gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_press_event", G_CALLBACK (start_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_release_event", G_CALLBACK (stop_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "format_value", G_CALLBACK (format_value), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_press_event", G_CALLBACK (start_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_release_event", G_CALLBACK (stop_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "format_value", G_CALLBACK (format_value), pipeline); /* do the packing stuff ... */ gtk_window_set_default_size (GTK_WINDOW (window), 96, 96); @@ -890,16 +902,21 @@ main (int argc, char **argv) gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2); /* connect things ... */ - g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), pipeline); - g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), pipeline); - g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), pipeline); + g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), + pipeline); + g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), + pipeline); + g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), + pipeline); g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL); /* show the gui. */ gtk_widget_show_all (window); - g_signal_connect (pipeline, "deep_notify", G_CALLBACK (gst_element_default_deep_notify), NULL); - g_signal_connect (pipeline, "error", G_CALLBACK (gst_element_default_error), NULL); + g_signal_connect (pipeline, "deep_notify", + G_CALLBACK (gst_element_default_deep_notify), NULL); + g_signal_connect (pipeline, "error", G_CALLBACK (gst_element_default_error), + NULL); gtk_main (); diff --git a/examples/seeking/spider_seek.c b/examples/seeking/spider_seek.c index a21aac16..d2c2c6b2 100644 --- a/examples/seeking/spider_seek.c +++ b/examples/seeking/spider_seek.c @@ -19,19 +19,19 @@ static guint update_id; #define UPDATE_INTERVAL 500 -static GstElement* -make_spider_pipeline (const gchar *location, gboolean thread) +static GstElement * +make_spider_pipeline (const gchar * location, gboolean thread) { GstElement *pipeline; - GstElement *src, *decoder, *audiosink, *videosink, *a_thread, *v_thread, *a_queue, *v_queue; - + GstElement *src, *decoder, *audiosink, *videosink, *a_thread, *v_thread, + *a_queue, *v_queue; + if (thread) { pipeline = gst_thread_new ("app"); - } - else { + } else { pipeline = gst_pipeline_new ("app"); } - + src = gst_element_factory_make (SOURCE, "src"); decoder = gst_element_factory_make ("spider", "decoder"); @@ -64,15 +64,16 @@ make_spider_pipeline (const gchar *location, gboolean thread) seekable_elements = g_list_prepend (seekable_elements, videosink); seekable_elements = g_list_prepend (seekable_elements, audiosink); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (audiosink, "sink")); - rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (videosink, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (audiosink, "sink")); + rate_pads = + g_list_prepend (rate_pads, gst_element_get_pad (videosink, "sink")); return pipeline; } -static gchar* -format_value (GtkScale *scale, - gdouble value) +static gchar * +format_value (GtkScale * scale, gdouble value) { gint64 real; gint64 seconds; @@ -83,9 +84,7 @@ format_value (GtkScale *scale, subseconds = (gint64) real / (GST_SECOND / 100); return g_strdup_printf ("%02lld:%02lld:%02lld", - seconds/60, - seconds%60, - subseconds%100); + seconds / 60, seconds % 60, subseconds % 100); } typedef struct @@ -94,13 +93,12 @@ typedef struct const GstFormat format; } seek_format; -static seek_format seek_formats[] = -{ - { "tim", GST_FORMAT_TIME }, - { "byt", GST_FORMAT_BYTES }, - { "buf", GST_FORMAT_BUFFERS }, - { "def", GST_FORMAT_DEFAULT }, - { NULL, 0 }, +static seek_format seek_formats[] = { + {"tim", GST_FORMAT_TIME}, + {"byt", GST_FORMAT_BYTES}, + {"buf", GST_FORMAT_BUFFERS}, + {"def", GST_FORMAT_DEFAULT}, + {NULL, 0}, }; G_GNUC_UNUSED static void @@ -119,13 +117,10 @@ query_rates (void) format = seek_formats[i].format; - if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, - &format, &value)) - { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, &value)) { + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; @@ -154,10 +149,9 @@ query_durations () format = seek_formats[i].format; res = gst_element_query (element, GST_QUERY_TOTAL, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } @@ -184,10 +178,9 @@ query_positions () format = seek_formats[i].format; res = gst_element_query (element, GST_QUERY_POSITION, &format, &value); if (res) { - g_print ("%s %13lld | ", seek_formats[i].name, value); - } - else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13lld | ", seek_formats[i].name, value); + } else { + g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); } i++; } @@ -197,7 +190,7 @@ query_positions () } static gboolean -update_scale (gpointer data) +update_scale (gpointer data) { GstClock *clock; guint64 position; @@ -208,12 +201,14 @@ update_scale (gpointer data) if (seekable_elements) { GstElement *element = GST_ELEMENT (seekable_elements->data); + gst_element_query (element, GST_QUERY_TOTAL, &format, &duration); } position = gst_clock_get_time (clock); if (stats) { - g_print ("clock: %13llu (%s)\n", position, gst_object_get_name (GST_OBJECT (clock))); + g_print ("clock: %13llu (%s)\n", position, + gst_object_get_name (GST_OBJECT (clock))); query_durations (); query_positions (); query_rates (); @@ -239,7 +234,7 @@ iterate (gpointer data) } static gboolean -start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gst_element_set_state (pipeline, GST_STATE_PAUSED); gtk_timeout_remove (update_id); @@ -248,7 +243,7 @@ start_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) } static gboolean -stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data) { gint64 real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100; gboolean res; @@ -260,8 +255,7 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) g_print ("seek to %lld on element %s\n", real, GST_ELEMENT_NAME (seekable)); s_event = gst_event_new_seek (GST_FORMAT_TIME | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, real); + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, real); res = gst_element_send_event (seekable, s_event); @@ -271,7 +265,8 @@ stop_seek (GtkWidget *widget, GdkEventButton *event, gpointer user_data) gst_element_set_state (pipeline, GST_STATE_PLAYING); if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE)) gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); return FALSE; } @@ -283,7 +278,8 @@ play_cb (GtkButton * button, gpointer data) gst_element_set_state (pipeline, GST_STATE_PLAYING); if (!GST_FLAG_IS_SET (pipeline, GST_BIN_SELF_SCHEDULABLE)) gtk_idle_add ((GtkFunction) iterate, pipeline); - update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); + update_id = + gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); } } @@ -308,17 +304,16 @@ stop_cb (GtkButton * button, gpointer data) int main (int argc, char **argv) { - GtkWidget *window, *hbox, *vbox, - *play_button, *pause_button, *stop_button, - *hscale; + GtkWidget *window, *hbox, *vbox, + *play_button, *pause_button, *stop_button, *hscale; gboolean threaded = FALSE; struct poptOption options[] = { - {"threaded", 't', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &threaded, 0, - "Run the pipeline in a toplevel thread", NULL}, - {"stats", 's', POPT_ARG_NONE|POPT_ARGFLAG_STRIP, &stats, 0, - "Show element stats", NULL}, - POPT_TABLEEND - }; + {"threaded", 't', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &threaded, 0, + "Run the pipeline in a toplevel thread", NULL}, + {"stats", 's', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &stats, 0, + "Show element stats", NULL}, + POPT_TABLEEND + }; gst_init_with_popt_table (&argc, &argv, options); gtk_init (&argc, &argv); @@ -338,17 +333,18 @@ main (int argc, char **argv) pause_button = gtk_button_new_with_label ("pause"); stop_button = gtk_button_new_with_label ("stop"); - adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); + adjustment = + GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0)); hscale = gtk_hscale_new (adjustment); gtk_scale_set_digits (GTK_SCALE (hscale), 2); gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_press_event", G_CALLBACK (start_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "button_release_event", G_CALLBACK (stop_seek), pipeline); - gtk_signal_connect(GTK_OBJECT(hscale), - "format_value", G_CALLBACK (format_value), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_press_event", G_CALLBACK (start_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "button_release_event", G_CALLBACK (stop_seek), pipeline); + gtk_signal_connect (GTK_OBJECT (hscale), + "format_value", G_CALLBACK (format_value), pipeline); /* do the packing stuff ... */ gtk_window_set_default_size (GTK_WINDOW (window), 96, 96); @@ -360,9 +356,12 @@ main (int argc, char **argv) gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2); /* connect things ... */ - g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), pipeline); - g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), pipeline); - g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), pipeline); + g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), + pipeline); + g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), + pipeline); + g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), + pipeline); g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL); /* show the gui. */ diff --git a/examples/seeking/vorbisfile.c b/examples/seeking/vorbisfile.c index acaa60c9..ec6844a0 100644 --- a/examples/seeking/vorbisfile.c +++ b/examples/seeking/vorbisfile.c @@ -4,34 +4,37 @@ static gboolean ready = FALSE; -struct probe_context { +struct probe_context +{ GstElement *pipeline; GstElement *element; - GstPad *pad; - GstFormat ls_format; + GstPad *pad; + GstFormat ls_format; - gint total_ls; + gint total_ls; - GstCaps *metadata; - GstCaps *streaminfo; - GstCaps *caps; + GstCaps *metadata; + GstCaps *streaminfo; + GstCaps *caps; }; static void -print_caps (GstCaps *caps) +print_caps (GstCaps * caps) { char *s; + s = gst_caps_to_string (caps); - g_print(" %s\n", s); + g_print (" %s\n", s); g_free (s); } static void -print_format (GstCaps *caps) +print_format (GstCaps * caps) { char *s; + s = gst_caps_to_string (caps); - g_print(" format: %s\n", s); + g_print (" format: %s\n", s); g_free (s); } @@ -61,35 +64,31 @@ print_lbs_info (struct probe_context *context, gint stream) definition = gst_format_get_details (format); /* get start and end position of this stream */ - res = gst_pad_convert (context->pad, - context->ls_format, stream, - &format, &value_start); + res = gst_pad_convert (context->pad, + context->ls_format, stream, &format, &value_start); res &= gst_pad_convert (context->pad, - context->ls_format, stream + 1, - &format, &value_end); + context->ls_format, stream + 1, &format, &value_end); if (res) { /* substract to get the length */ value_end -= value_start; if (format == GST_FORMAT_TIME) { - value_end /= (GST_SECOND/100); - g_print (" %s: %lld:%02lld.%02lld\n", definition->nick, - value_end/6000, (value_end/100)%60, (value_end%100)); + value_end /= (GST_SECOND / 100); + g_print (" %s: %lld:%02lld.%02lld\n", definition->nick, + value_end / 6000, (value_end / 100) % 60, (value_end % 100)); + } else { + g_print (" %s: %lld\n", definition->nick, value_end); } - else { - g_print (" %s: %lld\n", definition->nick, value_end); - } - } - else + } else g_print (" could not get logical stream %s\n", definition->nick); } } static void -deep_notify (GObject *object, GstObject *origin, - GParamSpec *pspec, gpointer data) +deep_notify (GObject * object, GstObject * origin, + GParamSpec * pspec, gpointer data) { struct probe_context *context = (struct probe_context *) data; GValue value = { 0, }; @@ -99,8 +98,7 @@ deep_notify (GObject *object, GstObject *origin, g_value_init (&value, pspec->value_type); g_object_get_property (G_OBJECT (origin), pspec->name, &value); context->metadata = g_value_peek_pointer (&value); - } - else if (!strcmp (pspec->name, "streaminfo")) { + } else if (!strcmp (pspec->name, "streaminfo")) { g_value_init (&value, pspec->value_type); g_object_get_property (G_OBJECT (origin), pspec->name, &value); @@ -127,9 +125,7 @@ collect_logical_stream_properties (struct probe_context *context, gint stream) /* seek to stream */ event = gst_event_new_seek (context->ls_format | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - stream); + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, stream); res = gst_pad_send_event (context->pad, event); if (!res) { g_warning ("seek to logical track failed"); @@ -141,7 +137,8 @@ collect_logical_stream_properties (struct probe_context *context, gint stream) ready = FALSE; while (gst_bin_iterate (GST_BIN (context->pipeline)) && !ready) { count++; - if (count > 10) break; + if (count > 10) + break; } print_caps (context->metadata); @@ -177,21 +174,19 @@ collect_stream_properties (struct probe_context *context) format = *formats; formats++; - res = gst_pad_query (context->pad, GST_QUERY_TOTAL, - &format, &value); + res = gst_pad_query (context->pad, GST_QUERY_TOTAL, &format, &value); definition = gst_format_get_details (format); if (res) { if (format == GST_FORMAT_TIME) { - value /= (GST_SECOND/100); - g_print (" total %s: %lld:%02lld.%02lld\n", definition->nick, - value/6000, (value/100)%60, (value%100)); - } - else { - if (format == context->ls_format) - context->total_ls = value; - g_print (" total %s: %lld\n", definition->nick, value); + value /= (GST_SECOND / 100); + g_print (" total %s: %lld:%02lld.%02lld\n", definition->nick, + value / 6000, (value / 100) % 60, (value % 100)); + } else { + if (format == context->ls_format) + context->total_ls = value; + g_print (" total %s: %lld\n", definition->nick, value); } } } @@ -248,7 +243,7 @@ main (int argc, char **argv) context->ls_format = logical_stream_format; g_signal_connect (G_OBJECT (pipeline), "deep_notify", - G_CALLBACK (deep_notify), context); + G_CALLBACK (deep_notify), context); gst_element_set_state (pipeline, GST_STATE_PLAYING); diff --git a/examples/stats/mp2ogg.c b/examples/stats/mp2ogg.c index e5d3fbd9..55d79e90 100644 --- a/examples/stats/mp2ogg.c +++ b/examples/stats/mp2ogg.c @@ -24,8 +24,8 @@ * compression status of mpeg audio to ogg vorbis transcoding. */ -gint -main (gint argc, gchar *argv[]) +gint +main (gint argc, gchar * argv[]) { GstElement *pipeline; GError *error = NULL; @@ -34,21 +34,22 @@ main (gint argc, gchar *argv[]) GstPad *dec_sink, *enc_src; gst_init (&argc, &argv); - + if (argc < 3) { g_print ("usage: %s \n", argv[0]); return -1; } description = g_strdup_printf ("filesrc location=\"%s\" ! mad name=decoder ! " - "vorbisenc name=encoder ! filesink location=\"%s\"", argv[1], argv[2]); + "vorbisenc name=encoder ! filesink location=\"%s\"", argv[1], argv[2]); pipeline = GST_ELEMENT (gst_parse_launch (description, &error)); if (!pipeline) { if (error) - g_print ("ERROR: pipeline could not be constructed: %s\n", error->message); + g_print ("ERROR: pipeline could not be constructed: %s\n", + error->message); else - g_print ("ERROR: pipeline could not be constructed\n"); + g_print ("ERROR: pipeline could not be constructed\n"); return -1; } @@ -57,7 +58,7 @@ main (gint argc, gchar *argv[]) dec_sink = gst_element_get_pad (decoder, "sink"); enc_src = gst_element_get_pad (encoder, "src"); - + if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) { g_print ("pipeline doesn't want to play\n"); return -1; @@ -71,33 +72,29 @@ main (gint argc, gchar *argv[]) format = GST_FORMAT_TIME; /* get the position */ - gst_pad_query (enc_src, GST_QUERY_POSITION, - &format, &position); + gst_pad_query (enc_src, GST_QUERY_POSITION, &format, &position); /* get the total duration */ - gst_pad_query (enc_src, GST_QUERY_TOTAL, - &format, &duration); + gst_pad_query (enc_src, GST_QUERY_TOTAL, &format, &duration); format = GST_FORMAT_BYTES; /* see how many bytes are genereated per 8 seconds (== bitrate) */ gst_pad_convert (enc_src, GST_FORMAT_TIME, 8 * GST_SECOND, - &format, &bitrate_enc); + &format, &bitrate_enc); gst_pad_convert (dec_sink, GST_FORMAT_TIME, 8 * GST_SECOND, - &format, &bitrate_dec); + &format, &bitrate_dec); g_print ("[%2dm %.2ds] of [%2dm %.2ds], " - "src avg bitrate: %lld, dest avg birate: %lld, ratio [%02.2f] \r", - (gint)(position / (GST_SECOND * 60)), - (gint)(position / (GST_SECOND)) % 60, - (gint)(duration / (GST_SECOND * 60)), - (gint)(duration / (GST_SECOND)) % 60, - bitrate_dec, - bitrate_enc, - (gfloat)bitrate_dec/bitrate_enc); + "src avg bitrate: %lld, dest avg birate: %lld, ratio [%02.2f] \r", + (gint) (position / (GST_SECOND * 60)), + (gint) (position / (GST_SECOND)) % 60, + (gint) (duration / (GST_SECOND * 60)), + (gint) (duration / (GST_SECOND)) % 60, + bitrate_dec, bitrate_enc, (gfloat) bitrate_dec / bitrate_enc); } g_print ("\n"); - + return 0; } diff --git a/examples/switch/switcher.c b/examples/switch/switcher.c index d0bc4a67..6296f6ad 100644 --- a/examples/switch/switcher.c +++ b/examples/switch/switcher.c @@ -16,7 +16,7 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -28,38 +28,36 @@ static GMainLoop *loop = NULL; static void -got_eos (GstElement *pipeline) +got_eos (GstElement * pipeline) { g_main_loop_quit (loop); } static gboolean -idle_iterate (GstElement *pipeline) +idle_iterate (GstElement * pipeline) { gst_bin_iterate (GST_BIN (pipeline)); return (GST_STATE (GST_ELEMENT (pipeline)) == GST_STATE_PLAYING); } static gboolean -switch_timer (GstElement *video_switch) +switch_timer (GstElement * video_switch) { gint nb_sources, active_source; - + g_object_get (G_OBJECT (video_switch), "nb_sources", &nb_sources, NULL); - g_object_get (G_OBJECT (video_switch), "active_source", - &active_source, NULL); - - active_source ++; - + g_object_get (G_OBJECT (video_switch), "active_source", &active_source, NULL); + + active_source++; + if (active_source > nb_sources - 1) active_source = 0; - - g_object_set (G_OBJECT (video_switch), "active_source", - active_source, NULL); - + + g_object_set (G_OBJECT (video_switch), "active_source", active_source, NULL); + g_message ("current number of sources : %d, active source %d", - nb_sources, active_source); - + nb_sources, active_source); + return (GST_STATE (GST_ELEMENT (video_switch)) == GST_STATE_PLAYING); } @@ -72,7 +70,7 @@ main (int argc, char *argv[]) gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); - + pipeline = gst_pipeline_new ("pipeline"); src1 = gst_element_factory_make ("videotestsrc", "src1"); g_object_set (G_OBJECT (src1), "pattern", 0, NULL); @@ -80,26 +78,25 @@ main (int argc, char *argv[]) g_object_set (G_OBJECT (src2), "pattern", 1, NULL); video_switch = gst_element_factory_make ("switch", "video_switch"); video_sink = gst_element_factory_make ("ximagesink", "video_sink"); - + gst_bin_add_many (GST_BIN (pipeline), src1, src2, video_switch, - video_sink, NULL); - + video_sink, NULL); + gst_element_link (src1, video_switch); gst_element_link (src2, video_switch); gst_element_link (video_switch, video_sink); - - g_signal_connect (G_OBJECT (pipeline), "eos", - G_CALLBACK (got_eos), NULL); + + g_signal_connect (G_OBJECT (pipeline), "eos", G_CALLBACK (got_eos), NULL); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); - + g_idle_add ((GSourceFunc) idle_iterate, pipeline); g_timeout_add (2000, (GSourceFunc) switch_timer, video_switch); - + g_main_loop_run (loop); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY); - + /* unref */ gst_object_unref (GST_OBJECT (pipeline)); diff --git a/ext/aalib/gstaasink.c b/ext/aalib/gstaasink.c index 6dfdb50c..e34bcf03 100644 --- a/ext/aalib/gstaasink.c +++ b/ext/aalib/gstaasink.c @@ -36,14 +36,16 @@ static GstElementDetails gst_aasink_details = { }; /* aasink signals and args */ -enum { +enum +{ SIGNAL_FRAME_DISPLAYED, SIGNAL_HAVE_SIZE, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_WIDTH, ARG_HEIGHT, @@ -58,27 +60,25 @@ enum { ARG_FRAME_TIME, }; -static GstStaticPadTemplate sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); -static void gst_aasink_base_init (gpointer g_class); -static void gst_aasink_class_init (GstAASinkClass *klass); -static void gst_aasink_init (GstAASink *aasink); +static void gst_aasink_base_init (gpointer g_class); +static void gst_aasink_class_init (GstAASinkClass * klass); +static void gst_aasink_init (GstAASink * aasink); -static void gst_aasink_set_clock (GstElement *element, GstClock *clock); -static void gst_aasink_chain (GstPad *pad, GstData *_data); +static void gst_aasink_set_clock (GstElement * element, GstClock * clock); +static void gst_aasink_chain (GstPad * pad, GstData * _data); -static void gst_aasink_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_aasink_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_aasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_aasink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_aasink_change_state (GstElement *element); +static GstElementStateReturn gst_aasink_change_state (GstElement * element); static GstElementClass *parent_class = NULL; static guint gst_aasink_signals[LAST_SIGNAL] = { 0 }; @@ -90,17 +90,18 @@ gst_aasink_get_type (void) if (!aasink_type) { static const GTypeInfo aasink_info = { - sizeof(GstAASinkClass), + sizeof (GstAASinkClass), gst_aasink_base_init, NULL, (GClassInitFunc) gst_aasink_class_init, NULL, NULL, - sizeof(GstAASink), + sizeof (GstAASink), 0, - (GInstanceInitFunc)gst_aasink_init, + (GInstanceInitFunc) gst_aasink_init, }; - aasink_type = g_type_register_static(GST_TYPE_ELEMENT, "GstAASink", &aasink_info, 0); + aasink_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstAASink", &aasink_info, 0); } return aasink_type; } @@ -110,19 +111,20 @@ static GType gst_aasink_drivers_get_type (void) { static GType driver_type = 0; + if (!driver_type) { GEnumValue *drivers; const struct aa_driver *driver; gint n_drivers; gint i; - for (n_drivers = 0; aa_drivers[n_drivers]; n_drivers++){ + for (n_drivers = 0; aa_drivers[n_drivers]; n_drivers++) { /* count number of drivers */ } - - drivers = g_new0(GEnumValue, n_drivers + 1); - for (i = 0; i < n_drivers; i++){ + drivers = g_new0 (GEnumValue, n_drivers + 1); + + for (i = 0; i < n_drivers; i++) { driver = aa_drivers[i]; drivers[i].value = i; drivers[i].value_name = g_strdup (driver->shortname); @@ -142,18 +144,19 @@ static GType gst_aasink_dither_get_type (void) { static GType dither_type = 0; + if (!dither_type) { GEnumValue *ditherers; gint n_ditherers; gint i; - for (n_ditherers = 0; aa_dithernames[n_ditherers]; n_ditherers++){ + for (n_ditherers = 0; aa_dithernames[n_ditherers]; n_ditherers++) { /* count number of ditherers */ } - - ditherers = g_new0(GEnumValue, n_ditherers + 1); - for (i = 0; i < n_ditherers; i++){ + ditherers = g_new0 (GEnumValue, n_ditherers + 1); + + for (i = 0; i < n_ditherers; i++) { ditherers[i].value = i; ditherers[i].value_name = g_strdup (aa_dithernames[i]); ditherers[i].value_nick = g_strdup (aa_dithernames[i]); @@ -178,74 +181,52 @@ gst_aasink_base_init (gpointer g_class) } static void -gst_aasink_class_init (GstAASinkClass *klass) +gst_aasink_class_init (GstAASinkClass * 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); - 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_DRIVER, - g_param_spec_enum("driver","driver","driver", - GST_TYPE_AADRIVERS,0,G_PARAM_READWRITE)); /* CHECKME! */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DITHER, - g_param_spec_enum("dither","dither","dither", - GST_TYPE_AADITHER,0,G_PARAM_READWRITE)); /* CHECKME! */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BRIGHTNESS, - g_param_spec_int("brightness","brightness","brightness", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CONTRAST, - g_param_spec_int("contrast","contrast","contrast", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_GAMMA, - g_param_spec_float("gamma","gamma","gamma", - 0.0,5.0,1.0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_INVERSION, - g_param_spec_boolean("inversion","inversion","inversion", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_RANDOMVAL, - g_param_spec_int("randomval","randomval","randomval", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FRAMES_DISPLAYED, - g_param_spec_int("frames_displayed","frames_displayed","frames_displayed", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FRAME_TIME, - g_param_spec_int("frame_time","frame_time","frame_time", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); /* CHECKME */ + 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_DRIVER, g_param_spec_enum ("driver", "driver", "driver", GST_TYPE_AADRIVERS, 0, G_PARAM_READWRITE)); /* CHECKME! */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, g_param_spec_enum ("dither", "dither", "dither", GST_TYPE_AADITHER, 0, G_PARAM_READWRITE)); /* CHECKME! */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BRIGHTNESS, g_param_spec_int ("brightness", "brightness", "brightness", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONTRAST, g_param_spec_int ("contrast", "contrast", "contrast", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAMMA, g_param_spec_float ("gamma", "gamma", "gamma", 0.0, 5.0, 1.0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_INVERSION, g_param_spec_boolean ("inversion", "inversion", "inversion", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RANDOMVAL, g_param_spec_int ("randomval", "randomval", "randomval", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAMES_DISPLAYED, g_param_spec_int ("frames_displayed", "frames_displayed", "frames_displayed", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAME_TIME, g_param_spec_int ("frame_time", "frame_time", "frame_time", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ gobject_class->set_property = gst_aasink_set_property; gobject_class->get_property = gst_aasink_get_property; gst_aasink_signals[SIGNAL_FRAME_DISPLAYED] = - g_signal_new ("frame-displayed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstAASinkClass, frame_displayed), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("frame-displayed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAASinkClass, frame_displayed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_aasink_signals[SIGNAL_HAVE_SIZE] = - g_signal_new ("have-size", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstAASinkClass, have_size), NULL, NULL, - gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); + g_signal_new ("have-size", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstAASinkClass, have_size), NULL, NULL, + gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); gstelement_class->change_state = gst_aasink_change_state; - gstelement_class->set_clock = gst_aasink_set_clock; + gstelement_class->set_clock = gst_aasink_set_clock; } static GstCaps * -gst_aasink_fixate (GstPad *pad, const GstCaps *caps) +gst_aasink_fixate (GstPad * pad, const GstCaps * caps) { GstStructure *structure; GstCaps *newcaps; - if (gst_caps_get_size (caps) > 1) return NULL; + if (gst_caps_get_size (caps) > 1) + return NULL; newcaps = gst_caps_copy (caps); structure = gst_caps_get_structure (newcaps, 0); @@ -257,7 +238,7 @@ gst_aasink_fixate (GstPad *pad, const GstCaps *caps) return newcaps; } if (gst_caps_structure_fixate_field_nearest_double (structure, "framerate", - 30.0)) { + 30.0)) { return newcaps; } @@ -266,7 +247,7 @@ gst_aasink_fixate (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_aasink_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_aasink_sinkconnect (GstPad * pad, const GstCaps * caps) { GstAASink *aasink; GstStructure *structure; @@ -280,16 +261,16 @@ gst_aasink_sinkconnect (GstPad *pad, const GstCaps *caps) /* FIXME aasink->format is never set */ GST_DEBUG ("aasink: setting %08lx (" GST_FOURCC_FORMAT ")", - aasink->format, GST_FOURCC_ARGS(aasink->format)); - - g_signal_emit( G_OBJECT (aasink), gst_aasink_signals[SIGNAL_HAVE_SIZE], 0, - aasink->width, aasink->height); + aasink->format, GST_FOURCC_ARGS (aasink->format)); + + g_signal_emit (G_OBJECT (aasink), gst_aasink_signals[SIGNAL_HAVE_SIZE], 0, + aasink->width, aasink->height); return GST_PAD_LINK_OK; } static void -gst_aasink_set_clock (GstElement *element, GstClock *clock) +gst_aasink_set_clock (GstElement * element, GstClock * clock) { GstAASink *aasink = GST_AASINK (element); @@ -297,16 +278,18 @@ gst_aasink_set_clock (GstElement *element, GstClock *clock) } static void -gst_aasink_init (GstAASink *aasink) +gst_aasink_init (GstAASink * aasink) { - aasink->sinkpad = gst_pad_new_from_template ( - gst_element_get_pad_template (GST_ELEMENT (aasink), "sink"), "sink"); + aasink->sinkpad = + gst_pad_new_from_template (gst_element_get_pad_template (GST_ELEMENT + (aasink), "sink"), "sink"); gst_element_add_pad (GST_ELEMENT (aasink), aasink->sinkpad); gst_pad_set_chain_function (aasink->sinkpad, gst_aasink_chain); gst_pad_set_link_function (aasink->sinkpad, gst_aasink_sinkconnect); gst_pad_set_fixate_function (aasink->sinkpad, gst_aasink_fixate); - memcpy(&aasink->ascii_surf, &aa_defparams, sizeof (struct aa_hardware_params)); + memcpy (&aasink->ascii_surf, &aa_defparams, + sizeof (struct aa_hardware_params)); aasink->ascii_parms.bright = 0; aasink->ascii_parms.contrast = 16; aasink->ascii_parms.gamma = 1.0; @@ -320,13 +303,12 @@ gst_aasink_init (GstAASink *aasink) aasink->clock = NULL; - GST_FLAG_SET(aasink, GST_ELEMENT_THREAD_SUGGESTED); + GST_FLAG_SET (aasink, GST_ELEMENT_THREAD_SUGGESTED); } static void -gst_aasink_scale (GstAASink *aasink, gchar *src, gchar *dest, - gint sw, gint sh, - gint dw, gint dh) +gst_aasink_scale (GstAASink * aasink, gchar * src, gchar * dest, + gint sw, gint sh, gint dw, gint dh) { gint ypos, yinc, y; gint xpos, xinc, x; @@ -340,20 +322,20 @@ gst_aasink_scale (GstAASink *aasink, gchar *src, gchar *dest, for (y = dh; y; y--) { while (ypos > 0x10000) { ypos -= 0x10000; - src += sw; + src += sw; } xpos = 0x10000; { guchar *destp = dest; guchar *srcp = src; - for ( x=dw; x; x-- ) { - while (xpos >= 0x10000L) { - srcp++; - xpos -= 0x10000L; - } - *destp++ = *srcp; - xpos += xinc; + for (x = dw; x; x--) { + while (xpos >= 0x10000L) { + srcp++; + xpos -= 0x10000L; + } + *destp++ = *srcp; + xpos += xinc; } } dest += dw; @@ -362,7 +344,7 @@ gst_aasink_scale (GstAASink *aasink, gchar *src, gchar *dest, } static void -gst_aasink_chain (GstPad *pad, GstData *_data) +gst_aasink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstAASink *aasink; @@ -373,33 +355,35 @@ gst_aasink_chain (GstPad *pad, GstData *_data) aasink = GST_AASINK (gst_pad_get_parent (pad)); - gst_aasink_scale (aasink, - GST_BUFFER_DATA (buf), /* src */ - aa_image (aasink->context), /* dest */ - aasink->width, /* sw */ - aasink->height, /* sh */ - aa_imgwidth (aasink->context), /* dw */ - aa_imgheight (aasink->context)); /* dh */ + gst_aasink_scale (aasink, GST_BUFFER_DATA (buf), /* src */ + aa_image (aasink->context), /* dest */ + aasink->width, /* sw */ + aasink->height, /* sh */ + aa_imgwidth (aasink->context), /* dw */ + aa_imgheight (aasink->context)); /* dh */ - GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP(buf)); + GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, + GST_BUFFER_TIMESTAMP (buf)); if (aasink->clock && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { gst_element_wait (GST_ELEMENT (aasink), GST_BUFFER_TIMESTAMP (buf)); } - aa_render (aasink->context, &aasink->ascii_parms, - 0, 0, aa_imgwidth (aasink->context), aa_imgheight (aasink->context)); + aa_render (aasink->context, &aasink->ascii_parms, + 0, 0, aa_imgwidth (aasink->context), aa_imgheight (aasink->context)); aa_flush (aasink->context); aa_getevent (aasink->context, FALSE); - g_signal_emit(G_OBJECT(aasink),gst_aasink_signals[SIGNAL_FRAME_DISPLAYED], 0); + g_signal_emit (G_OBJECT (aasink), gst_aasink_signals[SIGNAL_FRAME_DISPLAYED], + 0); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_aasink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_aasink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstAASink *aasink; @@ -415,31 +399,31 @@ gst_aasink_set_property (GObject *object, guint prop_id, const GValue *value, GP case ARG_HEIGHT: aasink->ascii_surf.height = g_value_get_int (value); break; - case ARG_DRIVER: { + case ARG_DRIVER:{ aasink->aa_driver = g_value_get_enum (value); break; } - case ARG_DITHER: { + case ARG_DITHER:{ aasink->ascii_parms.dither = g_value_get_enum (value); break; } - case ARG_BRIGHTNESS: { + case ARG_BRIGHTNESS:{ aasink->ascii_parms.bright = g_value_get_int (value); break; } - case ARG_CONTRAST: { + case ARG_CONTRAST:{ aasink->ascii_parms.contrast = g_value_get_int (value); break; } - case ARG_GAMMA: { + case ARG_GAMMA:{ aasink->ascii_parms.gamma = g_value_get_float (value); break; } - case ARG_INVERSION: { + case ARG_INVERSION:{ aasink->ascii_parms.inversion = g_value_get_boolean (value); break; } - case ARG_RANDOMVAL: { + case ARG_RANDOMVAL:{ aasink->ascii_parms.randomval = g_value_get_int (value); break; } @@ -449,59 +433,60 @@ gst_aasink_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_aasink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_aasink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstAASink *aasink; /* it's not null if we got it, but it might not be ours */ - aasink = GST_AASINK(object); + aasink = GST_AASINK (object); switch (prop_id) { - case ARG_WIDTH: { + case ARG_WIDTH:{ g_value_set_int (value, aasink->ascii_surf.width); break; } - case ARG_HEIGHT: { + case ARG_HEIGHT:{ g_value_set_int (value, aasink->ascii_surf.height); break; } - case ARG_DRIVER: { + case ARG_DRIVER:{ g_value_set_enum (value, aasink->aa_driver); break; } - case ARG_DITHER: { + case ARG_DITHER:{ g_value_set_enum (value, aasink->ascii_parms.dither); break; } - case ARG_BRIGHTNESS: { + case ARG_BRIGHTNESS:{ g_value_set_int (value, aasink->ascii_parms.bright); break; } - case ARG_CONTRAST: { + case ARG_CONTRAST:{ g_value_set_int (value, aasink->ascii_parms.contrast); break; } - case ARG_GAMMA: { + case ARG_GAMMA:{ g_value_set_float (value, aasink->ascii_parms.gamma); break; } - case ARG_INVERSION: { + case ARG_INVERSION:{ g_value_set_boolean (value, aasink->ascii_parms.inversion); break; } - case ARG_RANDOMVAL: { + case ARG_RANDOMVAL:{ g_value_set_int (value, aasink->ascii_parms.randomval); break; } - case ARG_FRAMES_DISPLAYED: { + case ARG_FRAMES_DISPLAYED:{ g_value_set_int (value, aasink->frames_displayed); break; } - case ARG_FRAME_TIME: { - g_value_set_int (value, aasink->frame_time/1000000); + case ARG_FRAME_TIME:{ + g_value_set_int (value, aasink->frame_time / 1000000); break; } - default: { + default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } @@ -509,20 +494,20 @@ gst_aasink_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -gst_aasink_open (GstAASink *aasink) +gst_aasink_open (GstAASink * aasink) { - g_return_val_if_fail (!GST_FLAG_IS_SET (aasink ,GST_AASINK_OPEN), FALSE); + g_return_val_if_fail (!GST_FLAG_IS_SET (aasink, GST_AASINK_OPEN), FALSE); - aa_recommendhidisplay(aa_drivers[aasink->aa_driver]->shortname); + aa_recommendhidisplay (aa_drivers[aasink->aa_driver]->shortname); aasink->context = aa_autoinit (&aasink->ascii_surf); if (aasink->context == NULL) { GST_ELEMENT_ERROR (GST_ELEMENT (aasink), LIBRARY, TOO_LAZY, (NULL), - ("error opening aalib context")); + ("error opening aalib context")); return FALSE; } - aa_autoinitkbd(aasink->context, 0); - aa_resizehandler(aasink->context, (void *)aa_resize); + aa_autoinitkbd (aasink->context, 0); + aa_resizehandler (aasink->context, (void *) aa_resize); GST_FLAG_SET (aasink, GST_AASINK_OPEN); @@ -530,9 +515,9 @@ gst_aasink_open (GstAASink *aasink) } static void -gst_aasink_close (GstAASink *aasink) +gst_aasink_close (GstAASink * aasink) { - g_return_if_fail (GST_FLAG_IS_SET (aasink ,GST_AASINK_OPEN)); + g_return_if_fail (GST_FLAG_IS_SET (aasink, GST_AASINK_OPEN)); aa_close (aasink->context); @@ -540,7 +525,7 @@ gst_aasink_close (GstAASink *aasink) } static GstElementStateReturn -gst_aasink_change_state (GstElement *element) +gst_aasink_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_AASINK (element), GST_STATE_FAILURE); @@ -550,7 +535,7 @@ gst_aasink_change_state (GstElement *element) } else { if (!GST_FLAG_IS_SET (element, GST_AASINK_OPEN)) { if (!gst_aasink_open (GST_AASINK (element))) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } } @@ -561,7 +546,7 @@ gst_aasink_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "aasink", GST_RANK_NONE, GST_TYPE_AASINK)) return FALSE; @@ -569,14 +554,8 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "aasink", - "ASCII Art video sink", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "aasink", + "ASCII Art video sink", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/aalib/gstaasink.h b/ext/aalib/gstaasink.h index e50362f6..d11ff20e 100644 --- a/ext/aalib/gstaasink.h +++ b/ext/aalib/gstaasink.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_AASINK \ @@ -41,48 +42,51 @@ extern "C" { #define GST_IS_AASINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AASINK)) -typedef enum { - GST_AASINK_OPEN = GST_ELEMENT_FLAG_LAST, + typedef enum + { + GST_AASINK_OPEN = GST_ELEMENT_FLAG_LAST, - GST_AASINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, -} GstAASinkFlags; + GST_AASINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, + } GstAASinkFlags; -typedef struct _GstAASink GstAASink; -typedef struct _GstAASinkClass GstAASinkClass; + typedef struct _GstAASink GstAASink; + typedef struct _GstAASinkClass GstAASinkClass; -struct _GstAASink { - GstElement element; + struct _GstAASink + { + GstElement element; - GstPad *sinkpad; + GstPad *sinkpad; - gulong format; - gint width, height; + gulong format; + gint width, height; - gint frames_displayed; - guint64 frame_time; + gint frames_displayed; + guint64 frame_time; - GstClock *clock; + GstClock *clock; - aa_context *context; - struct aa_hardware_params ascii_surf; - struct aa_renderparams ascii_parms; - aa_palette palette; - gint aa_driver; -}; + aa_context *context; + struct aa_hardware_params ascii_surf; + struct aa_renderparams ascii_parms; + aa_palette palette; + gint aa_driver; + }; -struct _GstAASinkClass { - GstElementClass parent_class; + struct _GstAASinkClass + { + GstElementClass parent_class; - /* signals */ - void (*frame_displayed) (GstElement *element); - void (*have_size) (GstElement *element, guint width, guint height); -}; + /* signals */ + void (*frame_displayed) (GstElement * element); + void (*have_size) (GstElement * element, guint width, guint height); + }; -GType gst_aasink_get_type(void); + GType gst_aasink_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_AASINKE_H__ */ +#endif /* __GST_AASINKE_H__ */ diff --git a/ext/dv/gstdvdec.h b/ext/dv/gstdvdec.h index 4dffd96f..6052c76f 100644 --- a/ext/dv/gstdvdec.h +++ b/ext/dv/gstdvdec.h @@ -24,8 +24,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #include @@ -33,55 +34,55 @@ extern "C" { /* This is the definition of the element's object structure. */ -typedef struct _GstDVDec GstDVDec; + typedef struct _GstDVDec GstDVDec; /* The structure itself is derived from GstElement, as can be seen by the * fact that there's a complete instance of the GstElement structure at * the beginning of the object. This allows the element to be cast to * an Element or even an Object. */ -struct _GstDVDec { - GstElement element; - - /* We need to keep track of our pads, so we do so here. */ - GstPad *sinkpad, - *videosrcpad, - *audiosrcpad; - - dv_decoder_t *decoder; - gboolean clamp_luma; - gboolean clamp_chroma; - gint quality; - - GstByteStream *bs; - dv_color_space_t space; - gint bpp; - gboolean PAL; - gdouble framerate; - gint height; - gint frequency; - gint channels; - - gint length; - guint64 next_ts; - guint64 end_position; - gboolean need_discont; - gboolean loop; - - gboolean found_header; - - gint16 *audio_buffers[4]; -}; + struct _GstDVDec + { + GstElement element; + + /* We need to keep track of our pads, so we do so here. */ + GstPad *sinkpad, *videosrcpad, *audiosrcpad; + + dv_decoder_t *decoder; + gboolean clamp_luma; + gboolean clamp_chroma; + gint quality; + + GstByteStream *bs; + dv_color_space_t space; + gint bpp; + gboolean PAL; + gdouble framerate; + gint height; + gint frequency; + gint channels; + + gint length; + guint64 next_ts; + guint64 end_position; + gboolean need_discont; + gboolean loop; + + gboolean found_header; + + gint16 *audio_buffers[4]; + }; /* The other half of the object is its class. The class also derives from * the same parent, though it must be the class structure this time. * Function pointers for polymophic methods and signals are placed in this * structure. */ -typedef struct _GstDVDecClass GstDVDecClass; + typedef struct _GstDVDecClass GstDVDecClass; -struct _GstDVDecClass { - GstElementClass parent_class; -}; + struct _GstDVDecClass + { + GstElementClass parent_class; + }; /* Five standard preprocessing macros are used in the Gtk+ object system. * The first uses the object's _get_type function to return the GType @@ -107,12 +108,12 @@ struct _GstDVDecClass { /* This is the only prototype needed, because it is used in the above * GST_TYPE_DVDEC macro. */ -GType gst_dvdec_get_type(void); + GType gst_dvdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_DVDEC_H__ */ +#endif /* __GST_DVDEC_H__ */ diff --git a/ext/esd/esdmon.c b/ext/esd/esdmon.c index 25e9df81..4a7f4ca1 100644 --- a/ext/esd/esdmon.c +++ b/ext/esd/esdmon.c @@ -37,12 +37,14 @@ static GstElementDetails esdmon_details = { }; /* Signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_DEPTH, ARG_BYTESPERREAD, @@ -52,43 +54,37 @@ enum { ARG_HOST, }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " - "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " - "signed = (boolean) TRUE, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = [ 8000, 96000 ], " - "channels = [ 1, 2 ]; " - "audio/x-raw-int, " - "signed = (boolean) FALSE, " - "width = (int) 8, " - "depth = (int) 8, " - "rate = [ 8000, 96000 ], " - "channels = [ 1, 2 ]" - ) -); - -static void gst_esdmon_base_init (gpointer g_class); -static void gst_esdmon_class_init (gpointer g_class, gpointer class_data); -static void gst_esdmon_init (GTypeInstance *instance, gpointer g_class); - -static gboolean gst_esdmon_open_audio (GstEsdmon *src); -static void gst_esdmon_close_audio (GstEsdmon *src); -static GstElementStateReturn gst_esdmon_change_state (GstElement *element); -static gboolean gst_esdmon_sync_parms (GstEsdmon *esdmon); - -static GstData * gst_esdmon_get (GstPad *pad); - -static void gst_esdmon_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_esdmon_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = [ 8000, 96000 ], " + "channels = [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) FALSE, " + "width = (int) 8, " + "depth = (int) 8, " "rate = [ 8000, 96000 ], " "channels = [ 1, 2 ]") + ); + +static void gst_esdmon_base_init (gpointer g_class); +static void gst_esdmon_class_init (gpointer g_class, gpointer class_data); +static void gst_esdmon_init (GTypeInstance * instance, gpointer g_class); + +static gboolean gst_esdmon_open_audio (GstEsdmon * src); +static void gst_esdmon_close_audio (GstEsdmon * src); +static GstElementStateReturn gst_esdmon_change_state (GstElement * element); +static gboolean gst_esdmon_sync_parms (GstEsdmon * esdmon); + +static GstData *gst_esdmon_get (GstPad * pad); + +static void gst_esdmon_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_esdmon_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); #define GST_TYPE_ESDMON_DEPTHS (gst_esdmon_depths_get_type()) static GType @@ -101,7 +97,8 @@ gst_esdmon_depths_get_type (void) {0, NULL, NULL}, }; if (!esdmon_depths_type) { - esdmon_depths_type = g_enum_register_static("GstEsdmonDepths", esdmon_depths); + esdmon_depths_type = + g_enum_register_static ("GstEsdmonDepths", esdmon_depths); } return esdmon_depths_type; } @@ -117,13 +114,15 @@ gst_esdmon_channels_get_type (void) {0, NULL, NULL}, }; if (!esdmon_channels_type) { - esdmon_channels_type = g_enum_register_static("GstEsdmonChannels", esdmon_channels); + esdmon_channels_type = + g_enum_register_static ("GstEsdmonChannels", esdmon_channels); } return esdmon_channels_type; } static GstElementClass *parent_class = NULL; + /*static guint gst_esdmon_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -133,17 +132,18 @@ gst_esdmon_get_type (void) if (!esdmon_type) { static const GTypeInfo esdmon_info = { - sizeof(GstEsdmonClass), + sizeof (GstEsdmonClass), gst_esdmon_base_init, NULL, gst_esdmon_class_init, NULL, NULL, - sizeof(GstEsdmon), + sizeof (GstEsdmon), 0, gst_esdmon_init, }; - esdmon_type = g_type_register_static(GST_TYPE_ELEMENT, "GstEsdmon", &esdmon_info, 0); + esdmon_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstEsdmon", &esdmon_info, 0); } return esdmon_type; } @@ -153,7 +153,7 @@ gst_esdmon_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); gst_element_class_set_details (element_class, &esdmon_details); } @@ -166,24 +166,12 @@ gst_esdmon_class_init (gpointer g_class, gpointer class_data) parent_class = g_type_class_peek_parent (g_class); - g_object_class_install_property(gobject_class, ARG_BYTESPERREAD, - g_param_spec_ulong("bytes_per_read","bytes_per_read","bytes_per_read", - 0,G_MAXULONG,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(gobject_class, ARG_CUROFFSET, - g_param_spec_ulong("curoffset","curoffset","curoffset", - 0,G_MAXULONG,0,G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property(gobject_class, ARG_DEPTH, - g_param_spec_enum("depth","depth","depth", - GST_TYPE_ESDMON_DEPTHS,16,G_PARAM_READWRITE)); /* CHECKME! */ - g_object_class_install_property(gobject_class, ARG_CHANNELS, - g_param_spec_enum("channels","channels","channels", - GST_TYPE_ESDMON_CHANNELS,2,G_PARAM_READWRITE)); /* CHECKME! */ - g_object_class_install_property(gobject_class, ARG_RATE, - g_param_spec_int("frequency","frequency","frequency", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(gobject_class, ARG_HOST, - g_param_spec_string("host","host","host", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_BYTESPERREAD, g_param_spec_ulong ("bytes_per_read", "bytes_per_read", "bytes_per_read", 0, G_MAXULONG, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_CUROFFSET, g_param_spec_ulong ("curoffset", "curoffset", "curoffset", 0, G_MAXULONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_DEPTH, g_param_spec_enum ("depth", "depth", "depth", GST_TYPE_ESDMON_DEPTHS, 16, G_PARAM_READWRITE)); /* CHECKME! */ + g_object_class_install_property (gobject_class, ARG_CHANNELS, g_param_spec_enum ("channels", "channels", "channels", GST_TYPE_ESDMON_CHANNELS, 2, G_PARAM_READWRITE)); /* CHECKME! */ + g_object_class_install_property (gobject_class, ARG_RATE, g_param_spec_int ("frequency", "frequency", "frequency", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_HOST, g_param_spec_string ("host", "host", "host", NULL, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_esdmon_set_property; gobject_class->get_property = gst_esdmon_get_property; @@ -192,16 +180,16 @@ gst_esdmon_class_init (gpointer g_class, gpointer class_data) } static void -gst_esdmon_init(GTypeInstance *instance, gpointer g_class) +gst_esdmon_init (GTypeInstance * instance, gpointer g_class) { GstEsdmon *esdmon = GST_ESDMON (instance); - esdmon->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (esdmon), "src"), - "src"); - gst_pad_set_get_function(esdmon->srcpad, gst_esdmon_get); + esdmon->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (esdmon), "src"), "src"); + gst_pad_set_get_function (esdmon->srcpad, gst_esdmon_get); gst_pad_use_explicit_caps (esdmon->srcpad); - gst_element_add_pad(GST_ELEMENT(esdmon), esdmon->srcpad); + gst_element_add_pad (GST_ELEMENT (esdmon), esdmon->srcpad); esdmon->fd = -1; /* FIXME: get default from somewhere better than just putting them inline. */ @@ -216,12 +204,13 @@ gst_esdmon_init(GTypeInstance *instance, gpointer g_class) } static gboolean -gst_esdmon_sync_parms (GstEsdmon *esdmon) +gst_esdmon_sync_parms (GstEsdmon * esdmon) { g_return_val_if_fail (esdmon != NULL, FALSE); g_return_val_if_fail (GST_IS_ESDMON (esdmon), FALSE); - if (esdmon->fd == -1) return TRUE; + if (esdmon->fd == -1) + return TRUE; /* Need to set fd to use new parameters: only way to do this is to reopen. */ gst_esdmon_close_audio (esdmon); @@ -229,7 +218,7 @@ gst_esdmon_sync_parms (GstEsdmon *esdmon) } static GstData * -gst_esdmon_get (GstPad *pad) +gst_esdmon_get (GstPad * pad) { GstEsdmon *esdmon; GstBuffer *buf; @@ -237,36 +226,33 @@ gst_esdmon_get (GstPad *pad) glong readsamples; g_return_val_if_fail (pad != NULL, NULL); - esdmon = GST_ESDMON(gst_pad_get_parent (pad)); + esdmon = GST_ESDMON (gst_pad_get_parent (pad)); GST_DEBUG ("attempting to read something from esdmon"); buf = gst_buffer_new (); g_return_val_if_fail (buf, NULL); - GST_BUFFER_DATA (buf) = (gpointer)g_malloc (esdmon->bytes_per_read); + GST_BUFFER_DATA (buf) = (gpointer) g_malloc (esdmon->bytes_per_read); - readbytes = read (esdmon->fd, - GST_BUFFER_DATA (buf), - esdmon->bytes_per_read); + readbytes = read (esdmon->fd, GST_BUFFER_DATA (buf), esdmon->bytes_per_read); if (readbytes == 0) { - gst_element_set_eos (GST_ELEMENT (esdmon)); - return NULL; + gst_element_set_eos (GST_ELEMENT (esdmon)); + return NULL; } if (!GST_PAD_CAPS (pad)) { gint sign = (esdmon->depth == 8 ? FALSE : TRUE); + /* set caps on src pad */ if (gst_pad_set_explicit_caps (esdmon->srcpad, - gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, sign, - "width", G_TYPE_INT, esdmon->depth, - "depth", G_TYPE_INT, esdmon->depth, - "rate", G_TYPE_INT, esdmon->frequency, - "channels", G_TYPE_INT, esdmon->channels - )) <= 0) - { + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, sign, + "width", G_TYPE_INT, esdmon->depth, + "depth", G_TYPE_INT, esdmon->depth, + "rate", G_TYPE_INT, esdmon->frequency, + "channels", G_TYPE_INT, esdmon->channels)) <= 0) { GST_ELEMENT_ERROR (esdmon, CORE, NEGOTIATION, (NULL), (NULL)); return NULL; } @@ -275,25 +261,28 @@ gst_esdmon_get (GstPad *pad) GST_BUFFER_SIZE (buf) = readbytes; GST_BUFFER_OFFSET (buf) = esdmon->curoffset; GST_BUFFER_TIMESTAMP (buf) = esdmon->basetime + - esdmon->samples_since_basetime * GST_SECOND / esdmon->frequency; + esdmon->samples_since_basetime * GST_SECOND / esdmon->frequency; esdmon->curoffset += readbytes; readsamples = readbytes / esdmon->channels; - if (esdmon->depth == 16) readsamples /= 2; + if (esdmon->depth == 16) + readsamples /= 2; esdmon->samples_since_basetime += readsamples; - GST_DEBUG ("pushed buffer from esdmon of %ld bytes, timestamp %" G_GINT64_FORMAT, readbytes, GST_BUFFER_TIMESTAMP (buf)); + GST_DEBUG ("pushed buffer from esdmon of %ld bytes, timestamp %" + G_GINT64_FORMAT, readbytes, GST_BUFFER_TIMESTAMP (buf)); return GST_DATA (buf); } static void -gst_esdmon_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_esdmon_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstEsdmon *esdmon; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ESDMON(object)); - esdmon = GST_ESDMON(object); + g_return_if_fail (GST_IS_ESDMON (object)); + esdmon = GST_ESDMON (object); switch (prop_id) { case ARG_BYTESPERREAD: @@ -310,7 +299,8 @@ gst_esdmon_set_property (GObject *object, guint prop_id, const GValue *value, GP break; case ARG_RATE: /* Preserve the timestamps */ - esdmon->basetime = esdmon->samples_since_basetime * GST_SECOND / esdmon->frequency; + esdmon->basetime = + esdmon->samples_since_basetime * GST_SECOND / esdmon->frequency; esdmon->samples_since_basetime = 0; /* Set the new frequency */ @@ -318,11 +308,12 @@ gst_esdmon_set_property (GObject *object, guint prop_id, const GValue *value, GP gst_esdmon_sync_parms (esdmon); break; case ARG_HOST: - if (esdmon->host != NULL) g_free(esdmon->host); + if (esdmon->host != NULL) + g_free (esdmon->host); if (g_value_get_string (value) == NULL) - esdmon->host = NULL; + esdmon->host = NULL; else - esdmon->host = g_strdup (g_value_get_string (value)); + esdmon->host = g_strdup (g_value_get_string (value)); break; default: break; @@ -330,13 +321,14 @@ gst_esdmon_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_esdmon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_esdmon_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstEsdmon *esdmon; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ESDMON(object)); - esdmon = GST_ESDMON(object); + g_return_if_fail (GST_IS_ESDMON (object)); + esdmon = GST_ESDMON (object); switch (prop_id) { case ARG_BYTESPERREAD: @@ -364,42 +356,46 @@ gst_esdmon_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } gboolean -gst_esdmon_factory_init (GstPlugin *plugin) +gst_esdmon_factory_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "esdmon", GST_RANK_NONE, GST_TYPE_ESDMON)) return FALSE; - + return TRUE; } static gboolean -gst_esdmon_open_audio (GstEsdmon *src) +gst_esdmon_open_audio (GstEsdmon * src) { /* Name used by esound for this connection. */ - const char * connname = "GStreamer"; + const char *connname = "GStreamer"; /* Bitmap describing audio format. */ esd_format_t esdformat = ESD_STREAM | ESD_PLAY; g_return_val_if_fail (src->fd == -1, FALSE); - if (src->depth == 16) esdformat |= ESD_BITS16; - else if (src->depth == 8) esdformat |= ESD_BITS8; + if (src->depth == 16) + esdformat |= ESD_BITS16; + else if (src->depth == 8) + esdformat |= ESD_BITS8; else { GST_DEBUG ("esdmon: invalid bit depth (%d)", src->depth); return FALSE; } - if (src->channels == 2) esdformat |= ESD_STEREO; - else if (src->channels == 1) esdformat |= ESD_MONO; + if (src->channels == 2) + esdformat |= ESD_STEREO; + else if (src->channels == 1) + esdformat |= ESD_MONO; else { GST_DEBUG ("esdmon: invalid number of channels (%d)", src->channels); return FALSE; } GST_DEBUG ("esdmon: attempting to open connection to esound server"); - src->fd = esd_monitor_stream(esdformat, src->frequency, src->host, connname); - if ( src->fd < 0 ) { + src->fd = esd_monitor_stream (esdformat, src->frequency, src->host, connname); + if (src->fd < 0) { GST_DEBUG ("esdmon: can't open connection to esound server"); return FALSE; } @@ -410,11 +406,12 @@ gst_esdmon_open_audio (GstEsdmon *src) } static void -gst_esdmon_close_audio (GstEsdmon *src) +gst_esdmon_close_audio (GstEsdmon * src) { - if (src->fd < 0) return; + if (src->fd < 0) + return; - close(src->fd); + close (src->fd); src->fd = -1; GST_FLAG_UNSET (src, GST_ESDMON_OPEN); @@ -423,7 +420,7 @@ gst_esdmon_close_audio (GstEsdmon *src) } static GstElementStateReturn -gst_esdmon_change_state (GstElement *element) +gst_esdmon_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_ESDMON (element), FALSE); @@ -443,4 +440,3 @@ gst_esdmon_change_state (GstElement *element) return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; } - diff --git a/ext/esd/esdmon.h b/ext/esd/esdmon.h index f50e6544..5b8c7e49 100644 --- a/ext/esd/esdmon.h +++ b/ext/esd/esdmon.h @@ -26,7 +26,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_ESDMON \ (gst_esdmon_get_type()) #define GST_ESDMON(obj) \ @@ -37,21 +36,22 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDMON)) #define GST_IS_ESDMON_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDMON)) - -typedef enum { - GST_ESDMON_OPEN = GST_ELEMENT_FLAG_LAST, - GST_ESDMON_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, + typedef enum +{ + GST_ESDMON_OPEN = GST_ELEMENT_FLAG_LAST, + GST_ESDMON_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, } GstEsdSrcFlags; typedef struct _GstEsdmon GstEsdmon; typedef struct _GstEsdmonClass GstEsdmonClass; -struct _GstEsdmon { +struct _GstEsdmon +{ GstElement element; GstPad *srcpad; - gchar* host; + gchar *host; int fd; @@ -65,14 +65,13 @@ struct _GstEsdmon { guint64 bytes_per_read; }; -struct _GstEsdmonClass { +struct _GstEsdmonClass +{ GstElementClass parent_class; }; -GType gst_esdmon_get_type(void); -gboolean gst_esdmon_factory_init(GstPlugin *plugin); +GType gst_esdmon_get_type (void); +gboolean gst_esdmon_factory_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_ESDMON_H__ */ - diff --git a/ext/esd/esdsink.c b/ext/esd/esdsink.c index 4672ab79..ce7045e7 100644 --- a/ext/esd/esdsink.c +++ b/ext/esd/esdsink.c @@ -40,12 +40,14 @@ static GstElementDetails esdsink_details = { }; /* Signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_MUTE, ARG_HOST, @@ -53,41 +55,36 @@ enum { ARG_FALLBACK, }; -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " - "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " - "signed = (boolean) TRUE, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = 44100, " - "channels = 2" - ) -); - -static void gst_esdsink_base_init (gpointer g_class); -static void gst_esdsink_class_init (gpointer g_class, gpointer class_data); -static void gst_esdsink_init (GTypeInstance *instance, gpointer g_class); - -static gboolean gst_esdsink_open_audio (GstEsdsink *sink); -static void gst_esdsink_close_audio (GstEsdsink *sink); -static GstElementStateReturn gst_esdsink_change_state (GstElement *element); - -static GstClockTime gst_esdsink_get_time (GstClock *clock, gpointer data); -static GstClock * gst_esdsink_get_clock (GstElement *element); -static void gst_esdsink_set_clock (GstElement *element, GstClock *clock); -static void gst_esdsink_chain (GstPad *pad, GstData *_data); - -static void gst_esdsink_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_esdsink_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " "rate = 44100, " "channels = 2") + ); + +static void gst_esdsink_base_init (gpointer g_class); +static void gst_esdsink_class_init (gpointer g_class, gpointer class_data); +static void gst_esdsink_init (GTypeInstance * instance, gpointer g_class); + +static gboolean gst_esdsink_open_audio (GstEsdsink * sink); +static void gst_esdsink_close_audio (GstEsdsink * sink); +static GstElementStateReturn gst_esdsink_change_state (GstElement * element); + +static GstClockTime gst_esdsink_get_time (GstClock * clock, gpointer data); +static GstClock *gst_esdsink_get_clock (GstElement * element); +static void gst_esdsink_set_clock (GstElement * element, GstClock * clock); +static void gst_esdsink_chain (GstPad * pad, GstData * _data); + +static void gst_esdsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_esdsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_esdsink_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -97,17 +94,19 @@ gst_esdsink_get_type (void) if (!esdsink_type) { static const GTypeInfo esdsink_info = { - sizeof(GstEsdsinkClass), + sizeof (GstEsdsinkClass), gst_esdsink_base_init, NULL, gst_esdsink_class_init, NULL, NULL, - sizeof(GstEsdsink), + sizeof (GstEsdsink), 0, gst_esdsink_init, }; - esdsink_type = g_type_register_static(GST_TYPE_ELEMENT, "GstEsdsink", &esdsink_info, 0); + esdsink_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstEsdsink", &esdsink_info, + 0); } return esdsink_type; } @@ -117,7 +116,7 @@ gst_esdsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &esdsink_details); } @@ -130,64 +129,64 @@ gst_esdsink_class_init (gpointer g_class, gpointer class_data) parent_class = g_type_class_peek_parent (g_class); - g_object_class_install_property(gobject_class, ARG_MUTE, - g_param_spec_boolean("mute","mute","mute", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(gobject_class, ARG_HOST, - g_param_spec_string("host","host","host", - NULL, G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(gobject_class, ARG_SYNC, - g_param_spec_boolean("sync","sync","Synchronize output to clock", - TRUE,G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_MUTE, g_param_spec_boolean ("mute", "mute", "mute", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_HOST, g_param_spec_string ("host", "host", "host", NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (gobject_class, ARG_SYNC, + g_param_spec_boolean ("sync", "sync", "Synchronize output to clock", + TRUE, G_PARAM_READWRITE)); #if 0 /* This option is disabled because it is dumb in GStreamer's architecture. */ - g_object_class_install_property(gobject_class, ARG_FALLBACK, - g_param_spec_boolean("fallback","fallback","Fall back to using OSS if Esound daemon is not present", - FALSE,G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_FALLBACK, + g_param_spec_boolean ("fallback", "fallback", + "Fall back to using OSS if Esound daemon is not present", FALSE, + G_PARAM_READWRITE)); #endif gobject_class->set_property = gst_esdsink_set_property; gobject_class->get_property = gst_esdsink_get_property; gstelement_class->change_state = gst_esdsink_change_state; - gstelement_class->set_clock = gst_esdsink_set_clock; - gstelement_class->get_clock = gst_esdsink_get_clock; + gstelement_class->set_clock = gst_esdsink_set_clock; + gstelement_class->get_clock = gst_esdsink_get_clock; } static void -gst_esdsink_init(GTypeInstance *instance, gpointer g_class) +gst_esdsink_init (GTypeInstance * instance, gpointer g_class) { GstEsdsink *esdsink = GST_ESDSINK (instance); - - esdsink->sinkpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (instance), "sink"), - "sink"); - gst_element_add_pad(GST_ELEMENT(esdsink), esdsink->sinkpad); - gst_pad_set_chain_function(esdsink->sinkpad, GST_DEBUG_FUNCPTR(gst_esdsink_chain)); + + esdsink->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (instance), "sink"), "sink"); + gst_element_add_pad (GST_ELEMENT (esdsink), esdsink->sinkpad); + gst_pad_set_chain_function (esdsink->sinkpad, + GST_DEBUG_FUNCPTR (gst_esdsink_chain)); GST_FLAG_SET (esdsink, GST_ELEMENT_EVENT_AWARE); esdsink->mute = FALSE; esdsink->fd = -1; /* FIXME: get default from somewhere better than just putting them inline. */ - /*esdsink->negotiated = FALSE;*/ + /*esdsink->negotiated = FALSE; */ /* we have static caps on our template, so it always is negotiated */ esdsink->negotiated = TRUE; esdsink->format = 16; esdsink->depth = 16; esdsink->channels = 2; esdsink->frequency = 44100; - esdsink->bytes_per_sample = esdsink->channels * (esdsink->depth/8); + esdsink->bytes_per_sample = esdsink->channels * (esdsink->depth / 8); esdsink->host = getenv ("ESPEAKER"); - esdsink->provided_clock = gst_audio_clock_new("esdclock", gst_esdsink_get_time, esdsink); - gst_object_set_parent(GST_OBJECT(esdsink->provided_clock), GST_OBJECT(esdsink)); + esdsink->provided_clock = + gst_audio_clock_new ("esdclock", gst_esdsink_get_time, esdsink); + gst_object_set_parent (GST_OBJECT (esdsink->provided_clock), + GST_OBJECT (esdsink)); esdsink->sync = TRUE; esdsink->fallback = FALSE; } #ifdef unused static GstPadLinkReturn -gst_esdsink_link (GstPad *pad, const GstCaps *caps) +gst_esdsink_link (GstPad * pad, const GstCaps * caps) { GstEsdsink *esdsink; GstStructure *structure; @@ -199,7 +198,7 @@ gst_esdsink_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "channels", &esdsink->channels); gst_structure_get_int (structure, "rate", &esdsink->frequency); - esdsink->bytes_per_sample = esdsink->channels * (esdsink->depth/8); + esdsink->bytes_per_sample = esdsink->channels * (esdsink->depth / 8); gst_esdsink_close_audio (esdsink); if (gst_esdsink_open_audio (esdsink)) { @@ -215,29 +214,29 @@ gst_esdsink_link (GstPad *pad, const GstCaps *caps) #endif static GstClockTime -gst_esdsink_get_time (GstClock *clock, gpointer data) +gst_esdsink_get_time (GstClock * clock, gpointer data) { - GstEsdsink *esdsink = GST_ESDSINK(data); + GstEsdsink *esdsink = GST_ESDSINK (data); GstClockTime res; res = (esdsink->handled * GST_SECOND) / esdsink->frequency; - //- GST_SECOND * 2; + //- GST_SECOND * 2; return res; } static GstClock * -gst_esdsink_get_clock (GstElement *element) +gst_esdsink_get_clock (GstElement * element) { GstEsdsink *esdsink; esdsink = GST_ESDSINK (element); - return GST_CLOCK(esdsink->provided_clock); + return GST_CLOCK (esdsink->provided_clock); } static void -gst_esdsink_set_clock (GstElement *element, GstClock *clock) +gst_esdsink_set_clock (GstElement * element, GstClock * clock) { GstEsdsink *esdsink; @@ -247,7 +246,7 @@ gst_esdsink_set_clock (GstElement *element, GstClock *clock) } static void -gst_esdsink_chain (GstPad *pad, GstData *_data) +gst_esdsink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstEsdsink *esdsink; @@ -256,24 +255,24 @@ gst_esdsink_chain (GstPad *pad, GstData *_data) if (!esdsink->negotiated) { GST_ELEMENT_ERROR (esdsink, CORE, NEGOTIATION, (NULL), - ("element wasn't negotiated before chain function")); + ("element wasn't negotiated before chain function")); goto done; } - if (GST_IS_EVENT(buf)){ - GstEvent *event = GST_EVENT(buf); + if (GST_IS_EVENT (buf)) { + GstEvent *event = GST_EVENT (buf); - switch(GST_EVENT_TYPE(event)){ + switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: gst_audio_clock_set_active (GST_AUDIO_CLOCK (esdsink->provided_clock), FALSE); gst_pad_event_default (pad, event); return; default: - gst_pad_event_default(pad, event); + gst_pad_event_default (pad, event); return; } - gst_event_unref(event); + gst_event_unref (event); return; } @@ -286,17 +285,17 @@ gst_esdsink_chain (GstPad *pad, GstData *_data) to_write = size; GST_LOG ("fd=%d data=%p size=%d", - esdsink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - while (to_write > 0){ + esdsink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + while (to_write > 0) { int done; - done = write (esdsink->fd, data, to_write); + done = write (esdsink->fd, data, to_write); - if(done < 0){ - if(errno==EINTR){ + if (done < 0) { + if (errno == EINTR) { goto done; } - g_assert_not_reached(); + g_assert_not_reached (); } to_write -= done; @@ -307,7 +306,7 @@ gst_esdsink_chain (GstPad *pad, GstData *_data) } } - gst_audio_clock_update_time ((GstAudioClock *)esdsink->provided_clock, + gst_audio_clock_update_time ((GstAudioClock *) esdsink->provided_clock, gst_esdsink_get_time (esdsink->provided_clock, esdsink)); done: @@ -315,24 +314,25 @@ done: } static void -gst_esdsink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_esdsink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstEsdsink *esdsink; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ESDSINK(object)); - esdsink = GST_ESDSINK(object); + g_return_if_fail (GST_IS_ESDSINK (object)); + esdsink = GST_ESDSINK (object); switch (prop_id) { case ARG_MUTE: esdsink->mute = g_value_get_boolean (value); break; case ARG_HOST: - g_free(esdsink->host); + g_free (esdsink->host); if (g_value_get_string (value) == NULL) - esdsink->host = NULL; + esdsink->host = NULL; else - esdsink->host = g_strdup (g_value_get_string (value)); + esdsink->host = g_strdup (g_value_get_string (value)); break; case ARG_SYNC: esdsink->sync = g_value_get_boolean (value); @@ -346,11 +346,12 @@ gst_esdsink_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -gst_esdsink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_esdsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstEsdsink *esdsink; - esdsink = GST_ESDSINK(object); + esdsink = GST_ESDSINK (object); switch (prop_id) { case ARG_MUTE: @@ -372,50 +373,58 @@ gst_esdsink_get_property (GObject *object, guint prop_id, GValue *value, GParamS } gboolean -gst_esdsink_factory_init (GstPlugin *plugin) +gst_esdsink_factory_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "esdsink", GST_RANK_NONE, GST_TYPE_ESDSINK)) + if (!gst_element_register (plugin, "esdsink", GST_RANK_NONE, + GST_TYPE_ESDSINK)) return FALSE; return TRUE; } static gboolean -gst_esdsink_open_audio (GstEsdsink *sink) +gst_esdsink_open_audio (GstEsdsink * sink) { /* Name used by esound for this connection. */ - const char * connname = "GStreamer"; + const char *connname = "GStreamer"; /* Bitmap describing audio format. */ esd_format_t esdformat = ESD_STREAM | ESD_PLAY; g_return_val_if_fail (sink->fd == -1, FALSE); - if (sink->depth == 16) esdformat |= ESD_BITS16; - else if (sink->depth == 8) esdformat |= ESD_BITS8; + if (sink->depth == 16) + esdformat |= ESD_BITS16; + else if (sink->depth == 8) + esdformat |= ESD_BITS8; else { GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), - ("invalid bit depth (%d)", sink->depth)); + ("invalid bit depth (%d)", sink->depth)); return FALSE; } - if (sink->channels == 2) esdformat |= ESD_STEREO; - else if (sink->channels == 1) esdformat |= ESD_MONO; + if (sink->channels == 2) + esdformat |= ESD_STEREO; + else if (sink->channels == 1) + esdformat |= ESD_MONO; else { GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL), - ("invalid number of channels (%d)", sink->channels)); + ("invalid number of channels (%d)", sink->channels)); return FALSE; } GST_INFO ("attempting to open connection to esound server"); - if(sink->fallback){ - sink->fd = esd_play_stream_fallback(esdformat, sink->frequency, sink->host, connname); - }else{ - sink->fd = esd_play_stream(esdformat, sink->frequency, sink->host, connname); + if (sink->fallback) { + sink->fd = + esd_play_stream_fallback (esdformat, sink->frequency, sink->host, + connname); + } else { + sink->fd = + esd_play_stream (esdformat, sink->frequency, sink->host, connname); } - if ( sink->fd < 0 ) { + if (sink->fd < 0) { GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL), - ("can't open connection to esound server")); + ("can't open connection to esound server")); return FALSE; } GST_INFO ("successfully opened connection to esound server"); @@ -424,19 +433,19 @@ gst_esdsink_open_audio (GstEsdsink *sink) } static void -gst_esdsink_close_audio (GstEsdsink *sink) +gst_esdsink_close_audio (GstEsdsink * sink) { - if (sink->fd < 0) + if (sink->fd < 0) return; - close(sink->fd); + close (sink->fd); sink->fd = -1; GST_INFO ("esdsink: closed sound device"); } static GstElementStateReturn -gst_esdsink_change_state (GstElement *element) +gst_esdsink_change_state (GstElement * element) { GstEsdsink *esdsink; @@ -445,7 +454,7 @@ gst_esdsink_change_state (GstElement *element) switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: if (!gst_esdsink_open_audio (GST_ESDSINK (element))) { - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } break; case GST_STATE_READY_TO_PAUSED: @@ -473,4 +482,3 @@ gst_esdsink_change_state (GstElement *element) return GST_STATE_SUCCESS; } - diff --git a/ext/esd/esdsink.h b/ext/esd/esdsink.h index 9bf81641..f88f29b1 100644 --- a/ext/esd/esdsink.h +++ b/ext/esd/esdsink.h @@ -25,7 +25,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_ESDSINK \ (gst_esdsink_get_type()) #define GST_ESDSINK(obj) \ @@ -36,41 +35,41 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDSINK)) #define GST_IS_ESDSINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK)) - typedef struct _GstEsdsink GstEsdsink; typedef struct _GstEsdsinkClass GstEsdsinkClass; -struct _GstEsdsink { - GstElement element; +struct _GstEsdsink +{ + GstElement element; - GstPad *sinkpad; + GstPad *sinkpad; - GstClock *provided_clock; - GstClock *clock; + GstClock *provided_clock; + GstClock *clock; - gboolean mute; - int fd; - gint format; - gint depth; - gint channels; - gint frequency; - gboolean negotiated; - gchar *host; - int handled; - int bytes_per_sample; - gboolean sync; - gboolean resync; - gboolean fallback; + gboolean mute; + int fd; + gint format; + gint depth; + gint channels; + gint frequency; + gboolean negotiated; + gchar *host; + int handled; + int bytes_per_sample; + gboolean sync; + gboolean resync; + gboolean fallback; }; -struct _GstEsdsinkClass { +struct _GstEsdsinkClass +{ GstElementClass parent_class; }; -GType gst_esdsink_get_type(void); -gboolean gst_esdsink_factory_init (GstPlugin *plugin); +GType gst_esdsink_get_type (void); +gboolean gst_esdsink_factory_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_ESDSINK_H__ */ diff --git a/ext/esd/gstesd.c b/ext/esd/gstesd.c index ea480a30..4ee03364 100644 --- a/ext/esd/gstesd.c +++ b/ext/esd/gstesd.c @@ -27,30 +27,27 @@ GST_DEBUG_CATEGORY (esd_debug); static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { gboolean ret; - if (!gst_library_load ("gstaudio")) return FALSE; + if (!gst_library_load ("gstaudio")) + return FALSE; - ret = gst_esdsink_factory_init(plugin); - if(ret == FALSE) return FALSE; + ret = gst_esdsink_factory_init (plugin); + if (ret == FALSE) + return FALSE; - ret = gst_esdmon_factory_init(plugin); - if(ret == FALSE) return FALSE; + ret = gst_esdmon_factory_init (plugin); + if (ret == FALSE) + return FALSE; GST_DEBUG_CATEGORY_INIT (esd_debug, "esd", 0, "ESounD elements"); return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "esdsink", - "ESD Element Plugins", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) - +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "esdsink", + "ESD Element Plugins", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/flac/flac_compat.h b/ext/flac/flac_compat.h index 87b5b864..defa969d 100644 --- a/ext/flac/flac_compat.h +++ b/ext/flac/flac_compat.h @@ -16,7 +16,7 @@ /* FIXME when there's a autoconf symbol */ #ifndef FLAC_VERSION -#ifndef FLAC__VERSION_STRING /* removed in 1.0.4 */ +#ifndef FLAC__VERSION_STRING /* removed in 1.0.4 */ #define FLAC_VERSION 0x010004 #else #ifdef FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE diff --git a/ext/flac/gstflac.c b/ext/flac/gstflac.c index 3c06cacf..c1dba934 100644 --- a/ext/flac/gstflac.c +++ b/ext/flac/gstflac.c @@ -28,7 +28,7 @@ #include "flac_compat.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) return FALSE; @@ -37,25 +37,23 @@ plugin_init (GstPlugin *plugin) if (!gst_plugin_load ("gsttags")) return FALSE; - if (!gst_element_register (plugin, "flacenc", GST_RANK_NONE, GST_TYPE_FLACENC)) + if (!gst_element_register (plugin, "flacenc", GST_RANK_NONE, + GST_TYPE_FLACENC)) return FALSE; - if (!gst_element_register (plugin, "flacdec", GST_RANK_PRIMARY, GST_TYPE_FLACDEC)) + if (!gst_element_register (plugin, "flacdec", GST_RANK_PRIMARY, + GST_TYPE_FLACDEC)) return FALSE; - if (!gst_element_register (plugin, "flactag", GST_RANK_PRIMARY, gst_flac_tag_get_type ())) + if (!gst_element_register (plugin, "flactag", GST_RANK_PRIMARY, + gst_flac_tag_get_type ())) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "flac", - "The FLAC Lossless compressor Codec", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "flac", + "The FLAC Lossless compressor Codec", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index 25769bcf..3882df1a 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -41,104 +41,101 @@ GstElementDetails flacdec_details = { }; /* FlacDec signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA }; -static void gst_flacdec_base_init (gpointer g_class); -static void gst_flacdec_class_init (FlacDecClass *klass); -static void gst_flacdec_init (FlacDec *flacdec); +static void gst_flacdec_base_init (gpointer g_class); +static void gst_flacdec_class_init (FlacDecClass * klass); +static void gst_flacdec_init (FlacDec * flacdec); + +static void gst_flacdec_loop (GstElement * element); +static GstElementStateReturn gst_flacdec_change_state (GstElement * element); +static const GstFormat *gst_flacdec_get_src_formats (GstPad * pad); +static gboolean gst_flacdec_convert_src (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static const GstQueryType *gst_flacdec_get_src_query_types (GstPad * pad); +static gboolean gst_flacdec_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); +static const GstEventMask *gst_flacdec_get_src_event_masks (GstPad * pad); +static gboolean gst_flacdec_src_event (GstPad * pad, GstEvent * event); -static void gst_flacdec_loop (GstElement *element); -static GstElementStateReturn - gst_flacdec_change_state (GstElement *element); -static const GstFormat* gst_flacdec_get_src_formats (GstPad *pad); -static gboolean gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); -static const GstQueryType* - gst_flacdec_get_src_query_types (GstPad *pad); -static gboolean gst_flacdec_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); -static const GstEventMask* - gst_flacdec_get_src_event_masks (GstPad *pad); -static gboolean gst_flacdec_src_event (GstPad *pad, GstEvent *event); - -static FLAC__SeekableStreamDecoderReadStatus - gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, - FLAC__byte buffer[], unsigned *bytes, - void *client_data); -static FLAC__SeekableStreamDecoderSeekStatus - gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 position, void *client_data); -static FLAC__SeekableStreamDecoderTellStatus - gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *position, void *client_data); -static FLAC__SeekableStreamDecoderLengthStatus - gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *length, void *client_data); -static FLAC__bool gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, - void *client_data); -static FLAC__StreamDecoderWriteStatus - gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 * const buffer[], - void *client_data); -static void gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__StreamMetadata *metadata, - void *client_data); -static void gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, - FLAC__StreamDecoderErrorStatus status, - void *client_data); +static FLAC__SeekableStreamDecoderReadStatus +gst_flacdec_read (const FLAC__SeekableStreamDecoder * decoder, + FLAC__byte buffer[], unsigned *bytes, void *client_data); +static FLAC__SeekableStreamDecoderSeekStatus +gst_flacdec_seek (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 position, void *client_data); +static FLAC__SeekableStreamDecoderTellStatus +gst_flacdec_tell (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * position, void *client_data); +static FLAC__SeekableStreamDecoderLengthStatus +gst_flacdec_length (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * length, void *client_data); +static FLAC__bool gst_flacdec_eof (const FLAC__SeekableStreamDecoder * decoder, + void *client_data); +static FLAC__StreamDecoderWriteStatus +gst_flacdec_write (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data); +static void gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder * + decoder, const FLAC__StreamMetadata * metadata, void *client_data); +static void gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder * + decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); static GstElementClass *parent_class = NULL; + /*static guint gst_flacdec_signals[LAST_SIGNAL] = { 0 }; */ GType -flacdec_get_type(void) { +flacdec_get_type (void) +{ static GType flacdec_type = 0; if (!flacdec_type) { static const GTypeInfo flacdec_info = { - sizeof(FlacDecClass), + sizeof (FlacDecClass), gst_flacdec_base_init, NULL, - (GClassInitFunc)gst_flacdec_class_init, + (GClassInitFunc) gst_flacdec_class_init, NULL, NULL, - sizeof(FlacDec), + sizeof (FlacDec), 0, - (GInstanceInitFunc)gst_flacdec_init, + (GInstanceInitFunc) gst_flacdec_init, }; - flacdec_type = g_type_register_static (GST_TYPE_ELEMENT, "FlacDec", &flacdec_info, 0); + flacdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "FlacDec", &flacdec_info, 0); } return flacdec_type; } -static GstCaps* +static GstCaps * flac_caps_factory (void) { return gst_caps_new_simple ("audio/x-flac", NULL); - /* "rate", GST_PROPS_INT_RANGE (11025, 48000), - * "channels", GST_PROPS_INT_RANGE (1, 2), */ + /* "rate", GST_PROPS_INT_RANGE (11025, 48000), + * "channels", GST_PROPS_INT_RANGE (1, 2), */ } -static GstCaps* +static GstCaps * raw_caps_factory (void) { return gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "rate", GST_TYPE_INT_RANGE, 11025, 48000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", GST_TYPE_INT_RANGE, 11025, 48000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } static void @@ -152,7 +149,7 @@ gst_flacdec_base_init (gpointer g_class) sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, flac_caps); - src_template = gst_pad_template_new ("src", GST_PAD_SRC, + src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, raw_caps); gst_element_class_add_pad_template (element_class, sink_template); gst_element_class_add_pad_template (element_class, src_template); @@ -160,21 +157,21 @@ gst_flacdec_base_init (gpointer g_class) } static void -gst_flacdec_class_init (FlacDecClass *klass) +gst_flacdec_class_init (FlacDecClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; - gstelement_class = (GstElementClass*)klass; - gobject_class = (GObjectClass*) klass; + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_flacdec_change_state; } -static void -gst_flacdec_init (FlacDec *flacdec) +static void +gst_flacdec_init (FlacDec * flacdec) { flacdec->sinkpad = gst_pad_new_from_template (sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->sinkpad); @@ -185,9 +182,11 @@ gst_flacdec_init (FlacDec *flacdec) gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->srcpad); gst_pad_set_formats_function (flacdec->srcpad, gst_flacdec_get_src_formats); gst_pad_set_convert_function (flacdec->srcpad, gst_flacdec_convert_src); - gst_pad_set_query_type_function (flacdec->srcpad, gst_flacdec_get_src_query_types); + gst_pad_set_query_type_function (flacdec->srcpad, + gst_flacdec_get_src_query_types); gst_pad_set_query_function (flacdec->srcpad, gst_flacdec_src_query); - gst_pad_set_event_mask_function (flacdec->srcpad, gst_flacdec_get_src_event_masks); + gst_pad_set_event_mask_function (flacdec->srcpad, + gst_flacdec_get_src_event_masks); gst_pad_set_event_function (flacdec->srcpad, gst_flacdec_src_event); gst_pad_use_explicit_caps (flacdec->srcpad); @@ -197,30 +196,39 @@ gst_flacdec_init (FlacDec *flacdec) flacdec->eos = FALSE; flacdec->seek_pending = FALSE; - FLAC__seekable_stream_decoder_set_read_callback (flacdec->decoder, gst_flacdec_read); - FLAC__seekable_stream_decoder_set_seek_callback (flacdec->decoder, gst_flacdec_seek); - FLAC__seekable_stream_decoder_set_tell_callback (flacdec->decoder, gst_flacdec_tell); - FLAC__seekable_stream_decoder_set_length_callback (flacdec->decoder, gst_flacdec_length); - FLAC__seekable_stream_decoder_set_eof_callback (flacdec->decoder, gst_flacdec_eof); + FLAC__seekable_stream_decoder_set_read_callback (flacdec->decoder, + gst_flacdec_read); + FLAC__seekable_stream_decoder_set_seek_callback (flacdec->decoder, + gst_flacdec_seek); + FLAC__seekable_stream_decoder_set_tell_callback (flacdec->decoder, + gst_flacdec_tell); + FLAC__seekable_stream_decoder_set_length_callback (flacdec->decoder, + gst_flacdec_length); + FLAC__seekable_stream_decoder_set_eof_callback (flacdec->decoder, + gst_flacdec_eof); #if FLAC_VERSION >= 0x010003 - FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, gst_flacdec_write); + FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, + gst_flacdec_write); #else FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, - (FLAC__StreamDecoderWriteStatus (*) - (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 *buffer[], - void *client_data)) - (gst_flacdec_write)); + (FLAC__StreamDecoderWriteStatus (*) + (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * buffer[], void *client_data)) + (gst_flacdec_write)); #endif - FLAC__seekable_stream_decoder_set_metadata_respond (flacdec->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__seekable_stream_decoder_set_metadata_callback (flacdec->decoder, gst_flacdec_metadata_callback); - FLAC__seekable_stream_decoder_set_error_callback (flacdec->decoder, gst_flacdec_error_callback); + FLAC__seekable_stream_decoder_set_metadata_respond (flacdec->decoder, + FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__seekable_stream_decoder_set_metadata_callback (flacdec->decoder, + gst_flacdec_metadata_callback); + FLAC__seekable_stream_decoder_set_error_callback (flacdec->decoder, + gst_flacdec_error_callback); FLAC__seekable_stream_decoder_set_client_data (flacdec->decoder, flacdec); } static gboolean -gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metadata) +gst_flacdec_update_metadata (FlacDec * flacdec, + const FLAC__StreamMetadata * metadata) { GstTagList *list; guint32 number_of_comments, cursor, str_len; @@ -233,17 +241,15 @@ gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metad number_of_comments = metadata->data.vorbis_comment.num_comments; value = NULL; - GST_DEBUG ("%d tag(s) found", number_of_comments); - for (cursor = 0; cursor < number_of_comments; cursor++) - { + GST_DEBUG ("%d tag(s) found", number_of_comments); + for (cursor = 0; cursor < number_of_comments; cursor++) { str_ptr = metadata->data.vorbis_comment.comments[cursor].entry; str_len = metadata->data.vorbis_comment.comments[cursor].length; - p_value = g_strstr_len ( str_ptr, str_len , "=" ); - if (p_value) - { + p_value = g_strstr_len (str_ptr, str_len, "="); + if (p_value) { name = g_strndup (str_ptr, p_value - str_ptr); value = g_strndup (p_value + 1, str_ptr + str_len - p_value - 1); - + GST_DEBUG ("%s : %s", name, value); gst_vorbis_tag_add (list, name, value); g_free (name); @@ -260,30 +266,29 @@ gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metad } -static void -gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__StreamMetadata *metadata, void *client_data) +static void +gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__StreamMetadata * metadata, void *client_data) { FlacDec *flacdec; - + flacdec = GST_FLACDEC (client_data); - switch (metadata->type) - { + switch (metadata->type) { case FLAC__METADATA_TYPE_STREAMINFO: - flacdec->stream_samples = metadata->data.stream_info.total_samples; - break; + flacdec->stream_samples = metadata->data.stream_info.total_samples; + break; case FLAC__METADATA_TYPE_VORBIS_COMMENT: - gst_flacdec_update_metadata (flacdec, metadata); - break; + gst_flacdec_update_metadata (flacdec, metadata); + break; default: - break; + break; } } -static void -gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, - FLAC__StreamDecoderErrorStatus status, void *client_data) +static void +gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder * decoder, + FLAC__StreamDecoderErrorStatus status, void *client_data) { FlacDec *flacdec; gchar *error; @@ -308,9 +313,9 @@ gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), (error)); } -static FLAC__SeekableStreamDecoderSeekStatus -gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 position, void *client_data) +static FLAC__SeekableStreamDecoderSeekStatus +gst_flacdec_seek (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 position, void *client_data) { FlacDec *flacdec; @@ -323,9 +328,9 @@ gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; } -static FLAC__SeekableStreamDecoderTellStatus -gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *position, void *client_data) +static FLAC__SeekableStreamDecoderTellStatus +gst_flacdec_tell (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * position, void *client_data) { FlacDec *flacdec; @@ -340,9 +345,9 @@ gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; } -static FLAC__SeekableStreamDecoderLengthStatus -gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *length, void *client_data) +static FLAC__SeekableStreamDecoderLengthStatus +gst_flacdec_length (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * length, void *client_data) { FlacDec *flacdec; @@ -358,8 +363,7 @@ gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__bool -gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, - void *client_data) +gst_flacdec_eof (const FLAC__SeekableStreamDecoder * decoder, void *client_data) { FlacDec *flacdec; @@ -370,9 +374,8 @@ gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__SeekableStreamDecoderReadStatus -gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, - FLAC__byte buffer[], unsigned *bytes, - void *client_data) +gst_flacdec_read (const FLAC__SeekableStreamDecoder * decoder, + FLAC__byte buffer[], unsigned *bytes, void *client_data) { FlacDec *flacdec; gint insize = 0; @@ -381,39 +384,39 @@ gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, flacdec = GST_FLACDEC (client_data); //g_print ("read %u\n", *bytes); - + while (insize == 0) { insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, *bytes); if (insize < *bytes) { GstEvent *event; guint32 avail; - + gst_bytestream_get_status (flacdec->bs, &avail, &event); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - GST_DEBUG ("eos"); - flacdec->eos = TRUE; + case GST_EVENT_EOS: + GST_DEBUG ("eos"); + flacdec->eos = TRUE; gst_event_unref (event); - if (avail == 0) { - return 0; - } - break; - case GST_EVENT_DISCONTINUOUS: - GST_DEBUG ("discont"); + if (avail == 0) { + return 0; + } + break; + case GST_EVENT_DISCONTINUOUS: + GST_DEBUG ("discont"); /* we are not yet sending the discont, we'll do that in the next write operation */ flacdec->need_discont = TRUE; gst_event_unref (event); break; - default: + default: gst_pad_event_default (flacdec->sinkpad, event); - break; + break; } if (avail > 0) - insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, avail); + insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, avail); else - insize = 0; + insize = 0; } } @@ -425,10 +428,9 @@ gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__StreamDecoderWriteStatus -gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 * const buffer[], - void *client_data) +gst_flacdec_write (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data) { FlacDec *flacdec; GstBuffer *outbuf; @@ -445,41 +447,39 @@ gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, GstEvent *discont; flacdec->need_discont = FALSE; - + if (!GST_PAD_CAPS (flacdec->srcpad)) { if (flacdec->seek_pending) { - flacdec->total_samples = flacdec->seek_value; + flacdec->total_samples = flacdec->seek_value; } if (GST_PAD_IS_USABLE (flacdec->srcpad)) { - GST_DEBUG ("send discont"); - - format = GST_FORMAT_TIME; - gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, - flacdec->total_samples, &format, &time); - format = GST_FORMAT_BYTES; - gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, - flacdec->total_samples, &format, &bytes); - discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, time, - GST_FORMAT_BYTES, bytes, - GST_FORMAT_DEFAULT, flacdec->total_samples, - NULL); - - gst_pad_push (flacdec->srcpad, GST_DATA (discont)); + GST_DEBUG ("send discont"); + + format = GST_FORMAT_TIME; + gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->total_samples, &format, &time); + format = GST_FORMAT_BYTES; + gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->total_samples, &format, &bytes); + discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, time, + GST_FORMAT_BYTES, bytes, + GST_FORMAT_DEFAULT, flacdec->total_samples, NULL); + + gst_pad_push (flacdec->srcpad, GST_DATA (discont)); } } } - + if (!GST_PAD_CAPS (flacdec->srcpad)) { gst_pad_set_explicit_caps (flacdec->srcpad, - gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, depth, - "depth", G_TYPE_INT, depth, - "rate", G_TYPE_INT, frame->header.sample_rate, - "channels", G_TYPE_INT, channels, - NULL)); + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, depth, + "depth", G_TYPE_INT, depth, + "rate", G_TYPE_INT, frame->header.sample_rate, + "channels", G_TYPE_INT, channels, NULL)); flacdec->depth = depth; flacdec->channels = channels; @@ -488,29 +488,28 @@ gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, if (GST_PAD_IS_USABLE (flacdec->srcpad)) { outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = samples * channels * ((depth+7)>>3); + GST_BUFFER_SIZE (outbuf) = samples * channels * ((depth + 7) >> 3); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = flacdec->total_samples * GST_SECOND / frame->header.sample_rate; - + GST_BUFFER_TIMESTAMP (outbuf) = + flacdec->total_samples * GST_SECOND / frame->header.sample_rate; + if (depth == 8) { - guint8 *outbuffer = (guint8 *)GST_BUFFER_DATA (outbuf); - - for (i=0; iinit) { + if (flacdec->init) { FLAC__StreamDecoderState res; - GST_DEBUG ("flacdec: initializing decoder"); + + GST_DEBUG ("flacdec: initializing decoder"); res = FLAC__seekable_stream_decoder_init (flacdec->decoder); if (res != FLAC__SEEKABLE_STREAM_DECODER_OK) { GST_ELEMENT_ERROR (flacdec, LIBRARY, INIT, (NULL), - (FLAC__SeekableStreamDecoderStateString[res])); + (FLAC__SeekableStreamDecoderStateString[res])); return; } - /* FLAC__seekable_stream_decoder_process_metadata (flacdec->decoder);*/ + /* FLAC__seekable_stream_decoder_process_metadata (flacdec->decoder); */ flacdec->init = FALSE; } if (flacdec->seek_pending) { - GST_DEBUG ("perform seek to sample %" G_GINT64_FORMAT, - flacdec->seek_value); + GST_DEBUG ("perform seek to sample %" G_GINT64_FORMAT, flacdec->seek_value); - if (FLAC__seekable_stream_decoder_seek_absolute (flacdec->decoder, - flacdec->seek_value)) - { + if (FLAC__seekable_stream_decoder_seek_absolute (flacdec->decoder, + flacdec->seek_value)) { flacdec->total_samples = flacdec->seek_value; GST_DEBUG ("seek done"); - } - else { + } else { GST_DEBUG ("seek failed"); } flacdec->seek_pending = FALSE; @@ -562,13 +559,12 @@ gst_flacdec_loop (GstElement *element) GST_DEBUG ("flacdec: processing single"); res = FLAC__seekable_stream_decoder_process_single (flacdec->decoder); GST_DEBUG ("flacdec: checking for EOS"); - if (FLAC__seekable_stream_decoder_get_state (flacdec->decoder) == - FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) - { + if (FLAC__seekable_stream_decoder_get_state (flacdec->decoder) == + FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) { GstEvent *event; GST_DEBUG ("flacdec: sending EOS event"); - FLAC__seekable_stream_decoder_reset(flacdec->decoder); + FLAC__seekable_stream_decoder_reset (flacdec->decoder); if (GST_PAD_IS_USABLE (flacdec->srcpad)) { event = gst_event_new (GST_EVENT_EOS); @@ -581,8 +577,8 @@ gst_flacdec_loop (GstElement *element) static const GstFormat * -gst_flacdec_get_src_formats (GstPad *pad) -{ +gst_flacdec_get_src_formats (GstPad * pad) +{ static const GstFormat formats[] = { GST_FORMAT_DEFAULT, GST_FORMAT_BYTES, @@ -590,63 +586,63 @@ gst_flacdec_get_src_formats (GstPad *pad) 0, }; return formats; -} +} static gboolean -gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_flacdec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); guint scale = 1; gint bytes_per_sample; - bytes_per_sample = flacdec->channels * ((flacdec->depth+7)>>3); + bytes_per_sample = flacdec->channels * ((flacdec->depth + 7) >> 3); switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_DEFAULT: - if (bytes_per_sample == 0) - return FALSE; - *dest_value = src_value / bytes_per_sample; - break; - case GST_FORMAT_TIME: + case GST_FORMAT_DEFAULT: + if (bytes_per_sample == 0) + return FALSE; + *dest_value = src_value / bytes_per_sample; + break; + case GST_FORMAT_TIME: { - gint byterate = bytes_per_sample * flacdec->frequency; + gint byterate = bytes_per_sample * flacdec->frequency; - if (byterate == 0) - return FALSE; - *dest_value = src_value * GST_SECOND / byterate; - break; + if (byterate == 0) + return FALSE; + *dest_value = src_value * GST_SECOND / byterate; + break; } - default: - res = FALSE; + default: + res = FALSE; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_BYTES: + case GST_FORMAT_BYTES: *dest_value = src_value * bytes_per_sample; - break; - case GST_FORMAT_TIME: + break; + case GST_FORMAT_TIME: if (flacdec->frequency == 0) return FALSE; - *dest_value = src_value * GST_SECOND / flacdec->frequency; - break; - default: - res = FALSE; + *dest_value = src_value * GST_SECOND / flacdec->frequency; + break; + default: + res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_BYTES: - scale = bytes_per_sample; - case GST_FORMAT_DEFAULT: + case GST_FORMAT_BYTES: + scale = bytes_per_sample; + case GST_FORMAT_DEFAULT: *dest_value = src_value * scale * flacdec->frequency / GST_SECOND; - break; - default: - res = FALSE; + break; + default: + res = FALSE; } break; default: @@ -656,19 +652,19 @@ gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, } static const GstQueryType * -gst_flacdec_get_src_query_types (GstPad *pad) -{ +gst_flacdec_get_src_query_types (GstPad * pad) +{ static const GstQueryType types[] = { GST_QUERY_TOTAL, GST_QUERY_POSITION, 0, }; return types; -} +} static gboolean -gst_flacdec_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value) +gst_flacdec_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value) { gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); @@ -679,21 +675,17 @@ gst_flacdec_src_query (GstPad *pad, GstQueryType type, guint64 samples; if (flacdec->stream_samples == 0) - samples = flacdec->total_samples; + samples = flacdec->total_samples; else - samples = flacdec->stream_samples; + samples = flacdec->stream_samples; - gst_pad_convert (flacdec->srcpad, - GST_FORMAT_DEFAULT, - samples, - format, value); + gst_pad_convert (flacdec->srcpad, + GST_FORMAT_DEFAULT, samples, format, value); break; } case GST_QUERY_POSITION: - gst_pad_convert (flacdec->srcpad, - GST_FORMAT_DEFAULT, - flacdec->total_samples, - format, value); + gst_pad_convert (flacdec->srcpad, + GST_FORMAT_DEFAULT, flacdec->total_samples, format, value); break; default: res = FALSE; @@ -702,20 +694,20 @@ gst_flacdec_src_query (GstPad *pad, GstQueryType type, return res; } - + static const GstEventMask * -gst_flacdec_get_src_event_masks (GstPad *pad) +gst_flacdec_get_src_event_masks (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_FLAG_ACCURATE }, - { 0, 0 }, + {GST_EVENT_SEEK, GST_SEEK_FLAG_ACCURATE}, + {0, 0}, }; return masks; } static gboolean -gst_flacdec_src_event (GstPad *pad, GstEvent *event) -{ +gst_flacdec_src_event (GstPad * pad, GstEvent * event) +{ gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); GstFormat format; @@ -724,11 +716,10 @@ gst_flacdec_src_event (GstPad *pad, GstEvent *event) case GST_EVENT_SEEK: format = GST_FORMAT_DEFAULT; - if (gst_pad_convert (flacdec->srcpad, - GST_EVENT_SEEK_FORMAT (event), - GST_EVENT_SEEK_OFFSET (event), - &format, &flacdec->seek_value)) - flacdec->seek_pending = TRUE; + if (gst_pad_convert (flacdec->srcpad, + GST_EVENT_SEEK_FORMAT (event), + GST_EVENT_SEEK_OFFSET (event), &format, &flacdec->seek_value)) + flacdec->seek_pending = TRUE; else res = FALSE; break; @@ -741,7 +732,7 @@ gst_flacdec_src_event (GstPad *pad, GstEvent *event) } static GstElementStateReturn -gst_flacdec_change_state (GstElement *element) +gst_flacdec_change_state (GstElement * element) { FlacDec *flacdec = GST_FLACDEC (element); diff --git a/ext/flac/gstflacdec.h b/ext/flac/gstflacdec.h index 5b5fd110..c525c3a2 100644 --- a/ext/flac/gstflacdec.h +++ b/ext/flac/gstflacdec.h @@ -28,8 +28,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_FLACDEC flacdec_get_type() @@ -38,40 +39,42 @@ extern "C" { #define GST_IS_FLACDEC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLACDEC) #define GST_IS_FLACDEC_CLASS(obj) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLACDEC) -typedef struct _FlacDec FlacDec; -typedef struct _FlacDecClass FlacDecClass; + typedef struct _FlacDec FlacDec; + typedef struct _FlacDecClass FlacDecClass; -struct _FlacDec { - GstElement element; + struct _FlacDec + { + GstElement element; - GstPad *sinkpad,*srcpad; - GstByteStream *bs; + GstPad *sinkpad, *srcpad; + GstByteStream *bs; - FLAC__SeekableStreamDecoder *decoder; - gint channels; - gint depth; - gint frequency; + FLAC__SeekableStreamDecoder *decoder; + gint channels; + gint depth; + gint frequency; - gboolean need_discont; - gboolean seek_pending; - gint64 seek_value; + gboolean need_discont; + gboolean seek_pending; + gint64 seek_value; - gboolean init; - guint64 total_samples; - guint64 stream_samples; + gboolean init; + guint64 total_samples; + guint64 stream_samples; - gboolean eos; -}; + gboolean eos; + }; -struct _FlacDecClass { - GstElementClass parent_class; -}; + struct _FlacDecClass + { + GstElementClass parent_class; + }; -GType flacdec_get_type(void); + GType flacdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __FLACDEC_H__ */ +#endif /* __FLACDEC_H__ */ diff --git a/ext/flac/gstflacenc.c b/ext/flac/gstflacenc.c index eacedeb4..7e658047 100644 --- a/ext/flac/gstflacenc.c +++ b/ext/flac/gstflacenc.c @@ -40,12 +40,14 @@ GstElementDetails flacenc_details = { }; /* FlacEnc signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_QUALITY, ARG_STREAMABLE_SUBSET, @@ -62,34 +64,32 @@ enum { ARG_RICE_PARAMETER_SEARCH_DIST, }; -static void gst_flacenc_base_init (gpointer g_class); -static void gst_flacenc_init (FlacEnc *flacenc); -static void gst_flacenc_class_init (FlacEncClass *klass); -static void gst_flacenc_dispose (GObject *object); +static void gst_flacenc_base_init (gpointer g_class); +static void gst_flacenc_init (FlacEnc * flacenc); +static void gst_flacenc_class_init (FlacEncClass * klass); +static void gst_flacenc_dispose (GObject * object); static GstPadLinkReturn - gst_flacenc_sinkconnect (GstPad *pad, const GstCaps *caps); -static void gst_flacenc_chain (GstPad *pad, GstData *_data); - -static gboolean gst_flacenc_update_quality (FlacEnc *flacenc, gint quality); -static void gst_flacenc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_flacenc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static GstElementStateReturn - gst_flacenc_change_state (GstElement *element); - -static FLAC__StreamEncoderWriteStatus - gst_flacenc_write_callback (const FLAC__SeekableStreamEncoder *encoder, - const FLAC__byte buffer[], unsigned bytes, - unsigned samples, unsigned current_frame, - void *client_data); +gst_flacenc_sinkconnect (GstPad * pad, const GstCaps * caps); +static void gst_flacenc_chain (GstPad * pad, GstData * _data); + +static gboolean gst_flacenc_update_quality (FlacEnc * flacenc, gint quality); +static void gst_flacenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_flacenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_flacenc_change_state (GstElement * element); + +static FLAC__StreamEncoderWriteStatus +gst_flacenc_write_callback (const FLAC__SeekableStreamEncoder * encoder, + const FLAC__byte buffer[], unsigned bytes, + unsigned samples, unsigned current_frame, void *client_data); static FLAC__SeekableStreamEncoderSeekStatus - gst_flacenc_seek_callback (const FLAC__SeekableStreamEncoder *encoder, - FLAC__uint64 absolute_byte_offset, - void *client_data); +gst_flacenc_seek_callback (const FLAC__SeekableStreamEncoder * encoder, + FLAC__uint64 absolute_byte_offset, void *client_data); static GstElementClass *parent_class = NULL; + /*static guint gst_flacenc_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -99,15 +99,15 @@ flacenc_get_type (void) if (!flacenc_type) { static const GTypeInfo flacenc_info = { - sizeof(FlacEncClass), + sizeof (FlacEncClass), gst_flacenc_base_init, NULL, - (GClassInitFunc)gst_flacenc_class_init, + (GClassInitFunc) gst_flacenc_class_init, NULL, NULL, - sizeof(FlacEnc), + sizeof (FlacEnc), 0, - (GInstanceInitFunc)gst_flacenc_init, + (GInstanceInitFunc) gst_flacenc_init, }; static const GInterfaceInfo tag_setter_info = { @@ -116,38 +116,40 @@ flacenc_get_type (void) NULL }; - flacenc_type = g_type_register_static (GST_TYPE_ELEMENT, "FlacEnc", &flacenc_info, 0); - g_type_add_interface_static (flacenc_type, GST_TYPE_TAG_SETTER, &tag_setter_info); + flacenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "FlacEnc", &flacenc_info, 0); + g_type_add_interface_static (flacenc_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); } return flacenc_type; } -typedef struct { - gboolean exhaustive_model_search; - gboolean escape_coding; - gboolean mid_side; - gboolean loose_mid_side; - guint qlp_coeff_precision; - gboolean qlp_coeff_prec_search; - guint min_residual_partition_order; - guint max_residual_partition_order; - guint rice_parameter_search_dist; - guint max_lpc_order; - guint blocksize; +typedef struct +{ + gboolean exhaustive_model_search; + gboolean escape_coding; + gboolean mid_side; + gboolean loose_mid_side; + guint qlp_coeff_precision; + gboolean qlp_coeff_prec_search; + guint min_residual_partition_order; + guint max_residual_partition_order; + guint rice_parameter_search_dist; + guint max_lpc_order; + guint blocksize; } FlacEncParams; -static const FlacEncParams flacenc_params[] = -{ - { FALSE, FALSE, FALSE, FALSE, 0, FALSE, 2, 2, 0, 0, 1152 }, - { FALSE, FALSE, TRUE, TRUE, 0, FALSE, 2, 2, 0, 0, 1152 }, - { FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 3, 0, 0, 1152 }, - { FALSE, FALSE, FALSE, FALSE, 0, FALSE, 3, 3, 0, 6, 4608 }, - { FALSE, FALSE, TRUE, TRUE, 0, FALSE, 3, 3, 0, 8, 4608 }, - { FALSE, FALSE, TRUE, FALSE, 0, FALSE, 3, 3, 0, 8, 4608 }, - { FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 4, 0, 8, 4608 }, - { TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 8, 4608 }, - { TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 12, 4608 }, - { TRUE, TRUE, TRUE, FALSE, 0, FALSE, 0, 16, 0, 32, 4608 }, +static const FlacEncParams flacenc_params[] = { + {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 2, 2, 0, 0, 1152}, + {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 2, 2, 0, 0, 1152}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 3, 0, 0, 1152}, + {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 3, 3, 0, 6, 4608}, + {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 3, 3, 0, 8, 4608}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 3, 3, 0, 8, 4608}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 4, 0, 8, 4608}, + {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 8, 4608}, + {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 12, 4608}, + {TRUE, TRUE, TRUE, FALSE, 0, FALSE, 0, 16, 0, 32, 4608}, }; #define DEFAULT_QUALITY 5 @@ -157,44 +159,44 @@ GType gst_flacenc_quality_get_type (void) { static GType qtype = 0; + if (qtype == 0) { static const GEnumValue values[] = { - { 0, "0", "0 - Fastest compression" }, - { 1, "1", "1" }, - { 2, "2", "2" }, - { 3, "3", "3" }, - { 4, "4", "4" }, - { 5, "5", "5 - Default" }, - { 6, "6", "6" }, - { 7, "7", "7" }, - { 8, "8", "8 - Highest compression " }, - { 9, "9", "9 - Insane" }, - { 0, NULL, NULL } + {0, "0", "0 - Fastest compression"}, + {1, "1", "1"}, + {2, "2", "2"}, + {3, "3", "3"}, + {4, "4", "4"}, + {5, "5", "5 - Default"}, + {6, "6", "6"}, + {7, "7", "7"}, + {8, "8", "8 - Highest compression "}, + {9, "9", "9 - Insane"}, + {0, NULL, NULL} }; qtype = g_enum_register_static ("FlacEncQuality", values); } return qtype; } -static GstCaps* +static GstCaps * flac_caps_factory (void) { return gst_caps_new_simple ("audio/x-flac", NULL); - /* "rate", GST_PROPS_INT_RANGE (11025, 48000), - * "channels", GST_PROPS_INT_RANGE (1, 2), */ + /* "rate", GST_PROPS_INT_RANGE (11025, 48000), + * "channels", GST_PROPS_INT_RANGE (1, 2), */ } -static GstCaps* +static GstCaps * raw_caps_factory (void) { return gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "rate", GST_TYPE_INT_RANGE, 11025, 48000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", GST_TYPE_INT_RANGE, 11025, 48000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } static void @@ -206,125 +208,123 @@ gst_flacenc_base_init (gpointer g_class) raw_caps = raw_caps_factory (); flac_caps = flac_caps_factory (); - sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, - raw_caps); - src_template = gst_pad_template_new ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, - flac_caps); + sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, + GST_PAD_ALWAYS, raw_caps); + src_template = gst_pad_template_new ("src", GST_PAD_SRC, + GST_PAD_ALWAYS, flac_caps); gst_element_class_add_pad_template (element_class, sink_template); gst_element_class_add_pad_template (element_class, src_template); gst_element_class_set_details (element_class, &flacenc_details); } static void -gst_flacenc_class_init (FlacEncClass *klass) +gst_flacenc_class_init (FlacEncClass * 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); - /* we have no properties atm so this is a bit silly */ gobject_class->set_property = gst_flacenc_set_property; gobject_class->get_property = gst_flacenc_get_property; - gobject_class->dispose = gst_flacenc_dispose; + gobject_class->dispose = gst_flacenc_dispose; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY, - g_param_spec_enum ("quality", - "Quality", - "Speed versus compression tradeoff", - GST_TYPE_FLACENC_QUALITY, DEFAULT_QUALITY, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STREAMABLE_SUBSET, - g_param_spec_boolean ("streamable_subset", - "Streamable subset", - "true to limit encoder to generating a Subset stream, else false", - TRUE, G_PARAM_READWRITE)); + g_param_spec_enum ("quality", + "Quality", + "Speed versus compression tradeoff", + GST_TYPE_FLACENC_QUALITY, DEFAULT_QUALITY, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_STREAMABLE_SUBSET, g_param_spec_boolean ("streamable_subset", + "Streamable subset", + "true to limit encoder to generating a Subset stream, else false", + TRUE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MID_SIDE_STEREO, - g_param_spec_boolean ("mid_side_stereo", - "Do mid side stereo", - "Do mid side stereo (only for stereo input)", - flacenc_params[DEFAULT_QUALITY].mid_side, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOOSE_MID_SIDE_STEREO, - g_param_spec_boolean ("loose_mid_side_stereo", - "Loose mid side stereo", - "Loose mid side stereo", - flacenc_params[DEFAULT_QUALITY].loose_mid_side, G_PARAM_READWRITE)); + g_param_spec_boolean ("mid_side_stereo", "Do mid side stereo", + "Do mid side stereo (only for stereo input)", + flacenc_params[DEFAULT_QUALITY].mid_side, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_LOOSE_MID_SIDE_STEREO, g_param_spec_boolean ("loose_mid_side_stereo", + "Loose mid side stereo", "Loose mid side stereo", + flacenc_params[DEFAULT_QUALITY].loose_mid_side, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BLOCKSIZE, - g_param_spec_uint ("blocksize", - "Blocksize", - "Blocksize in samples", - FLAC__MIN_BLOCK_SIZE, FLAC__MAX_BLOCK_SIZE, - flacenc_params[DEFAULT_QUALITY].blocksize, G_PARAM_READWRITE)); + g_param_spec_uint ("blocksize", "Blocksize", "Blocksize in samples", + FLAC__MIN_BLOCK_SIZE, FLAC__MAX_BLOCK_SIZE, + flacenc_params[DEFAULT_QUALITY].blocksize, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MAX_LPC_ORDER, - g_param_spec_uint ("max_lpc_order", - "Max LPC order", - "Max LPC order; 0 => use only fixed predictors", - 0, FLAC__MAX_LPC_ORDER, - flacenc_params[DEFAULT_QUALITY].max_lpc_order, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QLP_COEFF_PRECISION, - g_param_spec_uint ("qlp_coeff_precision", - "QLP coefficients precision", - "Precision in bits of quantized linear-predictor coefficients; 0 = automatic", - 0, 32, - flacenc_params[DEFAULT_QUALITY].qlp_coeff_precision, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QLP_COEFF_PREC_SEARCH, - g_param_spec_boolean ("qlp_coeff_prec_search", - "Do QLP coefficients precision search", - "false = use qlp_coeff_precision, " - "true = search around qlp_coeff_precision, take best", - flacenc_params[DEFAULT_QUALITY].qlp_coeff_prec_search, G_PARAM_READWRITE)); + g_param_spec_uint ("max_lpc_order", "Max LPC order", + "Max LPC order; 0 => use only fixed predictors", 0, + FLAC__MAX_LPC_ORDER, flacenc_params[DEFAULT_QUALITY].max_lpc_order, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_QLP_COEFF_PRECISION, g_param_spec_uint ("qlp_coeff_precision", + "QLP coefficients precision", + "Precision in bits of quantized linear-predictor coefficients; 0 = automatic", + 0, 32, flacenc_params[DEFAULT_QUALITY].qlp_coeff_precision, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_QLP_COEFF_PREC_SEARCH, g_param_spec_boolean ("qlp_coeff_prec_search", + "Do QLP coefficients precision search", + "false = use qlp_coeff_precision, " + "true = search around qlp_coeff_precision, take best", + flacenc_params[DEFAULT_QUALITY].qlp_coeff_prec_search, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ESCAPE_CODING, - g_param_spec_boolean ("escape_coding", - "Do Escape coding", - "search for escape codes in the entropy coding stage " - "for slightly better compression", - flacenc_params[DEFAULT_QUALITY].escape_coding, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EXHAUSTIVE_MODEL_SEARCH, - g_param_spec_boolean ("exhaustive_model_search", - "Do exhaustive model search", - "do exhaustive search of LP coefficient quantization (expensive!)", - flacenc_params[DEFAULT_QUALITY].exhaustive_model_search, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MIN_RESIDUAL_PARTITION_ORDER, - g_param_spec_uint ("min_residual_partition_order", - "Min residual partition order", - "Min residual partition order (above 4 doesn't usually help much)", - 0, 16, - flacenc_params[DEFAULT_QUALITY].min_residual_partition_order, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MAX_RESIDUAL_PARTITION_ORDER, - g_param_spec_uint ("max_residual_partition_order", - "Max residual partition order", - "Max residual partition order (above 4 doesn't usually help much)", - 0, 16, - flacenc_params[DEFAULT_QUALITY].max_residual_partition_order, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RICE_PARAMETER_SEARCH_DIST, - g_param_spec_uint ("rice_parameter_search_dist", - "rice_parameter_search_dist", - "0 = try only calc'd parameter k; else try all [k-dist..k+dist] " - "parameters, use best", - 0, FLAC__MAX_RICE_PARTITION_ORDER, - flacenc_params[DEFAULT_QUALITY].rice_parameter_search_dist, G_PARAM_READWRITE)); + g_param_spec_boolean ("escape_coding", "Do Escape coding", + "search for escape codes in the entropy coding stage " + "for slightly better compression", + flacenc_params[DEFAULT_QUALITY].escape_coding, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_EXHAUSTIVE_MODEL_SEARCH, + g_param_spec_boolean ("exhaustive_model_search", + "Do exhaustive model search", + "do exhaustive search of LP coefficient quantization (expensive!)", + flacenc_params[DEFAULT_QUALITY].exhaustive_model_search, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_MIN_RESIDUAL_PARTITION_ORDER, + g_param_spec_uint ("min_residual_partition_order", + "Min residual partition order", + "Min residual partition order (above 4 doesn't usually help much)", 0, + 16, flacenc_params[DEFAULT_QUALITY].min_residual_partition_order, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_MAX_RESIDUAL_PARTITION_ORDER, + g_param_spec_uint ("max_residual_partition_order", + "Max residual partition order", + "Max residual partition order (above 4 doesn't usually help much)", 0, + 16, flacenc_params[DEFAULT_QUALITY].max_residual_partition_order, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + ARG_RICE_PARAMETER_SEARCH_DIST, + g_param_spec_uint ("rice_parameter_search_dist", + "rice_parameter_search_dist", + "0 = try only calc'd parameter k; else try all [k-dist..k+dist] " + "parameters, use best", 0, FLAC__MAX_RICE_PARTITION_ORDER, + flacenc_params[DEFAULT_QUALITY].rice_parameter_search_dist, + G_PARAM_READWRITE)); gstelement_class->change_state = gst_flacenc_change_state; } static void -gst_flacenc_init (FlacEnc *flacenc) +gst_flacenc_init (FlacEnc * flacenc) { flacenc->sinkpad = gst_pad_new_from_template (sink_template, "sink"); - gst_element_add_pad(GST_ELEMENT(flacenc),flacenc->sinkpad); - gst_pad_set_chain_function(flacenc->sinkpad,gst_flacenc_chain); + gst_element_add_pad (GST_ELEMENT (flacenc), flacenc->sinkpad); + gst_pad_set_chain_function (flacenc->sinkpad, gst_flacenc_chain); gst_pad_set_link_function (flacenc->sinkpad, gst_flacenc_sinkconnect); flacenc->srcpad = gst_pad_new_from_template (src_template, "src"); - gst_element_add_pad(GST_ELEMENT(flacenc),flacenc->srcpad); + gst_element_add_pad (GST_ELEMENT (flacenc), flacenc->srcpad); GST_FLAG_SET (flacenc, GST_ELEMENT_EVENT_AWARE); - flacenc->encoder = FLAC__seekable_stream_encoder_new(); + flacenc->encoder = FLAC__seekable_stream_encoder_new (); flacenc->negotiated = FALSE; flacenc->first = TRUE; @@ -335,17 +335,17 @@ gst_flacenc_init (FlacEnc *flacenc) } static void -gst_flacenc_dispose (GObject *object) +gst_flacenc_dispose (GObject * object) { FlacEnc *flacenc = GST_FLACENC (object); FLAC__seekable_stream_encoder_delete (flacenc->encoder); - + G_OBJECT_CLASS (parent_class)->dispose (object); } static GstPadLinkReturn -gst_flacenc_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_flacenc_sinkconnect (GstPad * pad, const GstCaps * caps) { GstPadLinkReturn ret; FlacEnc *flacenc; @@ -358,7 +358,7 @@ gst_flacenc_sinkconnect (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "channels", &flacenc->channels); gst_structure_get_int (structure, "depth", &flacenc->depth); gst_structure_get_int (structure, "rate", &flacenc->sample_rate); - + caps = gst_caps_new_simple ("audio/x-flac", "channels", G_TYPE_INT, flacenc->channels, "rate", G_TYPE_INT, flacenc->sample_rate, NULL); @@ -367,12 +367,12 @@ gst_flacenc_sinkconnect (GstPad *pad, const GstCaps *caps) return ret; } - FLAC__seekable_stream_encoder_set_bits_per_sample (flacenc->encoder, - flacenc->depth); - FLAC__seekable_stream_encoder_set_sample_rate (flacenc->encoder, - flacenc->sample_rate); - FLAC__seekable_stream_encoder_set_channels (flacenc->encoder, - flacenc->channels); + FLAC__seekable_stream_encoder_set_bits_per_sample (flacenc->encoder, + flacenc->depth); + FLAC__seekable_stream_encoder_set_sample_rate (flacenc->encoder, + flacenc->sample_rate); + FLAC__seekable_stream_encoder_set_channels (flacenc->encoder, + flacenc->channels); flacenc->negotiated = TRUE; @@ -380,7 +380,7 @@ gst_flacenc_sinkconnect (GstPad *pad, const GstCaps *caps) } static gboolean -gst_flacenc_update_quality (FlacEnc *flacenc, gint quality) +gst_flacenc_update_quality (FlacEnc * flacenc, gint quality) { flacenc->quality = quality; @@ -396,17 +396,22 @@ gst_flacenc_update_quality (FlacEnc *flacenc, gint quality) g_object_freeze_notify (G_OBJECT (flacenc)); - DO_UPDATE (do_mid_side_stereo, mid_side, "mid_side_stereo"); - DO_UPDATE (loose_mid_side_stereo, loose_mid_side, "loose_mid_side"); - DO_UPDATE (blocksize, blocksize, "blocksize"); - DO_UPDATE (max_lpc_order, max_lpc_order, "max_lpc_order"); - DO_UPDATE (qlp_coeff_precision, qlp_coeff_precision, "qlp_coeff_precision"); - DO_UPDATE (do_qlp_coeff_prec_search, qlp_coeff_prec_search, "qlp_coeff_prec_search"); - DO_UPDATE (do_escape_coding, escape_coding, "escape_coding"); - DO_UPDATE (do_exhaustive_model_search, exhaustive_model_search, "exhaustive_model_search"); - DO_UPDATE (min_residual_partition_order, min_residual_partition_order, "min_residual_partition_order"); - DO_UPDATE (max_residual_partition_order, max_residual_partition_order, "max_residual_partition_order"); - DO_UPDATE (rice_parameter_search_dist, rice_parameter_search_dist, "rice_parameter_search_dist"); + DO_UPDATE (do_mid_side_stereo, mid_side, "mid_side_stereo"); + DO_UPDATE (loose_mid_side_stereo, loose_mid_side, "loose_mid_side"); + DO_UPDATE (blocksize, blocksize, "blocksize"); + DO_UPDATE (max_lpc_order, max_lpc_order, "max_lpc_order"); + DO_UPDATE (qlp_coeff_precision, qlp_coeff_precision, "qlp_coeff_precision"); + DO_UPDATE (do_qlp_coeff_prec_search, qlp_coeff_prec_search, + "qlp_coeff_prec_search"); + DO_UPDATE (do_escape_coding, escape_coding, "escape_coding"); + DO_UPDATE (do_exhaustive_model_search, exhaustive_model_search, + "exhaustive_model_search"); + DO_UPDATE (min_residual_partition_order, min_residual_partition_order, + "min_residual_partition_order"); + DO_UPDATE (max_residual_partition_order, max_residual_partition_order, + "max_residual_partition_order"); + DO_UPDATE (rice_parameter_search_dist, rice_parameter_search_dist, + "rice_parameter_search_dist"); #undef DO_UPDATE @@ -416,38 +421,38 @@ gst_flacenc_update_quality (FlacEnc *flacenc, gint quality) } static FLAC__SeekableStreamEncoderSeekStatus -gst_flacenc_seek_callback (const FLAC__SeekableStreamEncoder *encoder, - FLAC__uint64 absolute_byte_offset, - void *client_data) +gst_flacenc_seek_callback (const FLAC__SeekableStreamEncoder * encoder, + FLAC__uint64 absolute_byte_offset, void *client_data) { -FlacEnc *flacenc; -GstEvent *event; + FlacEnc *flacenc; + GstEvent *event; flacenc = GST_FLACENC (client_data); - if (flacenc->stopped) + if (flacenc->stopped) return FLAC__STREAM_ENCODER_OK; - event = gst_event_new_seek ((GstSeekType)(int)(GST_FORMAT_BYTES | GST_SEEK_METHOD_SET), absolute_byte_offset); + event = + gst_event_new_seek ((GstSeekType) (int) (GST_FORMAT_BYTES | + GST_SEEK_METHOD_SET), absolute_byte_offset); if (event) gst_pad_push (flacenc->srcpad, GST_DATA (event)); - - return FLAC__STREAM_ENCODER_OK; + + return FLAC__STREAM_ENCODER_OK; } -static FLAC__StreamEncoderWriteStatus -gst_flacenc_write_callback (const FLAC__SeekableStreamEncoder *encoder, - const FLAC__byte buffer[], unsigned bytes, - unsigned samples, unsigned current_frame, - void *client_data) +static FLAC__StreamEncoderWriteStatus +gst_flacenc_write_callback (const FLAC__SeekableStreamEncoder * encoder, + const FLAC__byte buffer[], unsigned bytes, + unsigned samples, unsigned current_frame, void *client_data) { FlacEnc *flacenc; GstBuffer *outbuf; - + flacenc = GST_FLACENC (client_data); - if (flacenc->stopped) + if (flacenc->stopped) return FLAC__STREAM_ENCODER_OK; outbuf = gst_buffer_new_and_alloc (bytes); @@ -465,30 +470,29 @@ gst_flacenc_write_callback (const FLAC__SeekableStreamEncoder *encoder, return FLAC__STREAM_ENCODER_OK; } -static void -add_one_tag (const GstTagList *list, const gchar *tag, - gpointer user_data) +static void +add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) { - GList *comments; - GList *it; - FlacEnc *flacenc = GST_FLACENC (user_data); - - comments = gst_tag_to_vorbis_comments (list, tag); - for (it = comments; it != NULL; it = it->next) { - FLAC__StreamMetadata_VorbisComment_Entry commment_entry; - commment_entry.length = strlen(it->data); - commment_entry.entry = it->data; - FLAC__metadata_object_vorbiscomment_insert_comment (flacenc->meta[0], - flacenc->meta[0]->data.vorbis_comment.num_comments, - commment_entry, - TRUE); - g_free (it->data); - } - g_list_free (comments); + GList *comments; + GList *it; + FlacEnc *flacenc = GST_FLACENC (user_data); + + comments = gst_tag_to_vorbis_comments (list, tag); + for (it = comments; it != NULL; it = it->next) { + FLAC__StreamMetadata_VorbisComment_Entry commment_entry; + + commment_entry.length = strlen (it->data); + commment_entry.entry = it->data; + FLAC__metadata_object_vorbiscomment_insert_comment (flacenc->meta[0], + flacenc->meta[0]->data.vorbis_comment.num_comments, + commment_entry, TRUE); + g_free (it->data); + } + g_list_free (comments); } static void -gst_flacenc_set_metadata (FlacEnc *flacenc) +gst_flacenc_set_metadata (FlacEnc * flacenc) { const GstTagList *user_tags; GstTagList *copy; @@ -498,21 +502,23 @@ gst_flacenc_set_metadata (FlacEnc *flacenc) if ((flacenc->tags == NULL) && (user_tags == NULL)) { return; } - copy = gst_tag_list_merge (user_tags, flacenc->tags, - gst_tag_setter_get_merge_mode (GST_TAG_SETTER (flacenc))); + copy = gst_tag_list_merge (user_tags, flacenc->tags, + gst_tag_setter_get_merge_mode (GST_TAG_SETTER (flacenc))); flacenc->meta = g_malloc (sizeof (FLAC__StreamMetadata **)); - flacenc->meta[0] = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT); + flacenc->meta[0] = + FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT); gst_tag_list_foreach (copy, add_one_tag, flacenc); - if (FLAC__seekable_stream_encoder_set_metadata(flacenc->encoder, flacenc->meta, 1) != true) + if (FLAC__seekable_stream_encoder_set_metadata (flacenc->encoder, + flacenc->meta, 1) != true) g_warning ("Dude, i'm already initialized!"); gst_tag_list_free (copy); } static void -gst_flacenc_chain (GstPad *pad, GstData *_data) +gst_flacenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); FlacEnc *flacenc; @@ -522,7 +528,7 @@ gst_flacenc_chain (GstPad *pad, GstData *_data) gulong i; FLAC__bool res; - g_return_if_fail(buf != NULL); + g_return_if_fail (buf != NULL); flacenc = GST_FLACENC (gst_pad_get_parent (pad)); @@ -531,18 +537,18 @@ gst_flacenc_chain (GstPad *pad, GstData *_data) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - FLAC__seekable_stream_encoder_finish(flacenc->encoder); + FLAC__seekable_stream_encoder_finish (flacenc->encoder); break; case GST_EVENT_TAG: if (flacenc->tags) { - gst_tag_list_insert (flacenc->tags, gst_event_tag_get_list (event), - GST_TAG_MERGE_REPLACE); + gst_tag_list_insert (flacenc->tags, gst_event_tag_get_list (event), + GST_TAG_MERGE_REPLACE); } else { g_assert_not_reached (); } break; default: - break; + break; } gst_pad_event_default (pad, event); return; @@ -550,33 +556,31 @@ gst_flacenc_chain (GstPad *pad, GstData *_data) if (!flacenc->negotiated) { GST_ELEMENT_ERROR (flacenc, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + ("format wasn't negotiated before chain function")); return; } depth = flacenc->depth; insize = GST_BUFFER_SIZE (buf); - samples = insize / ((depth+7)>>3); + samples = insize / ((depth + 7) >> 3); - if (FLAC__seekable_stream_encoder_get_state (flacenc->encoder) == - FLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED) - { + if (FLAC__seekable_stream_encoder_get_state (flacenc->encoder) == + FLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED) { FLAC__SeekableStreamEncoderState state; - FLAC__seekable_stream_encoder_set_write_callback (flacenc->encoder, - gst_flacenc_write_callback); - FLAC__seekable_stream_encoder_set_seek_callback (flacenc->encoder, - gst_flacenc_seek_callback); - - FLAC__seekable_stream_encoder_set_client_data (flacenc->encoder, - flacenc); - + FLAC__seekable_stream_encoder_set_write_callback (flacenc->encoder, + gst_flacenc_write_callback); + FLAC__seekable_stream_encoder_set_seek_callback (flacenc->encoder, + gst_flacenc_seek_callback); + + FLAC__seekable_stream_encoder_set_client_data (flacenc->encoder, flacenc); + gst_flacenc_set_metadata (flacenc); state = FLAC__seekable_stream_encoder_init (flacenc->encoder); if (state != FLAC__STREAM_ENCODER_OK) { GST_ELEMENT_ERROR (flacenc, LIBRARY, INIT, (NULL), - ("could not initialize encoder (wrong parameters?)")); + ("could not initialize encoder (wrong parameters?)")); return; } } @@ -584,27 +588,26 @@ gst_flacenc_chain (GstPad *pad, GstData *_data) /* we keep a pointer in the flacenc struct because we are freeing the data * after a push opreration that might never return */ data = flacenc->data = g_malloc (samples * sizeof (FLAC__int32)); - + if (depth == 8) { gint8 *indata = (gint8 *) GST_BUFFER_DATA (buf); - - for (i=0; iencoder, - (const FLAC__int32 *) data, samples / flacenc->channels); + res = FLAC__seekable_stream_encoder_process_interleaved (flacenc->encoder, + (const FLAC__int32 *) data, samples / flacenc->channels); g_free (flacenc->data); flacenc->data = NULL; @@ -615,63 +618,63 @@ gst_flacenc_chain (GstPad *pad, GstData *_data) } static void -gst_flacenc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_flacenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { FlacEnc *this; - - this = (FlacEnc *)object; + + this = (FlacEnc *) object; switch (prop_id) { case ARG_QUALITY: gst_flacenc_update_quality (this, g_value_get_enum (value)); break; case ARG_STREAMABLE_SUBSET: - FLAC__seekable_stream_encoder_set_streamable_subset (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_streamable_subset (this->encoder, + g_value_get_boolean (value)); break; case ARG_MID_SIDE_STEREO: - FLAC__seekable_stream_encoder_set_do_mid_side_stereo (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_do_mid_side_stereo (this->encoder, + g_value_get_boolean (value)); break; case ARG_LOOSE_MID_SIDE_STEREO: - FLAC__seekable_stream_encoder_set_loose_mid_side_stereo (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_loose_mid_side_stereo (this->encoder, + g_value_get_boolean (value)); break; case ARG_BLOCKSIZE: - FLAC__seekable_stream_encoder_set_blocksize (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_blocksize (this->encoder, + g_value_get_uint (value)); break; case ARG_MAX_LPC_ORDER: - FLAC__seekable_stream_encoder_set_max_lpc_order (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_max_lpc_order (this->encoder, + g_value_get_uint (value)); break; case ARG_QLP_COEFF_PRECISION: - FLAC__seekable_stream_encoder_set_qlp_coeff_precision (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_qlp_coeff_precision (this->encoder, + g_value_get_uint (value)); break; case ARG_QLP_COEFF_PREC_SEARCH: - FLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search (this->encoder, + g_value_get_boolean (value)); break; case ARG_ESCAPE_CODING: - FLAC__seekable_stream_encoder_set_do_escape_coding (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_do_escape_coding (this->encoder, + g_value_get_boolean (value)); break; case ARG_EXHAUSTIVE_MODEL_SEARCH: - FLAC__seekable_stream_encoder_set_do_exhaustive_model_search (this->encoder, - g_value_get_boolean (value)); + FLAC__seekable_stream_encoder_set_do_exhaustive_model_search (this-> + encoder, g_value_get_boolean (value)); break; case ARG_MIN_RESIDUAL_PARTITION_ORDER: - FLAC__seekable_stream_encoder_set_min_residual_partition_order (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_min_residual_partition_order (this-> + encoder, g_value_get_uint (value)); break; case ARG_MAX_RESIDUAL_PARTITION_ORDER: - FLAC__seekable_stream_encoder_set_max_residual_partition_order (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_max_residual_partition_order (this-> + encoder, g_value_get_uint (value)); break; case ARG_RICE_PARAMETER_SEARCH_DIST: - FLAC__seekable_stream_encoder_set_rice_parameter_search_dist (this->encoder, - g_value_get_uint (value)); + FLAC__seekable_stream_encoder_set_rice_parameter_search_dist (this-> + encoder, g_value_get_uint (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -680,64 +683,71 @@ gst_flacenc_set_property (GObject *object, guint prop_id, } static void -gst_flacenc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_flacenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { FlacEnc *this; - - this = (FlacEnc *)object; - + + this = (FlacEnc *) object; + switch (prop_id) { case ARG_QUALITY: g_value_set_enum (value, this->quality); break; case ARG_STREAMABLE_SUBSET: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_streamable_subset (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_streamable_subset (this->encoder)); break; case ARG_MID_SIDE_STEREO: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_do_mid_side_stereo (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_do_mid_side_stereo (this->encoder)); break; case ARG_LOOSE_MID_SIDE_STEREO: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_loose_mid_side_stereo (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_loose_mid_side_stereo (this-> + encoder)); break; case ARG_BLOCKSIZE: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_blocksize (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_blocksize (this->encoder)); break; case ARG_MAX_LPC_ORDER: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_max_lpc_order (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_max_lpc_order (this->encoder)); break; case ARG_QLP_COEFF_PRECISION: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_qlp_coeff_precision (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_qlp_coeff_precision (this-> + encoder)); break; case ARG_QLP_COEFF_PREC_SEARCH: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search (this-> + encoder)); break; case ARG_ESCAPE_CODING: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_do_escape_coding (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_do_escape_coding (this->encoder)); break; case ARG_EXHAUSTIVE_MODEL_SEARCH: - g_value_set_boolean (value, - FLAC__seekable_stream_encoder_get_do_exhaustive_model_search (this->encoder)); + g_value_set_boolean (value, + FLAC__seekable_stream_encoder_get_do_exhaustive_model_search (this-> + encoder)); break; case ARG_MIN_RESIDUAL_PARTITION_ORDER: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_min_residual_partition_order (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_min_residual_partition_order (this-> + encoder)); break; case ARG_MAX_RESIDUAL_PARTITION_ORDER: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_max_residual_partition_order (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_max_residual_partition_order (this-> + encoder)); break; case ARG_RICE_PARAMETER_SEARCH_DIST: - g_value_set_uint (value, - FLAC__seekable_stream_encoder_get_rice_parameter_search_dist (this->encoder)); + g_value_set_uint (value, + FLAC__seekable_stream_encoder_get_rice_parameter_search_dist (this-> + encoder)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -746,7 +756,7 @@ gst_flacenc_get_property (GObject *object, guint prop_id, } static GstElementStateReturn -gst_flacenc_change_state (GstElement *element) +gst_flacenc_change_state (GstElement * element) { FlacEnc *flacenc = GST_FLACENC (element); @@ -760,10 +770,10 @@ gst_flacenc_change_state (GstElement *element) case GST_STATE_PLAYING_TO_PAUSED: break; case GST_STATE_PAUSED_TO_READY: - if (FLAC__seekable_stream_encoder_get_state (flacenc->encoder) != - FLAC__STREAM_ENCODER_UNINITIALIZED) { - flacenc->stopped = TRUE; - FLAC__seekable_stream_encoder_finish (flacenc->encoder); + if (FLAC__seekable_stream_encoder_get_state (flacenc->encoder) != + FLAC__STREAM_ENCODER_UNINITIALIZED) { + flacenc->stopped = TRUE; + FLAC__seekable_stream_encoder_finish (flacenc->encoder); } flacenc->negotiated = FALSE; if (flacenc->first_buf) diff --git a/ext/flac/gstflacenc.h b/ext/flac/gstflacenc.h index 27dbb3b0..1337a6fe 100644 --- a/ext/flac/gstflacenc.h +++ b/ext/flac/gstflacenc.h @@ -27,8 +27,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_FLACENC flacenc_get_type() #define GST_FLACENC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLACENC, FlacEnc) @@ -36,40 +37,42 @@ extern "C" { #define GST_IS_FLACENC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLACENC) #define GST_IS_FLACENC_CLASS(obj) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLACENC) -typedef struct _FlacEnc FlacEnc; -typedef struct _FlacEncClass FlacEncClass; + typedef struct _FlacEnc FlacEnc; + typedef struct _FlacEncClass FlacEncClass; -struct _FlacEnc { - GstElement element; + struct _FlacEnc + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gboolean first; - GstBuffer *first_buf; - gboolean eos; - gint channels; - gint depth; - gint sample_rate; - gboolean negotiated; - gint quality; - gboolean stopped; - FLAC__int32 *data; + gboolean first; + GstBuffer *first_buf; + gboolean eos; + gint channels; + gint depth; + gint sample_rate; + gboolean negotiated; + gint quality; + gboolean stopped; + FLAC__int32 *data; - FLAC__SeekableStreamEncoder *encoder; - FLAC__StreamMetadata **meta; + FLAC__SeekableStreamEncoder *encoder; + FLAC__StreamMetadata **meta; - GstTagList * tags; -}; + GstTagList *tags; + }; -struct _FlacEncClass { - GstElementClass parent_class; -}; + struct _FlacEncClass + { + GstElementClass parent_class; + }; -GType flacenc_get_type(void); + GType flacenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __FLACENC_H__ */ +#endif /* __FLACENC_H__ */ diff --git a/ext/flac/gstflactag.c b/ext/flac/gstflactag.c index 5d1c56c2..c931f41c 100644 --- a/ext/flac/gstflactag.c +++ b/ext/flac/gstflactag.c @@ -36,17 +36,19 @@ typedef struct _GstFlacTag GstFlacTag; typedef struct _GstFlacTagClass GstFlacTagClass; -static inline -gint min (gint a, gint b) { +static inline gint +min (gint a, gint b) +{ if (a < b) { return a; } else { return b; } } - -typedef enum { + +typedef enum +{ GST_FLAC_TAG_STATE_INIT, GST_FLAC_TAG_STATE_METADATA_BLOCKS, GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK, @@ -57,77 +59,78 @@ typedef enum { } GstFlacTagState; -struct _GstFlacTag { - GstElement element; +struct _GstFlacTag +{ + GstElement element; /* pads */ - GstPad * sinkpad; - GstPad * srcpad; + GstPad *sinkpad; + GstPad *srcpad; - GstFlacTagState state; + GstFlacTagState state; - GstBuffer * buffer; - GstBuffer * vorbiscomment; - GstTagList * tags; + GstBuffer *buffer; + GstBuffer *vorbiscomment; + GstTagList *tags; - guint metadata_bytes_remaining; - gboolean metadata_last_block; + guint metadata_bytes_remaining; + gboolean metadata_last_block; - gboolean only_output_tags; + gboolean only_output_tags; }; -struct _GstFlacTagClass { +struct _GstFlacTagClass +{ GstElementClass parent_class; }; /* elementfactory information */ -static GstElementDetails gst_flac_tag_details = GST_ELEMENT_DETAILS ( - "flac rettager", - "Tag", - "Rewrite tags in a FLAC file", - "Christope Fergeau " -); +static GstElementDetails gst_flac_tag_details = +GST_ELEMENT_DETAILS ("flac rettager", + "Tag", + "Rewrite tags in a FLAC file", + "Christope Fergeau "); /* signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; static GstStaticPadTemplate flac_tag_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-flac; application/x-gst-tags") -); + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac; application/x-gst-tags") + ); static GstStaticPadTemplate flac_tag_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-flac") -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); -static void gst_flac_tag_base_init (gpointer g_class); -static void gst_flac_tag_class_init (GstFlacTagClass * klass); -static void gst_flac_tag_init (GstFlacTag * tag); +static void gst_flac_tag_base_init (gpointer g_class); +static void gst_flac_tag_class_init (GstFlacTagClass * klass); +static void gst_flac_tag_init (GstFlacTag * tag); -static void gst_flac_tag_chain (GstPad * pad, - GstData * data); +static void gst_flac_tag_chain (GstPad * pad, GstData * data); -static GstElementStateReturn gst_flac_tag_change_state (GstElement * element); +static GstElementStateReturn gst_flac_tag_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /* static guint gst_flac_tag_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -152,11 +155,14 @@ gst_flac_tag_get_type (void) NULL, NULL }; - - flac_tag_type = g_type_register_static(GST_TYPE_ELEMENT, "GstFlacTag", &flac_tag_info, 0); - g_type_add_interface_static (flac_tag_type, GST_TYPE_TAG_SETTER, &tag_setter_info); - + flac_tag_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstFlacTag", &flac_tag_info, + 0); + + g_type_add_interface_static (flac_tag_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); + } return flac_tag_type; } @@ -170,29 +176,29 @@ gst_flac_tag_base_init (gpointer g_class) gst_element_class_set_details (element_class, &gst_flac_tag_details); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&flac_tag_sink_template)); + gst_static_pad_template_get (&flac_tag_sink_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&flac_tag_src_template)); + gst_static_pad_template_get (&flac_tag_src_template)); } -static void -send_eos (GstFlacTag *tag) +static void +send_eos (GstFlacTag * tag) { gst_element_set_eos (GST_ELEMENT (tag)); gst_pad_push (tag->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); /* Seek to end of sink stream */ if (gst_pad_send_event (GST_PAD_PEER (tag->sinkpad), - gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_END | - GST_SEEK_FLAG_FLUSH, 0))) { + gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_END | + GST_SEEK_FLAG_FLUSH, 0))) { } else { g_warning ("Couldn't seek to eos on sinkpad\n"); } } -static gboolean -caps_nego (GstFlacTag *tag) +static gboolean +caps_nego (GstFlacTag * tag) { /* do caps nego */ GstCaps *caps; @@ -202,8 +208,8 @@ caps_nego (GstFlacTag *tag) tag->only_output_tags = FALSE; GST_LOG_OBJECT (tag, "normal operation, using audio/x-flac output"); } else { - if (gst_pad_try_set_caps (tag->srcpad, gst_caps_new_simple ( - "application/x-gst-tags", NULL)) + if (gst_pad_try_set_caps (tag->srcpad, + gst_caps_new_simple ("application/x-gst-tags", NULL)) != GST_PAD_LINK_REFUSED) { tag->only_output_tags = TRUE; GST_LOG_OBJECT (tag, "fast operation, just outputting tags"); @@ -211,36 +217,39 @@ caps_nego (GstFlacTag *tag) } else { return FALSE; } - } + } return TRUE; } static void -gst_flac_tag_class_init (GstFlacTagClass *klass) +gst_flac_tag_class_init (GstFlacTagClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; - - gstelement_class = (GstElementClass*) klass; - gobject_class = (GObjectClass*) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_flac_tag_change_state; } static void -gst_flac_tag_init (GstFlacTag *tag) +gst_flac_tag_init (GstFlacTag * tag) { /* create the sink and src pads */ - tag->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&flac_tag_sink_template), "sink"); + tag->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&flac_tag_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (tag), tag->sinkpad); - gst_pad_set_chain_function (tag->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_tag_chain)); + gst_pad_set_chain_function (tag->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_tag_chain)); - tag->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&flac_tag_src_template), "src"); + tag->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&flac_tag_src_template), "src"); gst_element_add_pad (GST_ELEMENT (tag), tag->srcpad); tag->buffer = NULL; @@ -250,11 +259,11 @@ gst_flac_tag_init (GstFlacTag *tag) #define FLAC_MAGIC_SIZE (sizeof (FLAC_MAGIC) - 1) static void -gst_flac_tag_chain (GstPad *pad, GstData *data) +gst_flac_tag_chain (GstPad * pad, GstData * data) { GstBuffer *buffer; GstFlacTag *tag; - + if (GST_IS_EVENT (data)) { g_print ("Unhandled event\n"); return; @@ -265,6 +274,7 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) if (tag->buffer) { GstBuffer *merge; + merge = gst_buffer_merge (tag->buffer, buffer); gst_buffer_unref (buffer); gst_buffer_unref (tag->buffer); @@ -284,13 +294,17 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) return; } - if (strncmp (GST_BUFFER_DATA (tag->buffer), FLAC_MAGIC, FLAC_MAGIC_SIZE) == 0) { + if (strncmp (GST_BUFFER_DATA (tag->buffer), FLAC_MAGIC, + FLAC_MAGIC_SIZE) == 0) { GstBuffer *sub; + tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; sub = gst_buffer_create_sub (tag->buffer, 0, FLAC_MAGIC_SIZE); - + gst_pad_push (tag->srcpad, GST_DATA (sub)); - sub = gst_buffer_create_sub (tag->buffer, FLAC_MAGIC_SIZE, GST_BUFFER_SIZE (tag->buffer) - FLAC_MAGIC_SIZE); + sub = + gst_buffer_create_sub (tag->buffer, FLAC_MAGIC_SIZE, + GST_BUFFER_SIZE (tag->buffer) - FLAC_MAGIC_SIZE); gst_buffer_unref (tag->buffer); /* We do a copy because we need a writable buffer, and _create_sub * sets the buffer it uses to read-only @@ -332,10 +346,9 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) } type = (GST_BUFFER_DATA (tag->buffer)[0]) & 0x7F; - size = - ((GST_BUFFER_DATA (tag->buffer)[1]) << 16) - | ((GST_BUFFER_DATA (tag->buffer)[2]) << 8) - | (GST_BUFFER_DATA (tag->buffer)[3]); + size = ((GST_BUFFER_DATA (tag->buffer)[1]) << 16) + | ((GST_BUFFER_DATA (tag->buffer)[2]) << 8) + | (GST_BUFFER_DATA (tag->buffer)[3]); /* The 4 bytes long header isn't included in the metadata size */ tag->metadata_bytes_remaining = size + 4; @@ -352,14 +365,14 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) /* Reads a metadata block */ if ((tag->state == GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK) || - (tag->state == GST_FLAC_TAG_STATE_VC_METADATA_BLOCK)) { - GstBuffer *sub; + (tag->state == GST_FLAC_TAG_STATE_VC_METADATA_BLOCK)) { + GstBuffer *sub; guint bytes_to_push; g_assert (tag->metadata_bytes_remaining != 0); - bytes_to_push = min (tag->metadata_bytes_remaining, - GST_BUFFER_SIZE (tag->buffer)); + bytes_to_push = min (tag->metadata_bytes_remaining, + GST_BUFFER_SIZE (tag->buffer)); sub = gst_buffer_create_sub (tag->buffer, 0, bytes_to_push); @@ -370,6 +383,7 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) tag->vorbiscomment = sub; } else { GstBuffer *merge; + merge = gst_buffer_merge (tag->vorbiscomment, sub); gst_buffer_unref (tag->vorbiscomment); gst_buffer_unref (sub); @@ -382,8 +396,8 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) if (GST_BUFFER_SIZE (tag->buffer) > bytes_to_push) { GstBuffer *sub; - sub = gst_buffer_create_sub (tag->buffer, bytes_to_push, - GST_BUFFER_SIZE (tag->buffer) - bytes_to_push); + sub = gst_buffer_create_sub (tag->buffer, bytes_to_push, + GST_BUFFER_SIZE (tag->buffer) - bytes_to_push); gst_buffer_unref (tag->buffer); /* We make a copy because we need a writable buffer, and _create_sub @@ -415,10 +429,9 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) if (tag->vorbiscomment != NULL) { /* We found some tags, try to parse them and notify the other elements * that we encoutered some tags - */ - tag->tags = gst_tag_list_from_vorbiscomment_buffer (tag->vorbiscomment, - GST_BUFFER_DATA (tag->vorbiscomment), - 4, NULL); + */ + tag->tags = gst_tag_list_from_vorbiscomment_buffer (tag->vorbiscomment, + GST_BUFFER_DATA (tag->vorbiscomment), 4, NULL); if (tag->tags != NULL) { gst_element_found_tags (GST_ELEMENT (tag), tag->tags); } @@ -431,7 +444,7 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) return; } } - + /* Skip to next state */ if (tag->metadata_last_block == FALSE) { tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; @@ -461,9 +474,9 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) g_assert (tag->only_output_tags == FALSE); user_tags = gst_tag_setter_get_list (GST_TAG_SETTER (tag)); - merged_tags = gst_tag_list_merge (tag->tags, user_tags, - gst_tag_setter_get_merge_mode (GST_TAG_SETTER (tag))); - + merged_tags = gst_tag_list_merge (tag->tags, user_tags, + gst_tag_setter_get_merge_mode (GST_TAG_SETTER (tag))); + if (merged_tags == NULL) { /* If we get a NULL list of tags, we must generate a padding block * which is marked as the last metadata block, otherwise we'll @@ -473,23 +486,25 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) buffer = gst_buffer_new_and_alloc (12); if (buffer == NULL) { GST_ELEMENT_ERROR (tag, CORE, TOO_LAZY, (NULL), - ("Error creating 12-byte buffer for padding block")); + ("Error creating 12-byte buffer for padding block")); } memset (GST_BUFFER_DATA (buffer), 0, GST_BUFFER_SIZE (buffer)); - GST_BUFFER_DATA (buffer)[0] = 0x81; /* 0x80 = Last metadata block, - * 0x01 = padding block - */ + GST_BUFFER_DATA (buffer)[0] = 0x81; /* 0x80 = Last metadata block, + * 0x01 = padding block + */ } else { guchar header[4]; + memset (header, 0, sizeof (header)); - header[0] = 0x84; /* 0x80 = Last metadata block, - * 0x04 = vorbiscomment block - */ - buffer = gst_tag_list_to_vorbiscomment_buffer (merged_tags, header, - sizeof (header), NULL); + header[0] = 0x84; /* 0x80 = Last metadata block, + * 0x04 = vorbiscomment block + */ + buffer = gst_tag_list_to_vorbiscomment_buffer (merged_tags, header, + sizeof (header), NULL); gst_tag_list_free (merged_tags); if (buffer == NULL) { - GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), ("Error converting tag list to vorbiscomment buffer")); + GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), + ("Error converting tag list to vorbiscomment buffer")); return; } size = GST_BUFFER_SIZE (buffer) - 4; @@ -498,9 +513,10 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) * while the vorbis specs allow more than that. Shouldn't * be a real world problem though */ - GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), ("Vorbis comment of size %d too long", size)); + GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), + ("Vorbis comment of size %d too long", size)); return; - } + } } /* The 4 byte metadata block header isn't accounted for in the total @@ -509,8 +525,8 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) size = GST_BUFFER_SIZE (buffer) - 4; GST_BUFFER_DATA (buffer)[1] = ((size & 0xFF0000) >> 16); - GST_BUFFER_DATA (buffer)[2] = ((size & 0x00FF00) >> 8); - GST_BUFFER_DATA (buffer)[3] = (size & 0x0000FF); + GST_BUFFER_DATA (buffer)[2] = ((size & 0x00FF00) >> 8); + GST_BUFFER_DATA (buffer)[3] = (size & 0x0000FF); gst_pad_push (tag->srcpad, GST_DATA (buffer)); tag->state = GST_FLAC_TAG_STATE_AUDIO_DATA; } @@ -525,7 +541,7 @@ gst_flac_tag_chain (GstPad *pad, GstData *data) static GstElementStateReturn -gst_flac_tag_change_state (GstElement *element) +gst_flac_tag_change_state (GstElement * element) { GstFlacTag *tag; @@ -543,7 +559,7 @@ gst_flac_tag_change_state (GstElement *element) break; case GST_STATE_PAUSED_TO_READY: if (tag->buffer) { - gst_buffer_unref (tag->buffer); + gst_buffer_unref (tag->buffer); tag->buffer = NULL; } if (tag->vorbiscomment) { diff --git a/ext/gdk_pixbuf/gst_loader.c b/ext/gdk_pixbuf/gst_loader.c index b0538cac..95fd5af7 100644 --- a/ext/gdk_pixbuf/gst_loader.c +++ b/ext/gdk_pixbuf/gst_loader.c @@ -31,53 +31,58 @@ #include -typedef struct { +typedef struct +{ /* stuff gdk throws at us and we're supposed to keep */ - GdkPixbufModuleSizeFunc size_func; - GdkPixbufModulePreparedFunc prepared_func; - GdkPixbufModuleUpdatedFunc updated_func; - gpointer user_data; + GdkPixbufModuleSizeFunc size_func; + GdkPixbufModulePreparedFunc prepared_func; + GdkPixbufModuleUpdatedFunc updated_func; + gpointer user_data; /* our own stuff - we're much better at keeping fields small :p */ - GstGdkAnimation * ani; - gboolean initialized; + GstGdkAnimation *ani; + gboolean initialized; } GstLoaderContext; GST_DEBUG_CATEGORY_STATIC (gst_loader_debug); #define GST_CAT_DEFAULT gst_loader_debug static gboolean -gst_loader_init (GError **error) +gst_loader_init (GError ** error) { static gboolean inited = FALSE; - + if (inited) return TRUE; - + if (!g_thread_supported ()) { g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED, - "The GStreamer loader requires threading support."); + "The GStreamer loader requires threading support."); return FALSE; } if (!gst_init_check (0, NULL)) { g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED, - "GStreamer could not be initialized."); + "GStreamer could not be initialized."); return FALSE; } inited = TRUE; - GST_DEBUG_CATEGORY_INIT (gst_loader_debug, "gstloader", 0, "entry point debugging for the GStreamer gdk pixbuf loader"); + GST_DEBUG_CATEGORY_INIT (gst_loader_debug, "gstloader", 0, + "entry point debugging for the GStreamer gdk pixbuf loader"); return TRUE; } + static gpointer -gst_loader_begin_load (GdkPixbufModuleSizeFunc size_func, GdkPixbufModulePreparedFunc prepared_func, - GdkPixbufModuleUpdatedFunc updated_func, gpointer user_data, GError **error) +gst_loader_begin_load (GdkPixbufModuleSizeFunc size_func, + GdkPixbufModulePreparedFunc prepared_func, + GdkPixbufModuleUpdatedFunc updated_func, gpointer user_data, + GError ** error) { GstLoaderContext *context; - + if (!gst_loader_init (error)) return NULL; - + context = g_new (GstLoaderContext, 1); context->size_func = size_func; context->prepared_func = prepared_func; @@ -91,7 +96,8 @@ gst_loader_begin_load (GdkPixbufModuleSizeFunc size_func, GdkPixbufModulePrepare g_free (context); return NULL; } - context->ani->temp_fd = g_file_open_tmp (NULL, &context->ani->temp_location, error); + context->ani->temp_fd = + g_file_open_tmp (NULL, &context->ani->temp_location, error); if (context->ani->temp_fd == 0) { g_object_unref (context->ani); g_free (context); @@ -101,19 +107,27 @@ gst_loader_begin_load (GdkPixbufModuleSizeFunc size_func, GdkPixbufModulePrepare GST_LOG_OBJECT (context->ani, "begin loading"); return context; } + static gboolean -gst_loader_load_increment (gpointer context_pointer, const guchar *buf, guint size, GError **error) +gst_loader_load_increment (gpointer context_pointer, const guchar * buf, + guint size, GError ** error) { GdkPixbufAnimationIter *iter; GstLoaderContext *context = (GstLoaderContext *) context_pointer; GST_LOG_OBJECT (context->ani, "load increment: %u bytes", size); gst_gdk_animation_add_data (context->ani, buf, size); - if (!context->initialized && (iter = gdk_pixbuf_animation_get_iter ( - GDK_PIXBUF_ANIMATION (context->ani), NULL)) != NULL) { - int width = gdk_pixbuf_animation_get_width (GDK_PIXBUF_ANIMATION (context->ani)); - int height = gdk_pixbuf_animation_get_height (GDK_PIXBUF_ANIMATION (context->ani)); - GdkPixbuf *pixbuf = gdk_pixbuf_animation_get_static_image (GDK_PIXBUF_ANIMATION (context->ani)); + if (!context->initialized + && (iter = + gdk_pixbuf_animation_get_iter (GDK_PIXBUF_ANIMATION (context->ani), + NULL)) != NULL) { + int width = + gdk_pixbuf_animation_get_width (GDK_PIXBUF_ANIMATION (context->ani)); + int height = + gdk_pixbuf_animation_get_height (GDK_PIXBUF_ANIMATION (context->ani)); + GdkPixbuf *pixbuf = + gdk_pixbuf_animation_get_static_image (GDK_PIXBUF_ANIMATION (context-> + ani)); g_object_unref (iter); GST_LOG_OBJECT (context->ani, "initializing loader"); @@ -123,17 +137,20 @@ gst_loader_load_increment (gpointer context_pointer, const guchar *buf, guint si } if (context->prepared_func) { - GST_LOG_OBJECT (context->ani, "calling prepared_func %p", context->prepared_func); - context->prepared_func (pixbuf, GDK_PIXBUF_ANIMATION (context->ani), context->user_data); + GST_LOG_OBJECT (context->ani, "calling prepared_func %p", + context->prepared_func); + context->prepared_func (pixbuf, GDK_PIXBUF_ANIMATION (context->ani), + context->user_data); } - + context->initialized = TRUE; } - + return TRUE; } + static gboolean -gst_loader_stop_load (gpointer context_pointer, GError **error) +gst_loader_stop_load (gpointer context_pointer, GError ** error) { GstLoaderContext *context = (GstLoaderContext *) context_pointer; @@ -146,20 +163,20 @@ gst_loader_stop_load (gpointer context_pointer, GError **error) } static GdkPixbufAnimation * -gst_loader_load_animation (FILE *f, GError **error) +gst_loader_load_animation (FILE * f, GError ** error) { gchar *filename; GstGdkAnimation *ani; GdkPixbufAnimationIter *iter = NULL; - + if (!gst_loader_init (error)) return NULL; - + GST_LOG ("load_animation"); ani = gst_gdk_animation_new (error); if (!ani) return NULL; - + filename = g_strdup_printf ("/proc/self/fd/%d", fileno (f)); ani->temp_fd = open (filename, 0); if (ani->temp_fd >= 0) { @@ -170,21 +187,21 @@ gst_loader_load_animation (FILE *f, GError **error) g_free (filename); if (iter == NULL) { g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - "could not create an image"); + "could not create an image"); g_object_unref (ani); GST_INFO ("could not create an image"); - return NULL; + return NULL; } g_object_unref (iter); GST_LOG_OBJECT (ani, "load_animation succeeded"); return GDK_PIXBUF_ANIMATION (ani); } static GdkPixbuf * -gst_loader_load (FILE *f, GError **error) +gst_loader_load (FILE * f, GError ** error) { GdkPixbufAnimation *ani; GdkPixbuf *pixbuf; - + ani = gst_loader_load_animation (f, error); if (ani == NULL) return NULL; @@ -193,8 +210,8 @@ gst_loader_load (FILE *f, GError **error) if (!pixbuf) { GST_ERROR_OBJECT (ani, "Could not get an image in _pixbuf_load"); g_object_unref (ani); - g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - "Could not get an image from file."); + g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_CORRUPT_IMAGE, + "Could not get an image from file."); return NULL; } @@ -203,8 +220,9 @@ gst_loader_load (FILE *f, GError **error) return pixbuf; } + void -fill_vtable (GdkPixbufModule *module) +fill_vtable (GdkPixbufModule * module) { module->load = gst_loader_load; module->begin_load = gst_loader_begin_load; @@ -212,33 +230,35 @@ fill_vtable (GdkPixbufModule *module) module->stop_load = gst_loader_stop_load; module->load_animation = gst_loader_load_animation; } + void -fill_info (GdkPixbufFormat *info) +fill_info (GdkPixbufFormat * info) { static GdkPixbufModulePattern signature[] = { /* AVI */ - { "RIFF AVI ", " xxxx ", 100 }, + {"RIFF AVI ", " xxxx ", 100}, /* MPEG 1 */ - { "xx\001\272", "zz ", 100 }, + {"xx\001\272", "zz ", 100}, /* MPEG 2 */ - { "xx\001\263", "zz ", 100 }, + {"xx\001\263", "zz ", 100}, /* Quicktime */ - { " wide", "xxxx ", 80 }, - { " moov", "xxxx ", 80 }, - { " mdat", "xxxx ", 80 }, - { " pnot", "xxxx ", 80 }, - { " PICT", "xxxx ", 80 }, - { " free", "xxxx ", 80 }, + {" wide", "xxxx ", 80}, + {" moov", "xxxx ", 80}, + {" mdat", "xxxx ", 80}, + {" pnot", "xxxx ", 80}, + {" PICT", "xxxx ", 80}, + {" free", "xxxx ", 80}, /* ASF */ - { "\060\046\262\165\216\146\317\021\246\331 \252 \142\316\154", " z z ", 100 }, - { NULL, NULL, 0 } + {"\060\046\262\165\216\146\317\021\246\331 \252 \142\316\154", + " z z ", 100}, + {NULL, NULL, 0} }; - + static gchar *mime_types[] = { "video/avi", "video/x-avi", "video/x-msvideo", "video/mpeg", - "video/quicktime", - "video/x-ms-asf", + "video/quicktime", + "video/x-ms-asf", NULL }; @@ -246,14 +266,14 @@ fill_info (GdkPixbufFormat *info) "avi", "mpeg", "mpe", "mpg", "mov", - "asf", "wmv", + "asf", "wmv", NULL }; - - info->name = "GStreamer"; - info->signature = signature; + + info->name = "GStreamer"; + info->signature = signature; info->description = "GStreamer supported video"; - info->mime_types = mime_types; - info->extensions = extensions; - info->flags = 0; + info->mime_types = mime_types; + info->extensions = extensions; + info->flags = 0; } diff --git a/ext/gdk_pixbuf/gstgdkanimation.c b/ext/gdk_pixbuf/gstgdkanimation.c index a0b6cb93..df58c5be 100644 --- a/ext/gdk_pixbuf/gstgdkanimation.c +++ b/ext/gdk_pixbuf/gstgdkanimation.c @@ -27,17 +27,18 @@ GST_DEBUG_CATEGORY_STATIC (gst_gdk_animation_debug); #define GST_CAT_DEFAULT gst_gdk_animation_debug -static void gst_gdk_animation_class_init (gpointer g_class, - gpointer class_data); -static void gst_gdk_animation_finalize (GObject * object); +static void gst_gdk_animation_class_init (gpointer g_class, + gpointer class_data); +static void gst_gdk_animation_finalize (GObject * object); -static gboolean gst_gdk_animation_is_static_image (GdkPixbufAnimation * animation); -static GdkPixbuf* gst_gdk_animation_get_static_image (GdkPixbufAnimation * animation); -static void gst_gdk_animation_get_size (GdkPixbufAnimation * anim, - gint * width, - gint * height); -static GdkPixbufAnimationIter* gst_gdk_animation_get_iter (GdkPixbufAnimation * anim, - const GTimeVal * start_time); +static gboolean gst_gdk_animation_is_static_image (GdkPixbufAnimation * + animation); +static GdkPixbuf *gst_gdk_animation_get_static_image (GdkPixbufAnimation * + animation); +static void gst_gdk_animation_get_size (GdkPixbufAnimation * anim, gint * width, + gint * height); +static GdkPixbufAnimationIter *gst_gdk_animation_get_iter (GdkPixbufAnimation * + anim, const GTimeVal * start_time); static gpointer parent_class; @@ -53,19 +54,20 @@ gst_gdk_animation_get_type (void) NULL, NULL, gst_gdk_animation_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + NULL, /* class_finalize */ + NULL, /* class_data */ sizeof (GstGdkAnimation), - 0, /* n_preallocs */ + 0, /* n_preallocs */ NULL, }; - + object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION, - "GstGdkAnimation", &object_info, 0); + "GstGdkAnimation", &object_info, 0); - GST_DEBUG_CATEGORY_INIT (gst_gdk_animation_debug, "gstloader_animation", 0, "GStreamer GdkPixbuf loader - GdkAnimation class"); + GST_DEBUG_CATEGORY_INIT (gst_gdk_animation_debug, "gstloader_animation", 0, + "GStreamer GdkPixbuf loader - GdkAnimation class"); } - + return object_type; } static void @@ -73,9 +75,9 @@ gst_gdk_animation_class_init (gpointer g_class, gpointer class_data) { GObjectClass *object_class = G_OBJECT_CLASS (g_class); GdkPixbufAnimationClass *anim_class = GDK_PIXBUF_ANIMATION_CLASS (g_class); - + parent_class = g_type_class_peek_parent (g_class); - + object_class->finalize = gst_gdk_animation_finalize; anim_class->is_static_image = gst_gdk_animation_is_static_image; @@ -84,7 +86,7 @@ gst_gdk_animation_class_init (gpointer g_class, gpointer class_data) anim_class->get_iter = gst_gdk_animation_get_iter; } static void -gst_gdk_animation_finalize (GObject *object) +gst_gdk_animation_finalize (GObject * object) { GstGdkAnimation *ani = GST_GDK_ANIMATION (object); @@ -99,39 +101,47 @@ gst_gdk_animation_finalize (GObject *object) g_object_unref (ani->pixbuf); ani->pixbuf = NULL; } - + G_OBJECT_CLASS (parent_class)->finalize (object); } + GstGdkAnimation * -gst_gdk_animation_new (GError **error) +gst_gdk_animation_new (GError ** error) { - GstGdkAnimation *ani = GST_GDK_ANIMATION (g_object_new (GST_TYPE_GDK_ANIMATION, NULL)); + GstGdkAnimation *ani = + GST_GDK_ANIMATION (g_object_new (GST_TYPE_GDK_ANIMATION, NULL)); return ani; } + gboolean -gst_gdk_animation_add_data (GstGdkAnimation *ani, const guint8 *data, guint size) +gst_gdk_animation_add_data (GstGdkAnimation * ani, const guint8 * data, + guint size) { return (write (ani->temp_fd, data, size) == size); } + void -gst_gdk_animation_done_adding (GstGdkAnimation *ani) +gst_gdk_animation_done_adding (GstGdkAnimation * ani) { close (ani->temp_fd); ani->temp_fd = 0; } + static gboolean -gst_gdk_animation_is_static_image (GdkPixbufAnimation *animation) +gst_gdk_animation_is_static_image (GdkPixbufAnimation * animation) { return FALSE; } static void -gst_gdk_animation_get_size (GdkPixbufAnimation *anim, gint *width, int *height) +gst_gdk_animation_get_size (GdkPixbufAnimation * anim, gint * width, + int *height) { GstGdkAnimation *ani = GST_GDK_ANIMATION (anim); - GST_LOG_OBJECT (ani, "get_size called (%p, %p) %d x %d", width, height, ani->width, ani->height); + GST_LOG_OBJECT (ani, "get_size called (%p, %p) %d x %d", width, height, + ani->width, ani->height); if (width) *width = ani->width; @@ -140,17 +150,21 @@ gst_gdk_animation_get_size (GdkPixbufAnimation *anim, gint *width, int *height) } -static void gst_gdk_animation_iter_class_init (gpointer g_class, - gpointer class_data); -static void gst_gdk_animation_iter_init (GTypeInstance * instance, - gpointer g_class); -static void gst_gdk_animation_iter_finalize (GObject * object); +static void gst_gdk_animation_iter_class_init (gpointer g_class, + gpointer class_data); +static void gst_gdk_animation_iter_init (GTypeInstance * instance, + gpointer g_class); +static void gst_gdk_animation_iter_finalize (GObject * object); -static gint gst_gdk_animation_iter_get_delay_time (GdkPixbufAnimationIter * iter); -static GdkPixbuf * gst_gdk_animation_iter_get_pixbuf (GdkPixbufAnimationIter * iter); -static gboolean gst_gdk_animation_iter_on_currently_loading_frame (GdkPixbufAnimationIter * iter); -static gboolean gst_gdk_animation_iter_advance (GdkPixbufAnimationIter * iter, - const GTimeVal * current_time); +static gint gst_gdk_animation_iter_get_delay_time (GdkPixbufAnimationIter * + iter); +static GdkPixbuf *gst_gdk_animation_iter_get_pixbuf (GdkPixbufAnimationIter * + iter); +static gboolean +gst_gdk_animation_iter_on_currently_loading_frame (GdkPixbufAnimationIter * + iter); +static gboolean gst_gdk_animation_iter_advance (GdkPixbufAnimationIter * iter, + const GTimeVal * current_time); static gpointer iter_parent_class; @@ -165,17 +179,17 @@ gst_gdk_animation_iter_get_type (void) NULL, NULL, gst_gdk_animation_iter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + NULL, /* class_finalize */ + NULL, /* class_data */ sizeof (GstGdkAnimationIter), - 0, /* n_preallocs */ + 0, /* n_preallocs */ gst_gdk_animation_iter_init, }; - + object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION_ITER, - "GdkPixbufAniAnimIter", &object_info, 0); + "GdkPixbufAniAnimIter", &object_info, 0); } - + return object_type; } @@ -183,19 +197,21 @@ static void gst_gdk_animation_iter_class_init (gpointer g_class, gpointer class_data) { GObjectClass *object_class = G_OBJECT_CLASS (g_class); - GdkPixbufAnimationIterClass *anim_iter_class = GDK_PIXBUF_ANIMATION_ITER_CLASS (g_class); - + GdkPixbufAnimationIterClass *anim_iter_class = + GDK_PIXBUF_ANIMATION_ITER_CLASS (g_class); + iter_parent_class = g_type_class_peek_parent (g_class); - + object_class->finalize = gst_gdk_animation_iter_finalize; - + anim_iter_class->get_delay_time = gst_gdk_animation_iter_get_delay_time; anim_iter_class->get_pixbuf = gst_gdk_animation_iter_get_pixbuf; - anim_iter_class->on_currently_loading_frame = gst_gdk_animation_iter_on_currently_loading_frame; + anim_iter_class->on_currently_loading_frame = + gst_gdk_animation_iter_on_currently_loading_frame; anim_iter_class->advance = gst_gdk_animation_iter_advance; } static void -gst_gdk_animation_iter_init (GTypeInstance *instance, gpointer g_class) +gst_gdk_animation_iter_init (GTypeInstance * instance, gpointer g_class) { GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (instance); @@ -203,18 +219,19 @@ gst_gdk_animation_iter_init (GTypeInstance *instance, gpointer g_class) iter->eos = FALSE; } static void -gst_gdk_animation_iter_finalize (GObject *object) +gst_gdk_animation_iter_finalize (GObject * object) { GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (object); - + g_object_unref (iter->ani); - + if (iter->pipeline) g_object_unref (iter->pipeline); if (iter->pixbuf) g_object_unref (iter->pixbuf); while (iter->buffers) { GstBuffer *buffer = GST_BUFFER (g_queue_pop_head (iter->buffers)); + if (buffer) { GST_LOG_OBJECT (iter, "unreffing buffer %p on finalize", buffer); gst_data_unref (GST_DATA (buffer)); @@ -226,36 +243,40 @@ gst_gdk_animation_iter_finalize (GObject *object) G_OBJECT_CLASS (iter_parent_class)->finalize (object); } static void -got_handoff (GstElement *fakesink, GstBuffer *buffer, GstPad *pad, GstGdkAnimationIter *iter) +got_handoff (GstElement * fakesink, GstBuffer * buffer, GstPad * pad, + GstGdkAnimationIter * iter) { - GST_LOG_OBJECT (iter, "enqueing buffer %p (timestamp %"G_GUINT64_FORMAT")", - buffer, GST_BUFFER_TIMESTAMP (buffer)); + GST_LOG_OBJECT (iter, "enqueing buffer %p (timestamp %" G_GUINT64_FORMAT ")", + buffer, GST_BUFFER_TIMESTAMP (buffer)); gst_data_ref (GST_DATA (buffer)); g_queue_push_tail (iter->buffers, buffer); } + static gboolean -gst_gdk_animation_iter_create_pipeline (GstGdkAnimationIter *iter) +gst_gdk_animation_iter_create_pipeline (GstGdkAnimationIter * iter) { GstElement *src, *typefind, *autoplugger, *sink, *colorspace; GstCaps *caps = GST_CAPS_NEW ("pixbuf_filter32", - "video/x-raw-rgb", - "endianness", GST_PROPS_INT (G_BIG_ENDIAN), - "bpp", GST_PROPS_INT (32), - "red_mask", GST_PROPS_INT (0xFF000000), - "green_mask", GST_PROPS_INT (0x00FF0000), - "blue_mask", GST_PROPS_INT (0x0000FF00) - ); + "video/x-raw-rgb", + "endianness", GST_PROPS_INT (G_BIG_ENDIAN), + "bpp", GST_PROPS_INT (32), + "red_mask", GST_PROPS_INT (0xFF000000), + "green_mask", GST_PROPS_INT (0x00FF0000), + "blue_mask", GST_PROPS_INT (0x0000FF00) + ); + gst_caps_append (caps, GST_CAPS_NEW ("pixbuf_filter24", - "video/x-raw-rgb", - "endianness", GST_PROPS_INT (G_BIG_ENDIAN), - "bpp", GST_PROPS_INT (24), - "red_mask", GST_PROPS_INT (0xFF0000), - "green_mask", GST_PROPS_INT (0x00FF00), - "blue_mask", GST_PROPS_INT (0x0000FF) - )); + "video/x-raw-rgb", + "endianness", GST_PROPS_INT (G_BIG_ENDIAN), + "bpp", GST_PROPS_INT (24), + "red_mask", GST_PROPS_INT (0xFF0000), + "green_mask", GST_PROPS_INT (0x00FF00), + "blue_mask", GST_PROPS_INT (0x0000FF) + )); iter->pipeline = gst_element_factory_make ("pipeline", "main_pipeline"); - if (iter->pipeline == NULL) return FALSE; + if (iter->pipeline == NULL) + return FALSE; if (!(src = gst_element_factory_make ("filesrc", "source"))) goto error; @@ -265,6 +286,7 @@ gst_gdk_animation_iter_create_pipeline (GstGdkAnimationIter *iter) GST_INFO_OBJECT (iter, "using file '%s'", iter->ani->temp_location); } else { gchar *filename = g_strdup_printf ("/proc/self/fd/%d", iter->ani->temp_fd); + g_object_set (src, "location", filename, NULL); GST_INFO_OBJECT (iter, "using file '%s'", filename); g_free (filename); @@ -292,7 +314,7 @@ gst_gdk_animation_iter_create_pipeline (GstGdkAnimationIter *iter) gst_bin_add (GST_BIN (iter->pipeline), colorspace); if (!gst_element_link (autoplugger, colorspace)) goto error; - + if (!(sink = gst_element_factory_make ("fakesink", "sink"))) goto error; g_object_set (sink, "signal-handoffs", TRUE, NULL); @@ -300,39 +322,42 @@ gst_gdk_animation_iter_create_pipeline (GstGdkAnimationIter *iter) gst_bin_add (GST_BIN (iter->pipeline), sink); if (!gst_element_link_filtered (colorspace, sink, caps)) goto error; - if (gst_element_set_state (iter->pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) + if (gst_element_set_state (iter->pipeline, + GST_STATE_PLAYING) != GST_STATE_SUCCESS) goto error; - + return TRUE; error: g_object_unref (iter->pipeline); iter->pipeline = NULL; return FALSE; } + static gboolean -gst_gdk_animation_iter_may_advance (GstGdkAnimationIter *iter) +gst_gdk_animation_iter_may_advance (GstGdkAnimationIter * iter) { GstFormat bytes = GST_FORMAT_BYTES; gint64 offset; gint64 data_amount; - + if (iter->ani->temp_fd == 0 || iter->ani->temp_location == NULL) return TRUE; data_amount = lseek (iter->ani->temp_fd, 0, SEEK_CUR); g_assert (data_amount >= 0); - g_assert (gst_element_query (gst_bin_get_by_name (GST_BIN (iter->pipeline), "source"), - GST_QUERY_POSITION, &bytes, &offset)); + g_assert (gst_element_query (gst_bin_get_by_name (GST_BIN (iter->pipeline), + "source"), GST_QUERY_POSITION, &bytes, &offset)); if (data_amount - offset > GST_GDK_BUFFER_SIZE) return TRUE; return FALSE; } + static gboolean -gst_gdk_animation_get_more_buffers (GstGdkAnimationIter *iter) +gst_gdk_animation_get_more_buffers (GstGdkAnimationIter * iter) { GstBuffer *last = g_queue_peek_tail (iter->buffers); - + do { GST_LOG_OBJECT (iter, "iterating..."); if (!gst_gdk_animation_iter_may_advance (iter)) { @@ -348,17 +373,17 @@ gst_gdk_animation_get_more_buffers (GstGdkAnimationIter *iter) return last != g_queue_peek_tail (iter->buffers); } static void -pixbuf_destroy_notify (guchar *pixels, gpointer data) +pixbuf_destroy_notify (guchar * pixels, gpointer data) { GST_LOG ("unreffing buffer %p because pixbuf was destroyed", data); gst_data_unref (GST_DATA (data)); } static void -gst_gdk_animation_iter_create_pixbuf (GstGdkAnimationIter *iter) +gst_gdk_animation_iter_create_pixbuf (GstGdkAnimationIter * iter) { GstBuffer *buf; GstGdkAnimation *ani = iter->ani; - + buf = g_queue_pop_head (iter->buffers); g_assert (buf); if (iter->pixbuf) { @@ -368,7 +393,8 @@ gst_gdk_animation_iter_create_pixbuf (GstGdkAnimationIter *iter) if (ani->width == 0) { GstPad *pad; GstCaps *caps; - GstElement *fakesink = gst_bin_get_by_name (GST_BIN (iter->pipeline), "sink"); + GstElement *fakesink = + gst_bin_get_by_name (GST_BIN (iter->pipeline), "sink"); g_assert (fakesink); pad = gst_element_get_pad (fakesink, "sink"); g_assert (pad); @@ -376,92 +402,108 @@ gst_gdk_animation_iter_create_pixbuf (GstGdkAnimationIter *iter) g_assert (caps); g_assert (GST_CAPS_IS_FIXED (caps)); g_assert (gst_caps_has_fixed_property (caps, "bpp") && - gst_caps_has_fixed_property (caps, "width") && - gst_caps_has_fixed_property (caps, "height")); + gst_caps_has_fixed_property (caps, "width") && + gst_caps_has_fixed_property (caps, "height")); gst_caps_get_int (caps, "width", &ani->width); gst_caps_get_int (caps, "height", &ani->height); gst_caps_get_int (caps, "bpp", &ani->bpp); - GST_DEBUG_OBJECT (ani, "found format (width %d, height %d, bpp %d)", ani->width, ani->height, ani->bpp); + GST_DEBUG_OBJECT (ani, "found format (width %d, height %d, bpp %d)", + ani->width, ani->height, ani->bpp); } g_assert (GST_BUFFER_SIZE (buf) == ani->width * ani->height * ani->bpp / 8); if (ani->bpp == 32) { gint i; guint32 *data = (guint32 *) GST_BUFFER_DATA (buf); + /* ensure opacity */ for (i = 0; i < ani->width * ani->height; i++) { data[i] |= 0xFF000000; } } iter->pixbuf = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (buf), - GDK_COLORSPACE_RGB, ani->bpp == 32, 8, ani->width, ani->height, ani->width * ani->bpp / 8, pixbuf_destroy_notify, buf); - GST_LOG_OBJECT (iter, "created pixbuf %p from buffer %p (refcount %d)", iter->pixbuf, buf, GST_DATA_REFCOUNT_VALUE (buf)); + GDK_COLORSPACE_RGB, ani->bpp == 32, 8, ani->width, ani->height, + ani->width * ani->bpp / 8, pixbuf_destroy_notify, buf); + GST_LOG_OBJECT (iter, "created pixbuf %p from buffer %p (refcount %d)", + iter->pixbuf, buf, GST_DATA_REFCOUNT_VALUE (buf)); } -static GdkPixbufAnimationIter* -gst_gdk_animation_get_iter (GdkPixbufAnimation *anim, const GTimeVal *start_time) +static GdkPixbufAnimationIter * +gst_gdk_animation_get_iter (GdkPixbufAnimation * anim, + const GTimeVal * start_time) { GstGdkAnimation *ani = GST_GDK_ANIMATION (anim); GstGdkAnimationIter *iter; - if (ani->temp_fd != 0 && ani->temp_location != NULL && + if (ani->temp_fd != 0 && ani->temp_location != NULL && lseek (ani->temp_fd, 0, SEEK_CUR) < GST_GDK_BUFFER_SIZE) { GST_DEBUG_OBJECT (ani, "Not enough data to create iterator."); return NULL; } - + iter = g_object_new (GST_TYPE_GDK_ANIMATION_ITER, NULL); iter->start = *start_time; - + iter->ani = ani; g_object_ref (ani); if (!gst_gdk_animation_iter_create_pipeline (iter)) goto error; - + if (!gst_gdk_animation_get_more_buffers (iter)) goto error; - + gst_gdk_animation_iter_create_pixbuf (iter); - + return GDK_PIXBUF_ANIMATION_ITER (iter); error: g_object_unref (iter); return NULL; } + static gboolean -gst_gdk_animation_iter_advance (GdkPixbufAnimationIter *anim_iter, const GTimeVal *current_time) +gst_gdk_animation_iter_advance (GdkPixbufAnimationIter * anim_iter, + const GTimeVal * current_time) { GstClockTime offset; GstBuffer *buffer = NULL; GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (anim_iter); /* compute timestamp that next buffer must match */ - offset = ((GstClockTime) current_time->tv_sec - iter->start.tv_sec) * GST_SECOND; + offset = + ((GstClockTime) current_time->tv_sec - iter->start.tv_sec) * GST_SECOND; if (iter->start.tv_usec > current_time->tv_usec) { - offset -= ((GstClockTime) iter->start.tv_usec - current_time->tv_usec) * GST_SECOND / G_USEC_PER_SEC; + offset -= + ((GstClockTime) iter->start.tv_usec - + current_time->tv_usec) * GST_SECOND / G_USEC_PER_SEC; } else { - offset += ((GstClockTime) current_time->tv_usec - iter->start.tv_usec) * GST_SECOND / G_USEC_PER_SEC; + offset += + ((GstClockTime) current_time->tv_usec - + iter->start.tv_usec) * GST_SECOND / G_USEC_PER_SEC; } - GST_DEBUG_OBJECT (iter, "advancing to %ld:%ld (started at %ld:%ld) need offset %"G_GUINT64_FORMAT, - current_time->tv_sec, current_time->tv_usec, iter->start.tv_sec, iter->start.tv_usec, offset); - if (!iter->just_seeked && - offset - iter->last_timestamp > GST_GDK_MAX_DELAY_TO_SEEK) { - GST_INFO_OBJECT (iter, "current pipeline timestamp is too old (%"G_GUINT64_FORMAT - " vs %"G_GUINT64_FORMAT"), seeking there", iter->last_timestamp, offset); - if (gst_element_send_event (gst_bin_get_by_name (GST_BIN (iter->pipeline), "sink"), - gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, - offset))) { - iter->last_timestamp = offset; - iter->just_seeked = TRUE; - } else { - GST_WARNING_OBJECT (iter, "seek to %"G_GUINT64_FORMAT" didn't work. Iterating there...", - offset); - } + GST_DEBUG_OBJECT (iter, + "advancing to %ld:%ld (started at %ld:%ld) need offset %" + G_GUINT64_FORMAT, current_time->tv_sec, current_time->tv_usec, + iter->start.tv_sec, iter->start.tv_usec, offset); + if (!iter->just_seeked + && offset - iter->last_timestamp > GST_GDK_MAX_DELAY_TO_SEEK) { + GST_INFO_OBJECT (iter, + "current pipeline timestamp is too old (%" G_GUINT64_FORMAT " vs %" + G_GUINT64_FORMAT "), seeking there", iter->last_timestamp, offset); + if (gst_element_send_event (gst_bin_get_by_name (GST_BIN (iter->pipeline), + "sink"), + gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, offset))) { + iter->last_timestamp = offset; + iter->just_seeked = TRUE; + } else { + GST_WARNING_OBJECT (iter, + "seek to %" G_GUINT64_FORMAT " didn't work. Iterating there...", + offset); + } } else if (iter->just_seeked) { iter->just_seeked = FALSE; } - + while (TRUE) { if (g_queue_is_empty (iter->buffers)) { if (iter->eos) @@ -474,8 +516,8 @@ gst_gdk_animation_iter_advance (GdkPixbufAnimationIter *anim_iter, const GTimeVa break; if (buffer) { GST_LOG_OBJECT (iter, "unreffing buffer %p, because timestamp too low (%" - G_GUINT64_FORMAT" vs %"G_GUINT64_FORMAT")", - buffer, GST_BUFFER_TIMESTAMP (buffer), offset); + G_GUINT64_FORMAT " vs %" G_GUINT64_FORMAT ")", + buffer, GST_BUFFER_TIMESTAMP (buffer), offset); gst_data_unref (GST_DATA (buffer)); } buffer = GST_BUFFER (g_queue_pop_head (iter->buffers)); @@ -492,39 +534,44 @@ gst_gdk_animation_iter_advance (GdkPixbufAnimationIter *anim_iter, const GTimeVa gst_gdk_animation_iter_create_pixbuf (iter); return TRUE; } + static gint -gst_gdk_animation_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) +gst_gdk_animation_iter_get_delay_time (GdkPixbufAnimationIter * anim_iter) { gint delay; GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (anim_iter); - + while (g_queue_is_empty (iter->buffers)) { if (iter->eos) { GST_LOG_OBJECT (iter, "returning delay of infinite, we're EOS"); return -1; } if (!gst_gdk_animation_get_more_buffers (iter)) - return -1; /* FIXME? */ + return -1; /* FIXME? */ } - delay = (GST_BUFFER_TIMESTAMP (g_queue_peek_head (iter->buffers)) - iter->last_timestamp) * - 1000 / GST_SECOND; + delay = + (GST_BUFFER_TIMESTAMP (g_queue_peek_head (iter->buffers)) - + iter->last_timestamp) * 1000 / GST_SECOND; GST_LOG_OBJECT (iter, "returning delay of %d ms", delay); return delay; } -GdkPixbuf* -gst_gdk_animation_iter_get_pixbuf (GdkPixbufAnimationIter *anim_iter) + +GdkPixbuf * +gst_gdk_animation_iter_get_pixbuf (GdkPixbufAnimationIter * anim_iter) { GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (anim_iter); - + GST_LOG_OBJECT (iter, "returning pixbuf %p", iter->pixbuf); return iter->pixbuf; } + static gboolean -gst_gdk_animation_iter_on_currently_loading_frame (GdkPixbufAnimationIter *anim_iter) +gst_gdk_animation_iter_on_currently_loading_frame (GdkPixbufAnimationIter * + anim_iter) { GstGdkAnimationIter *iter = GST_GDK_ANIMATION_ITER (anim_iter); - + /* EOS - last frame */ if (iter->eos && g_queue_is_empty (iter->buffers)) return TRUE; @@ -532,11 +579,11 @@ gst_gdk_animation_iter_on_currently_loading_frame (GdkPixbufAnimationIter *anim_ /* can't load more frames */ if (!gst_gdk_animation_iter_may_advance (iter)) return FALSE; - + return TRUE; } -static GdkPixbuf* -gst_gdk_animation_get_static_image (GdkPixbufAnimation *animation) +static GdkPixbuf * +gst_gdk_animation_get_static_image (GdkPixbufAnimation * animation) { GstGdkAnimation *ani = GST_GDK_ANIMATION (animation); GTimeVal tv; @@ -545,16 +592,15 @@ gst_gdk_animation_get_static_image (GdkPixbufAnimation *animation) if (!ani->pixbuf) { GST_LOG_OBJECT (ani, "trying to create pixbuf"); g_get_current_time (&tv); - iter = GST_GDK_ANIMATION_ITER ( - gdk_pixbuf_animation_get_iter (animation, &tv)); + iter = + GST_GDK_ANIMATION_ITER (gdk_pixbuf_animation_get_iter (animation, &tv)); if (iter) { guint64 offset; GstBuffer *buf; GstFormat time = GST_FORMAT_TIME; - if (!gst_element_query (gst_bin_get_by_name (GST_BIN ( - iter->pipeline), "sink"), - GST_QUERY_TOTAL, &time, &offset)) { + if (!gst_element_query (gst_bin_get_by_name (GST_BIN (iter->pipeline), + "sink"), GST_QUERY_TOTAL, &time, &offset)) { offset = 0; } if (offset > 120 * GST_SECOND) { @@ -563,15 +609,17 @@ gst_gdk_animation_get_static_image (GdkPixbufAnimation *animation) offset = offset / 2; } g_assert (time == GST_FORMAT_TIME); - GST_LOG_OBJECT (ani, "using time offset %"G_GUINT64_FORMAT" for creating static image", - offset); + GST_LOG_OBJECT (ani, + "using time offset %" G_GUINT64_FORMAT " for creating static image", + offset); while ((buf = g_queue_pop_head (iter->buffers)) != NULL) { gst_data_unref (GST_DATA (buf)); } /* now we do evil stuff, be sure to get rid of the iterator afterwards */ - if (!gst_element_send_event (gst_bin_get_by_name (GST_BIN (iter->pipeline), "sink"), - gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, offset))) { + if (!gst_element_send_event (gst_bin_get_by_name (GST_BIN (iter-> + pipeline), "sink"), + gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, offset))) { GST_INFO_OBJECT (ani, "seeking didn't work. Using next image"); } @@ -585,7 +633,9 @@ gst_gdk_animation_get_static_image (GdkPixbufAnimation *animation) } while (FALSE); if (!g_queue_is_empty (iter->buffers)) { gst_gdk_animation_iter_create_pixbuf (iter); - ani->pixbuf = gst_gdk_animation_iter_get_pixbuf (GDK_PIXBUF_ANIMATION_ITER (iter)); + ani->pixbuf = + gst_gdk_animation_iter_get_pixbuf (GDK_PIXBUF_ANIMATION_ITER + (iter)); g_object_ref (ani->pixbuf); } else { g_assert (ani->pixbuf == NULL); diff --git a/ext/gdk_pixbuf/gstgdkanimation.h b/ext/gdk_pixbuf/gstgdkanimation.h index 183d335e..8dc0d4ef 100644 --- a/ext/gdk_pixbuf/gstgdkanimation.h +++ b/ext/gdk_pixbuf/gstgdkanimation.h @@ -27,20 +27,16 @@ #include G_BEGIN_DECLS - /* how many bytes we need to have available before we dare to start a new iteration */ #define GST_GDK_BUFFER_SIZE (102400) /* how far behind we need to be before we attempt to seek */ #define GST_GDK_MAX_DELAY_TO_SEEK (GST_SECOND / 4) - - #define GST_TYPE_GDK_ANIMATION (gst_gdk_animation_get_type()) #define GST_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_ANIMATION,GstGdkAnimation)) #define GST_GDK_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_ANIMATION,GstGdkAnimation)) #define GST_IS_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_ANIMATION)) #define GST_IS_GDK_ANIMATION_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_ANIMATION)) - -typedef struct _GstGdkAnimation GstGdkAnimation; +typedef struct _GstGdkAnimation GstGdkAnimation; typedef struct _GstGdkAnimationClass GstGdkAnimationClass; typedef struct _GstGdkAnimationIter GstGdkAnimationIter; @@ -48,34 +44,33 @@ typedef struct _GstGdkAnimationIterClass GstGdkAnimationIterClass; struct _GstGdkAnimation { - GdkPixbufAnimation parent; + GdkPixbufAnimation parent; /* name of temporary buffer file */ - gchar * temp_location; + gchar *temp_location; /* file descriptor to temporary file or 0 if we're done writing */ - int temp_fd; + int temp_fd; /* size of image */ - gint width; - gint height; - gint bpp; + gint width; + gint height; + gint bpp; /* static image we use */ - GdkPixbuf * pixbuf; + GdkPixbuf *pixbuf; }; -struct _GstGdkAnimationClass +struct _GstGdkAnimationClass { - GdkPixbufAnimationClass parent_class; + GdkPixbufAnimationClass parent_class; }; -GType gst_gdk_animation_get_type (void); +GType gst_gdk_animation_get_type (void); -GstGdkAnimation * gst_gdk_animation_new (GError **error); +GstGdkAnimation *gst_gdk_animation_new (GError ** error); -gboolean gst_gdk_animation_add_data (GstGdkAnimation * ani, - const guint8 * data, - guint size); -void gst_gdk_animation_done_adding (GstGdkAnimation * ani); +gboolean gst_gdk_animation_add_data (GstGdkAnimation * ani, + const guint8 * data, guint size); +void gst_gdk_animation_done_adding (GstGdkAnimation * ani); #define GST_TYPE_GDK_ANIMATION_ITER (gst_gdk_animation_iter_get_type ()) @@ -86,32 +81,35 @@ void gst_gdk_animation_done_adding (GstGdkAnimation * ani); #define GST_IS_GDK_ANIMATION_ITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GDK_ANIMATION_ITER)) #define GST_GDK_ANIMATION_ITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIterClass)) -struct _GstGdkAnimationIter { - GdkPixbufAnimationIter parent; - +struct _GstGdkAnimationIter +{ + GdkPixbufAnimationIter parent; + /* our animation */ - GstGdkAnimation * ani; + GstGdkAnimation *ani; /* start timeval */ - GTimeVal start; + GTimeVal start; /* timestamp of last buffer */ - GstClockTime last_timestamp; - + GstClockTime last_timestamp; + /* pipeline we're using */ - GstElement * pipeline; - gboolean eos; - gboolean just_seeked; - + GstElement *pipeline; + gboolean eos; + gboolean just_seeked; + /* current image and the buffers containing the data */ - GdkPixbuf * pixbuf; - GQueue * buffers; + GdkPixbuf *pixbuf; + GQueue *buffers; }; -struct _GstGdkAnimationIterClass { - GdkPixbufAnimationIterClass parent_class; +struct _GstGdkAnimationIterClass +{ + GdkPixbufAnimationIterClass parent_class; }; -GType gst_gdk_animation_iter_get_type (void) G_GNUC_CONST; +GType +gst_gdk_animation_iter_get_type (void) + G_GNUC_CONST; G_END_DECLS - #endif /* __GST_GDK_ANIMATION_H__ */ diff --git a/ext/gdk_pixbuf/gstgdkpixbuf.c b/ext/gdk_pixbuf/gstgdkpixbuf.c index 99d937bd..9691782d 100644 --- a/ext/gdk_pixbuf/gstgdkpixbuf.c +++ b/ext/gdk_pixbuf/gstgdkpixbuf.c @@ -41,78 +41,73 @@ static GstElementDetails plugin_details = { }; /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SILENT }; static GstStaticPadTemplate gst_gdk_pixbuf_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "image/png; " - "image/jpeg; " - "image/gif; " - "image/x-icon; " - "application/x-navi-animation; " - "image/x-cmu-raster; " - "image/x-sun-raster; " - "image/x-pixmap; " - "image/tiff; " - "image/x-portable-anymap; " - "image/x-portable-bitmap; " - "image/x-portable-graymap; " - "image/x-portable-pixmap; " - "image/bmp; " - "image/x-bmp; " - "image/x-MS-bmp; " - "image/vnd.wap.wbmp; " - "image/x-bitmap; " - "image/x-tga") -); + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/png; " + "image/jpeg; " + "image/gif; " + "image/x-icon; " + "application/x-navi-animation; " + "image/x-cmu-raster; " + "image/x-sun-raster; " + "image/x-pixmap; " + "image/tiff; " + "image/x-portable-anymap; " + "image/x-portable-bitmap; " + "image/x-portable-graymap; " + "image/x-portable-pixmap; " + "image/bmp; " + "image/x-bmp; " + "image/x-MS-bmp; " + "image/vnd.wap.wbmp; " "image/x-bitmap; " "image/x-tga") + ); static GstStaticPadTemplate gst_gdk_pixbuf_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) -); - -static void gst_gdk_pixbuf_base_init (gpointer g_class); -static void gst_gdk_pixbuf_class_init (GstGdkPixbufClass *klass); -static void gst_gdk_pixbuf_init (GstGdkPixbuf *filter); - -static void gst_gdk_pixbuf_set_property(GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_gdk_pixbuf_get_property(GObject *object, guint prop_id, - GValue *value, - GParamSpec *pspec); - -static void gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) + ); + +static void gst_gdk_pixbuf_base_init (gpointer g_class); +static void gst_gdk_pixbuf_class_init (GstGdkPixbufClass * klass); +static void gst_gdk_pixbuf_init (GstGdkPixbuf * filter); + +static void gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_gdk_pixbuf_chain (GstPad * pad, GstData * _data); + #ifdef enable_typefind -static void gst_gdk_pixbuf_type_find (GstTypeFind *tf, gpointer ignore); +static void gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore); #endif static GstElementClass *parent_class = NULL; static GstPadLinkReturn -gst_gdk_pixbuf_sink_link (GstPad *pad, const GstCaps *caps) +gst_gdk_pixbuf_sink_link (GstPad * pad, const GstCaps * caps) { GstGdkPixbuf *filter; filter = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); g_return_val_if_fail (filter != NULL, GST_PAD_LINK_REFUSED); - g_return_val_if_fail (GST_IS_GDK_PIXBUF (filter), - GST_PAD_LINK_REFUSED); + g_return_val_if_fail (GST_IS_GDK_PIXBUF (filter), GST_PAD_LINK_REFUSED); filter->framerate = 1.0; gst_structure_get_double (gst_caps_get_structure (caps, 0), "framerate", @@ -126,13 +121,15 @@ gst_gdk_pixbuf_sink_link (GstPad *pad, const GstCaps *caps) * These are just the formats that gdk-pixbuf is known to support. * But maybe not -- it may have been compiled without an external * library. */ -static GstCaps *gst_gdk_pixbuf_get_capslist(void) +static GstCaps * +gst_gdk_pixbuf_get_capslist (void) { - return gst_caps_copy (gst_static_caps_get ( - &gst_gdk_pixbuf_sink_template.static_caps)); + return gst_caps_copy (gst_static_caps_get (&gst_gdk_pixbuf_sink_template. + static_caps)); } #else -static GstCaps *gst_gdk_pixbuf_get_capslist(void) +static GstCaps * +gst_gdk_pixbuf_get_capslist (void) { GSList *slist; GSList *slist0; @@ -142,24 +139,24 @@ static GstCaps *gst_gdk_pixbuf_get_capslist(void) GstCaps *capslist = NULL; capslist = gst_caps_new_empty (); - slist0 = gdk_pixbuf_get_formats(); + slist0 = gdk_pixbuf_get_formats (); - for(slist = slist0;slist;slist=g_slist_next(slist)){ + for (slist = slist0; slist; slist = g_slist_next (slist)) { pixbuf_format = slist->data; - mimetypes = gdk_pixbuf_format_get_mime_types(pixbuf_format); - for(mimetype = mimetypes; *mimetype; mimetype++){ - gst_caps_append_structure (capslist, - gst_structure_new (*mimetype,NULL)); + mimetypes = gdk_pixbuf_format_get_mime_types (pixbuf_format); + for (mimetype = mimetypes; *mimetype; mimetype++) { + gst_caps_append_structure (capslist, gst_structure_new (*mimetype, NULL)); } - g_free(mimetypes); + g_free (mimetypes); } - g_slist_free(slist0); + g_slist_free (slist0); return capslist; } #endif -static GstCaps *gst_gdk_pixbuf_sink_getcaps(GstPad *pad) +static GstCaps * +gst_gdk_pixbuf_sink_getcaps (GstPad * pad) { GstGdkPixbuf *filter; @@ -167,7 +164,7 @@ static GstCaps *gst_gdk_pixbuf_sink_getcaps(GstPad *pad) g_return_val_if_fail (filter != NULL, NULL); g_return_val_if_fail (GST_IS_GDK_PIXBUF (filter), NULL); - return gst_gdk_pixbuf_get_capslist(); + return gst_gdk_pixbuf_get_capslist (); } GType @@ -175,10 +172,8 @@ gst_gdk_pixbuf_get_type (void) { static GType plugin_type = 0; - if (!plugin_type) - { - static const GTypeInfo plugin_info = - { + if (!plugin_type) { + static const GTypeInfo plugin_info = { sizeof (GstGdkPixbufClass), gst_gdk_pixbuf_base_init, NULL, @@ -190,8 +185,7 @@ gst_gdk_pixbuf_get_type (void) (GInstanceInitFunc) gst_gdk_pixbuf_init, }; plugin_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstGdkPixbuf", - &plugin_info, 0); + "GstGdkPixbuf", &plugin_info, 0); } return plugin_type; } @@ -202,42 +196,44 @@ gst_gdk_pixbuf_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( &gst_gdk_pixbuf_src_template)); + gst_static_pad_template_get (&gst_gdk_pixbuf_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get( &gst_gdk_pixbuf_sink_template)); + gst_static_pad_template_get (&gst_gdk_pixbuf_sink_template)); gst_element_class_set_details (element_class, &plugin_details); } /* initialize the plugin's class */ static void -gst_gdk_pixbuf_class_init (GstGdkPixbufClass *klass) +gst_gdk_pixbuf_class_init (GstGdkPixbufClass * 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); g_object_class_install_property (gobject_class, ARG_SILENT, - g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?", + FALSE, G_PARAM_READWRITE)); gobject_class->set_property = gst_gdk_pixbuf_set_property; gobject_class->get_property = gst_gdk_pixbuf_get_property; } static void -gst_gdk_pixbuf_init (GstGdkPixbuf *filter) +gst_gdk_pixbuf_init (GstGdkPixbuf * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get( &gst_gdk_pixbuf_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_gdk_pixbuf_sink_template), "sink"); gst_pad_set_link_function (filter->sinkpad, gst_gdk_pixbuf_sink_link); gst_pad_set_getcaps_function (filter->sinkpad, gst_gdk_pixbuf_sink_getcaps); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get( &gst_gdk_pixbuf_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_gdk_pixbuf_src_template), "src"); gst_pad_use_explicit_caps (filter->srcpad); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); @@ -248,7 +244,7 @@ gst_gdk_pixbuf_init (GstGdkPixbuf *filter) } static void -gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data) +gst_gdk_pixbuf_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstGdkPixbuf *filter; @@ -270,15 +266,15 @@ gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - push_buffer = TRUE; - got_eos = TRUE; - break; + push_buffer = TRUE; + got_eos = TRUE; + break; case GST_EVENT_DISCONTINUOUS: - dump_buffer = TRUE; - break; + dump_buffer = TRUE; + break; default: - gst_pad_event_default (pad, event); - return; + gst_pad_event_default (pad, event); + return; } } @@ -293,41 +289,41 @@ gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data) GError *error = NULL; if (!gdk_pixbuf_loader_close (filter->pixbuf_loader, &error)) { - GST_ELEMENT_ERROR (filter, LIBRARY, SHUTDOWN, (NULL), (error->message)); - g_error_free (error); - return; + GST_ELEMENT_ERROR (filter, LIBRARY, SHUTDOWN, (NULL), (error->message)); + g_error_free (error); + return; } pixbuf = gdk_pixbuf_loader_get_pixbuf (filter->pixbuf_loader); - if(filter->image_size == 0){ - GstCaps *caps; + if (filter->image_size == 0) { + GstCaps *caps; - filter->width = gdk_pixbuf_get_width(pixbuf); - filter->height = gdk_pixbuf_get_height(pixbuf); - filter->rowstride = gdk_pixbuf_get_rowstride(pixbuf); - filter->image_size = filter->rowstride * filter->height; + filter->width = gdk_pixbuf_get_width (pixbuf); + filter->height = gdk_pixbuf_get_height (pixbuf); + filter->rowstride = gdk_pixbuf_get_rowstride (pixbuf); + filter->image_size = filter->rowstride * filter->height; - caps = gst_caps_copy (gst_pad_get_pad_template_caps (filter->srcpad)); - gst_caps_set_simple (caps, - "width", G_TYPE_INT, filter->width, - "height", G_TYPE_INT, filter->height, - "framerate", G_TYPE_DOUBLE, filter->framerate, NULL); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (filter->srcpad)); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, filter->width, + "height", G_TYPE_INT, filter->height, + "framerate", G_TYPE_DOUBLE, filter->framerate, NULL); - gst_pad_set_explicit_caps (filter->srcpad, caps); + gst_pad_set_explicit_caps (filter->srcpad, caps); } outbuf = gst_pad_alloc_buffer (filter->srcpad, GST_BUFFER_OFFSET_NONE, - filter->image_size); - GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf); - GST_BUFFER_DURATION(outbuf) = GST_BUFFER_DURATION(buf); - - memcpy(GST_BUFFER_DATA(outbuf), gdk_pixbuf_get_pixels(pixbuf), - filter->image_size); + filter->image_size); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); + + memcpy (GST_BUFFER_DATA (outbuf), gdk_pixbuf_get_pixels (pixbuf), + filter->image_size); gst_pad_push (filter->srcpad, GST_DATA (outbuf)); - g_object_unref(G_OBJECT(filter->pixbuf_loader)); + g_object_unref (G_OBJECT (filter->pixbuf_loader)); filter->pixbuf_loader = NULL; dump_buffer = FALSE; } @@ -336,19 +332,19 @@ gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data) if (dump_buffer) { if (filter->pixbuf_loader != NULL) { gdk_pixbuf_loader_close (filter->pixbuf_loader, NULL); - g_object_unref(G_OBJECT(filter->pixbuf_loader)); + g_object_unref (G_OBJECT (filter->pixbuf_loader)); filter->pixbuf_loader = NULL; } } if (GST_IS_BUFFER (_data)) { if (filter->pixbuf_loader == NULL) { - filter->pixbuf_loader = gdk_pixbuf_loader_new(); + filter->pixbuf_loader = gdk_pixbuf_loader_new (); filter->last_timestamp = GST_BUFFER_TIMESTAMP (buf); } - - gdk_pixbuf_loader_write(filter->pixbuf_loader, GST_BUFFER_DATA(buf), - GST_BUFFER_SIZE(buf), &error); + + gdk_pixbuf_loader_write (filter->pixbuf_loader, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), &error); gst_buffer_unref (buf); } @@ -358,28 +354,27 @@ gst_gdk_pixbuf_chain (GstPad *pad, GstData *_data) } static void -gst_gdk_pixbuf_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstGdkPixbuf *filter; g_return_if_fail (GST_IS_GDK_PIXBUF (object)); filter = GST_GDK_PIXBUF (object); - switch (prop_id) - { - case ARG_SILENT: - //filter->silent = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + switch (prop_id) { + case ARG_SILENT: + //filter->silent = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } static void -gst_gdk_pixbuf_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstGdkPixbuf *filter; @@ -387,12 +382,12 @@ gst_gdk_pixbuf_get_property (GObject *object, guint prop_id, filter = GST_GDK_PIXBUF (object); switch (prop_id) { - case ARG_SILENT: - //g_value_set_boolean (value, filter->silent); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + case ARG_SILENT: + //g_value_set_boolean (value, filter->silent); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } @@ -400,22 +395,23 @@ gst_gdk_pixbuf_get_property (GObject *object, guint prop_id, #ifdef enable_typefind static void -gst_gdk_pixbuf_type_find (GstTypeFind *tf, gpointer ignore) +gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore) { guint8 *data; GdkPixbufLoader *pixbuf_loader; GdkPixbufFormat *format; data = gst_type_find_peek (tf, 0, GST_GDK_PIXBUF_TYPE_FIND_SIZE); - if (data == NULL) return; + if (data == NULL) + return; GST_DEBUG ("creating new loader"); - pixbuf_loader = gdk_pixbuf_loader_new(); - + pixbuf_loader = gdk_pixbuf_loader_new (); + gdk_pixbuf_loader_write (pixbuf_loader, data, GST_GDK_PIXBUF_TYPE_FIND_SIZE, NULL); - + format = gdk_pixbuf_loader_get_format (pixbuf_loader); if (format != NULL) { @@ -423,8 +419,7 @@ gst_gdk_pixbuf_type_find (GstTypeFind *tf, gpointer ignore) gchar **p; gchar **mlist = gdk_pixbuf_format_get_mime_types (format); - for (p = mlist; *p; ++p) - { + for (p = mlist; *p; ++p) { GST_DEBUG ("suggesting mime type %s", *p); caps = gst_caps_new_simple (*p, NULL); gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, caps); @@ -449,17 +444,18 @@ gst_gdk_pixbuf_type_find (GstTypeFind *tf, gpointer ignore) * register the features */ static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - GST_DEBUG_CATEGORY_INIT (gst_gdk_pixbuf_debug, "gdkpixbuf", 0, "gdk pixbuf loader"); + GST_DEBUG_CATEGORY_INIT (gst_gdk_pixbuf_debug, "gdkpixbuf", 0, + "gdk pixbuf loader"); - if (!gst_element_register (plugin, "gdkpixbufdec", GST_RANK_NONE, GST_TYPE_GDK_PIXBUF)) + if (!gst_element_register (plugin, "gdkpixbufdec", GST_RANK_NONE, + GST_TYPE_GDK_PIXBUF)) return FALSE; #ifdef enable_typefind gst_type_find_register (plugin, "image/*", GST_RANK_MARGINAL, - gst_gdk_pixbuf_type_find, NULL, - GST_CAPS_ANY, NULL); + gst_gdk_pixbuf_type_find, NULL, GST_CAPS_ANY, NULL); #endif /* plugin initialisation succeeded */ @@ -468,13 +464,7 @@ plugin_init (GstPlugin *plugin) /* this is the structure that gst-register looks for * so keep the name plugin_desc, or you cannot get your plug-in registered */ -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gdkpixbuf", - "GDK Pixbuf decoder", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gdkpixbuf", + "GDK Pixbuf decoder", plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/gdk_pixbuf/gstgdkpixbuf.h b/ext/gdk_pixbuf/gstgdkpixbuf.h index 62e11aac..f239bf72 100644 --- a/ext/gdk_pixbuf/gstgdkpixbuf.h +++ b/ext/gdk_pixbuf/gstgdkpixbuf.h @@ -26,7 +26,6 @@ #include G_BEGIN_DECLS - /* #define's don't like whitespacey bits */ #define GST_TYPE_GDK_PIXBUF \ (gst_gdk_pixbuf_get_type()) @@ -38,8 +37,7 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF)) #define GST_IS_GDK_PIXBUF_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF)) - -typedef struct _GstGdkPixbuf GstGdkPixbuf; +typedef struct _GstGdkPixbuf GstGdkPixbuf; typedef struct _GstGdkPixbufClass GstGdkPixbufClass; struct _GstGdkPixbuf @@ -48,7 +46,7 @@ struct _GstGdkPixbuf GstPad *sinkpad, *srcpad; - GstClockTime last_timestamp; + GstClockTime last_timestamp; GdkPixbufLoader *pixbuf_loader; int width; @@ -59,7 +57,7 @@ struct _GstGdkPixbuf double framerate; }; -struct _GstGdkPixbufClass +struct _GstGdkPixbufClass { GstElementClass parent_class; }; @@ -67,5 +65,4 @@ struct _GstGdkPixbufClass GType gst_gdk_pixbuf_get_type (void); G_END_DECLS - #endif /* __GST_GDK_PIXBUF_H__ */ diff --git a/ext/jpeg/gstjpeg.c b/ext/jpeg/gstjpeg.c index 1a78b222..add7435e 100644 --- a/ext/jpeg/gstjpeg.c +++ b/ext/jpeg/gstjpeg.c @@ -24,24 +24,21 @@ #include "gstjpegenc.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "jpegenc", GST_RANK_NONE, GST_TYPE_JPEGENC)) + if (!gst_element_register (plugin, "jpegenc", GST_RANK_NONE, + GST_TYPE_JPEGENC)) return FALSE; - - if (!gst_element_register (plugin, "jpegdec", GST_RANK_PRIMARY, GST_TYPE_JPEGDEC)) + + if (!gst_element_register (plugin, "jpegdec", GST_RANK_PRIMARY, + GST_TYPE_JPEGDEC)) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "jpeg", - "JPeg plugin library", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "jpeg", + "JPeg plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c index 0a1bb60d..10156559 100644 --- a/ext/jpeg/gstjpegdec.c +++ b/ext/jpeg/gstjpegdec.c @@ -36,73 +36,74 @@ GstElementDetails gst_jpegdec_details = { }; /* JpegDec signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_jpegdec_base_init (gpointer g_class); -static void gst_jpegdec_class_init (GstJpegDec *klass); -static void gst_jpegdec_init (GstJpegDec *jpegdec); +static void gst_jpegdec_base_init (gpointer g_class); +static void gst_jpegdec_class_init (GstJpegDec * klass); +static void gst_jpegdec_init (GstJpegDec * jpegdec); -static void gst_jpegdec_chain (GstPad *pad, GstData *_data); -static GstPadLinkReturn - gst_jpegdec_link (GstPad *pad, const GstCaps *caps); +static void gst_jpegdec_chain (GstPad * pad, GstData * _data); +static GstPadLinkReturn gst_jpegdec_link (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_jpegdec_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_jpegdec_get_type(void) { +gst_jpegdec_get_type (void) +{ static GType jpegdec_type = 0; - + if (!jpegdec_type) { static const GTypeInfo jpegdec_info = { - sizeof(GstJpegDec), + sizeof (GstJpegDec), gst_jpegdec_base_init, NULL, - (GClassInitFunc)gst_jpegdec_class_init, + (GClassInitFunc) gst_jpegdec_class_init, NULL, NULL, - sizeof(GstJpegDec), + sizeof (GstJpegDec), 0, - (GInstanceInitFunc)gst_jpegdec_init, + (GInstanceInitFunc) gst_jpegdec_init, }; - jpegdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstJpegDec", &jpegdec_info, 0); + jpegdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstJpegDec", &jpegdec_info, + 0); } return jpegdec_type; } static GstStaticPadTemplate gst_jpegdec_src_pad_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate gst_jpegdec_sink_pad_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "framerate = (double) [ 1, MAX ]" - ) -); + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (double) [ 1, MAX ]") + ); static void gst_jpegdec_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 (&gst_jpegdec_src_pad_template)); gst_element_class_add_pad_template (element_class, @@ -111,13 +112,13 @@ gst_jpegdec_base_init (gpointer g_class) } static void -gst_jpegdec_class_init (GstJpegDec *klass) +gst_jpegdec_class_init (GstJpegDec * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*)klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } static void @@ -125,6 +126,7 @@ gst_jpegdec_init_source (j_decompress_ptr cinfo) { GST_DEBUG ("gst_jpegdec_chain: init_source"); } + static gboolean gst_jpegdec_fill_input_buffer (j_decompress_ptr cinfo) { @@ -152,21 +154,23 @@ gst_jpegdec_term_source (j_decompress_ptr cinfo) } static void -gst_jpegdec_init (GstJpegDec *jpegdec) +gst_jpegdec_init (GstJpegDec * jpegdec) { GST_DEBUG ("gst_jpegdec_init: initializing"); /* create the sink and src pads */ - jpegdec->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_jpegdec_sink_pad_template), "sink"); - gst_element_add_pad(GST_ELEMENT(jpegdec),jpegdec->sinkpad); - gst_pad_set_chain_function(jpegdec->sinkpad,gst_jpegdec_chain); - gst_pad_set_link_function(jpegdec->sinkpad, gst_jpegdec_link); + jpegdec->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_jpegdec_sink_pad_template), "sink"); + gst_element_add_pad (GST_ELEMENT (jpegdec), jpegdec->sinkpad); + gst_pad_set_chain_function (jpegdec->sinkpad, gst_jpegdec_chain); + gst_pad_set_link_function (jpegdec->sinkpad, gst_jpegdec_link); - jpegdec->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_jpegdec_src_pad_template), "src"); + jpegdec->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_jpegdec_src_pad_template), "src"); gst_pad_use_explicit_caps (jpegdec->srcpad); - gst_element_add_pad(GST_ELEMENT(jpegdec),jpegdec->srcpad); + gst_element_add_pad (GST_ELEMENT (jpegdec), jpegdec->srcpad); /* initialize the jpegdec decoder state */ jpegdec->next_time = 0; @@ -181,10 +185,10 @@ gst_jpegdec_init (GstJpegDec *jpegdec) jpegdec->line[2] = NULL; /* setup jpeglib */ - memset(&jpegdec->cinfo, 0, sizeof(jpegdec->cinfo)); - memset(&jpegdec->jerr, 0, sizeof(jpegdec->jerr)); - jpegdec->cinfo.err = jpeg_std_error(&jpegdec->jerr); - jpeg_create_decompress(&jpegdec->cinfo); + memset (&jpegdec->cinfo, 0, sizeof (jpegdec->cinfo)); + memset (&jpegdec->jerr, 0, sizeof (jpegdec->jerr)); + jpegdec->cinfo.err = jpeg_std_error (&jpegdec->jerr); + jpeg_create_decompress (&jpegdec->cinfo); jpegdec->jsrc.init_source = gst_jpegdec_init_source; jpegdec->jsrc.fill_input_buffer = gst_jpegdec_fill_input_buffer; @@ -196,7 +200,7 @@ gst_jpegdec_init (GstJpegDec *jpegdec) } static GstPadLinkReturn -gst_jpegdec_link (GstPad *pad, const GstCaps *caps) +gst_jpegdec_link (GstPad * pad, const GstCaps * caps) { GstJpegDec *jpegdec = GST_JPEGDEC (gst_pad_get_parent (pad)); GstStructure *structure; @@ -205,15 +209,14 @@ gst_jpegdec_link (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); gst_structure_get_double (structure, "framerate", &jpegdec->fps); - gst_structure_get_int (structure, "width", &jpegdec->width); - gst_structure_get_int (structure, "height", &jpegdec->height); + gst_structure_get_int (structure, "width", &jpegdec->width); + gst_structure_get_int (structure, "height", &jpegdec->height); srccaps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I','4','2','0'), - "width", G_TYPE_INT, jpegdec->width, - "height", G_TYPE_INT, jpegdec->height, - "framerate", G_TYPE_DOUBLE, jpegdec->fps, - NULL); + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "width", G_TYPE_INT, jpegdec->width, + "height", G_TYPE_INT, jpegdec->height, + "framerate", G_TYPE_DOUBLE, jpegdec->fps, NULL); /* at this point, we're pretty sure that this will be the output * format, so we'll set it. */ @@ -223,18 +226,18 @@ gst_jpegdec_link (GstPad *pad, const GstCaps *caps) } /* shamelessly ripped from jpegutils.c in mjpegtools */ -static void add_huff_table (j_decompress_ptr dinfo, - JHUFF_TBL **htblptr, - const UINT8 *bits, const UINT8 *val) +static void +add_huff_table (j_decompress_ptr dinfo, + JHUFF_TBL ** htblptr, const UINT8 * bits, const UINT8 * val) /* Define a Huffman table */ { int nsymbols, len; if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) dinfo); + *htblptr = jpeg_alloc_huff_table ((j_common_ptr) dinfo); /* Copy the number-of-symbols-of-each-code-length counts */ - memcpy((*htblptr)->bits, bits, sizeof((*htblptr)->bits)); + memcpy ((*htblptr)->bits, bits, sizeof ((*htblptr)->bits)); /* Validate the counts. We do this here mainly so we can copy the right * number of symbols from the val[] array, without risking marching off @@ -244,119 +247,123 @@ static void add_huff_table (j_decompress_ptr dinfo, for (len = 1; len <= 16; len++) nsymbols += bits[len]; if (nsymbols < 1 || nsymbols > 256) - g_error("jpegutils.c: add_huff_table failed badly. "); + g_error ("jpegutils.c: add_huff_table failed badly. "); - memcpy((*htblptr)->huffval, val, nsymbols * sizeof(UINT8)); + memcpy ((*htblptr)->huffval, val, nsymbols * sizeof (UINT8)); } -static void std_huff_tables (j_decompress_ptr dinfo) +static void +std_huff_tables (j_decompress_ptr dinfo) /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ /* IMPORTANT: these are only valid for 8-bit data precision! */ { static const UINT8 bits_dc_luminance[17] = - { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_luminance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + static const UINT8 bits_dc_chrominance[17] = - { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_chrominance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + static const UINT8 bits_ac_luminance[17] = - { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; static const UINT8 val_ac_luminance[] = - { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, - 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, - 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, - 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, - 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa + }; + static const UINT8 bits_ac_chrominance[17] = - { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; static const UINT8 val_ac_chrominance[] = - { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, - 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, - 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, - 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, - 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, - 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, - 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, - 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, - 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, - 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, - 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, - 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - - add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[0], - bits_dc_luminance, val_dc_luminance); - add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[0], - bits_ac_luminance, val_ac_luminance); - add_huff_table(dinfo, &dinfo->dc_huff_tbl_ptrs[1], - bits_dc_chrominance, val_dc_chrominance); - add_huff_table(dinfo, &dinfo->ac_huff_tbl_ptrs[1], - bits_ac_chrominance, val_ac_chrominance); + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa + }; + + add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, val_dc_luminance); + add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, val_ac_luminance); + add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, val_dc_chrominance); + add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, val_ac_chrominance); } -static void guarantee_huff_tables(j_decompress_ptr dinfo) +static void +guarantee_huff_tables (j_decompress_ptr dinfo) { - if ( (dinfo->dc_huff_tbl_ptrs[0] == NULL) && - (dinfo->dc_huff_tbl_ptrs[1] == NULL) && - (dinfo->ac_huff_tbl_ptrs[0] == NULL) && - (dinfo->ac_huff_tbl_ptrs[1] == NULL) ) { - GST_DEBUG ( - "Generating standard Huffman tables for this frame."); - std_huff_tables(dinfo); + if ((dinfo->dc_huff_tbl_ptrs[0] == NULL) && + (dinfo->dc_huff_tbl_ptrs[1] == NULL) && + (dinfo->ac_huff_tbl_ptrs[0] == NULL) && + (dinfo->ac_huff_tbl_ptrs[1] == NULL)) { + GST_DEBUG ("Generating standard Huffman tables for this frame."); + std_huff_tables (dinfo); } } static void -gst_jpegdec_chain (GstPad *pad, GstData *_data) +gst_jpegdec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstJpegDec *jpegdec; guchar *data, *outdata; gulong size, outsize; GstBuffer *outbuf; - /*GstMeta *meta;*/ + + /*GstMeta *meta; */ gint width, height, width2; guchar *base[3]; - gint i,j, k; + gint i, j, k; gint r_h, r_v; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); - /*g_return_if_fail(GST_IS_BUFFER(buf));*/ + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); + /*g_return_if_fail(GST_IS_BUFFER(buf)); */ jpegdec = GST_JPEGDEC (GST_OBJECT_PARENT (pad)); @@ -365,24 +372,24 @@ gst_jpegdec_chain (GstPad *pad, GstData *_data) return; } - data = (guchar *)GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); - GST_DEBUG ("gst_jpegdec_chain: got buffer of %ld bytes in '%s'",size, - GST_OBJECT_NAME (jpegdec)); + data = (guchar *) GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + GST_DEBUG ("gst_jpegdec_chain: got buffer of %ld bytes in '%s'", size, + GST_OBJECT_NAME (jpegdec)); jpegdec->jsrc.next_input_byte = data; jpegdec->jsrc.bytes_in_buffer = size; - - GST_DEBUG ("gst_jpegdec_chain: reading header %08lx", *(gulong *)data); - jpeg_read_header(&jpegdec->cinfo, TRUE); + + GST_DEBUG ("gst_jpegdec_chain: reading header %08lx", *(gulong *) data); + jpeg_read_header (&jpegdec->cinfo, TRUE); r_h = jpegdec->cinfo.cur_comp_info[0]->h_samp_factor; r_v = jpegdec->cinfo.cur_comp_info[0]->v_samp_factor; - /*g_print ("%d %d\n", r_h, r_v);*/ - /*g_print ("%d %d\n", jpegdec->cinfo.cur_comp_info[1]->h_samp_factor, jpegdec->cinfo.cur_comp_info[1]->v_samp_factor);*/ - /*g_print ("%d %d\n", jpegdec->cinfo.cur_comp_info[2]->h_samp_factor, jpegdec->cinfo.cur_comp_info[2]->v_samp_factor);*/ + /*g_print ("%d %d\n", r_h, r_v); */ + /*g_print ("%d %d\n", jpegdec->cinfo.cur_comp_info[1]->h_samp_factor, jpegdec->cinfo.cur_comp_info[1]->v_samp_factor); */ + /*g_print ("%d %d\n", jpegdec->cinfo.cur_comp_info[2]->h_samp_factor, jpegdec->cinfo.cur_comp_info[2]->v_samp_factor); */ jpegdec->cinfo.do_fancy_upsampling = FALSE; jpegdec->cinfo.do_block_smoothing = FALSE; @@ -390,66 +397,67 @@ gst_jpegdec_chain (GstPad *pad, GstData *_data) jpegdec->cinfo.dct_method = JDCT_IFAST; jpegdec->cinfo.raw_data_out = TRUE; GST_DEBUG ("gst_jpegdec_chain: starting decompress"); - guarantee_huff_tables(&jpegdec->cinfo); - jpeg_start_decompress(&jpegdec->cinfo); + guarantee_huff_tables (&jpegdec->cinfo); + jpeg_start_decompress (&jpegdec->cinfo); width = jpegdec->cinfo.output_width; height = jpegdec->cinfo.output_height; GST_DEBUG ("gst_jpegdec_chain: width %d, height %d", width, height); - outbuf = gst_buffer_new(); - outsize = GST_BUFFER_SIZE(outbuf) = width*height + - width*height / 2; - outdata = GST_BUFFER_DATA(outbuf) = g_malloc(outsize); - GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf); + outbuf = gst_buffer_new (); + outsize = GST_BUFFER_SIZE (outbuf) = width * height + width * height / 2; + outdata = GST_BUFFER_DATA (outbuf) = g_malloc (outsize); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); if (jpegdec->height != height || jpegdec->line[0] == NULL) { GstCaps *caps; - jpegdec->line[0] = g_realloc(jpegdec->line[0], height*sizeof(char*)); - jpegdec->line[1] = g_realloc(jpegdec->line[1], height*sizeof(char*)); - jpegdec->line[2] = g_realloc(jpegdec->line[2], height*sizeof(char*)); + jpegdec->line[0] = g_realloc (jpegdec->line[0], height * sizeof (char *)); + jpegdec->line[1] = g_realloc (jpegdec->line[1], height * sizeof (char *)); + jpegdec->line[2] = g_realloc (jpegdec->line[2], height * sizeof (char *)); jpegdec->height = height; caps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I','4','2','0'), - "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, - "framerate", G_TYPE_DOUBLE, jpegdec->fps, - NULL); + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", G_TYPE_DOUBLE, jpegdec->fps, NULL); gst_pad_set_explicit_caps (jpegdec->srcpad, caps); gst_caps_free (caps); } /* mind the swap, jpeglib outputs blue chroma first */ base[0] = outdata; - base[1] = base[0]+width*height; - base[2] = base[1]+width*height/4; + base[1] = base[0] + width * height; + base[2] = base[1] + width * height / 4; width2 = width >> 1; - GST_DEBUG ("gst_jpegdec_chain: decompressing %u", jpegdec->cinfo.rec_outbuf_height); - for (i = 0; i < height; i += r_v*DCTSIZE) { - for (j=0, k=0; j< (r_v*DCTSIZE); j += r_v, k++) { - jpegdec->line[0][j] = base[0]; base[0] += width; + GST_DEBUG ("gst_jpegdec_chain: decompressing %u", + jpegdec->cinfo.rec_outbuf_height); + for (i = 0; i < height; i += r_v * DCTSIZE) { + for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) { + jpegdec->line[0][j] = base[0]; + base[0] += width; if (r_v == 2) { - jpegdec->line[0][j+1] = base[0]; base[0] += width; + jpegdec->line[0][j + 1] = base[0]; + base[0] += width; } - jpegdec->line[1][k] = base[1]; - jpegdec->line[2][k] = base[2]; - if (r_v == 2 || k&1) { - base[1] += width2; base[2] += width2; + jpegdec->line[1][k] = base[1]; + jpegdec->line[2][k] = base[2]; + if (r_v == 2 || k & 1) { + base[1] += width2; + base[2] += width2; } } - /*g_print ("%d\n", jpegdec->cinfo.output_scanline);*/ - jpeg_read_raw_data(&jpegdec->cinfo, jpegdec->line, r_v*DCTSIZE); + /*g_print ("%d\n", jpegdec->cinfo.output_scanline); */ + jpeg_read_raw_data (&jpegdec->cinfo, jpegdec->line, r_v * DCTSIZE); } GST_DEBUG ("gst_jpegdec_chain: decompressing finished"); - jpeg_finish_decompress(&jpegdec->cinfo); + jpeg_finish_decompress (&jpegdec->cinfo); GST_DEBUG ("gst_jpegdec_chain: sending buffer"); - gst_pad_push(jpegdec->srcpad, GST_DATA (outbuf)); + gst_pad_push (jpegdec->srcpad, GST_DATA (outbuf)); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } - diff --git a/ext/jpeg/gstjpegdec.h b/ext/jpeg/gstjpegdec.h index 05187873..9a864eba 100644 --- a/ext/jpeg/gstjpegdec.h +++ b/ext/jpeg/gstjpegdec.h @@ -30,8 +30,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_JPEGDEC \ @@ -45,46 +46,48 @@ extern "C" { #define GST_IS_JPEGDEC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEGDEC)) -typedef struct _GstJpegDec GstJpegDec; -typedef struct _GstJpegDecClass GstJpegDecClass; + typedef struct _GstJpegDec GstJpegDec; + typedef struct _GstJpegDecClass GstJpegDecClass; -struct _GstJpegDec { - GstElement element; + struct _GstJpegDec + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - int parse_state; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; + int parse_state; + /* the timestamp of the next frame */ + guint64 next_time; + /* the interval between frames */ + guint64 time_interval; - /* video state */ - gint format; - gint width; - gint height; - gdouble fps; - /* the size of the output buffer */ - gint outsize; - /* the jpeg line buffer */ - guchar **line[3]; + /* video state */ + gint format; + gint width; + gint height; + gdouble fps; + /* the size of the output buffer */ + gint outsize; + /* the jpeg line buffer */ + guchar **line[3]; - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - struct jpeg_source_mgr jsrc; -}; + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_source_mgr jsrc; + }; -struct _GstJpegDecClass { - GstElementClass parent_class; -}; + struct _GstJpegDecClass + { + GstElementClass parent_class; + }; -GType gst_jpegdec_get_type(void); + GType gst_jpegdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_JPEGDEC_H__ */ +#endif /* __GST_JPEGDEC_H__ */ diff --git a/ext/jpeg/gstjpegenc.c b/ext/jpeg/gstjpegenc.c index 7f43ea97..44941719 100644 --- a/ext/jpeg/gstjpegenc.c +++ b/ext/jpeg/gstjpegenc.c @@ -35,30 +35,34 @@ GstElementDetails gst_jpegenc_details = { }; /* JpegEnc signals and args */ -enum { +enum +{ FRAME_ENCODED, /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_QUALITY, ARG_SMOOTHING, /* FILL ME */ }; -static void gst_jpegenc_base_init (gpointer g_class); -static void gst_jpegenc_class_init (GstJpegEnc *klass); -static void gst_jpegenc_init (GstJpegEnc *jpegenc); +static void gst_jpegenc_base_init (gpointer g_class); +static void gst_jpegenc_class_init (GstJpegEnc * klass); +static void gst_jpegenc_init (GstJpegEnc * jpegenc); -static void gst_jpegenc_chain (GstPad *pad, GstData *_data); -static GstPadLinkReturn gst_jpegenc_link (GstPad *pad, const GstCaps *caps); -static GstCaps * gst_jpegenc_getcaps (GstPad *pad); +static void gst_jpegenc_chain (GstPad * pad, GstData * _data); +static GstPadLinkReturn gst_jpegenc_link (GstPad * pad, const GstCaps * caps); +static GstCaps *gst_jpegenc_getcaps (GstPad * pad); -static void gst_jpegenc_resync (GstJpegEnc *jpegenc); -static void gst_jpegenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_jpegenc_resync (GstJpegEnc * jpegenc); +static void gst_jpegenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_jpegenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; static guint gst_jpegenc_signals[LAST_SIGNAL] = { 0 }; @@ -70,46 +74,44 @@ gst_jpegenc_get_type (void) if (!jpegenc_type) { static const GTypeInfo jpegenc_info = { - sizeof(GstJpegEnc), + sizeof (GstJpegEnc), gst_jpegenc_base_init, NULL, - (GClassInitFunc)gst_jpegenc_class_init, + (GClassInitFunc) gst_jpegenc_class_init, NULL, NULL, - sizeof(GstJpegEnc), + sizeof (GstJpegEnc), 0, - (GInstanceInitFunc)gst_jpegenc_init, + (GInstanceInitFunc) gst_jpegenc_init, }; - jpegenc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstJpegEnc", &jpegenc_info, 0); + jpegenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstJpegEnc", &jpegenc_info, + 0); } return jpegenc_type; } static GstStaticPadTemplate gst_jpegenc_sink_pad_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate gst_jpegenc_src_pad_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "framerate = (double) [ 1, MAX ]" - ) -); + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (double) [ 1, MAX ]") + ); static void gst_jpegenc_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 (&gst_jpegenc_sink_pad_template)); gst_element_class_add_pad_template (element_class, @@ -118,29 +120,29 @@ gst_jpegenc_base_init (gpointer g_class) } static void -gst_jpegenc_class_init (GstJpegEnc *klass) +gst_jpegenc_class_init (GstJpegEnc * 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); gst_jpegenc_signals[FRAME_ENCODED] = - g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstJpegEncClass, frame_encoded), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstJpegEncClass, frame_encoded), NULL, + NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_object_class_install_property (gobject_class, ARG_QUALITY, g_param_spec_int ("quality", "Quality", "Quality of encoding", - 0, 100, 85, G_PARAM_READWRITE)); + 0, 100, 85, G_PARAM_READWRITE)); #if 0 /* disabled, since it doesn't seem to work */ g_object_class_install_property (gobject_class, ARG_SMOOTHING, g_param_spec_int ("smoothing", "Smoothing", "Smoothing factor", - 0, 100, 0, G_PARAM_READWRITE)); + 0, 100, 0, G_PARAM_READWRITE)); #endif gobject_class->set_property = gst_jpegenc_set_property; @@ -160,44 +162,47 @@ gst_jpegenc_flush_destination (j_compress_ptr cinfo) return TRUE; } -static void gst_jpegenc_term_destination (j_compress_ptr cinfo) +static void +gst_jpegenc_term_destination (j_compress_ptr cinfo) { GST_DEBUG ("gst_jpegenc_chain: term_source"); } static void -gst_jpegenc_init (GstJpegEnc *jpegenc) +gst_jpegenc_init (GstJpegEnc * jpegenc) { /* create the sink and src pads */ - jpegenc->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_jpegenc_sink_pad_template), "sink"); - gst_pad_set_chain_function(jpegenc->sinkpad,gst_jpegenc_chain); - gst_pad_set_getcaps_function(jpegenc->sinkpad, gst_jpegenc_getcaps); - gst_pad_set_link_function(jpegenc->sinkpad, gst_jpegenc_link); - gst_element_add_pad(GST_ELEMENT(jpegenc),jpegenc->sinkpad); - - jpegenc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_jpegenc_src_pad_template), "src"); - gst_pad_set_getcaps_function(jpegenc->sinkpad, gst_jpegenc_getcaps); - gst_pad_set_link_function(jpegenc->sinkpad, gst_jpegenc_link); - gst_element_add_pad(GST_ELEMENT(jpegenc),jpegenc->srcpad); + jpegenc->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_jpegenc_sink_pad_template), "sink"); + gst_pad_set_chain_function (jpegenc->sinkpad, gst_jpegenc_chain); + gst_pad_set_getcaps_function (jpegenc->sinkpad, gst_jpegenc_getcaps); + gst_pad_set_link_function (jpegenc->sinkpad, gst_jpegenc_link); + gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->sinkpad); + + jpegenc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_jpegenc_src_pad_template), "src"); + gst_pad_set_getcaps_function (jpegenc->sinkpad, gst_jpegenc_getcaps); + gst_pad_set_link_function (jpegenc->sinkpad, gst_jpegenc_link); + gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->srcpad); /* reset the initial video state */ jpegenc->width = -1; jpegenc->height = -1; /* setup jpeglib */ - memset(&jpegenc->cinfo, 0, sizeof(jpegenc->cinfo)); - memset(&jpegenc->jerr, 0, sizeof(jpegenc->jerr)); - jpegenc->cinfo.err = jpeg_std_error(&jpegenc->jerr); - jpeg_create_compress(&jpegenc->cinfo); + memset (&jpegenc->cinfo, 0, sizeof (jpegenc->cinfo)); + memset (&jpegenc->jerr, 0, sizeof (jpegenc->jerr)); + jpegenc->cinfo.err = jpeg_std_error (&jpegenc->jerr); + jpeg_create_compress (&jpegenc->cinfo); GST_DEBUG ("gst_jpegenc_init: setting line buffers"); jpegenc->line[0] = NULL; jpegenc->line[1] = NULL; jpegenc->line[2] = NULL; - gst_jpegenc_resync(jpegenc); + gst_jpegenc_resync (jpegenc); jpegenc->jdest.init_destination = gst_jpegenc_init_destination; jpegenc->jdest.empty_output_buffer = gst_jpegenc_flush_destination; @@ -209,7 +214,7 @@ gst_jpegenc_init (GstJpegEnc *jpegenc) } static GstCaps * -gst_jpegenc_getcaps (GstPad *pad) +gst_jpegenc_getcaps (GstPad * pad) { GstJpegEnc *jpegenc = GST_JPEGENC (gst_pad_get_parent (pad)); GstPad *otherpad; @@ -225,7 +230,7 @@ gst_jpegenc_getcaps (GstPad *pad) } else { name = "video/x-raw-yuv"; } - for (i=0;ifps); - gst_structure_get_int (structure, "width", &jpegenc->width); - gst_structure_get_int (structure, "height", &jpegenc->height); - + gst_structure_get_int (structure, "width", &jpegenc->width); + gst_structure_get_int (structure, "height", &jpegenc->height); + othercaps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); gst_caps_set_simple (othercaps, - "width", G_TYPE_INT, jpegenc->width, - "height", G_TYPE_INT, jpegenc->height, - "framerate", G_TYPE_DOUBLE, jpegenc->fps, - NULL); + "width", G_TYPE_INT, jpegenc->width, + "height", G_TYPE_INT, jpegenc->height, + "framerate", G_TYPE_DOUBLE, jpegenc->fps, NULL); ret = gst_pad_try_set_caps (jpegenc->srcpad, othercaps); - gst_caps_free(othercaps); + gst_caps_free (othercaps); if (GST_PAD_LINK_SUCCESSFUL (ret)) { gst_jpegenc_resync (jpegenc); @@ -269,7 +273,7 @@ gst_jpegenc_link (GstPad *pad, const GstCaps *caps) } static void -gst_jpegenc_resync (GstJpegEnc *jpegenc) +gst_jpegenc_resync (GstJpegEnc * jpegenc) { guint size = 0; gint width, height; @@ -282,11 +286,11 @@ gst_jpegenc_resync (GstJpegEnc *jpegenc) GST_DEBUG ("gst_jpegenc_resync: wdith %d, height %d", width, height); - jpeg_set_defaults(&jpegenc->cinfo); + jpeg_set_defaults (&jpegenc->cinfo); jpegenc->cinfo.dct_method = JDCT_FASTEST; - /*jpegenc->cinfo.dct_method = JDCT_DEFAULT;*/ + /*jpegenc->cinfo.dct_method = JDCT_DEFAULT; */ /*jpegenc->cinfo.smoothing_factor = jpegenc->smoothing; */ - jpeg_set_quality(&jpegenc->cinfo, jpegenc->quality, TRUE); + jpeg_set_quality (&jpegenc->cinfo, jpegenc->quality, TRUE); #if 0 switch (jpegenc->format) { @@ -310,24 +314,27 @@ gst_jpegenc_resync (GstJpegEnc *jpegenc) jpegenc->cinfo.comp_info[2].v_samp_factor = 1; if (height != -1) { - jpegenc->line[0] = g_realloc(jpegenc->line[0], height*sizeof(char*)); - jpegenc->line[1] = g_realloc(jpegenc->line[1], height*sizeof(char*)/2); - jpegenc->line[2] = g_realloc(jpegenc->line[2], height*sizeof(char*)/2); + jpegenc->line[0] = + g_realloc (jpegenc->line[0], height * sizeof (char *)); + jpegenc->line[1] = + g_realloc (jpegenc->line[1], height * sizeof (char *) / 2); + jpegenc->line[2] = + g_realloc (jpegenc->line[2], height * sizeof (char *) / 2); } GST_DEBUG ("gst_jpegenc_resync: setting format done"); #if 0 break; default: - printf("gst_jpegenc_resync: unsupported colorspace, using RGB\n"); + printf ("gst_jpegenc_resync: unsupported colorspace, using RGB\n"); size = 3; jpegenc->cinfo.in_color_space = JCS_RGB; break; } #endif - jpegenc->bufsize = jpegenc->width*jpegenc->height*size; + jpegenc->bufsize = jpegenc->width * jpegenc->height * size; - jpeg_suppress_tables(&jpegenc->cinfo, TRUE); + jpeg_suppress_tables (&jpegenc->cinfo, TRUE); //jpeg_suppress_tables(&jpegenc->cinfo, FALSE); jpegenc->buffer = NULL; @@ -335,17 +342,18 @@ gst_jpegenc_resync (GstJpegEnc *jpegenc) } static void -gst_jpegenc_chain (GstPad *pad, GstData *_data) +gst_jpegenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstJpegEnc *jpegenc; guchar *data, *outdata; gulong size, outsize; GstBuffer *outbuf; + /* GstMeta *meta; */ guint height, width, width2; guchar *base[3]; - gint i,j, k; + gint i, j, k; g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); @@ -355,53 +363,58 @@ gst_jpegenc_chain (GstPad *pad, GstData *_data) /*usleep(10000); */ jpegenc = GST_JPEGENC (GST_OBJECT_PARENT (pad)); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - GST_DEBUG ("gst_jpegenc_chain: got buffer of %ld bytes in '%s'",size, - GST_OBJECT_NAME (jpegenc)); + GST_DEBUG ("gst_jpegenc_chain: got buffer of %ld bytes in '%s'", size, + GST_OBJECT_NAME (jpegenc)); - outbuf = gst_buffer_new(); - outsize = GST_BUFFER_SIZE(outbuf) = jpegenc->bufsize; - outdata = GST_BUFFER_DATA(outbuf) = g_malloc(outsize); - GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf); + outbuf = gst_buffer_new (); + outsize = GST_BUFFER_SIZE (outbuf) = jpegenc->bufsize; + outdata = GST_BUFFER_DATA (outbuf) = g_malloc (outsize); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); width = jpegenc->width; height = jpegenc->height; base[0] = data; - base[1] = base[0]+width*height; - base[2] = base[1]+width*height/4; + base[1] = base[0] + width * height; + base[2] = base[1] + width * height / 4; jpegenc->jdest.next_output_byte = outdata; jpegenc->jdest.free_in_buffer = outsize; jpegenc->cinfo.smoothing_factor = jpegenc->smoothing; - jpeg_set_quality(&jpegenc->cinfo, jpegenc->quality, TRUE); - jpeg_start_compress(&jpegenc->cinfo, TRUE); + jpeg_set_quality (&jpegenc->cinfo, jpegenc->quality, TRUE); + jpeg_start_compress (&jpegenc->cinfo, TRUE); - width2 = width>>1; + width2 = width >> 1; GST_DEBUG ("gst_jpegdec_chain: compressing"); - for (i = 0; i < height; i += 2*DCTSIZE) { - for (j=0, k=0; j<2*DCTSIZE;j+=2, k++) { - jpegenc->line[0][j] = base[0]; base[0] += width; - jpegenc->line[0][j+1] = base[0]; base[0] += width; - jpegenc->line[1][k] = base[1]; base[1] += width2; - jpegenc->line[2][k] = base[2]; base[2] += width2; + for (i = 0; i < height; i += 2 * DCTSIZE) { + for (j = 0, k = 0; j < 2 * DCTSIZE; j += 2, k++) { + jpegenc->line[0][j] = base[0]; + base[0] += width; + jpegenc->line[0][j + 1] = base[0]; + base[0] += width; + jpegenc->line[1][k] = base[1]; + base[1] += width2; + jpegenc->line[2][k] = base[2]; + base[2] += width2; } - jpeg_write_raw_data(&jpegenc->cinfo, jpegenc->line, 2*DCTSIZE); + jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, 2 * DCTSIZE); } - jpeg_finish_compress(&jpegenc->cinfo); + jpeg_finish_compress (&jpegenc->cinfo); GST_DEBUG ("gst_jpegdec_chain: compressing done"); - GST_BUFFER_SIZE(outbuf) = (((outsize - jpegenc->jdest.free_in_buffer)+3)&~3); + GST_BUFFER_SIZE (outbuf) = + (((outsize - jpegenc->jdest.free_in_buffer) + 3) & ~3); - gst_pad_push(jpegenc->srcpad, GST_DATA (outbuf)); + gst_pad_push (jpegenc->srcpad, GST_DATA (outbuf)); - g_signal_emit(G_OBJECT(jpegenc),gst_jpegenc_signals[FRAME_ENCODED], 0); + g_signal_emit (G_OBJECT (jpegenc), gst_jpegenc_signals[FRAME_ENCODED], 0); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void @@ -412,7 +425,7 @@ gst_jpegenc_set_property (GObject * object, guint prop_id, g_return_if_fail (GST_IS_JPEGENC (object)); jpegenc = GST_JPEGENC (object); - + switch (prop_id) { case ARG_QUALITY: jpegenc->quality = g_value_get_int (value); @@ -423,7 +436,7 @@ gst_jpegenc_set_property (GObject * object, guint prop_id, default: break; } -} +} static void gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, @@ -446,4 +459,3 @@ gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, break; } } - diff --git a/ext/jpeg/gstjpegenc.h b/ext/jpeg/gstjpegenc.h index b68b4859..beeaf6f9 100644 --- a/ext/jpeg/gstjpegenc.h +++ b/ext/jpeg/gstjpegenc.h @@ -30,8 +30,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_JPEGENC \ @@ -45,48 +46,50 @@ extern "C" { #define GST_IS_JPEGENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEGENC)) -typedef struct _GstJpegEnc GstJpegEnc; -typedef struct _GstJpegEncClass GstJpegEncClass; + typedef struct _GstJpegEnc GstJpegEnc; + typedef struct _GstJpegEncClass GstJpegEncClass; -struct _GstJpegEnc { - GstElement element; + struct _GstJpegEnc + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - /* video state */ - gint format; - gint width; - gint height; - gdouble fps; - /* the video buffer */ - gint bufsize; - GstBuffer *buffer; - guint row_stride; - /* the jpeg line buffer */ - guchar **line[3]; + /* video state */ + gint format; + gint width; + gint height; + gdouble fps; + /* the video buffer */ + gint bufsize; + GstBuffer *buffer; + guint row_stride; + /* the jpeg line buffer */ + guchar **line[3]; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - struct jpeg_destination_mgr jdest; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_destination_mgr jdest; - int quality; - int smoothing; -}; + int quality; + int smoothing; + }; -struct _GstJpegEncClass { - GstElementClass parent_class; + struct _GstJpegEncClass + { + GstElementClass parent_class; - /* signals */ - void (*frame_encoded) (GstElement *element); -}; + /* signals */ + void (*frame_encoded) (GstElement * element); + }; -GType gst_jpegenc_get_type(void); + GType gst_jpegenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_JPEGENC_H__ */ +#endif /* __GST_JPEGENC_H__ */ diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c index 020767fa..4f6c1f0c 100644 --- a/ext/ladspa/gstladspa.c +++ b/ext/ladspa/gstladspa.c @@ -28,8 +28,8 @@ #include #include "gstladspa.h" -#include /* main ladspa sdk include file */ -#include "utils.h" /* ladspa sdk utility functions */ +#include /* main ladspa sdk include file */ +#include "utils.h" /* ladspa sdk utility functions */ /* 1.0 and the 1.1 preliminary headers don't define a version, but 1.1 final does */ @@ -40,31 +40,34 @@ static GstStaticCaps ladspa_pad_caps = GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS); -static void gst_ladspa_class_init (GstLADSPAClass *klass); -static void gst_ladspa_base_init (GstLADSPAClass *klass); -static void gst_ladspa_init (GstLADSPA *ladspa); +static void gst_ladspa_class_init (GstLADSPAClass * klass); +static void gst_ladspa_base_init (GstLADSPAClass * klass); +static void gst_ladspa_init (GstLADSPA * ladspa); -static void gst_ladspa_update_int (const GValue *value, gpointer data); -static GstPadLinkReturn gst_ladspa_link (GstPad *pad, const GstCaps *caps); +static void gst_ladspa_update_int (const GValue * value, gpointer data); +static GstPadLinkReturn gst_ladspa_link (GstPad * pad, const GstCaps * caps); -static void gst_ladspa_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_ladspa_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_ladspa_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_ladspa_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static gboolean gst_ladspa_instantiate (GstLADSPA *ladspa); -static void gst_ladspa_activate (GstLADSPA *ladspa); -static void gst_ladspa_deactivate (GstLADSPA *ladspa); +static gboolean gst_ladspa_instantiate (GstLADSPA * ladspa); +static void gst_ladspa_activate (GstLADSPA * ladspa); +static void gst_ladspa_deactivate (GstLADSPA * ladspa); -static GstElementStateReturn gst_ladspa_change_state (GstElement *element); -static void gst_ladspa_loop (GstElement *element); -static void gst_ladspa_chain (GstPad *pad,GstData *_data); -static GstData * gst_ladspa_get (GstPad *pad); +static GstElementStateReturn gst_ladspa_change_state (GstElement * element); +static void gst_ladspa_loop (GstElement * element); +static void gst_ladspa_chain (GstPad * pad, GstData * _data); +static GstData *gst_ladspa_get (GstPad * pad); static GstElementClass *parent_class = NULL; static GstPlugin *ladspa_plugin; static GHashTable *ladspa_descriptors; -enum { +enum +{ ARG_0, ARG_SAMPLERATE, ARG_BUFFERSIZE, @@ -78,38 +81,39 @@ GST_DEBUG_CATEGORY_STATIC (ladspa_debug); GST_CAT_LEVEL_LOG (ladspa_debug, GST_LEVEL_DEBUG, obj, __VA_ARGS__) static void -gst_ladspa_base_init (GstLADSPAClass *klass) +gst_ladspa_base_init (GstLADSPAClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstPadTemplate *templ; GstElementDetails *details; LADSPA_Descriptor *desc; - gint j, sinkcount,srccount; + gint j, sinkcount, srccount; - desc = g_hash_table_lookup(ladspa_descriptors, - GINT_TO_POINTER(G_TYPE_FROM_CLASS(klass))); + desc = g_hash_table_lookup (ladspa_descriptors, + GINT_TO_POINTER (G_TYPE_FROM_CLASS (klass))); if (!desc) - desc = g_hash_table_lookup(ladspa_descriptors, GINT_TO_POINTER(0)); + desc = g_hash_table_lookup (ladspa_descriptors, GINT_TO_POINTER (0)); g_assert (desc); /* pad templates */ klass->numports = desc->PortCount; klass->numsinkpads = 0; klass->numsrcpads = 0; - for (j=0;jPortCount;j++) { - if (LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[j])) { - gchar *name = g_strdup((gchar *)desc->PortNames[j]); + for (j = 0; j < desc->PortCount; j++) { + if (LADSPA_IS_PORT_AUDIO (desc->PortDescriptors[j])) { + gchar *name = g_strdup ((gchar *) desc->PortNames[j]); + g_strcanon (name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-'); /* the factories take ownership of the name */ - if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[j])) { - templ = gst_pad_template_new (name, GST_PAD_SINK, GST_PAD_ALWAYS, - gst_caps_copy (gst_static_caps_get (&ladspa_pad_caps))); - klass->numsinkpads++; + if (LADSPA_IS_PORT_INPUT (desc->PortDescriptors[j])) { + templ = gst_pad_template_new (name, GST_PAD_SINK, GST_PAD_ALWAYS, + gst_caps_copy (gst_static_caps_get (&ladspa_pad_caps))); + klass->numsinkpads++; } else { - templ = gst_pad_template_new (name, GST_PAD_SRC, GST_PAD_ALWAYS, - gst_caps_copy (gst_static_caps_get (&ladspa_pad_caps))); - klass->numsrcpads++; + templ = gst_pad_template_new (name, GST_PAD_SRC, GST_PAD_ALWAYS, + gst_caps_copy (gst_static_caps_get (&ladspa_pad_caps))); + klass->numsrcpads++; } gst_element_class_add_pad_template (element_class, templ); @@ -117,28 +121,32 @@ gst_ladspa_base_init (GstLADSPAClass *klass) } /* construct the element details struct */ - details = g_new0(GstElementDetails,1); - details->longname = g_strdup(desc->Name); + details = g_new0 (GstElementDetails, 1); + details->longname = g_strdup (desc->Name); details->description = details->longname; - details->author = g_strdup(desc->Maker); - if ((klass->numsinkpads >0) && (klass->numsrcpads >0)) details->klass = "Filter/Effect/Audio/LADSPA"; - else if((klass->numsinkpads==0) && (klass->numsrcpads >0)) details->klass = "Source/Audio/LADSPA"; - else if((klass->numsinkpads >0) && (klass->numsrcpads==0)) details->klass = "Sink/Audio/LADSPA"; - else details->klass = "Filter/Effect/Audio/LADSPA"; /* whatever this is */ + details->author = g_strdup (desc->Maker); + if ((klass->numsinkpads > 0) && (klass->numsrcpads > 0)) + details->klass = "Filter/Effect/Audio/LADSPA"; + else if ((klass->numsinkpads == 0) && (klass->numsrcpads > 0)) + details->klass = "Source/Audio/LADSPA"; + else if ((klass->numsinkpads > 0) && (klass->numsrcpads == 0)) + details->klass = "Sink/Audio/LADSPA"; + else + details->klass = "Filter/Effect/Audio/LADSPA"; /* whatever this is */ gst_element_class_set_details (element_class, details); - klass->srcpad_portnums = g_new0(gint,klass->numsrcpads); - klass->sinkpad_portnums = g_new0(gint,klass->numsinkpads); + klass->srcpad_portnums = g_new0 (gint, klass->numsrcpads); + klass->sinkpad_portnums = g_new0 (gint, klass->numsinkpads); sinkcount = 0; srccount = 0; /* walk through the ports, note the portnums for srcpads, sinkpads */ - for (j=0; jPortCount; j++) { - if (LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[j])) { - if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[j])) - klass->sinkpad_portnums[sinkcount++] = j; + for (j = 0; j < desc->PortCount; j++) { + if (LADSPA_IS_PORT_AUDIO (desc->PortDescriptors[j])) { + if (LADSPA_IS_PORT_INPUT (desc->PortDescriptors[j])) + klass->sinkpad_portnums[sinkcount++] = j; else - klass->srcpad_portnums[srccount++] = j; + klass->srcpad_portnums[srccount++] = j; } } @@ -146,19 +154,19 @@ gst_ladspa_base_init (GstLADSPAClass *klass) } static void -gst_ladspa_class_init (GstLADSPAClass *klass) +gst_ladspa_class_init (GstLADSPAClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; LADSPA_Descriptor *desc; - gint i,current_portnum,controlcount; + gint i, current_portnum, controlcount; gint hintdesc; - gint argtype,argperms; + gint argtype, argperms; GParamSpec *paramspec = NULL; gchar *argname, *tempstr, *paren; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_ladspa_set_property; gobject_class->get_property = gst_ladspa_get_property; @@ -166,78 +174,85 @@ gst_ladspa_class_init (GstLADSPAClass *klass) gstelement_class->change_state = gst_ladspa_change_state; /* look up and store the ladspa descriptor */ - desc = g_hash_table_lookup(ladspa_descriptors, - GINT_TO_POINTER(G_TYPE_FROM_CLASS(klass))); + desc = g_hash_table_lookup (ladspa_descriptors, + GINT_TO_POINTER (G_TYPE_FROM_CLASS (klass))); if (!desc) - desc = g_hash_table_lookup(ladspa_descriptors, GINT_TO_POINTER(0)); + desc = g_hash_table_lookup (ladspa_descriptors, GINT_TO_POINTER (0)); g_assert (desc); klass->numcontrols = 0; /* walk through the ports, count the input, output and control ports */ - for (i=0; iPortCount; i++) { - if (!LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[i]) && - LADSPA_IS_PORT_INPUT(desc->PortDescriptors[i])) + for (i = 0; i < desc->PortCount; i++) { + if (!LADSPA_IS_PORT_AUDIO (desc->PortDescriptors[i]) && + LADSPA_IS_PORT_INPUT (desc->PortDescriptors[i])) klass->numcontrols++; } DEBUG ("ladspa element class: init %s with %d sink, %d src, %d control\n", - g_type_name (G_TYPE_FROM_CLASS (klass)), - klass->numsinkpads, klass->numsrcpads, klass->numcontrols); + g_type_name (G_TYPE_FROM_CLASS (klass)), + klass->numsinkpads, klass->numsrcpads, klass->numcontrols); - klass->control_portnums = g_new0(gint,klass->numcontrols); + klass->control_portnums = g_new0 (gint, klass->numcontrols); controlcount = 0; /* walk through the ports, note the portnums for control params */ - for (i=0; iPortCount; i++) { - if (!LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[i]) && - LADSPA_IS_PORT_INPUT(desc->PortDescriptors[i])) + for (i = 0; i < desc->PortCount; i++) { + if (!LADSPA_IS_PORT_AUDIO (desc->PortDescriptors[i]) && + LADSPA_IS_PORT_INPUT (desc->PortDescriptors[i])) klass->control_portnums[controlcount++] = i; } /* now build the control info from the control ports */ - klass->control_info = g_new0(ladspa_control_info,klass->numcontrols); - - for (i=0;inumcontrols;i++) { + klass->control_info = g_new0 (ladspa_control_info, klass->numcontrols); + + for (i = 0; i < klass->numcontrols; i++) { current_portnum = klass->control_portnums[i]; - + /* short name for hint descriptor */ hintdesc = desc->PortRangeHints[current_portnum].HintDescriptor; /* get the various bits */ - if (LADSPA_IS_HINT_TOGGLED(hintdesc)) + if (LADSPA_IS_HINT_TOGGLED (hintdesc)) klass->control_info[i].toggled = TRUE; - if (LADSPA_IS_HINT_LOGARITHMIC(hintdesc)) + if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) klass->control_info[i].logarithmic = TRUE; - if (LADSPA_IS_HINT_INTEGER(hintdesc)) + if (LADSPA_IS_HINT_INTEGER (hintdesc)) klass->control_info[i].integer = TRUE; /* figure out the argument details */ - if (klass->control_info[i].toggled) argtype = G_TYPE_BOOLEAN; - else if (klass->control_info[i].integer) argtype = G_TYPE_INT; - else argtype = G_TYPE_FLOAT; + if (klass->control_info[i].toggled) + argtype = G_TYPE_BOOLEAN; + else if (klass->control_info[i].integer) + argtype = G_TYPE_INT; + else + argtype = G_TYPE_FLOAT; /* grab the bounds */ - if (LADSPA_IS_HINT_BOUNDED_BELOW(hintdesc)) { + if (LADSPA_IS_HINT_BOUNDED_BELOW (hintdesc)) { klass->control_info[i].lower = TRUE; klass->control_info[i].lowerbound = - desc->PortRangeHints[current_portnum].LowerBound; + desc->PortRangeHints[current_portnum].LowerBound; } else { - if (argtype==G_TYPE_INT) klass->control_info[i].lowerbound = (gfloat)G_MININT; - if (argtype==G_TYPE_FLOAT) klass->control_info[i].lowerbound = -G_MAXFLOAT; + if (argtype == G_TYPE_INT) + klass->control_info[i].lowerbound = (gfloat) G_MININT; + if (argtype == G_TYPE_FLOAT) + klass->control_info[i].lowerbound = -G_MAXFLOAT; } - - if (LADSPA_IS_HINT_BOUNDED_ABOVE(hintdesc)) { + + if (LADSPA_IS_HINT_BOUNDED_ABOVE (hintdesc)) { klass->control_info[i].upper = TRUE; klass->control_info[i].upperbound = - desc->PortRangeHints[current_portnum].UpperBound; - if (LADSPA_IS_HINT_SAMPLE_RATE(hintdesc)) { - klass->control_info[i].samplerate = TRUE; - klass->control_info[i].upperbound *= 44100; /* FIXME? */ + desc->PortRangeHints[current_portnum].UpperBound; + if (LADSPA_IS_HINT_SAMPLE_RATE (hintdesc)) { + klass->control_info[i].samplerate = TRUE; + klass->control_info[i].upperbound *= 44100; /* FIXME? */ } } else { - if (argtype==G_TYPE_INT) klass->control_info[i].upperbound = (gfloat)G_MAXINT; - if (argtype==G_TYPE_FLOAT) klass->control_info[i].upperbound = G_MAXFLOAT; + if (argtype == G_TYPE_INT) + klass->control_info[i].upperbound = (gfloat) G_MAXINT; + if (argtype == G_TYPE_FLOAT) + klass->control_info[i].upperbound = G_MAXFLOAT; } /* use the lowerbound as the default value */ @@ -247,46 +262,51 @@ gst_ladspa_class_init (GstLADSPAClass *klass) /* figure out the defaults */ if (LADSPA_IS_HINT_HAS_DEFAULT (hintdesc)) { if (LADSPA_IS_HINT_DEFAULT_MINIMUM (hintdesc)) - klass->control_info[i].def = klass->control_info[i].lowerbound; + klass->control_info[i].def = klass->control_info[i].lowerbound; else if (LADSPA_IS_HINT_DEFAULT_LOW (hintdesc)) - if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) - klass->control_info[i].def = exp (0.75*log(klass->control_info[i].lowerbound) + - 0.25*log(klass->control_info[i].upperbound)); - else - klass->control_info[i].def = (0.75*klass->control_info[i].lowerbound + - 0.25*klass->control_info[i].upperbound); + if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) + klass->control_info[i].def = + exp (0.75 * log (klass->control_info[i].lowerbound) + + 0.25 * log (klass->control_info[i].upperbound)); + else + klass->control_info[i].def = + (0.75 * klass->control_info[i].lowerbound + + 0.25 * klass->control_info[i].upperbound); else if (LADSPA_IS_HINT_DEFAULT_MIDDLE (hintdesc)) - if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) - klass->control_info[i].def = exp (0.5*log(klass->control_info[i].lowerbound) + - 0.5*log(klass->control_info[i].upperbound)); - else - klass->control_info[i].def = (0.5*klass->control_info[i].lowerbound + - 0.5*klass->control_info[i].upperbound); + if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) + klass->control_info[i].def = + exp (0.5 * log (klass->control_info[i].lowerbound) + + 0.5 * log (klass->control_info[i].upperbound)); + else + klass->control_info[i].def = + (0.5 * klass->control_info[i].lowerbound + + 0.5 * klass->control_info[i].upperbound); else if (LADSPA_IS_HINT_DEFAULT_HIGH (hintdesc)) - if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) - klass->control_info[i].def = exp (0.25*log(klass->control_info[i].lowerbound) + - 0.75*log(klass->control_info[i].upperbound)); - else - klass->control_info[i].def = (0.25*klass->control_info[i].lowerbound + - 0.75*klass->control_info[i].upperbound); + if (LADSPA_IS_HINT_LOGARITHMIC (hintdesc)) + klass->control_info[i].def = + exp (0.25 * log (klass->control_info[i].lowerbound) + + 0.75 * log (klass->control_info[i].upperbound)); + else + klass->control_info[i].def = + (0.25 * klass->control_info[i].lowerbound + + 0.75 * klass->control_info[i].upperbound); else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM (hintdesc)) - klass->control_info[i].def = klass->control_info[i].upperbound; + klass->control_info[i].def = klass->control_info[i].upperbound; else if (LADSPA_IS_HINT_DEFAULT_0 (hintdesc)) - klass->control_info[i].def = 0.0; + klass->control_info[i].def = 0.0; else if (LADSPA_IS_HINT_DEFAULT_1 (hintdesc)) - klass->control_info[i].def = 1.0; + klass->control_info[i].def = 1.0; else if (LADSPA_IS_HINT_DEFAULT_100 (hintdesc)) - klass->control_info[i].def = 100.0; + klass->control_info[i].def = 100.0; else if (LADSPA_IS_HINT_DEFAULT_440 (hintdesc)) - klass->control_info[i].def = 440.0; + klass->control_info[i].def = 440.0; } #endif /* LADSPA_IS_HINT_HAS_DEFAULT */ - klass->control_info[i].def = CLAMP(klass->control_info[i].def, - klass->control_info[i].lowerbound, - klass->control_info[i].upperbound); - - if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[current_portnum])) { + klass->control_info[i].def = CLAMP (klass->control_info[i].def, + klass->control_info[i].lowerbound, klass->control_info[i].upperbound); + + if (LADSPA_IS_PORT_INPUT (desc->PortDescriptors[current_portnum])) { argperms = G_PARAM_READWRITE; klass->control_info[i].writable = TRUE; } else { @@ -294,8 +314,8 @@ gst_ladspa_class_init (GstLADSPAClass *klass) klass->control_info[i].writable = FALSE; } - klass->control_info[i].name = g_strdup(desc->PortNames[current_portnum]); - argname = g_strdup(klass->control_info[i].name); + klass->control_info[i].name = g_strdup (desc->PortNames[current_portnum]); + argname = g_strdup (klass->control_info[i].name); /* find out if there is a (unitname) at the end of the argname and get rid of it */ paren = g_strrstr (argname, " ("); @@ -305,123 +325,120 @@ gst_ladspa_class_init (GstLADSPAClass *klass) /* this is the same thing that param_spec_* will do */ g_strcanon (argname, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-'); /* satisfy glib2 (argname[0] must be [A-Za-z]) */ - if (!((argname[0] >= 'a' && argname[0] <= 'z') || (argname[0] >= 'A' && argname[0] <= 'Z'))) { + if (!((argname[0] >= 'a' && argname[0] <= 'z') || (argname[0] >= 'A' + && argname[0] <= 'Z'))) { tempstr = argname; - argname = g_strconcat("param-", argname, NULL); + argname = g_strconcat ("param-", argname, NULL); g_free (tempstr); } - + /* check for duplicate property names */ - if (g_object_class_find_property(G_OBJECT_CLASS(klass), argname) != NULL){ - gint numarg=1; - gchar *numargname = g_strdup_printf("%s_%d",argname,numarg++); - while (g_object_class_find_property(G_OBJECT_CLASS(klass), numargname) != NULL){ - g_free(numargname); - numargname = g_strdup_printf("%s_%d",argname,numarg++); + if (g_object_class_find_property (G_OBJECT_CLASS (klass), argname) != NULL) { + gint numarg = 1; + gchar *numargname = g_strdup_printf ("%s_%d", argname, numarg++); + + while (g_object_class_find_property (G_OBJECT_CLASS (klass), + numargname) != NULL) { + g_free (numargname); + numargname = g_strdup_printf ("%s_%d", argname, numarg++); } argname = numargname; } - + klass->control_info[i].param_name = argname; - + DEBUG ("adding arg %s from %s", argname, klass->control_info[i].name); - - if (argtype==G_TYPE_BOOLEAN){ - paramspec = g_param_spec_boolean(argname,argname,argname, FALSE, argperms); - } else if (argtype==G_TYPE_INT){ - paramspec = g_param_spec_int(argname,argname,argname, - (gint)klass->control_info[i].lowerbound, - (gint)klass->control_info[i].upperbound, - (gint)klass->control_info[i].def, argperms); - } else if (klass->control_info[i].samplerate){ - paramspec = g_param_spec_float(argname,argname,argname, - 0.0, G_MAXFLOAT, - 0.0, argperms); + + if (argtype == G_TYPE_BOOLEAN) { + paramspec = + g_param_spec_boolean (argname, argname, argname, FALSE, argperms); + } else if (argtype == G_TYPE_INT) { + paramspec = g_param_spec_int (argname, argname, argname, + (gint) klass->control_info[i].lowerbound, + (gint) klass->control_info[i].upperbound, + (gint) klass->control_info[i].def, argperms); + } else if (klass->control_info[i].samplerate) { + paramspec = g_param_spec_float (argname, argname, argname, + 0.0, G_MAXFLOAT, 0.0, argperms); } else { - paramspec = g_param_spec_float(argname,argname,argname, - klass->control_info[i].lowerbound, klass->control_info[i].upperbound, - klass->control_info[i].def, argperms); + paramspec = g_param_spec_float (argname, argname, argname, + klass->control_info[i].lowerbound, klass->control_info[i].upperbound, + klass->control_info[i].def, argperms); } - + /* properties have an offset of 1 */ - g_object_class_install_property(G_OBJECT_CLASS(klass), i+1, paramspec); + g_object_class_install_property (G_OBJECT_CLASS (klass), i + 1, paramspec); } } static void -gst_ladspa_init (GstLADSPA *ladspa) +gst_ladspa_init (GstLADSPA * ladspa) { GstLADSPAClass *oclass; ladspa_control_info cinfo; GList *l; LADSPA_Descriptor *desc; - gint i,sinkcount,srccount; + gint i, sinkcount, srccount; - oclass = (GstLADSPAClass*)G_OBJECT_GET_CLASS (ladspa); + oclass = (GstLADSPAClass *) G_OBJECT_GET_CLASS (ladspa); desc = oclass->descriptor; ladspa->descriptor = oclass->descriptor; - + /* allocate the various arrays */ - ladspa->srcpads = g_new0(GstPad*,oclass->numsrcpads); - ladspa->sinkpads = g_new0(GstPad*,oclass->numsinkpads); - ladspa->controls = g_new(gfloat,oclass->numcontrols); - ladspa->dpman = gst_dpman_new ("ladspa_dpman", GST_ELEMENT(ladspa)); - + ladspa->srcpads = g_new0 (GstPad *, oclass->numsrcpads); + ladspa->sinkpads = g_new0 (GstPad *, oclass->numsinkpads); + ladspa->controls = g_new (gfloat, oclass->numcontrols); + ladspa->dpman = gst_dpman_new ("ladspa_dpman", GST_ELEMENT (ladspa)); + /* set up pads */ sinkcount = 0; srccount = 0; - for (l=GST_ELEMENT_CLASS (oclass)->padtemplates; l; l=l->next) { + for (l = GST_ELEMENT_CLASS (oclass)->padtemplates; l; l = l->next) { GstPad *pad = gst_pad_new_from_template (GST_PAD_TEMPLATE (l->data), - GST_PAD_TEMPLATE_NAME_TEMPLATE (l->data)); + GST_PAD_TEMPLATE_NAME_TEMPLATE (l->data)); + gst_pad_set_link_function (pad, gst_ladspa_link); - gst_element_add_pad ((GstElement*)ladspa, pad); + gst_element_add_pad ((GstElement *) ladspa, pad); if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) ladspa->sinkpads[sinkcount++] = pad; else ladspa->srcpads[srccount++] = pad; } - + /* set up dparams */ - for (i=0; inumcontrols; i++) { - if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[i])) { + for (i = 0; i < oclass->numcontrols; i++) { + if (LADSPA_IS_PORT_INPUT (desc->PortDescriptors[i])) { cinfo = oclass->control_info[i]; - ladspa->controls[i]=cinfo.def; - - if (cinfo.toggled){ - gst_dpman_add_required_dparam_callback ( - ladspa->dpman, - g_param_spec_int(cinfo.param_name, cinfo.name, cinfo.name, - 0, 1, (gint)(ladspa->controls[i]), G_PARAM_READWRITE), - "int", gst_ladspa_update_int, &(ladspa->controls[i]) - ); - } - else if (cinfo.integer){ - gst_dpman_add_required_dparam_callback ( - ladspa->dpman, - g_param_spec_int(cinfo.param_name, cinfo.name, cinfo.name, - (gint)cinfo.lowerbound, (gint)cinfo.upperbound, - (gint)ladspa->controls[i], G_PARAM_READWRITE), - "int", gst_ladspa_update_int, &(ladspa->controls[i]) - ); - } - else if (cinfo.samplerate){ - gst_dpman_add_required_dparam_direct ( - ladspa->dpman, - g_param_spec_float(cinfo.param_name, cinfo.name, cinfo.name, - cinfo.lowerbound, cinfo.upperbound, - ladspa->controls[i], G_PARAM_READWRITE), - "hertz-rate-bound", &(ladspa->controls[i]) - ); - } - else { - gst_dpman_add_required_dparam_direct ( - ladspa->dpman, - g_param_spec_float(cinfo.param_name, cinfo.name, cinfo.name, - cinfo.lowerbound, cinfo.upperbound, - ladspa->controls[i], G_PARAM_READWRITE), - "float", &(ladspa->controls[i]) - ); + ladspa->controls[i] = cinfo.def; + + if (cinfo.toggled) { + gst_dpman_add_required_dparam_callback (ladspa->dpman, + g_param_spec_int (cinfo.param_name, cinfo.name, cinfo.name, + 0, 1, (gint) (ladspa->controls[i]), G_PARAM_READWRITE), + "int", gst_ladspa_update_int, &(ladspa->controls[i]) + ); + } else if (cinfo.integer) { + gst_dpman_add_required_dparam_callback (ladspa->dpman, + g_param_spec_int (cinfo.param_name, cinfo.name, cinfo.name, + (gint) cinfo.lowerbound, (gint) cinfo.upperbound, + (gint) ladspa->controls[i], G_PARAM_READWRITE), + "int", gst_ladspa_update_int, &(ladspa->controls[i]) + ); + } else if (cinfo.samplerate) { + gst_dpman_add_required_dparam_direct (ladspa->dpman, + g_param_spec_float (cinfo.param_name, cinfo.name, cinfo.name, + cinfo.lowerbound, cinfo.upperbound, + ladspa->controls[i], G_PARAM_READWRITE), + "hertz-rate-bound", &(ladspa->controls[i]) + ); + } else { + gst_dpman_add_required_dparam_direct (ladspa->dpman, + g_param_spec_float (cinfo.param_name, cinfo.name, cinfo.name, + cinfo.lowerbound, cinfo.upperbound, + ladspa->controls[i], G_PARAM_READWRITE), + "float", &(ladspa->controls[i]) + ); } } } @@ -429,58 +446,62 @@ gst_ladspa_init (GstLADSPA *ladspa) /* nonzero default needed to instantiate() some plugins */ ladspa->samplerate = 44100; - ladspa->buffer_frames = 0; /* should be set with caps */ + ladspa->buffer_frames = 0; /* should be set with caps */ ladspa->activated = FALSE; - ladspa->inplace_broken = LADSPA_IS_INPLACE_BROKEN(ladspa->descriptor->Properties); + ladspa->inplace_broken = + LADSPA_IS_INPLACE_BROKEN (ladspa->descriptor->Properties); - if (sinkcount==0 && srccount == 1) { + if (sinkcount == 0 && srccount == 1) { /* get mode (no sink pads) */ DEBUG_OBJ (ladspa, "mono get mode with 1 src pad"); gst_pad_set_get_function (ladspa->srcpads[0], gst_ladspa_get); - } else if (sinkcount==1){ + } else if (sinkcount == 1) { /* with one sink we can use the chain function */ DEBUG_OBJ (ladspa, "chain mode"); gst_pad_set_chain_function (ladspa->sinkpads[0], gst_ladspa_chain); - } else if (sinkcount > 1){ + } else if (sinkcount > 1) { /* more than one sink pad needs loop mode */ - DEBUG_OBJ (ladspa, "loop mode with %d sink pads and %d src pads", sinkcount, srccount); + DEBUG_OBJ (ladspa, "loop mode with %d sink pads and %d src pads", sinkcount, + srccount); gst_element_set_loop_function (GST_ELEMENT (ladspa), gst_ladspa_loop); - } else if (sinkcount==0 && srccount == 0) { + } else if (sinkcount == 0 && srccount == 0) { /* for example, a plugin with only control inputs and output -- just ignore * it for now */ } else { - g_warning ("%d sink pads, %d src pads not yet supported", sinkcount, srccount); + g_warning ("%d sink pads, %d src pads not yet supported", sinkcount, + srccount); } gst_ladspa_instantiate (ladspa); } static void -gst_ladspa_update_int(const GValue *value, gpointer data) +gst_ladspa_update_int (const GValue * value, gpointer data) { - gfloat *target = (gfloat*) data; - *target = (gfloat)g_value_get_int(value); + gfloat *target = (gfloat *) data; + + *target = (gfloat) g_value_get_int (value); } static GstPadLinkReturn -gst_ladspa_link (GstPad *pad, const GstCaps *caps) +gst_ladspa_link (GstPad * pad, const GstCaps * caps) { - GstElement *element = (GstElement*)GST_PAD_PARENT (pad); - GstLADSPA *ladspa = (GstLADSPA*)element; + GstElement *element = (GstElement *) GST_PAD_PARENT (pad); + GstLADSPA *ladspa = (GstLADSPA *) element; const GList *l = NULL; gint rate; GstStructure *structure; /* if this fails in some other plugin, the graph is left in an inconsistent state */ - for (l=gst_element_get_pad_list (element); l; l=l->next) - if (pad != (GstPad*)l->data) - if (gst_pad_try_set_caps ((GstPad*)l->data, caps) <= 0) - return GST_PAD_LINK_REFUSED; - + for (l = gst_element_get_pad_list (element); l; l = l->next) + if (pad != (GstPad *) l->data) + if (gst_pad_try_set_caps ((GstPad *) l->data, caps) <= 0) + return GST_PAD_LINK_REFUSED; + /* we assume that the ladspa plugin can handle any sample rate, so this check gets put last */ structure = gst_caps_get_structure (caps, 0); @@ -488,48 +509,46 @@ gst_ladspa_link (GstPad *pad, const GstCaps *caps) /* have to instantiate ladspa plugin when samplerate changes (groan) */ if (ladspa->samplerate != rate) { ladspa->samplerate = rate; - if (! gst_ladspa_instantiate(ladspa)) + if (!gst_ladspa_instantiate (ladspa)) return GST_PAD_LINK_REFUSED; } - - gst_structure_get_int (structure, "buffer-frames", &ladspa->buffer_frames); - + + gst_structure_get_int (structure, "buffer-frames", &ladspa->buffer_frames); + return GST_PAD_LINK_OK; } #if 0 static void -gst_ladspa_force_src_caps(GstLADSPA *ladspa, GstPad *pad) +gst_ladspa_force_src_caps (GstLADSPA * ladspa, GstPad * pad) { if (!ladspa->buffer_frames) { - ladspa->buffer_frames = 256; /* 5 ms at 44100 kHz (just a default...) */ + ladspa->buffer_frames = 256; /* 5 ms at 44100 kHz (just a default...) */ } DEBUG_OBJ (ladspa, "forcing caps with rate=%d, buffer-frames=%d", - ladspa->samplerate, ladspa->buffer_frames); + ladspa->samplerate, ladspa->buffer_frames); gst_pad_try_set_caps (pad, - gst_caps_new ( - "ladspa_src_caps", - "audio/x-raw-float", - gst_props_new ( - "width", G_TYPE_INT (32), - "endianness", G_TYPE_INT (G_BYTE_ORDER), - "rate", G_TYPE_INT (ladspa->samplerate), - "buffer-frames", G_TYPE_INT (ladspa->buffer_frames), - "channels", G_TYPE_INT (1), - NULL))); + gst_caps_new ("ladspa_src_caps", + "audio/x-raw-float", + gst_props_new ("width", G_TYPE_INT (32), + "endianness", G_TYPE_INT (G_BYTE_ORDER), + "rate", G_TYPE_INT (ladspa->samplerate), + "buffer-frames", G_TYPE_INT (ladspa->buffer_frames), + "channels", G_TYPE_INT (1), NULL))); } #endif static void -gst_ladspa_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_ladspa_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { - GstLADSPA *ladspa = (GstLADSPA*)object; + GstLADSPA *ladspa = (GstLADSPA *) object; GstLADSPAClass *oclass; ladspa_control_info *control_info; - oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS (object)); + oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (object)); /* remember, properties have an offset of 1 */ prop_id--; @@ -551,14 +570,16 @@ gst_ladspa_set_property (GObject *object, guint prop_id, const GValue *value, GP else ladspa->controls[prop_id] = g_value_get_float (value); - DEBUG_OBJ (object, "set arg %s to %f", control_info->name, ladspa->controls[prop_id]); + DEBUG_OBJ (object, "set arg %s to %f", control_info->name, + ladspa->controls[prop_id]); } static void -gst_ladspa_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_ladspa_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { - GstLADSPA *ladspa = (GstLADSPA*)object; - GstLADSPAClass *oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS (object)); + GstLADSPA *ladspa = (GstLADSPA *) object; + GstLADSPAClass *oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (object)); ladspa_control_info *control_info; /* remember, properties have an offset of 1 */ @@ -574,62 +595,63 @@ gst_ladspa_get_property (GObject *object, guint prop_id, GValue *value, GParamSp if (control_info->toggled) g_value_set_boolean (value, ladspa->controls[prop_id] == 1.0); else if (control_info->integer) - g_value_set_int (value, (gint)ladspa->controls[prop_id]); + g_value_set_int (value, (gint) ladspa->controls[prop_id]); else g_value_set_float (value, ladspa->controls[prop_id]); - DEBUG_OBJ (object, "got arg %s as %f", control_info->name, ladspa->controls[prop_id]); + DEBUG_OBJ (object, "got arg %s as %f", control_info->name, + ladspa->controls[prop_id]); } static gboolean -gst_ladspa_instantiate (GstLADSPA *ladspa) +gst_ladspa_instantiate (GstLADSPA * ladspa) { LADSPA_Descriptor *desc; int i; - GstLADSPAClass *oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS (ladspa)); + GstLADSPAClass *oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (ladspa)); gboolean was_activated; - + desc = ladspa->descriptor; - + /* check for old handle */ was_activated = ladspa->activated; - if (ladspa->handle != NULL){ - gst_ladspa_deactivate(ladspa); - desc->cleanup(ladspa->handle); + if (ladspa->handle != NULL) { + gst_ladspa_deactivate (ladspa); + desc->cleanup (ladspa->handle); } - - /* instantiate the plugin */ + + /* instantiate the plugin */ DEBUG_OBJ (ladspa, "instantiating the plugin at %d Hz", ladspa->samplerate); - - ladspa->handle = desc->instantiate(desc,ladspa->samplerate); + + ladspa->handle = desc->instantiate (desc, ladspa->samplerate); g_return_val_if_fail (ladspa->handle != NULL, FALSE); /* connect the control ports */ - for (i=0;inumcontrols;i++) - desc->connect_port(ladspa->handle, - oclass->control_portnums[i], - &(ladspa->controls[i])); + for (i = 0; i < oclass->numcontrols; i++) + desc->connect_port (ladspa->handle, + oclass->control_portnums[i], &(ladspa->controls[i])); /* reactivate if it was activated before the reinstantiation */ if (was_activated) - gst_ladspa_activate(ladspa); + gst_ladspa_activate (ladspa); return TRUE; } static GstElementStateReturn -gst_ladspa_change_state (GstElement *element) +gst_ladspa_change_state (GstElement * element) { LADSPA_Descriptor *desc; - GstLADSPA *ladspa = (GstLADSPA*)element; + GstLADSPA *ladspa = (GstLADSPA *) element; + desc = ladspa->descriptor; switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: - gst_ladspa_activate(ladspa); + gst_ladspa_activate (ladspa); break; case GST_STATE_READY_TO_NULL: - gst_ladspa_deactivate(ladspa); + gst_ladspa_deactivate (ladspa); break; default: break; @@ -642,104 +664,109 @@ gst_ladspa_change_state (GstElement *element) } static void -gst_ladspa_activate (GstLADSPA *ladspa) +gst_ladspa_activate (GstLADSPA * ladspa) { LADSPA_Descriptor *desc; + desc = ladspa->descriptor; - + if (ladspa->activated) - gst_ladspa_deactivate(ladspa); - + gst_ladspa_deactivate (ladspa); + DEBUG_OBJ (ladspa, "activating"); /* activate the plugin (function might be null) */ if (desc->activate != NULL) - desc->activate(ladspa->handle); + desc->activate (ladspa->handle); ladspa->activated = TRUE; } static void -gst_ladspa_deactivate (GstLADSPA *ladspa) +gst_ladspa_deactivate (GstLADSPA * ladspa) { LADSPA_Descriptor *desc; + desc = ladspa->descriptor; DEBUG_OBJ (ladspa, "deactivating"); /* deactivate the plugin (function might be null) */ if (ladspa->activated && (desc->deactivate != NULL)) - desc->deactivate(ladspa->handle); + desc->deactivate (ladspa->handle); ladspa->activated = FALSE; } static void -gst_ladspa_loop (GstElement *element) +gst_ladspa_loop (GstElement * element) { - guint i, j, numsrcpads, numsinkpads; - guint num_processed, num_to_process; - gint largest_buffer; - LADSPA_Data **data_in, **data_out; - GstBuffer **buffers_in, **buffers_out; - - GstLADSPA *ladspa = (GstLADSPA *)element; - GstLADSPAClass *oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS (ladspa)); + guint i, j, numsrcpads, numsinkpads; + guint num_processed, num_to_process; + gint largest_buffer; + LADSPA_Data **data_in, **data_out; + GstBuffer **buffers_in, **buffers_out; + + GstLADSPA *ladspa = (GstLADSPA *) element; + GstLADSPAClass *oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (ladspa)); LADSPA_Descriptor *desc = ladspa->descriptor; numsinkpads = oclass->numsinkpads; numsrcpads = oclass->numsrcpads; - + /* fixme: these mallocs need to die */ - data_in = g_new0(LADSPA_Data*, numsinkpads); - data_out = g_new0(LADSPA_Data*, numsrcpads); - buffers_in = g_new0(GstBuffer*, numsinkpads); - buffers_out = g_new0(GstBuffer*, numsrcpads); - + data_in = g_new0 (LADSPA_Data *, numsinkpads); + data_out = g_new0 (LADSPA_Data *, numsrcpads); + buffers_in = g_new0 (GstBuffer *, numsinkpads); + buffers_out = g_new0 (GstBuffer *, numsrcpads); + largest_buffer = -1; /* first get all the necessary data from the input ports */ - for (i=0 ; isinkpads[i])); - + if (GST_IS_EVENT (buffers_in[i])) { /* push it out on all pads */ - gst_data_ref_by_count ((GstData*)buffers_in[i], numsrcpads); - for (j=0; jsrcpads[j], GST_DATA (buffers_in[i])); + gst_data_ref_by_count ((GstData *) buffers_in[i], numsrcpads); + for (j = 0; j < numsrcpads; j++) + gst_pad_push (ladspa->srcpads[j], GST_DATA (buffers_in[i])); if (GST_EVENT_TYPE (buffers_in[i]) == GST_EVENT_EOS) { - /* shut down */ - gst_element_set_eos (element); - return; + /* shut down */ + gst_element_set_eos (element); + return; } else { - goto get_buffer; + goto get_buffer; } } if (largest_buffer < 0) - largest_buffer = GST_BUFFER_SIZE (buffers_in[i])/sizeof(gfloat); + largest_buffer = GST_BUFFER_SIZE (buffers_in[i]) / sizeof (gfloat); else - largest_buffer = MIN (GST_BUFFER_SIZE (buffers_in[i])/sizeof(gfloat), largest_buffer); - data_in[i] = (LADSPA_Data *) GST_BUFFER_DATA(buffers_in[i]); - GST_BUFFER_TIMESTAMP(buffers_in[i]) = ladspa->timestamp; + largest_buffer = + MIN (GST_BUFFER_SIZE (buffers_in[i]) / sizeof (gfloat), + largest_buffer); + data_in[i] = (LADSPA_Data *) GST_BUFFER_DATA (buffers_in[i]); + GST_BUFFER_TIMESTAMP (buffers_in[i]) = ladspa->timestamp; } - i=0; + i = 0; if (!ladspa->inplace_broken) { - for (; ibuffer_frames * sizeof(gfloat)); + for (; i < numsrcpads; i++) { + buffers_out[i] = + gst_buffer_new_and_alloc (ladspa->buffer_frames * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (buffers_out[i]) = ladspa->timestamp; - data_out[i] = (LADSPA_Data*)GST_BUFFER_DATA (buffers_out[i]); + data_out[i] = (LADSPA_Data *) GST_BUFFER_DATA (buffers_out[i]); } - - GST_DPMAN_PREPROCESS(ladspa->dpman, largest_buffer, ladspa->timestamp); + + GST_DPMAN_PREPROCESS (ladspa->dpman, largest_buffer, ladspa->timestamp); num_processed = 0; /* split up processing of the buffer into chunks so that dparams can @@ -747,37 +774,39 @@ gst_ladspa_loop (GstElement *element) * In many cases the buffer will be processed in one chunk anyway. */ while (GST_DPMAN_PROCESS (ladspa->dpman, num_processed)) { - num_to_process = GST_DPMAN_FRAMES_TO_PROCESS(ladspa->dpman); + num_to_process = GST_DPMAN_FRAMES_TO_PROCESS (ladspa->dpman); - for (i=0 ; iconnect_port (ladspa->handle, oclass->sinkpad_portnums[i], data_in[i]); - for (i=0 ; iconnect_port (ladspa->handle, oclass->srcpad_portnums[i], data_out[i]); + for (i = 0; i < numsinkpads; i++) + desc->connect_port (ladspa->handle, oclass->sinkpad_portnums[i], + data_in[i]); + for (i = 0; i < numsrcpads; i++) + desc->connect_port (ladspa->handle, oclass->srcpad_portnums[i], + data_out[i]); - desc->run(ladspa->handle, num_to_process); + desc->run (ladspa->handle, num_to_process); - for (i=0 ; i= numsrcpads || buffers_out[i] != buffers_in[i]) - gst_buffer_unref(buffers_in[i]); + gst_buffer_unref (buffers_in[i]); data_in[i] = NULL; buffers_in[i] = NULL; - } - for (i=0 ; isrcpads[i], GST_DATA (buffers_out[i])); - + data_out[i] = NULL; buffers_out[i] = NULL; } - + ladspa->timestamp += ladspa->buffer_frames * GST_SECOND / ladspa->samplerate; /* FIXME: move these mallocs and frees to the state-change handler */ @@ -789,7 +818,7 @@ gst_ladspa_loop (GstElement *element) } static void -gst_ladspa_chain (GstPad *pad, GstData *_data) +gst_ladspa_chain (GstPad * pad, GstData * _data) { GstBuffer *buffer_in = GST_BUFFER (_data); LADSPA_Descriptor *desc; @@ -800,23 +829,23 @@ gst_ladspa_chain (GstPad *pad, GstData *_data) GstLADSPA *ladspa; GstLADSPAClass *oclass; - ladspa = (GstLADSPA*)GST_OBJECT_PARENT (pad); + ladspa = (GstLADSPA *) GST_OBJECT_PARENT (pad); oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (ladspa)); - data_in = (LADSPA_Data *) GST_BUFFER_DATA(buffer_in); - num_samples = GST_BUFFER_SIZE(buffer_in) / sizeof(gfloat); + data_in = (LADSPA_Data *) GST_BUFFER_DATA (buffer_in); + num_samples = GST_BUFFER_SIZE (buffer_in) / sizeof (gfloat); numsrcpads = oclass->numsrcpads; desc = ladspa->descriptor; /* we shouldn't get events here... */ g_return_if_fail (GST_IS_BUFFER (buffer_in)); - + /* FIXME: this function shouldn't need to malloc() anything */ if (numsrcpads > 0) { - buffers_out = g_new(GstBuffer*, numsrcpads); - data_out = g_new(LADSPA_Data*, numsrcpads); + buffers_out = g_new (GstBuffer *, numsrcpads); + data_out = g_new (LADSPA_Data *, numsrcpads); } - i=0; + i = 0; if (!ladspa->inplace_broken && numsrcpads) { /* reuse the first (chained) buffer */ buffers_out[i] = buffer_in; @@ -824,54 +853,56 @@ gst_ladspa_chain (GstPad *pad, GstData *_data) data_out[i] = data_in; i++; } - for (; itimestamp; - data_out[i] = (LADSPA_Data*)GST_BUFFER_DATA (buffers_out[i]); + data_out[i] = (LADSPA_Data *) GST_BUFFER_DATA (buffers_out[i]); } - GST_DPMAN_PREPROCESS(ladspa->dpman, num_samples, GST_BUFFER_TIMESTAMP(buffer_in)); + GST_DPMAN_PREPROCESS (ladspa->dpman, num_samples, + GST_BUFFER_TIMESTAMP (buffer_in)); num_processed = 0; /* split up processing of the buffer into chunks so that dparams can * be updated when required. * In many cases the buffer will be processed in one chunk anyway. */ - while(GST_DPMAN_PROCESS(ladspa->dpman, num_processed)) { - num_to_process = GST_DPMAN_FRAMES_TO_PROCESS(ladspa->dpman); + while (GST_DPMAN_PROCESS (ladspa->dpman, num_processed)) { + num_to_process = GST_DPMAN_FRAMES_TO_PROCESS (ladspa->dpman); + + desc->connect_port (ladspa->handle, oclass->sinkpad_portnums[0], data_in); + for (i = 0; i < numsrcpads; i++) + desc->connect_port (ladspa->handle, oclass->srcpad_portnums[i], + data_out[i]); - desc->connect_port(ladspa->handle,oclass->sinkpad_portnums[0],data_in); - for (i=0 ; iconnect_port(ladspa->handle,oclass->srcpad_portnums[i],data_out[i]); + desc->run (ladspa->handle, num_to_process); - desc->run(ladspa->handle, num_to_process); - data_in += num_to_process; - for (i=0 ; isrcpads[i], GST_DATA (buffers_out[i])); } - g_free(buffers_out); - g_free(data_out); + g_free (buffers_out); + g_free (data_out); } } static GstData * -gst_ladspa_get(GstPad *pad) -{ +gst_ladspa_get (GstPad * pad) +{ GstLADSPA *ladspa; GstLADSPAClass *oclass; GstBuffer *buf; @@ -879,120 +910,111 @@ gst_ladspa_get(GstPad *pad) LADSPA_Descriptor *desc; guint num_to_process, num_processed; - ladspa = (GstLADSPA *)gst_pad_get_parent (pad); - oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS(ladspa)); + ladspa = (GstLADSPA *) gst_pad_get_parent (pad); + oclass = (GstLADSPAClass *) (G_OBJECT_GET_CLASS (ladspa)); desc = ladspa->descriptor; /* 4096 is arbitrary */ buf = gst_buffer_new_and_alloc (4096); - GST_BUFFER_TIMESTAMP(buf) = ladspa->timestamp; - data = (LADSPA_Data *) GST_BUFFER_DATA(buf); + GST_BUFFER_TIMESTAMP (buf) = ladspa->timestamp; + data = (LADSPA_Data *) GST_BUFFER_DATA (buf); - GST_DPMAN_PREPROCESS(ladspa->dpman, ladspa->buffer_frames, ladspa->timestamp); + GST_DPMAN_PREPROCESS (ladspa->dpman, ladspa->buffer_frames, + ladspa->timestamp); num_processed = 0; /* split up processing of the buffer into chunks so that dparams can * be updated when required. * In many cases the buffer will be processed in one chunk anyway. */ - while(GST_DPMAN_PROCESS(ladspa->dpman, num_processed)) { - num_to_process = GST_DPMAN_FRAMES_TO_PROCESS(ladspa->dpman); + while (GST_DPMAN_PROCESS (ladspa->dpman, num_processed)) { + num_to_process = GST_DPMAN_FRAMES_TO_PROCESS (ladspa->dpman); - /* update timestamp */ + /* update timestamp */ ladspa->timestamp += num_to_process * GST_SECOND / ladspa->samplerate; - desc->connect_port(ladspa->handle,oclass->srcpad_portnums[0],data); + desc->connect_port (ladspa->handle, oclass->srcpad_portnums[0], data); + + desc->run (ladspa->handle, num_to_process); - desc->run(ladspa->handle, num_to_process); - data += num_to_process; num_processed = num_to_process; } - + return GST_DATA (buf); } static void -ladspa_describe_plugin(const char *pcFullFilename, - void *pvPluginHandle, - LADSPA_Descriptor_Function pfDescriptorFunction) +ladspa_describe_plugin (const char *pcFullFilename, + void *pvPluginHandle, LADSPA_Descriptor_Function pfDescriptorFunction) { const LADSPA_Descriptor *desc; gint i; GTypeInfo typeinfo = { - sizeof(GstLADSPAClass), - (GBaseInitFunc)gst_ladspa_base_init, - NULL, - (GClassInitFunc)gst_ladspa_class_init, - NULL, - NULL, - sizeof(GstLADSPA), - 0, - (GInstanceInitFunc)gst_ladspa_init, + sizeof (GstLADSPAClass), + (GBaseInitFunc) gst_ladspa_base_init, + NULL, + (GClassInitFunc) gst_ladspa_class_init, + NULL, + NULL, + sizeof (GstLADSPA), + 0, + (GInstanceInitFunc) gst_ladspa_init, }; GType type; /* walk through all the plugins in this pluginlibrary */ i = 0; - while ((desc = pfDescriptorFunction(i++))) { + while ((desc = pfDescriptorFunction (i++))) { gchar *type_name; /* construct the type */ - type_name = g_strdup_printf("ladspa-%s",desc->Label); + type_name = g_strdup_printf ("ladspa-%s", desc->Label); g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); /* if it's already registered, drop it */ - if (g_type_from_name(type_name)) { - g_free(type_name); + if (g_type_from_name (type_name)) { + g_free (type_name); continue; } /* base-init temp alloc */ - g_hash_table_insert(ladspa_descriptors, - GINT_TO_POINTER(0), - (gpointer)desc); + g_hash_table_insert (ladspa_descriptors, + GINT_TO_POINTER (0), (gpointer) desc); /* create the type now */ - type = g_type_register_static(GST_TYPE_ELEMENT, type_name, &typeinfo, 0); + type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); if (!gst_element_register (ladspa_plugin, type_name, GST_RANK_NONE, type)) continue; /* add this plugin to the hash */ - g_hash_table_insert(ladspa_descriptors, - GINT_TO_POINTER(type), - (gpointer)desc); + g_hash_table_insert (ladspa_descriptors, + GINT_TO_POINTER (type), (gpointer) desc); } g_hash_table_remove (ladspa_descriptors, GINT_TO_POINTER (0)); } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (ladspa_debug, "ladspa", - GST_DEBUG_FG_GREEN | GST_DEBUG_BG_BLACK | GST_DEBUG_BOLD, - "LADSPA"); + GST_DEBUG_FG_GREEN | GST_DEBUG_BG_BLACK | GST_DEBUG_BOLD, "LADSPA"); - ladspa_descriptors = g_hash_table_new(NULL,NULL); - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + ladspa_descriptors = g_hash_table_new (NULL, NULL); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); ladspa_plugin = plugin; - LADSPAPluginSearch(ladspa_describe_plugin); + LADSPAPluginSearch (ladspa_describe_plugin); /* initialize dparam support library */ - gst_control_init(NULL,NULL); - + gst_control_init (NULL, NULL); + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "ladspa", - "All LADSPA plugins", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "ladspa", + "All LADSPA plugins", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/ext/ladspa/gstladspa.h b/ext/ladspa/gstladspa.h index f3556f74..b40cd145 100644 --- a/ext/ladspa/gstladspa.h +++ b/ext/ladspa/gstladspa.h @@ -31,62 +31,60 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ -typedef struct _ladspa_control_info { - gchar *name; - gchar *param_name; - gfloat lowerbound, upperbound; - gfloat def; - gboolean lower,upper,samplerate; - gboolean toggled, logarithmic, integer, writable; -} ladspa_control_info; + typedef struct _ladspa_control_info + { + gchar *name; + gchar *param_name; + gfloat lowerbound, upperbound; + gfloat def; + gboolean lower, upper, samplerate; + gboolean toggled, logarithmic, integer, writable; + } ladspa_control_info; -typedef struct _GstLADSPA GstLADSPA; -typedef struct _GstLADSPAClass GstLADSPAClass; + typedef struct _GstLADSPA GstLADSPA; + typedef struct _GstLADSPAClass GstLADSPAClass; -struct _GstLADSPA { - GstElement element; + struct _GstLADSPA + { + GstElement element; - LADSPA_Descriptor *descriptor; - LADSPA_Handle *handle; + LADSPA_Descriptor *descriptor; + LADSPA_Handle *handle; - GstDParamManager *dpman; + GstDParamManager *dpman; - gfloat *controls; - - GstPad **sinkpads, - **srcpads; + gfloat *controls; - gboolean activated; + GstPad **sinkpads, **srcpads; - gint samplerate, buffer_frames; - gint64 timestamp; - gboolean inplace_broken; -}; + gboolean activated; -struct _GstLADSPAClass { - GstElementClass parent_class; + gint samplerate, buffer_frames; + gint64 timestamp; + gboolean inplace_broken; + }; - LADSPA_Descriptor *descriptor; + struct _GstLADSPAClass + { + GstElementClass parent_class; - gint numports, - numsinkpads, - numsrcpads, - numcontrols; + LADSPA_Descriptor *descriptor; - gint *sinkpad_portnums, - *srcpad_portnums, - *control_portnums; + gint numports, numsinkpads, numsrcpads, numcontrols; - ladspa_control_info *control_info; -}; + gint *sinkpad_portnums, *srcpad_portnums, *control_portnums; + + ladspa_control_info *control_info; + }; #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_LADSPA_H__ */ +#endif /* __GST_LADSPA_H__ */ diff --git a/ext/ladspa/load.c b/ext/ladspa/load.c index bf52eb1f..98337f58 100644 --- a/ext/ladspa/load.c +++ b/ext/ladspa/load.c @@ -26,18 +26,19 @@ not an absolute path (i.e. does not begin with / character), this routine will search the LADSPA_PATH for the file. */ static void * -dlopenLADSPA(const char * pcFilename, int iFlag) { +dlopenLADSPA (const char *pcFilename, int iFlag) +{ - char * pcBuffer; - const char * pcEnd; - const char * pcLADSPAPath; - const char * pcStart; + char *pcBuffer; + const char *pcEnd; + const char *pcLADSPAPath; + const char *pcStart; int iEndsInSO; int iNeedSlash; size_t iFilenameLength; - void * pvResult; + void *pvResult; - iFilenameLength = strlen(pcFilename); + iFilenameLength = strlen (pcFilename); pvResult = NULL; if (pcFilename[0] == '/') { @@ -45,12 +46,11 @@ dlopenLADSPA(const char * pcFilename, int iFlag) { /* The filename is absolute. Assume the user knows what he/she is doing and simply dlopen() it. */ - pvResult = dlopen(pcFilename, iFlag); + pvResult = dlopen (pcFilename, iFlag); if (pvResult != NULL) return pvResult; - } - else { + } else { /* If the filename is not absolute then we wish to check along the LADSPA_PATH path to see if we can find the file there. We do @@ -63,8 +63,8 @@ dlopenLADSPA(const char * pcFilename, int iFlag) { */ pcLADSPAPath = g_strdup_printf ("%s:/usr/lib/ladspa:/usr/local/lib/ladspa", - getenv("LADSPA_PATH")); - + getenv ("LADSPA_PATH")); + if (pcLADSPAPath) { pcStart = pcLADSPAPath; @@ -72,24 +72,24 @@ dlopenLADSPA(const char * pcFilename, int iFlag) { pcEnd = pcStart; while (*pcEnd != ':' && *pcEnd != '\0') pcEnd++; - - pcBuffer = malloc(iFilenameLength + 2 + (pcEnd - pcStart)); + + pcBuffer = malloc (iFilenameLength + 2 + (pcEnd - pcStart)); if (pcEnd > pcStart) - strncpy(pcBuffer, pcStart, pcEnd - pcStart); + strncpy (pcBuffer, pcStart, pcEnd - pcStart); iNeedSlash = 0; if (pcEnd > pcStart) if (*(pcEnd - 1) != '/') { iNeedSlash = 1; pcBuffer[pcEnd - pcStart] = '/'; } - strcpy(pcBuffer + iNeedSlash + (pcEnd - pcStart), pcFilename); - - pvResult = dlopen(pcBuffer, iFlag); - + strcpy (pcBuffer + iNeedSlash + (pcEnd - pcStart), pcFilename); + + pvResult = dlopen (pcBuffer, iFlag); + free (pcBuffer); if (pvResult != NULL) return pvResult; - + pcStart = pcEnd; if (*pcStart == ':') pcStart++; @@ -101,13 +101,13 @@ dlopenLADSPA(const char * pcFilename, int iFlag) { ".so". In this case, add this suffix and recurse. */ iEndsInSO = 0; if (iFilenameLength > 3) - iEndsInSO = (strcmp(pcFilename + iFilenameLength - 3, ".so") == 0); + iEndsInSO = (strcmp (pcFilename + iFilenameLength - 3, ".so") == 0); if (!iEndsInSO) { - pcBuffer = malloc(iFilenameLength + 4); - strcpy(pcBuffer, pcFilename); - strcat(pcBuffer, ".so"); - pvResult = dlopenLADSPA(pcBuffer, iFlag); - free(pcBuffer); + pcBuffer = malloc (iFilenameLength + 4); + strcpy (pcBuffer, pcFilename); + strcat (pcBuffer, ".so"); + pvResult = dlopenLADSPA (pcBuffer, iFlag); + free (pcBuffer); } if (pvResult != NULL) @@ -120,23 +120,22 @@ dlopenLADSPA(const char * pcFilename, int iFlag) { will be kept when multiple calls are made to dlopen(). We've covered the former case - now we can handle the latter by calling dlopen() again here. */ - return dlopen(pcFilename, iFlag); + return dlopen (pcFilename, iFlag); } /*****************************************************************************/ void * -loadLADSPAPluginLibrary(const char * pcPluginFilename) { +loadLADSPAPluginLibrary (const char *pcPluginFilename) +{ - void * pvPluginHandle; + void *pvPluginHandle; - pvPluginHandle = dlopenLADSPA(pcPluginFilename, RTLD_NOW); + pvPluginHandle = dlopenLADSPA (pcPluginFilename, RTLD_NOW); if (!pvPluginHandle) { - fprintf(stderr, - "Failed to load plugin \"%s\": %s\n", - pcPluginFilename, - dlerror()); - exit(1); + fprintf (stderr, + "Failed to load plugin \"%s\": %s\n", pcPluginFilename, dlerror ()); + exit (1); } return pvPluginHandle; @@ -144,49 +143,49 @@ loadLADSPAPluginLibrary(const char * pcPluginFilename) { /*****************************************************************************/ -void -unloadLADSPAPluginLibrary(void * pvLADSPAPluginLibrary) { - dlclose(pvLADSPAPluginLibrary); +void +unloadLADSPAPluginLibrary (void *pvLADSPAPluginLibrary) +{ + dlclose (pvLADSPAPluginLibrary); } /*****************************************************************************/ const LADSPA_Descriptor * -findLADSPAPluginDescriptor(void * pvLADSPAPluginLibrary, - const char * pcPluginLibraryFilename, - const char * pcPluginLabel) { +findLADSPAPluginDescriptor (void *pvLADSPAPluginLibrary, + const char *pcPluginLibraryFilename, const char *pcPluginLabel) +{ - const LADSPA_Descriptor * psDescriptor; + const LADSPA_Descriptor *psDescriptor; LADSPA_Descriptor_Function pfDescriptorFunction; unsigned long lPluginIndex; - dlerror(); - pfDescriptorFunction - = (LADSPA_Descriptor_Function)dlsym(pvLADSPAPluginLibrary, - "ladspa_descriptor"); + dlerror (); + pfDescriptorFunction + = (LADSPA_Descriptor_Function) dlsym (pvLADSPAPluginLibrary, + "ladspa_descriptor"); if (!pfDescriptorFunction) { - const char * pcError = dlerror(); + const char *pcError = dlerror (); + if (pcError) { - fprintf(stderr, - "Unable to find ladspa_descriptor() function in plugin " - "library file \"%s\": %s.\n" - "Are you sure this is a LADSPA plugin file?\n", - pcPluginLibraryFilename, - pcError); - exit(1); + fprintf (stderr, + "Unable to find ladspa_descriptor() function in plugin " + "library file \"%s\": %s.\n" + "Are you sure this is a LADSPA plugin file?\n", + pcPluginLibraryFilename, pcError); + exit (1); } } for (lPluginIndex = 0;; lPluginIndex++) { - psDescriptor = pfDescriptorFunction(lPluginIndex); + psDescriptor = pfDescriptorFunction (lPluginIndex); if (psDescriptor == NULL) { - fprintf(stderr, - "Unable to find label \"%s\" in plugin library file \"%s\".\n", - pcPluginLabel, - pcPluginLibraryFilename); - exit(1); + fprintf (stderr, + "Unable to find label \"%s\" in plugin library file \"%s\".\n", + pcPluginLabel, pcPluginLibraryFilename); + exit (1); } - if (strcmp(psDescriptor->Label, pcPluginLabel) == 0) + if (strcmp (psDescriptor->Label, pcPluginLabel) == 0) return psDescriptor; } } diff --git a/ext/ladspa/search.c b/ext/ladspa/search.c index 08b28d12..0f690275 100644 --- a/ext/ladspa/search.c +++ b/ext/ladspa/search.c @@ -27,19 +27,20 @@ /* Search just the one directory. */ static void -LADSPADirectoryPluginSearch -(const char * pcDirectory, - LADSPAPluginSearchCallbackFunction fCallbackFunction) { + LADSPADirectoryPluginSearch + (const char *pcDirectory, + LADSPAPluginSearchCallbackFunction fCallbackFunction) +{ - char * pcFilename; - DIR * psDirectory; + char *pcFilename; + DIR *psDirectory; LADSPA_Descriptor_Function fDescriptorFunction; long lDirLength; long iNeedSlash; - struct dirent * psDirectoryEntry; - void * pvPluginHandle; + struct dirent *psDirectoryEntry; + void *pvPluginHandle; - lDirLength = strlen(pcDirectory); + lDirLength = strlen (pcDirectory); if (!lDirLength) return; if (pcDirectory[lDirLength - 1] == '/') @@ -47,66 +48,63 @@ LADSPADirectoryPluginSearch else iNeedSlash = 1; - psDirectory = opendir(pcDirectory); + psDirectory = opendir (pcDirectory); if (!psDirectory) return; while (1) { - psDirectoryEntry = readdir(psDirectory); + psDirectoryEntry = readdir (psDirectory); if (!psDirectoryEntry) { - closedir(psDirectory); + closedir (psDirectory); return; } - pcFilename = malloc(lDirLength - + strlen(psDirectoryEntry->d_name) - + 1 + iNeedSlash); - strcpy(pcFilename, pcDirectory); + pcFilename = malloc (lDirLength + strlen (psDirectoryEntry->d_name) + + 1 + iNeedSlash); + strcpy (pcFilename, pcDirectory); if (iNeedSlash) - strcat(pcFilename, "/"); - strcat(pcFilename, psDirectoryEntry->d_name); - - pvPluginHandle = dlopen(pcFilename, RTLD_LAZY); + strcat (pcFilename, "/"); + strcat (pcFilename, psDirectoryEntry->d_name); + + pvPluginHandle = dlopen (pcFilename, RTLD_LAZY); if (pvPluginHandle) { /* This is a file and the file is a shared library! */ - dlerror(); + dlerror (); fDescriptorFunction - = (LADSPA_Descriptor_Function)dlsym(pvPluginHandle, - "ladspa_descriptor"); - if (dlerror() == NULL && fDescriptorFunction) { + = (LADSPA_Descriptor_Function) dlsym (pvPluginHandle, + "ladspa_descriptor"); + if (dlerror () == NULL && fDescriptorFunction) { /* We've successfully found a ladspa_descriptor function. Pass - it to the callback function. */ - fCallbackFunction(pcFilename, - pvPluginHandle, - fDescriptorFunction); - } - else { + it to the callback function. */ + fCallbackFunction (pcFilename, pvPluginHandle, fDescriptorFunction); + } else { /* It was a library, but not a LADSPA one. Unload it. */ - dlclose(pcFilename); + dlclose (pcFilename); } } - free(pcFilename); + free (pcFilename); } } /*****************************************************************************/ -void -LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction) { +void +LADSPAPluginSearch (LADSPAPluginSearchCallbackFunction fCallbackFunction) +{ - char * pcBuffer; - const char * pcEnd; - const char * pcLADSPAPath; - const char * pcStart; + char *pcBuffer; + const char *pcEnd; + const char *pcLADSPAPath; + const char *pcStart; /* thomasvs: I'm sorry, but I'm going to add glib stuff here. - * I'm appending logical values for LADSPA_PATH here - */ + * I'm appending logical values for LADSPA_PATH here + */ pcLADSPAPath = g_strdup_printf ("%s:/usr/lib/ladspa:/usr/local/lib/ladspa", - getenv("LADSPA_PATH")); + getenv ("LADSPA_PATH")); if (!pcLADSPAPath) { /* fprintf(stderr, */ @@ -114,20 +112,20 @@ LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction) { /* "environment variable set.\n"); */ return; } - + pcStart = pcLADSPAPath; while (*pcStart != '\0') { pcEnd = pcStart; while (*pcEnd != ':' && *pcEnd != '\0') pcEnd++; - - pcBuffer = malloc(1 + pcEnd - pcStart); + + pcBuffer = malloc (1 + pcEnd - pcStart); if (pcEnd > pcStart) - strncpy(pcBuffer, pcStart, pcEnd - pcStart); + strncpy (pcBuffer, pcStart, pcEnd - pcStart); pcBuffer[pcEnd - pcStart] = '\0'; - - LADSPADirectoryPluginSearch(pcBuffer, fCallbackFunction); - free(pcBuffer); + + LADSPADirectoryPluginSearch (pcBuffer, fCallbackFunction); + free (pcBuffer); pcStart = pcEnd; if (*pcStart == ':') diff --git a/ext/ladspa/utils.h b/ext/ladspa/utils.h index d470eb0d..7a22b50b 100644 --- a/ext/ladspa/utils.h +++ b/ext/ladspa/utils.h @@ -20,20 +20,19 @@ unloadLADSPAPluginLibrary(). Errors are handled by writing a message to stderr and calling exit(1). It is alright (although inefficient) to call this more than once for the same file. */ -void * loadLADSPAPluginLibrary(const char * pcPluginFilename); +void *loadLADSPAPluginLibrary (const char *pcPluginFilename); /* This function unloads a LADSPA plugin library. */ -void unloadLADSPAPluginLibrary(void * pvLADSPAPluginLibrary); +void unloadLADSPAPluginLibrary (void *pvLADSPAPluginLibrary); /* This function locates a LADSPA plugin within a plugin library loaded with loadLADSPAPluginLibrary(). Errors are handled by writing a message to stderr and calling exit(1). Note that the plugin library filename is only included to help provide informative error messages. */ -const LADSPA_Descriptor * -findLADSPAPluginDescriptor(void * pvLADSPAPluginLibrary, - const char * pcPluginLibraryFilename, - const char * pcPluginLabel); +const LADSPA_Descriptor *findLADSPAPluginDescriptor (void + *pvLADSPAPluginLibrary, const char *pcPluginLibraryFilename, + const char *pcPluginLabel); /*****************************************************************************/ @@ -44,16 +43,15 @@ findLADSPAPluginDescriptor(void * pvLADSPAPluginLibrary, style) and a LADSPA_DescriptorFunction (from which LADSPA_Descriptors can be acquired). */ typedef void LADSPAPluginSearchCallbackFunction -(const char * pcFullFilename, - void * pvPluginHandle, - LADSPA_Descriptor_Function fDescriptorFunction); + (const char *pcFullFilename, + void *pvPluginHandle, LADSPA_Descriptor_Function fDescriptorFunction); /* Search through the $(LADSPA_PATH) (or a default path) for any LADSPA plugin libraries. Each plugin library is tested using dlopen() and dlsym(,"ladspa_descriptor"). After loading each library, the callback function is called to process it. This function leaves items passed to the callback function open. */ -void LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction); +void LADSPAPluginSearch (LADSPAPluginSearchCallbackFunction fCallbackFunction); /*****************************************************************************/ diff --git a/ext/libcaca/gstcacasink.c b/ext/libcaca/gstcacasink.c index e45677d4..4cb64e4b 100644 --- a/ext/libcaca/gstcacasink.c +++ b/ext/libcaca/gstcacasink.c @@ -36,12 +36,14 @@ static GstElementDetails gst_cacasink_details = { }; /* cacasink signals and args */ -enum { +enum +{ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SCREEN_WIDTH, ARG_SCREEN_HEIGHT, @@ -49,33 +51,32 @@ enum { ARG_ANTIALIASING }; -static GstStaticPadTemplate sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB_16 ";" GST_VIDEO_CAPS_RGB_15) -); +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_RGB_16 ";" GST_VIDEO_CAPS_RGB_15) + ); static void gst_cacasink_base_init (gpointer g_class); -static void gst_cacasink_class_init (GstCACASinkClass *klass); -static void gst_cacasink_init (GstCACASink *cacasink); -static void gst_cacasink_interface_init (GstImplementsInterfaceClass *klass); -static gboolean gst_cacasink_interface_supported (GstImplementsInterface *iface, - GType type); -static void gst_cacasink_navigation_init (GstNavigationInterface *iface); -static void gst_cacasink_navigation_send_event (GstNavigation *navigation, - GstStructure *structure); +static void gst_cacasink_class_init (GstCACASinkClass * klass); +static void gst_cacasink_init (GstCACASink * cacasink); +static void gst_cacasink_interface_init (GstImplementsInterfaceClass * klass); +static gboolean gst_cacasink_interface_supported (GstImplementsInterface * + iface, GType type); +static void gst_cacasink_navigation_init (GstNavigationInterface * iface); +static void gst_cacasink_navigation_send_event (GstNavigation * navigation, + GstStructure * structure); -static void gst_cacasink_chain (GstPad *pad, GstData *_data); +static void gst_cacasink_chain (GstPad * pad, GstData * _data); -static void gst_cacasink_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_cacasink_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static void gst_cacasink_dispose (GObject *object); +static void gst_cacasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cacasink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_cacasink_dispose (GObject * object); -static GstElementStateReturn gst_cacasink_change_state (GstElement *element); +static GstElementStateReturn gst_cacasink_change_state (GstElement * element); static GstElementClass *parent_class = NULL; @@ -86,17 +87,17 @@ gst_cacasink_get_type (void) if (!cacasink_type) { static const GTypeInfo cacasink_info = { - sizeof(GstCACASinkClass), + sizeof (GstCACASinkClass), gst_cacasink_base_init, NULL, (GClassInitFunc) gst_cacasink_class_init, NULL, NULL, - sizeof(GstCACASink), + sizeof (GstCACASink), 0, (GInstanceInitFunc) gst_cacasink_init, }; - + static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gst_cacasink_interface_init, NULL, @@ -109,12 +110,14 @@ gst_cacasink_get_type (void) NULL, }; - cacasink_type = g_type_register_static (GST_TYPE_VIDEOSINK, "GstCACASink", &cacasink_info, 0); - + cacasink_type = + g_type_register_static (GST_TYPE_VIDEOSINK, "GstCACASink", + &cacasink_info, 0); + g_type_add_interface_static (cacasink_type, GST_TYPE_IMPLEMENTS_INTERFACE, - &iface_info); + &iface_info); g_type_add_interface_static (cacasink_type, GST_TYPE_NAVIGATION, - &navigation_info); + &navigation_info); } return cacasink_type; } @@ -124,18 +127,20 @@ static GType gst_cacasink_dither_get_type (void) { static GType dither_type = 0; + if (!dither_type) { GEnumValue *dithers; gint n_dithers; gint i; gchar *caca_dithernames[] = { - "NONE", "ORDERED2", "ORDERED4", "ORDERED8", "RANDOM", NULL}; + "NONE", "ORDERED2", "ORDERED4", "ORDERED8", "RANDOM", NULL + }; n_dithers = 5; - - dithers = g_new0(GEnumValue, n_dithers + 1); - for (i = 0; i < n_dithers; i++){ + dithers = g_new0 (GEnumValue, n_dithers + 1); + + for (i = 0; i < n_dithers; i++) { dithers[i].value = i; dithers[i].value_name = g_strdup (caca_dithernames[i]); dithers[i].value_nick = g_strdup (caca_dithernames[i]); @@ -155,35 +160,31 @@ gst_cacasink_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details (element_class, &gst_cacasink_details); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } static void -gst_cacasink_class_init (GstCACASinkClass *klass) +gst_cacasink_class_init (GstCACASinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstVideoSinkClass *gstvs_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - gstvs_class = (GstVideoSinkClass*) klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstvs_class = (GstVideoSinkClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SCREEN_WIDTH, - g_param_spec_int("screen_width","screen_width","screen_width", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SCREEN_HEIGHT, - g_param_spec_int("screen_height","screen_height","screen_height", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DITHER, - g_param_spec_enum("dither","Dither Type","Set type of Dither", - GST_TYPE_CACADITHER, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_WIDTH, g_param_spec_int ("screen_width", "screen_width", "screen_width", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_HEIGHT, g_param_spec_int ("screen_height", "screen_height", "screen_height", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, + g_param_spec_enum ("dither", "Dither Type", "Set type of Dither", + GST_TYPE_CACADITHER, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ANTIALIASING, - g_param_spec_boolean ("anti_aliasing", "Anti-Aliasing", - "Enables Anti-Aliasing", TRUE, G_PARAM_READWRITE)); + g_param_spec_boolean ("anti_aliasing", "Anti-Aliasing", + "Enables Anti-Aliasing", TRUE, G_PARAM_READWRITE)); gobject_class->set_property = gst_cacasink_set_property; gobject_class->get_property = gst_cacasink_get_property; @@ -193,13 +194,13 @@ gst_cacasink_class_init (GstCACASinkClass *klass) } static void -gst_cacasink_interface_init (GstImplementsInterfaceClass *klass) +gst_cacasink_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_cacasink_interface_supported; } static gboolean -gst_cacasink_interface_supported (GstImplementsInterface *iface, GType type) +gst_cacasink_interface_supported (GstImplementsInterface * iface, GType type) { g_assert (type == GST_TYPE_NAVIGATION); @@ -207,31 +208,31 @@ gst_cacasink_interface_supported (GstImplementsInterface *iface, GType type) } static void -gst_cacasink_navigation_init (GstNavigationInterface *iface) +gst_cacasink_navigation_init (GstNavigationInterface * iface) { iface->send_event = gst_cacasink_navigation_send_event; } static void -gst_cacasink_navigation_send_event (GstNavigation *navigation, - GstStructure *structure) +gst_cacasink_navigation_send_event (GstNavigation * navigation, + GstStructure * structure) { GstCACASink *cacasink = GST_CACASINK (navigation); GstEvent *event; event = gst_event_new (GST_EVENT_NAVIGATION); - /*GST_EVENT_TIMESTAMP (event) = 0;*/ + /*GST_EVENT_TIMESTAMP (event) = 0; */ event->event_data.structure.structure = structure; /* FIXME * Obviously, the pointer x,y coordinates need to be adjusted by the * window size and relation to the bounding window. */ - gst_pad_send_event (gst_pad_get_peer (GST_VIDEOSINK_PAD(cacasink)), - event); + gst_pad_send_event (gst_pad_get_peer (GST_VIDEOSINK_PAD (cacasink)), event); } + static GstPadLinkReturn -gst_cacasink_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_cacasink_sinkconnect (GstPad * pad, const GstCaps * caps) { GstCACASink *cacasink; GstStructure *structure; @@ -239,67 +240,62 @@ gst_cacasink_sinkconnect (GstPad *pad, const GstCaps *caps) cacasink = GST_CACASINK (gst_pad_get_parent (pad)); /*if (!GST_CAPS_IS_FIXED (caps)) - return GST_PAD_LINK_DELAYED;*/ - + return GST_PAD_LINK_DELAYED; */ + structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", - &(GST_VIDEOSINK_WIDTH (cacasink))); + gst_structure_get_int (structure, "width", &(GST_VIDEOSINK_WIDTH (cacasink))); gst_structure_get_int (structure, "height", - &(GST_VIDEOSINK_HEIGHT (cacasink))); + &(GST_VIDEOSINK_HEIGHT (cacasink))); gst_structure_get_int (structure, "bpp", &cacasink->bpp); gst_structure_get_int (structure, "red_mask", &cacasink->red_mask); gst_structure_get_int (structure, "green_mask", &cacasink->green_mask); gst_structure_get_int (structure, "blue_mask", &cacasink->blue_mask); if (cacasink->bpp == 24) { - cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask) >> 8; + cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask) >> 8; cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask) >> 8; - cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask) >> 8; + cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask) >> 8; } else if (cacasink->bpp == 32) { - cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask); + cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask); cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask); - cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask); + cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask); } else if (cacasink->bpp == 16 || cacasink->bpp == 15) { - cacasink->red_mask = GUINT16_FROM_BE (cacasink->red_mask); + cacasink->red_mask = GUINT16_FROM_BE (cacasink->red_mask); cacasink->green_mask = GUINT16_FROM_BE (cacasink->green_mask); - cacasink->blue_mask = GUINT16_FROM_BE (cacasink->blue_mask); + cacasink->blue_mask = GUINT16_FROM_BE (cacasink->blue_mask); } if (cacasink->bitmap) { caca_free_bitmap (cacasink->bitmap); } - cacasink->bitmap = caca_create_bitmap ( - cacasink->bpp, - GST_VIDEOSINK_WIDTH (cacasink), - GST_VIDEOSINK_HEIGHT (cacasink), - GST_VIDEOSINK_WIDTH (cacasink) * cacasink->bpp/8, - cacasink->red_mask, - cacasink->green_mask, - cacasink->blue_mask, - 0); + cacasink->bitmap = caca_create_bitmap (cacasink->bpp, + GST_VIDEOSINK_WIDTH (cacasink), + GST_VIDEOSINK_HEIGHT (cacasink), + GST_VIDEOSINK_WIDTH (cacasink) * cacasink->bpp / 8, + cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask, 0); if (!cacasink->bitmap) { - return GST_PAD_LINK_DELAYED; + return GST_PAD_LINK_DELAYED; } - + return GST_PAD_LINK_OK; } static void -gst_cacasink_init (GstCACASink *cacasink) +gst_cacasink_init (GstCACASink * cacasink) { - GST_VIDEOSINK_PAD (cacasink) = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_template), "sink"); + GST_VIDEOSINK_PAD (cacasink) = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_template), + "sink"); gst_element_add_pad (GST_ELEMENT (cacasink), GST_VIDEOSINK_PAD (cacasink)); - gst_pad_set_chain_function (GST_VIDEOSINK_PAD (cacasink), - gst_cacasink_chain); - gst_pad_set_link_function (GST_VIDEOSINK_PAD (cacasink), - gst_cacasink_sinkconnect); + gst_pad_set_chain_function (GST_VIDEOSINK_PAD (cacasink), gst_cacasink_chain); + gst_pad_set_link_function (GST_VIDEOSINK_PAD (cacasink), + gst_cacasink_sinkconnect); cacasink->screen_width = GST_CACA_DEFAULT_SCREEN_WIDTH; cacasink->screen_height = GST_CACA_DEFAULT_SCREEN_HEIGHT; @@ -318,11 +314,11 @@ gst_cacasink_init (GstCACASink *cacasink) cacasink->dither = 0; caca_set_dithering (CACA_DITHERING_NONE); - GST_FLAG_SET(cacasink, GST_ELEMENT_THREAD_SUGGESTED); + GST_FLAG_SET (cacasink, GST_ELEMENT_THREAD_SUGGESTED); } static void -gst_cacasink_chain (GstPad *pad, GstData *_data) +gst_cacasink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstCACASink *cacasink; @@ -336,14 +332,15 @@ gst_cacasink_chain (GstPad *pad, GstData *_data) cacasink = GST_CACASINK (gst_pad_get_parent (pad)); if (cacasink->id && GST_CLOCK_TIME_IS_VALID (time)) { - GST_DEBUG ("videosink: clock %s wait: %" G_GUINT64_FORMAT " %u", - GST_OBJECT_NAME (GST_VIDEOSINK_CLOCK (cacasink)), - time, GST_BUFFER_SIZE (buf)); + GST_DEBUG ("videosink: clock %s wait: %" G_GUINT64_FORMAT " %u", + GST_OBJECT_NAME (GST_VIDEOSINK_CLOCK (cacasink)), + time, GST_BUFFER_SIZE (buf)); gst_element_wait (GST_ELEMENT (cacasink), GST_BUFFER_TIMESTAMP (buf)); } caca_clear (); - caca_draw_bitmap (0, 0, cacasink->screen_width-1, cacasink->screen_height-1, cacasink->bitmap, GST_BUFFER_DATA (buf)); + caca_draw_bitmap (0, 0, cacasink->screen_width - 1, + cacasink->screen_height - 1, cacasink->bitmap, GST_BUFFER_DATA (buf)); caca_refresh (); if (GST_VIDEOSINK_CLOCK (cacasink)) { @@ -353,12 +350,12 @@ gst_cacasink_chain (GstPad *pad, GstData *_data) cacasink->correction = 0; } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_cacasink_dispose (GObject *object) +gst_cacasink_dispose (GObject * object) { GstCACASink *cacasink = GST_CACASINK (object); @@ -367,12 +364,13 @@ gst_cacasink_dispose (GObject *object) } caca_end (); - + G_OBJECT_CLASS (parent_class)->dispose (object); } static void -gst_cacasink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_cacasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstCACASink *cacasink; @@ -382,17 +380,17 @@ gst_cacasink_set_property (GObject *object, guint prop_id, const GValue *value, cacasink = GST_CACASINK (object); switch (prop_id) { - case ARG_DITHER: { + case ARG_DITHER:{ cacasink->dither = g_value_get_enum (value); caca_set_dithering (cacasink->dither + CACA_DITHERING_NONE); break; } - case ARG_ANTIALIASING: { + case ARG_ANTIALIASING:{ cacasink->antialiasing = g_value_get_boolean (value); if (cacasink->antialiasing) { caca_set_feature (CACA_ANTIALIASING_MAX); } - + else { caca_set_feature (CACA_ANTIALIASING_MIN); } @@ -404,31 +402,32 @@ gst_cacasink_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_cacasink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_cacasink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstCACASink *cacasink; /* it's not null if we got it, but it might not be ours */ - cacasink = GST_CACASINK(object); + cacasink = GST_CACASINK (object); switch (prop_id) { - case ARG_SCREEN_WIDTH: { + case ARG_SCREEN_WIDTH:{ g_value_set_int (value, cacasink->screen_width); break; } - case ARG_SCREEN_HEIGHT: { + case ARG_SCREEN_HEIGHT:{ g_value_set_int (value, cacasink->screen_height); break; } - case ARG_DITHER: { + case ARG_DITHER:{ g_value_set_enum (value, cacasink->dither); break; } - case ARG_ANTIALIASING: { + case ARG_ANTIALIASING:{ g_value_set_boolean (value, cacasink->antialiasing); break; } - default: { + default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } @@ -436,9 +435,9 @@ gst_cacasink_get_property (GObject *object, guint prop_id, GValue *value, GParam } static gboolean -gst_cacasink_open (GstCACASink *cacasink) +gst_cacasink_open (GstCACASink * cacasink) { - g_return_val_if_fail (!GST_FLAG_IS_SET (cacasink ,GST_CACASINK_OPEN), FALSE); + g_return_val_if_fail (!GST_FLAG_IS_SET (cacasink, GST_CACASINK_OPEN), FALSE); GST_FLAG_SET (cacasink, GST_CACASINK_OPEN); @@ -446,15 +445,15 @@ gst_cacasink_open (GstCACASink *cacasink) } static void -gst_cacasink_close (GstCACASink *cacasink) +gst_cacasink_close (GstCACASink * cacasink) { - g_return_if_fail (GST_FLAG_IS_SET (cacasink ,GST_CACASINK_OPEN)); + g_return_if_fail (GST_FLAG_IS_SET (cacasink, GST_CACASINK_OPEN)); GST_FLAG_UNSET (cacasink, GST_CACASINK_OPEN); } static GstElementStateReturn -gst_cacasink_change_state (GstElement *element) +gst_cacasink_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_CACASINK (element), GST_STATE_FAILURE); @@ -464,7 +463,7 @@ gst_cacasink_change_state (GstElement *element) } else { if (!GST_FLAG_IS_SET (element, GST_CACASINK_OPEN)) { if (!gst_cacasink_open (GST_CACASINK (element))) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } } @@ -475,26 +474,21 @@ gst_cacasink_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { /* Loading the library containing GstVideoSink, our parent object */ if (!gst_library_load ("gstvideo")) return FALSE; - - if (!gst_element_register (plugin, "cacasink", GST_RANK_NONE, GST_TYPE_CACASINK)) + + if (!gst_element_register (plugin, "cacasink", GST_RANK_NONE, + GST_TYPE_CACASINK)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "cacasink", - "Colored ASCII Art video sink", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "cacasink", + "Colored ASCII Art video sink", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/ext/libcaca/gstcacasink.h b/ext/libcaca/gstcacasink.h index 3a6d4f23..2080c284 100644 --- a/ext/libcaca/gstcacasink.h +++ b/ext/libcaca/gstcacasink.h @@ -28,8 +28,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_CACA_DEFAULT_SCREEN_WIDTH 80 #define GST_CACA_DEFAULT_SCREEN_HEIGHT 25 @@ -53,44 +54,47 @@ extern "C" { #define GST_IS_CACASINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CACASINK)) -typedef enum { - GST_CACASINK_OPEN = GST_ELEMENT_FLAG_LAST, + typedef enum + { + GST_CACASINK_OPEN = GST_ELEMENT_FLAG_LAST, - GST_CACASINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, -} GstCACASinkFlags; + GST_CACASINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, + } GstCACASinkFlags; -typedef struct _GstCACASink GstCACASink; -typedef struct _GstCACASinkClass GstCACASinkClass; + typedef struct _GstCACASink GstCACASink; + typedef struct _GstCACASinkClass GstCACASinkClass; -struct _GstCACASink { - GstVideoSink videosink; + struct _GstCACASink + { + GstVideoSink videosink; - GstPad *sinkpad; + GstPad *sinkpad; - gulong format; - gint screen_width, screen_height; - guint bpp; - guint dither; - gboolean antialiasing; - guint red_mask, green_mask, blue_mask; + gulong format; + gint screen_width, screen_height; + guint bpp; + guint dither; + gboolean antialiasing; + guint red_mask, green_mask, blue_mask; - gint64 correction; - GstClockID id; + gint64 correction; + GstClockID id; - struct caca_bitmap *bitmap; -}; + struct caca_bitmap *bitmap; + }; -struct _GstCACASinkClass { - GstVideoSinkClass parent_class; + struct _GstCACASinkClass + { + GstVideoSinkClass parent_class; - /* signals */ -}; + /* signals */ + }; -GType gst_cacasink_get_type(void); + GType gst_cacasink_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_CACASINKE_H__ */ +#endif /* __GST_CACASINKE_H__ */ diff --git a/ext/libpng/gstpng.c b/ext/libpng/gstpng.c index 38a492f4..dab8d9d9 100644 --- a/ext/libpng/gstpng.c +++ b/ext/libpng/gstpng.c @@ -34,13 +34,7 @@ plugin_init (GstPlugin * plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "png", - "PNG plugin library", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "png", + "PNG plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/libpng/gstpngenc.c b/ext/libpng/gstpngenc.c index 393e642c..78055cce 100644 --- a/ext/libpng/gstpngenc.c +++ b/ext/libpng/gstpngenc.c @@ -47,29 +47,32 @@ enum ARG_0 }; -static void gst_pngenc_base_init (gpointer g_class); -static void gst_pngenc_class_init (GstPngEncClass *klass); -static void gst_pngenc_init (GstPngEnc *pngenc); +static void gst_pngenc_base_init (gpointer g_class); +static void gst_pngenc_class_init (GstPngEncClass * klass); +static void gst_pngenc_init (GstPngEnc * pngenc); -static void gst_pngenc_chain (GstPad *pad, GstData *_data); +static void gst_pngenc_chain (GstPad * pad, GstData * _data); GstPadTemplate *pngenc_src_template, *pngenc_sink_template; static GstElementClass *parent_class = NULL; -static void user_error_fn (png_structp png_ptr, png_const_charp error_msg) +static void +user_error_fn (png_structp png_ptr, png_const_charp error_msg) { - g_warning("%s", error_msg); + g_warning ("%s", error_msg); } -static void user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) +static void +user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) { - g_warning("%s", warning_msg); + g_warning ("%s", warning_msg); } -GType gst_pngenc_get_type (void) +GType +gst_pngenc_get_type (void) { static GType pngenc_type = 0; @@ -87,25 +90,24 @@ GType gst_pngenc_get_type (void) }; pngenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPngEnc", - &pngenc_info, 0); + &pngenc_info, 0); } return pngenc_type; } -static GstCaps* +static GstCaps * png_caps_factory (void) { return gst_caps_new_simple ("video/x-png", - "width", GST_TYPE_INT_RANGE, 16, 4096, - "height", GST_TYPE_INT_RANGE, 16, 4096, - "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, - NULL); + "width", GST_TYPE_INT_RANGE, 16, 4096, + "height", GST_TYPE_INT_RANGE, 16, 4096, + "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, NULL); } -static GstCaps* +static GstCaps * raw_caps_factory (void) -{ +{ return gst_caps_from_string (GST_VIDEO_CAPS_RGB); } @@ -114,25 +116,23 @@ gst_pngenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstCaps *raw_caps, *png_caps; - + raw_caps = raw_caps_factory (); png_caps = png_caps_factory (); pngenc_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, - raw_caps); - + GST_PAD_ALWAYS, raw_caps); + pngenc_src_template = gst_pad_template_new ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, - png_caps); - + GST_PAD_ALWAYS, png_caps); + gst_element_class_add_pad_template (element_class, pngenc_sink_template); gst_element_class_add_pad_template (element_class, pngenc_src_template); gst_element_class_set_details (element_class, &gst_pngenc_details); } static void -gst_pngenc_class_init (GstPngEncClass *klass) +gst_pngenc_class_init (GstPngEncClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -145,7 +145,7 @@ gst_pngenc_class_init (GstPngEncClass *klass) static GstPadLinkReturn -gst_pngenc_sinklink (GstPad *pad, const GstCaps *caps) +gst_pngenc_sinklink (GstPad * pad, const GstCaps * caps) { GstPngEnc *pngenc; gdouble fps; @@ -161,8 +161,8 @@ gst_pngenc_sinklink (GstPad *pad, const GstCaps *caps) caps = gst_caps_new_simple ("video/x-png", "framerate", G_TYPE_DOUBLE, fps, - "width", G_TYPE_INT, pngenc->width, - "height", G_TYPE_INT, pngenc->height, NULL); + "width", G_TYPE_INT, pngenc->width, + "height", G_TYPE_INT, pngenc->height, NULL); return gst_pad_try_set_caps (pngenc->srcpad, caps); } @@ -184,9 +184,10 @@ gst_pngenc_init (GstPngEnc * pngenc) } -void user_flush_data (png_structp png_ptr) +void +user_flush_data (png_structp png_ptr) { -GstPngEnc *pngenc; + GstPngEnc *pngenc; pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr); @@ -194,31 +195,31 @@ GstPngEnc *pngenc; } -void user_write_data (png_structp png_ptr, png_bytep data, png_uint_32 length) +void +user_write_data (png_structp png_ptr, png_bytep data, png_uint_32 length) { GstBuffer *buffer; GstPngEnc *pngenc; pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr); - buffer = gst_buffer_new(); + buffer = gst_buffer_new (); GST_BUFFER_DATA (buffer) = g_memdup (data, length); GST_BUFFER_SIZE (buffer) = length; - if (pngenc->buffer_out) - { + if (pngenc->buffer_out) { GstBuffer *merge; + merge = gst_buffer_merge (pngenc->buffer_out, buffer); gst_buffer_unref (buffer); gst_buffer_unref (pngenc->buffer_out); pngenc->buffer_out = merge; - } - else + } else pngenc->buffer_out = buffer; } static void -gst_pngenc_chain (GstPad *pad, GstData *_data) +gst_pngenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstPngEnc *pngenc; @@ -229,56 +230,50 @@ gst_pngenc_chain (GstPad *pad, GstData *_data) pngenc = GST_PNGENC (gst_pad_get_parent (pad)); pngenc->buffer_out = NULL; - if (!GST_PAD_IS_USABLE (pngenc->srcpad)) - { + if (!GST_PAD_IS_USABLE (pngenc->srcpad)) { gst_buffer_unref (buf); return; } /* initialize png struct stuff */ pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, - (png_voidp) NULL, user_error_fn, user_warning_fn); + (png_voidp) NULL, user_error_fn, user_warning_fn); /* FIXME: better error handling */ if (pngenc->png_struct_ptr == NULL) - g_warning ("Failed to initialize png structure"); + g_warning ("Failed to initialize png structure"); pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr); - if (!pngenc->png_info_ptr) - { + if (!pngenc->png_info_ptr) { png_destroy_read_struct (&(pngenc->png_struct_ptr), (png_infopp) NULL, - (png_infopp) NULL); + (png_infopp) NULL); } /* non-0 return is from a longjmp inside of libpng */ - if (setjmp (pngenc->png_struct_ptr->jmpbuf) != 0) - { + if (setjmp (pngenc->png_struct_ptr->jmpbuf) != 0) { GST_DEBUG ("returning from longjmp"); png_destroy_write_struct (&pngenc->png_struct_ptr, &pngenc->png_info_ptr); return; } png_set_filter (pngenc->png_struct_ptr, 0, - PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE); + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE); png_set_compression_level (pngenc->png_struct_ptr, 9); - png_set_IHDR( - pngenc->png_struct_ptr, - pngenc->png_info_ptr, - pngenc->width, - pngenc->height, - pngenc->bpp / 3, - PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT - ); + png_set_IHDR (pngenc->png_struct_ptr, + pngenc->png_info_ptr, + pngenc->width, + pngenc->height, + pngenc->bpp / 3, + PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_write_fn (pngenc->png_struct_ptr, pngenc, - (png_rw_ptr) user_write_data, user_flush_data); + (png_rw_ptr) user_write_data, user_flush_data); for (row_index = 0; row_index < pngenc->height; row_index++) row_pointers[row_index] = GST_BUFFER_DATA (buf) + - (pngenc->width * row_index * pngenc->bpp / 8); + (pngenc->width * row_index * pngenc->bpp / 8); png_write_info (pngenc->png_struct_ptr, pngenc->png_info_ptr); png_write_image (pngenc->png_struct_ptr, row_pointers); diff --git a/ext/libpng/gstpngenc.h b/ext/libpng/gstpngenc.h index 59bc4ab4..1c521260 100644 --- a/ext/libpng/gstpngenc.h +++ b/ext/libpng/gstpngenc.h @@ -25,8 +25,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_PNGENC (gst_pngenc_get_type()) @@ -35,37 +36,37 @@ extern "C" { #define GST_IS_PNGENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNGENC)) #define GST_IS_PNGENC_CLASS(obj)(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNGENC)) -typedef struct _GstPngEnc GstPngEnc; -typedef struct _GstPngEncClass GstPngEncClass; + typedef struct _GstPngEnc GstPngEnc; + typedef struct _GstPngEncClass GstPngEncClass; -extern GstPadTemplate *pngenc_src_template, *pngenc_sink_template; + extern GstPadTemplate *pngenc_src_template, *pngenc_sink_template; -struct _GstPngEnc -{ - GstElement element; + struct _GstPngEnc + { + GstElement element; - GstPad *sinkpad, *srcpad; - GstBuffer *buffer_out; + GstPad *sinkpad, *srcpad; + GstBuffer *buffer_out; - png_structp png_struct_ptr; - png_infop png_info_ptr; + png_structp png_struct_ptr; + png_infop png_info_ptr; - gint width; - gint height; - gint bpp; -}; + gint width; + gint height; + gint bpp; + }; -struct _GstPngEncClass -{ - GstElementClass parent_class; -}; + struct _GstPngEncClass + { + GstElementClass parent_class; + }; -GType gst_pngenc_get_type(void); + GType gst_pngenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_PNGENC_H__ */ +#endif /* __GST_PNGENC_H__ */ diff --git a/ext/mikmod/drv_gst.c b/ext/mikmod/drv_gst.c index 83d475ba..2d7b8e6e 100644 --- a/ext/mikmod/drv_gst.c +++ b/ext/mikmod/drv_gst.c @@ -10,94 +10,96 @@ static int buffer_size; static SBYTE *audiobuffer = NULL; extern int need_sync; -static BOOL mikmod_IsThere( void ) +static BOOL +mikmod_IsThere (void) { return 1; } -static BOOL mikmod_Init( void ) +static BOOL +mikmod_Init (void) { buffer_size = 32768; - if (!( audiobuffer = ( SBYTE * ) g_malloc( buffer_size ) )) + if (!(audiobuffer = (SBYTE *) g_malloc (buffer_size))) return 1; - - return VC_Init(); + + return VC_Init (); } -static void mikmod_Exit( void ) +static void +mikmod_Exit (void) { - VC_Exit(); + VC_Exit (); - if ( audiobuffer ) - { - g_free(audiobuffer); + if (audiobuffer) { + g_free (audiobuffer); audiobuffer = NULL; - } + } } -static void mikmod_Update( void ) +static void +mikmod_Update (void) { gint length; GstBuffer *outdata; - length = VC_WriteBytes((SBYTE *) audiobuffer, buffer_size); - - outdata = gst_buffer_new(); + length = VC_WriteBytes ((SBYTE *) audiobuffer, buffer_size); + + outdata = gst_buffer_new (); - GST_BUFFER_DATA( outdata ) = g_memdup( audiobuffer, length ); - GST_BUFFER_SIZE( outdata ) = length; + GST_BUFFER_DATA (outdata) = g_memdup (audiobuffer, length); + GST_BUFFER_SIZE (outdata) = length; - GST_BUFFER_TIMESTAMP( outdata ) = timestamp; + GST_BUFFER_TIMESTAMP (outdata) = timestamp; - if ( need_sync == 1 ) - { + if (need_sync == 1) { /* FIXME, send a flush event or something */ - need_sync = 0 ; + need_sync = 0; } - gst_pad_push( srcpad, GST_DATA (outdata )); - + gst_pad_push (srcpad, GST_DATA (outdata)); + } -static BOOL mikmod_Reset( void ) +static BOOL +mikmod_Reset (void) { - VC_Exit(); - return VC_Init(); + VC_Exit (); + return VC_Init (); } -MDRIVER drv_gst = -{ - NULL, - "mikmod", - "mikmod output driver v1.0", - 0, 255, +MDRIVER drv_gst = { + NULL, + "mikmod", + "mikmod output driver v1.0", + 0, 255, #if (LIBMIKMOD_VERSION > 0x030106) - "mikmod", - NULL, + "mikmod", + NULL, #endif - mikmod_IsThere, - VC_SampleLoad, - VC_SampleUnload, - VC_SampleSpace, - VC_SampleLength, - mikmod_Init, - mikmod_Exit, - mikmod_Reset, - VC_SetNumVoices, - VC_PlayStart, - VC_PlayStop, - mikmod_Update, - NULL, - VC_VoiceSetVolume, - VC_VoiceGetVolume, - VC_VoiceSetFrequency, - VC_VoiceGetFrequency, - VC_VoiceSetPanning, - VC_VoiceGetPanning, - VC_VoicePlay, - VC_VoiceStop, - VC_VoiceStopped, - VC_VoiceGetPosition, - VC_VoiceRealVolume + mikmod_IsThere, + VC_SampleLoad, + VC_SampleUnload, + VC_SampleSpace, + VC_SampleLength, + mikmod_Init, + mikmod_Exit, + mikmod_Reset, + VC_SetNumVoices, + VC_PlayStart, + VC_PlayStop, + mikmod_Update, + NULL, + VC_VoiceSetVolume, + VC_VoiceGetVolume, + VC_VoiceSetFrequency, + VC_VoiceGetFrequency, + VC_VoiceSetPanning, + VC_VoiceGetPanning, + VC_VoicePlay, + VC_VoiceStop, + VC_VoiceStopped, + VC_VoiceGetPosition, + VC_VoiceRealVolume }; diff --git a/ext/mikmod/gstmikmod.c b/ext/mikmod/gstmikmod.c index f8a6a4e8..89e057c1 100644 --- a/ext/mikmod/gstmikmod.c +++ b/ext/mikmod/gstmikmod.c @@ -34,12 +34,14 @@ GstElementDetails mikmod_details = { /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SONGNAME, ARG_MODTYPE, @@ -62,68 +64,67 @@ GstPad *srcpad; GstClockTime timestamp; int need_sync; -static GstStaticPadTemplate mikmod_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", +static GstStaticPadTemplate mikmod_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " + GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) { 8000, 11025, 22050, 44100 }, " "channels = (int) [ 1, 2 ]; " - "audio/x-raw-int, " + "audio/x-raw-int, " "signed = (boolean) FALSE, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) { 8000, 11025, 22050, 44100 }, " - "channels = (int) [ 1, 2 ]" - ) -); + "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate mikmod_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mod") -); + ); -static void gst_mikmod_base_init (gpointer g_class); -static void gst_mikmod_class_init (GstMikModClass *klass); -static void gst_mikmod_init (GstMikMod *filter); -static void gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamSpec *pspec ); -static void gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *pspec ); -static GstPadLinkReturn gst_mikmod_srclink (GstPad *pad, const GstCaps *caps); -static GstCaps * gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps); -static void gst_mikmod_loop (GstElement *element); -static gboolean gst_mikmod_setup (GstMikMod *mikmod); -static GstElementStateReturn gst_mikmod_change_state (GstElement *element); +static void gst_mikmod_base_init (gpointer g_class); +static void gst_mikmod_class_init (GstMikModClass * klass); +static void gst_mikmod_init (GstMikMod * filter); +static void gst_mikmod_set_property (GObject * object, guint id, + const GValue * value, GParamSpec * pspec); +static void gst_mikmod_get_property (GObject * object, guint id, GValue * value, + GParamSpec * pspec); +static GstPadLinkReturn gst_mikmod_srclink (GstPad * pad, const GstCaps * caps); +static GstCaps *gst_mikmod_srcfixate (GstPad * pad, const GstCaps * caps); +static void gst_mikmod_loop (GstElement * element); +static gboolean gst_mikmod_setup (GstMikMod * mikmod); +static GstElementStateReturn gst_mikmod_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_mikmod_get_type(void) { +gst_mikmod_get_type (void) +{ static GType mikmod_type = 0; if (!mikmod_type) { static const GTypeInfo mikmod_info = { - sizeof(GstMikModClass), + sizeof (GstMikModClass), gst_mikmod_base_init, NULL, - (GClassInitFunc)gst_mikmod_class_init, + (GClassInitFunc) gst_mikmod_class_init, NULL, NULL, - sizeof(GstMikMod), + sizeof (GstMikMod), 0, - (GInstanceInitFunc)gst_mikmod_init, + (GInstanceInitFunc) gst_mikmod_init, }; - mikmod_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMikmod", &mikmod_info, 0); + mikmod_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMikmod", &mikmod_info, 0); } return mikmod_type; } @@ -141,58 +142,58 @@ gst_mikmod_base_init (gpointer g_class) } static void -gst_mikmod_class_init (GstMikModClass *klass) +gst_mikmod_class_init (GstMikModClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SONGNAME, - g_param_spec_string("songname","songname","songname", - NULL, G_PARAM_READABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MODTYPE, - g_param_spec_string("modtype", "modtype", "modtype", - NULL, G_PARAM_READABLE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MUSICVOLUME, - g_param_spec_int("musicvolume", "musivolume", "musicvolume", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_PANSEP, - g_param_spec_int("pansep", "pansep", "pansep", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_REVERB, - g_param_spec_int("reverb", "reverb", "reverb", - 0, 15, 0, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SNDFXVOLUME, - g_param_spec_int("sndfxvolume", "sndfxvolume", "sndfxvolume", - 0, 128, 128, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VOLUME, - g_param_spec_int("volume", "volume", "volume", - 0, 128, 96, G_PARAM_READWRITE )); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_INTERP, - g_param_spec_boolean("interp", "interp", "interp", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_REVERSE, - g_param_spec_boolean("reverse", "reverse", "reverse", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SURROUND, - g_param_spec_boolean("surround", "surround", "surround", - TRUE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HQMIXER, - g_param_spec_boolean("hqmixer", "hqmixer", "hqmixer", - FALSE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SOFT_MUSIC, - g_param_spec_boolean("soft_music", "soft_music", "soft_music", - TRUE, G_PARAM_READWRITE )); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SOFT_SNDFX, - g_param_spec_boolean("soft_sndfx", "soft_sndfx", "soft_sndfx", - TRUE, G_PARAM_READWRITE )); - - + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SONGNAME, + g_param_spec_string ("songname", "songname", "songname", + NULL, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODTYPE, + g_param_spec_string ("modtype", "modtype", "modtype", + NULL, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUSICVOLUME, + g_param_spec_int ("musicvolume", "musivolume", "musicvolume", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PANSEP, + g_param_spec_int ("pansep", "pansep", "pansep", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_REVERB, + g_param_spec_int ("reverb", "reverb", "reverb", + 0, 15, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SNDFXVOLUME, + g_param_spec_int ("sndfxvolume", "sndfxvolume", "sndfxvolume", + 0, 128, 128, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VOLUME, + g_param_spec_int ("volume", "volume", "volume", + 0, 128, 96, G_PARAM_READWRITE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_INTERP, + g_param_spec_boolean ("interp", "interp", "interp", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_REVERSE, + g_param_spec_boolean ("reverse", "reverse", "reverse", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SURROUND, + g_param_spec_boolean ("surround", "surround", "surround", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HQMIXER, + g_param_spec_boolean ("hqmixer", "hqmixer", "hqmixer", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SOFT_MUSIC, + g_param_spec_boolean ("soft_music", "soft_music", "soft_music", + TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SOFT_SNDFX, + g_param_spec_boolean ("soft_sndfx", "soft_sndfx", "soft_sndfx", + TRUE, G_PARAM_READWRITE)); + + gobject_class->set_property = gst_mikmod_set_property; gobject_class->get_property = gst_mikmod_get_property; @@ -201,52 +202,54 @@ gst_mikmod_class_init (GstMikModClass *klass) static void -gst_mikmod_init (GstMikMod *filter) -{ - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mikmod_sink_factory),"sink"); - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mikmod_src_factory),"src"); - - gst_element_add_pad(GST_ELEMENT(filter),filter->sinkpad); - gst_element_add_pad(GST_ELEMENT(filter),filter->srcpad); +gst_mikmod_init (GstMikMod * filter) +{ + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mikmod_sink_factory), "sink"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mikmod_src_factory), "src"); + + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); gst_pad_set_link_function (filter->srcpad, gst_mikmod_srclink); gst_pad_set_fixate_function (filter->srcpad, gst_mikmod_srcfixate); - + gst_element_set_loop_function (GST_ELEMENT (filter), gst_mikmod_loop); - + filter->Buffer = NULL; - filter->stereo = TRUE; - filter->surround = TRUE; - filter->_16bit = TRUE; - filter->soft_music = TRUE; - filter->soft_sndfx = TRUE; - filter->mixfreq = 44100; - filter->reverb = 0; - filter->pansep = 128; + filter->stereo = TRUE; + filter->surround = TRUE; + filter->_16bit = TRUE; + filter->soft_music = TRUE; + filter->soft_sndfx = TRUE; + filter->mixfreq = 44100; + filter->reverb = 0; + filter->pansep = 128; filter->musicvolume = 128; - filter->volume = 96; + filter->volume = 96; filter->sndfxvolume = 128; - filter->songname = NULL; - filter->modtype = NULL; - + filter->songname = NULL; + filter->modtype = NULL; + filter->initialized = FALSE; } static GstCaps * -gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps) +gst_mikmod_srcfixate (GstPad * pad, const GstCaps * caps) { GstCaps *ret; GstStructure *structure; - + /* FIXME: select est caps here */ if (gst_caps_get_size (caps) > 1) return NULL; ret = gst_caps_copy (caps); structure = gst_caps_get_structure (ret, 0); - + if (gst_caps_structure_fixate_field_nearest_int (structure, "channels", 2)) return ret; if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", 44100)) @@ -257,9 +260,9 @@ gst_mikmod_srcfixate (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_mikmod_srclink (GstPad *pad, const GstCaps *caps) +gst_mikmod_srclink (GstPad * pad, const GstCaps * caps) { - GstMikMod *filter; + GstMikMod *filter; GstStructure *structure; gint depth; gint channels; @@ -273,68 +276,69 @@ gst_mikmod_srclink (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "channels", &channels); filter->stereo = (channels == 2); gst_structure_get_int (structure, "rate", &filter->mixfreq); - + return gst_mikmod_setup (filter) ? GST_PAD_LINK_OK : GST_PAD_LINK_REFUSED; } static void -gst_mikmod_loop (GstElement *element) +gst_mikmod_loop (GstElement * element) { GstMikMod *mikmod; GstBuffer *buffer_in; g_return_if_fail (element != NULL); g_return_if_fail (GST_IS_MIKMOD (element)); - + mikmod = GST_MIKMOD (element); srcpad = mikmod->srcpad; mikmod->Buffer = NULL; - + if (!mikmod->initialized) { - while ((buffer_in = GST_BUFFER (gst_pad_pull( mikmod->sinkpad )))) { - if ( GST_IS_EVENT (buffer_in) ) { + while ((buffer_in = GST_BUFFER (gst_pad_pull (mikmod->sinkpad)))) { + if (GST_IS_EVENT (buffer_in)) { GstEvent *event = GST_EVENT (buffer_in); - - if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) - break; + + if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) + break; } else { - if ( mikmod->Buffer ) { - GstBuffer *merge; - merge = gst_buffer_merge( mikmod->Buffer, buffer_in ); - gst_buffer_unref( buffer_in ); - gst_buffer_unref( mikmod->Buffer ); + if (mikmod->Buffer) { + GstBuffer *merge; + + merge = gst_buffer_merge (mikmod->Buffer, buffer_in); + gst_buffer_unref (buffer_in); + gst_buffer_unref (mikmod->Buffer); mikmod->Buffer = merge; } else { mikmod->Buffer = buffer_in; } } - } - + } + if (!GST_PAD_CAPS (mikmod->srcpad)) { if (GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (mikmod->srcpad))) { GST_ELEMENT_ERROR (mikmod, CORE, NEGOTIATION, (NULL), (NULL)); return; } } - - MikMod_RegisterDriver(&drv_gst); - MikMod_RegisterAllLoaders(); - - MikMod_Init(""); - reader = GST_READER_new( mikmod ); - module = Player_LoadGeneric ( reader, 64, 0 ); - + + MikMod_RegisterDriver (&drv_gst); + MikMod_RegisterAllLoaders (); + + MikMod_Init (""); + reader = GST_READER_new (mikmod); + module = Player_LoadGeneric (reader, 64, 0); + gst_buffer_unref (mikmod->Buffer); - - if ( ! Player_Active() ) - Player_Start(module); - + + if (!Player_Active ()) + Player_Start (module); + mikmod->initialized = TRUE; } - if ( Player_Active() ) { - timestamp = ( module->sngtime / 1024.0 ) * GST_SECOND; - drv_gst.Update(); + if (Player_Active ()) { + timestamp = (module->sngtime / 1024.0) * GST_SECOND; + drv_gst.Update (); } else { gst_element_set_eos (GST_ELEMENT (mikmod)); gst_pad_push (mikmod->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); @@ -343,7 +347,7 @@ gst_mikmod_loop (GstElement *element) static gboolean -gst_mikmod_setup (GstMikMod *mikmod) +gst_mikmod_setup (GstMikMod * mikmod) { md_musicvolume = mikmod->musicvolume; md_pansep = mikmod->pansep; @@ -354,28 +358,28 @@ gst_mikmod_setup (GstMikMod *mikmod) md_mode = 0; - if ( mikmod->interp ) + if (mikmod->interp) md_mode = md_mode | DMODE_INTERP; - if ( mikmod->reverse ) + if (mikmod->reverse) md_mode = md_mode | DMODE_REVERSE; - if ( mikmod->surround ) + if (mikmod->surround) md_mode = md_mode | DMODE_SURROUND; - if ( mikmod->_16bit ) + if (mikmod->_16bit) md_mode = md_mode | DMODE_16BITS; - if ( mikmod->hqmixer ) + if (mikmod->hqmixer) md_mode = md_mode | DMODE_HQMIXER; - if ( mikmod->soft_music ) + if (mikmod->soft_music) md_mode = md_mode | DMODE_SOFT_MUSIC; - if ( mikmod->soft_sndfx ) + if (mikmod->soft_sndfx) md_mode = md_mode | DMODE_SOFT_SNDFX; - if ( mikmod->stereo ) + if (mikmod->stereo) md_mode = md_mode | DMODE_STEREO; return TRUE; @@ -383,9 +387,9 @@ gst_mikmod_setup (GstMikMod *mikmod) static GstElementStateReturn -gst_mikmod_change_state (GstElement *element) +gst_mikmod_change_state (GstElement * element) { -GstMikMod *mikmod; + GstMikMod *mikmod; g_return_val_if_fail (GST_IS_MIKMOD (element), GST_STATE_FAILURE); @@ -393,35 +397,31 @@ GstMikMod *mikmod; GST_DEBUG ("state pending %d", GST_STATE_PENDING (element)); - if (GST_STATE_PENDING (element) == GST_STATE_READY) - { - gst_mikmod_setup(mikmod); - - if ( Player_Active() ) - { - Player_TogglePause(); - Player_SetPosition( 0 ); - } - mikmod->initialized = FALSE; + if (GST_STATE_PENDING (element) == GST_STATE_READY) { + gst_mikmod_setup (mikmod); + + if (Player_Active ()) { + Player_TogglePause (); + Player_SetPosition (0); + } + mikmod->initialized = FALSE; } - - if (GST_STATE_PENDING (element) == GST_STATE_PLAYING) - { - if ( Player_Active() && Player_Paused() ) - Player_TogglePause(); - else - if ( ! Player_Active() ) - Player_Start(module); - + + if (GST_STATE_PENDING (element) == GST_STATE_PLAYING) { + if (Player_Active () && Player_Paused ()) + Player_TogglePause (); + else if (!Player_Active ()) + Player_Start (module); + } - - if (GST_STATE_PENDING (element) == GST_STATE_PAUSED) - if ( Player_Active() && ! Player_Paused() ) - Player_TogglePause(); - if (GST_STATE_PENDING (element) == GST_STATE_NULL) - MikMod_Exit(); - + if (GST_STATE_PENDING (element) == GST_STATE_PAUSED) + if (Player_Active () && !Player_Paused ()) + Player_TogglePause (); + + if (GST_STATE_PENDING (element) == GST_STATE_NULL) + MikMod_Exit (); + if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); @@ -432,13 +432,14 @@ GstMikMod *mikmod; static void -gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamSpec *pspec ) +gst_mikmod_set_property (GObject * object, guint id, const GValue * value, + GParamSpec * pspec) { GstMikMod *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MIKMOD(object)); - filter = GST_MIKMOD(object); + g_return_if_fail (GST_IS_MIKMOD (object)); + filter = GST_MIKMOD (object); switch (id) { case ARG_SONGNAME: @@ -488,13 +489,14 @@ gst_mikmod_set_property (GObject *object, guint id, const GValue *value, GParamS } static void -gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *pspec ) +gst_mikmod_get_property (GObject * object, guint id, GValue * value, + GParamSpec * pspec) { GstMikMod *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MIKMOD(object)); - filter = GST_MIKMOD(object); + g_return_if_fail (GST_IS_MIKMOD (object)); + filter = GST_MIKMOD (object); switch (id) { case ARG_MUSICVOLUME: @@ -536,21 +538,17 @@ gst_mikmod_get_property (GObject *object, guint id, GValue *value, GParamSpec *p } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "mikmod", GST_RANK_SECONDARY, GST_TYPE_MIKMOD)) + if (!gst_element_register (plugin, "mikmod", GST_RANK_SECONDARY, + GST_TYPE_MIKMOD)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mikmod", - "Mikmod plugin library", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mikmod", + "Mikmod plugin library", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/mikmod/gstmikmod.h b/ext/mikmod/gstmikmod.h index 208fc5b9..ce65f8e8 100644 --- a/ext/mikmod/gstmikmod.h +++ b/ext/mikmod/gstmikmod.h @@ -25,13 +25,14 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MIKMOD \ (gst_mikmod_get_type()) - + #define GST_MIKMOD(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MIKMOD,GstMikMod)) #define GST_MIKMOD_CLASS(klass) \ @@ -40,68 +41,70 @@ extern "C" { (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MIKMOD)) #define GST_IS_MIKMOD_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MIKMOD)) - -struct _GstMikMod { - GstElement element; - GstPad *sinkpad, *srcpad; - GstBuffer *Buffer; - - gchar *songname; - gchar *modtype; - gint musicvolume; - gint pansep; - gint reverb; - gint sndfxvolume; - gint volume; - gint mixfreq; - gint mode; - gboolean interp; - gboolean reverse; - gboolean surround; - gboolean _16bit; - gboolean hqmixer; - gboolean soft_music; - gboolean soft_sndfx; - gboolean stereo; - - gboolean initialized; -}; - -struct _GstMikModClass { - GstElementClass parent_class; -}; - -typedef struct _GstMikMod GstMikMod; -typedef struct _GstMikModClass GstMikModClass; - -extern MODULE *module; -extern MREADER *reader; -extern GstPad *srcpad; -extern GstClockTime timestamp; -extern int need_sync; - -GType gst_mikmod_get_type(void); + + struct _GstMikMod + { + GstElement element; + GstPad *sinkpad, *srcpad; + GstBuffer *Buffer; + + gchar *songname; + gchar *modtype; + gint musicvolume; + gint pansep; + gint reverb; + gint sndfxvolume; + gint volume; + gint mixfreq; + gint mode; + gboolean interp; + gboolean reverse; + gboolean surround; + gboolean _16bit; + gboolean hqmixer; + gboolean soft_music; + gboolean soft_sndfx; + gboolean stereo; + + gboolean initialized; + }; + + struct _GstMikModClass + { + GstElementClass parent_class; + }; + + typedef struct _GstMikMod GstMikMod; + typedef struct _GstMikModClass GstMikModClass; + + extern MODULE *module; + extern MREADER *reader; + extern GstPad *srcpad; + extern GstClockTime timestamp; + extern int need_sync; + + GType gst_mikmod_get_type (void); /* symbols for mikmod_reader.h */ -struct _GST_READER -{ - MREADER core; - GstMikMod *mik; - guint64 offset; - gshort eof; -}; + struct _GST_READER + { + MREADER core; + GstMikMod *mik; + guint64 offset; + gshort eof; + }; -typedef struct _GST_READER GST_READER; + typedef struct _GST_READER GST_READER; -MREADER *GST_READER_new( GstMikMod *mik ); + MREADER *GST_READER_new (GstMikMod * mik); /* symbols for drv_gst.c */ -extern MDRIVER drv_gst; + extern MDRIVER drv_gst; #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_MIKMOD_H__ */ +#endif /* __GST_MIKMOD_H__ */ diff --git a/ext/mikmod/mikmod_reader.c b/ext/mikmod/mikmod_reader.c index 38b8402c..f8e83de1 100644 --- a/ext/mikmod/mikmod_reader.c +++ b/ext/mikmod/mikmod_reader.c @@ -9,57 +9,62 @@ extern int need_sync; -static BOOL GST_READER_Eof ( MREADER *reader ); -static BOOL GST_READER_Read( MREADER *reader, void *ptr, size_t size ); -static int GST_READER_Get ( MREADER *reader ); -static BOOL GST_READER_Seek( MREADER* reader,long offset,int whence ); -static long GST_READER_Tell( MREADER* reader ); +static BOOL GST_READER_Eof (MREADER * reader); +static BOOL GST_READER_Read (MREADER * reader, void *ptr, size_t size); +static int GST_READER_Get (MREADER * reader); +static BOOL GST_READER_Seek (MREADER * reader, long offset, int whence); +static long GST_READER_Tell (MREADER * reader); -static BOOL GST_READER_Eof( MREADER *reader ) +static BOOL +GST_READER_Eof (MREADER * reader) { -GST_READER *gst_reader; + GST_READER *gst_reader; - gst_reader = ( GST_READER * ) reader; + gst_reader = (GST_READER *) reader; return gst_reader->eof; } -static BOOL GST_READER_Read( MREADER *reader, void *ptr, size_t size ) +static BOOL +GST_READER_Read (MREADER * reader, void *ptr, size_t size) { -GST_READER *gst_reader; + GST_READER *gst_reader; - gst_reader = ( GST_READER * ) reader; - - memcpy( ptr, GST_BUFFER_DATA( gst_reader->mik->Buffer ) + gst_reader->offset, size); - gst_reader->offset = gst_reader->offset + size; + gst_reader = (GST_READER *) reader; + + memcpy (ptr, GST_BUFFER_DATA (gst_reader->mik->Buffer) + gst_reader->offset, + size); + gst_reader->offset = gst_reader->offset + size; return 1; } -static int GST_READER_Get ( MREADER *reader ) +static int +GST_READER_Get (MREADER * reader) { -GST_READER *gst_reader; -int res; + GST_READER *gst_reader; + int res; + + gst_reader = (GST_READER *) reader; - gst_reader = ( GST_READER * ) reader; - - res = *( GST_BUFFER_DATA( gst_reader->mik->Buffer ) + gst_reader->offset ); + res = *(GST_BUFFER_DATA (gst_reader->mik->Buffer) + gst_reader->offset); gst_reader->offset += 1; - + return res; } -static BOOL GST_READER_Seek( MREADER *reader, long offset, int whence ) +static BOOL +GST_READER_Seek (MREADER * reader, long offset, int whence) { -GST_READER *gst_reader; - - gst_reader = ( GST_READER * ) reader; + GST_READER *gst_reader; - if ( whence == SEEK_SET ) + gst_reader = (GST_READER *) reader; + + if (whence == SEEK_SET) gst_reader->offset = offset; else gst_reader->offset += offset; @@ -68,39 +73,41 @@ GST_READER *gst_reader; } -static long GST_READER_Tell( MREADER *reader ) +static long +GST_READER_Tell (MREADER * reader) { -GST_READER *gst_reader; + GST_READER *gst_reader; - gst_reader = ( GST_READER * ) reader; + gst_reader = (GST_READER *) reader; return gst_reader->offset; } -MREADER *GST_READER_new( GstMikMod *mik ) +MREADER * +GST_READER_new (GstMikMod * mik) { -GST_READER *gst_reader; - - gst_reader = ( GST_READER * ) g_malloc( sizeof( GST_READER )); + GST_READER *gst_reader; + + gst_reader = (GST_READER *) g_malloc (sizeof (GST_READER)); gst_reader->offset = 0; - gst_reader->eof = 0; - gst_reader->mik = mik; - if ( gst_reader ) - { - gst_reader->core.Eof = &GST_READER_Eof; - gst_reader->core.Read = &GST_READER_Read; - gst_reader->core.Get = &GST_READER_Get; - gst_reader->core.Seek = &GST_READER_Seek; - gst_reader->core.Tell = &GST_READER_Tell; + gst_reader->eof = 0; + gst_reader->mik = mik; + if (gst_reader) { + gst_reader->core.Eof = &GST_READER_Eof; + gst_reader->core.Read = &GST_READER_Read; + gst_reader->core.Get = &GST_READER_Get; + gst_reader->core.Seek = &GST_READER_Seek; + gst_reader->core.Tell = &GST_READER_Tell; } - return ( MREADER *)gst_reader; + return (MREADER *) gst_reader; } -void GST_READER_free ( MREADER *reader ) +void +GST_READER_free (MREADER * reader) { - if ( reader ) - g_free( reader ); + if (reader) + g_free (reader); } diff --git a/ext/mikmod/mikmod_types.c b/ext/mikmod/mikmod_types.c index f583d082..370f59cb 100644 --- a/ext/mikmod/mikmod_types.c +++ b/ext/mikmod/mikmod_types.c @@ -28,197 +28,211 @@ #define MODULEHEADERSIZE 0x438 - -gboolean MOD_CheckType( GstBuffer *buf ) + +gboolean +MOD_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ) + MODULEHEADERSIZE; - - /* Protracker and variants */ - if (( ! memcmp( data, "M.K.", 4 )) || ( ! memcmp( data, "M!K!", 4 ))) - return TRUE; - - /* Star Tracker */ - if ((( ! memcmp( data, "FLT", 3 )) || ( ! memcmp( data, "EXO", 3 ))) && ( isdigit( data[3] ))) - return TRUE; - - /* Oktalyzer (Amiga) */ - if (! memcmp( data, "OKTA", 4 )) - return TRUE; - - /* Oktalyser (Atari) */ - if ( ! memcmp( data, "CD81", 4 )) - return TRUE; - - /* Fasttracker */ - if (( ! memcmp( data + 1, "CHN", 3 )) && ( isdigit( data[0] ))) - return TRUE; - - /* Fasttracker or Taketracker */ - if ((( ! memcmp( data + 2, "CH", 2 )) || ( ! memcmp( data + 2, "CN", 2 ))) && ( isdigit( data[0] )) && ( isdigit( data[1] ))) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf) + MODULEHEADERSIZE; + + /* Protracker and variants */ + if ((!memcmp (data, "M.K.", 4)) || (!memcmp (data, "M!K!", 4))) + return TRUE; + + /* Star Tracker */ + if (((!memcmp (data, "FLT", 3)) || (!memcmp (data, "EXO", 3))) + && (isdigit (data[3]))) + return TRUE; + + /* Oktalyzer (Amiga) */ + if (!memcmp (data, "OKTA", 4)) + return TRUE; + + /* Oktalyser (Atari) */ + if (!memcmp (data, "CD81", 4)) + return TRUE; + + /* Fasttracker */ + if ((!memcmp (data + 1, "CHN", 3)) && (isdigit (data[0]))) + return TRUE; + + /* Fasttracker or Taketracker */ + if (((!memcmp (data + 2, "CH", 2)) || (!memcmp (data + 2, "CN", 2))) + && (isdigit (data[0])) && (isdigit (data[1]))) + return TRUE; + + return FALSE; } -gboolean Mod_669_CheckType( GstBuffer *buf ) +gboolean +Mod_669_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( ! memcmp( data, "if", 2 ) || ! memcmp( data, "JN", 2 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "if", 2) || !memcmp (data, "JN", 2)) + return TRUE; + + return FALSE; } -gboolean Amf_CheckType( GstBuffer *buf ) +gboolean +Amf_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( memcmp( data, "AMF", 3) ) - return FALSE; - - data = GST_BUFFER_DATA( buf ) + 3; - - if (( (gint)*data >= 10 ) && ( (gint)*data <= 14 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (memcmp (data, "AMF", 3)) + return FALSE; + + data = GST_BUFFER_DATA (buf) + 3; + + if (((gint) * data >= 10) && ((gint) * data <= 14)) + return TRUE; + + return FALSE; } -gboolean Dsm_CheckType( GstBuffer *buf ) +gboolean +Dsm_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( ! memcmp( data, "RIFF", 4 ) && ! memcmp( data + 8, "DSMF", 4 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "RIFF", 4) && !memcmp (data + 8, "DSMF", 4)) + return TRUE; + + return FALSE; } -gboolean Fam_CheckType( GstBuffer *buf ) +gboolean +Fam_CheckType (GstBuffer * buf) { -gchar *data; -static unsigned char FARSIG[4+3]={'F','A','R',0xfe,13,10,26}; - - data = GST_BUFFER_DATA( buf ); - - if(( memcmp( data, FARSIG, 4 )) || ( memcmp( data + 44, FARSIG + 4, 3 ))) - return FALSE; - - return 1; + gchar *data; + static unsigned char FARSIG[4 + 3] = { 'F', 'A', 'R', 0xfe, 13, 10, 26 }; + + data = GST_BUFFER_DATA (buf); + + if ((memcmp (data, FARSIG, 4)) || (memcmp (data + 44, FARSIG + 4, 3))) + return FALSE; + + return 1; } -gboolean Gdm_CheckType( GstBuffer *buf ) +gboolean +Gdm_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if ( ! memcmp( data, "GDM\xfe", 4 ) && ! memcmp( data + 71, "GMFS", 4 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "GDM\xfe", 4) && !memcmp (data + 71, "GMFS", 4)) + return TRUE; + + return FALSE; } -gboolean Imf_CheckType( GstBuffer *buf ) +gboolean +Imf_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ) + 0x3c; - - if( ! memcmp( data, "IM10", 4)) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf) + 0x3c; + + if (!memcmp (data, "IM10", 4)) + return TRUE; + + return FALSE; } -gboolean It_CheckType( GstBuffer *buf ) +gboolean +It_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( ! memcmp( data, "IMPM", 4 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "IMPM", 4)) + return TRUE; + + return FALSE; } -gboolean M15_CheckType( GstBuffer *buf ) +gboolean +M15_CheckType (GstBuffer * buf) { - /* FIXME: M15 CheckType to do */ - return FALSE; + /* FIXME: M15 CheckType to do */ + return FALSE; } -gboolean Med_CheckType( GstBuffer *buf ) +gboolean +Med_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if(( ! memcmp(data, "MMD0", 4 )) || ( memcmp( data, "MMD1", 4 ))) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if ((!memcmp (data, "MMD0", 4)) || (memcmp (data, "MMD1", 4))) + return TRUE; + + return FALSE; } -gboolean Mtm_CheckType( GstBuffer *buf ) +gboolean +Mtm_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( ! memcmp( data, "MTM", 3 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "MTM", 3)) + return TRUE; + + return FALSE; } -gboolean Okt_CheckType( GstBuffer *buf ) +gboolean +Okt_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( ! memcmp( data, "OKTSONG", 8 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf); + + if (!memcmp (data, "OKTSONG", 8)) + return TRUE; + + return FALSE; } -gboolean S3m_CheckType( GstBuffer *buf ) +gboolean +S3m_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ) + 0x2c; - - if( ! memcmp( data, "SCRM", 4 )) - return TRUE; - - return FALSE; + gchar *data; + + data = GST_BUFFER_DATA (buf) + 0x2c; + + if (!memcmp (data, "SCRM", 4)) + return TRUE; + + return FALSE; } -gboolean Xm_CheckType( GstBuffer *buf ) +gboolean +Xm_CheckType (GstBuffer * buf) { -gchar *data; - - data = GST_BUFFER_DATA( buf ); - - if( memcmp( data, "Extended Module: ", 17 )) - return FALSE; - - if( data[ 37 ] == 0x1a ) - return TRUE; - - return FALSE; -} + gchar *data; + data = GST_BUFFER_DATA (buf); + if (memcmp (data, "Extended Module: ", 17)) + return FALSE; + + if (data[37] == 0x1a) + return TRUE; + + return FALSE; +} diff --git a/ext/mikmod/mikmod_types.h b/ext/mikmod/mikmod_types.h index c431faf9..8559455c 100644 --- a/ext/mikmod/mikmod_types.h +++ b/ext/mikmod/mikmod_types.h @@ -20,25 +20,26 @@ #define __MIKMOD_TYPES_H__ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ -gboolean MOD_CheckType (GstBuffer *buf); -gboolean Mod_669_CheckType (GstBuffer *buf); -gboolean Amf_CheckType (GstBuffer *buf); -gboolean Dsm_CheckType (GstBuffer *buf); -gboolean Fam_CheckType (GstBuffer *buf); -gboolean Gdm_CheckType (GstBuffer *buf); -gboolean Imf_CheckType (GstBuffer *buf); -gboolean It_CheckType (GstBuffer *buf); -gboolean M15_CheckType (GstBuffer *buf); -gboolean Mtm_CheckType (GstBuffer *buf); -gboolean Okt_CheckType (GstBuffer *buf); -gboolean S3m_CheckType (GstBuffer *buf); -gboolean Xm_CheckType (GstBuffer *buf); + gboolean MOD_CheckType (GstBuffer * buf); + gboolean Mod_669_CheckType (GstBuffer * buf); + gboolean Amf_CheckType (GstBuffer * buf); + gboolean Dsm_CheckType (GstBuffer * buf); + gboolean Fam_CheckType (GstBuffer * buf); + gboolean Gdm_CheckType (GstBuffer * buf); + gboolean Imf_CheckType (GstBuffer * buf); + gboolean It_CheckType (GstBuffer * buf); + gboolean M15_CheckType (GstBuffer * buf); + gboolean Mtm_CheckType (GstBuffer * buf); + gboolean Okt_CheckType (GstBuffer * buf); + gboolean S3m_CheckType (GstBuffer * buf); + gboolean Xm_CheckType (GstBuffer * buf); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __MIKMOD_TYPES_H__ */ +#endif /* __MIKMOD_TYPES_H__ */ diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c index 4264e813..d0b40294 100644 --- a/ext/pango/gsttextoverlay.c +++ b/ext/pango/gsttextoverlay.c @@ -11,205 +11,196 @@ /*#include "SDL_blit.h"*/ static GstElementDetails textoverlay_details = { - "Text Overlay", - "Filter/Editor/Video", - "Adds text strings on top of a video buffer", - "Gustavo J. A. M. Carneiro " + "Text Overlay", + "Filter/Editor/Video", + "Adds text strings on top of a video buffer", + "Gustavo J. A. M. Carneiro " }; -enum { - ARG_0, - ARG_TEXT, - ARG_VALIGN, - ARG_HALIGN, - ARG_X0, - ARG_Y0, - ARG_FONT_DESC, +enum +{ + ARG_0, + ARG_TEXT, + ARG_VALIGN, + ARG_HALIGN, + ARG_X0, + ARG_Y0, + ARG_FONT_DESC, }; static GstStaticPadTemplate textoverlay_src_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv, " - "format = (fourcc) I420, " - "width = (int) [ 1, MAX ], " - "height = (int) [ 1, MAX ]") -); + "format = (fourcc) I420, " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]") + ); static GstStaticPadTemplate video_sink_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "video_sink", +GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv, " - "format = (fourcc) I420, " - "width = (int) [ 1, MAX ], " - "height = (int) [ 1, MAX ]") -); + "format = (fourcc) I420, " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]") + ); static GstStaticPadTemplate text_sink_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "text_sink", + GST_STATIC_PAD_TEMPLATE ("text_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/x-pango-markup; text/plain") -); - -static void gst_textoverlay_base_init (gpointer g_class); -static void gst_textoverlay_class_init(GstTextOverlayClass *klass); -static void gst_textoverlay_init(GstTextOverlay *overlay); -static void gst_textoverlay_set_property(GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_textoverlay_get_property(GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static GstElementStateReturn gst_textoverlay_change_state(GstElement *element); -static void gst_textoverlay_finalize(GObject *object); + ); + +static void gst_textoverlay_base_init (gpointer g_class); +static void gst_textoverlay_class_init (GstTextOverlayClass * klass); +static void gst_textoverlay_init (GstTextOverlay * overlay); +static void gst_textoverlay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_textoverlay_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_textoverlay_change_state (GstElement * + element); +static void gst_textoverlay_finalize (GObject * object); static GstElementClass *parent_class = NULL; + /*static guint gst_textoverlay_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_textoverlay_get_type(void) +gst_textoverlay_get_type (void) { - static GType textoverlay_type = 0; - - if (!textoverlay_type) { - static const GTypeInfo textoverlay_info = { - sizeof(GstTextOverlayClass), - gst_textoverlay_base_init, - NULL, - (GClassInitFunc)gst_textoverlay_class_init, - NULL, - NULL, - sizeof(GstTextOverlay), - 0, - (GInstanceInitFunc)gst_textoverlay_init, - }; - textoverlay_type = g_type_register_static(GST_TYPE_ELEMENT, "GstTextOverlay", - &textoverlay_info, 0); - } - return textoverlay_type; + static GType textoverlay_type = 0; + + if (!textoverlay_type) { + static const GTypeInfo textoverlay_info = { + sizeof (GstTextOverlayClass), + gst_textoverlay_base_init, + NULL, + (GClassInitFunc) gst_textoverlay_class_init, + NULL, + NULL, + sizeof (GstTextOverlay), + 0, + (GInstanceInitFunc) gst_textoverlay_init, + }; + textoverlay_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstTextOverlay", + &textoverlay_info, 0); + } + return textoverlay_type; } static void gst_textoverlay_base_init (gpointer g_class) { - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&textoverlay_src_template_factory)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&video_sink_template_factory)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&text_sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&textoverlay_src_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&text_sink_template_factory)); - gst_element_class_set_details (element_class, &textoverlay_details); + gst_element_class_set_details (element_class, &textoverlay_details); } static void -gst_textoverlay_class_init(GstTextOverlayClass *klass) +gst_textoverlay_class_init (GstTextOverlayClass * klass) { - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - parent_class = g_type_class_peek_parent(klass); - - gobject_class->finalize = gst_textoverlay_finalize; - gobject_class->set_property = gst_textoverlay_set_property; - gobject_class->get_property = gst_textoverlay_get_property; - - gstelement_class->change_state = gst_textoverlay_change_state; - klass->pango_context = pango_ft2_get_context(72, 72); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_TEXT, - g_param_spec_string("text", "text", - "Text to be display," - " in pango markup format.", - "", G_PARAM_WRITABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VALIGN, - g_param_spec_string("valign", "vertical alignment", - "Vertical alignment of the text. " - "Can be either 'baseline', 'bottom', or 'top'", - "baseline", G_PARAM_WRITABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HALIGN, - g_param_spec_string("halign", "horizontal alignment", - "Horizontal alignment of the text. " - "Can be either 'left', 'right', or 'center'", - "center", G_PARAM_WRITABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_X0, - g_param_spec_int("x0", "X position", - "Initial X position." - " Horizontal aligment takes this point" - " as reference.", - G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_Y0, - g_param_spec_int("y0", "Y position", - "Initial Y position." - " Vertical aligment takes this point" - " as reference.", - G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FONT_DESC, - g_param_spec_string("font-desc", "font description", - "Pango font description of font " - "to be used for rendering. " - "See documentation of " - "pango_font_description_from_string" - " for syntax.", - "", G_PARAM_WRITABLE)); + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_textoverlay_finalize; + gobject_class->set_property = gst_textoverlay_set_property; + gobject_class->get_property = gst_textoverlay_get_property; + + gstelement_class->change_state = gst_textoverlay_change_state; + klass->pango_context = pango_ft2_get_context (72, 72); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEXT, + g_param_spec_string ("text", "text", + "Text to be display," + " in pango markup format.", "", G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VALIGN, + g_param_spec_string ("valign", "vertical alignment", + "Vertical alignment of the text. " + "Can be either 'baseline', 'bottom', or 'top'", + "baseline", G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HALIGN, + g_param_spec_string ("halign", "horizontal alignment", + "Horizontal alignment of the text. " + "Can be either 'left', 'right', or 'center'", + "center", G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_X0, + g_param_spec_int ("x0", "X position", + "Initial X position." + " Horizontal aligment takes this point" + " as reference.", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_Y0, + g_param_spec_int ("y0", "Y position", + "Initial Y position." + " Vertical aligment takes this point" + " as reference.", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FONT_DESC, + g_param_spec_string ("font-desc", "font description", + "Pango font description of font " + "to be used for rendering. " + "See documentation of " + "pango_font_description_from_string" + " for syntax.", "", G_PARAM_WRITABLE)); } static void -resize_bitmap(GstTextOverlay *overlay, int width, int height) +resize_bitmap (GstTextOverlay * overlay, int width, int height) { - FT_Bitmap *bitmap = &overlay->bitmap; - int pitch = (width|3) + 1; - int size = pitch*height; - - /* no need to keep reallocating; just keep the maximum size so far */ - if (size <= overlay->bitmap_buffer_size) { - bitmap->rows = height; - bitmap->width = width; - bitmap->pitch = pitch; - memset(bitmap->buffer, 0, overlay->bitmap_buffer_size); - return; - } - if (!bitmap->buffer) { - /* initialize */ - bitmap->pixel_mode = ft_pixel_mode_grays; - bitmap->num_grays = 256; - } - if (bitmap->buffer) - bitmap->buffer = g_realloc(bitmap->buffer, size); - else - bitmap->buffer = g_malloc(size); + FT_Bitmap *bitmap = &overlay->bitmap; + int pitch = (width | 3) + 1; + int size = pitch * height; + + /* no need to keep reallocating; just keep the maximum size so far */ + if (size <= overlay->bitmap_buffer_size) { bitmap->rows = height; bitmap->width = width; bitmap->pitch = pitch; - memset(bitmap->buffer, 0, size); - overlay->bitmap_buffer_size = size; + memset (bitmap->buffer, 0, overlay->bitmap_buffer_size); + return; + } + if (!bitmap->buffer) { + /* initialize */ + bitmap->pixel_mode = ft_pixel_mode_grays; + bitmap->num_grays = 256; + } + if (bitmap->buffer) + bitmap->buffer = g_realloc (bitmap->buffer, size); + else + bitmap->buffer = g_malloc (size); + bitmap->rows = height; + bitmap->width = width; + bitmap->pitch = pitch; + memset (bitmap->buffer, 0, size); + overlay->bitmap_buffer_size = size; } static void -render_text(GstTextOverlay *overlay) +render_text (GstTextOverlay * overlay) { - PangoRectangle ink_rect, logical_rect; + PangoRectangle ink_rect, logical_rect; - pango_layout_get_pixel_extents(overlay->layout, &ink_rect, &logical_rect); - resize_bitmap(overlay, ink_rect.width, ink_rect.height + ink_rect.y); - pango_ft2_render_layout(&overlay->bitmap, overlay->layout, 0, 0); - overlay->baseline_y = ink_rect.y; + pango_layout_get_pixel_extents (overlay->layout, &ink_rect, &logical_rect); + resize_bitmap (overlay, ink_rect.width, ink_rect.height + ink_rect.y); + pango_ft2_render_layout (&overlay->bitmap, overlay->layout, 0, 0); + overlay->baseline_y = ink_rect.y; } /* static GstPadLinkReturn */ @@ -220,154 +211,157 @@ render_text(GstTextOverlay *overlay) static GstPadLinkReturn -gst_textoverlay_video_sinkconnect(GstPad *pad, const GstCaps *caps) +gst_textoverlay_video_sinkconnect (GstPad * pad, const GstCaps * caps) { - GstTextOverlay *overlay; - GstStructure *structure; + GstTextOverlay *overlay; + GstStructure *structure; - overlay = GST_TEXTOVERLAY(gst_pad_get_parent(pad)); + overlay = GST_TEXTOVERLAY (gst_pad_get_parent (pad)); - structure = gst_caps_get_structure (caps, 0); - overlay->width = overlay->height = 0; - gst_structure_get_int (structure, "width", &overlay->width); - gst_structure_get_int (structure, "height", &overlay->height); + structure = gst_caps_get_structure (caps, 0); + overlay->width = overlay->height = 0; + gst_structure_get_int (structure, "width", &overlay->width); + gst_structure_get_int (structure, "height", &overlay->height); - return gst_pad_try_set_caps(overlay->srcpad, caps); + return gst_pad_try_set_caps (overlay->srcpad, caps); } static void -gst_text_overlay_blit_yuv420(GstTextOverlay *overlay, FT_Bitmap *bitmap, - guchar *pixbuf, int x0, int y0) +gst_text_overlay_blit_yuv420 (GstTextOverlay * overlay, FT_Bitmap * bitmap, + guchar * pixbuf, int x0, int y0) { - int y; /* text bitmap coordinates */ - int x1, y1; /* video buffer coordinates */ - int rowinc, bit_rowinc, uv_rowinc; - guchar *p, *bitp, *u_p; - int video_width = overlay->width, video_height = overlay->height; - int bitmap_x0 = x0 < 1? -(x0 - 1) : 1; /* 1 pixel border */ - int bitmap_y0 = y0 < 1? -(y0 - 1) : 1; /* 1 pixel border */ - int bitmap_width = bitmap->width - bitmap_x0; - int bitmap_height = bitmap->rows - bitmap_y0; - int u_plane_size; - int skip_y, skip_x; - guchar v; - - if (x0 + bitmap_x0 + bitmap_width > video_width - 1) /* 1 pixel border */ - bitmap_width -= x0 + bitmap_x0 + bitmap_width - video_width + 1; - if (y0 + bitmap_y0 + bitmap_height > video_height - 1) /* 1 pixel border */ - bitmap_height -= y0 + bitmap_y0 + bitmap_height - video_height + 1; - - rowinc = video_width - bitmap_width; - uv_rowinc = video_width / 2 - bitmap_width / 2; - bit_rowinc = bitmap->pitch - bitmap_width; - u_plane_size = (video_width / 2)*(video_height / 2); - - y1 = y0 + bitmap_y0; - x1 = x0 + bitmap_x0; - p = pixbuf + video_width*y1 + x1; - bitp = bitmap->buffer + bitmap->pitch*bitmap_y0 + bitmap_x0; - for (y = bitmap_y0; y < bitmap_height; y++){ - int n; - for(n=bitmap_width; n>0; --n){ - v = *bitp; - if (v) { - p[-1] = CLAMP(p[-1] - v, 0, 255); - p[ 1] = CLAMP(p[ 1] - v, 0, 255); - p[-video_width] = CLAMP(p[-video_width] - v, 0, 255); - p[ video_width] = CLAMP(p[ video_width] - v, 0, 255); - } - p++; - bitp++; + int y; /* text bitmap coordinates */ + int x1, y1; /* video buffer coordinates */ + int rowinc, bit_rowinc, uv_rowinc; + guchar *p, *bitp, *u_p; + int video_width = overlay->width, video_height = overlay->height; + int bitmap_x0 = x0 < 1 ? -(x0 - 1) : 1; /* 1 pixel border */ + int bitmap_y0 = y0 < 1 ? -(y0 - 1) : 1; /* 1 pixel border */ + int bitmap_width = bitmap->width - bitmap_x0; + int bitmap_height = bitmap->rows - bitmap_y0; + int u_plane_size; + int skip_y, skip_x; + guchar v; + + if (x0 + bitmap_x0 + bitmap_width > video_width - 1) /* 1 pixel border */ + bitmap_width -= x0 + bitmap_x0 + bitmap_width - video_width + 1; + if (y0 + bitmap_y0 + bitmap_height > video_height - 1) /* 1 pixel border */ + bitmap_height -= y0 + bitmap_y0 + bitmap_height - video_height + 1; + + rowinc = video_width - bitmap_width; + uv_rowinc = video_width / 2 - bitmap_width / 2; + bit_rowinc = bitmap->pitch - bitmap_width; + u_plane_size = (video_width / 2) * (video_height / 2); + + y1 = y0 + bitmap_y0; + x1 = x0 + bitmap_x0; + p = pixbuf + video_width * y1 + x1; + bitp = bitmap->buffer + bitmap->pitch * bitmap_y0 + bitmap_x0; + for (y = bitmap_y0; y < bitmap_height; y++) { + int n; + + for (n = bitmap_width; n > 0; --n) { + v = *bitp; + if (v) { + p[-1] = CLAMP (p[-1] - v, 0, 255); + p[1] = CLAMP (p[1] - v, 0, 255); + p[-video_width] = CLAMP (p[-video_width] - v, 0, 255); + p[video_width] = CLAMP (p[video_width] - v, 0, 255); } - p += rowinc; - bitp += bit_rowinc; + p++; + bitp++; } + p += rowinc; + bitp += bit_rowinc; + } + + y = bitmap_y0; + y1 = y0 + bitmap_y0; + x1 = x0 + bitmap_x0; + bitp = bitmap->buffer + bitmap->pitch * bitmap_y0 + bitmap_x0; + p = pixbuf + video_width * y1 + x1; + u_p = + pixbuf + video_width * video_height + (video_width >> 1) * (y1 >> 1) + + (x1 >> 1); + skip_y = 0; + skip_x = 0; + + for (; y < bitmap_height; y++) { + int n; - y = bitmap_y0; - y1 = y0 + bitmap_y0; x1 = x0 + bitmap_x0; - bitp = bitmap->buffer + bitmap->pitch*bitmap_y0 + bitmap_x0; - p = pixbuf + video_width*y1 + x1; - u_p = pixbuf + video_width*video_height + (video_width >> 1)*(y1 >> 1) + (x1 >> 1); - skip_y = 0; skip_x = 0; - - for ( ; y < bitmap_height; y++){ - int n; - x1 = x0 + bitmap_x0; - skip_x = 0; - for(n = bitmap_width; n>0; --n){ - v = *bitp; - if (v) { - *p = v; - if (!skip_y) { - u_p[0] = u_p[u_plane_size] = 0x80; - } - } + for (n = bitmap_width; n > 0; --n) { + v = *bitp; + if (v) { + *p = v; if (!skip_y) { - skip_x = !skip_x; - if (!skip_x) u_p++; + u_p[0] = u_p[u_plane_size] = 0x80; } - p++; - bitp++; } - /*if (!skip_x && !skip_y) u_p--; */ - p += rowinc; - bitp += bit_rowinc; - skip_y = !skip_y; - u_p += skip_y? uv_rowinc : 0; + if (!skip_y) { + skip_x = !skip_x; + if (!skip_x) + u_p++; + } + p++; + bitp++; } + /*if (!skip_x && !skip_y) u_p--; */ + p += rowinc; + bitp += bit_rowinc; + skip_y = !skip_y; + u_p += skip_y ? uv_rowinc : 0; + } } static void -gst_textoverlay_video_chain(GstPad *pad, GstData *_data) +gst_textoverlay_video_chain (GstPad * pad, GstData * _data) { - GstBuffer *buf = GST_BUFFER (_data); - GstTextOverlay *overlay; - guchar *pixbuf; - gint x0, y0; - - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); - overlay = GST_TEXTOVERLAY(gst_pad_get_parent(pad)); - g_return_if_fail(overlay != NULL); - g_return_if_fail(GST_IS_TEXTOVERLAY(overlay)); - - pixbuf = GST_BUFFER_DATA(buf); - - x0 = overlay->x0; - y0 = overlay->y0; - switch (overlay->valign) - { + GstBuffer *buf = GST_BUFFER (_data); + GstTextOverlay *overlay; + guchar *pixbuf; + gint x0, y0; + + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); + overlay = GST_TEXTOVERLAY (gst_pad_get_parent (pad)); + g_return_if_fail (overlay != NULL); + g_return_if_fail (GST_IS_TEXTOVERLAY (overlay)); + + pixbuf = GST_BUFFER_DATA (buf); + + x0 = overlay->x0; + y0 = overlay->y0; + switch (overlay->valign) { case GST_TEXT_OVERLAY_VALIGN_BOTTOM: - y0 += overlay->bitmap.rows; - break; + y0 += overlay->bitmap.rows; + break; case GST_TEXT_OVERLAY_VALIGN_BASELINE: - y0 -= (overlay->bitmap.rows - overlay->baseline_y); - break; + y0 -= (overlay->bitmap.rows - overlay->baseline_y); + break; case GST_TEXT_OVERLAY_VALIGN_TOP: - break; - } + break; + } - switch (overlay->halign) - { + switch (overlay->halign) { case GST_TEXT_OVERLAY_HALIGN_LEFT: - break; + break; case GST_TEXT_OVERLAY_HALIGN_RIGHT: - x0 -= overlay->bitmap.width; - break; + x0 -= overlay->bitmap.width; + break; case GST_TEXT_OVERLAY_HALIGN_CENTER: - x0 -= overlay->bitmap.width / 2; - break; - } + x0 -= overlay->bitmap.width / 2; + break; + } - if (overlay->bitmap.buffer) - gst_text_overlay_blit_yuv420(overlay, &overlay->bitmap, pixbuf, x0, y0); + if (overlay->bitmap.buffer) + gst_text_overlay_blit_yuv420 (overlay, &overlay->bitmap, pixbuf, x0, y0); - gst_pad_push(overlay->srcpad, GST_DATA (buf)); + gst_pad_push (overlay->srcpad, GST_DATA (buf)); } #define PAST_END(buffer, time) \ @@ -377,270 +371,271 @@ gst_textoverlay_video_chain(GstPad *pad, GstData *_data) < (time)) static void -gst_textoverlay_loop(GstElement *element) +gst_textoverlay_loop (GstElement * element) { - GstTextOverlay *overlay; - GstBuffer *video_frame; - guint64 now; - - g_return_if_fail(element != NULL); - g_return_if_fail(GST_IS_TEXTOVERLAY(element)); - overlay = GST_TEXTOVERLAY(element); - - video_frame = GST_BUFFER (gst_pad_pull(overlay->video_sinkpad)); - now = GST_BUFFER_TIMESTAMP(video_frame); - - /* - * This state machine has a bug that can't be resolved easily. - * (Needs a more complicated state machine.) Basically, if the - * text that came from a buffer from the sink pad is being - * displayed, and the default text is changed by set_parameter, - * we'll incorrectly display the default text. - * - * Otherwise, this is a pretty decent state machine that handles - * buffer timestamps and durations correctly. (I think) - */ - - while (overlay->next_buffer == NULL){ - GST_DEBUG("attempting to pull a buffer"); - - /* read all text buffers until we get one "in the future" */ - if(!GST_PAD_IS_USABLE(overlay->text_sinkpad)){ - break; - } - overlay->next_buffer = GST_BUFFER (gst_pad_pull(overlay->text_sinkpad)); - if (!overlay->next_buffer) - break; - - if (PAST_END(overlay->next_buffer, now)){ - gst_buffer_unref(overlay->next_buffer); - overlay->next_buffer = NULL; - } + GstTextOverlay *overlay; + GstBuffer *video_frame; + guint64 now; + + g_return_if_fail (element != NULL); + g_return_if_fail (GST_IS_TEXTOVERLAY (element)); + overlay = GST_TEXTOVERLAY (element); + + video_frame = GST_BUFFER (gst_pad_pull (overlay->video_sinkpad)); + now = GST_BUFFER_TIMESTAMP (video_frame); + + /* + * This state machine has a bug that can't be resolved easily. + * (Needs a more complicated state machine.) Basically, if the + * text that came from a buffer from the sink pad is being + * displayed, and the default text is changed by set_parameter, + * we'll incorrectly display the default text. + * + * Otherwise, this is a pretty decent state machine that handles + * buffer timestamps and durations correctly. (I think) + */ + + while (overlay->next_buffer == NULL) { + GST_DEBUG ("attempting to pull a buffer"); + + /* read all text buffers until we get one "in the future" */ + if (!GST_PAD_IS_USABLE (overlay->text_sinkpad)) { + break; } + overlay->next_buffer = GST_BUFFER (gst_pad_pull (overlay->text_sinkpad)); + if (!overlay->next_buffer) + break; - if (overlay->next_buffer && - (GST_BUFFER_TIMESTAMP(overlay->next_buffer) <= now || - GST_BUFFER_TIMESTAMP(overlay->next_buffer) == GST_CLOCK_TIME_NONE)){ - GST_DEBUG("using new buffer"); - - if (overlay->current_buffer){ - gst_buffer_unref (overlay->current_buffer); - } - overlay->current_buffer = overlay->next_buffer; + if (PAST_END (overlay->next_buffer, now)) { + gst_buffer_unref (overlay->next_buffer); overlay->next_buffer = NULL; + } + } - GST_DEBUG ( "rendering '%*s'", - GST_BUFFER_SIZE(overlay->current_buffer), - GST_BUFFER_DATA(overlay->current_buffer)); - pango_layout_set_markup(overlay->layout, - GST_BUFFER_DATA(overlay->current_buffer), - GST_BUFFER_SIZE(overlay->current_buffer)); - render_text(overlay); - overlay->need_render = FALSE; + if (overlay->next_buffer && + (GST_BUFFER_TIMESTAMP (overlay->next_buffer) <= now || + GST_BUFFER_TIMESTAMP (overlay->next_buffer) == GST_CLOCK_TIME_NONE)) { + GST_DEBUG ("using new buffer"); + + if (overlay->current_buffer) { + gst_buffer_unref (overlay->current_buffer); } + overlay->current_buffer = overlay->next_buffer; + overlay->next_buffer = NULL; - if (overlay->current_buffer && PAST_END(overlay->current_buffer, now)){ - GST_DEBUG("dropping old buffer"); + GST_DEBUG ("rendering '%*s'", + GST_BUFFER_SIZE (overlay->current_buffer), + GST_BUFFER_DATA (overlay->current_buffer)); + pango_layout_set_markup (overlay->layout, + GST_BUFFER_DATA (overlay->current_buffer), + GST_BUFFER_SIZE (overlay->current_buffer)); + render_text (overlay); + overlay->need_render = FALSE; + } - gst_buffer_unref(overlay->current_buffer); - overlay->current_buffer = NULL; + if (overlay->current_buffer && PAST_END (overlay->current_buffer, now)) { + GST_DEBUG ("dropping old buffer"); - overlay->need_render = TRUE; - } + gst_buffer_unref (overlay->current_buffer); + overlay->current_buffer = NULL; - if(overlay->need_render){ - GST_DEBUG ( "rendering '%s'", overlay->default_text); - pango_layout_set_markup(overlay->layout, - overlay->default_text, strlen(overlay->default_text)); - render_text(overlay); + overlay->need_render = TRUE; + } - overlay->need_render = FALSE; - } + if (overlay->need_render) { + GST_DEBUG ("rendering '%s'", overlay->default_text); + pango_layout_set_markup (overlay->layout, + overlay->default_text, strlen (overlay->default_text)); + render_text (overlay); + + overlay->need_render = FALSE; + } - gst_textoverlay_video_chain(overlay->srcpad, GST_DATA (video_frame)); + gst_textoverlay_video_chain (overlay->srcpad, GST_DATA (video_frame)); } static GstElementStateReturn -gst_textoverlay_change_state(GstElement *element) +gst_textoverlay_change_state (GstElement * element) { - GstTextOverlay *overlay; + GstTextOverlay *overlay; - overlay = GST_TEXTOVERLAY(element); + overlay = GST_TEXTOVERLAY (element); - switch (GST_STATE_TRANSITION(element)) - { + switch (GST_STATE_TRANSITION (element)) { case GST_STATE_PAUSED_TO_PLAYING: - break; + break; case GST_STATE_PLAYING_TO_PAUSED: - break; + break; case GST_STATE_PAUSED_TO_READY: - break; - } + break; + } - parent_class->change_state(element); + parent_class->change_state (element); - return GST_STATE_SUCCESS; + return GST_STATE_SUCCESS; } static void -gst_textoverlay_finalize(GObject *object) +gst_textoverlay_finalize (GObject * object) { - GstTextOverlay *overlay = GST_TEXTOVERLAY(object); - - if (overlay->layout) { - g_object_unref(overlay->layout); - overlay->layout = NULL; - } - if (overlay->bitmap.buffer) { - g_free(overlay->bitmap.buffer); - overlay->bitmap.buffer = NULL; - } - - G_OBJECT_CLASS(parent_class)->finalize(object); + GstTextOverlay *overlay = GST_TEXTOVERLAY (object); + + if (overlay->layout) { + g_object_unref (overlay->layout); + overlay->layout = NULL; + } + if (overlay->bitmap.buffer) { + g_free (overlay->bitmap.buffer); + overlay->bitmap.buffer = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); } static void -gst_textoverlay_init(GstTextOverlay *overlay) +gst_textoverlay_init (GstTextOverlay * overlay) { - /* video sink */ - overlay->video_sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&video_sink_template_factory), "video_sink"); + /* video sink */ + overlay->video_sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&video_sink_template_factory), "video_sink"); /* gst_pad_set_chain_function(overlay->video_sinkpad, gst_textoverlay_video_chain); */ - gst_pad_set_link_function(overlay->video_sinkpad, gst_textoverlay_video_sinkconnect); - gst_element_add_pad(GST_ELEMENT(overlay), overlay->video_sinkpad); - - /* text sink */ - overlay->text_sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&text_sink_template_factory), "text_sink"); + gst_pad_set_link_function (overlay->video_sinkpad, + gst_textoverlay_video_sinkconnect); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->video_sinkpad); + + /* text sink */ + overlay->text_sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&text_sink_template_factory), "text_sink"); /* gst_pad_set_link_function(overlay->text_sinkpad, gst_textoverlay_text_sinkconnect); */ - gst_element_add_pad(GST_ELEMENT(overlay), overlay->text_sinkpad); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->text_sinkpad); - /* (video) source */ - overlay->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&textoverlay_src_template_factory), "src"); - gst_element_add_pad(GST_ELEMENT(overlay), overlay->srcpad); + /* (video) source */ + overlay->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&textoverlay_src_template_factory), "src"); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); - overlay->layout = pango_layout_new(GST_TEXTOVERLAY_GET_CLASS(overlay)->pango_context); - memset(&overlay->bitmap, 0, sizeof(overlay->bitmap)); + overlay->layout = + pango_layout_new (GST_TEXTOVERLAY_GET_CLASS (overlay)->pango_context); + memset (&overlay->bitmap, 0, sizeof (overlay->bitmap)); - overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; - overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; - overlay->x0 = overlay->y0 = 0; + overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; + overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; + overlay->x0 = overlay->y0 = 0; - overlay->default_text = g_strdup(""); - overlay->need_render = TRUE; + overlay->default_text = g_strdup (""); + overlay->need_render = TRUE; - gst_element_set_loop_function(GST_ELEMENT(overlay), gst_textoverlay_loop); + gst_element_set_loop_function (GST_ELEMENT (overlay), gst_textoverlay_loop); } static void -gst_textoverlay_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_textoverlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { - GstTextOverlay *overlay; + GstTextOverlay *overlay; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_TEXTOVERLAY(object)); - overlay = GST_TEXTOVERLAY(object); + /* it's not null if we got it, but it might not be ours */ + g_return_if_fail (GST_IS_TEXTOVERLAY (object)); + overlay = GST_TEXTOVERLAY (object); - switch (prop_id) - { + switch (prop_id) { case ARG_TEXT: - if(overlay->default_text){ - g_free(overlay->default_text); - } - overlay->default_text = g_strdup(g_value_get_string(value)); - overlay->need_render = TRUE; - break; + if (overlay->default_text) { + g_free (overlay->default_text); + } + overlay->default_text = g_strdup (g_value_get_string (value)); + overlay->need_render = TRUE; + break; case ARG_VALIGN: - if (strcasecmp(g_value_get_string(value), "baseline") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; - else if (strcasecmp(g_value_get_string(value), "bottom") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_BOTTOM; - else if (strcasecmp(g_value_get_string(value), "top") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_TOP; - else - g_warning("Invalid 'valign' property value: %s", - g_value_get_string(value)); - break; + if (strcasecmp (g_value_get_string (value), "baseline") == 0) + overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; + else if (strcasecmp (g_value_get_string (value), "bottom") == 0) + overlay->valign = GST_TEXT_OVERLAY_VALIGN_BOTTOM; + else if (strcasecmp (g_value_get_string (value), "top") == 0) + overlay->valign = GST_TEXT_OVERLAY_VALIGN_TOP; + else + g_warning ("Invalid 'valign' property value: %s", + g_value_get_string (value)); + break; case ARG_HALIGN: - if (strcasecmp(g_value_get_string(value), "left") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_LEFT; - else if (strcasecmp(g_value_get_string(value), "right") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_RIGHT; - else if (strcasecmp(g_value_get_string(value), "center") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; - else - g_warning("Invalid 'halign' property value: %s", - g_value_get_string(value)); - break; + if (strcasecmp (g_value_get_string (value), "left") == 0) + overlay->halign = GST_TEXT_OVERLAY_HALIGN_LEFT; + else if (strcasecmp (g_value_get_string (value), "right") == 0) + overlay->halign = GST_TEXT_OVERLAY_HALIGN_RIGHT; + else if (strcasecmp (g_value_get_string (value), "center") == 0) + overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; + else + g_warning ("Invalid 'halign' property value: %s", + g_value_get_string (value)); + break; case ARG_X0: - overlay->x0 = g_value_get_int(value); - break; + overlay->x0 = g_value_get_int (value); + break; case ARG_Y0: - overlay->y0 = g_value_get_int(value); - break; + overlay->y0 = g_value_get_int (value); + break; case ARG_FONT_DESC: { - PangoFontDescription *desc; - desc = pango_font_description_from_string(g_value_get_string(value)); - if (desc) { - g_message("font description set: %s", g_value_get_string(value)); - pango_layout_set_font_description(overlay->layout, desc); - pango_font_description_free(desc); - render_text(overlay); - } else - g_warning("font description parse failed: %s", g_value_get_string(value)); - break; + PangoFontDescription *desc; + + desc = pango_font_description_from_string (g_value_get_string (value)); + if (desc) { + g_message ("font description set: %s", g_value_get_string (value)); + pango_layout_set_font_description (overlay->layout, desc); + pango_font_description_free (desc); + render_text (overlay); + } else + g_warning ("font description parse failed: %s", + g_value_get_string (value)); + break; } default: - break; - } + break; + } } static void -gst_textoverlay_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_textoverlay_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { - GstTextOverlay *overlay; + GstTextOverlay *overlay; - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_TEXTOVERLAY(object)); - overlay = GST_TEXTOVERLAY(object); + /* it's not null if we got it, but it might not be ours */ + g_return_if_fail (GST_IS_TEXTOVERLAY (object)); + overlay = GST_TEXTOVERLAY (object); - switch (prop_id) { + switch (prop_id) { default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; - } + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static gboolean -plugin_init(GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "textoverlay", GST_RANK_PRIMARY, GST_TYPE_TEXTOVERLAY)) - return FALSE; + if (!gst_element_register (plugin, "textoverlay", GST_RANK_PRIMARY, + GST_TYPE_TEXTOVERLAY)) + return FALSE; - /*texttestsrc_plugin_init(module, plugin);*/ - /*subparse_plugin_init(module, plugin);*/ - return TRUE; + /*texttestsrc_plugin_init(module, plugin); */ + /*subparse_plugin_init(module, plugin); */ + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "textoverlay", - "Text overlay", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN) - + "Text overlay", plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/pango/gsttextoverlay.h b/ext/pango/gsttextoverlay.h index b039acac..08ad8145 100644 --- a/ext/pango/gsttextoverlay.h +++ b/ext/pango/gsttextoverlay.h @@ -6,7 +6,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_TEXTOVERLAY (gst_textoverlay_get_type()) #define GST_TEXTOVERLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ GST_TYPE_TEXTOVERLAY, GstTextOverlay)) @@ -18,56 +17,60 @@ G_BEGIN_DECLS GST_TYPE_TEXTOVERLAY)) #define GST_IS_TEXTOVERLAY_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),\ GST_TYPE_TEXTOVERLAY)) - -typedef struct _GstTextOverlay GstTextOverlay; +typedef struct _GstTextOverlay GstTextOverlay; typedef struct _GstTextOverlayClass GstTextOverlayClass; typedef enum _GstTextOverlayVAlign GstTextOverlayVAlign; typedef enum _GstTextOverlayHAlign GstTextOverlayHAlign; -enum _GstTextOverlayVAlign { - GST_TEXT_OVERLAY_VALIGN_BASELINE, - GST_TEXT_OVERLAY_VALIGN_BOTTOM, - GST_TEXT_OVERLAY_VALIGN_TOP, +enum _GstTextOverlayVAlign +{ + GST_TEXT_OVERLAY_VALIGN_BASELINE, + GST_TEXT_OVERLAY_VALIGN_BOTTOM, + GST_TEXT_OVERLAY_VALIGN_TOP, }; -enum _GstTextOverlayHAlign { - GST_TEXT_OVERLAY_HALIGN_LEFT, - GST_TEXT_OVERLAY_HALIGN_CENTER, - GST_TEXT_OVERLAY_HALIGN_RIGHT, +enum _GstTextOverlayHAlign +{ + GST_TEXT_OVERLAY_HALIGN_LEFT, + GST_TEXT_OVERLAY_HALIGN_CENTER, + GST_TEXT_OVERLAY_HALIGN_RIGHT, }; -struct _GstTextOverlay { - GstElement element; +struct _GstTextOverlay +{ + GstElement element; - GstPad *video_sinkpad; - GstPad *text_sinkpad; - GstPad *srcpad; - gint width; - gint height; - PangoLayout *layout; - FT_Bitmap bitmap; - gint bitmap_buffer_size; - gint baseline_y; - GstTextOverlayVAlign valign; - GstTextOverlayHAlign halign; - gint x0; - gint y0; - GstBuffer *current_buffer; - GstBuffer *next_buffer; - gchar *default_text; - gboolean need_render; + GstPad *video_sinkpad; + GstPad *text_sinkpad; + GstPad *srcpad; + gint width; + gint height; + PangoLayout *layout; + FT_Bitmap bitmap; + gint bitmap_buffer_size; + gint baseline_y; + GstTextOverlayVAlign valign; + GstTextOverlayHAlign halign; + gint x0; + gint y0; + GstBuffer *current_buffer; + GstBuffer *next_buffer; + gchar *default_text; + gboolean need_render; }; -struct _GstTextOverlayClass { - GstElementClass parent_class; +struct _GstTextOverlayClass +{ + GstElementClass parent_class; - PangoContext *pango_context; + PangoContext *pango_context; }; -GType gst_textoverlay_get_type(void) G_GNUC_CONST; +GType +gst_textoverlay_get_type (void) + G_GNUC_CONST; G_END_DECLS - #endif /* __GST_TEXTOVERLAY_H */ diff --git a/ext/pango/gsttimeoverlay.c b/ext/pango/gsttimeoverlay.c index 9a3b292e..9ce5c897 100644 --- a/ext/pango/gsttimeoverlay.c +++ b/ext/pango/gsttimeoverlay.c @@ -45,25 +45,30 @@ /* GstTimeoverlay signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_timeoverlay_base_init (gpointer g_class); -static void gst_timeoverlay_class_init (gpointer g_class, gpointer class_data); -static void gst_timeoverlay_init (GTypeInstance *instance, gpointer g_class); +static void gst_timeoverlay_base_init (gpointer g_class); +static void gst_timeoverlay_class_init (gpointer g_class, gpointer class_data); +static void gst_timeoverlay_init (GTypeInstance * instance, gpointer g_class); -static void gst_timeoverlay_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_timeoverlay_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_timeoverlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_timeoverlay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_timeoverlay_planar411(GstVideofilter *videofilter, void *dest, void *src); -static void gst_timeoverlay_setup(GstVideofilter *videofilter); +static void gst_timeoverlay_planar411 (GstVideofilter * videofilter, void *dest, + void *src); +static void gst_timeoverlay_setup (GstVideofilter * videofilter); GType gst_timeoverlay_get_type (void) @@ -72,44 +77,43 @@ gst_timeoverlay_get_type (void) if (!timeoverlay_type) { static const GTypeInfo timeoverlay_info = { - sizeof(GstTimeoverlayClass), + sizeof (GstTimeoverlayClass), gst_timeoverlay_base_init, NULL, gst_timeoverlay_class_init, NULL, NULL, - sizeof(GstTimeoverlay), + sizeof (GstTimeoverlay), 0, gst_timeoverlay_init, }; - timeoverlay_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstTimeoverlay", &timeoverlay_info, 0); + timeoverlay_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstTimeoverlay", &timeoverlay_info, 0); } return timeoverlay_type; } static GstVideofilterFormat gst_timeoverlay_formats[] = { - { "I420", 12, gst_timeoverlay_planar411, }, + {"I420", 12, gst_timeoverlay_planar411,}, }; - + static void gst_timeoverlay_base_init (gpointer g_class) { - static GstElementDetails timeoverlay_details = GST_ELEMENT_DETAILS ( - "Time Overlay", - "Filter/Editor/Video", - "Overlays the time on a video stream", - "David Schleef " - ); + static GstElementDetails timeoverlay_details = + GST_ELEMENT_DETAILS ("Time Overlay", + "Filter/Editor/Video", + "Overlays the time on a video stream", + "David Schleef "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &timeoverlay_details); - for(i=0;iset_property = gst_timeoverlay_set_property; @@ -139,28 +143,29 @@ gst_timeoverlay_class_init (gpointer g_class, gpointer class_data) } static void -gst_timeoverlay_init (GTypeInstance *instance, gpointer g_class) +gst_timeoverlay_init (GTypeInstance * instance, gpointer g_class) { GstTimeoverlay *timeoverlay = GST_TIMEOVERLAY (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_timeoverlay_init"); + GST_DEBUG ("gst_timeoverlay_init"); - videofilter = GST_VIDEOFILTER(timeoverlay); + videofilter = GST_VIDEOFILTER (timeoverlay); /* do stuff */ } static void -gst_timeoverlay_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_timeoverlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstTimeoverlay *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_TIMEOVERLAY(object)); - src = GST_TIMEOVERLAY(object); + g_return_if_fail (GST_IS_TIMEOVERLAY (object)); + src = GST_TIMEOVERLAY (object); - GST_DEBUG("gst_timeoverlay_set_property"); + GST_DEBUG ("gst_timeoverlay_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: @@ -173,13 +178,14 @@ gst_timeoverlay_set_property (GObject *object, guint prop_id, const GValue *valu } static void -gst_timeoverlay_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_timeoverlay_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstTimeoverlay *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_TIMEOVERLAY(object)); - src = GST_TIMEOVERLAY(object); + g_return_if_fail (GST_IS_TIMEOVERLAY (object)); + src = GST_TIMEOVERLAY (object); switch (prop_id) { #if 0 @@ -193,35 +199,29 @@ gst_timeoverlay_get_property (GObject *object, guint prop_id, GValue *value, GPa } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; return gst_element_register (plugin, "timeoverlay", GST_RANK_NONE, GST_TYPE_TIMEOVERLAY); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "timeoverlay", - "Time overlay", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - -static void gst_timeoverlay_setup(GstVideofilter *videofilter) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "timeoverlay", + "Time overlay", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) + + static void gst_timeoverlay_setup (GstVideofilter * videofilter) { GstTimeoverlay *timeoverlay; PangoFontDescription *font_description; PangoContext *context; - g_return_if_fail(GST_IS_TIMEOVERLAY(videofilter)); - timeoverlay = GST_TIMEOVERLAY(videofilter); + g_return_if_fail (GST_IS_TIMEOVERLAY (videofilter)); + timeoverlay = GST_TIMEOVERLAY (videofilter); /* if any setup needs to be done, do it here */ @@ -246,7 +246,8 @@ static void gst_timeoverlay_setup(GstVideofilter *videofilter) } -static char *gst_timeoverlay_print_smpte_time(guint64 time) +static char * +gst_timeoverlay_print_smpte_time (guint64 time) { int hours; int minutes; @@ -254,21 +255,21 @@ static char *gst_timeoverlay_print_smpte_time(guint64 time) int ms; double x; - x = rint((time + 500000)*1e-6); + x = rint ((time + 500000) * 1e-6); - hours = floor(x/(60*60*1000)); - x -= hours*60*60*1000; - minutes = floor(x/(60*1000)); - x -= minutes*60*1000; - seconds = floor(x/(1000)); - x -= seconds*1000; - ms = rint(x); + hours = floor (x / (60 * 60 * 1000)); + x -= hours * 60 * 60 * 1000; + minutes = floor (x / (60 * 1000)); + x -= minutes * 60 * 1000; + seconds = floor (x / (1000)); + x -= seconds * 1000; + ms = rint (x); - return g_strdup_printf("%02d:%02d:%02d.%03d",hours,minutes,seconds,ms); + return g_strdup_printf ("%02d:%02d:%02d.%03d", hours, minutes, seconds, ms); } -static void gst_timeoverlay_planar411(GstVideofilter *videofilter, - void *dest, void *src) +static void +gst_timeoverlay_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstTimeoverlay *timeoverlay; int width; @@ -280,19 +281,21 @@ static void gst_timeoverlay_planar411(GstVideofilter *videofilter, char *string; int i; - g_return_if_fail(GST_IS_TIMEOVERLAY(videofilter)); - timeoverlay = GST_TIMEOVERLAY(videofilter); + g_return_if_fail (GST_IS_TIMEOVERLAY (videofilter)); + timeoverlay = GST_TIMEOVERLAY (videofilter); - width = gst_videofilter_get_input_width(videofilter); - height = gst_videofilter_get_input_height(videofilter); + width = gst_videofilter_get_input_width (videofilter); + height = gst_videofilter_get_input_height (videofilter); - width = gst_videofilter_get_input_width(videofilter); - height = gst_videofilter_get_input_height(videofilter); + width = gst_videofilter_get_input_width (videofilter); + height = gst_videofilter_get_input_height (videofilter); layout = pango_layout_new (timeoverlay->context); - string = gst_timeoverlay_print_smpte_time(GST_BUFFER_TIMESTAMP(videofilter->in_buf)); - pango_layout_set_text (layout, string, strlen(string)); - g_free(string); + string = + gst_timeoverlay_print_smpte_time (GST_BUFFER_TIMESTAMP (videofilter-> + in_buf)); + pango_layout_set_text (layout, string, strlen (string)); + g_free (string); pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT); pango_layout_set_width (layout, -1); @@ -303,15 +306,15 @@ static void gst_timeoverlay_planar411(GstVideofilter *videofilter, //hheight = 20; - memcpy(dest, src, videofilter->from_buf_size); + memcpy (dest, src, videofilter->from_buf_size); - for(i=0;i\n" - "Daniel Fischer " -); +static GstElementDetails gst_dv1394src_details = +GST_ELEMENT_DETAILS ("Firewire (1394) DV Source", + "Source/Video", + "Source for DV video data from firewire port", + "Erik Walthinsen \n" + "Daniel Fischer "); #if 0 -static GstPadTemplate* +static GstPadTemplate * gst_dv1394src_factory (void) { static GstPadTemplate *template = NULL; if (!template) { - template = gst_pad_template_new ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "dv1394src", - "video/dv", - gst_props_new ( - "format", GST_PROPS_LIST ( - G_TYPE_STRING ("NTSC"), - G_TYPE_STRING ("PAL") - ), - NULL) - ), - NULL); + template = gst_pad_template_new ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("dv1394src", + "video/dv", + gst_props_new ("format", GST_PROPS_LIST (G_TYPE_STRING ("NTSC"), + G_TYPE_STRING ("PAL") + ), NULL) + ), NULL); } return template; } #endif -static void gst_dv1394src_base_init (gpointer g_class); -static void gst_dv1394src_class_init (GstDV1394SrcClass *klass); -static void gst_dv1394src_init (GstDV1394Src *filter); +static void gst_dv1394src_base_init (gpointer g_class); +static void gst_dv1394src_class_init (GstDV1394SrcClass * klass); +static void gst_dv1394src_init (GstDV1394Src * filter); -static void gst_dv1394src_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_dv1394src_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_dv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dv1394src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_dv1394src_change_state (GstElement *element); +static GstElementStateReturn gst_dv1394src_change_state (GstElement * element); -static GstData * gst_dv1394src_get (GstPad *pad); +static GstData *gst_dv1394src_get (GstPad * pad); static GstElementClass *parent_class = NULL; + /*static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_dv1394src_get_type(void) { +gst_dv1394src_get_type (void) +{ static GType gst_dv1394src_type = 0; if (!gst_dv1394src_type) { static const GTypeInfo gst_dv1394src_info = { - sizeof(GstDV1394Src), + sizeof (GstDV1394Src), gst_dv1394src_base_init, NULL, - (GClassInitFunc)gst_dv1394src_class_init, + (GClassInitFunc) gst_dv1394src_class_init, NULL, NULL, - sizeof(GstDV1394Src), + sizeof (GstDV1394Src), 0, - (GInstanceInitFunc)gst_dv1394src_init, + (GInstanceInitFunc) gst_dv1394src_init, }; - gst_dv1394src_type = g_type_register_static(GST_TYPE_ELEMENT, "DV1394Src", &gst_dv1394src_info, 0); + gst_dv1394src_type = + g_type_register_static (GST_TYPE_ELEMENT, "DV1394Src", + &gst_dv1394src_info, 0); } return gst_dv1394src_type; } @@ -122,25 +123,26 @@ gst_dv1394src_base_init (gpointer g_class) } static void -gst_dv1394src_class_init (GstDV1394SrcClass *klass) +gst_dv1394src_class_init (GstDV1394SrcClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property( G_OBJECT_CLASS(klass), ARG_CONSECUTIVE, - g_param_spec_int("consecutive","consecutive frames","send n consecutive frames after skipping", - 1, G_MAXINT,1,G_PARAM_READWRITE)); - g_object_class_install_property( G_OBJECT_CLASS(klass), ARG_SKIP, - g_param_spec_int("skip","skip frames","skip n frames", - 0, G_MAXINT,1,G_PARAM_READWRITE)); - g_object_class_install_property( G_OBJECT_CLASS(klass), ARG_DROP_INCOMPLETE, - g_param_spec_boolean("drop_incomplete","drop_incomplete","drop incomplete frames", - TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONSECUTIVE, + g_param_spec_int ("consecutive", "consecutive frames", + "send n consecutive frames after skipping", 1, G_MAXINT, 1, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SKIP, + g_param_spec_int ("skip", "skip frames", "skip n frames", 0, G_MAXINT, 1, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DROP_INCOMPLETE, + g_param_spec_boolean ("drop_incomplete", "drop_incomplete", + "drop incomplete frames", TRUE, G_PARAM_READWRITE)); - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_dv1394src_set_property; gobject_class->get_property = gst_dv1394src_get_property; @@ -149,7 +151,7 @@ gst_dv1394src_class_init (GstDV1394SrcClass *klass) } static void -gst_dv1394src_init (GstDV1394Src *dv1394src) +gst_dv1394src_init (GstDV1394Src * dv1394src) { dv1394src->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_pad_set_get_function (dv1394src->srcpad, gst_dv1394src_get); @@ -158,188 +160,199 @@ gst_dv1394src_init (GstDV1394Src *dv1394src) dv1394src->card = 0; dv1394src->port = 0; dv1394src->channel = 63; - + dv1394src->consecutive = 1; dv1394src->skip = 0; dv1394src->drop_incomplete = TRUE; - + /* initialized when first header received */ - dv1394src->frameSize=0; - + dv1394src->frameSize = 0; + dv1394src->buf = NULL; dv1394src->frame = NULL; dv1394src->frameSequence = 0; } static void -gst_dv1394src_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_dv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstDV1394Src *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_DV1394SRC(object)); - filter = GST_DV1394SRC(object); + g_return_if_fail (GST_IS_DV1394SRC (object)); + filter = GST_DV1394SRC (object); switch (prop_id) { case ARG_SKIP: - filter->skip = g_value_get_int(value); - break; + filter->skip = g_value_get_int (value); + break; case ARG_CONSECUTIVE: - filter->consecutive = g_value_get_int(value); - break; + filter->consecutive = g_value_get_int (value); + break; case ARG_DROP_INCOMPLETE: - filter->drop_incomplete = g_value_get_boolean(value); - break; + filter->drop_incomplete = g_value_get_boolean (value); + break; default: break; } } static void -gst_dv1394src_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstDV1394Src *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_DV1394SRC(object)); - filter = GST_DV1394SRC(object); + g_return_if_fail (GST_IS_DV1394SRC (object)); + filter = GST_DV1394SRC (object); switch (prop_id) { case ARG_SKIP: - g_value_set_int( value, filter->skip ); - break; + g_value_set_int (value, filter->skip); + break; case ARG_CONSECUTIVE: - g_value_set_int( value, filter->consecutive ); - break; + g_value_set_int (value, filter->consecutive); + break; case ARG_DROP_INCOMPLETE: - g_value_set_boolean( value, filter->drop_incomplete ); - break; + g_value_set_boolean (value, filter->drop_incomplete); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -static -int gst_dv1394src_iso_receive(raw1394handle_t handle,int channel,size_t len,quadlet_t *data) { - GstDV1394Src *dv1394src = GST_DV1394SRC (raw1394_get_userdata(handle)); +static int +gst_dv1394src_iso_receive (raw1394handle_t handle, int channel, size_t len, + quadlet_t * data) +{ + GstDV1394Src *dv1394src = GST_DV1394SRC (raw1394_get_userdata (handle)); if (len > 16) { - /* - the following code taken from kino-0.51 (Dan Dennedy/Charles Yates) - */ - unsigned char *p = (unsigned char*) & data[3]; - int section_type = p[0] >> 5; /* section type is in bits 5 - 7 */ - int dif_sequence = p[1] >> 4; /* dif sequence number is in bits 4 - 7 */ - int dif_block = p[2]; - - /* if we are at the beginning of a frame, - we set buf=frame, and alloc a new buffer for frame - */ - - if (section_type == 0 && dif_sequence == 0) { // dif header - - if( !dv1394src->negotiated) { - // figure format (NTSC/PAL) - if( p[3] & 0x80 ) { - // PAL - dv1394src->frameSize = PAL_FRAMESIZE; - GST_DEBUG ("PAL data"); - if (gst_pad_try_set_caps (dv1394src->srcpad, - gst_caps_new_simple ("video/dv", - "format", G_TYPE_STRING, "PAL", NULL)) <= 0) { - GST_ELEMENT_ERROR (dv1394src, CORE, NEGOTIATION, (NULL), - ("Could not set source caps for PAL")); - return 0; - } - } else { - // NTSC (untested) - dv1394src->frameSize = NTSC_FRAMESIZE; - GST_DEBUG ("NTSC data [untested] - please report success/failure to "); - if (gst_pad_try_set_caps (dv1394src->srcpad, - gst_caps_new_simple ("video/dv", - "format", G_TYPE_STRING, "NTSC", NULL)) <= 0) { - GST_ELEMENT_ERROR (dv1394src, CORE, NEGOTIATION, (NULL), - ("Could not set source caps for NTSC")); - return 0; - } - } - dv1394src->negotiated = TRUE; - } - - // drop last frame when not complete - if( !dv1394src->drop_incomplete || dv1394src->bytesInFrame == dv1394src->frameSize ) { - dv1394src->buf = dv1394src->frame; - } else { - GST_INFO_OBJECT (GST_ELEMENT(dv1394src), "incomplete frame dropped"); - } - dv1394src->frame = NULL; - - dv1394src->frameSequence++; - - if( dv1394src->frameSequence % (dv1394src->skip+dv1394src->consecutive) < dv1394src->consecutive ) { - dv1394src->frame = gst_buffer_new_and_alloc (dv1394src->frameSize); - } - dv1394src->bytesInFrame = 0; - } - - if (dv1394src->frame != NULL) { - void *data = GST_BUFFER_DATA( dv1394src->frame ); - - - switch (section_type) { - case 0: /* 1 Header block */ - /* p[3] |= 0x80; // hack to force PAL data */ - memcpy(data + dif_sequence * 150 * 80, p, 480); - break; - - case 1: /* 2 Subcode blocks */ - memcpy(data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p, 480); - break; - - case 2: /* 3 VAUX blocks */ - memcpy(data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p, 480); - break; - - case 3: /* 9 Audio blocks interleaved with video */ - memcpy(data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p, 480); - break; - - case 4: /* 135 Video blocks interleaved with audio */ - memcpy(data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + dif_block) * 80, p, 480); - break; - - default: /* we can´t handle any other data */ - break; - } - dv1394src->bytesInFrame += 480; - } + /* + the following code taken from kino-0.51 (Dan Dennedy/Charles Yates) + */ + unsigned char *p = (unsigned char *) &data[3]; + int section_type = p[0] >> 5; /* section type is in bits 5 - 7 */ + int dif_sequence = p[1] >> 4; /* dif sequence number is in bits 4 - 7 */ + int dif_block = p[2]; + + /* if we are at the beginning of a frame, + we set buf=frame, and alloc a new buffer for frame + */ + + if (section_type == 0 && dif_sequence == 0) { // dif header + + if (!dv1394src->negotiated) { + // figure format (NTSC/PAL) + if (p[3] & 0x80) { + // PAL + dv1394src->frameSize = PAL_FRAMESIZE; + GST_DEBUG ("PAL data"); + if (gst_pad_try_set_caps (dv1394src->srcpad, + gst_caps_new_simple ("video/dv", + "format", G_TYPE_STRING, "PAL", NULL)) <= 0) { + GST_ELEMENT_ERROR (dv1394src, CORE, NEGOTIATION, (NULL), + ("Could not set source caps for PAL")); + return 0; + } + } else { + // NTSC (untested) + dv1394src->frameSize = NTSC_FRAMESIZE; + GST_DEBUG + ("NTSC data [untested] - please report success/failure to "); + if (gst_pad_try_set_caps (dv1394src->srcpad, + gst_caps_new_simple ("video/dv", "format", G_TYPE_STRING, + "NTSC", NULL)) <= 0) { + GST_ELEMENT_ERROR (dv1394src, CORE, NEGOTIATION, (NULL), + ("Could not set source caps for NTSC")); + return 0; + } + } + dv1394src->negotiated = TRUE; + } + // drop last frame when not complete + if (!dv1394src->drop_incomplete + || dv1394src->bytesInFrame == dv1394src->frameSize) { + dv1394src->buf = dv1394src->frame; + } else { + GST_INFO_OBJECT (GST_ELEMENT (dv1394src), "incomplete frame dropped"); + } + dv1394src->frame = NULL; + + dv1394src->frameSequence++; + + if (dv1394src->frameSequence % (dv1394src->skip + + dv1394src->consecutive) < dv1394src->consecutive) { + dv1394src->frame = gst_buffer_new_and_alloc (dv1394src->frameSize); + } + dv1394src->bytesInFrame = 0; + } + + if (dv1394src->frame != NULL) { + void *data = GST_BUFFER_DATA (dv1394src->frame); + + + switch (section_type) { + case 0: /* 1 Header block */ + /* p[3] |= 0x80; // hack to force PAL data */ + memcpy (data + dif_sequence * 150 * 80, p, 480); + break; + + case 1: /* 2 Subcode blocks */ + memcpy (data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p, + 480); + break; + + case 2: /* 3 VAUX blocks */ + memcpy (data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p, + 480); + break; + + case 3: /* 9 Audio blocks interleaved with video */ + memcpy (data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p, + 480); + break; + + case 4: /* 135 Video blocks interleaved with audio */ + memcpy (data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + + dif_block) * 80, p, 480); + break; + + default: /* we can´t handle any other data */ + break; + } + dv1394src->bytesInFrame += 480; + } } return 0; } -static -int gst_dv1394src_bus_reset(raw1394handle_t handle, - unsigned int generation) { - GST_INFO_OBJECT (GST_DV1394SRC(raw1394_get_userdata(handle)),"have bus reset"); +static int +gst_dv1394src_bus_reset (raw1394handle_t handle, unsigned int generation) +{ + GST_INFO_OBJECT (GST_DV1394SRC (raw1394_get_userdata (handle)), + "have bus reset"); return 0; } static GstData * -gst_dv1394src_get (GstPad *pad) +gst_dv1394src_get (GstPad * pad) { - GstDV1394Src *dv1394src = GST_DV1394SRC (GST_PAD_PARENT(pad)); + GstDV1394Src *dv1394src = GST_DV1394SRC (GST_PAD_PARENT (pad)); dv1394src->buf = NULL; while (dv1394src->buf == NULL) - raw1394_loop_iterate(dv1394src->handle); + raw1394_loop_iterate (dv1394src->handle); - return GST_DATA(dv1394src->buf); -} + return GST_DATA (dv1394src->buf); +} static GstElementStateReturn -gst_dv1394src_change_state (GstElement *element) +gst_dv1394src_change_state (GstElement * element) { GstDV1394Src *dv1394src; @@ -348,46 +361,49 @@ gst_dv1394src_change_state (GstElement *element) switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: - if ((dv1394src->handle = raw1394_new_handle()) == NULL) { - GST_INFO_OBJECT (dv1394src,"can't get raw1394 handle"); - return GST_STATE_FAILURE; + if ((dv1394src->handle = raw1394_new_handle ()) == NULL) { + GST_INFO_OBJECT (dv1394src, "can't get raw1394 handle"); + return GST_STATE_FAILURE; } - raw1394_set_userdata(dv1394src->handle,dv1394src); - dv1394src->numcards = raw1394_get_port_info(dv1394src->handle,dv1394src->pinfo,16); + raw1394_set_userdata (dv1394src->handle, dv1394src); + dv1394src->numcards = + raw1394_get_port_info (dv1394src->handle, dv1394src->pinfo, 16); if (dv1394src->numcards == 0) { - GST_INFO_OBJECT (dv1394src,"no cards available for raw1394"); - return GST_STATE_FAILURE; + GST_INFO_OBJECT (dv1394src, "no cards available for raw1394"); + return GST_STATE_FAILURE; } if (dv1394src->pinfo[dv1394src->card].nodes <= 1) { - GST_INFO_OBJECT (dv1394src,"there are no nodes on the 1394 bus"); - return GST_STATE_FAILURE; + GST_INFO_OBJECT (dv1394src, "there are no nodes on the 1394 bus"); + return GST_STATE_FAILURE; } - if (raw1394_set_port(dv1394src->handle,dv1394src->port) < 0) { - GST_INFO_OBJECT (dv1394src,"can't set 1394 port %d",dv1394src->port); - return GST_STATE_FAILURE; + if (raw1394_set_port (dv1394src->handle, dv1394src->port) < 0) { + GST_INFO_OBJECT (dv1394src, "can't set 1394 port %d", dv1394src->port); + return GST_STATE_FAILURE; } - raw1394_set_iso_handler(dv1394src->handle,dv1394src->channel,gst_dv1394src_iso_receive); - raw1394_set_bus_reset_handler(dv1394src->handle,gst_dv1394src_bus_reset); + raw1394_set_iso_handler (dv1394src->handle, dv1394src->channel, + gst_dv1394src_iso_receive); + raw1394_set_bus_reset_handler (dv1394src->handle, + gst_dv1394src_bus_reset); dv1394src->started = FALSE; GST_DEBUG ("successfully opened up 1394 connection"); break; case GST_STATE_PAUSED_TO_PLAYING: - if (raw1394_start_iso_rcv(dv1394src->handle,dv1394src->channel) < 0) { - GST_INFO_OBJECT (dv1394src,"can't start 1394 iso receive"); - return GST_STATE_FAILURE; + if (raw1394_start_iso_rcv (dv1394src->handle, dv1394src->channel) < 0) { + GST_INFO_OBJECT (dv1394src, "can't start 1394 iso receive"); + return GST_STATE_FAILURE; } break; case GST_STATE_PLAYING_TO_PAUSED: - raw1394_stop_iso_rcv(dv1394src->handle, dv1394src->channel); + raw1394_stop_iso_rcv (dv1394src->handle, dv1394src->channel); break; case GST_STATE_READY_TO_NULL: - raw1394_destroy_handle(dv1394src->handle); + raw1394_destroy_handle (dv1394src->handle); break; default: break; } - /* if we haven't failed already, give the parent class a chance to ;-) */ + /* if we haven't failed already, give the parent class a chance to ;-) */ if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); diff --git a/ext/raw1394/gstdv1394src.h b/ext/raw1394/gstdv1394src.h index 7d384fd0..2ba4ab3d 100644 --- a/ext/raw1394/gstdv1394src.h +++ b/ext/raw1394/gstdv1394src.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_DV1394SRC \ @@ -42,45 +43,47 @@ extern "C" { #define GST_IS_DV1394SRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DV1394SRC)) -typedef struct _GstDV1394Src GstDV1394Src; -typedef struct _GstDV1394SrcClass GstDV1394SrcClass; + typedef struct _GstDV1394Src GstDV1394Src; + typedef struct _GstDV1394SrcClass GstDV1394SrcClass; -struct _GstDV1394Src { - GstElement element; + struct _GstDV1394Src + { + GstElement element; - GstPad *srcpad; + GstPad *srcpad; - // consecutive=2, skip=4 will skip 4 frames, then let 2 consecutive ones thru - gint consecutive; - gint skip; - gboolean drop_incomplete; + // consecutive=2, skip=4 will skip 4 frames, then let 2 consecutive ones thru + gint consecutive; + gint skip; + gboolean drop_incomplete; - int numcards,numports; - int card,port,channel; + int numcards, numports; + int card, port, channel; - struct raw1394_portinfo pinfo[16]; - raw1394handle_t handle; + struct raw1394_portinfo pinfo[16]; + raw1394handle_t handle; - gboolean started; - GstBuffer *buf; - - GstBuffer *frame; - guint frameSize; - guint bytesInFrame; - guint frameSequence; + gboolean started; + GstBuffer *buf; - gboolean negotiated; -}; + GstBuffer *frame; + guint frameSize; + guint bytesInFrame; + guint frameSequence; -struct _GstDV1394SrcClass { - GstElementClass parent_class; -}; + gboolean negotiated; + }; -GType gst_dv1394src_get_type(void); + struct _GstDV1394SrcClass + { + GstElementClass parent_class; + }; + + GType gst_dv1394src_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_GST1394_H__ */ +#endif /* __GST_GST1394_H__ */ diff --git a/ext/shout2/gstshout2.c b/ext/shout2/gstshout2.c index 3b07dd7d..4a1d4a1e 100644 --- a/ext/shout2/gstshout2.c +++ b/ext/shout2/gstshout2.c @@ -29,177 +29,163 @@ static GstElementDetails shout2send_details = { "An Icecast plugin", "Sink/Network", "Sends data to an icecast server", - "Wim Taymans \n" - "Pedro Corte-Real " + "Wim Taymans \n" "Pedro Corte-Real " }; unsigned int audio_format = 100; /* Shout2send signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, - ARG_IP, /* the ip of the server */ - ARG_PORT, /* the encoder port number on the server */ - ARG_PASSWORD, /* the encoder password on the server */ - ARG_PUBLIC, /* is this stream public? */ - ARG_NAME, /* Name of the stream */ - ARG_DESCRIPTION, /* Description of the stream */ - ARG_GENRE, /* Genre of the stream */ - - ARG_PROTOCOL, /* Protocol to connect with */ - - ARG_MOUNT, /* mountpoint of stream (icecast only) */ - ARG_URL, /* Url of stream (I'm guessing) */ + ARG_IP, /* the ip of the server */ + ARG_PORT, /* the encoder port number on the server */ + ARG_PASSWORD, /* the encoder password on the server */ + ARG_PUBLIC, /* is this stream public? */ + ARG_NAME, /* Name of the stream */ + ARG_DESCRIPTION, /* Description of the stream */ + ARG_GENRE, /* Genre of the stream */ + + ARG_PROTOCOL, /* Protocol to connect with */ + + ARG_MOUNT, /* mountpoint of stream (icecast only) */ + ARG_URL, /* Url of stream (I'm guessing) */ }; -static GstPadTemplate* +static GstPadTemplate * sink_template_factory (void) { static GstPadTemplate *template = NULL; - + if (!template) { - template = gst_pad_template_new ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - gst_caps_new ( - "shout2send_sink", - "application/ogg", - NULL), - gst_caps_new ( - "shout2send_sink", - "audio/mpeg", - gst_props_new ( - "mpegversion", GST_PROPS_INT (1), - "layer", GST_PROPS_INT_RANGE (1, 3), - NULL - )), - NULL); + template = gst_pad_template_new ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + gst_caps_new ("shout2send_sink", + "application/ogg", + NULL), + gst_caps_new ("shout2send_sink", + "audio/mpeg", + gst_props_new ("mpegversion", GST_PROPS_INT (1), + "layer", GST_PROPS_INT_RANGE (1, 3), NULL)), NULL); } return template; } -static void gst_shout2send_class_init (GstShout2sendClass *klass); -static void gst_shout2send_base_init (GstShout2sendClass *klass); -static void gst_shout2send_init (GstShout2send *shout2send); +static void gst_shout2send_class_init (GstShout2sendClass * klass); +static void gst_shout2send_base_init (GstShout2sendClass * klass); +static void gst_shout2send_init (GstShout2send * shout2send); -static void gst_shout2send_chain (GstPad *pad, GstData *_data); -static GstPadLinkReturn gst_shout2send_connect (GstPad *pad, GstCaps *caps); +static void gst_shout2send_chain (GstPad * pad, GstData * _data); +static GstPadLinkReturn gst_shout2send_connect (GstPad * pad, GstCaps * caps); -static void gst_shout2send_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_shout2send_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_shout2send_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_shout2send_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_shout2send_change_state (GstElement *element); +static GstElementStateReturn gst_shout2send_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_shout2send_signals[LAST_SIGNAL] = { 0 }; */ #define GST_TYPE_SHOUT_PROTOCOL (gst_shout2send_protocol_get_type()) static GType -gst_shout2send_protocol_get_type (void) +gst_shout2send_protocol_get_type (void) { static GType shout2send_protocol_type = 0; static GEnumValue shout2send_protocol[] = { - { SHOUT2SEND_PROTOCOL_ICE, "1", "Ice Protocol"}, - { SHOUT2SEND_PROTOCOL_XAUDIOCAST, "2", "Xaudiocast Protocol (icecast 1.3.x)"}, - { SHOUT2SEND_PROTOCOL_ICY, "3", "Icy Protocol (ShoutCast)"}, - { SHOUT2SEND_PROTOCOL_HTTP, "4", "Http Protocol (icecast 2.x)"}, + {SHOUT2SEND_PROTOCOL_ICE, "1", "Ice Protocol"}, + {SHOUT2SEND_PROTOCOL_XAUDIOCAST, "2", + "Xaudiocast Protocol (icecast 1.3.x)"}, + {SHOUT2SEND_PROTOCOL_ICY, "3", "Icy Protocol (ShoutCast)"}, + {SHOUT2SEND_PROTOCOL_HTTP, "4", "Http Protocol (icecast 2.x)"}, {0, NULL, NULL}, }; if (!shout2send_protocol_type) { - shout2send_protocol_type = g_enum_register_static ("GstShout2SendProtocol", shout2send_protocol); + shout2send_protocol_type = + g_enum_register_static ("GstShout2SendProtocol", shout2send_protocol); } return shout2send_protocol_type; } GType -gst_shout2send_get_type(void) +gst_shout2send_get_type (void) { static GType shout2send_type = 0; if (!shout2send_type) { static const GTypeInfo shout2send_info = { - sizeof(GstShout2sendClass), - (GBaseInitFunc)gst_shout2send_base_init, + sizeof (GstShout2sendClass), + (GBaseInitFunc) gst_shout2send_base_init, NULL, - (GClassInitFunc)gst_shout2send_class_init, + (GClassInitFunc) gst_shout2send_class_init, NULL, NULL, - sizeof(GstShout2send), + sizeof (GstShout2send), 0, - (GInstanceInitFunc)gst_shout2send_init, + (GInstanceInitFunc) gst_shout2send_init, }; - shout2send_type = g_type_register_static(GST_TYPE_ELEMENT, "GstShout2send", &shout2send_info, 0); + shout2send_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstShout2send", + &shout2send_info, 0); } return shout2send_type; } static void -gst_shout2send_base_init (GstShout2sendClass *klass) +gst_shout2send_base_init (GstShout2sendClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_pad_template (element_class, sink_template_factory()); + gst_element_class_add_pad_template (element_class, sink_template_factory ()); gst_element_class_set_details (element_class, &shout2send_details); } static void -gst_shout2send_class_init (GstShout2sendClass *klass) +gst_shout2send_class_init (GstShout2sendClass * 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); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_IP, - g_param_spec_string("ip","ip","ip", - NULL, G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_PORT, - g_param_spec_int("port","port","port", - 1,G_MAXUSHORT,8000,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_IP, g_param_spec_string ("ip", "ip", "ip", NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT, g_param_spec_int ("port", "port", "port", 1, G_MAXUSHORT, 8000, G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_PASSWORD, - g_param_spec_string("password","password","password", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PASSWORD, g_param_spec_string ("password", "password", "password", NULL, G_PARAM_READWRITE)); /* CHECKME */ /* metadata */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_NAME, - g_param_spec_string("name","name","name", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NAME, g_param_spec_string ("name", "name", "name", NULL, G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DESCRIPTION, - g_param_spec_string("description","description","description", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DESCRIPTION, g_param_spec_string ("description", "description", "description", NULL, G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_GENRE, - g_param_spec_string("genre","genre","genre", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GENRE, g_param_spec_string ("genre", "genre", "genre", NULL, G_PARAM_READWRITE)); /* CHECKME */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROTOCOL, - g_param_spec_enum ("protocol", "protocol", "Connection Protocol to use", - GST_TYPE_SHOUT_PROTOCOL, SHOUT2SEND_PROTOCOL_HTTP, G_PARAM_READWRITE)); + g_param_spec_enum ("protocol", "protocol", "Connection Protocol to use", + GST_TYPE_SHOUT_PROTOCOL, SHOUT2SEND_PROTOCOL_HTTP, + G_PARAM_READWRITE)); /* icecast only */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MOUNT, - g_param_spec_string("mount","mount","mount", - NULL, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MOUNT, g_param_spec_string ("mount", "mount", "mount", NULL, G_PARAM_READWRITE)); /* CHECKME */ + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_URL, g_param_spec_string ("url", "url", "url", NULL, G_PARAM_READWRITE)); /* CHECKME */ + - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_URL, - g_param_spec_string("url","url","url", - NULL, G_PARAM_READWRITE)); /* CHECKME */ - - gobject_class->set_property = gst_shout2send_set_property; gobject_class->get_property = gst_shout2send_get_property; @@ -207,11 +193,12 @@ gst_shout2send_class_init (GstShout2sendClass *klass) } static void -gst_shout2send_init (GstShout2send *shout2send) +gst_shout2send_init (GstShout2send * shout2send) { - shout2send->sinkpad = gst_pad_new_from_template (sink_template_factory (), "sink"); - gst_element_add_pad(GST_ELEMENT(shout2send),shout2send->sinkpad); - gst_pad_set_chain_function(shout2send->sinkpad,gst_shout2send_chain); + shout2send->sinkpad = + gst_pad_new_from_template (sink_template_factory (), "sink"); + gst_element_add_pad (GST_ELEMENT (shout2send), shout2send->sinkpad); + gst_pad_set_chain_function (shout2send->sinkpad, gst_shout2send_chain); gst_pad_set_link_function (shout2send->sinkpad, gst_shout2send_connect); @@ -227,15 +214,15 @@ gst_shout2send_init (GstShout2send *shout2send) } static void -gst_shout2send_chain (GstPad *pad, GstData *_data) +gst_shout2send_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstShout2send *shout2send; glong ret; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); shout2send = GST_SHOUT2SEND (GST_OBJECT_PARENT (pad)); @@ -243,9 +230,9 @@ gst_shout2send_chain (GstPad *pad, GstData *_data) g_return_if_fail (GST_IS_SHOUT2SEND (shout2send)); ret = shout_send (shout2send->conn, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf)); + GST_BUFFER_SIZE (buf)); if (ret != SHOUTERR_SUCCESS) { - g_warning ("send error: %s...\n", shout_get_error(shout2send->conn)); + g_warning ("send error: %s...\n", shout_get_error (shout2send->conn)); } shout_sync (shout2send->conn); @@ -254,147 +241,145 @@ gst_shout2send_chain (GstPad *pad, GstData *_data) } static void -gst_shout2send_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_shout2send_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstShout2send *shout2send; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SHOUT2SEND(object)); - shout2send = GST_SHOUT2SEND(object); + g_return_if_fail (GST_IS_SHOUT2SEND (object)); + shout2send = GST_SHOUT2SEND (object); switch (prop_id) { - case ARG_IP: - if (shout2send->ip) - g_free (shout2send->ip); - shout2send->ip = g_strdup (g_value_get_string (value)); - break; - - case ARG_PORT: - shout2send->port = g_value_get_int (value); - break; - - case ARG_PASSWORD: - if (shout2send->password) - g_free (shout2send->password); - shout2send->password = g_strdup (g_value_get_string (value)); - break; - - case ARG_NAME: /* Name of the stream */ - if (shout2send->name) - g_free (shout2send->name); - shout2send->name = g_strdup (g_value_get_string (value)); - break; - - case ARG_DESCRIPTION: /* Description of the stream */ - if (shout2send->description) - g_free (shout2send->description); - shout2send->description = g_strdup (g_value_get_string (value)); - break; - - case ARG_GENRE: /* Genre of the stream */ - if (shout2send->genre) - g_free (shout2send->genre); - shout2send->genre = g_strdup (g_value_get_string (value)); - break; - - case ARG_PROTOCOL: /* protocol to connect with */ - shout2send->protocol = g_value_get_enum (value); - break; - - case ARG_MOUNT: /* mountpoint of stream (icecast only) */ - if (shout2send->mount) - g_free (shout2send->mount); - shout2send->mount = g_strdup (g_value_get_string (value)); - break; - - case ARG_URL: /* Url of the stream (I'm guessing) */ - if (shout2send->url) - g_free (shout2send->url); - shout2send->url = g_strdup (g_value_get_string (value)); - break; - - default: - break; + case ARG_IP: + if (shout2send->ip) + g_free (shout2send->ip); + shout2send->ip = g_strdup (g_value_get_string (value)); + break; + + case ARG_PORT: + shout2send->port = g_value_get_int (value); + break; + + case ARG_PASSWORD: + if (shout2send->password) + g_free (shout2send->password); + shout2send->password = g_strdup (g_value_get_string (value)); + break; + + case ARG_NAME: /* Name of the stream */ + if (shout2send->name) + g_free (shout2send->name); + shout2send->name = g_strdup (g_value_get_string (value)); + break; + + case ARG_DESCRIPTION: /* Description of the stream */ + if (shout2send->description) + g_free (shout2send->description); + shout2send->description = g_strdup (g_value_get_string (value)); + break; + + case ARG_GENRE: /* Genre of the stream */ + if (shout2send->genre) + g_free (shout2send->genre); + shout2send->genre = g_strdup (g_value_get_string (value)); + break; + + case ARG_PROTOCOL: /* protocol to connect with */ + shout2send->protocol = g_value_get_enum (value); + break; + + case ARG_MOUNT: /* mountpoint of stream (icecast only) */ + if (shout2send->mount) + g_free (shout2send->mount); + shout2send->mount = g_strdup (g_value_get_string (value)); + break; + + case ARG_URL: /* Url of the stream (I'm guessing) */ + if (shout2send->url) + g_free (shout2send->url); + shout2send->url = g_strdup (g_value_get_string (value)); + break; + + default: + break; } } static void -gst_shout2send_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_shout2send_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstShout2send *shout2send; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SHOUT2SEND(object)); - shout2send = GST_SHOUT2SEND(object); + g_return_if_fail (GST_IS_SHOUT2SEND (object)); + shout2send = GST_SHOUT2SEND (object); switch (prop_id) { - - case ARG_IP: - g_value_set_string (value, shout2send->ip); - break; - case ARG_PORT: - g_value_set_int (value, shout2send->port); - break; - case ARG_PASSWORD: - g_value_set_string (value, shout2send->password); - break; - - case ARG_NAME: /* Name of the stream */ - g_value_set_string (value, shout2send->name); - break; - - case ARG_DESCRIPTION: /* Description of the stream */ - g_value_set_string (value, shout2send->description); - break; - - case ARG_GENRE: /* Genre of the stream */ - g_value_set_string (value, shout2send->genre); - break; - - case ARG_PROTOCOL: /* protocol to connect with */ - g_value_set_enum (value, shout2send->protocol); - break; - - case ARG_MOUNT: /* mountpoint of stream (icecast only) */ - g_value_set_string (value, shout2send->mount); - break; - - case ARG_URL: /* Url of stream (I'm guessing) */ - g_value_set_string (value, shout2send->url); - break; - - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + + case ARG_IP: + g_value_set_string (value, shout2send->ip); + break; + case ARG_PORT: + g_value_set_int (value, shout2send->port); + break; + case ARG_PASSWORD: + g_value_set_string (value, shout2send->password); + break; + + case ARG_NAME: /* Name of the stream */ + g_value_set_string (value, shout2send->name); + break; + + case ARG_DESCRIPTION: /* Description of the stream */ + g_value_set_string (value, shout2send->description); + break; + + case ARG_GENRE: /* Genre of the stream */ + g_value_set_string (value, shout2send->genre); + break; + + case ARG_PROTOCOL: /* protocol to connect with */ + g_value_set_enum (value, shout2send->protocol); + break; + + case ARG_MOUNT: /* mountpoint of stream (icecast only) */ + g_value_set_string (value, shout2send->mount); + break; + + case ARG_URL: /* Url of stream (I'm guessing) */ + g_value_set_string (value, shout2send->url); + break; + + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } static GstPadLinkReturn -gst_shout2send_connect (GstPad *pad, GstCaps *caps) - +gst_shout2send_connect (GstPad * pad, GstCaps * caps) { - - if (!strcmp(gst_caps_get_mime (caps), "audio/mpeg")) - { - audio_format = SHOUT_FORMAT_MP3; - return GST_PAD_LINK_OK; - } - - if (!strcmp(gst_caps_get_mime (caps), "application/ogg")) - { - audio_format = SHOUT_FORMAT_VORBIS; - return GST_PAD_LINK_OK; - } - else { + + if (!strcmp (gst_caps_get_mime (caps), "audio/mpeg")) { + audio_format = SHOUT_FORMAT_MP3; + return GST_PAD_LINK_OK; + } + + if (!strcmp (gst_caps_get_mime (caps), "application/ogg")) { + audio_format = SHOUT_FORMAT_VORBIS; + return GST_PAD_LINK_OK; + } else { return GST_PAD_LINK_REFUSED; } - + } static GstElementStateReturn -gst_shout2send_change_state (GstElement *element) +gst_shout2send_change_state (GstElement * element) { GstShout2send *shout2send; @@ -405,144 +390,147 @@ gst_shout2send_change_state (GstElement *element) g_return_val_if_fail (GST_IS_SHOUT2SEND (element), GST_STATE_FAILURE); - shout2send = GST_SHOUT2SEND(element); + shout2send = GST_SHOUT2SEND (element); GST_DEBUG ("state pending %d", GST_STATE_PENDING (element)); /* if going down into NULL state, close the file if it's open */ switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_NULL_TO_READY: - shout2send->conn = shout_new(); - - switch (shout2send->protocol) { - case SHOUT2SEND_PROTOCOL_ICE: - proto = SHOUT_PROTOCOL_ICE; - break; - case SHOUT2SEND_PROTOCOL_XAUDIOCAST: - proto = SHOUT_PROTOCOL_XAUDIOCAST; - break; - case SHOUT2SEND_PROTOCOL_ICY: - proto = SHOUT_PROTOCOL_ICY; - break; - case SHOUT2SEND_PROTOCOL_HTTP: - proto = SHOUT_PROTOCOL_HTTP; - break; - } - - if (shout_set_protocol(shout2send->conn, proto) != SHOUTERR_SUCCESS) - { - g_error ("Error setting protocol: %s\n", shout_get_error(shout2send->conn)); - } - - /* --- FIXME: shout requires an ip, and fails if it is given a host. */ - /* may want to put convert_to_ip(shout2send->ip) here */ - - - if (shout_set_host(shout2send->conn, shout2send->ip) != SHOUTERR_SUCCESS) - { - g_error ("Error setting host: %s\n", shout_get_error(shout2send->conn)); - } - /* --- */ - - if (shout_set_port(shout2send->conn, shout2send->port) != SHOUTERR_SUCCESS) - { - g_error ("Error setting port: %s\n", shout_get_error(shout2send->conn)); - } - - if(shout_set_password(shout2send->conn, shout2send->password) != SHOUTERR_SUCCESS) - { - g_error ("Error setting password: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_set_name(shout2send->conn, shout2send->name) != SHOUTERR_SUCCESS) - { - g_error ("Error setting name: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_set_description(shout2send->conn, shout2send->description) != SHOUTERR_SUCCESS) - { - g_error ("Error setting name: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_set_genre(shout2send->conn, shout2send->genre) != SHOUTERR_SUCCESS) - { - g_error ("Error setting name: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_set_mount(shout2send->conn, shout2send->mount) != SHOUTERR_SUCCESS) - { - g_error ("Error setting mount point: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_set_user(shout2send->conn, "source") != SHOUTERR_SUCCESS) - { - g_error ("Error setting user: %s\n", shout_get_error(shout2send->conn)); - } - - gst_version(&major,&minor,µ); - - version_string = g_strdup_printf("GStreamer %d.%d.%d", major,minor,micro); - - if (shout_set_agent(shout2send->conn, version_string) != SHOUTERR_SUCCESS) - { - g_error ("Error setting agent: %s\n", shout_get_error(shout2send->conn)); - } - - g_free (version_string); - - - - break; - case GST_STATE_READY_TO_PAUSED: - - /* This sets the format acording to the capabilities of what - we are being given as input. */ - - if (shout_set_format(shout2send->conn, audio_format) != SHOUTERR_SUCCESS) - { - g_error ("Error setting connection format: %s\n", shout_get_error(shout2send->conn)); - } - - if (shout_open (shout2send->conn) == SHOUTERR_SUCCESS) { - g_print ("connected to server...\n"); - } - else { - g_warning ("Couldn't connect to server: %s", shout_get_error(shout2send->conn)); + case GST_STATE_NULL_TO_READY: + shout2send->conn = shout_new (); + + switch (shout2send->protocol) { + case SHOUT2SEND_PROTOCOL_ICE: + proto = SHOUT_PROTOCOL_ICE; + break; + case SHOUT2SEND_PROTOCOL_XAUDIOCAST: + proto = SHOUT_PROTOCOL_XAUDIOCAST; + break; + case SHOUT2SEND_PROTOCOL_ICY: + proto = SHOUT_PROTOCOL_ICY; + break; + case SHOUT2SEND_PROTOCOL_HTTP: + proto = SHOUT_PROTOCOL_HTTP; + break; + } + + if (shout_set_protocol (shout2send->conn, proto) != SHOUTERR_SUCCESS) { + g_error ("Error setting protocol: %s\n", + shout_get_error (shout2send->conn)); + } + + /* --- FIXME: shout requires an ip, and fails if it is given a host. */ + /* may want to put convert_to_ip(shout2send->ip) here */ + + + if (shout_set_host (shout2send->conn, shout2send->ip) != SHOUTERR_SUCCESS) { + g_error ("Error setting host: %s\n", + shout_get_error (shout2send->conn)); + } + /* --- */ + + if (shout_set_port (shout2send->conn, + shout2send->port) != SHOUTERR_SUCCESS) { + g_error ("Error setting port: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_password (shout2send->conn, + shout2send->password) != SHOUTERR_SUCCESS) { + g_error ("Error setting password: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_name (shout2send->conn, + shout2send->name) != SHOUTERR_SUCCESS) { + g_error ("Error setting name: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_description (shout2send->conn, + shout2send->description) != SHOUTERR_SUCCESS) { + g_error ("Error setting name: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_genre (shout2send->conn, + shout2send->genre) != SHOUTERR_SUCCESS) { + g_error ("Error setting name: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_mount (shout2send->conn, + shout2send->mount) != SHOUTERR_SUCCESS) { + g_error ("Error setting mount point: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_set_user (shout2send->conn, "source") != SHOUTERR_SUCCESS) { + g_error ("Error setting user: %s\n", + shout_get_error (shout2send->conn)); + } + + gst_version (&major, &minor, µ); + + version_string = + g_strdup_printf ("GStreamer %d.%d.%d", major, minor, micro); + + if (shout_set_agent (shout2send->conn, + version_string) != SHOUTERR_SUCCESS) { + g_error ("Error setting agent: %s\n", + shout_get_error (shout2send->conn)); + } + + g_free (version_string); + + + + break; + case GST_STATE_READY_TO_PAUSED: + + /* This sets the format acording to the capabilities of what + we are being given as input. */ + + if (shout_set_format (shout2send->conn, audio_format) != SHOUTERR_SUCCESS) { + g_error ("Error setting connection format: %s\n", + shout_get_error (shout2send->conn)); + } + + if (shout_open (shout2send->conn) == SHOUTERR_SUCCESS) { + g_print ("connected to server...\n"); + } else { + g_warning ("Couldn't connect to server: %s", + shout_get_error (shout2send->conn)); + shout_close (shout2send->conn); + shout_free (shout2send->conn); + return GST_STATE_FAILURE; + } + break; + case GST_STATE_PAUSED_TO_READY: shout_close (shout2send->conn); shout_free (shout2send->conn); - return GST_STATE_FAILURE; - } - break; - case GST_STATE_PAUSED_TO_READY: - shout_close (shout2send->conn); - shout_free (shout2send->conn); - break; - default: - break; + break; + default: + break; } - + /* if we haven't failed already, give the parent class a chance to ;-) */ if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); - + return GST_STATE_SUCCESS; } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "shout2send", GST_RANK_NONE, - GST_TYPE_SHOUT2SEND); + GST_TYPE_SHOUT2SEND); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "shout2send", - "Sends data to an icecast server using libshout2", - plugin_init, - VERSION, - "LGPL", - "libshout2", - "http://www.icecast.org/download.html" -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "shout2send", + "Sends data to an icecast server using libshout2", + plugin_init, + VERSION, "LGPL", "libshout2", "http://www.icecast.org/download.html") diff --git a/ext/shout2/gstshout2.h b/ext/shout2/gstshout2.h index 70631298..62ff44b9 100644 --- a/ext/shout2/gstshout2.h +++ b/ext/shout2/gstshout2.h @@ -25,47 +25,51 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ /* Protocol type enum */ -typedef enum { - SHOUT2SEND_PROTOCOL_ICE = 1, - SHOUT2SEND_PROTOCOL_XAUDIOCAST, - SHOUT2SEND_PROTOCOL_ICY, - SHOUT2SEND_PROTOCOL_HTTP -} GstShout2SendProtocol; + typedef enum + { + SHOUT2SEND_PROTOCOL_ICE = 1, + SHOUT2SEND_PROTOCOL_XAUDIOCAST, + SHOUT2SEND_PROTOCOL_ICY, + SHOUT2SEND_PROTOCOL_HTTP + } GstShout2SendProtocol; /* Definition of structure storing data for this element. */ -typedef struct _GstShout2send GstShout2send; -struct _GstShout2send { - GstElement element; + typedef struct _GstShout2send GstShout2send; + struct _GstShout2send + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - GstShout2SendProtocol protocol; + GstShout2SendProtocol protocol; - shout_t *conn; + shout_t *conn; - gchar *ip; - guint port; - gchar *password; - gchar *name; - gchar *description; - gchar *genre; - gchar *mount; - gchar *url; + gchar *ip; + guint port; + gchar *password; + gchar *name; + gchar *description; + gchar *genre; + gchar *mount; + gchar *url; -}; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstShout2sendClass GstShout2sendClass; -struct _GstShout2sendClass { - GstElementClass parent_class; -}; + typedef struct _GstShout2sendClass GstShout2sendClass; + struct _GstShout2sendClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_SHOUT2SEND \ @@ -80,12 +84,12 @@ struct _GstShout2sendClass { (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHOUT2SEND)) /* Standard function returning type information. */ -GType gst_shout2send_get_type(void); + GType gst_shout2send_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SHOUT2SEND_H__ */ +#endif /* __GST_SHOUT2SEND_H__ */ diff --git a/ext/speex/gstspeex.c b/ext/speex/gstspeex.c index df2f230c..0b0de0bf 100644 --- a/ext/speex/gstspeex.c +++ b/ext/speex/gstspeex.c @@ -24,24 +24,21 @@ #include "gstspeexenc.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "speexenc", GST_RANK_NONE, GST_TYPE_SPEEXENC)) + if (!gst_element_register (plugin, "speexenc", GST_RANK_NONE, + GST_TYPE_SPEEXENC)) return FALSE; - if (!gst_element_register (plugin, "speexdec", GST_RANK_PRIMARY, GST_TYPE_SPEEXDEC)) + if (!gst_element_register (plugin, "speexdec", GST_RANK_PRIMARY, + GST_TYPE_SPEEXDEC)) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "speex", - "Speex plugin library", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "speex", + "Speex plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c index a5ab788e..364ae669 100644 --- a/ext/speex/gstspeexdec.c +++ b/ext/speex/gstspeexdec.c @@ -36,72 +36,72 @@ GstElementDetails gst_speexdec_details = { }; /* SpeexDec signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_speexdec_base_init (gpointer g_class); -static void gst_speexdec_class_init (GstSpeexDec *klass); -static void gst_speexdec_init (GstSpeexDec *speexdec); +static void gst_speexdec_base_init (gpointer g_class); +static void gst_speexdec_class_init (GstSpeexDec * klass); +static void gst_speexdec_init (GstSpeexDec * speexdec); -static void gst_speexdec_chain (GstPad *pad, GstData *_data); -static GstPadLinkReturn gst_speexdec_sinkconnect (GstPad *pad, const GstCaps *caps); +static void gst_speexdec_chain (GstPad * pad, GstData * _data); +static GstPadLinkReturn gst_speexdec_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_speexdec_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_speexdec_get_type(void) { +gst_speexdec_get_type (void) +{ static GType speexdec_type = 0; if (!speexdec_type) { static const GTypeInfo speexdec_info = { - sizeof(GstSpeexDecClass), + sizeof (GstSpeexDecClass), gst_speexdec_base_init, NULL, - (GClassInitFunc)gst_speexdec_class_init, + (GClassInitFunc) gst_speexdec_class_init, NULL, NULL, - sizeof(GstSpeexDec), + sizeof (GstSpeexDec), 0, - (GInstanceInitFunc)gst_speexdec_init, + (GInstanceInitFunc) gst_speexdec_init, }; - speexdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSpeexDec", &speexdec_info, 0); + speexdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSpeexDec", &speexdec_info, + 0); } return speexdec_type; } static GstStaticPadTemplate speex_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-speex, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) 1" - ) -); - -static GstStaticPadTemplate speex_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - 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) [ 1000, 48000 ], " - "channels = (int) 1" - ) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) 1") + ); + +static GstStaticPadTemplate speex_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + 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) [ 1000, 48000 ], " "channels = (int) 1") + ); static void gst_speexdec_base_init (gpointer g_class) @@ -109,30 +109,31 @@ gst_speexdec_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 (&speex_src_template)); + gst_static_pad_template_get (&speex_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&speex_sink_template)); + gst_static_pad_template_get (&speex_sink_template)); gst_element_class_set_details (element_class, &gst_speexdec_details); } static void -gst_speexdec_class_init (GstSpeexDec *klass) +gst_speexdec_class_init (GstSpeexDec * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*)klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } static void -gst_speexdec_init (GstSpeexDec *speexdec) +gst_speexdec_init (GstSpeexDec * speexdec) { GST_DEBUG ("gst_speexdec_init: initializing"); /* create the sink and src pads */ - speexdec->sinkpad = gst_pad_new_from_template (speexdec_sink_template, "sink"); + speexdec->sinkpad = + gst_pad_new_from_template (speexdec_sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (speexdec), speexdec->sinkpad); gst_pad_set_chain_function (speexdec->sinkpad, gst_speexdec_chain); gst_pad_set_link_function (speexdec->sinkpad, gst_speexdec_sinkconnect); @@ -144,43 +145,40 @@ gst_speexdec_init (GstSpeexDec *speexdec) } static GstPadLinkReturn -gst_speexdec_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_speexdec_sinkconnect (GstPad * pad, const GstCaps * caps) { GstSpeexDec *speexdec; gint rate; GstStructure *structure; - + speexdec = GST_SPEEXDEC (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "rate", &rate); - - if (gst_pad_set_explicit_caps (speexdec->srcpad, - gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "rate", G_TYPE_INT, rate, - "channels", G_TYPE_INT, 1, - NULL))) - { + gst_structure_get_int (structure, "rate", &rate); + + if (gst_pad_set_explicit_caps (speexdec->srcpad, + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, 1, NULL))) { return GST_PAD_LINK_OK; } return GST_PAD_LINK_REFUSED; } static void -gst_speexdec_chain (GstPad *pad, GstData *_data) +gst_speexdec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSpeexDec *speexdec; gchar *data; guint size; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); /*g_return_if_fail(GST_IS_BUFFER(buf)); */ speexdec = GST_SPEEXDEC (gst_pad_get_parent (pad)); @@ -188,6 +186,5 @@ gst_speexdec_chain (GstPad *pad, GstData *_data) data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } - diff --git a/ext/speex/gstspeexdec.h b/ext/speex/gstspeexdec.h index c679dc18..6723742c 100644 --- a/ext/speex/gstspeexdec.h +++ b/ext/speex/gstspeexdec.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SPEEXDEC \ @@ -41,26 +42,28 @@ extern "C" { #define GST_IS_SPEEXDEC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEXDEC)) -typedef struct _GstSpeexDec GstSpeexDec; -typedef struct _GstSpeexDecClass GstSpeexDecClass; + typedef struct _GstSpeexDec GstSpeexDec; + typedef struct _GstSpeexDecClass GstSpeexDecClass; -struct _GstSpeexDec { - GstElement element; + struct _GstSpeexDec + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; -}; + /* pads */ + GstPad *sinkpad, *srcpad; + }; -struct _GstSpeexDecClass { - GstElementClass parent_class; -}; + struct _GstSpeexDecClass + { + GstElementClass parent_class; + }; -GType gst_speexdec_get_type(void); + GType gst_speexdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SPEEXDEC_H__ */ +#endif /* __GST_SPEEXDEC_H__ */ diff --git a/ext/speex/gstspeexenc.c b/ext/speex/gstspeexenc.c index 1db431d3..d1b4ae39 100644 --- a/ext/speex/gstspeexenc.c +++ b/ext/speex/gstspeexenc.c @@ -36,23 +36,26 @@ GstElementDetails gst_speexenc_details = { }; /* SpeexEnc signals and args */ -enum { +enum +{ FRAME_ENCODED, /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_speexenc_base_init (gpointer g_class); -static void gst_speexenc_class_init (GstSpeexEnc *klass); -static void gst_speexenc_init (GstSpeexEnc *speexenc); +static void gst_speexenc_base_init (gpointer g_class); +static void gst_speexenc_class_init (GstSpeexEnc * klass); +static void gst_speexenc_init (GstSpeexEnc * speexenc); -static void gst_speexenc_chain (GstPad *pad,GstData *_data); -static GstPadLinkReturn gst_speexenc_sinkconnect (GstPad *pad, const GstCaps *caps); +static void gst_speexenc_chain (GstPad * pad, GstData * _data); +static GstPadLinkReturn gst_speexenc_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementClass *parent_class = NULL; static guint gst_speexenc_signals[LAST_SIGNAL] = { 0 }; @@ -74,42 +77,37 @@ gst_speexenc_get_type (void) 0, (GInstanceInitFunc) gst_speexenc_init, }; - speexenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSpeexEnc", &speexenc_info, 0); + speexenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSpeexEnc", &speexenc_info, + 0); } return speexenc_type; } static GstStaticPadTemplate speex_sink_template = -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) [ 1000, 48000 ], " - "channels = (int) 1" - ) -); - -static GstStaticPadTemplate speex_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-speex, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) 1" - ) -); +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) [ 1000, 48000 ], " "channels = (int) 1") + ); + +static GstStaticPadTemplate speex_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) 1") + ); static void gst_speexenc_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 (&speex_sink_template)); gst_element_class_add_pad_template (element_class, @@ -119,28 +117,29 @@ gst_speexenc_base_init (gpointer g_class) } static void -gst_speexenc_class_init (GstSpeexEnc *klass) +gst_speexenc_class_init (GstSpeexEnc * 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); gst_speexenc_signals[FRAME_ENCODED] = - g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstSpeexEncClass, frame_encoded), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstSpeexEncClass, frame_encoded), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void -gst_speexenc_init (GstSpeexEnc *speexenc) +gst_speexenc_init (GstSpeexEnc * speexenc) { /* create the sink and src pads */ - speexenc->sinkpad = gst_pad_new_from_template (speexenc_sink_template, "sink"); + speexenc->sinkpad = + gst_pad_new_from_template (speexenc_sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (speexenc), speexenc->sinkpad); gst_pad_set_chain_function (speexenc->sinkpad, gst_speexenc_chain); gst_pad_set_link_function (speexenc->sinkpad, gst_speexenc_sinkconnect); @@ -148,7 +147,7 @@ gst_speexenc_init (GstSpeexEnc *speexenc) speexenc->srcpad = gst_pad_new_from_template (speexenc_src_template, "src"); gst_element_add_pad (GST_ELEMENT (speexenc), speexenc->srcpad); - speex_bits_init(&speexenc->bits); + speex_bits_init (&speexenc->bits); speexenc->mode = &speex_nb_mode; speexenc->bufsize = 0; speexenc->packet_count = 0; @@ -156,7 +155,7 @@ gst_speexenc_init (GstSpeexEnc *speexenc) } static GstPadLinkReturn -gst_speexenc_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_speexenc_sinkconnect (GstPad * pad, const GstCaps * caps) { GstSpeexEnc *speexenc; GstStructure *structure; @@ -166,16 +165,15 @@ gst_speexenc_sinkconnect (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "rate", &speexenc->rate); if (gst_pad_try_set_caps (speexenc->srcpad, - gst_caps_new_simple ("audio/x-speex", - "rate", G_TYPE_INT, speexenc->rate, - "channels", G_TYPE_INT, 1, - NULL))) - { - speex_init_header(&speexenc->header, speexenc->rate, 1, speexenc->mode); + gst_caps_new_simple ("audio/x-speex", + "rate", G_TYPE_INT, speexenc->rate, + "channels", G_TYPE_INT, 1, NULL))) { + speex_init_header (&speexenc->header, speexenc->rate, 1, speexenc->mode); speexenc->header.frames_per_packet = speexenc->n_packets; - speexenc->state = speex_encoder_init(speexenc->mode); - speex_encoder_ctl(speexenc->state, SPEEX_GET_FRAME_SIZE, &speexenc->frame_size); + speexenc->state = speex_encoder_init (speexenc->mode); + speex_encoder_ctl (speexenc->state, SPEEX_GET_FRAME_SIZE, + &speexenc->frame_size); return GST_PAD_LINK_OK; } @@ -184,7 +182,7 @@ gst_speexenc_sinkconnect (GstPad *pad, const GstCaps *caps) } static void -gst_speexenc_chain (GstPad *pad, GstData *_data) +gst_speexenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSpeexEnc *speexenc; @@ -201,22 +199,20 @@ gst_speexenc_chain (GstPad *pad, GstData *_data) g_return_if_fail (buf != NULL); speexenc = GST_SPEEXENC (GST_OBJECT_PARENT (pad)); - + if (!GST_PAD_CAPS (speexenc->srcpad)) { if (!gst_pad_try_set_caps (speexenc->srcpad, - gst_caps_new_simple ("audio/x-speex", - "rate", G_TYPE_INT, speexenc->rate, - "channels", G_TYPE_INT, 1, - NULL))) - { + gst_caps_new_simple ("audio/x-speex", + "rate", G_TYPE_INT, speexenc->rate, + "channels", G_TYPE_INT, 1, NULL))) { GST_ELEMENT_ERROR (speexenc, CORE, NEGOTIATION, (NULL), (NULL)); return; } } if (speexenc->packet_count == 0) { - header_data = speex_header_to_packet(&speexenc->header, &size); + header_data = speex_header_to_packet (&speexenc->header, &size); outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = header_data; @@ -231,7 +227,8 @@ gst_speexenc_chain (GstPad *pad, GstData *_data) frame_size = speexenc->frame_size; if (speexenc->bufsize && (speexenc->bufsize + size >= frame_size)) { - memcpy (speexenc->buffer + speexenc->bufsize, data, (frame_size - speexenc->bufsize) * sizeof (gint16)); + memcpy (speexenc->buffer + speexenc->bufsize, data, + (frame_size - speexenc->bufsize) * sizeof (gint16)); for (i = 0; i < frame_size; i++) input[i] = speexenc->buffer[i]; @@ -243,10 +240,10 @@ gst_speexenc_chain (GstPad *pad, GstData *_data) GstBuffer *outbuf; outbuf = gst_buffer_new_and_alloc (frame_size * speexenc->n_packets); - GST_BUFFER_SIZE (outbuf) = speex_bits_write(&speexenc->bits, - GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); + GST_BUFFER_SIZE (outbuf) = speex_bits_write (&speexenc->bits, + GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = speexenc->next_ts; - speex_bits_reset(&speexenc->bits); + speex_bits_reset (&speexenc->bits); gst_pad_push (speexenc->srcpad, GST_DATA (outbuf)); speexenc->next_ts += frame_size * GST_SECOND / speexenc->rate; @@ -269,10 +266,10 @@ gst_speexenc_chain (GstPad *pad, GstData *_data) GstBuffer *outbuf; outbuf = gst_buffer_new_and_alloc (frame_size * speexenc->n_packets); - GST_BUFFER_SIZE (outbuf) = speex_bits_write(&speexenc->bits, - GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); + GST_BUFFER_SIZE (outbuf) = speex_bits_write (&speexenc->bits, + GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = speexenc->next_ts; - speex_bits_reset(&speexenc->bits); + speex_bits_reset (&speexenc->bits); gst_pad_push (speexenc->srcpad, GST_DATA (outbuf)); speexenc->next_ts += frame_size * GST_SECOND / speexenc->rate; @@ -286,6 +283,6 @@ gst_speexenc_chain (GstPad *pad, GstData *_data) memcpy (speexenc->buffer + speexenc->bufsize, data, size * sizeof (gint16)); speexenc->bufsize += size; } - - gst_buffer_unref(buf); + + gst_buffer_unref (buf); } diff --git a/ext/speex/gstspeexenc.h b/ext/speex/gstspeexenc.h index 4677f6a1..4da1e787 100644 --- a/ext/speex/gstspeexenc.h +++ b/ext/speex/gstspeexenc.h @@ -28,8 +28,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SPEEXENC \ @@ -43,44 +44,45 @@ extern "C" { #define GST_IS_SPEEXENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEXENC)) -typedef struct _GstSpeexEnc GstSpeexEnc; -typedef struct _GstSpeexEncClass GstSpeexEncClass; + typedef struct _GstSpeexEnc GstSpeexEnc; + typedef struct _GstSpeexEncClass GstSpeexEncClass; -struct _GstSpeexEnc { - GstElement element; + struct _GstSpeexEnc + { + GstElement element; - /* pads */ - GstPad *sinkpad, - *srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - gint packet_count; - gint n_packets; + gint packet_count; + gint n_packets; - SpeexBits bits; - SpeexHeader header; - SpeexMode *mode; - void *state; - gint frame_size; - gint16 buffer[2000]; - gint bufsize; - guint64 next_ts; + SpeexBits bits; + SpeexHeader header; + SpeexMode *mode; + void *state; + gint frame_size; + gint16 buffer[2000]; + gint bufsize; + guint64 next_ts; - gint rate; -}; + gint rate; + }; -struct _GstSpeexEncClass { - GstElementClass parent_class; + struct _GstSpeexEncClass + { + GstElementClass parent_class; - /* signals */ - void (*frame_encoded) (GstElement *element); -}; + /* signals */ + void (*frame_encoded) (GstElement * element); + }; -GType gst_speexenc_get_type(void); + GType gst_speexenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SPEEXENC_H__ */ +#endif /* __GST_SPEEXENC_H__ */ diff --git a/gst/audiofx/audiowsincband.c b/gst/audiofx/audiowsincband.c index 77529053..a848cc26 100644 --- a/gst/audiofx/audiowsincband.c +++ b/gst/audiofx/audiowsincband.c @@ -39,20 +39,19 @@ #include /* memmove */ /* elementfactory information */ -static GstElementDetails gst_bpwsinc_details = GST_ELEMENT_DETAILS ( - "BPWSinc", - "Filter/Effect/Audio", - "Band-Pass Windowed sinc filter", - "Thomas , " - "Steven W. Smith" -); - -enum { +static GstElementDetails gst_bpwsinc_details = GST_ELEMENT_DETAILS ("BPWSinc", + "Filter/Effect/Audio", + "Band-Pass Windowed sinc filter", + "Thomas , " "Steven W. Smith"); + +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LENGTH, ARG_LOWER_FREQUENCY, @@ -81,51 +80,52 @@ struct _GstBPWSinc double frequency; double lower_frequency, upper_frequency; - int wing_size; /* length of a "wing" of the filter; - actual length is 2 * wing_size + 1 */ + int wing_size; /* length of a "wing" of the filter; + actual length is 2 * wing_size + 1 */ - gfloat *residue; /* buffer for left-over samples from previous buffer */ + gfloat *residue; /* buffer for left-over samples from previous buffer */ double *kernel; }; struct _GstBPWSincClass { - GstElementClass parent_class; + GstElementClass parent_class; }; -static void gst_bpwsinc_base_init (gpointer g_class); -static void gst_bpwsinc_class_init (GstBPWSincClass * klass); -static void gst_bpwsinc_init (GstBPWSinc * filter); +static void gst_bpwsinc_base_init (gpointer g_class); +static void gst_bpwsinc_class_init (GstBPWSincClass * klass); +static void gst_bpwsinc_init (GstBPWSinc * filter); -static void gst_bpwsinc_set_property (GObject * object, guint prop_id, - const GValue * value, - GParamSpec * pspec); -static void gst_bpwsinc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_bpwsinc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_bpwsinc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_bpwsinc_chain (GstPad * pad, GstData *_data); +static void gst_bpwsinc_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); +gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_bpwsinc_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_bpwsinc_get_type (void) +GType +gst_bpwsinc_get_type (void) { static GType bpwsinc_type = 0; if (!bpwsinc_type) { static const GTypeInfo bpwsinc_info = { - sizeof (GstBPWSincClass), - gst_bpwsinc_base_init, + sizeof (GstBPWSincClass), + gst_bpwsinc_base_init, NULL, (GClassInitFunc) gst_bpwsinc_class_init, NULL, NULL, sizeof (GstBPWSinc), 0, (GInstanceInitFunc) gst_bpwsinc_init, }; - bpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBPWSinc", - &bpwsinc_info, 0); + bpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBPWSinc", + &bpwsinc_info, 0); } return bpwsinc_type; } @@ -139,9 +139,9 @@ gst_bpwsinc_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_filter_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_filter_sink_template)); + gst_static_pad_template_get (&gst_filter_sink_template)); - gst_element_class_set_details (element_class, &gst_bpwsinc_details); + gst_element_class_set_details (element_class, &gst_bpwsinc_details); } static void @@ -156,20 +156,17 @@ gst_bpwsinc_class_init (GstBPWSincClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWER_FREQUENCY, - g_param_spec_double ("lower-frequency", "Lower Frequency", - "Cut-off lower frequency (relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("lower-frequency", "Lower Frequency", + "Cut-off lower frequency (relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_UPPER_FREQUENCY, - g_param_spec_double ("upper-frequency", "Upper Frequency", - "Cut-off upper frequency (relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("upper-frequency", "Upper Frequency", + "Cut-off upper frequency (relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LENGTH, - g_param_spec_int ("length", "Length", - "N such that the filter length = 2N + 1", - 1, G_MAXINT, - 1, G_PARAM_READWRITE)); + g_param_spec_int ("length", "Length", + "N such that the filter length = 2N + 1", + 1, G_MAXINT, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_bpwsinc_set_property; gobject_class->get_property = gst_bpwsinc_get_property; @@ -178,14 +175,16 @@ gst_bpwsinc_class_init (GstBPWSincClass * klass) static void gst_bpwsinc_init (GstBPWSinc * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_sink_template), "sink"); gst_pad_set_chain_function (filter->sinkpad, gst_bpwsinc_chain); gst_pad_set_link_function (filter->sinkpad, gst_bpwsinc_sink_connect); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->wing_size = 50; @@ -202,65 +201,65 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) int len = 0; double *kernel_lp, *kernel_hp; GstPadLinkReturn set_retval; - + GstBPWSinc *filter = GST_BPWSINC (gst_pad_get_parent (pad)); g_assert (GST_IS_PAD (pad)); g_assert (caps != NULL); set_retval = gst_pad_try_set_caps (filter->srcpad, caps); - - if (set_retval > 0) - { + + if (set_retval > 0) { len = filter->wing_size; /* fill the lp kernel */ - GST_DEBUG ( - "bpwsinc: initializing LP kernel of length %d with cut-off %f", - len * 2 + 1, filter->lower_frequency); + GST_DEBUG ("bpwsinc: initializing LP kernel of length %d with cut-off %f", + len * 2 + 1, filter->lower_frequency); kernel_lp = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) kernel_lp[i] = 2 * M_PI * filter->lower_frequency; else - kernel_lp[i] = sin (2 * M_PI * filter->lower_frequency * (i - len)) - / (i - len); + kernel_lp[i] = sin (2 * M_PI * filter->lower_frequency * (i - len)) + / (i - len); /* Blackman windowing */ - kernel_lp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) - + 0.08 * cos (2 * M_PI * i / len)); + kernel_lp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) + + 0.08 * cos (2 * M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ sum = 0.0; - for (i = 0; i <= len * 2; ++i) sum += kernel_lp[i]; - for (i = 0; i <= len * 2; ++i) kernel_lp[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += kernel_lp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_lp[i] /= sum; /* fill the hp kernel */ - GST_DEBUG ( - "bpwsinc: initializing HP kernel of length %d with cut-off %f", - len * 2 + 1, filter->upper_frequency); + GST_DEBUG ("bpwsinc: initializing HP kernel of length %d with cut-off %f", + len * 2 + 1, filter->upper_frequency); kernel_hp = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) kernel_hp[i] = 2 * M_PI * filter->upper_frequency; else - kernel_hp[i] = sin (2 * M_PI * filter->upper_frequency * (i - len)) - / (i - len); + kernel_hp[i] = sin (2 * M_PI * filter->upper_frequency * (i - len)) + / (i - len); /* Blackman windowing */ - kernel_hp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) - + 0.08 * cos (2 * M_PI * i / len)); + kernel_hp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) + + 0.08 * cos (2 * M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ sum = 0.0; - for (i = 0; i <= len * 2; ++i) sum += kernel_hp[i]; - for (i = 0; i <= len * 2; ++i) kernel_hp[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += kernel_hp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_hp[i] /= sum; /* do spectral inversion to get a HP filter */ - for (i = 0; i <= len * 2; ++i) kernel_hp[i] = -kernel_hp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_hp[i] = -kernel_hp[i]; kernel_hp[len] += 1; /* combine the two filters */ @@ -271,7 +270,8 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) filter->kernel[i] = kernel_lp[i] + kernel_hp[i]; /* do spectral inversion to go from band reject to bandpass */ - for (i = 0; i <= len * 2; ++i) filter->kernel[i] = -filter->kernel[i]; + for (i = 0; i <= len * 2; ++i) + filter->kernel[i] = -filter->kernel[i]; filter->kernel[len] += 1; /* free the helper kernels */ @@ -280,14 +280,15 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) /* set up the residue memory space */ filter->residue = (gfloat *) g_malloc (sizeof (gfloat) * (len * 2 + 1)); - for (i = 0; i <= len * 2; ++i) filter->residue[i] = 0.0; + for (i = 0; i <= len * 2; ++i) + filter->residue[i] = 0.0; } return set_retval; } static void -gst_bpwsinc_chain (GstPad *pad, GstData *_data) +gst_bpwsinc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstBPWSinc *filter; @@ -323,24 +324,24 @@ gst_bpwsinc_chain (GstPad *pad, GstData *_data) memcpy (&input[residue_samples], src, sizeof (gfloat) * input_samples); /* copy the tail of the current input buffer to the residue */ memcpy (filter->residue, &src[input_samples - residue_samples], - sizeof (gfloat) * residue_samples); + sizeof (gfloat) * residue_samples); /* convolution */ /* since we copied the previous set of samples we needed before the actual * input data, we need to add the filter length to our indices for input */ - for (i = 0; i < input_samples; ++i) - { + for (i = 0; i < input_samples; ++i) { src[i] = 0.0; for (j = 0; j < residue_samples; ++j) src[i] += input[i - j + residue_samples] * filter->kernel[j]; } - + g_free (input); gst_pad_push (filter->srcpad, GST_DATA (buf)); } static void -gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstBPWSinc *filter; @@ -351,27 +352,28 @@ gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, switch (prop_id) { case ARG_LENGTH: - filter->wing_size = g_value_get_int (value); - break; + filter->wing_size = g_value_get_int (value); + break; case ARG_LOWER_FREQUENCY: - filter->lower_frequency = g_value_get_double (value); - break; + filter->lower_frequency = g_value_get_double (value); + break; case ARG_UPPER_FREQUENCY: - filter->upper_frequency = g_value_get_double (value); - break; + filter->upper_frequency = g_value_get_double (value); + break; default: break; } } static void -gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstBPWSinc *filter; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_BPWSINC (object)); - + filter = GST_BPWSINC (object); switch (prop_id) { @@ -388,5 +390,4 @@ gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GPara G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } -} - +} diff --git a/gst/audiofx/audiowsinclimit.c b/gst/audiofx/audiowsinclimit.c index 603d8775..0ce33b32 100644 --- a/gst/audiofx/audiowsinclimit.c +++ b/gst/audiofx/audiowsinclimit.c @@ -38,20 +38,19 @@ #include /* M_PI */ #include /* memmove */ -static GstElementDetails gst_lpwsinc_details = GST_ELEMENT_DETAILS ( - "LPWSinc", - "Filter/Effect/Audio", - "Low-pass Windowed sinc filter", - "Thomas , " - "Steven W. Smith" -); - -enum { +static GstElementDetails gst_lpwsinc_details = GST_ELEMENT_DETAILS ("LPWSinc", + "Filter/Effect/Audio", + "Low-pass Windowed sinc filter", + "Thomas , " "Steven W. Smith"); + +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LENGTH, ARG_FREQUENCY, @@ -78,42 +77,43 @@ struct _GstLPWSinc GstPad *sinkpad, *srcpad; double frequency; - int wing_size; /* length of a "wing" of the filter; - actual length is 2 * wing_size + 1 */ + int wing_size; /* length of a "wing" of the filter; + actual length is 2 * wing_size + 1 */ - gfloat *residue; /* buffer for left-over samples from previous buffer */ + gfloat *residue; /* buffer for left-over samples from previous buffer */ double *kernel; }; struct _GstLPWSincClass { - GstElementClass parent_class; + GstElementClass parent_class; }; -static void gst_lpwsinc_base_init (gpointer g_class); -static void gst_lpwsinc_class_init (GstLPWSincClass * klass); -static void gst_lpwsinc_init (GstLPWSinc * filter); +static void gst_lpwsinc_base_init (gpointer g_class); +static void gst_lpwsinc_class_init (GstLPWSincClass * klass); +static void gst_lpwsinc_init (GstLPWSinc * filter); -static void gst_lpwsinc_set_property (GObject * object, guint prop_id, - const GValue * value, - GParamSpec * pspec); -static void gst_lpwsinc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_lpwsinc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_lpwsinc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_lpwsinc_chain (GstPad * pad, GstData *_data); +static void gst_lpwsinc_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); +gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_lpwsinc_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_lpwsinc_get_type (void) +GType +gst_lpwsinc_get_type (void) { static GType lpwsinc_type = 0; if (!lpwsinc_type) { static const GTypeInfo lpwsinc_info = { - sizeof (GstLPWSincClass), + sizeof (GstLPWSincClass), gst_lpwsinc_base_init, NULL, (GClassInitFunc) gst_lpwsinc_class_init, NULL, NULL, @@ -121,8 +121,8 @@ GType gst_lpwsinc_get_type (void) (GInstanceInitFunc) gst_lpwsinc_init, }; - lpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLPWSinc", - &lpwsinc_info, 0); + lpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLPWSinc", + &lpwsinc_info, 0); } return lpwsinc_type; } @@ -136,9 +136,9 @@ gst_lpwsinc_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_filter_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_filter_sink_template)); + gst_static_pad_template_get (&gst_filter_sink_template)); - gst_element_class_set_details (element_class, &gst_lpwsinc_details); + gst_element_class_set_details (element_class, &gst_lpwsinc_details); } static void @@ -153,15 +153,13 @@ gst_lpwsinc_class_init (GstLPWSincClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_double ("frequency", "Frequency", - "Cut-off Frequency relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("frequency", "Frequency", + "Cut-off Frequency relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LENGTH, - g_param_spec_int ("length", "Length", - "N such that the filter length = 2N + 1", - 1, G_MAXINT, - 1, G_PARAM_READWRITE)); + g_param_spec_int ("length", "Length", + "N such that the filter length = 2N + 1", + 1, G_MAXINT, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_lpwsinc_set_property; gobject_class->get_property = gst_lpwsinc_get_property; @@ -170,14 +168,16 @@ gst_lpwsinc_class_init (GstLPWSincClass * klass) static void gst_lpwsinc_init (GstLPWSinc * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_sink_template), "sink"); gst_pad_set_chain_function (filter->sinkpad, gst_lpwsinc_chain); gst_pad_set_link_function (filter->sinkpad, gst_lpwsinc_sink_connect); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->wing_size = 50; @@ -197,45 +197,45 @@ gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) g_assert (GST_IS_PAD (pad)); g_assert (caps != NULL); - set_retval = gst_pad_try_set_caps(filter->srcpad, caps); - - if (set_retval > 0) - { + set_retval = gst_pad_try_set_caps (filter->srcpad, caps); + + if (set_retval > 0) { /* connection works, so init the filter */ /* FIXME: remember to free it */ /* fill the kernel */ g_print ("DEBUG: initing filter kernel\n"); len = filter->wing_size; - GST_DEBUG ( - "lpwsinc: initializing filter kernel of length %d", len * 2 + 1); + GST_DEBUG ("lpwsinc: initializing filter kernel of length %d", len * 2 + 1); filter->kernel = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) filter->kernel[i] = 2 * M_PI * filter->frequency; else - filter->kernel[i] = sin (2 * M_PI * filter->frequency * (i - len)) - / (i - len); + filter->kernel[i] = sin (2 * M_PI * filter->frequency * (i - len)) + / (i - len); /* windowing */ filter->kernel[i] *= (0.54 - 0.46 * cos (M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ - for (i = 0; i <= len * 2; ++i) sum += filter->kernel[i]; - for (i = 0; i <= len * 2; ++i) filter->kernel[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += filter->kernel[i]; + for (i = 0; i <= len * 2; ++i) + filter->kernel[i] /= sum; /* set up the residue memory space */ filter->residue = (gfloat *) g_malloc (sizeof (gfloat) * (len * 2 + 1)); - for (i = 0; i <= len * 2; ++i) filter->residue[i] = 0.0; + for (i = 0; i <= len * 2; ++i) + filter->residue[i] = 0.0; } return set_retval; } static void -gst_lpwsinc_chain (GstPad * pad, GstData *_data) +gst_lpwsinc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstLPWSinc *filter; @@ -271,24 +271,24 @@ gst_lpwsinc_chain (GstPad * pad, GstData *_data) memcpy (&input[residue_samples], src, sizeof (gfloat) * input_samples); /* copy the tail of the current input buffer to the residue */ memcpy (filter->residue, &src[input_samples - residue_samples], - sizeof (gfloat) * residue_samples); + sizeof (gfloat) * residue_samples); /* convolution */ /* since we copied the previous set of samples we needed before the actual * input data, we need to add the filter length to our indices for input */ - for (i = 0; i < input_samples; ++i) - { + for (i = 0; i < input_samples; ++i) { src[i] = 0.0; for (j = 0; j < residue_samples; ++j) src[i] += input[i - j + residue_samples] * filter->kernel[j]; } - + g_free (input); gst_pad_push (filter->srcpad, GST_DATA (buf)); } static void -gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstLPWSinc *filter; @@ -299,24 +299,25 @@ gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, switch (prop_id) { case ARG_LENGTH: - filter->wing_size = g_value_get_int (value); - break; + filter->wing_size = g_value_get_int (value); + break; case ARG_FREQUENCY: - filter->frequency = g_value_get_double (value); - break; + filter->frequency = g_value_get_double (value); + break; default: break; } } static void -gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstLPWSinc *filter; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_LPWSINC (object)); - + filter = GST_LPWSINC (object); switch (prop_id) { @@ -330,5 +331,4 @@ gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GPara G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } -} - +} diff --git a/gst/auparse/gstauparse.c b/gst/auparse/gstauparse.c index 19850f61..d7ffe68f 100644 --- a/gst/auparse/gstauparse.c +++ b/gst/auparse/gstauparse.c @@ -32,72 +32,71 @@ #include /* elementfactory information */ -static GstElementDetails gst_auparse_details = GST_ELEMENT_DETAILS ( - ".au parser", - "Codec/Parser/Audio", - "Parse an .au file into raw audio", - "Erik Walthinsen " -); +static GstElementDetails gst_auparse_details = +GST_ELEMENT_DETAILS (".au parser", + "Codec/Parser/Audio", + "Parse an .au file into raw audio", + "Erik Walthinsen "); static GstStaticPadTemplate gst_auparse_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-au" ) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-au") + ); static GstStaticPadTemplate gst_auparse_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - "audio/x-alaw, " - "rate = (int) [ 8000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + "audio/x-alaw, " + "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); /* AuParse signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_auparse_base_init (gpointer g_class); -static void gst_auparse_class_init (GstAuParseClass *klass); -static void gst_auparse_init (GstAuParse *auparse); +static void gst_auparse_base_init (gpointer g_class); +static void gst_auparse_class_init (GstAuParseClass * klass); +static void gst_auparse_init (GstAuParse * auparse); -static void gst_auparse_chain (GstPad *pad,GstData *_data); +static void gst_auparse_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_auparse_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_auparse_get_type (void) +gst_auparse_get_type (void) { static GType auparse_type = 0; if (!auparse_type) { static const GTypeInfo auparse_info = { - sizeof(GstAuParseClass), + sizeof (GstAuParseClass), gst_auparse_base_init, NULL, (GClassInitFunc) gst_auparse_class_init, NULL, NULL, - sizeof(GstAuParse), + sizeof (GstAuParse), 0, (GInstanceInitFunc) gst_auparse_init, }; - auparse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstAuParse", &auparse_info, 0); + auparse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstAuParse", &auparse_info, + 0); } return auparse_type; } @@ -116,25 +115,27 @@ gst_auparse_base_init (gpointer g_class) } static void -gst_auparse_class_init (GstAuParseClass *klass) +gst_auparse_class_init (GstAuParseClass * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*) klass; + gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } -static void -gst_auparse_init (GstAuParse *auparse) +static void +gst_auparse_init (GstAuParse * auparse) { - auparse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_auparse_sink_template), "sink"); + auparse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_auparse_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (auparse), auparse->sinkpad); gst_pad_set_chain_function (auparse->sinkpad, gst_auparse_chain); - auparse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_auparse_src_template), "src"); + auparse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_auparse_src_template), "src"); gst_element_add_pad (GST_ELEMENT (auparse), auparse->srcpad); gst_pad_use_explicit_caps (auparse->srcpad); @@ -145,8 +146,8 @@ gst_auparse_init (GstAuParse *auparse) auparse->channels = 0; } -static void -gst_auparse_chain (GstPad *pad, GstData *_data) +static void +gst_auparse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstAuParse *auparse; @@ -161,9 +162,9 @@ gst_auparse_chain (GstPad *pad, GstData *_data) g_return_if_fail (buf != NULL); auparse = GST_AUPARSE (gst_pad_get_parent (pad)); - + GST_DEBUG ("gst_auparse_chain: got buffer in '%s'", - gst_element_get_name (GST_ELEMENT (auparse))); + gst_element_get_name (GST_ELEMENT (auparse))); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); @@ -171,53 +172,55 @@ gst_auparse_chain (GstPad *pad, GstData *_data) /* if we haven't seen any data yet... */ if (auparse->size == 0) { GstBuffer *newbuf; - guint32 *head = (guint32 *)data; + guint32 *head = (guint32 *) data; /* normal format is big endian (au is a Sparc format) */ if (GUINT32_FROM_BE (*head) == 0x2e736e64) { head++; auparse->le = 0; - auparse->offset = GUINT32_FROM_BE (*head); + auparse->offset = GUINT32_FROM_BE (*head); head++; - auparse->size = GUINT32_FROM_BE (*head); + auparse->size = GUINT32_FROM_BE (*head); head++; - auparse->encoding = GUINT32_FROM_BE (*head); + auparse->encoding = GUINT32_FROM_BE (*head); head++; - auparse->frequency = GUINT32_FROM_BE (*head); + auparse->frequency = GUINT32_FROM_BE (*head); head++; - auparse->channels = GUINT32_FROM_BE (*head); + auparse->channels = GUINT32_FROM_BE (*head); head++; - /* and of course, someone had to invent a little endian - * version. Used by DEC systems. */ + /* and of course, someone had to invent a little endian + * version. Used by DEC systems. */ } else if (GUINT32_FROM_LE (*head) == 0x0064732E) { auparse->le = 1; head++; auparse->le = 0; - auparse->offset = GUINT32_FROM_LE (*head); + auparse->offset = GUINT32_FROM_LE (*head); head++; - auparse->size = GUINT32_FROM_LE (*head); + auparse->size = GUINT32_FROM_LE (*head); head++; - auparse->encoding = GUINT32_FROM_LE (*head); + auparse->encoding = GUINT32_FROM_LE (*head); head++; - auparse->frequency = GUINT32_FROM_LE (*head); + auparse->frequency = GUINT32_FROM_LE (*head); head++; - auparse->channels = GUINT32_FROM_LE (*head); + auparse->channels = GUINT32_FROM_LE (*head); head++; } else { g_warning ("help, dunno what I'm looking at!\n"); - gst_buffer_unref(buf); + gst_buffer_unref (buf); return; } - g_print ("offset %ld, size %ld, encoding %ld, frequency %ld, channels %ld\n", - auparse->offset,auparse->size,auparse->encoding, - auparse->frequency,auparse->channels); - GST_DEBUG ("offset %ld, size %ld, encoding %ld, frequency %ld, channels %ld", - auparse->offset,auparse->size,auparse->encoding, - auparse->frequency,auparse->channels); - + g_print + ("offset %ld, size %ld, encoding %ld, frequency %ld, channels %ld\n", + auparse->offset, auparse->size, auparse->encoding, auparse->frequency, + auparse->channels); + GST_DEBUG + ("offset %ld, size %ld, encoding %ld, frequency %ld, channels %ld", + auparse->offset, auparse->size, auparse->encoding, auparse->frequency, + auparse->channels); + switch (auparse->encoding) { case 1: law = 1; @@ -246,11 +249,10 @@ gst_auparse_chain (GstPad *pad, GstData *_data) } else { tempcaps = gst_caps_new_simple ("audio/x-raw-int", "endianness", G_TYPE_INT, G_BIG_ENDIAN, - "rate", G_TYPE_INT, auparse->frequency, - "channels", G_TYPE_INT, auparse->channels, - "depth", G_TYPE_INT, depth, - "width", G_TYPE_INT, depth, - "signed", G_TYPE_BOOLEAN, sign, NULL); + "rate", G_TYPE_INT, auparse->frequency, + "channels", G_TYPE_INT, auparse->channels, + "depth", G_TYPE_INT, depth, + "width", G_TYPE_INT, depth, "signed", G_TYPE_BOOLEAN, sign, NULL); } if (!gst_pad_set_explicit_caps (auparse->srcpad, tempcaps)) { @@ -259,9 +261,9 @@ gst_auparse_chain (GstPad *pad, GstData *_data) } newbuf = gst_buffer_new (); - GST_BUFFER_DATA (newbuf) = (gpointer) malloc (size-(auparse->offset)); - memcpy (GST_BUFFER_DATA (newbuf), data+24, size-(auparse->offset)); - GST_BUFFER_SIZE (newbuf) = size-(auparse->offset); + GST_BUFFER_DATA (newbuf) = (gpointer) malloc (size - (auparse->offset)); + memcpy (GST_BUFFER_DATA (newbuf), data + 24, size - (auparse->offset)); + GST_BUFFER_SIZE (newbuf) = size - (auparse->offset); gst_buffer_unref (buf); @@ -274,25 +276,17 @@ gst_auparse_chain (GstPad *pad, GstData *_data) static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "auparse", GST_RANK_SECONDARY, - GST_TYPE_AUPARSE)) { + GST_TYPE_AUPARSE)) { return FALSE; } return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "auparse", - "parses au streams", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) - +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "auparse", + "parses au streams", plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/auparse/gstauparse.h b/gst/auparse/gstauparse.h index d6e5a082..87508c5b 100644 --- a/gst/auparse/gstauparse.h +++ b/gst/auparse/gstauparse.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_AUPARSE \ @@ -41,33 +42,35 @@ extern "C" { #define GST_IS_AUPARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUPARSE)) -typedef struct _GstAuParse GstAuParse; -typedef struct _GstAuParseClass GstAuParseClass; + typedef struct _GstAuParse GstAuParse; + typedef struct _GstAuParseClass GstAuParseClass; -struct _GstAuParse { - GstElement element; + struct _GstAuParse + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - guchar le; - glong offset; - glong size; - glong encoding; - glong frequency; - glong channels; + guchar le; + glong offset; + glong size; + glong encoding; + glong frequency; + glong channels; -}; + }; -struct _GstAuParseClass { - GstElementClass parent_class; -}; + struct _GstAuParseClass + { + GstElementClass parent_class; + }; -GType gst_auparse_get_type (void); + GType gst_auparse_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_AUPARSE_H__ */ +#endif /* __GST_AUPARSE_H__ */ diff --git a/gst/avi/avi-ids.h b/gst/avi/avi-ids.h index f9e2dd31..f7e773ec 100644 --- a/gst/avi/avi-ids.h +++ b/gst/avi/avi-ids.h @@ -22,21 +22,22 @@ #include -typedef struct _gst_riff_avih { - guint32 us_frame; /* microsec per frame */ - guint32 max_bps; /* byte/s overall */ - guint32 pad_gran; /* pad_granularity */ +typedef struct _gst_riff_avih +{ + guint32 us_frame; /* microsec per frame */ + guint32 max_bps; /* byte/s overall */ + guint32 pad_gran; /* pad_granularity */ guint32 flags; /* flags values */ -#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ -#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ -#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ -#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ -#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ - guint32 tot_frames; /* # of frames (all) */ - guint32 init_frames; /* initial frames (???) */ +#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ +#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ +#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ +#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ +#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ + guint32 tot_frames; /* # of frames (all) */ + guint32 init_frames; /* initial frames (???) */ guint32 streams; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 width; guint32 height; guint32 scale; diff --git a/gst/avi/gstavi.c b/gst/avi/gstavi.c index fa17fa47..dbdc7859 100644 --- a/gst/avi/gstavi.c +++ b/gst/avi/gstavi.c @@ -29,7 +29,7 @@ #include "gstavimux.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("riff")) return FALSE; @@ -40,21 +40,13 @@ plugin_init (GstPlugin *plugin) #endif /* ENABLE_NLS */ return (gst_element_register (plugin, "avidemux", - GST_RANK_PRIMARY, - GST_TYPE_AVI_DEMUX) && - gst_element_register (plugin, "avimux", - GST_RANK_NONE, - GST_TYPE_AVIMUX)); + GST_RANK_PRIMARY, + GST_TYPE_AVI_DEMUX) && + gst_element_register (plugin, "avimux", GST_RANK_NONE, GST_TYPE_AVIMUX)); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "avi", - "AVI stream handling", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "avi", + "AVI stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/avi/gstavidecoder.c b/gst/avi/gstavidecoder.c index 9f9a5968..d4cb493f 100644 --- a/gst/avi/gstavidecoder.c +++ b/gst/avi/gstavidecoder.c @@ -31,12 +31,11 @@ static GstElementDetails gst_avi_decoder_details = { "Decoder/Video", "Decodes a .avi file into audio and video", VERSION, - "Erik Walthinsen \n" - "Wim Taymans ", + "Erik Walthinsen \n" "Wim Taymans ", "(C) 1999", }; -static GstCaps* avi_typefind (GstBuffer *buf, gpointer private); +static GstCaps *avi_typefind (GstBuffer * buf, gpointer private); /* typefactory for 'avi' */ static GstTypeDefinition avidefinition = { @@ -47,12 +46,14 @@ static GstTypeDefinition avidefinition = { }; /* AviDecoder signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BITRATE, ARG_MEDIA_TIME, @@ -61,118 +62,104 @@ enum { }; GST_PADTEMPLATE_FACTORY (sink_templ, - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "avidecoder_sink", - "video/avi", - "RIFF", GST_PROPS_STRING ("AVI") - ) -) - -GST_PADTEMPLATE_FACTORY (src_video_templ, - "video_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "wincodec_src", - "video/raw", - "format", GST_PROPS_LIST ( - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2')), - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R','G','B',' ')) - ), - "width", GST_PROPS_INT_RANGE (16, 4096), - "height", GST_PROPS_INT_RANGE (16, 4096) - ) -) - -GST_PADTEMPLATE_FACTORY (src_audio_templ, - "audio_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "src_audio", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_LIST ( - GST_PROPS_BOOLEAN (TRUE), - GST_PROPS_BOOLEAN (FALSE) - ), - "width", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "depth", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "rate", GST_PROPS_INT_RANGE (11025, 48000), - "channels", GST_PROPS_INT_RANGE (1, 2) - ) -) - -static void gst_avi_decoder_class_init (GstAviDecoderClass *klass); -static void gst_avi_decoder_init (GstAviDecoder *avi_decoder); - -static void gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - - - -static GstElementClass *parent_class = NULL; + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("avidecoder_sink", + "video/avi", "RIFF", GST_PROPS_STRING ("AVI") + ) + ) + + GST_PADTEMPLATE_FACTORY (src_video_templ, + "video_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("wincodec_src", + "video/raw", + "format", GST_PROPS_LIST (GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y', 'U', 'Y', + '2')), GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I', '4', '2', '0')), + GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R', 'G', 'B', ' ')) + ), "width", GST_PROPS_INT_RANGE (16, 4096), "height", + GST_PROPS_INT_RANGE (16, 4096) + ) + ) + + GST_PADTEMPLATE_FACTORY (src_audio_templ, + "audio_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("src_audio", + "audio/raw", + "format", GST_PROPS_STRING ("int"), + "law", GST_PROPS_INT (0), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "signed", GST_PROPS_LIST (GST_PROPS_BOOLEAN (TRUE), + GST_PROPS_BOOLEAN (FALSE) + ), "width", GST_PROPS_LIST (GST_PROPS_INT (8), GST_PROPS_INT (16) + ), "depth", GST_PROPS_LIST (GST_PROPS_INT (8), GST_PROPS_INT (16) + ), + "rate", GST_PROPS_INT_RANGE (11025, 48000), + "channels", GST_PROPS_INT_RANGE (1, 2) + ) + ) + + static void gst_avi_decoder_class_init (GstAviDecoderClass * klass); + static void gst_avi_decoder_init (GstAviDecoder * avi_decoder); + + static void gst_avi_decoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + + + + static GstElementClass *parent_class = NULL; + /*static guint gst_avi_decoder_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avi_decoder_get_type(void) +gst_avi_decoder_get_type (void) { static GType avi_decoder_type = 0; if (!avi_decoder_type) { static const GTypeInfo avi_decoder_info = { - sizeof(GstAviDecoderClass), + sizeof (GstAviDecoderClass), NULL, NULL, - (GClassInitFunc)gst_avi_decoder_class_init, + (GClassInitFunc) gst_avi_decoder_class_init, NULL, NULL, - sizeof(GstAviDecoder), + sizeof (GstAviDecoder), 0, - (GInstanceInitFunc)gst_avi_decoder_init, + (GInstanceInitFunc) gst_avi_decoder_init, }; - avi_decoder_type = g_type_register_static(GST_TYPE_BIN, "GstAviDecoder", &avi_decoder_info, 0); + avi_decoder_type = + g_type_register_static (GST_TYPE_BIN, "GstAviDecoder", + &avi_decoder_info, 0); } return avi_decoder_type; } static void -gst_avi_decoder_class_init (GstAviDecoderClass *klass) +gst_avi_decoder_class_init (GstAviDecoderClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_BITRATE, - g_param_spec_long ("bitrate","bitrate","bitrate", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_MEDIA_TIME, - g_param_spec_long ("media_time","media_time","media_time", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_CURRENT_TIME, - g_param_spec_long ("current_time","current_time","current_time", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE, g_param_spec_long ("bitrate", "bitrate", "bitrate", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MEDIA_TIME, g_param_spec_long ("media_time", "media_time", "media_time", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CURRENT_TIME, g_param_spec_long ("current_time", "current_time", "current_time", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ parent_class = g_type_class_ref (GST_TYPE_BIN); - + gobject_class->get_property = gst_avi_decoder_get_property; } -static void -gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_decoder) +static void +gst_avi_decoder_new_pad (GstElement * element, GstPad * pad, + GstAviDecoder * avi_decoder) { GstCaps *caps; GstCaps *targetcaps = NULL; @@ -182,38 +169,40 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de GstElement *new_element = NULL; gchar *padname = NULL; gchar *gpadname = NULL; + #define AVI_TYPE_VIDEO 1 #define AVI_TYPE_AUDIO 2 gint media_type = 0; - - GST_DEBUG (0, "avidecoder: new pad for element \"%s\"", gst_element_get_name (element)); + + GST_DEBUG (0, "avidecoder: new pad for element \"%s\"", + gst_element_get_name (element)); caps = gst_pad_get_caps (pad); format = gst_caps_get_string (caps, "format"); - if (!strcmp (format, "strf_vids")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); + if (!strcmp (format, "strf_vids")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); media_type = AVI_TYPE_VIDEO; gpadname = g_strdup_printf ("video_%02d", avi_decoder->video_count++); - } - else if (!strcmp (format, "strf_auds")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_audio_templ)); + } else if (!strcmp (format, "strf_auds")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_audio_templ)); media_type = AVI_TYPE_AUDIO; gpadname = g_strdup_printf ("audio_%02d", avi_decoder->audio_count++); - } - else if (!strcmp (format, "strf_iavs")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); + } else if (!strcmp (format, "strf_iavs")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); media_type = AVI_TYPE_VIDEO; gpadname = g_strdup_printf ("video_%02d", avi_decoder->video_count++); - } - else { + } else { g_assert_not_reached (); } gst_element_set_state (GST_ELEMENT (avi_decoder), GST_STATE_PAUSED); - type = gst_elementfactory_make ("avitypes", - g_strdup_printf ("typeconvert%d", avi_decoder->count)); + type = gst_elementfactory_make ("avitypes", + g_strdup_printf ("typeconvert%d", avi_decoder->count)); /* brin the element to the READY state so it can do our caps negotiation */ gst_element_set_state (type, GST_STATE_READY); @@ -224,13 +213,13 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de if (type_found) { gst_bin_add (GST_BIN (avi_decoder), type); - + pad = gst_element_get_pad (type, "src"); caps = gst_pad_get_caps (pad); if (gst_caps_is_always_compatible (caps, targetcaps)) { - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (type, "src"), gpadname); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (type, "src"), gpadname); avi_decoder->count++; goto done; @@ -238,7 +227,8 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de #ifndef GST_DISABLE_AUTOPLUG else { GstAutoplug *autoplug; - autoplug = gst_autoplugfactory_make("static"); + + autoplug = gst_autoplugfactory_make ("static"); new_element = gst_autoplug_to_caps (autoplug, caps, targetcaps, NULL); @@ -249,45 +239,43 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de if (!new_element && (media_type == AVI_TYPE_VIDEO)) { padname = "src"; - } - else if (!new_element && (media_type == AVI_TYPE_AUDIO)) { + } else if (!new_element && (media_type == AVI_TYPE_AUDIO)) { /*FIXME */ padname = "src"; } if (new_element) { gst_pad_connect (pad, gst_element_get_pad (new_element, "sink")); - gst_element_set_name (new_element, g_strdup_printf ("element%d", avi_decoder->count)); + gst_element_set_name (new_element, g_strdup_printf ("element%d", + avi_decoder->count)); gst_bin_add (GST_BIN (avi_decoder), new_element); - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (new_element, padname), gpadname); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (new_element, padname), gpadname); avi_decoder->count++; - } - else { + } else { g_warning ("avidecoder: could not autoplug\n"); } -done: +done: gst_element_set_state (GST_ELEMENT (avi_decoder), GST_STATE_PLAYING); } -static void -gst_avi_decoder_init (GstAviDecoder *avi_decoder) +static void +gst_avi_decoder_init (GstAviDecoder * avi_decoder) { avi_decoder->demuxer = gst_elementfactory_make ("avidemux", "demux"); if (avi_decoder->demuxer) { gst_bin_add (GST_BIN (avi_decoder), avi_decoder->demuxer); - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (avi_decoder->demuxer, "sink"), "sink"); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (avi_decoder->demuxer, "sink"), "sink"); - g_signal_connect (G_OBJECT (avi_decoder->demuxer),"new_pad", G_CALLBACK (gst_avi_decoder_new_pad), - avi_decoder); - } - else { + g_signal_connect (G_OBJECT (avi_decoder->demuxer), "new_pad", + G_CALLBACK (gst_avi_decoder_new_pad), avi_decoder); + } else { g_warning ("wow!, no avi demuxer found. help me\n"); } @@ -296,26 +284,27 @@ gst_avi_decoder_init (GstAviDecoder *avi_decoder) avi_decoder->video_count = 0; } -static GstCaps* -avi_typefind (GstBuffer *buf, - gpointer private) +static GstCaps * +avi_typefind (GstBuffer * buf, gpointer private) { gchar *data = GST_BUFFER_DATA (buf); GstCaps *new; - GST_DEBUG (0,"avi_decoder: typefind"); - if (strncmp (&data[0], "RIFF", 4)) return NULL; - if (strncmp (&data[8], "AVI ", 4)) return NULL; + GST_DEBUG (0, "avi_decoder: typefind"); + if (strncmp (&data[0], "RIFF", 4)) + return NULL; + if (strncmp (&data[8], "AVI ", 4)) + return NULL; new = GST_CAPS_NEW ("avi_typefind", - "video/avi", - "RIFF", GST_PROPS_STRING ("AVI")); + "video/avi", "RIFF", GST_PROPS_STRING ("AVI")); return new; } static void -gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_avi_decoder_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstAviDecoder *src; @@ -323,14 +312,16 @@ gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GPa src = GST_AVI_DECODER (object); - switch(prop_id) { + switch (prop_id) { case ARG_BITRATE: break; case ARG_MEDIA_TIME: - g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), "media_time")); + g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), + "media_time")); break; case ARG_CURRENT_TIME: - g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), "current_time")); + g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), + "current_time")); break; default: break; @@ -339,19 +330,22 @@ gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GPa static gboolean -plugin_init (GModule *module, GstPlugin *plugin) +plugin_init (GModule * module, GstPlugin * plugin) { GstElementFactory *factory; GstTypeFactory *type; /* create an elementfactory for the avi_decoder element */ factory = gst_elementfactory_new ("avidecoder", GST_TYPE_AVI_DECODER, - &gst_avi_decoder_details); + &gst_avi_decoder_details); g_return_val_if_fail (factory != NULL, FALSE); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (src_audio_templ)); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (src_video_templ)); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (sink_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (src_audio_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (src_video_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (sink_templ)); type = gst_typefactory_new (&avidefinition); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type)); @@ -367,4 +361,3 @@ GstPluginDesc plugin_desc = { "avidecoder", plugin_init }; - diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 1b50b98e..03403488 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -32,72 +32,62 @@ GST_DEBUG_CATEGORY_STATIC (avidemux_debug); #define GST_CAT_DEFAULT avidemux_debug /* AviDemux signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_STREAMINFO, /* FILL ME */ }; -static GstStaticPadTemplate sink_templ = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-msvideo") -); +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); -static void gst_avi_demux_base_init (GstAviDemuxClass *klass); -static void gst_avi_demux_class_init (GstAviDemuxClass *klass); -static void gst_avi_demux_init (GstAviDemux *avi); +static void gst_avi_demux_base_init (GstAviDemuxClass * klass); +static void gst_avi_demux_class_init (GstAviDemuxClass * klass); +static void gst_avi_demux_init (GstAviDemux * avi); -static void gst_avi_demux_reset (GstAviDemux *avi); -static void gst_avi_demux_loop (GstElement *element); +static void gst_avi_demux_reset (GstAviDemux * avi); +static void gst_avi_demux_loop (GstElement * element); -static gboolean gst_avi_demux_send_event (GstElement *element, - GstEvent *event); +static gboolean gst_avi_demux_send_event (GstElement * element, + GstEvent * event); -static const GstEventMask * - gst_avi_demux_get_event_mask (GstPad *pad); -static gboolean gst_avi_demux_handle_src_event (GstPad *pad, - GstEvent *event); -static const GstFormat * - gst_avi_demux_get_src_formats (GstPad *pad); -static const GstQueryType * - gst_avi_demux_get_src_query_types (GstPad *pad); -static gboolean gst_avi_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); -static gboolean gst_avi_demux_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); +static const GstEventMask *gst_avi_demux_get_event_mask (GstPad * pad); +static gboolean gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event); +static const GstFormat *gst_avi_demux_get_src_formats (GstPad * pad); +static const GstQueryType *gst_avi_demux_get_src_query_types (GstPad * pad); +static gboolean gst_avi_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); +static gboolean gst_avi_demux_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); -static GstElementStateReturn - gst_avi_demux_change_state (GstElement *element); +static GstElementStateReturn gst_avi_demux_change_state (GstElement * element); -static void gst_avi_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_avi_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); static GstRiffReadClass *parent_class = NULL; + /*static guint gst_avi_demux_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avi_demux_get_type(void) +gst_avi_demux_get_type (void) { static GType avi_demux_type = 0; if (!avi_demux_type) { static const GTypeInfo avi_demux_info = { - sizeof (GstAviDemuxClass), + sizeof (GstAviDemuxClass), (GBaseInitFunc) gst_avi_demux_base_init, NULL, (GClassInitFunc) gst_avi_demux_class_init, @@ -110,40 +100,34 @@ gst_avi_demux_get_type(void) avi_demux_type = g_type_register_static (GST_TYPE_RIFF_READ, - "GstAviDemux", - &avi_demux_info, 0); + "GstAviDemux", &avi_demux_info, 0); } return avi_demux_type; } static void -gst_avi_demux_base_init (GstAviDemuxClass *klass) +gst_avi_demux_base_init (GstAviDemuxClass * klass) { - static GstElementDetails gst_avi_demux_details = GST_ELEMENT_DETAILS ( - "Avi demuxer", - "Codec/Demuxer", - "Demultiplex an avi file into audio and video", - "Erik Walthinsen \n" - "Wim Taymans \n" - "Ronald Bultje " - ); + static GstElementDetails gst_avi_demux_details = + GST_ELEMENT_DETAILS ("Avi demuxer", + "Codec/Demuxer", + "Demultiplex an avi file into audio and video", + "Erik Walthinsen \n" + "Wim Taymans \n" + "Ronald Bultje "); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstPadTemplate *videosrctempl, *audiosrctempl; GstCaps *audcaps, *vidcaps; audcaps = gst_riff_create_audio_template_caps (); audiosrctempl = gst_pad_template_new ("audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - audcaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, audcaps); vidcaps = gst_riff_create_video_template_caps (); gst_caps_append (vidcaps, gst_riff_create_iavs_template_caps ()); videosrctempl = gst_pad_template_new ("video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - vidcaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, vidcaps); gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, videosrctempl); @@ -153,36 +137,37 @@ gst_avi_demux_base_init (GstAviDemuxClass *klass) } static void -gst_avi_demux_class_init (GstAviDemuxClass *klass) +gst_avi_demux_class_init (GstAviDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_STREAMINFO, - g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", - GST_TYPE_CAPS, G_PARAM_READABLE)); + g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", + GST_TYPE_CAPS, G_PARAM_READABLE)); GST_DEBUG_CATEGORY_INIT (avidemux_debug, "avidemux", - 0, "Demuxer for AVI streams"); + 0, "Demuxer for AVI streams"); parent_class = g_type_class_ref (GST_TYPE_RIFF_READ); - + gobject_class->get_property = gst_avi_demux_get_property; - + gstelement_class->change_state = gst_avi_demux_change_state; gstelement_class->send_event = gst_avi_demux_send_event; } -static void -gst_avi_demux_init (GstAviDemux *avi) +static void +gst_avi_demux_init (GstAviDemux * avi) { GST_FLAG_SET (avi, GST_ELEMENT_EVENT_AWARE); - avi->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_templ), "sink"); + avi->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_templ), + "sink"); gst_element_add_pad (GST_ELEMENT (avi), avi->sinkpad); GST_RIFF_READ (avi)->sinkpad = avi->sinkpad; @@ -195,7 +180,7 @@ gst_avi_demux_init (GstAviDemux *avi) } static void -gst_avi_demux_reset (GstAviDemux *avi) +gst_avi_demux_reset (GstAviDemux * avi) { gint i; @@ -221,27 +206,25 @@ gst_avi_demux_reset (GstAviDemux *avi) avi->num_frames = 0; avi->us_per_frame = 0; - avi->seek_offset = (guint64) -1; + avi->seek_offset = (guint64) - 1; gst_caps_replace (&avi->streaminfo, NULL); } static void -gst_avi_demux_streaminfo (GstAviDemux *avi) +gst_avi_demux_streaminfo (GstAviDemux * avi) { /* compression formats are added later - a bit hacky */ gst_caps_replace (&avi->streaminfo, gst_caps_new_simple ("application/x-gst-streaminfo", NULL)); - /*g_object_notify(G_OBJECT(avi), "streaminfo");*/ + /*g_object_notify(G_OBJECT(avi), "streaminfo"); */ } static gst_avi_index_entry * -gst_avi_demux_index_next (GstAviDemux *avi, - gint stream_nr, - gint start, - guint32 flags) +gst_avi_demux_index_next (GstAviDemux * avi, + gint stream_nr, gint start, guint32 flags) { gint i; gst_avi_index_entry *entry = NULL; @@ -258,10 +241,8 @@ gst_avi_demux_index_next (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_time (GstAviDemux *avi, - gint stream_nr, - guint64 time, - guint32 flags) +gst_avi_demux_index_entry_for_time (GstAviDemux * avi, + gint stream_nr, guint64 time, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -283,10 +264,8 @@ gst_avi_demux_index_entry_for_time (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_byte (GstAviDemux *avi, - gint stream_nr, - guint64 byte, - guint32 flags) +gst_avi_demux_index_entry_for_byte (GstAviDemux * avi, + gint stream_nr, guint64 byte, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -308,10 +287,8 @@ gst_avi_demux_index_entry_for_byte (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_frame (GstAviDemux *avi, - gint stream_nr, - guint32 frame, - guint32 flags) +gst_avi_demux_index_entry_for_frame (GstAviDemux * avi, + gint stream_nr, guint32 frame, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -333,7 +310,7 @@ gst_avi_demux_index_entry_for_frame (GstAviDemux *avi, } static const GstFormat * -gst_avi_demux_get_src_formats (GstPad *pad) +gst_avi_demux_get_src_formats (GstPad * pad) { avi_stream_context *stream = gst_pad_get_element_private (pad); @@ -350,36 +327,34 @@ gst_avi_demux_get_src_formats (GstPad *pad) }; return (stream->strh->type == GST_RIFF_FCC_auds ? - src_a_formats : src_v_formats); + src_a_formats : src_v_formats); } static gboolean -gst_avi_demux_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value) +gst_avi_demux_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; - /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad));*/ + + /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); */ avi_stream_context *stream = gst_pad_get_element_private (pad); - if (stream->strh->type != GST_RIFF_FCC_auds && - (src_format == GST_FORMAT_BYTES || - *dest_format == GST_FORMAT_BYTES)) + if (stream->strh->type != GST_RIFF_FCC_auds && + (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES)) return FALSE; switch (src_format) { case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: - *dest_value = src_value * stream->strh->rate / - (stream->strh->scale * GST_SECOND); - break; - case GST_FORMAT_DEFAULT: - *dest_value = src_value * stream->strh->rate / - (stream->strh->scale * GST_SECOND); - break; + *dest_value = src_value * stream->strh->rate / + (stream->strh->scale * GST_SECOND); + break; + case GST_FORMAT_DEFAULT: + *dest_value = src_value * stream->strh->rate / + (stream->strh->scale * GST_SECOND); + break; default: res = FALSE; break; @@ -388,7 +363,7 @@ gst_avi_demux_src_convert (GstPad *pad, case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_TIME: - *dest_value = ((gfloat) src_value) * GST_SECOND / stream->strh->rate; + *dest_value = ((gfloat) src_value) * GST_SECOND / stream->strh->rate; break; default: res = FALSE; @@ -398,8 +373,8 @@ gst_avi_demux_src_convert (GstPad *pad, case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_TIME: - *dest_value = ((((gfloat) src_value) * stream->strh->scale) / - stream->strh->rate) * GST_SECOND; + *dest_value = ((((gfloat) src_value) * stream->strh->scale) / + stream->strh->rate) * GST_SECOND; break; default: res = FALSE; @@ -414,7 +389,7 @@ gst_avi_demux_src_convert (GstPad *pad, } static const GstQueryType * -gst_avi_demux_get_src_query_types (GstPad *pad) +gst_avi_demux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -426,67 +401,64 @@ gst_avi_demux_get_src_query_types (GstPad *pad) } static gboolean -gst_avi_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value) +gst_avi_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value) { gboolean res = TRUE; - /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad));*/ + + /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); */ avi_stream_context *stream = gst_pad_get_element_private (pad); switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_TIME: - *value = (((gfloat) stream->strh->scale) * stream->strh->length / - stream->strh->rate) * GST_SECOND; + case GST_FORMAT_TIME: + *value = (((gfloat) stream->strh->scale) * stream->strh->length / + stream->strh->rate) * GST_SECOND; break; - case GST_FORMAT_BYTES: - if (stream->strh->type == GST_RIFF_FCC_auds) { - *value = stream->total_bytes; - } - else + case GST_FORMAT_BYTES: + if (stream->strh->type == GST_RIFF_FCC_auds) { + *value = stream->total_bytes; + } else res = FALSE; break; - case GST_FORMAT_DEFAULT: - if (stream->strh->type == GST_RIFF_FCC_auds) - *value = stream->strh->length * stream->strh->samplesize; + case GST_FORMAT_DEFAULT: + if (stream->strh->type == GST_RIFF_FCC_auds) + *value = stream->strh->length * stream->strh->samplesize; else if (stream->strh->type == GST_RIFF_FCC_vids) - *value = stream->strh->length; + *value = stream->strh->length; else res = FALSE; break; default: - res = FALSE; + res = FALSE; break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_TIME: - if (stream->strh->samplesize && + case GST_FORMAT_TIME: + if (stream->strh->samplesize && stream->strh->type == GST_RIFF_FCC_auds) { - *value = ((gfloat) stream->current_byte) * GST_SECOND / - stream->strh->rate; - } - else { - *value = (((gfloat) stream->current_frame) * stream->strh->scale / - stream->strh->rate) * GST_SECOND; + *value = ((gfloat) stream->current_byte) * GST_SECOND / + stream->strh->rate; + } else { + *value = (((gfloat) stream->current_frame) * stream->strh->scale / + stream->strh->rate) * GST_SECOND; } break; - case GST_FORMAT_BYTES: - *value = stream->current_byte; + case GST_FORMAT_BYTES: + *value = stream->current_byte; break; - case GST_FORMAT_DEFAULT: - if (stream->strh->samplesize && - stream->strh->type == GST_RIFF_FCC_auds) - *value = stream->current_byte * stream->strh->samplesize; - else - *value = stream->current_frame; + case GST_FORMAT_DEFAULT: + if (stream->strh->samplesize && + stream->strh->type == GST_RIFF_FCC_auds) + *value = stream->current_byte * stream->strh->samplesize; + else + *value = stream->current_frame; break; default: - res = FALSE; + res = FALSE; break; } break; @@ -499,7 +471,7 @@ gst_avi_demux_handle_src_query (GstPad *pad, } static GstCaps * -gst_avi_demux_src_getcaps (GstPad *pad) +gst_avi_demux_src_getcaps (GstPad * pad) { avi_stream_context *stream = gst_pad_get_element_private (pad); @@ -507,8 +479,7 @@ gst_avi_demux_src_getcaps (GstPad *pad) } static gint32 -gst_avi_demux_sync_streams (GstAviDemux *avi, - guint64 time) +gst_avi_demux_sync_streams (GstAviDemux * avi, guint64 time) { gint i; guint32 min_index = G_MAXUINT; @@ -521,25 +492,25 @@ gst_avi_demux_sync_streams (GstAviDemux *avi, GST_DEBUG ("finding %d for time %" G_GINT64_FORMAT, i, time); entry = gst_avi_demux_index_entry_for_time (avi, stream->num, time, - GST_RIFF_IF_KEYFRAME); + GST_RIFF_IF_KEYFRAME); if (entry) { min_index = MIN (entry->index_nr, min_index); } } GST_DEBUG ("first index at %d", min_index); - + /* now we know the entry we need to sync on. calculate number of frames to * skip fro there on and the stream stats */ for (i = 0; i < avi->num_streams; i++) { gst_avi_index_entry *next_entry; + stream = &avi->stream[i]; /* next entry */ - next_entry = gst_avi_demux_index_next (avi, stream->num, - min_index, 0); + next_entry = gst_avi_demux_index_next (avi, stream->num, min_index, 0); /* next entry with keyframe */ entry = gst_avi_demux_index_next (avi, stream->num, min_index, - GST_RIFF_IF_KEYFRAME); + GST_RIFF_IF_KEYFRAME); stream->current_byte = next_entry->bytes_before; stream->current_frame = next_entry->frames_before; @@ -554,14 +525,13 @@ gst_avi_demux_sync_streams (GstAviDemux *avi, } static gboolean -gst_avi_demux_send_event (GstElement *element, - GstEvent *event) +gst_avi_demux_send_event (GstElement * element, GstEvent * event) { const GList *pads; pads = gst_element_get_pad_list (element); - while (pads) { + while (pads) { GstPad *pad = GST_PAD (pads->data); if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) { @@ -574,93 +544,88 @@ gst_avi_demux_send_event (GstElement *element, return TRUE; } } - + pads = g_list_next (pads); } - + gst_event_unref (event); return FALSE; } static const GstEventMask * -gst_avi_demux_get_event_mask (GstPad *pad) +gst_avi_demux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT }, - { 0, } + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, + {0,} }; return masks; } - + static gboolean -gst_avi_demux_handle_src_event (GstPad *pad, - GstEvent *event) +gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); avi_stream_context *stream; - + stream = gst_pad_get_element_private (pad); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: GST_DEBUG ("seek format %d, %08x", GST_EVENT_SEEK_FORMAT (event), - stream->strh->type); + stream->strh->type); switch (GST_EVENT_SEEK_FORMAT (event)) { case GST_FORMAT_BYTES: case GST_FORMAT_DEFAULT: - case GST_FORMAT_TIME: { + case GST_FORMAT_TIME:{ gst_avi_index_entry *seek_entry, *entry = NULL; gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); guint32 flags; - guint64 min_index; + guint64 min_index; /* no seek on audio yet */ if (stream->strh->type == GST_RIFF_FCC_auds) { res = FALSE; goto done; } - GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); + GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); - flags = GST_RIFF_IF_KEYFRAME; - switch (GST_EVENT_SEEK_FORMAT (event)) { + flags = GST_RIFF_IF_KEYFRAME; + switch (GST_EVENT_SEEK_FORMAT (event)) { case GST_FORMAT_BYTES: - entry = gst_avi_demux_index_entry_for_byte (avi, stream->num, - desired_offset, - flags); - break; + entry = gst_avi_demux_index_entry_for_byte (avi, stream->num, + desired_offset, flags); + break; case GST_FORMAT_DEFAULT: - entry = gst_avi_demux_index_entry_for_frame (avi, stream->num, - desired_offset, - flags); - break; + entry = gst_avi_demux_index_entry_for_frame (avi, stream->num, + desired_offset, flags); + break; case GST_FORMAT_TIME: - entry = gst_avi_demux_index_entry_for_time (avi, stream->num, - desired_offset, - flags); - break; - } + entry = gst_avi_demux_index_entry_for_time (avi, stream->num, + desired_offset, flags); + break; + } if (entry) { min_index = gst_avi_demux_sync_streams (avi, entry->ts); - seek_entry = &avi->index_entries[min_index]; + seek_entry = &avi->index_entries[min_index]; avi->seek_offset = seek_entry->offset + avi->index_offset; - avi->last_seek = entry->ts; + avi->last_seek = entry->ts; } else { - GST_DEBUG ("no index entry found for format=%d value=%" - G_GINT64_FORMAT, GST_EVENT_SEEK_FORMAT (event), - desired_offset); + GST_DEBUG ("no index entry found for format=%d value=%" + G_GINT64_FORMAT, GST_EVENT_SEEK_FORMAT (event), desired_offset); res = FALSE; } break; } default: res = FALSE; - break; + break; } break; default: @@ -679,7 +644,7 @@ done: */ gboolean -gst_avi_demux_stream_init (GstAviDemux *avi) +gst_avi_demux_stream_init (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 doctype; @@ -699,9 +664,8 @@ gst_avi_demux_stream_init (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_avih (GstAviDemux *avi, - guint32 *flags, - guint32 *streams) +gst_avi_demux_stream_avih (GstAviDemux * avi, + guint32 * flags, guint32 * streams) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; @@ -718,43 +682,43 @@ gst_avi_demux_stream_avih (GstAviDemux *avi, } if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_avih)) { g_warning ("Too small avih (%d available, %d needed)", - GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih)); + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih)); gst_buffer_unref (buf); return FALSE; } _avih = (gst_riff_avih *) GST_BUFFER_DATA (buf); - avih.us_frame = GUINT32_FROM_LE (_avih->us_frame); - avih.max_bps = GUINT32_FROM_LE (_avih->max_bps); - avih.pad_gran = GUINT32_FROM_LE (_avih->pad_gran); - avih.flags = GUINT32_FROM_LE (_avih->flags); - avih.tot_frames = GUINT32_FROM_LE (_avih->tot_frames); + avih.us_frame = GUINT32_FROM_LE (_avih->us_frame); + avih.max_bps = GUINT32_FROM_LE (_avih->max_bps); + avih.pad_gran = GUINT32_FROM_LE (_avih->pad_gran); + avih.flags = GUINT32_FROM_LE (_avih->flags); + avih.tot_frames = GUINT32_FROM_LE (_avih->tot_frames); avih.init_frames = GUINT32_FROM_LE (_avih->init_frames); - avih.streams = GUINT32_FROM_LE (_avih->streams); - avih.bufsize = GUINT32_FROM_LE (_avih->bufsize); - avih.width = GUINT32_FROM_LE (_avih->width); - avih.height = GUINT32_FROM_LE (_avih->height); - avih.scale = GUINT32_FROM_LE (_avih->scale); - avih.rate = GUINT32_FROM_LE (_avih->rate); - avih.start = GUINT32_FROM_LE (_avih->start); - avih.length = GUINT32_FROM_LE (_avih->length); + avih.streams = GUINT32_FROM_LE (_avih->streams); + avih.bufsize = GUINT32_FROM_LE (_avih->bufsize); + avih.width = GUINT32_FROM_LE (_avih->width); + avih.height = GUINT32_FROM_LE (_avih->height); + avih.scale = GUINT32_FROM_LE (_avih->scale); + avih.rate = GUINT32_FROM_LE (_avih->rate); + avih.start = GUINT32_FROM_LE (_avih->start); + avih.length = GUINT32_FROM_LE (_avih->length); /* debug stuff */ GST_INFO ("avih tag found:"); - GST_INFO (" us_frame %u", avih.us_frame); - GST_INFO (" max_bps %u", avih.max_bps); - GST_INFO (" pad_gran %u", avih.pad_gran); + GST_INFO (" us_frame %u", avih.us_frame); + GST_INFO (" max_bps %u", avih.max_bps); + GST_INFO (" pad_gran %u", avih.pad_gran); GST_INFO (" flags 0x%08x", avih.flags); - GST_INFO (" tot_frames %u", avih.tot_frames); - GST_INFO (" init_frames %u", avih.init_frames); - GST_INFO (" streams %u", avih.streams); - GST_INFO (" bufsize %u", avih.bufsize); - GST_INFO (" width %u", avih.width); - GST_INFO (" height %u", avih.height); - GST_INFO (" scale %u", avih.scale); - GST_INFO (" rate %u", avih.rate); - GST_INFO (" start %u", avih.start); - GST_INFO (" length %u", avih.length); + GST_INFO (" tot_frames %u", avih.tot_frames); + GST_INFO (" init_frames %u", avih.init_frames); + GST_INFO (" streams %u", avih.streams); + GST_INFO (" bufsize %u", avih.bufsize); + GST_INFO (" width %u", avih.width); + GST_INFO (" height %u", avih.height); + GST_INFO (" scale %u", avih.scale); + GST_INFO (" rate %u", avih.rate); + GST_INFO (" start %u", avih.start); + GST_INFO (" length %u", avih.length); avi->num_frames = avih.tot_frames; avi->us_per_frame = avih.us_frame; @@ -771,7 +735,7 @@ gst_avi_demux_stream_avih (GstAviDemux *avi, */ static gboolean -gst_avi_demux_add_stream (GstAviDemux *avi) +gst_avi_demux_add_stream (GstAviDemux * avi) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (avi); GstRiffRead *riff = GST_RIFF_READ (avi); @@ -782,7 +746,8 @@ gst_avi_demux_add_stream (GstAviDemux *avi) GstPadTemplate *templ = NULL; GstPad *pad; avi_stream_context *stream; - union { + union + { gst_riff_strf_vids *vids; gst_riff_strf_auds *auds; gst_riff_strf_iavs *iavs; @@ -803,25 +768,25 @@ gst_avi_demux_add_stream (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_strf) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no strf as second tag)")); + ("Invalid AVI header (no strf as second tag)")); goto skip_stream; } switch (strh->type) { case GST_RIFF_FCC_vids: if (!gst_riff_read_strf_vids (riff, &strf.vids)) - return FALSE; + return FALSE; break; case GST_RIFF_FCC_auds: if (!gst_riff_read_strf_auds (riff, &strf.auds)) - return FALSE; + return FALSE; break; case GST_RIFF_FCC_iavs: if (!gst_riff_read_strf_iavs (riff, &strf.iavs)) - return FALSE; + return FALSE; break; default: g_warning ("Unknown stream type " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (strh->type)); + GST_FOURCC_ARGS (strh->type)); goto skip_stream; } @@ -836,22 +801,22 @@ gst_avi_demux_add_stream (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_strn: - if (name) - g_free (name); - if (!gst_riff_read_ascii (riff, &tag, &name)) - return FALSE; - break; + if (name) + g_free (name); + if (!gst_riff_read_ascii (riff, &tag, &name)) + return FALSE; + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ - case GST_RIFF_TAG_strd: /* what is this? */ + case GST_RIFF_TAG_strd: /* what is this? */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -866,15 +831,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_video_caps (strf.vids->compression, strh, - strf.vids, &codec_name); + strf.vids, &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.vids); avi->num_v_streams++; break; @@ -883,15 +850,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("audio_%02d", avi->num_a_streams); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_riff_create_audio_caps (strf.auds->format, strh, strf.auds, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.auds); avi->num_a_streams++; break; @@ -900,15 +869,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_iavs_caps (strh->fcc_handler, strh, strf.iavs, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.iavs); avi->num_v_streams++; break; @@ -918,7 +889,7 @@ gst_avi_demux_add_stream (GstAviDemux *avi) } /* set proper settings and add it */ - pad = gst_pad_new_from_template (templ, padname); + pad = gst_pad_new_from_template (templ, padname); g_free (padname); gst_pad_set_formats_function (pad, gst_avi_demux_get_src_formats); @@ -964,7 +935,7 @@ skip_stream: /* add a "NULL" stream */ avi->num_streams++; - return TRUE; /* recoverable */ + return TRUE; /* recoverable */ } /* @@ -972,7 +943,7 @@ skip_stream: */ static gboolean -gst_avi_demux_stream_odml (GstAviDemux *avi) +gst_avi_demux_stream_odml (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; @@ -987,38 +958,38 @@ gst_avi_demux_stream_odml (GstAviDemux *avi) } switch (tag) { - case GST_RIFF_TAG_dmlh: { - gst_riff_dmlh dmlh, *_dmlh; - GstBuffer *buf; - - if (!gst_riff_read_data (riff, &tag, &buf)) - return FALSE; - if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_dmlh)) { - g_warning ("DMLH entry is too small (%d bytes, %d needed)", - GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_dmlh)); - gst_buffer_unref (buf); - break; - } - _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (buf); - dmlh.totalframes = GUINT32_FROM_LE (_dmlh->totalframes); - - GST_INFO ("dmlh tag found:"); - GST_INFO (" totalframes: %u", dmlh.totalframes); - - avi->num_frames = dmlh.totalframes; - gst_buffer_unref (buf); - break; + case GST_RIFF_TAG_dmlh:{ + gst_riff_dmlh dmlh, *_dmlh; + GstBuffer *buf; + + if (!gst_riff_read_data (riff, &tag, &buf)) + return FALSE; + if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_dmlh)) { + g_warning ("DMLH entry is too small (%d bytes, %d needed)", + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_dmlh)); + gst_buffer_unref (buf); + break; + } + _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (buf); + dmlh.totalframes = GUINT32_FROM_LE (_dmlh->totalframes); + + GST_INFO ("dmlh tag found:"); + GST_INFO (" totalframes: %u", dmlh.totalframes); + + avi->num_frames = dmlh.totalframes; + gst_buffer_unref (buf); + break; } default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -1035,7 +1006,7 @@ gst_avi_demux_stream_odml (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_index (GstAviDemux *avi) +gst_avi_demux_stream_index (GstAviDemux * avi) { GstBuffer *buf = NULL; guint i; @@ -1065,7 +1036,7 @@ gst_avi_demux_stream_index (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_idx1) { g_warning ("No index after data, but " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (tag)); + GST_FOURCC_ARGS (tag)); goto end; } @@ -1075,7 +1046,8 @@ gst_avi_demux_stream_index (GstAviDemux *avi) /* parse all entries */ avi->index_size = GST_BUFFER_SIZE (buf) / sizeof (gst_riff_index_entry); - avi->index_entries = g_malloc (avi->index_size * sizeof (gst_avi_index_entry)); + avi->index_entries = + g_malloc (avi->index_size * sizeof (gst_avi_index_entry)); GST_INFO ("%u index entries", avi->index_size); for (i = 0; i < avi->index_size; i++) { @@ -1086,16 +1058,15 @@ gst_avi_demux_stream_index (GstAviDemux *avi) GstFormat format; _entry = &((gst_riff_index_entry *) GST_BUFFER_DATA (buf))[i]; - entry.id = GUINT32_FROM_LE (_entry->id); + entry.id = GUINT32_FROM_LE (_entry->id); entry.offset = GUINT32_FROM_LE (_entry->offset); - entry.flags = GUINT32_FROM_LE (_entry->flags); - entry.size = GUINT32_FROM_LE (_entry->size); + entry.flags = GUINT32_FROM_LE (_entry->flags); + entry.size = GUINT32_FROM_LE (_entry->size); target = &avi->index_entries[i]; stream_nr = CHUNKID_TO_STREAMNR (entry.id); if (stream_nr >= avi->num_streams || stream_nr < 0) { - g_warning ("Index entry %d has invalid stream nr %d", - i, stream_nr); + g_warning ("Index entry %d has invalid stream nr %d", i, stream_nr); target->stream_nr = -1; continue; } @@ -1103,9 +1074,9 @@ gst_avi_demux_stream_index (GstAviDemux *avi) stream = &avi->stream[stream_nr]; target->index_nr = i; - target->flags = entry.flags; - target->size = entry.size; - target->offset = entry.offset; + target->flags = entry.flags; + target->size = entry.size; + target->offset = entry.offset; /* figure out if the index is 0 based or relative to the MOVI start */ if (i == 0) { @@ -1123,15 +1094,15 @@ gst_avi_demux_stream_index (GstAviDemux *avi) /* all audio frames are keyframes */ target->flags |= GST_RIFF_IF_KEYFRAME; } - + if (stream->strh->samplesize && stream->strh->type == GST_RIFF_FCC_auds) { /* constant rate stream */ gst_pad_convert (stream->pad, GST_FORMAT_BYTES, - stream->total_bytes, &format, &target->ts); + stream->total_bytes, &format, &target->ts); } else { /* VBR stream */ gst_pad_convert (stream->pad, GST_FORMAT_DEFAULT, - stream->total_frames, &format, &target->ts); + stream->total_frames, &format, &target->ts); } stream->total_bytes += target->size; @@ -1143,8 +1114,8 @@ gst_avi_demux_stream_index (GstAviDemux *avi) avi_stream_context *stream; stream = &avi->stream[i]; - GST_DEBUG ("stream %u: %u frames, %" G_GINT64_FORMAT " bytes", - i, stream->total_frames, stream->total_bytes); + GST_DEBUG ("stream %u: %u frames, %" G_GINT64_FORMAT " bytes", + i, stream->total_frames, stream->total_bytes); } end: @@ -1164,7 +1135,7 @@ end: */ gboolean -gst_avi_demux_stream_scan (GstAviDemux *avi) +gst_avi_demux_stream_scan (GstAviDemux * avi) { //GstRiffRead *riff = GST_RIFF_READ (avi); @@ -1178,7 +1149,7 @@ gst_avi_demux_stream_scan (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_header (GstAviDemux *avi) +gst_avi_demux_stream_header (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag, flags, streams; @@ -1188,16 +1159,16 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_LIST) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no LIST at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no LIST at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } if (!gst_riff_read_list (riff, &tag)) return FALSE; if (tag != GST_RIFF_LIST_hdrl) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no hdrl at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no hdrl at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } @@ -1206,8 +1177,8 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_avih) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no avih at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no avih at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } if (!gst_avi_demux_stream_avih (avi, &flags, &streams)) @@ -1224,44 +1195,44 @@ gst_avi_demux_stream_header (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_LIST: - if (!(tag = gst_riff_peek_list (riff))) - return FALSE; - - switch (tag) { - case GST_RIFF_LIST_strl: - if (!gst_riff_read_list (riff, &tag) || - !gst_avi_demux_add_stream (avi)) - return FALSE; - break; - - case GST_RIFF_LIST_odml: - if (!gst_riff_read_list (riff, &tag) || - !gst_avi_demux_stream_odml (avi)) - return FALSE; - break; - - default: - GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ - - case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; - } - - break; + if (!(tag = gst_riff_peek_list (riff))) + return FALSE; + + switch (tag) { + case GST_RIFF_LIST_strl: + if (!gst_riff_read_list (riff, &tag) || + !gst_avi_demux_add_stream (avi)) + return FALSE; + break; + + case GST_RIFF_LIST_odml: + if (!gst_riff_read_list (riff, &tag) || + !gst_avi_demux_stream_odml (avi)) + return FALSE; + break; + + default: + GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + + case GST_RIFF_TAG_JUNK: + if (!gst_riff_read_skip (riff)) + return FALSE; + break; + } + + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -1272,11 +1243,11 @@ gst_avi_demux_stream_header (GstAviDemux *avi) if (avi->num_streams != streams) { g_warning ("Stream header mentioned %d streams, but %d available", - streams, avi->num_streams); + streams, avi->num_streams); } /* we've got streaminfo now */ - g_object_notify (G_OBJECT(avi), "streaminfo"); + g_object_notify (G_OBJECT (avi), "streaminfo"); /* Now, find the data (i.e. skip all junk between header and data) */ while (1) { @@ -1284,18 +1255,17 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_LIST) { if (!gst_riff_read_skip (riff)) - return FALSE; + return FALSE; continue; } if (!(tag = gst_riff_peek_list (riff))) return FALSE; if (tag != GST_RIFF_LIST_movi) { if (tag == GST_RIFF_LIST_INFO) { - if (!gst_riff_read_list (riff, &tag) || - !gst_riff_read_info (riff)) - return FALSE; - } else if (!gst_riff_read_skip (riff)) { - return FALSE; + if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff)) + return FALSE; + } else if (!gst_riff_read_skip (riff)) { + return FALSE; } continue; } @@ -1319,7 +1289,7 @@ gst_avi_demux_stream_header (GstAviDemux *avi) */ static gboolean -gst_avi_demux_handle_seek (GstAviDemux *avi) +gst_avi_demux_handle_seek (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint i; @@ -1336,8 +1306,8 @@ gst_avi_demux_handle_seek (GstAviDemux *avi) avi_stream_context *stream = &avi->stream[i]; if (GST_PAD_IS_USABLE (stream->pad)) { - event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - avi->last_seek + stream->delay , NULL); + event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, + avi->last_seek + stream->delay, NULL); gst_pad_push (stream->pad, GST_DATA (event)); } } @@ -1350,17 +1320,17 @@ gst_avi_demux_handle_seek (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_data (GstAviDemux *avi) +gst_avi_demux_stream_data (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; guint stream_nr; gst_avi_index_entry *entry; - if (avi->seek_offset != (guint64) -1) { + if (avi->seek_offset != (guint64) - 1) { if (!gst_avi_demux_handle_seek (avi)) return FALSE; - avi->seek_offset = (guint64) -1; + avi->seek_offset = (guint64) - 1; } /* peek first (for the end of this 'list/movi' section) */ @@ -1377,40 +1347,40 @@ gst_avi_demux_stream_data (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_LIST: - if (!(tag = gst_riff_peek_list (riff))) - return FALSE; - - switch (tag) { - case GST_RIFF_LIST_AVIX: - case GST_RIFF_LIST_movi: - if (!gst_riff_read_list (riff, &tag)) - return FALSE; - /* we're now going to read buffers! */ - break; - - default: - GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " before AVI data", - GST_FOURCC_ARGS (tag)); - /* fall-through */ - - case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; - } - - break; + if (!(tag = gst_riff_peek_list (riff))) + return FALSE; + + switch (tag) { + case GST_RIFF_LIST_AVIX: + case GST_RIFF_LIST_movi: + if (!gst_riff_read_list (riff, &tag)) + return FALSE; + /* we're now going to read buffers! */ + break; + + default: + GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " before AVI data", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + + case GST_RIFF_TAG_JUNK: + if (!gst_riff_read_skip (riff)) + return FALSE; + break; + } + + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " before AVI data", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " before AVI data", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_idx1: case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } } @@ -1421,7 +1391,7 @@ gst_avi_demux_stream_data (GstAviDemux *avi) if (stream_nr < 0 || stream_nr >= avi->num_streams) { /* recoverable */ g_warning ("Invalid stream ID %d (" GST_FOURCC_FORMAT ")", - stream_nr, GST_FOURCC_ARGS (tag)); + stream_nr, GST_FOURCC_ARGS (tag)); if (!gst_riff_read_skip (riff)) return FALSE; } else { @@ -1437,20 +1407,19 @@ gst_avi_demux_stream_data (GstAviDemux *avi) /* get time of this buffer */ stream = &avi->stream[stream_nr]; entry = gst_avi_demux_index_next (avi, stream_nr, - stream->current_entry + 1, 0); + stream->current_entry + 1, 0); if (entry) { stream->current_entry = entry->index_nr; if (entry->flags & GST_RIFF_IF_KEYFRAME) { - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_KEY_UNIT); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_KEY_UNIT); } } format = GST_FORMAT_TIME; - gst_pad_query (stream->pad, GST_QUERY_POSITION, - &format, &next_ts); + gst_pad_query (stream->pad, GST_QUERY_POSITION, &format, &next_ts); /* set delay (if any) */ if (stream->strh->init_frames == stream->current_frame && - stream->delay == 0) + stream->delay == 0) stream->delay = next_ts; stream->current_frame++; @@ -1462,16 +1431,15 @@ gst_avi_demux_stream_data (GstAviDemux *avi) gst_buffer_unref (buf); } else { if (!stream->pad || !GST_PAD_IS_USABLE (stream->pad)) { - gst_buffer_unref (buf); + gst_buffer_unref (buf); } else { - GstClockTime dur_ts; + GstClockTime dur_ts; - GST_BUFFER_TIMESTAMP (buf) = next_ts; - gst_pad_query (stream->pad, GST_QUERY_POSITION, - &format, &dur_ts); - GST_BUFFER_DURATION (buf) = dur_ts - next_ts; + GST_BUFFER_TIMESTAMP (buf) = next_ts; + gst_pad_query (stream->pad, GST_QUERY_POSITION, &format, &dur_ts); + GST_BUFFER_DURATION (buf) = dur_ts - next_ts; - gst_pad_push (stream->pad, GST_DATA (buf)); + gst_pad_push (stream->pad, GST_DATA (buf)); } } } @@ -1480,26 +1448,26 @@ gst_avi_demux_stream_data (GstAviDemux *avi) } static void -gst_avi_demux_loop (GstElement *element) +gst_avi_demux_loop (GstElement * element) { GstAviDemux *avi = GST_AVI_DEMUX (element); switch (avi->state) { case GST_AVI_DEMUX_START: if (!gst_avi_demux_stream_init (avi)) - return; + return; avi->state = GST_AVI_DEMUX_HEADER; /* fall-through */ case GST_AVI_DEMUX_HEADER: if (!gst_avi_demux_stream_header (avi)) - return; + return; avi->state = GST_AVI_DEMUX_MOVI; /* fall-through */ case GST_AVI_DEMUX_MOVI: if (!gst_avi_demux_stream_data (avi)) - return; + return; break; default: @@ -1508,7 +1476,7 @@ gst_avi_demux_loop (GstElement *element) } static GstElementStateReturn -gst_avi_demux_change_state (GstElement *element) +gst_avi_demux_change_state (GstElement * element) { GstAviDemux *avi = GST_AVI_DEMUX (element); @@ -1530,10 +1498,8 @@ gst_avi_demux_change_state (GstElement *element) } static void -gst_avi_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_avi_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstAviDemux *avi = GST_AVI_DEMUX (object); diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h index d94433ae..9849bdaf 100644 --- a/gst/avi/gstavidemux.h +++ b/gst/avi/gstavidemux.h @@ -26,7 +26,6 @@ #include "gst/riff/riff-read.h" G_BEGIN_DECLS - #define GST_TYPE_AVI_DEMUX \ (gst_avi_demux_get_type ()) #define GST_AVI_DEMUX(obj) \ @@ -37,93 +36,94 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX)) #define GST_IS_AVI_DEMUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX)) - -#define GST_AVI_DEMUX_MAX_STREAMS 16 - +#define GST_AVI_DEMUX_MAX_STREAMS 16 #define CHUNKID_TO_STREAMNR(chunkid) \ ((((chunkid) & 0xff) - '0') * 10 + \ (((chunkid) >> 8) & 0xff) - '0') - -typedef struct { - gint index_nr; - gint stream_nr; - guint64 ts; - guint32 flags; - guint32 offset; - gint size; - guint64 bytes_before; - guint32 frames_before; + typedef struct +{ + gint index_nr; + gint stream_nr; + guint64 ts; + guint32 flags; + guint32 offset; + gint size; + guint64 bytes_before; + guint32 frames_before; } gst_avi_index_entry; -typedef struct { +typedef struct +{ /* index of this streamcontext */ - guint num; + guint num; /* pad, strh */ - GstPad *pad; - GstCaps *caps; - gst_riff_strh *strh; + GstPad *pad; + GstCaps *caps; + gst_riff_strh *strh; /* current position (byte, frame, time) */ - guint current_frame; - guint64 current_byte; - gint current_entry; + guint current_frame; + guint64 current_byte; + gint current_entry; /* delay in time (init_frames) */ - guint64 delay; + guint64 delay; /* stream length */ - guint64 total_bytes; - guint32 total_frames; + guint64 total_bytes; + guint32 total_frames; - guint32 skip; + guint32 skip; } avi_stream_context; -typedef enum { +typedef enum +{ GST_AVI_DEMUX_START, GST_AVI_DEMUX_HEADER, GST_AVI_DEMUX_MOVI, } GstAviDemuxState; -typedef struct _GstAviDemux { - GstRiffRead parent; +typedef struct _GstAviDemux +{ + GstRiffRead parent; /* pads */ - GstPad *sinkpad; + GstPad *sinkpad; /* AVI decoding state */ GstAviDemuxState state; - guint level_up; + guint level_up; /* index */ gst_avi_index_entry *index_entries; - guint index_size; - guint64 index_offset; + guint index_size; + guint64 index_offset; /* streams */ - guint num_streams; - guint num_v_streams; - guint num_a_streams; + guint num_streams; + guint num_v_streams; + guint num_a_streams; avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS]; /* some stream info for length */ - guint32 us_per_frame; - guint32 num_frames; + guint32 us_per_frame; + guint32 num_frames; /* seeking */ - guint64 seek_offset; - guint64 last_seek; + guint64 seek_offset; + guint64 last_seek; /* info */ - GstCaps *streaminfo; + GstCaps *streaminfo; } GstAviDemux; -typedef struct _GstAviDemuxClass { +typedef struct _GstAviDemuxClass +{ GstRiffReadClass parent_class; } GstAviDemuxClass; -GType gst_avi_demux_get_type (void); +GType gst_avi_demux_get_type (void); G_END_DECLS - #endif /* __GST_AVI_DEMUX_H__ */ diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c index a064378f..f5287db0 100644 --- a/gst/avi/gstavimux.c +++ b/gst/avi/gstavimux.c @@ -45,138 +45,126 @@ #endif /* AviMux signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BIGFILE, }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-msvideo") -); - +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); + static GstStaticPadTemplate video_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "video_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "video/x-raw-yuv, " - "format = (fourcc) { YUY2, I420 }, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-jpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-divx, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "divxversion = (int) [ 3, 5 ]; " - "video/x-xvid, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-3ivx, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-msmpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "msmpegversion = (int) [ 41, 43 ]; " - "video/mpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "mpegversion = (int) 1, " - "systemstream = (boolean) FALSE; " - "video/x-h263, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-dv, " - "width = (int) 720, " - "height = (int) { 576, 480 }, " - "systemstream = (boolean) FALSE; " - "video/x-huffyuv, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]" - ) -); - + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420 }, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-jpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-divx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "divxversion = (int) [ 3, 5 ]; " + "video/x-xvid, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-3ivx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-msmpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "msmpegversion = (int) [ 41, 43 ]; " + "video/mpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "mpegversion = (int) 1, " + "systemstream = (boolean) FALSE; " + "video/x-h263, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-dv, " + "width = (int) 720, " + "height = (int) { 576, 480 }, " + "systemstream = (boolean) FALSE; " + "video/x-huffyuv, " + "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ]") + ); + static GstStaticPadTemplate audio_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "audio_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "audio/x-raw-int, " - "endianness = (int) LITTLE_ENDIAN, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-vorbis, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-ac3, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]" - ) -); - - -static void gst_avimux_base_init (gpointer g_class); -static void gst_avimux_class_init (GstAviMuxClass *klass); -static void gst_avimux_init (GstAviMux *avimux); - -static void gst_avimux_loop (GstElement *element); -static gboolean gst_avimux_handle_event (GstPad *pad, - GstEvent *event); -static GstPad* gst_avimux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *name); -static void gst_avimux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_avimux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static GstElementStateReturn gst_avimux_change_state (GstElement *element); + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) LITTLE_ENDIAN, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-vorbis, " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-ac3, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]") + ); + + +static void gst_avimux_base_init (gpointer g_class); +static void gst_avimux_class_init (GstAviMuxClass * klass); +static void gst_avimux_init (GstAviMux * avimux); + +static void gst_avimux_loop (GstElement * element); +static gboolean gst_avimux_handle_event (GstPad * pad, GstEvent * event); +static GstPad *gst_avimux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_avimux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_avimux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_avimux_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_avimux_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avimux_get_type (void) +gst_avimux_get_type (void) { static GType avimux_type = 0; if (!avimux_type) { static const GTypeInfo avimux_info = { - sizeof(GstAviMuxClass), + sizeof (GstAviMuxClass), gst_avimux_base_init, NULL, - (GClassInitFunc)gst_avimux_class_init, + (GClassInitFunc) gst_avimux_class_init, NULL, NULL, - sizeof(GstAviMux), + sizeof (GstAviMux), 0, - (GInstanceInitFunc)gst_avimux_init, + (GInstanceInitFunc) gst_avimux_init, }; - avimux_type = g_type_register_static(GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); + avimux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); } return avimux_type; } @@ -185,12 +173,11 @@ static void gst_avimux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - static GstElementDetails gst_avimux_details = GST_ELEMENT_DETAILS ( - "Avi multiplexer", - "Codec/Muxer", - "Muxes audio and video into an avi stream", - "Ronald Bultje " - ); + static GstElementDetails gst_avimux_details = + GST_ELEMENT_DETAILS ("Avi multiplexer", + "Codec/Muxer", + "Muxes audio and video into an avi stream", + "Ronald Bultje "); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); @@ -203,20 +190,19 @@ gst_avimux_base_init (gpointer g_class) } static void -gst_avimux_class_init (GstAviMuxClass *klass) +gst_avimux_class_init (GstAviMuxClass * 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); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BIGFILE, - g_param_spec_boolean("bigfile","Bigfile Support", - "Support for openDML-2.0 (big) AVI files", - 0,G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BIGFILE, + g_param_spec_boolean ("bigfile", "Bigfile Support", + "Support for openDML-2.0 (big) AVI files", 0, G_PARAM_READWRITE)); gstelement_class->request_new_pad = gst_avimux_request_new_pad; @@ -227,26 +213,27 @@ gst_avimux_class_init (GstAviMuxClass *klass) } static const GstEventMask * -gst_avimux_get_event_masks (GstPad *pad) +gst_avimux_get_event_masks (GstPad * pad) { static const GstEventMask gst_avimux_sink_event_masks[] = { - { GST_EVENT_EOS, 0 }, - { 0, } + {GST_EVENT_EOS, 0}, + {0,} }; return gst_avimux_sink_event_masks; } -static void -gst_avimux_init (GstAviMux *avimux) +static void +gst_avimux_init (GstAviMux * avimux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (avimux); - avimux->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "src"), "src"); + avimux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); gst_element_add_pad (GST_ELEMENT (avimux), avimux->srcpad); - GST_FLAG_SET (GST_ELEMENT(avimux), GST_ELEMENT_EVENT_AWARE); + GST_FLAG_SET (GST_ELEMENT (avimux), GST_ELEMENT_EVENT_AWARE); avimux->audiosinkpad = NULL; avimux->audio_pad_connected = FALSE; @@ -259,15 +246,15 @@ gst_avimux_init (GstAviMux *avimux) avimux->num_frames = 0; /* audio/video/AVI header initialisation */ - memset(&(avimux->avi_hdr),0,sizeof(gst_riff_avih)); - memset(&(avimux->vids_hdr),0,sizeof(gst_riff_strh)); - memset(&(avimux->vids),0,sizeof(gst_riff_strf_vids)); - memset(&(avimux->auds_hdr),0,sizeof(gst_riff_strh)); - memset(&(avimux->auds),0,sizeof(gst_riff_strf_auds)); - avimux->vids_hdr.type = GST_MAKE_FOURCC('v','i','d','s'); + memset (&(avimux->avi_hdr), 0, sizeof (gst_riff_avih)); + memset (&(avimux->vids_hdr), 0, sizeof (gst_riff_strh)); + memset (&(avimux->vids), 0, sizeof (gst_riff_strf_vids)); + memset (&(avimux->auds_hdr), 0, sizeof (gst_riff_strh)); + memset (&(avimux->auds), 0, sizeof (gst_riff_strf_auds)); + avimux->vids_hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); avimux->vids_hdr.rate = 1000000; avimux->avi_hdr.max_bps = 10000000; - avimux->auds_hdr.type = GST_MAKE_FOURCC('a','u','d','s'); + avimux->auds_hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); avimux->vids_hdr.quality = 0xFFFFFFFF; avimux->auds_hdr.quality = 0xFFFFFFFF; @@ -277,33 +264,34 @@ gst_avimux_init (GstAviMux *avimux) avimux->enable_large_avi = TRUE; - gst_element_set_loop_function(GST_ELEMENT(avimux), gst_avimux_loop); + gst_element_set_loop_function (GST_ELEMENT (avimux), gst_avimux_loop); } static GstPadLinkReturn -gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) +gst_avimux_vidsinkconnect (GstPad * pad, const GstCaps * vscaps) { GstAviMux *avimux; GstStructure *structure; - const gchar* mimetype; + const gchar *mimetype; gdouble fps = 0.; gboolean ret; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); GST_DEBUG ("avimux: video sinkconnect triggered on %s", - gst_pad_get_name (pad)); + gst_pad_get_name (pad)); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); /* global */ - avimux->vids.size = sizeof(gst_riff_strf_vids); - avimux->vids.planes = 1; + avimux->vids.size = sizeof (gst_riff_strf_vids); + avimux->vids.planes = 1; ret = gst_structure_get_int (structure, "width", &avimux->vids.width); ret &= gst_structure_get_int (structure, "height", &avimux->vids.height); ret &= gst_structure_get_double (structure, "framerate", &fps); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; if (fps != 0.) avimux->vids_hdr.scale = avimux->vids_hdr.rate / fps; @@ -313,13 +301,12 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) gst_structure_get_fourcc (structure, "format", &format); avimux->vids.compression = format; - switch (format) - { - case GST_MAKE_FOURCC('Y','U','Y','2'): - avimux->vids.bit_cnt = 16; + switch (format) { + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + avimux->vids.bit_cnt = 16; break; - case GST_MAKE_FOURCC('I','4','2','0'): - avimux->vids.bit_cnt = 12; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + avimux->vids.bit_cnt = 12; break; } } else { @@ -328,47 +315,49 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) /* find format */ if (!strcmp (mimetype, "video/x-huffyuv")) { - avimux->vids.compression = GST_MAKE_FOURCC('H','F','Y','U'); + avimux->vids.compression = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); } else if (!strcmp (mimetype, "video/x-jpeg")) { - avimux->vids.compression = GST_MAKE_FOURCC('M','J','P','G'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); } else if (!strcmp (mimetype, "video/x-divx")) { gint divxversion; + gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: - avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); break; case 4: - avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','X'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); break; case 5: - avimux->vids.compression = GST_MAKE_FOURCC('D','X','5','0'); - break; + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'X', '5', '0'); + break; } } else if (!strcmp (mimetype, "video/x-xvid")) { - avimux->vids.compression = GST_MAKE_FOURCC('X','V','I','D'); + avimux->vids.compression = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); } else if (!strcmp (mimetype, "video/x-3ivx")) { - avimux->vids.compression = GST_MAKE_FOURCC('3','I','V','2'); + avimux->vids.compression = GST_MAKE_FOURCC ('3', 'I', 'V', '2'); } else if (!strcmp (mimetype, "video/x-msmpeg")) { gint msmpegversion; + gst_structure_get_int (structure, "msmpegversion", &msmpegversion); switch (msmpegversion) { case 41: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','G','4'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); break; case 42: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','2'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '2'); break; case 43: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '3'); break; } } else if (!strcmp (mimetype, "video/x-dv")) { - avimux->vids.compression = GST_MAKE_FOURCC('D','V','S','D'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); } else if (!strcmp (mimetype, "video/x-h263")) { - avimux->vids.compression = GST_MAKE_FOURCC('H','2','6','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '3'); } else if (!strcmp (mimetype, "video/mpeg")) { - avimux->vids.compression = GST_MAKE_FOURCC('M','P','E','G'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); } if (!avimux->vids.compression) { @@ -385,17 +374,17 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) } static GstPadLinkReturn -gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) +gst_avimux_audsinkconnect (GstPad * pad, const GstCaps * vscaps) { GstAviMux *avimux; GstStructure *structure; - const gchar* mimetype; + const gchar *mimetype; int i; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); GST_DEBUG ("avimux: audio sinkconnect triggered on %s", - gst_pad_get_name (pad)); + gst_pad_get_name (pad)); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); @@ -407,7 +396,7 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) avimux->auds.rate = i; if (!strcmp (mimetype, "audio/x-raw-int")) { - avimux->auds.format = GST_RIFF_WAVE_FORMAT_PCM; + avimux->auds.format = GST_RIFF_WAVE_FORMAT_PCM; gst_structure_get_int (structure, "width", &i); avimux->auds.blockalign = i; @@ -419,18 +408,20 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) avimux->auds.blockalign *= avimux->auds.channels; avimux->auds.av_bps = avimux->auds.blockalign * avimux->auds.rate; } else if (!strcmp (mimetype, "audio/mpeg") || - !strcmp (mimetype, "audio/x-vorbis") || - !strcmp (mimetype, "audio/x-ac3")) { + !strcmp (mimetype, "audio/x-vorbis") || + !strcmp (mimetype, "audio/x-ac3")) { avimux->auds.format = 0; if (!strcmp (mimetype, "audio/mpeg")) { gint layer = 3; + gst_structure_get_int (structure, "layer", &layer); switch (layer) { case 3: avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL3; break; - case 1: case 2: + case 1: + case 2: avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL12; break; } @@ -449,31 +440,24 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) } } - avimux->auds_hdr.rate = avimux->auds.blockalign * avimux->auds.rate; + avimux->auds_hdr.rate = avimux->auds.blockalign * avimux->auds.rate; avimux->auds_hdr.samplesize = avimux->auds.blockalign; avimux->auds_hdr.scale = avimux->auds.blockalign; return GST_PAD_LINK_OK; } static void -gst_avimux_pad_link (GstPad *pad, - GstPad *peer, - gpointer data) +gst_avimux_pad_link (GstPad * pad, GstPad * peer, gpointer data) { - GstAviMux *avimux = GST_AVIMUX(data); + GstAviMux *avimux = GST_AVIMUX (data); const gchar *padname = gst_pad_get_name (pad); - if (pad == avimux->audiosinkpad) - { + if (pad == avimux->audiosinkpad) { avimux->audio_pad_connected = TRUE; - } - else if (pad == avimux->videosinkpad) - { + } else if (pad == avimux->videosinkpad) { avimux->video_pad_connected = TRUE; - } - else - { - g_warning("Unknown padname '%s'", padname); + } else { + g_warning ("Unknown padname '%s'", padname); return; } @@ -481,36 +465,28 @@ gst_avimux_pad_link (GstPad *pad, } static void -gst_avimux_pad_unlink (GstPad *pad, - GstPad *peer, - gpointer data) +gst_avimux_pad_unlink (GstPad * pad, GstPad * peer, gpointer data) { - GstAviMux *avimux = GST_AVIMUX(data); + GstAviMux *avimux = GST_AVIMUX (data); const gchar *padname = gst_pad_get_name (pad); - if (pad == avimux->audiosinkpad) - { + if (pad == avimux->audiosinkpad) { avimux->audio_pad_connected = FALSE; avimux->audiosinkpad = NULL; - } - else if (pad == avimux->videosinkpad) - { + } else if (pad == avimux->videosinkpad) { avimux->video_pad_connected = FALSE; avimux->videosinkpad = NULL; - } - else - { - g_warning("Unknown padname '%s'", padname); + } else { + g_warning ("Unknown padname '%s'", padname); return; } GST_DEBUG ("pad '%s' unlinked", padname); } -static GstPad* -gst_avimux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *req_name) +static GstPad * +gst_avimux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) { GstAviMux *avimux; GstPad *newpad; @@ -528,29 +504,27 @@ gst_avimux_request_new_pad (GstElement *element, avimux = GST_AVIMUX (element); if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { - g_return_val_if_fail(avimux->audiosinkpad == NULL, NULL); + g_return_val_if_fail (avimux->audiosinkpad == NULL, NULL); newpad = gst_pad_new_from_template (templ, "audio_00"); gst_pad_set_link_function (newpad, gst_avimux_audsinkconnect); avimux->audiosinkpad = newpad; - } - else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { - g_return_val_if_fail(avimux->videosinkpad == NULL, NULL); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + g_return_val_if_fail (avimux->videosinkpad == NULL, NULL); newpad = gst_pad_new_from_template (templ, "video_00"); gst_pad_set_link_function (newpad, gst_avimux_vidsinkconnect); avimux->videosinkpad = newpad; - } - else { + } else { g_warning ("avimux: this is not our template!\n"); return NULL; } - g_signal_connect(newpad, "linked", - G_CALLBACK(gst_avimux_pad_link), (gpointer)avimux); - g_signal_connect(newpad, "unlinked", - G_CALLBACK(gst_avimux_pad_unlink), (gpointer)avimux); + g_signal_connect (newpad, "linked", + G_CALLBACK (gst_avimux_pad_link), (gpointer) avimux); + g_signal_connect (newpad, "unlinked", + G_CALLBACK (gst_avimux_pad_unlink), (gpointer) avimux); gst_element_add_pad (element, newpad); - gst_pad_set_event_mask_function(newpad, gst_avimux_get_event_masks); - + gst_pad_set_event_mask_function (newpad, gst_avimux_get_event_masks); + return newpad; } @@ -559,215 +533,301 @@ gst_avimux_request_new_pad (GstElement *element, /* DISCLAIMER: this function is ugly. So be it (i.e. it makes the rest easier) */ static GstBuffer * -gst_avimux_riff_get_avi_header (GstAviMux *avimux) +gst_avimux_riff_get_avi_header (GstAviMux * avimux) { GstBuffer *buffer; guint8 *buffdata; guint16 temp16; guint32 temp32; - buffer = gst_buffer_new(); + buffer = gst_buffer_new (); /* first, let's see what actually needs to be in the buffer */ - GST_BUFFER_SIZE(buffer) = 0; - GST_BUFFER_SIZE(buffer) += 32 + sizeof(gst_riff_avih); /* avi header */ - if (avimux->video_pad_connected) - { /* we have video */ - GST_BUFFER_SIZE(buffer) += 28 + sizeof(gst_riff_strh) + sizeof(gst_riff_strf_vids); /* vid hdr */ - GST_BUFFER_SIZE(buffer) += 24; /* odml header */ + GST_BUFFER_SIZE (buffer) = 0; + GST_BUFFER_SIZE (buffer) += 32 + sizeof (gst_riff_avih); /* avi header */ + if (avimux->video_pad_connected) { /* we have video */ + GST_BUFFER_SIZE (buffer) += 28 + sizeof (gst_riff_strh) + sizeof (gst_riff_strf_vids); /* vid hdr */ + GST_BUFFER_SIZE (buffer) += 24; /* odml header */ } - if (avimux->audio_pad_connected) - { /* we have audio */ - GST_BUFFER_SIZE(buffer) += 28 + sizeof(gst_riff_strh) + sizeof(gst_riff_strf_auds); /* aud hdr */ + if (avimux->audio_pad_connected) { /* we have audio */ + GST_BUFFER_SIZE (buffer) += 28 + sizeof (gst_riff_strh) + sizeof (gst_riff_strf_auds); /* aud hdr */ } /* this is the "riff size" */ - avimux->header_size = GST_BUFFER_SIZE(buffer); - GST_BUFFER_SIZE(buffer) += 12; /* avi data header */ + avimux->header_size = GST_BUFFER_SIZE (buffer); + GST_BUFFER_SIZE (buffer) += 12; /* avi data header */ /* allocate the buffer */ - buffdata = GST_BUFFER_DATA(buffer) = g_malloc(GST_BUFFER_SIZE(buffer)); + buffdata = GST_BUFFER_DATA (buffer) = g_malloc (GST_BUFFER_SIZE (buffer)); /* avi header metadata */ - memcpy(buffdata, "RIFF", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->header_size + avimux->idx_size + avimux->data_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "AVI ", 4); buffdata += 4; - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->header_size - 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "hdrl", 4); buffdata += 4; - memcpy(buffdata, "avih", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_avih)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "RIFF", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (avimux->header_size + avimux->idx_size + + avimux->data_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "AVI ", 4); + buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->header_size - 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "hdrl", 4); + buffdata += 4; + memcpy (buffdata, "avih", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_avih)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the AVI header itself */ - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.us_frame); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.max_bps); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.pad_gran); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.tot_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.streams); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.width); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.height); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - - if (avimux->video_pad_connected) - { + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.us_frame); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.max_bps); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.pad_gran); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.tot_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.streams); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.width); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.height); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + + if (avimux->video_pad_connected) { /* video header metadata */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh) + sizeof(gst_riff_strf_vids) + 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "strl", 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (sizeof (gst_riff_strh) + sizeof (gst_riff_strf_vids) + + 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "strl", 4); + buffdata += 4; /* generic header */ - memcpy(buffdata, "strh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strh)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.type); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.fcc_handler); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.priority); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.quality); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.samplesize); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.type); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.fcc_handler); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.priority); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.quality); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.samplesize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the video header */ - memcpy(buffdata, "strf", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strf_vids)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strf", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strf_vids)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->vids.size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.width); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.height); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp16 = LE_FROM_GUINT16(avimux->vids.planes); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->vids.bit_cnt); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp32 = LE_FROM_GUINT32(avimux->vids.compression); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.image_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.xpels_meter); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.ypels_meter); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.num_colors); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.imp_colors); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.width); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.height); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp16 = LE_FROM_GUINT16 (avimux->vids.planes); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->vids.bit_cnt); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp32 = LE_FROM_GUINT32 (avimux->vids.compression); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.image_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.xpels_meter); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.ypels_meter); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.num_colors); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.imp_colors); + memcpy (buffdata, &temp32, 4); + buffdata += 4; } - if (avimux->audio_pad_connected) - { + if (avimux->audio_pad_connected) { /* audio header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh) + sizeof(gst_riff_strf_auds) + 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "strl", 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (sizeof (gst_riff_strh) + sizeof (gst_riff_strf_auds) + + 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "strl", 4); + buffdata += 4; /* generic header */ - memcpy(buffdata, "strh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strh)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.type); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.fcc_handler); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.priority); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.quality); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.samplesize); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.type); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.fcc_handler); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.priority); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.quality); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.samplesize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the audio header */ - memcpy(buffdata, "strf", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strf_auds)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strf", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strf_auds)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp16 = LE_FROM_GUINT16(avimux->auds.format); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->auds.channels); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp32 = LE_FROM_GUINT32(avimux->auds.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds.av_bps); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp16 = LE_FROM_GUINT16(avimux->auds.blockalign); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->auds.size); - memcpy(buffdata, &temp16, 2); buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.format); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.channels); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp32 = LE_FROM_GUINT32 (avimux->auds.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds.av_bps); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp16 = LE_FROM_GUINT16 (avimux->auds.blockalign); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.size); + memcpy (buffdata, &temp16, 2); + buffdata += 2; } - if (avimux->video_pad_connected) - { + if (avimux->video_pad_connected) { /* odml header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(guint32)+4*3); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "odml", 4); buffdata += 4; - memcpy(buffdata, "dmlh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(guint32)); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->total_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (guint32) + 4 * 3); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "odml", 4); + buffdata += 4; + memcpy (buffdata, "dmlh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (guint32)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->total_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; } /* avi data header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->data_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "movi", 4); + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->data_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "movi", 4); return buffer; } @@ -779,18 +839,23 @@ gst_avimux_riff_get_avix_header (guint32 datax_size) guint8 *buffdata; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = 24; - buffdata = GST_BUFFER_DATA(buffer) = g_malloc(GST_BUFFER_SIZE(buffer)); - - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(datax_size+4*4); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "AVIX", 4); buffdata += 4; - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(datax_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "movi", 4); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = 24; + buffdata = GST_BUFFER_DATA (buffer) = g_malloc (GST_BUFFER_SIZE (buffer)); + + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (datax_size + 4 * 4); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "AVIX", 4); + buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (datax_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "movi", 4); return buffer; } @@ -801,12 +866,12 @@ gst_avimux_riff_get_video_header (guint32 video_frame_size) GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_DATA(buffer) = g_malloc(8); - GST_BUFFER_SIZE(buffer) = 8; - memcpy(GST_BUFFER_DATA(buffer), "00db", 4); - temp32 = LE_FROM_GUINT32(video_frame_size); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); + buffer = gst_buffer_new (); + GST_BUFFER_DATA (buffer) = g_malloc (8); + GST_BUFFER_SIZE (buffer) = 8; + memcpy (GST_BUFFER_DATA (buffer), "00db", 4); + temp32 = LE_FROM_GUINT32 (video_frame_size); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); return buffer; } @@ -817,12 +882,12 @@ gst_avimux_riff_get_audio_header (guint32 audio_sample_size) GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_DATA(buffer) = g_malloc(8); - GST_BUFFER_SIZE(buffer) = 8; - memcpy(GST_BUFFER_DATA(buffer), "01wb", 4); - temp32 = LE_FROM_GUINT32(audio_sample_size); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); + buffer = gst_buffer_new (); + GST_BUFFER_DATA (buffer) = g_malloc (8); + GST_BUFFER_SIZE (buffer) = 8; + memcpy (GST_BUFFER_DATA (buffer), "01wb", 4); + temp32 = LE_FROM_GUINT32 (audio_sample_size); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); return buffer; } @@ -830,73 +895,70 @@ gst_avimux_riff_get_audio_header (guint32 audio_sample_size) /* some other usable functions (thankyou xawtv ;-) ) */ static void -gst_avimux_add_index (GstAviMux *avimux, guchar *code, guint32 flags, guint32 size) +gst_avimux_add_index (GstAviMux * avimux, guchar * code, guint32 flags, + guint32 size) { - if (avimux->idx_index == avimux->idx_count) - { + if (avimux->idx_index == avimux->idx_count) { avimux->idx_count += 256; - avimux->idx = realloc(avimux->idx, avimux->idx_count*sizeof(gst_riff_index_entry)); + avimux->idx = + realloc (avimux->idx, + avimux->idx_count * sizeof (gst_riff_index_entry)); } - memcpy(&(avimux->idx[avimux->idx_index].id), code, 4); - avimux->idx[avimux->idx_index].flags = LE_FROM_GUINT32(flags); - avimux->idx[avimux->idx_index].offset = LE_FROM_GUINT32(avimux->idx_offset); - avimux->idx[avimux->idx_index].size = LE_FROM_GUINT32(size); + memcpy (&(avimux->idx[avimux->idx_index].id), code, 4); + avimux->idx[avimux->idx_index].flags = LE_FROM_GUINT32 (flags); + avimux->idx[avimux->idx_index].offset = LE_FROM_GUINT32 (avimux->idx_offset); + avimux->idx[avimux->idx_index].size = LE_FROM_GUINT32 (size); avimux->idx_index++; } static void -gst_avimux_write_index (GstAviMux *avimux) +gst_avimux_write_index (GstAviMux * avimux) { GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = 8; - GST_BUFFER_DATA(buffer) = g_malloc(8); - memcpy(GST_BUFFER_DATA(buffer), "idx1", 4); - temp32 = LE_FROM_GUINT32(avimux->idx_index * sizeof(gst_riff_index_entry)); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = 8; + GST_BUFFER_DATA (buffer) = g_malloc (8); + memcpy (GST_BUFFER_DATA (buffer), "idx1", 4); + temp32 = LE_FROM_GUINT32 (avimux->idx_index * sizeof (gst_riff_index_entry)); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = avimux->idx_index * sizeof(gst_riff_index_entry); - GST_BUFFER_DATA(buffer) = (unsigned char*) avimux->idx; - avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ - avimux->total_data += GST_BUFFER_SIZE(buffer); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = avimux->idx_index * sizeof (gst_riff_index_entry); + GST_BUFFER_DATA (buffer) = (unsigned char *) avimux->idx; + avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ + avimux->total_data += GST_BUFFER_SIZE (buffer); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); - avimux->idx_size += avimux->idx_index * sizeof(gst_riff_index_entry) + 8; + avimux->idx_size += avimux->idx_index * sizeof (gst_riff_index_entry) + 8; /* update header */ avimux->avi_hdr.flags |= GST_RIFF_AVIH_HASINDEX; } static void -gst_avimux_bigfile(GstAviMux *avimux, gboolean last) +gst_avimux_bigfile (GstAviMux * avimux, gboolean last) { GstBuffer *header; GstEvent *event; - - if (avimux->is_bigfile) - { + + if (avimux->is_bigfile) { /* sarch back */ - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - avimux->avix_start); + event = gst_event_new_seek (GST_FORMAT_BYTES | + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, avimux->avix_start); /* if the event succeeds */ - gst_pad_push(avimux->srcpad, GST_DATA(event)); + gst_pad_push (avimux->srcpad, GST_DATA (event)); /* rewrite AVIX header */ - header = gst_avimux_riff_get_avix_header(avimux->datax_size); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avix_header (avimux->datax_size); + gst_pad_push (avimux->srcpad, GST_DATA (header)); /* go back to current location */ - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - avimux->total_data); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + event = gst_event_new_seek (GST_FORMAT_BYTES | + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, avimux->total_data); + gst_pad_push (avimux->srcpad, GST_DATA (event)); } avimux->avix_start = avimux->total_data; @@ -907,21 +969,21 @@ gst_avimux_bigfile(GstAviMux *avimux, gboolean last) avimux->numx_frames = 0; avimux->datax_size = 0; - header = gst_avimux_riff_get_avix_header(0); - avimux->total_data += GST_BUFFER_SIZE(header); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avix_header (0); + avimux->total_data += GST_BUFFER_SIZE (header); + gst_pad_push (avimux->srcpad, GST_DATA (header)); } /* enough header blabla now, let's go on to actually writing the headers */ static void -gst_avimux_start_file (GstAviMux *avimux) +gst_avimux_start_file (GstAviMux * avimux) { GstBuffer *header; avimux->total_data = 0; avimux->total_frames = 0; - avimux->data_size = 4; /* ? */ + avimux->data_size = 4; /* ? */ avimux->datax_size = 0; avimux->num_frames = 0; avimux->numx_frames = 0; @@ -930,41 +992,39 @@ gst_avimux_start_file (GstAviMux *avimux) avimux->avix_start = 0; avimux->idx_index = 0; - avimux->idx_offset = 0; /* see 10 lines below */ + avimux->idx_offset = 0; /* see 10 lines below */ avimux->idx_size = 0; avimux->idx_count = 0; avimux->idx = NULL; /* header */ - avimux->avi_hdr.streams = (avimux->video_pad_connected?1:0) + (avimux->audio_pad_connected?1:0); + avimux->avi_hdr.streams = + (avimux->video_pad_connected ? 1 : 0) + + (avimux->audio_pad_connected ? 1 : 0); avimux->is_bigfile = FALSE; - header = gst_avimux_riff_get_avi_header(avimux); - avimux->total_data += GST_BUFFER_SIZE(header); + header = gst_avimux_riff_get_avi_header (avimux); + avimux->total_data += GST_BUFFER_SIZE (header); avimux->idx_offset = avimux->total_data; - gst_pad_push(avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); avimux->write_header = FALSE; avimux->restart = FALSE; } static void -gst_avimux_stop_file (GstAviMux *avimux) +gst_avimux_stop_file (GstAviMux * avimux) { GstEvent *event; GstBuffer *header; /* if bigfile, rewrite header, else write indexes */ - if (avimux->video_pad_connected) - { - if (avimux->is_bigfile) - { - gst_avimux_bigfile(avimux, TRUE); + if (avimux->video_pad_connected) { + if (avimux->is_bigfile) { + gst_avimux_bigfile (avimux, TRUE); avimux->idx_size = 0; - } - else - { - gst_avimux_write_index(avimux); + } else { + gst_avimux_write_index (avimux); } } @@ -974,7 +1034,8 @@ gst_avimux_stop_file (GstAviMux *avimux) avimux->vids_hdr.length = avimux->num_frames; } if (avimux->audio_pad_connected) { - avimux->auds_hdr.length = (avimux->audio_time * avimux->auds.rate)/GST_SECOND; + avimux->auds_hdr.length = + (avimux->audio_time * avimux->auds.rate) / GST_SECOND; } /* set rate and everything having to do with that */ @@ -983,68 +1044,68 @@ gst_avimux_stop_file (GstAviMux *avimux) /* calculate bps if needed */ if (!avimux->auds.av_bps) { if (avimux->audio_time) { - avimux->auds_hdr.rate = (GST_SECOND * avimux->audio_size) / avimux->audio_time; + avimux->auds_hdr.rate = + (GST_SECOND * avimux->audio_size) / avimux->audio_time; } else { - GST_ELEMENT_ERROR (avimux, STREAM, MUX, - (_("No or invalid input audio, AVI stream will be corrupt.")), (NULL)); - avimux->auds_hdr.rate = 0; + GST_ELEMENT_ERROR (avimux, STREAM, MUX, + (_("No or invalid input audio, AVI stream will be corrupt.")), + (NULL)); + avimux->auds_hdr.rate = 0; } avimux->auds.av_bps = avimux->auds_hdr.rate * avimux->auds_hdr.scale; } avimux->avi_hdr.max_bps += avimux->auds.av_bps; } if (avimux->video_pad_connected) { - avimux->avi_hdr.max_bps += ((avimux->vids.bit_cnt+7)/8) * - (1000000. / avimux->avi_hdr.us_frame) * - avimux->vids.image_size; + avimux->avi_hdr.max_bps += ((avimux->vids.bit_cnt + 7) / 8) * + (1000000. / avimux->avi_hdr.us_frame) * avimux->vids.image_size; } /* seek and rewrite the header */ - header = gst_avimux_riff_get_avi_header(avimux); - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, 0); - gst_pad_push(avimux->srcpad, GST_DATA(event)); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avi_header (avimux); + event = gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_SET, 0); + gst_pad_push (avimux->srcpad, GST_DATA (event)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, avimux->total_data); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + GST_SEEK_METHOD_SET, avimux->total_data); + gst_pad_push (avimux->srcpad, GST_DATA (event)); avimux->write_header = TRUE; } static void -gst_avimux_restart_file (GstAviMux *avimux) +gst_avimux_restart_file (GstAviMux * avimux) { GstEvent *event; - gst_avimux_stop_file(avimux); + gst_avimux_stop_file (avimux); - event = gst_event_new(GST_EVENT_EOS); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + event = gst_event_new (GST_EVENT_EOS); + gst_pad_push (avimux->srcpad, GST_DATA (event)); - gst_avimux_start_file(avimux); + gst_avimux_start_file (avimux); } /* handle events (search) */ static gboolean -gst_avimux_handle_event (GstPad *pad, GstEvent *event) +gst_avimux_handle_event (GstPad * pad, GstEvent * event) { GstAviMux *avimux; GstEventType type; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); - + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_EOS: /* is this allright? */ if (pad == avimux->videosinkpad) { - avimux->video_pad_eos = TRUE; + avimux->video_pad_eos = TRUE; } else if (pad == avimux->audiosinkpad) { - avimux->audio_pad_eos = TRUE; + avimux->audio_pad_eos = TRUE; } else { - g_warning("Unknown pad for EOS!"); + g_warning ("Unknown pad for EOS!"); } break; default: @@ -1057,19 +1118,17 @@ gst_avimux_handle_event (GstPad *pad, GstEvent *event) /* fill the internal queue for each available pad */ static void -gst_avimux_fill_queue (GstAviMux *avimux) +gst_avimux_fill_queue (GstAviMux * avimux) { GstBuffer *buffer; while (!avimux->audio_buffer_queue && - avimux->audiosinkpad && - avimux->audio_pad_connected && - GST_PAD_IS_USABLE(avimux->audiosinkpad) && - !avimux->audio_pad_eos) - { - buffer = GST_BUFFER (gst_pad_pull(avimux->audiosinkpad)); - if (GST_IS_EVENT(buffer)) { - gst_avimux_handle_event(avimux->audiosinkpad, GST_EVENT(buffer)); + avimux->audiosinkpad && + avimux->audio_pad_connected && + GST_PAD_IS_USABLE (avimux->audiosinkpad) && !avimux->audio_pad_eos) { + buffer = GST_BUFFER (gst_pad_pull (avimux->audiosinkpad)); + if (GST_IS_EVENT (buffer)) { + gst_avimux_handle_event (avimux->audiosinkpad, GST_EVENT (buffer)); } else { avimux->audio_buffer_queue = buffer; break; @@ -1077,14 +1136,12 @@ gst_avimux_fill_queue (GstAviMux *avimux) } while (!avimux->video_buffer_queue && - avimux->videosinkpad && - avimux->video_pad_connected && - GST_PAD_IS_USABLE(avimux->videosinkpad) && - !avimux->video_pad_eos) - { - buffer = GST_BUFFER (gst_pad_pull(avimux->videosinkpad)); - if (GST_IS_EVENT(buffer)) { - gst_avimux_handle_event(avimux->videosinkpad, GST_EVENT(buffer)); + avimux->videosinkpad && + avimux->video_pad_connected && + GST_PAD_IS_USABLE (avimux->videosinkpad) && !avimux->video_pad_eos) { + buffer = GST_BUFFER (gst_pad_pull (avimux->videosinkpad)); + if (GST_IS_EVENT (buffer)) { + gst_avimux_handle_event (avimux->videosinkpad, GST_EVENT (buffer)); } else { avimux->video_buffer_queue = buffer; break; @@ -1095,49 +1152,45 @@ gst_avimux_fill_queue (GstAviMux *avimux) /* send extra 'padding' data */ static void -gst_avimux_send_pad_data (GstAviMux *avimux, - gulong num_bytes) +gst_avimux_send_pad_data (GstAviMux * avimux, gulong num_bytes) { GstBuffer *buffer; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = num_bytes; - GST_BUFFER_DATA(buffer) = g_malloc(num_bytes); - memset(GST_BUFFER_DATA(buffer), 0, num_bytes); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = num_bytes; + GST_BUFFER_DATA (buffer) = g_malloc (num_bytes); + memset (GST_BUFFER_DATA (buffer), 0, num_bytes); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); } /* do audio buffer */ static void -gst_avimux_do_audio_buffer (GstAviMux *avimux) +gst_avimux_do_audio_buffer (GstAviMux * avimux) { GstBuffer *data = avimux->audio_buffer_queue, *header; gulong total_size, pad_bytes = 0; /* write a audio header + index entry */ - if (GST_BUFFER_SIZE(data) & 1) { - pad_bytes = 2 - (GST_BUFFER_SIZE(data) & 1); + if (GST_BUFFER_SIZE (data) & 1) { + pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); } - header = gst_avimux_riff_get_audio_header(GST_BUFFER_SIZE(data)); - total_size = GST_BUFFER_SIZE(header) + GST_BUFFER_SIZE(data) + pad_bytes; + header = gst_avimux_riff_get_audio_header (GST_BUFFER_SIZE (data)); + total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; - if (avimux->is_bigfile) - { + if (avimux->is_bigfile) { avimux->datax_size += total_size; - } - else - { + } else { avimux->data_size += total_size; - avimux->audio_size += GST_BUFFER_SIZE(data); - avimux->audio_time += GST_BUFFER_DURATION(data); - gst_avimux_add_index(avimux, "01wb", 0x0, GST_BUFFER_SIZE(data)); + avimux->audio_size += GST_BUFFER_SIZE (data); + avimux->audio_time += GST_BUFFER_DURATION (data); + gst_avimux_add_index (avimux, "01wb", 0x0, GST_BUFFER_SIZE (data)); } - gst_pad_push(avimux->srcpad, GST_DATA (header)); - gst_pad_push(avimux->srcpad, GST_DATA (data)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (data)); if (pad_bytes) { - gst_avimux_send_pad_data(avimux, pad_bytes); + gst_avimux_send_pad_data (avimux, pad_bytes); } avimux->total_data += total_size; avimux->idx_offset += total_size; @@ -1148,49 +1201,47 @@ gst_avimux_do_audio_buffer (GstAviMux *avimux) /* do video buffer */ static void -gst_avimux_do_video_buffer (GstAviMux *avimux) +gst_avimux_do_video_buffer (GstAviMux * avimux) { GstBuffer *data = avimux->video_buffer_queue, *header; gulong total_size, pad_bytes = 0; if (avimux->restart) - gst_avimux_restart_file(avimux); + gst_avimux_restart_file (avimux); /* write a video header + index entry */ - if ((avimux->is_bigfile?avimux->datax_size:avimux->data_size)+GST_BUFFER_SIZE(data)>1024*1024*2000) - { + if ((avimux->is_bigfile ? avimux->datax_size : avimux->data_size) + + GST_BUFFER_SIZE (data) > 1024 * 1024 * 2000) { if (avimux->enable_large_avi) - gst_avimux_bigfile(avimux, FALSE); + gst_avimux_bigfile (avimux, FALSE); else - gst_avimux_restart_file(avimux); + gst_avimux_restart_file (avimux); } - if (GST_BUFFER_SIZE(data) & 1) { - pad_bytes = 2 - (GST_BUFFER_SIZE(data) & 1); + if (GST_BUFFER_SIZE (data) & 1) { + pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); } - header = gst_avimux_riff_get_video_header(GST_BUFFER_SIZE(data)); - total_size = GST_BUFFER_SIZE(header) + GST_BUFFER_SIZE(data) + pad_bytes; + header = gst_avimux_riff_get_video_header (GST_BUFFER_SIZE (data)); + total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; avimux->total_frames++; - if (avimux->is_bigfile) - { + if (avimux->is_bigfile) { avimux->datax_size += total_size; avimux->numx_frames++; - } - else - { + } else { guint flags = 0x2; + if (GST_BUFFER_FLAG_IS_SET (data, GST_BUFFER_KEY_UNIT)) flags |= 0x10; avimux->data_size += total_size; avimux->num_frames++; - gst_avimux_add_index(avimux, "00db", flags, GST_BUFFER_SIZE(data)); + gst_avimux_add_index (avimux, "00db", flags, GST_BUFFER_SIZE (data)); } - gst_pad_push(avimux->srcpad, GST_DATA (header)); - gst_pad_push(avimux->srcpad, GST_DATA (data)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (data)); if (pad_bytes) { - gst_avimux_send_pad_data(avimux, pad_bytes); + gst_avimux_send_pad_data (avimux, pad_bytes); } avimux->total_data += total_size; avimux->idx_offset += total_size; @@ -1201,31 +1252,24 @@ gst_avimux_do_video_buffer (GstAviMux *avimux) /* take the oldest buffer in our internal queue and push-it */ static gboolean -gst_avimux_do_one_buffer (GstAviMux *avimux) +gst_avimux_do_one_buffer (GstAviMux * avimux) { - if (avimux->video_buffer_queue && - avimux->audio_buffer_queue) - { - if (GST_BUFFER_TIMESTAMP(avimux->video_buffer_queue) <= - GST_BUFFER_TIMESTAMP(avimux->audio_buffer_queue)) - gst_avimux_do_video_buffer(avimux); + if (avimux->video_buffer_queue && avimux->audio_buffer_queue) { + if (GST_BUFFER_TIMESTAMP (avimux->video_buffer_queue) <= + GST_BUFFER_TIMESTAMP (avimux->audio_buffer_queue)) + gst_avimux_do_video_buffer (avimux); else - gst_avimux_do_audio_buffer(avimux); - } - else if (avimux->video_buffer_queue || - avimux->audio_buffer_queue) - { + gst_avimux_do_audio_buffer (avimux); + } else if (avimux->video_buffer_queue || avimux->audio_buffer_queue) { if (avimux->video_buffer_queue) - gst_avimux_do_video_buffer(avimux); + gst_avimux_do_video_buffer (avimux); else - gst_avimux_do_audio_buffer(avimux); - } - else { + gst_avimux_do_audio_buffer (avimux); + } else { /* simply finish off the file and send EOS */ - gst_avimux_stop_file(avimux); - gst_pad_push(avimux->srcpad, - GST_DATA(gst_event_new(GST_EVENT_EOS))); - gst_element_set_eos(GST_ELEMENT(avimux)); + gst_avimux_stop_file (avimux); + gst_pad_push (avimux->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); + gst_element_set_eos (GST_ELEMENT (avimux)); return FALSE; } @@ -1234,38 +1278,35 @@ gst_avimux_do_one_buffer (GstAviMux *avimux) static void -gst_avimux_loop (GstElement *element) +gst_avimux_loop (GstElement * element) { GstAviMux *avimux; - avimux = GST_AVIMUX(element); + avimux = GST_AVIMUX (element); /* first fill queue (some elements only set caps when * flowing data), then write header */ - gst_avimux_fill_queue(avimux); - + gst_avimux_fill_queue (avimux); + if (avimux->write_header) - gst_avimux_start_file(avimux); + gst_avimux_start_file (avimux); - gst_avimux_do_one_buffer(avimux); + gst_avimux_do_one_buffer (avimux); } static void -gst_avimux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_avimux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstAviMux *avimux; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AVIMUX(object)); - avimux = GST_AVIMUX(object); + g_return_if_fail (GST_IS_AVIMUX (object)); + avimux = GST_AVIMUX (object); - switch (prop_id) - { + switch (prop_id) { case ARG_BIGFILE: - g_value_set_boolean(value, avimux->enable_large_avi); + g_value_set_boolean (value, avimux->enable_large_avi); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1274,21 +1315,18 @@ gst_avimux_get_property (GObject *object, } static void -gst_avimux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_avimux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstAviMux *avimux; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AVIMUX(object)); - avimux = GST_AVIMUX(object); + g_return_if_fail (GST_IS_AVIMUX (object)); + avimux = GST_AVIMUX (object); - switch (prop_id) - { + switch (prop_id) { case ARG_BIGFILE: - avimux->enable_large_avi = g_value_get_boolean(value); + avimux->enable_large_avi = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1297,14 +1335,14 @@ gst_avimux_set_property (GObject *object, } static GstElementStateReturn -gst_avimux_change_state (GstElement *element) +gst_avimux_change_state (GstElement * element) { GstAviMux *avimux; gint transition = GST_STATE_TRANSITION (element); - g_return_val_if_fail(GST_IS_AVIMUX(element), GST_STATE_FAILURE); - - avimux = GST_AVIMUX(element); + g_return_val_if_fail (GST_IS_AVIMUX (element), GST_STATE_FAILURE); + + avimux = GST_AVIMUX (element); switch (transition) { case GST_STATE_PAUSED_TO_PLAYING: @@ -1317,4 +1355,3 @@ gst_avimux_change_state (GstElement *element) return GST_STATE_SUCCESS; } - diff --git a/gst/avi/gstavimux.h b/gst/avi/gstavimux.h index 452b7221..e51f3010 100644 --- a/gst/avi/gstavimux.h +++ b/gst/avi/gstavimux.h @@ -28,8 +28,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_AVIMUX \ @@ -44,65 +45,67 @@ extern "C" { (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVIMUX)) -typedef struct _GstAviMux GstAviMux; -typedef struct _GstAviMuxClass GstAviMuxClass; - -struct _GstAviMux { - GstElement element; - - /* pads */ - GstPad *srcpad; - GstPad *audiosinkpad; - gboolean audio_pad_connected, audio_pad_eos; - GstPad *videosinkpad; - gboolean video_pad_connected, video_pad_eos; - - /* the AVI header */ - gst_riff_avih avi_hdr; - guint32 total_frames; /* total number of frames */ - guint64 total_data; /* amount of total data */ - guint32 data_size, datax_size; /* amount of data (bytes) in the AVI/AVIX block */ - guint32 num_frames, numx_frames; /* num frames in the AVI/AVIX block */ - guint32 header_size; - gboolean write_header; - gboolean restart; - guint32 audio_size; - guint64 audio_time; - - /* video header */ - gst_riff_strh vids_hdr; - gst_riff_strf_vids vids; - - /* audio header */ - gst_riff_strh auds_hdr; - gst_riff_strf_auds auds; - - /* information about the AVI index ('idx') */ - gst_riff_index_entry *idx; - gint idx_index, idx_count; - guint32 idx_offset, idx_size; - - /* are we a big file already? */ - gboolean is_bigfile; - guint64 avix_start; - - /* whether to use "large AVI files" or just stick to small indexed files */ - gboolean enable_large_avi; - - /* in order to be usable as a loopbased element, we need an internal - * 'buffered' buffer for each pad, so one for audio, one for video */ - GstBuffer *audio_buffer_queue, *video_buffer_queue; -}; - -struct _GstAviMuxClass { - GstElementClass parent_class; -}; - -GType gst_avimux_get_type(void); + typedef struct _GstAviMux GstAviMux; + typedef struct _GstAviMuxClass GstAviMuxClass; + + struct _GstAviMux + { + GstElement element; + + /* pads */ + GstPad *srcpad; + GstPad *audiosinkpad; + gboolean audio_pad_connected, audio_pad_eos; + GstPad *videosinkpad; + gboolean video_pad_connected, video_pad_eos; + + /* the AVI header */ + gst_riff_avih avi_hdr; + guint32 total_frames; /* total number of frames */ + guint64 total_data; /* amount of total data */ + guint32 data_size, datax_size; /* amount of data (bytes) in the AVI/AVIX block */ + guint32 num_frames, numx_frames; /* num frames in the AVI/AVIX block */ + guint32 header_size; + gboolean write_header; + gboolean restart; + guint32 audio_size; + guint64 audio_time; + + /* video header */ + gst_riff_strh vids_hdr; + gst_riff_strf_vids vids; + + /* audio header */ + gst_riff_strh auds_hdr; + gst_riff_strf_auds auds; + + /* information about the AVI index ('idx') */ + gst_riff_index_entry *idx; + gint idx_index, idx_count; + guint32 idx_offset, idx_size; + + /* are we a big file already? */ + gboolean is_bigfile; + guint64 avix_start; + + /* whether to use "large AVI files" or just stick to small indexed files */ + gboolean enable_large_avi; + + /* in order to be usable as a loopbased element, we need an internal + * 'buffered' buffer for each pad, so one for audio, one for video */ + GstBuffer *audio_buffer_queue, *video_buffer_queue; + }; + + struct _GstAviMuxClass + { + GstElementClass parent_class; + }; + + GType gst_avimux_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_AVIMUX_H__ */ +#endif /* __GST_AVIMUX_H__ */ diff --git a/gst/cutter/gstcutter.c b/gst/cutter/gstcutter.c index f163c0b6..9b82b057 100644 --- a/gst/cutter/gstcutter.c +++ b/gst/cutter/gstcutter.c @@ -35,14 +35,16 @@ static GstElementDetails cutter_details = { /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ CUT_START, CUT_STOP, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_THRESHOLD, ARG_THRESHOLD_DB, @@ -51,52 +53,43 @@ enum { ARG_LEAKY }; -static GstStaticPadTemplate cutter_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS - ) -); +static GstStaticPadTemplate cutter_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate cutter_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS - ) -); - -static void gst_cutter_base_init (gpointer g_class); -static void gst_cutter_class_init (GstCutterClass *klass); -static void gst_cutter_init (GstCutter *filter); - -static void gst_cutter_set_property (GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_cutter_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); - -static void gst_cutter_chain (GstPad *pad, GstData *_data); -static double -inline gst_cutter_16bit_ms (gint16* data, guint numsamples); -static double -inline gst_cutter_8bit_ms (gint8* data, guint numsamples); - -void gst_cutter_get_caps (GstPad *pad, GstCutter* filter); + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS) + ); + +static void gst_cutter_base_init (gpointer g_class); +static void gst_cutter_class_init (GstCutterClass * klass); +static void gst_cutter_init (GstCutter * filter); + +static void gst_cutter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cutter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_cutter_chain (GstPad * pad, GstData * _data); +static double inline gst_cutter_16bit_ms (gint16 * data, guint numsamples); +static double inline gst_cutter_8bit_ms (gint8 * data, guint numsamples); + +void gst_cutter_get_caps (GstPad * pad, GstCutter * filter); static GstElementClass *parent_class = NULL; static guint gst_cutter_signals[LAST_SIGNAL] = { 0 }; GType -gst_cutter_get_type (void) { +gst_cutter_get_type (void) +{ static GType cutter_type = 0; if (!cutter_type) { @@ -109,7 +102,7 @@ gst_cutter_get_type (void) { (GInstanceInitFunc) gst_cutter_init, }; cutter_type = g_type_register_static (GST_TYPE_ELEMENT, "GstCutter", - &cutter_info, 0); + &cutter_info, 0); } return cutter_type; } @@ -119,13 +112,15 @@ gst_cutter_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 (&cutter_src_factory)); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&cutter_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&cutter_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&cutter_sink_factory)); gst_element_class_set_details (element_class, &cutter_details); } static GstPadLinkReturn -gst_cutter_link (GstPad *pad, const GstCaps*caps) +gst_cutter_link (GstPad * pad, const GstCaps * caps) { GstCutter *filter; GstPad *otherpad; @@ -139,46 +134,46 @@ gst_cutter_link (GstPad *pad, const GstCaps*caps) } static void -gst_cutter_class_init (GstCutterClass *klass) +gst_cutter_class_init (GstCutterClass * 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); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_THRESHOLD, - g_param_spec_double ("threshold", "Threshold", - "Volume threshold before trigger", - -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); + g_param_spec_double ("threshold", "Threshold", + "Volume threshold before trigger", + -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_THRESHOLD_DB, - g_param_spec_double ("threshold_dB", "Threshold (dB)", - "Volume threshold before trigger (in dB)", - -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); + g_param_spec_double ("threshold_dB", "Threshold (dB)", + "Volume threshold before trigger (in dB)", + -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RUN_LENGTH, - g_param_spec_double ("runlength", "Runlength", - "Length of drop below threshold before cut_stop (seconds)", - 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); + g_param_spec_double ("runlength", "Runlength", + "Length of drop below threshold before cut_stop (seconds)", + 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PRE_LENGTH, - g_param_spec_double ("prelength", "prelength", - "Length of pre-recording buffer (seconds)", - 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); + g_param_spec_double ("prelength", "prelength", + "Length of pre-recording buffer (seconds)", + 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LEAKY, - g_param_spec_boolean ("leaky", "Leaky", - "do we leak buffers when below threshold ?", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("leaky", "Leaky", + "do we leak buffers when below threshold ?", + FALSE, G_PARAM_READWRITE)); gst_cutter_signals[CUT_START] = - g_signal_new ("cut-start", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GstCutterClass, cut_start), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("cut-start", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstCutterClass, cut_start), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_cutter_signals[CUT_STOP] = - g_signal_new ("cut-stop", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GstCutterClass, cut_stop), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("cut-stop", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstCutterClass, cut_stop), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gobject_class->set_property = gst_cutter_set_property; @@ -186,12 +181,14 @@ gst_cutter_class_init (GstCutterClass *klass) } static void -gst_cutter_init (GstCutter *filter) +gst_cutter_init (GstCutter * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&cutter_sink_factory),"sink"); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&cutter_src_factory),"src"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&cutter_sink_factory), "sink"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&cutter_src_factory), "src"); filter->threshold_level = 0.1; filter->threshold_length = 0.5; @@ -208,19 +205,19 @@ gst_cutter_init (GstCutter *filter) gst_pad_set_link_function (filter->sinkpad, gst_cutter_link); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); - /*gst_pad_set_link_function (filter->srcpad, gst_cutter_link);*/ + /*gst_pad_set_link_function (filter->srcpad, gst_cutter_link); */ } static void -gst_cutter_chain (GstPad *pad, GstData *_data) +gst_cutter_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstCutter *filter; gint16 *in_data; - double RMS = 0.0; /* RMS of signal in buffer */ - double ms = 0.0; /* mean square value of buffer */ - static gboolean silent_prev = FALSE; /* previous value of silent */ - GstBuffer *prebuf; /* pointer to a prebuffer element */ + double RMS = 0.0; /* RMS of signal in buffer */ + double ms = 0.0; /* mean square value of buffer */ + static gboolean silent_prev = FALSE; /* previous value of silent */ + GstBuffer *prebuf; /* pointer to a prebuffer element */ g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); @@ -233,16 +230,14 @@ gst_cutter_chain (GstPad *pad, GstData *_data) if (gst_audio_is_buffer_framed (pad, buf) == FALSE) g_warning ("audio buffer is not framed !\n"); - if (!filter->have_caps) gst_cutter_get_caps (pad, filter); + if (!filter->have_caps) + gst_cutter_get_caps (pad, filter); in_data = (gint16 *) GST_BUFFER_DATA (buf); - GST_DEBUG ( - "length of prerec buffer: %.3f sec", - filter->pre_run_length); + GST_DEBUG ("length of prerec buffer: %.3f sec", filter->pre_run_length); /* calculate mean square value on buffer */ - switch (filter->width) - { + switch (filter->width) { case 16: ms = gst_cutter_16bit_ms (in_data, GST_BUFFER_SIZE (buf) / 2); break; @@ -252,7 +247,7 @@ gst_cutter_chain (GstPad *pad, GstData *_data) default: /* this shouldn't happen */ g_print ("WARNING: no mean square function for width %d\n", - filter->width); + filter->width); break; } @@ -262,13 +257,11 @@ gst_cutter_chain (GstPad *pad, GstData *_data) /* if RMS below threshold, add buffer length to silent run length count * if not, reset */ - GST_DEBUG ( - "buffer stats: ms %f, RMS %f, audio length %f", - ms, RMS, gst_audio_length (filter->srcpad, buf)); + GST_DEBUG ("buffer stats: ms %f, RMS %f, audio length %f", + ms, RMS, gst_audio_length (filter->srcpad, buf)); if (RMS < filter->threshold_level) filter->silent_run_length += gst_audio_length (filter->srcpad, buf); - else - { + else { filter->silent_run_length = 0.0; filter->silent = FALSE; } @@ -280,27 +273,21 @@ gst_cutter_chain (GstPad *pad, GstData *_data) /* has the silent status changed ? if so, send right signal * and, if from silent -> not silent, flush pre_record buffer */ - if (filter->silent != silent_prev) - { - if (filter->silent) - { + if (filter->silent != silent_prev) { + if (filter->silent) { /* g_print ("DEBUG: cutter: cut to here, turning off out\n"); */ g_signal_emit (G_OBJECT (filter), gst_cutter_signals[CUT_STOP], 0); - } - else - { + } else { gint count = 0; + /* g_print ("DEBUG: cutter: start from here, turning on out\n"); */ /* first of all, flush current buffer */ g_signal_emit (G_OBJECT (filter), gst_cutter_signals[CUT_START], 0); - GST_DEBUG ( - "flushing buffer of length %.3f", - filter->pre_run_length); - while (filter->pre_buffer) - { - prebuf = (g_list_first (filter->pre_buffer))->data; - filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); - gst_pad_push (filter->srcpad, GST_DATA (prebuf)); + GST_DEBUG ("flushing buffer of length %.3f", filter->pre_run_length); + while (filter->pre_buffer) { + prebuf = (g_list_first (filter->pre_buffer))->data; + filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); + gst_pad_push (filter->srcpad, GST_DATA (prebuf)); ++count; } GST_DEBUG ("flushed %d buffers", count); @@ -309,59 +296,50 @@ gst_cutter_chain (GstPad *pad, GstData *_data) } /* now check if we have to send the new buffer to the internal buffer cache * or to the srcpad */ - if (filter->silent) - { - /* we ref it before putting it in the pre_buffer */ - /* FIXME: we shouldn't probably do this, because the buffer - * arrives reffed already; the plugin should just push it - * or unref it to make it disappear */ - /* - gst_buffer_ref (buf); - */ - filter->pre_buffer = g_list_append (filter->pre_buffer, buf); - filter->pre_run_length += gst_audio_length (filter->srcpad, buf); - while (filter->pre_run_length > filter->pre_length) - { - prebuf = (g_list_first (filter->pre_buffer))->data; - g_assert (GST_IS_BUFFER (prebuf)); - filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); - filter->pre_run_length -= gst_audio_length (filter->srcpad, prebuf); - /* only pass buffers if we don't leak */ - if (!filter->leaky) - gst_pad_push (filter->srcpad, GST_DATA (prebuf)); - /* we unref it after getting it out of the pre_buffer */ - gst_buffer_unref (prebuf); - } - } - else + if (filter->silent) { + /* we ref it before putting it in the pre_buffer */ + /* FIXME: we shouldn't probably do this, because the buffer + * arrives reffed already; the plugin should just push it + * or unref it to make it disappear */ + /* + gst_buffer_ref (buf); + */ + filter->pre_buffer = g_list_append (filter->pre_buffer, buf); + filter->pre_run_length += gst_audio_length (filter->srcpad, buf); + while (filter->pre_run_length > filter->pre_length) { + prebuf = (g_list_first (filter->pre_buffer))->data; + g_assert (GST_IS_BUFFER (prebuf)); + filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); + filter->pre_run_length -= gst_audio_length (filter->srcpad, prebuf); + /* only pass buffers if we don't leak */ + if (!filter->leaky) + gst_pad_push (filter->srcpad, GST_DATA (prebuf)); + /* we unref it after getting it out of the pre_buffer */ + gst_buffer_unref (prebuf); + } + } else gst_pad_push (filter->srcpad, GST_DATA (buf)); } static double inline -gst_cutter_16bit_ms (gint16* data, guint num_samples) +gst_cutter_16bit_ms (gint16 * data, guint num_samples) #include "filter.func" - -static double inline -gst_cutter_8bit_ms (gint8* data, guint num_samples) + static double inline gst_cutter_8bit_ms (gint8 * data, guint num_samples) #include "filter.func" - -static void -gst_cutter_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) + static void + gst_cutter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstCutter *filter; g_return_if_fail (GST_IS_CUTTER (object)); filter = GST_CUTTER (object); - switch (prop_id) - { + switch (prop_id) { case ARG_THRESHOLD: - /* set the level */ + /* set the level */ filter->threshold_level = g_value_get_double (value); - GST_DEBUG ( - "DEBUG: set threshold level to %f", - filter->threshold_level); + GST_DEBUG ("DEBUG: set threshold level to %f", filter->threshold_level); break; case ARG_THRESHOLD_DB: /* set the level given in dB @@ -369,9 +347,7 @@ gst_cutter_set_property (GObject *object, guint prop_id, * values in dB < 0 result in values between 0 and 1 */ filter->threshold_level = pow (10, g_value_get_double (value) / 20); - GST_DEBUG ( - "DEBUG: set threshold level to %f", - filter->threshold_level); + GST_DEBUG ("DEBUG: set threshold level to %f", filter->threshold_level); break; case ARG_RUN_LENGTH: /* set the minimum length of the silent run required */ @@ -392,25 +368,24 @@ gst_cutter_set_property (GObject *object, guint prop_id, } static void -gst_cutter_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_cutter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstCutter *filter; g_return_if_fail (GST_IS_CUTTER (object)); filter = GST_CUTTER (object); - switch (prop_id) - { + switch (prop_id) { case ARG_RUN_LENGTH: - g_value_set_double (value, filter->threshold_length); - break; + g_value_set_double (value, filter->threshold_length); + break; case ARG_THRESHOLD: - g_value_set_double (value, filter->threshold_level); - break; + g_value_set_double (value, filter->threshold_level); + break; case ARG_THRESHOLD_DB: - g_value_set_double (value, 20 * log (filter->threshold_level)); - break; + g_value_set_double (value, 20 * log (filter->threshold_level)); + break; case ARG_PRE_LENGTH: g_value_set_double (value, filter->pre_length); break; @@ -424,9 +399,9 @@ gst_cutter_get_property (GObject *object, guint prop_id, } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - /* load audio support library */ + /* load audio support library */ if (!gst_library_load ("gstaudio")) return FALSE; @@ -436,25 +411,19 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "cutter", - "Audio Cutter to split audio into non-silent bits", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) - -void -gst_cutter_get_caps (GstPad *pad, GstCutter* filter) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "cutter", + "Audio Cutter to split audio into non-silent bits", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) + + void gst_cutter_get_caps (GstPad * pad, GstCutter * filter) { const GstCaps *caps = NULL; GstStructure *structure; caps = GST_PAD_CAPS (pad); - /* FIXME : Please change this to a better warning method ! */ + /* FIXME : Please change this to a better warning method ! */ g_assert (caps != NULL); if (caps == NULL) printf ("WARNING: get_caps: Could not get caps of pad !\n"); @@ -463,4 +432,3 @@ gst_cutter_get_caps (GstPad *pad, GstCutter* filter) filter->max_sample = gst_audio_highest_sample_value (pad); filter->have_caps = TRUE; } - diff --git a/gst/cutter/gstcutter.h b/gst/cutter/gstcutter.h index 84166636..e1ed9976 100644 --- a/gst/cutter/gstcutter.h +++ b/gst/cutter/gstcutter.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_CUTTER \ @@ -42,44 +43,44 @@ extern "C" { #define GST_IS_CUTTER_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CUTTER)) -typedef struct _GstCutter GstCutter; -typedef struct _GstCutterClass GstCutterClass; + typedef struct _GstCutter GstCutter; + typedef struct _GstCutterClass GstCutterClass; -struct _GstCutter -{ - GstElement element; + struct _GstCutter + { + GstElement element; - GstPad *sinkpad, *srcpad; + GstPad *sinkpad, *srcpad; - double threshold_level; /* level below which to cut */ - double threshold_length; /* how long signal has to remain + double threshold_level; /* level below which to cut */ + double threshold_length; /* how long signal has to remain * below this level before cutting */ - double silent_run_length; /* how long has it been below threshold ? */ - gboolean silent; + double silent_run_length; /* how long has it been below threshold ? */ + gboolean silent; - double pre_length; /* how long can the pre-record buffer be ? */ - double pre_run_length; /* how long is it currently ? */ - GList *pre_buffer; /* list of GstBuffers in pre-record buffer */ - gboolean leaky; /* do we leak an overflowing prebuffer ? */ + double pre_length; /* how long can the pre-record buffer be ? */ + double pre_run_length; /* how long is it currently ? */ + GList *pre_buffer; /* list of GstBuffers in pre-record buffer */ + gboolean leaky; /* do we leak an overflowing prebuffer ? */ - gboolean have_caps; /* did we get the needed caps yet ? */ - gint width; /* bit width of data */ - long max_sample; /* maximum sample value */ -}; + gboolean have_caps; /* did we get the needed caps yet ? */ + gint width; /* bit width of data */ + long max_sample; /* maximum sample value */ + }; -struct _GstCutterClass -{ - GstElementClass parent_class; - void (*cut_start) (GstCutter* filter); - void (*cut_stop) (GstCutter* filter); -}; + struct _GstCutterClass + { + GstElementClass parent_class; + void (*cut_start) (GstCutter * filter); + void (*cut_stop) (GstCutter * filter); + }; -GType gst_cutter_get_type (void); + GType gst_cutter_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/debug/efence.c b/gst/debug/efence.c index 571ab178..f6e576e3 100644 --- a/gst/debug/efence.c +++ b/gst/debug/efence.c @@ -43,79 +43,75 @@ static GstElementDetails plugin_details = { "Electric Fence", "Testing/EFence", "This element converts a stream of normal GStreamer buffers into a " -"stream of buffers that are allocated in such a way that out-of-bounds " -"access to data in the buffer is more likely to cause segmentation " -"faults. This allocation method is very similar to the debugging tool " -"\"Electric Fence\".", + "stream of buffers that are allocated in such a way that out-of-bounds " + "access to data in the buffer is more likely to cause segmentation " + "faults. This allocation method is very similar to the debugging tool " + "\"Electric Fence\".", "David A. Schleef ", }; /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_FENCE_TOP }; static GstStaticPadTemplate gst_efence_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_efence_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY -); - -static void gst_efence_base_init (gpointer g_class); -static void gst_efence_class_init (GstEFenceClass *klass); -static void gst_efence_init (GstEFence *filter); - -static void gst_efence_set_property(GObject *object, guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_efence_get_property(GObject *object, guint prop_id, - GValue *value, - GParamSpec *pspec); - -static void gst_efence_chain (GstPad *pad, GstData *_data); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void gst_efence_base_init (gpointer g_class); +static void gst_efence_class_init (GstEFenceClass * klass); +static void gst_efence_init (GstEFence * filter); + +static void gst_efence_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_efence_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_efence_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; typedef struct _GstFencedBuffer GstFencedBuffer; -struct _GstFencedBuffer { +struct _GstFencedBuffer +{ GstBuffer buffer; void *region; unsigned int length; }; -void gst_fenced_buffer_default_free (GstData *data); -GstData * gst_fenced_buffer_default_copy (const GstData *data); -void *gst_fenced_buffer_alloc(GstBuffer *buffer, unsigned int length, +void gst_fenced_buffer_default_free (GstData * data); +GstData *gst_fenced_buffer_default_copy (const GstData * data); +void *gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, gboolean fence_top); -static GstBuffer * gst_efence_buffer_alloc (GstPad *pad, guint64 offset, guint size); +static GstBuffer *gst_efence_buffer_alloc (GstPad * pad, guint64 offset, + guint size); -GstBuffer *gst_fenced_buffer_new(void); +GstBuffer *gst_fenced_buffer_new (void); GType gst_gst_efence_get_type (void) { static GType plugin_type = 0; - if (!plugin_type) - { - static const GTypeInfo plugin_info = - { + if (!plugin_type) { + static const GTypeInfo plugin_info = { sizeof (GstEFenceClass), gst_efence_base_init, NULL, @@ -127,8 +123,7 @@ gst_gst_efence_get_type (void) (GInstanceInitFunc) gst_efence_init, }; plugin_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstEFence", - &plugin_info, 0); + "GstEFence", &plugin_info, 0); } return plugin_type; } @@ -139,27 +134,27 @@ gst_efence_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(&gst_efence_sink_factory)); + gst_static_pad_template_get (&gst_efence_sink_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_efence_src_factory)); + gst_static_pad_template_get (&gst_efence_src_factory)); gst_element_class_set_details (element_class, &plugin_details); } /* initialize the plugin's class */ static void -gst_efence_class_init (GstEFenceClass *klass) +gst_efence_class_init (GstEFenceClass * 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); g_object_class_install_property (gobject_class, ARG_FENCE_TOP, - g_param_spec_boolean ("fence_top", "Fence Top", "Align buffers with top of fenced region", - TRUE, G_PARAM_READWRITE)); + g_param_spec_boolean ("fence_top", "Fence Top", + "Align buffers with top of fenced region", TRUE, G_PARAM_READWRITE)); gobject_class->set_property = gst_efence_set_property; gobject_class->get_property = gst_efence_get_property; @@ -171,14 +166,16 @@ gst_efence_class_init (GstEFenceClass *klass) * initialize structure */ static void -gst_efence_init (GstEFence *filter) +gst_efence_init (GstEFence * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_efence_sink_factory), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_efence_sink_factory), "sink"); gst_pad_set_getcaps_function (filter->sinkpad, gst_pad_proxy_getcaps); gst_pad_set_link_function (filter->sinkpad, gst_pad_proxy_pad_link); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_efence_src_factory), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_efence_src_factory), "src"); gst_pad_set_getcaps_function (filter->srcpad, gst_pad_proxy_getcaps); gst_pad_set_link_function (filter->srcpad, gst_pad_proxy_pad_link); @@ -195,7 +192,7 @@ gst_efence_init (GstEFence *filter) */ static void -gst_efence_chain (GstPad *pad, GstData *_data) +gst_efence_chain (GstPad * pad, GstData * _data) { GstBuffer *buffer = GST_BUFFER (_data); GstEFence *efence; @@ -215,27 +212,27 @@ gst_efence_chain (GstPad *pad, GstData *_data) return; } - copy = gst_fenced_buffer_new(); + copy = gst_fenced_buffer_new (); - ptr = gst_fenced_buffer_alloc(copy, GST_BUFFER_SIZE(buffer), + ptr = gst_fenced_buffer_alloc (copy, GST_BUFFER_SIZE (buffer), efence->fence_top); - memcpy(ptr, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); - - GST_BUFFER_DATA (copy) = ptr; - GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); - GST_BUFFER_MAXSIZE (copy) = GST_BUFFER_SIZE (buffer); - GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); - GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); - GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); + memcpy (ptr, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + + GST_BUFFER_DATA (copy) = ptr; + GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); + GST_BUFFER_MAXSIZE (copy) = GST_BUFFER_SIZE (buffer); + GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); + GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); + GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); GST_BUFFER_FREE_DATA_FUNC (copy) = NULL; - GST_BUFFER_PRIVATE (copy) = NULL; + GST_BUFFER_PRIVATE (copy) = NULL; - gst_buffer_unref(buffer); + gst_buffer_unref (buffer); gst_pad_push (efence->srcpad, GST_DATA (copy)); } static GstBuffer * -gst_efence_buffer_alloc (GstPad *pad, guint64 offset, guint size) +gst_efence_buffer_alloc (GstPad * pad, guint64 offset, guint size) { GstBuffer *buffer; GstEFence *efence; @@ -244,7 +241,7 @@ gst_efence_buffer_alloc (GstPad *pad, guint64 offset, guint size) buffer = gst_fenced_buffer_new (); - GST_BUFFER_DATA (buffer) = gst_fenced_buffer_alloc(buffer, size, + GST_BUFFER_DATA (buffer) = gst_fenced_buffer_alloc (buffer, size, efence->fence_top); GST_BUFFER_SIZE (buffer) = size; @@ -252,28 +249,27 @@ gst_efence_buffer_alloc (GstPad *pad, guint64 offset, guint size) } static void -gst_efence_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_efence_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstEFence *filter; g_return_if_fail (GST_IS_EFENCE (object)); filter = GST_EFENCE (object); - switch (prop_id) - { - case ARG_FENCE_TOP: - filter->fence_top = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + switch (prop_id) { + case ARG_FENCE_TOP: + filter->fence_top = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } static void -gst_efence_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_efence_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstEFence *filter; @@ -281,12 +277,12 @@ gst_efence_get_property (GObject *object, guint prop_id, filter = GST_EFENCE (object); switch (prop_id) { - case ARG_FENCE_TOP: - g_value_set_boolean (value, filter->fence_top); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + case ARG_FENCE_TOP: + g_value_set_boolean (value, filter->fence_top); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } @@ -296,55 +292,50 @@ gst_efence_get_property (GObject *object, guint prop_id, * register the features */ static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "efence", GST_RANK_NONE, GST_TYPE_EFENCE)) return FALSE; - + /* plugin initialisation succeeded */ return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "efence", - "This element converts a stream of normal GStreamer buffers into a " - "stream of buffers that are allocated in such a way that out-of-bounds " - "access to data in the buffer is more likely to cause segmentation " - "faults. This allocation method is very similar to the debugging tool " - "\"Electric Fence\".", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) - -GstBuffer *gst_fenced_buffer_new(void) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "efence", + "This element converts a stream of normal GStreamer buffers into a " + "stream of buffers that are allocated in such a way that out-of-bounds " + "access to data in the buffer is more likely to cause segmentation " + "faults. This allocation method is very similar to the debugging tool " + "\"Electric Fence\".", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) + + GstBuffer *gst_fenced_buffer_new (void) { GstBuffer *newbuf; - newbuf = (GstBuffer *) g_new0(GstFencedBuffer,1); + newbuf = (GstBuffer *) g_new0 (GstFencedBuffer, 1); gst_data_init (GST_DATA (newbuf), _gst_buffer_type, 0, - gst_fenced_buffer_default_free, - gst_fenced_buffer_default_copy); - - GST_BUFFER_DATA (newbuf) = NULL; - GST_BUFFER_SIZE (newbuf) = 0; - GST_BUFFER_MAXSIZE (newbuf) = GST_BUFFER_MAXSIZE_NONE; - GST_BUFFER_TIMESTAMP (newbuf) = GST_CLOCK_TIME_NONE; - GST_BUFFER_DURATION (newbuf) = GST_CLOCK_TIME_NONE; - GST_BUFFER_OFFSET (newbuf) = GST_BUFFER_OFFSET_NONE; + gst_fenced_buffer_default_free, gst_fenced_buffer_default_copy); + + GST_BUFFER_DATA (newbuf) = NULL; + GST_BUFFER_SIZE (newbuf) = 0; + GST_BUFFER_MAXSIZE (newbuf) = GST_BUFFER_MAXSIZE_NONE; + GST_BUFFER_TIMESTAMP (newbuf) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (newbuf) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (newbuf) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_FREE_DATA_FUNC (newbuf) = NULL; - GST_BUFFER_PRIVATE (newbuf) = NULL; + GST_BUFFER_PRIVATE (newbuf) = NULL; GST_DEBUG ("new buffer=%p", newbuf); return newbuf; } -void gst_fenced_buffer_default_free (GstData *data) +void +gst_fenced_buffer_default_free (GstData * data) { GstFencedBuffer *fenced_buffer; GstBuffer *buffer = GST_BUFFER (data); @@ -360,51 +351,52 @@ void gst_fenced_buffer_default_free (GstData *data) GST_BUFFER_DATA (buffer)) { GST_DEBUG ("free region %p %d", fenced_buffer->region, fenced_buffer->length); - munmap(fenced_buffer->region, fenced_buffer->length); - }else{ + munmap (fenced_buffer->region, fenced_buffer->length); + } else { GST_DEBUG ("not freeing region %p %d %p", fenced_buffer->region, - GST_BUFFER_FLAGS(buffer), GST_BUFFER_DATA(buffer)); + GST_BUFFER_FLAGS (buffer), GST_BUFFER_DATA (buffer)); } /* set to safe values */ GST_BUFFER_DATA (buffer) = NULL; GST_BUFFER_SIZE (buffer) = 0; - + g_free (buffer); } -GstData* gst_fenced_buffer_default_copy (const GstData *data) -{ +GstData * +gst_fenced_buffer_default_copy (const GstData * data) +{ GstBuffer *buffer = GST_BUFFER (data); GstData *copy; void *ptr; - + g_return_val_if_fail (buffer != NULL, NULL); - + /* create a fresh new buffer */ - copy = (GstData *) g_new0(GstFencedBuffer,1); - + copy = (GstData *) g_new0 (GstFencedBuffer, 1); + gst_data_init (copy, _gst_buffer_type, 0, - gst_fenced_buffer_default_free, - gst_fenced_buffer_default_copy); - + gst_fenced_buffer_default_free, gst_fenced_buffer_default_copy); + /* we simply copy everything from our parent */ - ptr = gst_fenced_buffer_alloc(GST_BUFFER(copy), - GST_BUFFER_SIZE(buffer), TRUE); - memcpy(ptr, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); - - GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); - GST_BUFFER_MAXSIZE (copy) = GST_BUFFER_SIZE (buffer); - GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); - GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); - GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); + ptr = gst_fenced_buffer_alloc (GST_BUFFER (copy), + GST_BUFFER_SIZE (buffer), TRUE); + memcpy (ptr, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + + GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); + GST_BUFFER_MAXSIZE (copy) = GST_BUFFER_SIZE (buffer); + GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); + GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); + GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); GST_BUFFER_FREE_DATA_FUNC (copy) = NULL; - GST_BUFFER_PRIVATE (copy) = NULL; - + GST_BUFFER_PRIVATE (copy) = NULL; + return copy; } -void *gst_fenced_buffer_alloc(GstBuffer *buffer, unsigned int length, +void * +gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, gboolean fence_top) { int alloc_size; @@ -414,41 +406,41 @@ void *gst_fenced_buffer_alloc(GstBuffer *buffer, unsigned int length, GST_DEBUG ("buffer=%p length=%d fence_top=%d", buffer, length, fence_top); - if(length==0)return NULL; + if (length == 0) + return NULL; #ifdef _SC_PAGESIZE - page_size = sysconf(_SC_PAGESIZE); + page_size = sysconf (_SC_PAGESIZE); #else - page_size = getpagesize(); + page_size = getpagesize (); #endif alloc_size = ((length - 1) & ~(page_size - 1)) + page_size; - alloc_size += 2*page_size; + alloc_size += 2 * page_size; - region = mmap(NULL, alloc_size, PROT_READ|PROT_WRITE, + region = mmap (NULL, alloc_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if(region == MAP_FAILED){ - g_warning("mmap failed"); + if (region == MAP_FAILED) { + g_warning ("mmap failed"); return NULL; } - munmap(region, page_size); - munmap(region + alloc_size - page_size, page_size); + munmap (region, page_size); + munmap (region + alloc_size - page_size, page_size); fenced_buffer->region = region; fenced_buffer->length = alloc_size; - GST_DEBUG ("new region %p %d", fenced_buffer->region, - fenced_buffer->length); - - if(fence_top){ + GST_DEBUG ("new region %p %d", fenced_buffer->region, fenced_buffer->length); + + if (fence_top) { int offset; + /* Align to top of region, but force alignment to 4 bytes */ offset = alloc_size - page_size - length; offset &= ~0x3; return region + offset; - }else{ + } else { return region + page_size; } } - diff --git a/gst/debug/efence.h b/gst/debug/efence.h index bf0790dd..8447e848 100644 --- a/gst/debug/efence.h +++ b/gst/debug/efence.h @@ -8,8 +8,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ /* #define's don't like whitespacey bits */ #define GST_TYPE_EFENCE \ @@ -23,27 +24,27 @@ extern "C" { #define GST_IS_EFENCE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EFENCE)) -typedef struct _GstEFence GstEFence; -typedef struct _GstEFenceClass GstEFenceClass; + typedef struct _GstEFence GstEFence; + typedef struct _GstEFenceClass GstEFenceClass; -struct _GstEFence -{ - GstElement element; + struct _GstEFence + { + GstElement element; - GstPad *sinkpad, *srcpad; + GstPad *sinkpad, *srcpad; - gboolean fence_top; -}; + gboolean fence_top; + }; -struct _GstEFenceClass -{ - GstElementClass parent_class; -}; + struct _GstEFenceClass + { + GstElementClass parent_class; + }; -GType gst_gst_efence_get_type (void); + GType gst_gst_efence_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_EFENCE_H__ */ +#endif /* __GST_EFENCE_H__ */ diff --git a/gst/debug/gstnavigationtest.c b/gst/debug/gstnavigationtest.c index 0dad689b..e1b7486f 100644 --- a/gst/debug/gstnavigationtest.c +++ b/gst/debug/gstnavigationtest.c @@ -33,26 +33,34 @@ #include /* GstNavigationtest signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_navigationtest_base_init (gpointer g_class); -static void gst_navigationtest_class_init (gpointer g_class, gpointer class_data); -static void gst_navigationtest_init (GTypeInstance *instance, gpointer g_class); +static void gst_navigationtest_base_init (gpointer g_class); +static void gst_navigationtest_class_init (gpointer g_class, + gpointer class_data); +static void gst_navigationtest_init (GTypeInstance * instance, + gpointer g_class); -static gboolean gst_navigationtest_handle_src_event (GstPad *pad, GstEvent *event); -static void gst_navigationtest_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_navigationtest_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static gboolean gst_navigationtest_handle_src_event (GstPad * pad, + GstEvent * event); +static void gst_navigationtest_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_navigationtest_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_navigationtest_planar411(GstVideofilter *videofilter, void *dest, void *src); -static void gst_navigationtest_setup(GstVideofilter *videofilter); +static void gst_navigationtest_planar411 (GstVideofilter * videofilter, + void *dest, void *src); +static void gst_navigationtest_setup (GstVideofilter * videofilter); GType gst_navigationtest_get_type (void) @@ -61,44 +69,43 @@ gst_navigationtest_get_type (void) if (!navigationtest_type) { static const GTypeInfo navigationtest_info = { - sizeof(GstNavigationtestClass), + sizeof (GstNavigationtestClass), gst_navigationtest_base_init, NULL, gst_navigationtest_class_init, NULL, NULL, - sizeof(GstNavigationtest), + sizeof (GstNavigationtest), 0, gst_navigationtest_init, }; - navigationtest_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstNavigationtest", &navigationtest_info, 0); + navigationtest_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstNavigationtest", &navigationtest_info, 0); } return navigationtest_type; } static GstVideofilterFormat gst_navigationtest_formats[] = { - { "I420", 12, gst_navigationtest_planar411, }, + {"I420", 12, gst_navigationtest_planar411,}, }; - + static void gst_navigationtest_base_init (gpointer g_class) { - static GstElementDetails navigationtest_details = GST_ELEMENT_DETAILS ( - "Video Filter Template", - "Filter/Video", - "Template for a video filter", - "David Schleef " - ); + static GstElementDetails navigationtest_details = + GST_ELEMENT_DETAILS ("Video Filter Template", + "Filter/Video", + "Template for a video filter", + "David Schleef "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &navigationtest_details); - for(i=0;iset_property = gst_navigationtest_set_property; @@ -128,14 +135,14 @@ gst_navigationtest_class_init (gpointer g_class, gpointer class_data) } static void -gst_navigationtest_init (GTypeInstance *instance, gpointer g_class) +gst_navigationtest_init (GTypeInstance * instance, gpointer g_class) { GstNavigationtest *navigationtest = GST_NAVIGATIONTEST (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_navigationtest_init"); + GST_DEBUG ("gst_navigationtest_init"); - videofilter = GST_VIDEOFILTER(navigationtest); + videofilter = GST_VIDEOFILTER (navigationtest); gst_pad_set_event_function (videofilter->srcpad, gst_navigationtest_handle_src_event); @@ -145,7 +152,7 @@ gst_navigationtest_init (GTypeInstance *instance, gpointer g_class) } static gboolean -gst_navigationtest_handle_src_event (GstPad *pad, GstEvent *event) +gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event) { GstNavigationtest *navigationtest; @@ -153,10 +160,10 @@ gst_navigationtest_handle_src_event (GstPad *pad, GstEvent *event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: - gst_structure_get_double(event->event_data.structure.structure, - "pointer_x", &navigationtest->x); - gst_structure_get_double(event->event_data.structure.structure, - "pointer_y", &navigationtest->y); + gst_structure_get_double (event->event_data.structure.structure, + "pointer_x", &navigationtest->x); + gst_structure_get_double (event->event_data.structure.structure, + "pointer_y", &navigationtest->y); break; default: break; @@ -165,15 +172,16 @@ gst_navigationtest_handle_src_event (GstPad *pad, GstEvent *event) } static void -gst_navigationtest_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_navigationtest_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstNavigationtest *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_NAVIGATIONTEST(object)); - src = GST_NAVIGATIONTEST(object); + g_return_if_fail (GST_IS_NAVIGATIONTEST (object)); + src = GST_NAVIGATIONTEST (object); - GST_DEBUG("gst_navigationtest_set_property"); + GST_DEBUG ("gst_navigationtest_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: @@ -186,13 +194,14 @@ gst_navigationtest_set_property (GObject *object, guint prop_id, const GValue *v } static void -gst_navigationtest_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_navigationtest_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstNavigationtest *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_NAVIGATIONTEST(object)); - src = GST_NAVIGATIONTEST(object); + g_return_if_fail (GST_IS_NAVIGATIONTEST (object)); + src = GST_NAVIGATIONTEST (object); switch (prop_id) { #if 0 @@ -206,89 +215,85 @@ gst_navigationtest_get_property (GObject *object, guint prop_id, GValue *value, } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; return gst_element_register (plugin, "navigationtest", GST_RANK_NONE, GST_TYPE_NAVIGATIONTEST); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "navigationtest", - "Template for a video filter", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - -static void gst_navigationtest_setup(GstVideofilter *videofilter) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "navigationtest", + "Template for a video filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) + + static void gst_navigationtest_setup (GstVideofilter * videofilter) { GstNavigationtest *navigationtest; - g_return_if_fail(GST_IS_NAVIGATIONTEST(videofilter)); - navigationtest = GST_NAVIGATIONTEST(videofilter); + g_return_if_fail (GST_IS_NAVIGATIONTEST (videofilter)); + navigationtest = GST_NAVIGATIONTEST (videofilter); /* if any setup needs to be done, do it here */ } -static void gst_navigationtest_planar411(GstVideofilter *videofilter, +static void +gst_navigationtest_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstNavigationtest *navigationtest; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); - int x,y; + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); + int x, y; int x1, x2, y1, y2; - g_return_if_fail(GST_IS_NAVIGATIONTEST(videofilter)); - navigationtest = GST_NAVIGATIONTEST(videofilter); + g_return_if_fail (GST_IS_NAVIGATIONTEST (videofilter)); + navigationtest = GST_NAVIGATIONTEST (videofilter); /* do something interesting here. This simply copies the source * to the destination. */ - memcpy(dest,src,width * height + (width/2) * (height/2) * 2); + memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2); - x = rint(navigationtest->x); - y = rint(navigationtest->y); + x = rint (navigationtest->x); + y = rint (navigationtest->y); - if(x<0 || y<0 || x>=width || y>=height)return; + if (x < 0 || y < 0 || x >= width || y >= height) + return; - x1 = MAX(x-5, 0); - x2 = MIN(x+5, width); - y1 = MAX(y-5, 0); - y2 = MIN(y+5, height); + x1 = MAX (x - 5, 0); + x2 = MIN (x + 5, width); + y1 = MAX (y - 5, 0); + y2 = MIN (y + 5, height); - for(y=y1;y" - ); + static GstElementDetails agingtv_details = GST_ELEMENT_DETAILS ("AgingTV", + "Filter/Effect/Video", + "AgingTV adds age to video input using scratches and dust", + "Sam Lantinga "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &agingtv_details); - for(i=0;iset_property = gst_agingtv_set_property; @@ -179,26 +183,27 @@ gst_agingtv_class_init (gpointer g_class, gpointer class_data) } static void -gst_agingtv_init (GTypeInstance *instance, gpointer g_class) +gst_agingtv_init (GTypeInstance * instance, gpointer g_class) { GstAgingTV *agingtv = GST_AGINGTV (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_agingtv_init"); + GST_DEBUG ("gst_agingtv_init"); - videofilter = GST_VIDEOFILTER(agingtv); + videofilter = GST_VIDEOFILTER (agingtv); /* do stuff */ } -static void gst_agingtv_setup(GstVideofilter *videofilter) +static void +gst_agingtv_setup (GstVideofilter * videofilter) { GstAgingTV *agingtv; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); - g_return_if_fail(GST_IS_AGINGTV(videofilter)); - agingtv = GST_AGINGTV(videofilter); + g_return_if_fail (GST_IS_AGINGTV (videofilter)); + agingtv = GST_AGINGTV (videofilter); /* if any setup needs to be done, do it here */ @@ -206,7 +211,7 @@ static void gst_agingtv_setup(GstVideofilter *videofilter) agingtv->height = height; } -static unsigned int +static unsigned int fastrand (void) { static unsigned int fastrand_val; @@ -215,8 +220,8 @@ fastrand (void) } -static void -coloraging (guint32 *src, guint32 *dest, gint video_area) +static void +coloraging (guint32 * src, guint32 * dest, gint video_area) { guint32 a, b; gint i; @@ -229,8 +234,9 @@ coloraging (guint32 *src, guint32 *dest, gint video_area) } -static void -scratching (scratch *scratches, gint scratch_lines, guint32 *dest, gint width, gint height) +static void +scratching (scratch * scratches, gint scratch_lines, guint32 * dest, gint width, + gint height) { gint i, y, y1, y2; guint32 *p, a, b; @@ -241,7 +247,7 @@ scratching (scratch *scratches, gint scratch_lines, guint32 *dest, gint width, g if (scratch->life) { scratch->x = scratch->x + scratch->dx; - + if (scratch->x < 0 || scratch->x > width * 256) { scratch->life = 0; break; @@ -277,8 +283,9 @@ scratching (scratch *scratches, gint scratch_lines, guint32 *dest, gint width, g } } -static void -dusts (guint32 *dest, gint width, gint height, gint dust_interval, gint area_scale) +static void +dusts (guint32 * dest, gint width, gint height, gint dust_interval, + gint area_scale) { int i, j; int dnum; @@ -291,8 +298,8 @@ dusts (guint32 *dest, gint width, gint height, gint dust_interval, gint area_sca } return; } - dnum = area_scale * 4 + (fastrand() >> 27); - + dnum = area_scale * 4 + (fastrand () >> 27); + for (i = 0; i < dnum; i++) { x = fastrand () % width; y = fastrand () % height; @@ -303,7 +310,8 @@ dusts (guint32 *dest, gint width, gint height, gint dust_interval, gint area_sca y += dy[d]; x += dx[d]; - if (y >= height || x >= width) break; + if (y >= height || x >= width) + break; d = (d + fastrand () % 3 - 1) & 7; } @@ -311,8 +319,9 @@ dusts (guint32 *dest, gint width, gint height, gint dust_interval, gint area_sca dust_interval--; } -static void -pits (guint32 *dest, gint width, gint height, gint area_scale, gint pits_interval) +static void +pits (guint32 * dest, gint width, gint height, gint area_scale, + gint pits_interval) { int i, j; int pnum, size, pnumscale; @@ -340,46 +349,50 @@ pits (guint32 *dest, gint width, gint height, gint area_scale, gint pits_interva x = x + fastrand () % 3 - 1; y = y + fastrand () % 3 - 1; - if (y >= height || x >= width) break; + if (y >= height || x >= width) + break; dest[y * width + x] = 0xc0c0c0; } } } -static void -gst_agingtv_rgb32 (GstVideofilter *videofilter, void *d, void *s) +static void +gst_agingtv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstAgingTV *agingtv; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); int video_size = width * height; guint32 *src = s; guint32 *dest = d; gint area_scale = width * height / 64 / 480; - if (area_scale <= 0) area_scale = 1; - g_return_if_fail(GST_IS_AGINGTV(videofilter)); - agingtv = GST_AGINGTV(videofilter); + if (area_scale <= 0) + area_scale = 1; + + g_return_if_fail (GST_IS_AGINGTV (videofilter)); + agingtv = GST_AGINGTV (videofilter); coloraging (src, dest, video_size); scratching (agingtv->scratches, agingtv->scratch_lines, dest, width, height); pits (dest, width, height, area_scale, agingtv->pits_interval); - if(area_scale > 1) + if (area_scale > 1) dusts (dest, width, height, agingtv->dust_interval, area_scale); - + } static void -gst_agingtv_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_agingtv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstAgingTV *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AGINGTV(object)); - src = GST_AGINGTV(object); + g_return_if_fail (GST_IS_AGINGTV (object)); + src = GST_AGINGTV (object); - GST_DEBUG("gst_agingtv_set_property"); + GST_DEBUG ("gst_agingtv_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: @@ -392,13 +405,14 @@ gst_agingtv_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -gst_agingtv_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_agingtv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstAgingTV *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AGINGTV(object)); - src = GST_AGINGTV(object); + g_return_if_fail (GST_IS_AGINGTV (object)); + src = GST_AGINGTV (object); switch (prop_id) { #if 0 @@ -411,4 +425,3 @@ gst_agingtv_get_property (GObject *object, guint prop_id, GValue *value, GParamS break; } } - diff --git a/gst/effectv/gstdice.c b/gst/effectv/gstdice.c index ba2d1d6c..a7cbbc36 100644 --- a/gst/effectv/gstdice.c +++ b/gst/effectv/gstdice.c @@ -35,12 +35,12 @@ typedef struct _GstDiceTVClass GstDiceTVClass; #define MAX_CUBE_BITS 5 #define MIN_CUBE_BITS 0 -typedef enum _dice_dir +typedef enum _dice_dir { - DICE_UP = 0, - DICE_RIGHT = 1, - DICE_DOWN = 2, - DICE_LEFT = 3 + DICE_UP = 0, + DICE_RIGHT = 1, + DICE_DOWN = 2, + DICE_LEFT = 3 } DiceDir; struct _GstDiceTV @@ -48,7 +48,7 @@ struct _GstDiceTV GstVideofilter videofilter; gint width, height; - gchar* dicemap; + gchar *dicemap; gint g_cube_bits; gint g_cube_size; @@ -60,7 +60,7 @@ struct _GstDiceTVClass { GstVideofilterClass parent_class; - void (*reset) (GstElement *element); + void (*reset) (GstElement * element); }; /* Filter signals and args */ @@ -77,29 +77,30 @@ enum ARG_CUBE_BITS, }; -static void gst_dicetv_base_init (gpointer g_class); -static void gst_dicetv_class_init (gpointer g_class, gpointer class_data); -static void gst_dicetv_init (GTypeInstance *instance, gpointer g_class); +static void gst_dicetv_base_init (gpointer g_class); +static void gst_dicetv_class_init (gpointer g_class, gpointer class_data); +static void gst_dicetv_init (GTypeInstance * instance, gpointer g_class); -static void gst_dicetv_reset_handler (GstElement *elem); -static void gst_dicetv_create_map (GstDiceTV *filter); +static void gst_dicetv_reset_handler (GstElement * elem); +static void gst_dicetv_create_map (GstDiceTV * filter); -static void gst_dicetv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_dicetv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_dicetv_setup (GstVideofilter *videofilter); -static void gst_dicetv_draw (GstVideofilter *videofilter, void *d, void *s); +static void gst_dicetv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dicetv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_dicetv_setup (GstVideofilter * videofilter); +static void gst_dicetv_draw (GstVideofilter * videofilter, void *d, void *s); static guint gst_dicetv_signals[LAST_SIGNAL] = { 0 }; -GType gst_dicetv_get_type (void) +GType +gst_dicetv_get_type (void) { static GType dicetv_type = 0; if (!dicetv_type) { static const GTypeInfo dicetv_info = { - sizeof (GstDiceTVClass), + sizeof (GstDiceTVClass), gst_dicetv_base_init, NULL, (GClassInitFunc) gst_dicetv_class_init, @@ -110,37 +111,41 @@ GType gst_dicetv_get_type (void) (GInstanceInitFunc) gst_dicetv_init, }; - dicetv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstDiceTV", &dicetv_info, 0); + dicetv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstDiceTV", &dicetv_info, + 0); } return dicetv_type; } static GstVideofilterFormat gst_dicetv_formats[] = { - { "RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, 0x000000ff }, - { "RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0xff000000, 0x00ff0000, 0x0000ff00 }, - { "RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, 0x00ff0000 }, - { "RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 }, + {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, + 0x000000ff}, + {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0xff000000, 0x00ff0000, + 0x0000ff00}, + {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, + 0x00ff0000}, + {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000}, }; static void gst_dicetv_base_init (gpointer g_class) { /* elementfactory information */ - static GstElementDetails gst_dicetv_details = GST_ELEMENT_DETAILS ( - "DiceTV", - "Filter/Effect/Video", - "'Dices' the screen up into many small squares", - "Wim Taymans " - ); + static GstElementDetails gst_dicetv_details = GST_ELEMENT_DETAILS ("DiceTV", + "Filter/Effect/Video", + "'Dices' the screen up into many small squares", + "Wim Taymans "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &gst_dicetv_details); - for(i=0; i < G_N_ELEMENTS(gst_dicetv_formats); i++) { - gst_videofilter_class_add_format(videofilter_class, + for (i = 0; i < G_N_ELEMENTS (gst_dicetv_formats); i++) { + gst_videofilter_class_add_format (videofilter_class, gst_dicetv_formats + i); } @@ -159,19 +164,17 @@ gst_dicetv_class_init (gpointer g_class, gpointer class_data) dicetv_class = GST_DICETV_CLASS (g_class); gst_dicetv_signals[RESET_SIGNAL] = - g_signal_new ("reset", - G_TYPE_FROM_CLASS (g_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstDiceTVClass, reset), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_signal_new ("reset", + G_TYPE_FROM_CLASS (g_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstDiceTVClass, reset), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); dicetv_class->reset = gst_dicetv_reset_handler; - + g_object_class_install_property (gobject_class, ARG_CUBE_BITS, - g_param_spec_int ("square_bits","Square Bits","The size of the Squares", - MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, G_PARAM_READWRITE)); + g_param_spec_int ("square_bits", "Square Bits", "The size of the Squares", + MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, G_PARAM_READWRITE)); gobject_class->set_property = gst_dicetv_set_property; gobject_class->get_property = gst_dicetv_get_property; @@ -180,7 +183,7 @@ gst_dicetv_class_init (gpointer g_class, gpointer class_data) } static void -gst_dicetv_setup (GstVideofilter *videofilter) +gst_dicetv_setup (GstVideofilter * videofilter) { GstDiceTV *dicetv; @@ -191,12 +194,13 @@ gst_dicetv_setup (GstVideofilter *videofilter) dicetv->height = gst_videofilter_get_input_height (videofilter); g_free (dicetv->dicemap); - dicetv->dicemap = (gchar *) g_malloc (dicetv->height * dicetv->width * sizeof(char)); + dicetv->dicemap = + (gchar *) g_malloc (dicetv->height * dicetv->width * sizeof (char)); gst_dicetv_create_map (dicetv); } static void -gst_dicetv_init (GTypeInstance *instance, gpointer g_class) +gst_dicetv_init (GTypeInstance * instance, gpointer g_class) { GstDiceTV *filter = GST_DICETV (instance); @@ -208,7 +212,7 @@ gst_dicetv_init (GTypeInstance *instance, gpointer g_class) } static void -gst_dicetv_reset_handler (GstElement *element) +gst_dicetv_reset_handler (GstElement * element) { GstDiceTV *filter = GST_DICETV (element); @@ -217,14 +221,14 @@ gst_dicetv_reset_handler (GstElement *element) static unsigned int fastrand (void) -{ +{ static unsigned int fastrand_val; return (fastrand_val = fastrand_val * 1103515245 + 12345); } -static void -gst_dicetv_draw (GstVideofilter *videofilter, void *d, void *s) +static void +gst_dicetv_draw (GstVideofilter * videofilter, void *d, void *s) { GstDiceTV *filter; guint32 *src; @@ -236,10 +240,10 @@ gst_dicetv_draw (GstVideofilter *videofilter, void *d, void *s) gint video_width = filter->width; gint g_cube_bits = filter->g_cube_bits; gint g_cube_size = filter->g_cube_size; - + filter = GST_DICETV (videofilter); - src = (guint32 *)s; - dest = (guint32 *)d; + src = (guint32 *) s; + dest = (guint32 *) d; video_width = filter->width; g_cube_bits = filter->g_cube_bits; @@ -248,64 +252,64 @@ gst_dicetv_draw (GstVideofilter *videofilter, void *d, void *s) map_i = 0; for (map_y = 0; map_y < filter->g_map_height; map_y++) { for (map_x = 0; map_x < filter->g_map_width; map_x++) { - base = (map_y << g_cube_bits) * video_width + (map_x << g_cube_bits); - - switch (filter->dicemap[map_i]) { - case DICE_UP: - for (dy = 0; dy < g_cube_size; dy++) { - i = base + dy * video_width; - for (dx = 0; dx < g_cube_size; dx++) { - dest[i] = src[i]; - i++; - } - } - break; - case DICE_LEFT: - for (dy = 0; dy < g_cube_size; dy++) { - i = base + dy * video_width; - - for (dx = 0; dx < g_cube_size; dx++) { - di = base + (dx * video_width) + (g_cube_size - dy - 1); - dest[di] = src[i]; - i++; - } - } - break; - case DICE_DOWN: - for (dy = 0; dy < g_cube_size; dy++) { - di = base + dy * video_width; - i = base + (g_cube_size - dy - 1) * video_width + g_cube_size; - for (dx = 0; dx < g_cube_size; dx++) { - i--; - dest[di] = src[i]; - di++; - } - } - break; - case DICE_RIGHT: - for (dy = 0; dy < g_cube_size; dy++) { - i = base + (dy * video_width); - for (dx = 0; dx < g_cube_size; dx++) { - di = base + dy + (g_cube_size - dx - 1) * video_width; - dest[di] = src[i]; - i++; - } - } - break; - default: - g_assert_not_reached (); - break; + base = (map_y << g_cube_bits) * video_width + (map_x << g_cube_bits); + + switch (filter->dicemap[map_i]) { + case DICE_UP: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + dy * video_width; + for (dx = 0; dx < g_cube_size; dx++) { + dest[i] = src[i]; + i++; + } + } + break; + case DICE_LEFT: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + dy * video_width; + + for (dx = 0; dx < g_cube_size; dx++) { + di = base + (dx * video_width) + (g_cube_size - dy - 1); + dest[di] = src[i]; + i++; + } + } + break; + case DICE_DOWN: + for (dy = 0; dy < g_cube_size; dy++) { + di = base + dy * video_width; + i = base + (g_cube_size - dy - 1) * video_width + g_cube_size; + for (dx = 0; dx < g_cube_size; dx++) { + i--; + dest[di] = src[i]; + di++; + } + } + break; + case DICE_RIGHT: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + (dy * video_width); + for (dx = 0; dx < g_cube_size; dx++) { + di = base + dy + (g_cube_size - dx - 1) * video_width; + dest[di] = src[i]; + i++; + } + } + break; + default: + g_assert_not_reached (); + break; } map_i++; } } } -static void -gst_dicetv_create_map (GstDiceTV *filter) +static void +gst_dicetv_create_map (GstDiceTV * filter) { gint x, y, i; - + filter->g_map_height = filter->height >> filter->g_cube_bits; filter->g_map_width = filter->width >> filter->g_cube_bits; filter->g_cube_size = 1 << filter->g_cube_bits; @@ -313,16 +317,17 @@ gst_dicetv_create_map (GstDiceTV *filter) i = 0; for (y = 0; y < filter->g_map_height; y++) { - for(x = 0; x < filter->g_map_width; x++) { + for (x = 0; x < filter->g_map_width; x++) { // dicemap[i] = ((i + y) & 0x3); /* Up, Down, Left or Right */ - filter->dicemap[i] = (fastrand() >> 24) & 0x03; + filter->dicemap[i] = (fastrand () >> 24) & 0x03; i++; } } } static void -gst_dicetv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_dicetv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstDiceTV *filter; @@ -341,7 +346,8 @@ gst_dicetv_set_property (GObject * object, guint prop_id, const GValue * value, } static void -gst_dicetv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_dicetv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstDiceTV *filter; diff --git a/gst/effectv/gstedge.c b/gst/effectv/gstedge.c index 26bf2696..1e9002bf 100644 --- a/gst/effectv/gstedge.c +++ b/gst/effectv/gstedge.c @@ -69,27 +69,28 @@ enum ARG_0, }; -static void gst_edgetv_base_init (gpointer g_class); -static void gst_edgetv_class_init (gpointer g_class, gpointer class_data); -static void gst_edgetv_init (GTypeInstance *instance, gpointer g_class); +static void gst_edgetv_base_init (gpointer g_class); +static void gst_edgetv_class_init (gpointer g_class, gpointer class_data); +static void gst_edgetv_init (GTypeInstance * instance, gpointer g_class); -static void gst_edgetv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_edgetv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_edgetv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_edgetv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_edgetv_setup (GstVideofilter *videofilter); -static void gst_edgetv_rgb32 (GstVideofilter *videofilter, void *d, void *s); +static void gst_edgetv_setup (GstVideofilter * videofilter); +static void gst_edgetv_rgb32 (GstVideofilter * videofilter, void *d, void *s); /*static guint gst_edgetv_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_edgetv_get_type (void) +GType +gst_edgetv_get_type (void) { static GType edgetv_type = 0; if (!edgetv_type) { static const GTypeInfo edgetv_info = { - sizeof (GstEdgeTVClass), + sizeof (GstEdgeTVClass), gst_edgetv_base_init, NULL, (GClassInitFunc) gst_edgetv_class_init, @@ -100,34 +101,35 @@ GType gst_edgetv_get_type (void) (GInstanceInitFunc) gst_edgetv_init, }; - edgetv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstEdgeTV", &edgetv_info, 0); + edgetv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstEdgeTV", &edgetv_info, + 0); } return edgetv_type; } static GstVideofilterFormat gst_edgetv_formats[] = { - { "RGB ", 32, gst_edgetv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 } + {"RGB ", 32, gst_edgetv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000} }; static void gst_edgetv_base_init (gpointer g_class) { /* elementfactory information */ - static GstElementDetails gst_edgetv_details = GST_ELEMENT_DETAILS ( - "EdgeTV", - "Filter/Effect/Video", - "Apply edge detect on video", - "Wim Taymans " - ); + static GstElementDetails gst_edgetv_details = GST_ELEMENT_DETAILS ("EdgeTV", + "Filter/Effect/Video", + "Apply edge detect on video", + "Wim Taymans "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &gst_edgetv_details); - for(i=0; i < G_N_ELEMENTS(gst_edgetv_formats); i++) { - gst_videofilter_class_add_format(videofilter_class, + for (i = 0; i < G_N_ELEMENTS (gst_edgetv_formats); i++) { + gst_videofilter_class_add_format (videofilter_class, gst_edgetv_formats + i); } @@ -150,14 +152,15 @@ gst_edgetv_class_init (gpointer g_class, gpointer class_data) } static void -gst_edgetv_init (GTypeInstance *instance, gpointer g_class) +gst_edgetv_init (GTypeInstance * instance, gpointer g_class) { GstEdgeTV *edgetv = GST_EDGETV (instance); edgetv->map = NULL; } -static void gst_edgetv_setup(GstVideofilter *videofilter) +static void +gst_edgetv_setup (GstVideofilter * videofilter) { GstEdgeTV *edgetv; int width = gst_videofilter_get_input_width (videofilter); @@ -173,12 +176,15 @@ static void gst_edgetv_setup(GstVideofilter *videofilter) edgetv->video_width_margin = width % 4; g_free (edgetv->map); - edgetv->map = (guint32 *)g_malloc (edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2); - memset(edgetv->map, 0, edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2); + edgetv->map = + (guint32 *) g_malloc (edgetv->map_width * edgetv->map_height * + sizeof (guint32) * 2); + memset (edgetv->map, 0, + edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2); } -static void -gst_edgetv_rgb32 (GstVideofilter *videofilter, void *d, void *s) +static void +gst_edgetv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstEdgeTV *filter; int x, y; @@ -191,10 +197,10 @@ gst_edgetv_rgb32 (GstVideofilter *videofilter, void *d, void *s) src = (guint32 *) s; dest = (guint32 *) d; - + src += filter->width * 4 + 4; dest += filter->width * 4 + 4; - + for (y = 1; y < filter->map_height - 1; y++) { for (x = 1; x < filter->map_width - 1; x++) { @@ -272,7 +278,8 @@ gst_edgetv_rgb32 (GstVideofilter *videofilter, void *d, void *s) } static void -gst_edgetv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_edgetv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstEdgeTV *filter; @@ -288,7 +295,8 @@ gst_edgetv_set_property (GObject * object, guint prop_id, const GValue * value, } static void -gst_edgetv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_edgetv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstEdgeTV *filter; diff --git a/gst/effectv/gsteffectv.c b/gst/effectv/gsteffectv.c index 2fa1583b..71f51c55 100644 --- a/gst/effectv/gsteffectv.c +++ b/gst/effectv/gsteffectv.c @@ -31,45 +31,37 @@ #include "gsteffectv.h" -struct _elements_entry { +struct _elements_entry +{ gchar *name; - GType (*type) (void); + GType (*type) (void); }; static struct _elements_entry _elements[] = { - { "edgeTV", gst_edgetv_get_type }, - { "agingTV", gst_agingtv_get_type }, - { "diceTV", gst_dicetv_get_type }, - { "warpTV", gst_warptv_get_type }, - { "shagadelicTV", gst_shagadelictv_get_type }, - { "vertigoTV", gst_vertigotv_get_type }, - { "revTV", gst_revtv_get_type }, - { "quarkTV", gst_quarktv_get_type }, - { NULL, 0 }, + {"edgeTV", gst_edgetv_get_type}, + {"agingTV", gst_agingtv_get_type}, + {"diceTV", gst_dicetv_get_type}, + {"warpTV", gst_warptv_get_type}, + {"shagadelicTV", gst_shagadelictv_get_type}, + {"vertigoTV", gst_vertigotv_get_type}, + {"revTV", gst_revtv_get_type}, + {"quarkTV", gst_quarktv_get_type}, + {NULL, 0}, }; -GstStaticPadTemplate gst_effectv_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GstStaticPadTemplate gst_effectv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_BGRx "; " - GST_VIDEO_CAPS_RGBx - ) -); + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); GstStaticPadTemplate gst_effectv_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_BGRx "; " - GST_VIDEO_CAPS_RGBx - ) -); + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); static gboolean plugin_init (GstPlugin * plugin) @@ -81,7 +73,7 @@ plugin_init (GstPlugin * plugin) while (_elements[i].name) { if (!gst_element_register (plugin, _elements[i].name, - GST_RANK_NONE, (_elements[i].type) ())) + GST_RANK_NONE, (_elements[i].type) ())) return FALSE; i++; } @@ -89,14 +81,8 @@ plugin_init (GstPlugin * plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "effectv", - "effect plugins from the effectv project", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -); +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "effectv", + "effect plugins from the effectv project", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN); diff --git a/gst/effectv/gstquark.c b/gst/effectv/gstquark.c index 1b4a2278..42683212 100644 --- a/gst/effectv/gstquark.c +++ b/gst/effectv/gstquark.c @@ -66,12 +66,10 @@ struct _GstQuarkTVClass }; /* elementfactory information */ -static GstElementDetails gst_quarktv_details = GST_ELEMENT_DETAILS ( - "QuarkTV", - "Filter/Effect/Video", - "Motion dissolver", - "FUKUCHI, Kentarou " -); +static GstElementDetails gst_quarktv_details = GST_ELEMENT_DETAILS ("QuarkTV", + "Filter/Effect/Video", + "Motion dissolver", + "FUKUCHI, Kentarou "); /* Filter signals and args */ enum @@ -86,21 +84,21 @@ enum ARG_PLANES, }; -static void gst_quarktv_base_init (gpointer g_class); -static void gst_quarktv_class_init (GstQuarkTVClass * klass); -static void gst_quarktv_init (GstQuarkTV * filter); +static void gst_quarktv_base_init (gpointer g_class); +static void gst_quarktv_class_init (GstQuarkTVClass * klass); +static void gst_quarktv_init (GstQuarkTV * filter); -static GstElementStateReturn - gst_quarktv_change_state (GstElement *element); - -static void gst_quarktv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_quarktv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_quarktv_change_state (GstElement * element); + +static void gst_quarktv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_quarktv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_quarktv_chain (GstPad * pad, GstData *_data); +static void gst_quarktv_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /* static guint gst_quarktv_signals[LAST_SIGNAL] = { 0 }; */ static inline guint32 @@ -111,13 +109,14 @@ fastrand (void) return (fastrand_val = fastrand_val * 1103515245 + 12345); } -GType gst_quarktv_get_type (void) +GType +gst_quarktv_get_type (void) { static GType quarktv_type = 0; if (!quarktv_type) { static const GTypeInfo quarktv_info = { - sizeof (GstQuarkTVClass), + sizeof (GstQuarkTVClass), gst_quarktv_base_init, NULL, (GClassInitFunc) gst_quarktv_class_init, @@ -128,7 +127,9 @@ GType gst_quarktv_get_type (void) (GInstanceInitFunc) gst_quarktv_init, }; - quarktv_type = g_type_register_static (GST_TYPE_ELEMENT, "GstQuarkTV", &quarktv_info, 0); + quarktv_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstQuarkTV", &quarktv_info, + 0); } return quarktv_type; } @@ -142,7 +143,7 @@ gst_quarktv_base_init (gpointer g_class) gst_static_pad_template_get (&gst_effectv_src_template)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_effectv_sink_template)); - + gst_element_class_set_details (element_class, &gst_quarktv_details); } @@ -158,9 +159,9 @@ gst_quarktv_class_init (GstQuarkTVClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PLANES, - g_param_spec_int ("planes","Planes","Number of frames in the buffer", - 1, 32, PLANES, G_PARAM_READWRITE)); - + g_param_spec_int ("planes", "Planes", "Number of frames in the buffer", + 1, 32, PLANES, G_PARAM_READWRITE)); + gobject_class->set_property = gst_quarktv_set_property; gobject_class->get_property = gst_quarktv_get_property; @@ -192,8 +193,8 @@ gst_quarktv_link (GstPad * pad, const GstCaps * caps) filter->area = filter->width * filter->height; - for(i = 0; i < filter->planes; i++) { - if (filter->planetable[i]) + for (i = 0; i < filter->planes; i++) { + if (filter->planetable[i]) gst_buffer_unref (filter->planetable[i]); filter->planetable[i] = NULL; } @@ -204,27 +205,30 @@ gst_quarktv_link (GstPad * pad, const GstCaps * caps) static void gst_quarktv_init (GstQuarkTV * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_effectv_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_effectv_sink_template), "sink"); gst_pad_set_getcaps_function (filter->sinkpad, gst_pad_proxy_getcaps); gst_pad_set_chain_function (filter->sinkpad, gst_quarktv_chain); gst_pad_set_link_function (filter->sinkpad, gst_quarktv_link); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_effectv_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_effectv_src_template), "src"); gst_pad_set_getcaps_function (filter->srcpad, gst_pad_proxy_getcaps); gst_pad_set_link_function (filter->srcpad, gst_quarktv_link); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->planes = PLANES; filter->current_plane = filter->planes - 1; - filter->planetable = (GstBuffer **) g_malloc(filter->planes * sizeof(GstBuffer *)); - memset (filter->planetable, 0, filter->planes * sizeof(GstBuffer *)); + filter->planetable = + (GstBuffer **) g_malloc (filter->planes * sizeof (GstBuffer *)); + memset (filter->planetable, 0, filter->planes * sizeof (GstBuffer *)); } static void -gst_quarktv_chain (GstPad * pad, GstData *_data) +gst_quarktv_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstQuarkTV *filter; @@ -239,35 +243,38 @@ gst_quarktv_chain (GstPad * pad, GstData *_data) area = filter->area; outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = area * sizeof(guint32); - dest = (guint32 *) GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); + GST_BUFFER_SIZE (outbuf) = area * sizeof (guint32); + dest = (guint32 *) GST_BUFFER_DATA (outbuf) = + g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - - if (filter->planetable[filter->current_plane]) + + if (filter->planetable[filter->current_plane]) gst_buffer_unref (filter->planetable[filter->current_plane]); filter->planetable[filter->current_plane] = buf; while (--area) { GstBuffer *rand; - + /* pick a random buffer */ - rand = filter->planetable[(filter->current_plane + (fastrand () >> 24)) & (filter->planes - 1)]; - - dest[area] = (rand ? ((guint32 *)GST_BUFFER_DATA (rand))[area] : 0); + rand = + filter->planetable[(filter->current_plane + + (fastrand () >> 24)) & (filter->planes - 1)]; + + dest[area] = (rand ? ((guint32 *) GST_BUFFER_DATA (rand))[area] : 0); } gst_pad_push (filter->srcpad, GST_DATA (outbuf)); filter->current_plane--; - - if (filter->current_plane < 0) + + if (filter->current_plane < 0) filter->current_plane = filter->planes - 1; } static GstElementStateReturn -gst_quarktv_change_state (GstElement *element) -{ +gst_quarktv_change_state (GstElement * element) +{ GstQuarkTV *filter = GST_QUARKTV (element); switch (GST_STATE_TRANSITION (element)) { @@ -276,9 +283,9 @@ gst_quarktv_change_state (GstElement *element) gint i; for (i = 0; i < filter->planes; i++) { - if (filter->planetable[i]) - gst_buffer_unref (filter->planetable[i]); - filter->planetable[i] = NULL; + if (filter->planetable[i]) + gst_buffer_unref (filter->planetable[i]); + filter->planetable[i] = NULL; } g_free (filter->planetable); filter->planetable = NULL; @@ -293,7 +300,8 @@ gst_quarktv_change_state (GstElement *element) static void -gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstQuarkTV *filter; @@ -304,29 +312,29 @@ gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, switch (prop_id) { case ARG_PLANES: - { - gint new_n_planes = g_value_get_int (value); - GstBuffer **new_planetable; - gint i; - - /* If the number of planes changed, copy across any existing planes */ - if (new_n_planes != filter->planes) - { - new_planetable = (GstBuffer **) g_malloc(new_n_planes * sizeof(GstBuffer *)); - - for(i = 0; (i < new_n_planes) && (i < filter->planes); i++) { - new_planetable[i] = filter->planetable[i]; - } - for(; i < filter->planes; i++) { - if (filter->planetable[i]) - gst_buffer_unref (filter->planetable[i]); - } - g_free (filter->planetable); - filter->planetable = new_planetable; - filter->current_plane = filter->planes - 1; - filter->planes = new_n_planes; - } + { + gint new_n_planes = g_value_get_int (value); + GstBuffer **new_planetable; + gint i; + + /* If the number of planes changed, copy across any existing planes */ + if (new_n_planes != filter->planes) { + new_planetable = + (GstBuffer **) g_malloc (new_n_planes * sizeof (GstBuffer *)); + + for (i = 0; (i < new_n_planes) && (i < filter->planes); i++) { + new_planetable[i] = filter->planetable[i]; + } + for (; i < filter->planes; i++) { + if (filter->planetable[i]) + gst_buffer_unref (filter->planetable[i]); + } + g_free (filter->planetable); + filter->planetable = new_planetable; + filter->current_plane = filter->planes - 1; + filter->planes = new_n_planes; } + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -335,7 +343,8 @@ gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, } static void -gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstQuarkTV *filter; diff --git a/gst/effectv/gstrev.c b/gst/effectv/gstrev.c index 33e6bf8a..32752107 100644 --- a/gst/effectv/gstrev.c +++ b/gst/effectv/gstrev.c @@ -79,7 +79,7 @@ struct _GstRevTVClass { GstVideofilterClass parent_class; - void (*reset) (GstElement *element); + void (*reset) (GstElement * element); }; /* Filter signals and args */ @@ -97,26 +97,27 @@ enum ARG_GAIN, }; -static void gst_revtv_base_init (gpointer g_class); -static void gst_revtv_class_init (gpointer g_class, gpointer class_data); -static void gst_revtv_init (GTypeInstance *instance, gpointer g_class); +static void gst_revtv_base_init (gpointer g_class); +static void gst_revtv_class_init (gpointer g_class, gpointer class_data); +static void gst_revtv_init (GTypeInstance * instance, gpointer g_class); -static void gst_revtv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_revtv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_revtv_setup (GstVideofilter *videofilter); -static void gst_revtv_rgb32 (GstVideofilter *videofilter, void *d, void *s); +static void gst_revtv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_revtv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_revtv_setup (GstVideofilter * videofilter); +static void gst_revtv_rgb32 (GstVideofilter * videofilter, void *d, void *s); /* static guint gst_revtv_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_revtv_get_type (void) +GType +gst_revtv_get_type (void) { static GType revtv_type = 0; if (!revtv_type) { static const GTypeInfo revtv_info = { - sizeof (GstRevTVClass), + sizeof (GstRevTVClass), gst_revtv_base_init, NULL, (GClassInitFunc) gst_revtv_class_init, @@ -127,35 +128,35 @@ GType gst_revtv_get_type (void) (GInstanceInitFunc) gst_revtv_init, }; - revtv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstRevTV", &revtv_info, 0); + revtv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstRevTV", &revtv_info, + 0); } return revtv_type; } static GstVideofilterFormat gst_revtv_formats[] = { - { "RGB ", 32, gst_revtv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 } + {"RGB ", 32, gst_revtv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000} }; static void gst_revtv_base_init (gpointer g_class) { /* elementfactory information */ - static GstElementDetails gst_revtv_details = GST_ELEMENT_DETAILS ( - "RevTV", - "Filter/Effect/Video", - "A video waveform monitor for each line of video processed", - "Wim Taymans " - ); + static GstElementDetails gst_revtv_details = GST_ELEMENT_DETAILS ("RevTV", + "Filter/Effect/Video", + "A video waveform monitor for each line of video processed", + "Wim Taymans "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &gst_revtv_details); - for(i=0; i < G_N_ELEMENTS(gst_revtv_formats); i++) { - gst_videofilter_class_add_format(videofilter_class, - gst_revtv_formats + i); + for (i = 0; i < G_N_ELEMENTS (gst_revtv_formats); i++) { + gst_videofilter_class_add_format (videofilter_class, gst_revtv_formats + i); } gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class)); @@ -171,14 +172,14 @@ gst_revtv_class_init (gpointer klass, gpointer class_data) videofilter_class = GST_VIDEOFILTER_CLASS (klass); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELAY, - g_param_spec_int ("delay","Delay","Delay in frames between updates", - 1, 100, 1, G_PARAM_READWRITE)); + g_param_spec_int ("delay", "Delay", "Delay in frames between updates", + 1, 100, 1, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LINESPACE, - g_param_spec_int ("linespace","Linespace","Control line spacing", - 1, 100, 6, G_PARAM_READWRITE)); + g_param_spec_int ("linespace", "Linespace", "Control line spacing", + 1, 100, 6, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAIN, - g_param_spec_int ("gain","Gain","Control gain", - 1, 200, 50, G_PARAM_READWRITE)); + g_param_spec_int ("gain", "Gain", "Control gain", + 1, 200, 50, G_PARAM_READWRITE)); gobject_class->set_property = gst_revtv_set_property; gobject_class->get_property = gst_revtv_get_property; @@ -187,7 +188,7 @@ gst_revtv_class_init (gpointer klass, gpointer class_data) } static void -gst_revtv_init (GTypeInstance *instance, gpointer g_class) +gst_revtv_init (GTypeInstance * instance, gpointer g_class) { GstRevTV *restv = GST_REVTV (instance); @@ -198,7 +199,7 @@ gst_revtv_init (GTypeInstance *instance, gpointer g_class) } static void -gst_revtv_setup (GstVideofilter *videofilter) +gst_revtv_setup (GstVideofilter * videofilter) { GstRevTV *revtv; @@ -210,7 +211,7 @@ gst_revtv_setup (GstVideofilter *videofilter) } static void -gst_revtv_rgb32 (GstVideofilter *videofilter, void *d, void *s) +gst_revtv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstRevTV *filter; guint32 *src, *dest; @@ -227,29 +228,30 @@ gst_revtv_rgb32 (GstVideofilter *videofilter, void *d, void *s) height = filter->height; /* Clear everything to black */ - memset (dest, 0, width*height*sizeof(guint32)); + memset (dest, 0, width * height * sizeof (guint32)); // draw the offset lines - for (y = 0; y < height ; y += filter->linespace){ + for (y = 0; y < height; y += filter->linespace) { for (x = 0; x <= width; x++) { nsrc = src + (y * width) + x; // Calc Y Value for curpix R = ((*nsrc) & 0xff0000) >> (16 - 1); G = ((*nsrc) & 0xff00) >> (8 - 2); - B = (*nsrc) & 0xff; + B = (*nsrc) & 0xff; - yval = y - ((short) (R + G + B) / filter->vscale) ; + yval = y - ((short) (R + G + B) / filter->vscale); if (yval > 0) { - dest[x + (yval * width)] = THE_COLOR; + dest[x + (yval * width)] = THE_COLOR; } } } } static void -gst_revtv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_revtv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstRevTV *filter; @@ -274,7 +276,8 @@ gst_revtv_set_property (GObject * object, guint prop_id, const GValue * value, G } static void -gst_revtv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_revtv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRevTV *filter; diff --git a/gst/effectv/gstshagadelic.c b/gst/effectv/gstshagadelic.c index 790649d5..345f2762 100644 --- a/gst/effectv/gstshagadelic.c +++ b/gst/effectv/gstshagadelic.c @@ -20,7 +20,7 @@ * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. - */ + */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -76,28 +76,30 @@ enum ARG_0, }; -static void gst_shagadelictv_base_init (gpointer g_class); -static void gst_shagadelictv_class_init (gpointer g_class, gpointer class_data); -static void gst_shagadelictv_init (GTypeInstance *instance, gpointer g_class); +static void gst_shagadelictv_base_init (gpointer g_class); +static void gst_shagadelictv_class_init (gpointer g_class, gpointer class_data); +static void gst_shagadelictv_init (GTypeInstance * instance, gpointer g_class); -static void gst_shagadelic_initialize (GstShagadelicTV *filter); +static void gst_shagadelic_initialize (GstShagadelicTV * filter); -static void gst_shagadelictv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_shagadelictv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_shagadelictv_setup (GstVideofilter *videofilter); -static void gst_shagadelictv_rgb32 (GstVideofilter *videofilter, void *d, void *s); +static void gst_shagadelictv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_shagadelictv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_shagadelictv_setup (GstVideofilter * videofilter); +static void gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d, + void *s); /*static guint gst_shagadelictv_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_shagadelictv_get_type (void) +GType +gst_shagadelictv_get_type (void) { static GType shagadelictv_type = 0; if (!shagadelictv_type) { static const GTypeInfo shagadelictv_info = { - sizeof (GstShagadelicTVClass), + sizeof (GstShagadelicTVClass), gst_shagadelictv_base_init, NULL, (GClassInitFunc) gst_shagadelictv_class_init, @@ -108,34 +110,36 @@ GType gst_shagadelictv_get_type (void) (GInstanceInitFunc) gst_shagadelictv_init, }; - shagadelictv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstShagadelicTV", &shagadelictv_info, 0); + shagadelictv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstShagadelicTV", + &shagadelictv_info, 0); } return shagadelictv_type; } static GstVideofilterFormat gst_shagadelictv_formats[] = { - { "RGB ", 32, gst_shagadelictv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 } + {"RGB ", 32, gst_shagadelictv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000} }; - + static void gst_shagadelictv_base_init (gpointer g_class) { /* elementfactory information */ - static GstElementDetails gst_shagadelictv_details = GST_ELEMENT_DETAILS ( - "ShagadelicTV", - "Filter/Effect/Video", - "Oh behave, ShagedelicTV makes images shagadelic!", - "Wim Taymans " - ); + static GstElementDetails gst_shagadelictv_details = + GST_ELEMENT_DETAILS ("ShagadelicTV", + "Filter/Effect/Video", + "Oh behave, ShagedelicTV makes images shagadelic!", + "Wim Taymans "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &gst_shagadelictv_details); - for(i=0;ispiral = NULL; } -static void -gst_shagadelictv_setup(GstVideofilter *videofilter) +static void +gst_shagadelictv_setup (GstVideofilter * videofilter) { GstShagadelicTV *filter; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); int area; g_return_if_fail (GST_IS_SHAGADELICTV (videofilter)); @@ -193,16 +197,17 @@ gst_shagadelictv_setup(GstVideofilter *videofilter) static unsigned int fastrand (void) -{ +{ static unsigned int fastrand_val; return (fastrand_val = fastrand_val * 1103515245 + 12345); } static void -gst_shagadelic_initialize (GstShagadelicTV *filter) +gst_shagadelic_initialize (GstShagadelicTV * filter) { int i, x, y; + #ifdef PS2 float xx, yy; #else @@ -210,32 +215,35 @@ gst_shagadelic_initialize (GstShagadelicTV *filter) #endif i = 0; - for(y = 0; y < filter->height * 2; y++) { + for (y = 0; y < filter->height * 2; y++) { yy = y - filter->height; yy *= yy; for (x = 0; x < filter->width * 2; x++) { xx = x - filter->width; #ifdef PS2 - filter->ripple[i++] = ((unsigned int)(sqrtf(xx*xx+yy)*8))&255; + filter->ripple[i++] = ((unsigned int) (sqrtf (xx * xx + yy) * 8)) & 255; #else - filter->ripple[i++] = ((unsigned int)(sqrt(xx*xx+yy)*8))&255; + filter->ripple[i++] = ((unsigned int) (sqrt (xx * xx + yy) * 8)) & 255; #endif } } i = 0; for (y = 0; y < filter->height; y++) { - yy = y - filter->height/2; - + yy = y - filter->height / 2; + for (x = 0; x < filter->width; x++) { - xx = x - filter->width/2; + xx = x - filter->width / 2; #ifdef PS2 filter->spiral[i++] = ((unsigned int) - ((atan2f(xx, yy)/((float)M_PI)*256*9) + (sqrtf(xx*xx+yy*yy)*5)))&255; + ((atan2f (xx, + yy) / ((float) M_PI) * 256 * 9) + (sqrtf (xx * xx + + yy * yy) * 5))) & 255; #else filter->spiral[i++] = ((unsigned int) - ((atan2(xx, yy)/M_PI*256*9) + (sqrt(xx*xx+yy*yy)*5)))&255; + ((atan2 (xx, yy) / M_PI * 256 * 9) + (sqrt (xx * xx + + yy * yy) * 5))) & 255; #endif /* Here is another Swinger! * ((atan2(xx, yy)/M_PI*256) + (sqrt(xx*xx+yy*yy)*10))&255; @@ -254,7 +262,7 @@ gst_shagadelic_initialize (GstShagadelicTV *filter) } static void -gst_shagadelictv_rgb32 (GstVideofilter *videofilter, void *d, void *s) +gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstShagadelicTV *filter; guint32 *src, *dest; @@ -280,18 +288,24 @@ gst_shagadelictv_rgb32 (GstVideofilter *videofilter, void *d, void *s) * v = *src++; * *dest++ = v & ((r<<16)|(g<<8)|b); */ - r = (gchar) (filter->ripple[(filter->ry + y) * width * 2 + filter->rx + x] + filter->phase * 2) >> 7; + r = (gchar) (filter->ripple[(filter->ry + y) * width * 2 + filter->rx + + x] + filter->phase * 2) >> 7; g = (gchar) (filter->spiral[y * width + x] + filter->phase * 3) >> 7; - b = (gchar) (filter->ripple[(filter->by + y) * width * 2 + filter->bx + x] - filter->phase) >> 7; + b = (gchar) (filter->ripple[(filter->by + y) * width * 2 + filter->bx + + x] - filter->phase) >> 7; *dest++ = v & ((r << 16) | (g << 8) | b); } } filter->phase -= 8; - if ((filter->rx + filter->rvx) < 0 || (filter->rx + filter->rvx) >= width) filter->rvx =- filter->rvx; - if ((filter->ry + filter->rvy) < 0 || (filter->ry + filter->rvy) >= height) filter->rvy =- filter->rvy; - if ((filter->bx + filter->bvx) < 0 || (filter->bx + filter->bvx) >= width) filter->bvx =- filter->bvx; - if ((filter->by + filter->bvy) < 0 || (filter->by + filter->bvy) >= height) filter->bvy =- filter->bvy; + if ((filter->rx + filter->rvx) < 0 || (filter->rx + filter->rvx) >= width) + filter->rvx = -filter->rvx; + if ((filter->ry + filter->rvy) < 0 || (filter->ry + filter->rvy) >= height) + filter->rvy = -filter->rvy; + if ((filter->bx + filter->bvx) < 0 || (filter->bx + filter->bvx) >= width) + filter->bvx = -filter->bvx; + if ((filter->by + filter->bvy) < 0 || (filter->by + filter->bvy) >= height) + filter->bvy = -filter->bvy; filter->rx += filter->rvx; filter->ry += filter->rvy; filter->bx += filter->bvx; @@ -299,7 +313,8 @@ gst_shagadelictv_rgb32 (GstVideofilter *videofilter, void *d, void *s) } static void -gst_shagadelictv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_shagadelictv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstShagadelicTV *filter; @@ -315,7 +330,8 @@ gst_shagadelictv_set_property (GObject * object, guint prop_id, const GValue * v } static void -gst_shagadelictv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_shagadelictv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstShagadelicTV *filter; diff --git a/gst/effectv/gstvertigo.c b/gst/effectv/gstvertigo.c index 06e795ea..6faa8cb2 100644 --- a/gst/effectv/gstvertigo.c +++ b/gst/effectv/gstvertigo.c @@ -19,8 +19,8 @@ * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. - */ - + */ + #ifdef HAVE_CONFIG_H #include "config.h" @@ -62,7 +62,7 @@ struct _GstVertigoTVClass { GstVideofilterClass parent_class; - void (*reset) (GstElement *element); + void (*reset) (GstElement * element); }; /* Filter signals and args */ @@ -80,28 +80,31 @@ enum ARG_ZOOM_SPEED, }; -static void gst_vertigotv_base_init (gpointer g_class); -static void gst_vertigotv_class_init (GstVertigoTVClass * klass, gpointer class_data); -static void gst_vertigotv_init (GTypeInstance *instance, gpointer g_class); -static void gst_vertigotv_setup (GstVideofilter *videofilter); +static void gst_vertigotv_base_init (gpointer g_class); +static void gst_vertigotv_class_init (GstVertigoTVClass * klass, + gpointer class_data); +static void gst_vertigotv_init (GTypeInstance * instance, gpointer g_class); +static void gst_vertigotv_setup (GstVideofilter * videofilter); -static void gst_vertigotv_reset_handler (GstElement *element); +static void gst_vertigotv_reset_handler (GstElement * element); -static void gst_vertigotv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_vertigotv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_vertigotv_rgb32 (GstVideofilter *videofilter, void *d, void *s); +static void gst_vertigotv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_vertigotv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_vertigotv_rgb32 (GstVideofilter * videofilter, void *d, + void *s); static guint gst_vertigotv_signals[LAST_SIGNAL] = { 0 }; -GType gst_vertigotv_get_type (void) +GType +gst_vertigotv_get_type (void) { static GType vertigotv_type = 0; if (!vertigotv_type) { static const GTypeInfo vertigotv_info = { - sizeof (GstVertigoTVClass), + sizeof (GstVertigoTVClass), gst_vertigotv_base_init, NULL, (GClassInitFunc) gst_vertigotv_class_init, @@ -112,33 +115,34 @@ GType gst_vertigotv_get_type (void) (GInstanceInitFunc) gst_vertigotv_init, }; - vertigotv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstVertigoTV", &vertigotv_info, 0); + vertigotv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstVertigoTV", + &vertigotv_info, 0); } return vertigotv_type; } static GstVideofilterFormat gst_vertigotv_formats[] = { - { "RGB ", 32, gst_vertigotv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 } + {"RGB ", 32, gst_vertigotv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000} }; static void gst_vertigotv_base_init (gpointer g_class) { /* elementfactory information */ - static GstElementDetails vertigotv_details = GST_ELEMENT_DETAILS ( - "VertigoTV", - "Filter/Effect/Video", - "A loopback alpha blending effector with rotating and scaling", - "Wim Taymans " - ); + static GstElementDetails vertigotv_details = GST_ELEMENT_DETAILS ("VertigoTV", + "Filter/Effect/Video", + "A loopback alpha blending effector with rotating and scaling", + "Wim Taymans "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &vertigotv_details); - for(i=0;ireset = gst_vertigotv_reset_handler; - + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SPEED, - g_param_spec_float ("speed","Speed","Control the speed of movement", - 0.01, 100.0, 0.02, G_PARAM_READWRITE)); + g_param_spec_float ("speed", "Speed", "Control the speed of movement", + 0.01, 100.0, 0.02, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ZOOM_SPEED, - g_param_spec_float ("zoom_speed","Zoom Speed","Control the rate of zooming", - 1.01, 1.1, 1.01, G_PARAM_READWRITE)); + g_param_spec_float ("zoom_speed", "Zoom Speed", + "Control the rate of zooming", 1.01, 1.1, 1.01, G_PARAM_READWRITE)); gobject_class->set_property = gst_vertigotv_set_property; gobject_class->get_property = gst_vertigotv_get_property; @@ -181,7 +183,7 @@ gst_vertigotv_class_init (GstVertigoTVClass * klass, gpointer class_data) } static void -gst_vertigotv_reset_handler (GstElement *element) +gst_vertigotv_reset_handler (GstElement * element) { GstVertigoTV *filter = GST_VERTIGOTV (element); @@ -190,16 +192,16 @@ gst_vertigotv_reset_handler (GstElement *element) filter->zoomrate = 1.01; } -static void -gst_vertigotv_setup(GstVideofilter *videofilter) +static void +gst_vertigotv_setup (GstVideofilter * videofilter) { GstVertigoTV *filter; gint area; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); - g_return_if_fail(GST_IS_VERTIGOTV(videofilter)); - filter = GST_VERTIGOTV(videofilter); + g_return_if_fail (GST_IS_VERTIGOTV (videofilter)); + filter = GST_VERTIGOTV (videofilter); filter->width = width; filter->height = height; @@ -207,16 +209,16 @@ gst_vertigotv_setup(GstVideofilter *videofilter) area = width * height; g_free (filter->buffer); - filter->buffer = (guint32 *) g_malloc (area * 2 * sizeof(guint32)); + filter->buffer = (guint32 *) g_malloc (area * 2 * sizeof (guint32)); - memset (filter->buffer, 0, area * 2 * sizeof(guint32)); + memset (filter->buffer, 0, area * 2 * sizeof (guint32)); filter->current_buffer = filter->buffer; filter->alt_buffer = filter->buffer + area; filter->phase = 0; } static void -gst_vertigotv_init (GTypeInstance *instance, gpointer g_class) +gst_vertigotv_init (GTypeInstance * instance, gpointer g_class) { GstVertigoTV *filter = GST_VERTIGOTV (instance); @@ -226,36 +228,40 @@ gst_vertigotv_init (GTypeInstance *instance, gpointer g_class) filter->zoomrate = 1.01; } -static void -gst_vertigotv_set_parms (GstVertigoTV *filter) +static void +gst_vertigotv_set_parms (GstVertigoTV * filter) { double vx, vy; double t; double x, y; double dizz; - dizz = sin (filter->phase) * 10 + sin (filter->phase*1.9+5) * 5; + dizz = sin (filter->phase) * 10 + sin (filter->phase * 1.9 + 5) * 5; x = filter->width / 2; y = filter->height / 2; - t = (x*x + y*y) * filter->zoomrate; + t = (x * x + y * y) * filter->zoomrate; if (filter->width > filter->height) { if (dizz >= 0) { - if (dizz > x) dizz = x; - vx = (x * (x - dizz) + y * y) / t; + if (dizz > x) + dizz = x; + vx = (x * (x - dizz) + y * y) / t; } else { - if (dizz < -x) dizz = -x; + if (dizz < -x) + dizz = -x; vx = (x * (x + dizz) + y * y) / t; } vy = (dizz * y) / t; } else { if (dizz >= 0) { - if (dizz > y) dizz = y; + if (dizz > y) + dizz = y; vx = (x * x + y * (y - dizz)) / t; } else { - if (dizz < -y) dizz = -y; + if (dizz < -y) + dizz = -y; vx = (x * x + y * (y + dizz)) / t; } vy = (dizz * x) / t; @@ -266,11 +272,12 @@ gst_vertigotv_set_parms (GstVertigoTV *filter) filter->sy = (-vx * y - vy * x + y + sin (filter->phase * 6) * 2) * 65536; filter->phase += filter->phase_increment; - if (filter->phase > 5700000) filter->phase = 0; + if (filter->phase > 5700000) + filter->phase = 0; } - -static void -gst_vertigotv_rgb32 (GstVideofilter *videofilter, void *d, void *s) + +static void +gst_vertigotv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstVertigoTV *filter; guint32 *src, *dest; @@ -299,12 +306,14 @@ gst_vertigotv_rgb32 (GstVideofilter *videofilter, void *d, void *s) for (x = width; x > 0; x--) { i = (oy >> 16) * width + (ox >> 16); - if (i < 0) i = 0; - if (i >= area) i = area; - + if (i < 0) + i = 0; + if (i >= area) + i = area; + v = filter->current_buffer[i] & 0xfcfcff; v = (v * 3) + ((*src++) & 0xfcfcff); - + *p++ = (v >> 2); ox += filter->dx; oy += filter->dy; @@ -313,7 +322,7 @@ gst_vertigotv_rgb32 (GstVideofilter *videofilter, void *d, void *s) filter->sy += filter->dx; } - memcpy(dest, filter->alt_buffer, area * sizeof(guint32)); + memcpy (dest, filter->alt_buffer, area * sizeof (guint32)); p = filter->current_buffer; filter->current_buffer = filter->alt_buffer; @@ -321,7 +330,8 @@ gst_vertigotv_rgb32 (GstVideofilter *videofilter, void *d, void *s) } static void -gst_vertigotv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_vertigotv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVertigoTV *filter; @@ -343,7 +353,8 @@ gst_vertigotv_set_property (GObject * object, guint prop_id, const GValue * valu } static void -gst_vertigotv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_vertigotv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVertigoTV *filter; diff --git a/gst/effectv/gstwarp.c b/gst/effectv/gstwarp.c index 82c24ddd..4eb81a65 100644 --- a/gst/effectv/gstwarp.c +++ b/gst/effectv/gstwarp.c @@ -62,45 +62,51 @@ typedef struct _GstWarpTV GstWarpTV; typedef struct _GstWarpTVClass GstWarpTVClass; -struct _GstWarpTV { +struct _GstWarpTV +{ GstVideofilter videofilter; gint width, height; gint *offstable; gint32 *disttable; gint32 ctable[1024]; - gint32 sintable[1024+256]; + gint32 sintable[1024 + 256]; gint tval; }; -struct _GstWarpTVClass { +struct _GstWarpTVClass +{ GstVideofilterClass parent_class; }; /* GstWarpTV signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_warptv_base_init (gpointer g_class); -static void gst_warptv_class_init (gpointer g_class, gpointer class_data); -static void gst_warptv_init (GTypeInstance *instance, gpointer g_class); +static void gst_warptv_base_init (gpointer g_class); +static void gst_warptv_class_init (gpointer g_class, gpointer class_data); +static void gst_warptv_init (GTypeInstance * instance, gpointer g_class); -static void gst_warptv_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_warptv_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_warptv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_warptv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_warptv_setup(GstVideofilter *videofilter); -static void initSinTable (GstWarpTV *filter); -static void initOffsTable (GstWarpTV *filter); -static void initDistTable (GstWarpTV *filter); -static void gst_warptv_rgb32 (GstVideofilter *videofilter, void *d, void *s); +static void gst_warptv_setup (GstVideofilter * videofilter); +static void initSinTable (GstWarpTV * filter); +static void initOffsTable (GstWarpTV * filter); +static void initDistTable (GstWarpTV * filter); +static void gst_warptv_rgb32 (GstVideofilter * videofilter, void *d, void *s); GType gst_warptv_get_type (void) @@ -109,46 +115,48 @@ gst_warptv_get_type (void) if (!warptv_type) { static const GTypeInfo warptv_info = { - sizeof(GstWarpTVClass), + sizeof (GstWarpTVClass), gst_warptv_base_init, NULL, gst_warptv_class_init, NULL, NULL, - sizeof(GstWarpTV), + sizeof (GstWarpTV), 0, gst_warptv_init, }; - warptv_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstWarpTV", &warptv_info, 0); + warptv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstWarpTV", &warptv_info, 0); } return warptv_type; } static GstVideofilterFormat gst_warptv_formats[] = { - { "RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, 0x000000ff }, - { "RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0xff000000, 0x00ff0000, 0x0000ff00 }, - { "RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, 0x00ff0000 }, - { "RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, 0xff000000 }, + {"RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, + 0x000000ff}, + {"RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0xff000000, 0x00ff0000, + 0x0000ff00}, + {"RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, + 0x00ff0000}, + {"RGB ", 32, gst_warptv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, + 0xff000000}, }; static void gst_warptv_base_init (gpointer g_class) { - static GstElementDetails warptv_details = GST_ELEMENT_DETAILS ( - "WarpTV", - "Filter/Effect/Video", - "WarpTV does realtime goo'ing of the video input", - "Sam Lantinga " - ); + static GstElementDetails warptv_details = GST_ELEMENT_DETAILS ("WarpTV", + "Filter/Effect/Video", + "WarpTV does realtime goo'ing of the video input", + "Sam Lantinga "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &warptv_details); - for(i=0;iset_property = gst_warptv_set_property; @@ -178,28 +185,29 @@ gst_warptv_class_init (gpointer g_class, gpointer class_data) } static void -gst_warptv_init (GTypeInstance *instance, gpointer g_class) +gst_warptv_init (GTypeInstance * instance, gpointer g_class) { GstWarpTV *warptv = GST_WARPTV (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_warptv_init"); + GST_DEBUG ("gst_warptv_init"); - videofilter = GST_VIDEOFILTER(warptv); + videofilter = GST_VIDEOFILTER (warptv); /* do stuff */ } static void -gst_warptv_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_warptv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstWarpTV *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_WARPTV(object)); - src = GST_WARPTV(object); + g_return_if_fail (GST_IS_WARPTV (object)); + src = GST_WARPTV (object); - GST_DEBUG("gst_warptv_set_property"); + GST_DEBUG ("gst_warptv_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: @@ -212,13 +220,14 @@ gst_warptv_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_warptv_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_warptv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstWarpTV *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_WARPTV(object)); - src = GST_WARPTV(object); + g_return_if_fail (GST_IS_WARPTV (object)); + src = GST_WARPTV (object); switch (prop_id) { #if 0 @@ -233,14 +242,15 @@ gst_warptv_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } -static void gst_warptv_setup(GstVideofilter *videofilter) +static void +gst_warptv_setup (GstVideofilter * videofilter) { GstWarpTV *warptv; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); - g_return_if_fail(GST_IS_WARPTV(videofilter)); - warptv = GST_WARPTV(videofilter); + g_return_if_fail (GST_IS_WARPTV (videofilter)); + warptv = GST_WARPTV (videofilter); /* if any setup needs to be done, do it here */ @@ -254,7 +264,7 @@ static void gst_warptv_setup(GstVideofilter *videofilter) g_free (warptv->disttable); g_free (warptv->offstable); - warptv->offstable = (guint32 *) g_malloc (height * sizeof (guint32)); + warptv->offstable = (guint32 *) g_malloc (height * sizeof (guint32)); warptv->disttable = g_malloc (width * height * sizeof (guint32)); initSinTable (warptv); @@ -262,11 +272,11 @@ static void gst_warptv_setup(GstVideofilter *videofilter) initDistTable (warptv); } -static void -initSinTable (GstWarpTV *filter) +static void +initSinTable (GstWarpTV * filter) { - gint32 *tptr, *tsinptr; - double i; + gint32 *tptr, *tsinptr; + double i; tsinptr = tptr = filter->sintable; @@ -277,35 +287,36 @@ initSinTable (GstWarpTV *filter) *tptr++ = *tsinptr++; } -static void -initOffsTable (GstWarpTV *filter) +static void +initOffsTable (GstWarpTV * filter) { int y; - + for (y = 0; y < filter->height; y++) { filter->offstable[y] = y * filter->width; } } - -static void -initDistTable (GstWarpTV *filter) + +static void +initDistTable (GstWarpTV * filter) { gint32 halfw, halfh, *distptr; + #ifdef PS2 - float x,y,m; + float x, y, m; #else - double x,y,m; + double x, y, m; #endif - halfw = filter->width>> 1; + halfw = filter->width >> 1; halfh = filter->height >> 1; distptr = filter->disttable; - m = sqrt ((double)(halfw * halfw + halfh * halfh)); + m = sqrt ((double) (halfw * halfw + halfh * halfh)); for (y = -halfh; y < halfh; y++) - for (x= -halfw; x < halfw; x++) + for (x = -halfw; x < halfw; x++) #ifdef PS2 *distptr++ = ((int) ((sqrtf (x * x + y * y) * 511.9999) / m)) << 1; #else @@ -313,34 +324,34 @@ initDistTable (GstWarpTV *filter) #endif } -static void gst_warptv_rgb32 (GstVideofilter *videofilter, - void *d, void *s) +static void +gst_warptv_rgb32 (GstVideofilter * videofilter, void *d, void *s) { GstWarpTV *warptv; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); guint32 *src = s; guint32 *dest = d; - gint xw,yw,cw; - gint32 c,i, x,y, dx,dy, maxx, maxy; + gint xw, yw, cw; + gint32 c, i, x, y, dx, dy, maxx, maxy; gint32 skip, *ctptr, *distptr; gint32 *sintable, *ctable; - g_return_if_fail(GST_IS_WARPTV(videofilter)); - warptv = GST_WARPTV(videofilter); + g_return_if_fail (GST_IS_WARPTV (videofilter)); + warptv = GST_WARPTV (videofilter); - xw = (gint) (sin ((warptv->tval + 100) * M_PI / 128) * 30); - yw = (gint) (sin ((warptv->tval) * M_PI / 256) * -35); - cw = (gint) (sin ((warptv->tval - 70) * M_PI / 64) * 50); + xw = (gint) (sin ((warptv->tval + 100) * M_PI / 128) * 30); + yw = (gint) (sin ((warptv->tval) * M_PI / 256) * -35); + cw = (gint) (sin ((warptv->tval - 70) * M_PI / 64) * 50); xw += (gint) (sin ((warptv->tval - 10) * M_PI / 512) * 40); - yw += (gint) (sin ((warptv->tval + 30) * M_PI / 512) * 40); + yw += (gint) (sin ((warptv->tval + 30) * M_PI / 512) * 40); ctptr = warptv->ctable; distptr = warptv->disttable; sintable = warptv->sintable; ctable = warptv->ctable; - skip = 0 ; /* video_width*sizeof(RGB32)/4 - video_width;; */ + skip = 0; /* video_width*sizeof(RGB32)/4 - video_width;; */ c = 0; for (x = 0; x < 512; x++) { @@ -349,24 +360,28 @@ static void gst_warptv_rgb32 (GstVideofilter *videofilter, *ctptr++ = ((sintable[i + 256] * xw) >> 15); c += cw; } - maxx = width - 2; maxy = height - 2; + maxx = width - 2; + maxy = height - 2; for (y = 0; y < height - 1; y++) { for (x = 0; x < width; x++) { - i = *distptr++; - dx = ctable [i + 1] + x; - dy = ctable [i] + y; - - if (dx < 0) dx = 0; - else if (dx > maxx) dx = maxx; - - if (dy < 0) dy = 0; - else if (dy > maxy) dy = maxy; - *dest++ = src[warptv->offstable[dy] + dx]; + i = *distptr++; + dx = ctable[i + 1] + x; + dy = ctable[i] + y; + + if (dx < 0) + dx = 0; + else if (dx > maxx) + dx = maxx; + + if (dy < 0) + dy = 0; + else if (dy > maxy) + dy = maxy; + *dest++ = src[warptv->offstable[dy] + dx]; } dest += skip; } warptv->tval = (warptv->tval + 1) & 511; } - diff --git a/gst/flx/flx_color.c b/gst/flx/flx_color.c index b64c90c4..73846845 100644 --- a/gst/flx/flx_color.c +++ b/gst/flx/flx_color.c @@ -27,40 +27,41 @@ #include "flx_color.h" FlxColorSpaceConverter * -flx_colorspace_converter_new(gint width, gint height) +flx_colorspace_converter_new (gint width, gint height) { - FlxColorSpaceConverter *new = g_malloc(sizeof(FlxColorSpaceConverter)); + FlxColorSpaceConverter *new = g_malloc (sizeof (FlxColorSpaceConverter)); new->width = width; new->height = height; - memset(new->palvec, 0, sizeof(new->palvec)); + memset (new->palvec, 0, sizeof (new->palvec)); return new; } void -flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal) +flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal) { - g_return_if_fail(flxpal != NULL); + g_return_if_fail (flxpal != NULL); - g_free(flxpal); + g_free (flxpal); } void -flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest) +flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, + guchar * dest) { guint size, col; - g_return_if_fail(flxpal != NULL); - g_return_if_fail(src != dest); + g_return_if_fail (flxpal != NULL); + g_return_if_fail (src != dest); size = flxpal->width * flxpal->height; - while(size--) { - col = (*src++ * 3); - *dest++ = flxpal->palvec[col+2]; - *dest++ = flxpal->palvec[col+1]; + while (size--) { + col = (*src++ * 3); + *dest++ = flxpal->palvec[col + 2]; + *dest++ = flxpal->palvec[col + 1]; *dest++ = flxpal->palvec[col]; *dest++ = 0; } @@ -68,13 +69,14 @@ flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest } -void -flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, guchar *newpal, gint scale) +void +flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num, + guchar * newpal, gint scale) { - guint grab; - - g_return_if_fail(flxpal != NULL); - g_return_if_fail(start < 0x100); + guint grab; + + g_return_if_fail (flxpal != NULL); + g_return_if_fail (start < 0x100); grab = ((start + num) > 0x100 ? 0x100 - start : num); @@ -88,23 +90,21 @@ flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, g flxpal->palvec[start++] = newpal[i++] << scale; grab--; } - } - else { - memcpy(&flxpal->palvec[start * 3], newpal, grab * 3); + } else { + memcpy (&flxpal->palvec[start * 3], newpal, grab * 3); } } void -flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, guint blue, gint scale) +flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, + guint green, guint blue, gint scale) { - - g_return_if_fail(flxpal != NULL); - g_return_if_fail(colr < 0x100); - flxpal->palvec[(colr * 3)] = red << scale; + g_return_if_fail (flxpal != NULL); + g_return_if_fail (colr < 0x100); + + flxpal->palvec[(colr * 3)] = red << scale; flxpal->palvec[(colr * 3) + 1] = green << scale; flxpal->palvec[(colr * 3) + 2] = blue << scale; } - - diff --git a/gst/flx/flx_color.h b/gst/flx/flx_color.h index d423ab87..2ad852fa 100644 --- a/gst/flx/flx_color.h +++ b/gst/flx/flx_color.h @@ -17,7 +17,8 @@ * Boston, MA 02111-1307, USA. */ -typedef enum { +typedef enum +{ FLX_COLORSPACE_RGB8, FLX_COLORSPACE_RGB32, } FlxColorSpaceType; @@ -25,19 +26,20 @@ typedef enum { typedef struct _FlxColorSpaceConverter FlxColorSpaceConverter; -struct _FlxColorSpaceConverter { - guint width; - guint height; - guchar palvec[768]; +struct _FlxColorSpaceConverter +{ + guint width; + guint height; + guchar palvec[768]; }; -void flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal); -void flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest); -FlxColorSpaceConverter * flx_colorspace_converter_new(gint width, gint height); - -void flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, - guchar *newpal, gint scale); -void flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, - guint blue, gint scale); +void flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal); +void flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, + guchar * dest); +FlxColorSpaceConverter *flx_colorspace_converter_new (gint width, gint height); +void flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, + guint num, guchar * newpal, gint scale); +void flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, + guint green, guint blue, gint scale); diff --git a/gst/flx/flx_fmt.h b/gst/flx/flx_fmt.h index ac2062ed..1457551a 100644 --- a/gst/flx/flx_fmt.h +++ b/gst/flx/flx_fmt.h @@ -24,113 +24,114 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -enum Flx_TypeChunk -{ - /* frame chunks */ - FLX_PREFIX_TYPE = 0xf100, - FLX_SCRIPT_CHUNK = 0xf1e0, - FLX_FRAME_TYPE = 0xf1fa, - FLX_SEGMENT_TABLE = 0xf1fb, - FLX_HUFFMAN_TABLE = 0xf1fc, - - /* sub chunks */ - FLX_CEL_DATA = 3, - FLX_COLOR256 = 4, - FLX_SS2 = 7, - FLX_COLOR64 = 11, - FLX_LC = 12, - FLX_BLACK = 13, - FLX_BRUN = 15, - FLX_COPY = 16, - FLX_MINI = 18, - FLX_DTA_RUN = 25, - FLX_DTA_COPY = 26, - FLX_DTA_LC = 27, - FLX_LABEL = 31, - FLX_BMP_MASK = 32, - FLX_MLEV_MASK = 33, - FLX_SEGMENT = 34, - FLX_KEY_IMAGE = 35, - FLX_KEY_PAL = 36, - FLX_REGION = 37, - FLX_WAVE = 38, - FLX_USERSTRING = 39, - FLX_RGN_MASK = 40, - -}; - -enum Flx_MagicHdr +extern "C" { - FLX_MAGICHDR_FLI = 0xaf11, - FLX_MAGICHDR_FLC = 0xaf12, - FLX_MAGICHDR_FLX = 0xaf44, - FLX_MAGICHDR_HUFFBWT = 0xaf30, -}; - - - -typedef struct _FlxHeader -{ - guint32 size; - guint16 type; - guint16 frames; - guint16 width,height,depth,flags; - guint32 speed; - guint16 reserved1; - /* FLC */ - guint32 created,creator,updated,updater; - guint16 aspect_dx, aspect_dy; - /* EGI */ - guint16 ext_flags,keyframes,totalframes; - guint32 req_memory; - guint16 max_regions,transp_num; - guchar reserved2[24]; - /* FLC */ - guint32 oframe1,oframe2; - guchar reserved3[40]; -} FlxHeader; +#endif /* __cplusplus */ + + enum Flx_TypeChunk + { + /* frame chunks */ + FLX_PREFIX_TYPE = 0xf100, + FLX_SCRIPT_CHUNK = 0xf1e0, + FLX_FRAME_TYPE = 0xf1fa, + FLX_SEGMENT_TABLE = 0xf1fb, + FLX_HUFFMAN_TABLE = 0xf1fc, + + /* sub chunks */ + FLX_CEL_DATA = 3, + FLX_COLOR256 = 4, + FLX_SS2 = 7, + FLX_COLOR64 = 11, + FLX_LC = 12, + FLX_BLACK = 13, + FLX_BRUN = 15, + FLX_COPY = 16, + FLX_MINI = 18, + FLX_DTA_RUN = 25, + FLX_DTA_COPY = 26, + FLX_DTA_LC = 27, + FLX_LABEL = 31, + FLX_BMP_MASK = 32, + FLX_MLEV_MASK = 33, + FLX_SEGMENT = 34, + FLX_KEY_IMAGE = 35, + FLX_KEY_PAL = 36, + FLX_REGION = 37, + FLX_WAVE = 38, + FLX_USERSTRING = 39, + FLX_RGN_MASK = 40, + + }; + + enum Flx_MagicHdr + { + FLX_MAGICHDR_FLI = 0xaf11, + FLX_MAGICHDR_FLC = 0xaf12, + FLX_MAGICHDR_FLX = 0xaf44, + FLX_MAGICHDR_HUFFBWT = 0xaf30, + }; + + + + typedef struct _FlxHeader + { + guint32 size; + guint16 type; + guint16 frames; + guint16 width, height, depth, flags; + guint32 speed; + guint16 reserved1; + /* FLC */ + guint32 created, creator, updated, updater; + guint16 aspect_dx, aspect_dy; + /* EGI */ + guint16 ext_flags, keyframes, totalframes; + guint32 req_memory; + guint16 max_regions, transp_num; + guchar reserved2[24]; + /* FLC */ + guint32 oframe1, oframe2; + guchar reserved3[40]; + } FlxHeader; #define FlxHeaderSize 128 -typedef struct _FlxFrameChunk -{ - guint32 size; - guint16 id; -} FlxFrameChunk; + typedef struct _FlxFrameChunk + { + guint32 size; + guint16 id; + } FlxFrameChunk; #define FlxFrameChunkSize 6 -typedef struct _FlxPrefixChunk -{ - guint16 chunks; - guchar reserved[8]; -} FlxPrefixChunk; - -typedef struct _FlxSegmentTable -{ - guint16 segments; -} FlxSegmentTable; - -typedef struct _FlxHuffmanTable -{ - guint16 codelength; - guint16 numcodes; - guchar reserved[6]; -} FlxHuffmanTable; - -typedef struct _FlxFrameType -{ - guint16 chunks; - guint16 delay; - guchar reserved[6]; -} FlxFrameType; + typedef struct _FlxPrefixChunk + { + guint16 chunks; + guchar reserved[8]; + } FlxPrefixChunk; + + typedef struct _FlxSegmentTable + { + guint16 segments; + } FlxSegmentTable; + + typedef struct _FlxHuffmanTable + { + guint16 codelength; + guint16 numcodes; + guchar reserved[6]; + } FlxHuffmanTable; + + typedef struct _FlxFrameType + { + guint16 chunks; + guint16 delay; + guchar reserved[6]; + } FlxFrameType; #define FlxFrameTypeSize 10 #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_FLX_FMT_H__ */ +#endif /* __GST_FLX_FMT_H__ */ diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c index aaddee58..a84ce2d2 100644 --- a/gst/flx/gstflxdec.c +++ b/gst/flx/gstflxdec.c @@ -37,120 +37,122 @@ static GstElementDetails flxdec_details = { }; /* Flx signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; /* input */ -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/x-fli" ) -); +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-fli") + ); /* output */ -static GstStaticPadTemplate src_video_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_xRGB_HOST_ENDIAN ) -); +static GstStaticPadTemplate src_video_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); -static void gst_flxdec_class_init (GstFlxDecClass *klass); -static void gst_flxdec_base_init (GstFlxDecClass *klass); -static void gst_flxdec_init (GstFlxDec *flxdec); +static void gst_flxdec_class_init (GstFlxDecClass * klass); +static void gst_flxdec_base_init (GstFlxDecClass * klass); +static void gst_flxdec_init (GstFlxDec * flxdec); -static void gst_flxdec_loop (GstElement *element); +static void gst_flxdec_loop (GstElement * element); -static GstElementStateReturn - gst_flxdec_change_state (GstElement *element); +static GstElementStateReturn gst_flxdec_change_state (GstElement * element); -static void gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_flxdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_flxdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); -static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); -static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); -static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); +static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); +static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); #define rndalign(off) ((off) + ((off) % 2)) static GstElementClass *parent_class = NULL; GType -gst_flxdec_get_type(void) +gst_flxdec_get_type (void) { static GType flxdec_type = 0; if (!flxdec_type) { static const GTypeInfo flxdec_info = { - sizeof(GstFlxDecClass), - (GBaseInitFunc)gst_flxdec_base_init, + sizeof (GstFlxDecClass), + (GBaseInitFunc) gst_flxdec_base_init, NULL, - (GClassInitFunc)gst_flxdec_class_init, + (GClassInitFunc) gst_flxdec_class_init, NULL, NULL, - sizeof(GstFlxDec), + sizeof (GstFlxDec), 0, - (GInstanceInitFunc)gst_flxdec_init, + (GInstanceInitFunc) gst_flxdec_init, }; - flxdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); + flxdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); } return flxdec_type; } static void -gst_flxdec_base_init (GstFlxDecClass *klass) +gst_flxdec_base_init (GstFlxDecClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - + gst_element_class_set_details (gstelement_class, &flxdec_details); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&sink_factory)); + gst_static_pad_template_get (&sink_factory)); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&src_video_factory)); + gst_static_pad_template_get (&src_video_factory)); } -static void -gst_flxdec_class_init (GstFlxDecClass *klass) +static void +gst_flxdec_class_init (GstFlxDecClass * 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_flxdec_set_property; + gobject_class->set_property = gst_flxdec_set_property; gobject_class->get_property = gst_flxdec_get_property; gstelement_class->change_state = gst_flxdec_change_state; } - -static void -gst_flxdec_init(GstFlxDec *flxdec) + +static void +gst_flxdec_init (GstFlxDec * flxdec) { - flxdec->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_factory), "sink"); - gst_element_add_pad(GST_ELEMENT(flxdec),flxdec->sinkpad); - gst_element_set_loop_function(GST_ELEMENT(flxdec),gst_flxdec_loop); + flxdec->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), + "sink"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->sinkpad); + gst_element_set_loop_function (GST_ELEMENT (flxdec), gst_flxdec_loop); - flxdec->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_video_factory), "src"); - gst_element_add_pad(GST_ELEMENT(flxdec),flxdec->srcpad); + flxdec->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&src_video_factory), "src"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->srcpad); flxdec->bs = NULL; flxdec->frame = NULL; @@ -158,75 +160,74 @@ gst_flxdec_init(GstFlxDec *flxdec) } static void -flx_decode_chunks (GstFlxDec *flxdec , gulong count, gchar *data, gchar *dest) +flx_decode_chunks (GstFlxDec * flxdec, gulong count, gchar * data, gchar * dest) { - FlxFrameChunk *hdr; + FlxFrameChunk *hdr; - g_return_if_fail(data != NULL); + g_return_if_fail (data != NULL); while (count--) { - hdr = (FlxFrameChunk *) data; + hdr = (FlxFrameChunk *) data; data += FlxFrameChunkSize; - switch(hdr->id) - { + switch (hdr->id) { case FLX_COLOR64: - flx_decode_color(flxdec, data, dest, 2); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_color (flxdec, data, dest, 2); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_COLOR256: - flx_decode_color(flxdec, data, dest, 0); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_color (flxdec, data, dest, 0); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_BRUN: - flx_decode_brun(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_brun (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_LC: - flx_decode_delta_fli(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_delta_fli (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_SS2: - flx_decode_delta_flc(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_delta_flc (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_BLACK: - memset(dest, 0, flxdec->size); - break; + memset (dest, 0, flxdec->size); + break; case FLX_MINI: - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; default: - g_print("GstFlxDec: Unimplented chunk type: 0x%02x size: %d\n", - hdr->id, hdr->size); - g_print("GstFlxDec: Skipping...\n"); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + g_print ("GstFlxDec: Unimplented chunk type: 0x%02x size: %d\n", + hdr->id, hdr->size); + g_print ("GstFlxDec: Skipping...\n"); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; } } } static void -flx_decode_color(GstFlxDec *flxdec, guchar *data, guchar *dest, gint scale) +flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) { guint packs, count, indx; - g_return_if_fail(flxdec != NULL); + g_return_if_fail (flxdec != NULL); packs = (data[0] + (data[1] << 8)); data += 2; - indx = 0; + indx = 0; - g_print("GstFlxDec: cmap packs: %d\n", packs); + g_print ("GstFlxDec: cmap packs: %d\n", packs); while (packs--) { /* color map index + skip count */ indx += *data++; @@ -236,23 +237,23 @@ flx_decode_color(GstFlxDec *flxdec, guchar *data, guchar *dest, gint scale) if (count == 0) count = 256; - g_print("GstFlxDec: cmap count: %d (indx: %d)\n", count, indx); - flx_set_palette_vector(flxdec->converter, indx, count, data, scale); + g_print ("GstFlxDec: cmap count: %d (indx: %d)\n", count, indx); + flx_set_palette_vector (flxdec->converter, indx, count, data, scale); data += (count * 3); } } -static void -flx_decode_brun(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, lines, row; - guchar x; - - g_return_if_fail(flxdec != NULL); + gulong count, lines, row; + guchar x; + + g_return_if_fail (flxdec != NULL); lines = flxdec->hdr.height; - while(lines--) { + while (lines--) { /* packet count. * should not be used anymore, since the flc format can * contain more then 255 RLE packets. we use the frame @@ -261,101 +262,101 @@ flx_decode_brun(GstFlxDec *flxdec, guchar *data, guchar *dest) data++; row = flxdec->hdr.width; - while(row) { + while (row) { count = *data++; - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; - row -= count; + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + row -= count; + + while (count--) + *dest++ = *data++; - while(count--) - *dest++ = *data++; - } else { - /* replicate run */ - row -= count; - x = *data++; + /* replicate run */ + row -= count; + x = *data++; - while(count--) - *dest++ = x; + while (count--) + *dest++ = x; } } } } -static void -flx_decode_delta_fli(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, packets, lines, start_line, start_l; - guchar *start_p, x; - - g_return_if_fail(flxdec != NULL); - g_return_if_fail(flxdec->delta != NULL); + gulong count, packets, lines, start_line, start_l; + guchar *start_p, x; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ - memcpy(dest, GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_SIZE(flxdec->delta)); + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); start_line = (data[0] + (data[1] << 8)); - lines = (data[2] + (data[3] << 8)); - data += 4; + lines = (data[2] + (data[3] << 8)); + data += 4; /* start position of delta */ dest += (flxdec->hdr.width * start_line); start_p = dest; start_l = lines; - while(lines--) { + while (lines--) { /* packet count */ packets = *data++; - while(packets--) { + while (packets--) { /* skip count */ dest += *data++; /* RLE count */ count = *data++; - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; - x = *data++; + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + x = *data++; - while (count--) - *dest++ = x; + while (count--) + *dest++ = x; } else { - /* replicate run */ - while (count--) - *dest++ = *data++; + /* replicate run */ + while (count--) + *dest++ = *data++; } } start_p += flxdec->hdr.width; dest = start_p; - } + } } -static void -flx_decode_delta_flc(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, lines, start_l, opcode; - guchar *start_p; - - g_return_if_fail(flxdec != NULL); - g_return_if_fail(flxdec->delta != NULL); + gulong count, lines, start_l, opcode; + guchar *start_p; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ - memcpy(dest, GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_SIZE(flxdec->delta)); + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); - lines = (data[0] + (data[1] << 8)); - data += 2; + lines = (data[0] + (data[1] << 8)); + data += 2; - start_p = dest; - start_l = lines; + start_p = dest; + start_l = lines; while (lines) { dest = start_p + (flxdec->hdr.width * (start_l - lines)); @@ -364,47 +365,47 @@ flx_decode_delta_flc(GstFlxDec *flxdec, guchar *data, guchar *dest) while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { data += 2; if ((opcode & 0xc000) == 0xc000) { - /* skip count */ - start_l += (0x10000 - opcode); - dest += flxdec->hdr.width * (0x10000 - opcode); + /* skip count */ + start_l += (0x10000 - opcode); + dest += flxdec->hdr.width * (0x10000 - opcode); } else { - /* last pixel */ - dest += flxdec->hdr.width; - *dest++ = (opcode & 0xff); - } + /* last pixel */ + dest += flxdec->hdr.width; + *dest++ = (opcode & 0xff); + } } data += 2; /* last opcode is the packet count */ - while(opcode--) { + while (opcode--) { /* skip count */ dest += *data++; - + /* RLE count */ count = *data++; - + if (count > 0x7f) { - /* replicate word run */ - count = 0x100 - count; - while (count--) { - *dest++ = data[0]; - *dest++ = data[1]; - } - data += 2; + /* replicate word run */ + count = 0x100 - count; + while (count--) { + *dest++ = data[0]; + *dest++ = data[1]; + } + data += 2; } else { - /* literal word run */ - while (count--) { - *dest++ = *data++; - *dest++ = *data++; - } + /* literal word run */ + while (count--) { + *dest++ = *data++; + *dest++ = *data++; + } } } lines--; } } - -static GstBuffer* -flx_get_data(GstFlxDec *flxdec, gulong size) + +static GstBuffer * +flx_get_data (GstFlxDec * flxdec, gulong size) { GstBuffer *retbuf; guint32 got_bytes; @@ -424,36 +425,36 @@ flx_get_data(GstFlxDec *flxdec, gulong size) } -static void -gst_flxdec_loop (GstElement *element) +static void +gst_flxdec_loop (GstElement * element) { - GstBuffer *buf; - GstBuffer *databuf; - guchar *data, *chunk; - GstCaps *caps; - - GstFlxDec *flxdec; - FlxHeader *flxh; - FlxFrameChunk *flxfh; - + GstBuffer *buf; + GstBuffer *databuf; + guchar *data, *chunk; + GstCaps *caps; + + GstFlxDec *flxdec; + FlxHeader *flxh; + FlxFrameChunk *flxfh; + g_return_if_fail (element != NULL); - g_return_if_fail (GST_IS_FLXDEC(element)); + g_return_if_fail (GST_IS_FLXDEC (element)); GST_DEBUG ("entering loop function"); - - flxdec = GST_FLXDEC(element); + + flxdec = GST_FLXDEC (element); if (flxdec->state == GST_FLXDEC_READ_HEADER) { - databuf = flx_get_data(flxdec, FlxHeaderSize); + databuf = flx_get_data (flxdec, FlxHeaderSize); if (!databuf) { g_print ("empty buffer\n"); return; } - data = GST_BUFFER_DATA(databuf); + data = GST_BUFFER_DATA (databuf); - memcpy((char *) &flxdec->hdr, data, sizeof(FlxHeader)); + memcpy ((char *) &flxdec->hdr, data, sizeof (FlxHeader)); gst_buffer_unref (databuf); @@ -461,119 +462,115 @@ gst_flxdec_loop (GstElement *element) /* check header */ if (flxh->type != FLX_MAGICHDR_FLI && - flxh->type != FLX_MAGICHDR_FLC && - flxh->type != FLX_MAGICHDR_FLX) { - GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), ("not a flx file (type %d)\n", flxh->type)); + flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) { + GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), + ("not a flx file (type %d)\n", flxh->type)); return; } - - - g_print("GstFlxDec: size : %d\n", flxh->size); - g_print("GstFlxDec: frames : %d\n", flxh->frames); - g_print("GstFlxDec: width : %d\n", flxh->width); - g_print("GstFlxDec: height : %d\n", flxh->height); - g_print("GstFlxDec: depth : %d\n", flxh->depth); - g_print("GstFlxDec: speed : %d\n", flxh->speed); + + + g_print ("GstFlxDec: size : %d\n", flxh->size); + g_print ("GstFlxDec: frames : %d\n", flxh->frames); + g_print ("GstFlxDec: width : %d\n", flxh->width); + g_print ("GstFlxDec: height : %d\n", flxh->height); + g_print ("GstFlxDec: depth : %d\n", flxh->depth); + g_print ("GstFlxDec: speed : %d\n", flxh->speed); flxdec->next_time = 0; if (flxh->type == FLX_MAGICHDR_FLI) { flxdec->frame_time = JIFFIE * flxh->speed; - } - else { + } else { flxdec->frame_time = flxh->speed * GST_MSECOND; } - + caps = gst_caps_from_string (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN); gst_caps_set_simple (caps, - "width", G_TYPE_INT, flxh->width, + "width", G_TYPE_INT, flxh->width, "height", G_TYPE_INT, flxh->height, - "framerate", G_TYPE_DOUBLE, GST_SECOND/flxdec->frame_time, NULL); + "framerate", G_TYPE_DOUBLE, GST_SECOND / flxdec->frame_time, NULL); - if (flxh->depth <= 8) - flxdec->converter = flx_colorspace_converter_new(flxh->width, flxh->height); + if (flxh->depth <= 8) + flxdec->converter = + flx_colorspace_converter_new (flxh->width, flxh->height); - if (flxh->type == FLX_MAGICHDR_FLC || - flxh->type == FLX_MAGICHDR_FLX) { - g_print("GstFlxDec: (FLC) aspect_dx : %d\n", flxh->aspect_dx); - g_print("GstFlxDec: (FLC) aspect_dy : %d\n", flxh->aspect_dy); - g_print("GstFlxDec: (FLC) oframe1 : 0x%08x\n", flxh->oframe1); - g_print("GstFlxDec: (FLC) oframe2 : 0x%08x\n", flxh->oframe2); + if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) { + g_print ("GstFlxDec: (FLC) aspect_dx : %d\n", flxh->aspect_dx); + g_print ("GstFlxDec: (FLC) aspect_dy : %d\n", flxh->aspect_dy); + g_print ("GstFlxDec: (FLC) oframe1 : 0x%08x\n", flxh->oframe1); + g_print ("GstFlxDec: (FLC) oframe2 : 0x%08x\n", flxh->oframe2); } - + flxdec->size = (flxh->width * flxh->height); - + /* create delta and output frame */ - flxdec->frame = gst_buffer_new(); - flxdec->delta = gst_buffer_new(); - GST_BUFFER_DATA(flxdec->frame) = g_malloc(flxdec->size); - GST_BUFFER_SIZE(flxdec->frame) = flxdec->size; - GST_BUFFER_DATA(flxdec->delta) = g_malloc(flxdec->size); - GST_BUFFER_SIZE(flxdec->delta) = flxdec->size; + flxdec->frame = gst_buffer_new (); + flxdec->delta = gst_buffer_new (); + GST_BUFFER_DATA (flxdec->frame) = g_malloc (flxdec->size); + GST_BUFFER_SIZE (flxdec->frame) = flxdec->size; + GST_BUFFER_DATA (flxdec->delta) = g_malloc (flxdec->size); + GST_BUFFER_SIZE (flxdec->delta) = flxdec->size; flxdec->state = GST_FLXDEC_PLAYING; - } - else if (flxdec->state == GST_FLXDEC_PLAYING) { + } else if (flxdec->state == GST_FLXDEC_PLAYING) { GstBuffer *out; - databuf = flx_get_data(flxdec, FlxFrameChunkSize); + databuf = flx_get_data (flxdec, FlxFrameChunkSize); if (!databuf) return; - flxfh = (FlxFrameChunk *) GST_BUFFER_DATA(databuf); - - switch(flxfh->id) { + flxfh = (FlxFrameChunk *) GST_BUFFER_DATA (databuf); + + switch (flxfh->id) { case FLX_FRAME_TYPE: - buf = flx_get_data(flxdec, flxfh->size-FlxFrameChunkSize); - - chunk = GST_BUFFER_DATA(buf); - - if (((FlxFrameType *)chunk)->chunks == 0) - break; - - /* create 32 bits output frame */ - out = gst_buffer_new(); - GST_BUFFER_DATA(out) = g_malloc(flxdec->size * 4); - GST_BUFFER_SIZE(out) = flxdec->size * 4; - - /* decode chunks */ - flx_decode_chunks(flxdec, - ((FlxFrameType *)chunk)->chunks, - GST_BUFFER_DATA(buf) + FlxFrameTypeSize, - GST_BUFFER_DATA(flxdec->frame)); - - /* destroy input buffer*/ - gst_buffer_unref(buf); - - /* save copy of the current frame for possible delta. */ - memcpy(GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_DATA(flxdec->frame), - GST_BUFFER_SIZE(flxdec->delta)); - - /* convert current frame. */ - flx_colorspace_convert(flxdec->converter, - GST_BUFFER_DATA(flxdec->frame), - GST_BUFFER_DATA(out)); + buf = flx_get_data (flxdec, flxfh->size - FlxFrameChunkSize); + + chunk = GST_BUFFER_DATA (buf); + + if (((FlxFrameType *) chunk)->chunks == 0) + break; + + /* create 32 bits output frame */ + out = gst_buffer_new (); + GST_BUFFER_DATA (out) = g_malloc (flxdec->size * 4); + GST_BUFFER_SIZE (out) = flxdec->size * 4; + + /* decode chunks */ + flx_decode_chunks (flxdec, + ((FlxFrameType *) chunk)->chunks, + GST_BUFFER_DATA (buf) + FlxFrameTypeSize, + GST_BUFFER_DATA (flxdec->frame)); + + /* destroy input buffer */ + gst_buffer_unref (buf); + + /* save copy of the current frame for possible delta. */ + memcpy (GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_SIZE (flxdec->delta)); + + /* convert current frame. */ + flx_colorspace_convert (flxdec->converter, + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_DATA (out)); GST_BUFFER_TIMESTAMP (out) = flxdec->next_time; flxdec->next_time += flxdec->frame_time; - gst_pad_push(flxdec->srcpad, GST_DATA (out)); - - break; + gst_pad_push (flxdec->srcpad, GST_DATA (out)); + + break; } /* destroy header buffer */ - gst_buffer_unref(databuf); + gst_buffer_unref (databuf); } } -static GstElementStateReturn -gst_flxdec_change_state (GstElement *element) +static GstElementStateReturn +gst_flxdec_change_state (GstElement * element) { GstFlxDec *flxdec; - flxdec = GST_FLXDEC(element); + flxdec = GST_FLXDEC (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: @@ -596,20 +593,21 @@ gst_flxdec_change_state (GstElement *element) case GST_STATE_READY_TO_NULL: break; } - + parent_class->change_state (element); return GST_STATE_SUCCESS; } -static void -gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_flxdec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstFlxDec *flxdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_FLXDEC(object)); - flxdec = GST_FLXDEC(object); + g_return_if_fail (GST_IS_FLXDEC (object)); + flxdec = GST_FLXDEC (object); switch (prop_id) { default: @@ -617,14 +615,15 @@ gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GP } } -static void -gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_flxdec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstFlxDec *flxdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_FLXDEC(object)); - flxdec = GST_FLXDEC(object); + g_return_if_fail (GST_IS_FLXDEC (object)); + flxdec = GST_FLXDEC (object); switch (prop_id) { default: @@ -634,23 +633,17 @@ gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) return FALSE; return gst_element_register (plugin, "flxdec", - GST_RANK_PRIMARY, GST_TYPE_FLXDEC); + GST_RANK_PRIMARY, GST_TYPE_FLXDEC); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "flxdec", - "FLX video decoder", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "flxdec", + "FLX video decoder", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h index c7d6f386..c5ce60ec 100644 --- a/gst/flx/gstflxdec.h +++ b/gst/flx/gstflxdec.h @@ -27,42 +27,46 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ + + typedef enum + { + GST_FLXDEC_READ_HEADER, + GST_FLXDEC_PLAYING, + } GstFlxDecState; -typedef enum { - GST_FLXDEC_READ_HEADER, - GST_FLXDEC_PLAYING, -} GstFlxDecState; - /* Definition of structure storing data for this element. */ -typedef struct _GstFlxDec GstFlxDec; + typedef struct _GstFlxDec GstFlxDec; -struct _GstFlxDec { - GstElement element; + struct _GstFlxDec + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gboolean active, new_meta; + gboolean active, new_meta; - GstBuffer *delta, *frame; - GstByteStream *bs; - gulong size; - GstFlxDecState state; - glong frame_time; - gint64 next_time; + GstBuffer *delta, *frame; + GstByteStream *bs; + gulong size; + GstFlxDecState state; + glong frame_time; + gint64 next_time; - FlxColorSpaceConverter *converter; + FlxColorSpaceConverter *converter; - FlxHeader hdr; -}; + FlxHeader hdr; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstFlxDecClass GstFlxDecClass; -struct _GstFlxDecClass { - GstElementClass parent_class; -}; + typedef struct _GstFlxDecClass GstFlxDecClass; + struct _GstFlxDecClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_FLXDEC \ @@ -77,12 +81,12 @@ struct _GstFlxDecClass { (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLXDEC)) /* Standard function returning type information. */ -GType gst_flxdec_get_type(void); + GType gst_flxdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_FLX_DECODER_H__ */ +#endif /* __GST_FLX_DECODER_H__ */ diff --git a/gst/goom/filters.c b/gst/goom/filters.c index 5d74b622..14bd7ec6 100644 --- a/gst/goom/filters.c +++ b/gst/goom/filters.c @@ -43,44 +43,45 @@ extern volatile guint32 resoly; #ifdef USE_ASM #ifdef MMX -int mmx_zoom () ; +int mmx_zoom (); guint32 mmx_zoom_size; #endif /* MMX */ #ifdef POWERPC extern unsigned int useAltivec; -extern void ppc_zoom(void); -extern void ppc_zoom_altivec(void); +extern void ppc_zoom (void); +extern void ppc_zoom_altivec (void); unsigned int ppcsize4; #endif /* PowerPC */ unsigned int *coeffs = 0, *freecoeffs = 0; -guint32 *expix1 = 0; /* pointeur exporte vers p1 */ -guint32 *expix2 = 0; /* pointeur exporte vers p2 */ +guint32 *expix1 = 0; /* pointeur exporte vers p1 */ +guint32 *expix2 = 0; /* pointeur exporte vers p2 */ guint32 zoom_width; #endif /* ASM */ -static int sintable [0xffff] ; +static int sintable[0xffff]; static int vitesse = 127; -static char theMode = AMULETTE_MODE ; +static char theMode = AMULETTE_MODE; static int vPlaneEffect = 0; static int hPlaneEffect = 0; static char noisify = 2; -static int middleX , middleY ; -static unsigned char sqrtperte = 16 ; +static int middleX, middleY; +static unsigned char sqrtperte = 16; -static int * firedec = 0 ; +static int *firedec = 0; /* retourne x>>s , en testant le signe de x */ -inline int ShiftRight (int x, const unsigned char s) +inline int +ShiftRight (int x, const unsigned char s) { - if (x<0) - return -(-x >> s) ; + if (x < 0) + return -(-x >> s); else - return x >> s ; + return x >> s; } /* @@ -88,454 +89,463 @@ inline int ShiftRight (int x, const unsigned char s) px et py indique la nouvelle position (en sqrtperte ieme de pixel) (valeur * 16) */ -void calculatePXandPY (int x, int y, int *px, int *py) +void +calculatePXandPY (int x, int y, int *px, int *py) { - if (theMode == WATER_MODE) - { - static int wave = 0 ; - static int wavesp = 0 ; - int yy ; - - yy = y + RAND () % 4 + wave / 10 ; - yy -= RAND () % 4; - if (yy < 0) yy = 0 ; - if (yy >= resoly) yy = resoly - 1 ; - - *px = (x<<4) + firedec [yy] + (wave / 10) ; - *py = (y<<4) + 132 - ((vitesse < 132) ? vitesse : 131) ; - - wavesp += RAND () % 3; - wavesp -= RAND () % 3; - if (wave < -10) wavesp += 2 ; - if (wave > 10) wavesp -= 2 ; - wave += (wavesp / 10) + RAND () % 3; - wave -= RAND () % 3; - if (wavesp > 100) wavesp = (wavesp * 9) / 10 ; + if (theMode == WATER_MODE) { + static int wave = 0; + static int wavesp = 0; + int yy; + + yy = y + RAND () % 4 + wave / 10; + yy -= RAND () % 4; + if (yy < 0) + yy = 0; + if (yy >= resoly) + yy = resoly - 1; + + *px = (x << 4) + firedec[yy] + (wave / 10); + *py = (y << 4) + 132 - ((vitesse < 132) ? vitesse : 131); + + wavesp += RAND () % 3; + wavesp -= RAND () % 3; + if (wave < -10) + wavesp += 2; + if (wave > 10) + wavesp -= 2; + wave += (wavesp / 10) + RAND () % 3; + wave -= RAND () % 3; + if (wavesp > 100) + wavesp = (wavesp * 9) / 10; + } else { + int dist; + register int vx, vy; + int fvitesse = vitesse << 4; + + if (noisify) { + x += RAND () % noisify; + x -= RAND () % noisify; + y += RAND () % noisify; + y -= RAND () % noisify; } + + if (hPlaneEffect) + vx = ((x - middleX) << 9) + hPlaneEffect * (y - middleY); + else + vx = (x - middleX) << 9; + + if (vPlaneEffect) + vy = ((y - middleY) << 9) + vPlaneEffect * (x - middleX); else - { - int dist ; - register int vx,vy ; - int fvitesse = vitesse << 4 ; - - if (noisify) - { - x += RAND() % noisify; - x -= RAND() % noisify; - y += RAND() % noisify; - y -= RAND() % noisify; - } - - if (hPlaneEffect) vx = ((x - middleX) << 9) + hPlaneEffect * (y - middleY); - else vx = (x - middleX) << 9 ; - - if (vPlaneEffect) vy = ((y - middleY) << 9) + vPlaneEffect * (x - middleX); - else vy = (y - middleY) << 9 ; - - switch (theMode) - { - case WAVE_MODE: - dist = ShiftRight(vx,9) * ShiftRight(vx,9) + ShiftRight(vy,9) * ShiftRight(vy,9); - fvitesse *= 1024 + ShiftRight ( - sintable [(unsigned short)(0xffff*dist*EFFECT_DISTORS)],6); - fvitesse /= 1024 ; - break ; - case CRYSTAL_BALL_MODE: - dist = ShiftRight(vx,9) * ShiftRight(vx,9) + ShiftRight(vy,9) * ShiftRight(vy,9); - fvitesse += (dist * EFFECT_DISTORS >> 10); - break; - case AMULETTE_MODE: - dist = ShiftRight(vx,9) * ShiftRight(vx,9) + ShiftRight(vy,9) * ShiftRight(vy,9); - fvitesse -= (dist * EFFECT_DISTORS >> 4); - break; - case SCRUNCH_MODE: - dist = ShiftRight(vx,9) * ShiftRight(vx,9) + ShiftRight(vy,9) * ShiftRight(vy,9); - fvitesse -= (dist * EFFECT_DISTORS >> 9); - break; - } - if (vx<0) *px = (middleX << 4) - (-(vx * fvitesse) >> 16) ; - else *px = (middleX << 4) + ((vx * fvitesse) >> 16) ; - if (vy<0) *py = (middleY << 4) - (-(vy * fvitesse) >> 16) ; - else *py = (middleY << 4) + ((vy * fvitesse) >> 16) ; + vy = (y - middleY) << 9; + + switch (theMode) { + case WAVE_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse *= + 1024 + + ShiftRight (sintable[(unsigned short) (0xffff * dist * + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + break; + case CRYSTAL_BALL_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse += (dist * EFFECT_DISTORS >> 10); + break; + case AMULETTE_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse -= (dist * EFFECT_DISTORS >> 4); + break; + case SCRUNCH_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse -= (dist * EFFECT_DISTORS >> 9); + break; } + if (vx < 0) + *px = (middleX << 4) - (-(vx * fvitesse) >> 16); + else + *px = (middleX << 4) + ((vx * fvitesse) >> 16); + if (vy < 0) + *py = (middleY << 4) - (-(vy * fvitesse) >> 16); + else + *py = (middleY << 4) + ((vy * fvitesse) >> 16); + } } /*#define _DEBUG */ -inline void setPixelRGB(Uint *buffer, Uint x, Uint y, Color c) +inline void +setPixelRGB (Uint * buffer, Uint x, Uint y, Color c) { /* buffer[ y*WIDTH + x ] = (c.r<<16)|(c.v<<8)|c.b */ #ifdef _DEBUG_PIXEL - if ( x+y*resolx >= resolx * resoly) - { - fprintf (stderr,"setPixel ERROR : hors du tableau... %i, %i\n", x,y) ; - /*exit (1) ; */ - } + if (x + y * resolx >= resolx * resoly) { + fprintf (stderr, "setPixel ERROR : hors du tableau... %i, %i\n", x, y); + /*exit (1) ; */ + } #endif - + #ifdef USE_DGA - buffer[ y*resolx + x ] = (c.b<<16)|(c.v<<8)|c.r ; + buffer[y * resolx + x] = (c.b << 16) | (c.v << 8) | c.r; #else - buffer[ y*resolx + x ] = (c.r<<16)|(c.v<<8)|c.b ; + buffer[y * resolx + x] = (c.r << 16) | (c.v << 8) | c.b; #endif } -inline void setPixelRGB_ (Uint *buffer, Uint x, Color c) +inline void +setPixelRGB_ (Uint * buffer, Uint x, Color c) { #ifdef _DEBUG - if ( x >= resolx*resoly ) - { - printf ("setPixel ERROR : hors du tableau... %i, %i\n", x,y) ; - exit (1) ; - } + if (x >= resolx * resoly) { + printf ("setPixel ERROR : hors du tableau... %i, %i\n", x, y); + exit (1); + } #endif - + #ifdef USE_DGA - buffer[ x ] = (c.b<<16)|(c.v<<8)|c.r ; + buffer[x] = (c.b << 16) | (c.v << 8) | c.r; #else - buffer[ x ] = (c.r<<16)|(c.v<<8)|c.b ; + buffer[x] = (c.r << 16) | (c.v << 8) | c.b; #endif } -inline void getPixelRGB (Uint *buffer, Uint x, Uint y, Color *c) +inline void +getPixelRGB (Uint * buffer, Uint x, Uint y, Color * c) { - register unsigned char *tmp8; + register unsigned char *tmp8; - #ifdef _DEBUG - if (x + y * resolx >= resolx*resoly) - { - printf ("getPixel ERROR : hors du tableau... %i, %i\n", x,y) ; - exit (1) ; - } - #endif +#ifdef _DEBUG + if (x + y * resolx >= resolx * resoly) { + printf ("getPixel ERROR : hors du tableau... %i, %i\n", x, y); + exit (1); + } +#endif #ifdef __BIG_ENDIAN__ - c->b = *(unsigned char *)(tmp8 = (unsigned char*)(buffer + (x + y*resolx))); - c->r = *(unsigned char *)(++tmp8); - c->v = *(unsigned char *)(++tmp8); - c->b = *(unsigned char *)(++tmp8); - + c->b = *(unsigned char *) (tmp8 = + (unsigned char *) (buffer + (x + y * resolx))); + c->r = *(unsigned char *) (++tmp8); + c->v = *(unsigned char *) (++tmp8); + c->b = *(unsigned char *) (++tmp8); + #else - /* ATTENTION AU PETIT INDIEN */ - c->b = *(unsigned char *)(tmp8 = (unsigned char*)(buffer + (x + y*resolx))); - c->v = *(unsigned char *)(++tmp8); - c->r = *(unsigned char *)(++tmp8); + /* ATTENTION AU PETIT INDIEN */ + c->b = *(unsigned char *) (tmp8 = + (unsigned char *) (buffer + (x + y * resolx))); + c->v = *(unsigned char *) (++tmp8); + c->r = *(unsigned char *) (++tmp8); /* *c = (Color) buffer[x+y*WIDTH] ; */ #endif } -inline void getPixelRGB_ (Uint *buffer, Uint x, Color *c) +inline void +getPixelRGB_ (Uint * buffer, Uint x, Color * c) { - register unsigned char *tmp8; + register unsigned char *tmp8; - #ifdef _DEBUG - if ( x >= resolx*resoly ) - { - printf ("getPixel ERROR : hors du tableau... %i\n", x) ; - exit (1) ; - } - #endif +#ifdef _DEBUG + if (x >= resolx * resoly) { + printf ("getPixel ERROR : hors du tableau... %i\n", x); + exit (1); + } +#endif #ifdef __BIG_ENDIAN__ - c->b = *(unsigned char *)(tmp8 = (unsigned char*)(buffer + x)); - c->r = *(unsigned char *)(++tmp8); - c->v = *(unsigned char *)(++tmp8); - c->b = *(unsigned char *)(++tmp8); - + c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + x)); + c->r = *(unsigned char *) (++tmp8); + c->v = *(unsigned char *) (++tmp8); + c->b = *(unsigned char *) (++tmp8); + #else - /* ATTENTION AU PETIT INDIEN */ - c->b = *(unsigned char *)(tmp8 = (unsigned char*)(buffer + x)); - c->v = *(unsigned char *)(++tmp8); - c->r = *(unsigned char *)(++tmp8); + /* ATTENTION AU PETIT INDIEN */ + c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + x)); + c->v = *(unsigned char *) (++tmp8); + c->r = *(unsigned char *) (++tmp8); /* *c = (Color) buffer[x+y*WIDTH] ; */ #endif } /*===============================================================*/ -void zoomFilterFastRGB (Uint *pix1, - Uint *pix2, - ZoomFilterData *zf, - Uint resx, Uint resy) +void +zoomFilterFastRGB (Uint * pix1, + Uint * pix2, ZoomFilterData * zf, Uint resx, Uint resy) { static guint32 prevX = 0, prevY = 0; - static char reverse = 0 ; /*vitesse inversé..(zoom out) */ - /* static int perte = 100; // 100 = normal */ - static unsigned char pertedec = 8 ; + static char reverse = 0; /*vitesse inversé..(zoom out) */ + + /* static int perte = 100; // 100 = normal */ + static unsigned char pertedec = 8; static char firstTime = 1; - + Uint x, y; /* static unsigned int prevX = 0, prevY = 0; */ - + #ifdef USE_ASM - expix1 = pix1 ; - expix2 = pix2 ; + expix1 = pix1; + expix2 = pix2; #else Color couleur; - Color col1,col2,col3,col4; - Uint position ; + Color col1, col2, col3, col4; + Uint position; static unsigned int *pos10 = 0; - static unsigned int *c1 = 0, - *c2 = 0, - *c3 = 0, - *c4 = 0; + static unsigned int *c1 = 0, *c2 = 0, *c3 = 0, *c4 = 0; #endif - - if ((prevX != resx) || (prevY != resy)) - { - prevX = resx; - prevY = resy; + + if ((prevX != resx) || (prevY != resy)) { + prevX = resx; + prevY = resy; #ifndef USE_ASM - if (c1) free (c1) ; - if (c2) free (c2) ; - if (c3) free (c3) ; - if (c4) free (c4) ; - if (pos10) free (pos10) ; - c1=c2=c3=c4=pos10=0; + if (c1) + free (c1); + if (c2) + free (c2); + if (c3) + free (c3); + if (c4) + free (c4); + if (pos10) + free (pos10); + c1 = c2 = c3 = c4 = pos10 = 0; #else - if (coeffs) free (freecoeffs) ; - coeffs = 0; + if (coeffs) + free (freecoeffs); + coeffs = 0; #endif - middleX = resx / 2 ; - middleY = resy - 1; - firstTime = 1 ; - if (firedec) free (firedec); - firedec=0; - } - - if (zf) - { - reverse = zf->reverse ; - vitesse = zf->vitesse ; - if (reverse) - vitesse = 256 - vitesse ; + middleX = resx / 2; + middleY = resy - 1; + firstTime = 1; + if (firedec) + free (firedec); + firedec = 0; + } + + if (zf) { + reverse = zf->reverse; + vitesse = zf->vitesse; + if (reverse) + vitesse = 256 - vitesse; #ifndef USE_ASM - sqrtperte = zf->sqrtperte ; + sqrtperte = zf->sqrtperte; #endif - pertedec = zf->pertedec ; - middleX = zf->middleX ; - middleY = zf->middleY ; - theMode = zf->mode ; - hPlaneEffect = zf->hPlaneEffect; - vPlaneEffect = zf->vPlaneEffect; - noisify = zf->noisify; - } - - if (firstTime || zf) - { - - /* generation d'une table de sinus */ - if (firstTime) - { - unsigned short us ; - - firstTime = 0; + pertedec = zf->pertedec; + middleX = zf->middleX; + middleY = zf->middleY; + theMode = zf->mode; + hPlaneEffect = zf->hPlaneEffect; + vPlaneEffect = zf->vPlaneEffect; + noisify = zf->noisify; + } + + if (firstTime || zf) { + + /* generation d'une table de sinus */ + if (firstTime) { + unsigned short us; + + firstTime = 0; #ifdef USE_ASM - freecoeffs = (unsigned int *) - malloc (resx*resy*2*sizeof(unsigned int)+128); - coeffs = (guint32 *)((1+((unsigned int)(freecoeffs))/128)*128); + freecoeffs = (unsigned int *) + malloc (resx * resy * 2 * sizeof (unsigned int) + 128); + coeffs = (guint32 *) ((1 + ((unsigned int) (freecoeffs)) / 128) * 128); #else - pos10 = (unsigned int *) malloc (resx*resy*sizeof(unsigned int)) ; - c1 = (unsigned int *) malloc (resx*resy*sizeof(unsigned int)) ; - c2 = (unsigned int *) malloc (resx*resy*sizeof(unsigned int)) ; - c3 = (unsigned int *) malloc (resx*resy*sizeof(unsigned int)) ; - c4 = (unsigned int *) malloc (resx*resy*sizeof(unsigned int)) ; + pos10 = (unsigned int *) malloc (resx * resy * sizeof (unsigned int)); + c1 = (unsigned int *) malloc (resx * resy * sizeof (unsigned int)); + c2 = (unsigned int *) malloc (resx * resy * sizeof (unsigned int)); + c3 = (unsigned int *) malloc (resx * resy * sizeof (unsigned int)); + c4 = (unsigned int *) malloc (resx * resy * sizeof (unsigned int)); #endif - for (us=0; us<0xffff; us++) - { - sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; - } - - { - int loopv ; - firedec = (int *) malloc (prevY * sizeof(int)) ; - for (loopv = prevY ; loopv != 0 ;) - { - static int decc = 0 ; - static int spdc = 0 ; - static int accel = 0 ; - loopv -- ; - firedec [loopv] = decc ; - decc += spdc / 10 ; - spdc+= RAND () % 3; - spdc-= RAND () % 3; - - if (decc > 4) - spdc -= 1 ; - if (decc < -4) - spdc += 1 ; - - if (spdc > 30) - spdc = spdc - RAND () % 3 + accel / 10 ; - if (spdc < -30) - spdc = spdc + RAND () % 3 + accel / 10 ; - - if (decc > 8 && spdc > 1 ) - spdc -= RAND () % 3 - 2 ; - - if (decc < -8 && spdc < -1 ) - spdc += RAND () % 3 + 2 ; - - if (decc > 8 || decc < -8) - decc = decc * 8 / 9 ; - - accel += RAND () % 2; - accel -= RAND () % 2; - if (accel > 20) - accel -= 2 ; - if (accel < -20) - accel += 2 ; - } - } - } - - - /* generation du buffer */ - for (y = 0 ; y < prevY ; y++) - for (x = 0; x < prevX ; x++) - { - int px,py; - unsigned char coefv,coefh; - - /* calculer px et py en fonction de */ - /* x,y,middleX,middleY et theMode */ - calculatePXandPY (x,y,&px, &py) ; - if ((px == x << 4) && (py == y << 4)) - py += 8 ; - - if ( (py<0) || (px<0) || - (py>=(prevY-1)*sqrtperte) || - (px>=(prevX-1)*sqrtperte)) - { + for (us = 0; us < 0xffff; us++) { + sintable[us] = (int) (1024.0f * sin (us * 2 * 3.31415f / 0xffff)); + } + + { + int loopv; + firedec = (int *) malloc (prevY * sizeof (int)); + for (loopv = prevY; loopv != 0;) { + static int decc = 0; + static int spdc = 0; + static int accel = 0; + + loopv--; + firedec[loopv] = decc; + decc += spdc / 10; + spdc += RAND () % 3; + spdc -= RAND () % 3; + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - RAND () % 3 + accel / 10; + if (spdc < -30) + spdc = spdc + RAND () % 3 + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= RAND () % 3 - 2; + + if (decc < -8 && spdc < -1) + spdc += RAND () % 3 + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += RAND () % 2; + accel -= RAND () % 2; + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } + } + } + + + /* generation du buffer */ + for (y = 0; y < prevY; y++) + for (x = 0; x < prevX; x++) { + int px, py; + unsigned char coefv, coefh; + + /* calculer px et py en fonction de */ + /* x,y,middleX,middleY et theMode */ + calculatePXandPY (x, y, &px, &py); + if ((px == x << 4) && (py == y << 4)) + py += 8; + + if ((py < 0) || (px < 0) || + (py >= (prevY - 1) * sqrtperte) || + (px >= (prevX - 1) * sqrtperte)) { #ifdef USE_ASM - coeffs[(y*prevX+x)*2]=0 ; - coeffs[(y*prevX+x)*2+1]=0; + coeffs[(y * prevX + x) * 2] = 0; + coeffs[(y * prevX + x) * 2 + 1] = 0; #else - pos10[y*prevX+x]=0 ; - c1[y*prevX+x] = 0 ; - c2[y*prevX+x] = 0 ; - c3[y*prevX+x] = 0 ; - c4[y*prevX+x] = 0 ; + pos10[y * prevX + x] = 0; + c1[y * prevX + x] = 0; + c2[y * prevX + x] = 0; + c3[y * prevX + x] = 0; + c4[y * prevX + x] = 0; #endif - } - else - { - int npx10 ; - int npy10 ; - int pos; - - npx10 = (px/sqrtperte) ; - npy10 = (py/sqrtperte) ; - + } else { + int npx10; + int npy10; + int pos; + + npx10 = (px / sqrtperte); + npy10 = (py / sqrtperte); + /* if (npx10 >= prevX) fprintf(stderr,"error npx:%d",npx10); if (npy10 >= prevY) fprintf(stderr,"error npy:%d",npy10); -*/ - coefh = px % sqrtperte ; - coefv = py % sqrtperte ; +*/ + coefh = px % sqrtperte; + coefv = py % sqrtperte; #ifdef USE_ASM - pos = (y*prevX+x)*2; - coeffs[pos] = (npx10 + prevX * npy10) * 4; - - if (!(coefh || coefv)) - coeffs[pos+1] = (sqrtperte*sqrtperte-1) ; - else - coeffs[pos+1] = ( - (sqrtperte-coefh) * - (sqrtperte-coefv) ); - - coeffs[pos+1] |= (coefh * (sqrtperte-coefv)) << 8 ; - coeffs[pos+1] |= ((sqrtperte-coefh) * coefv) << 16 ; - coeffs[pos+1] |= (coefh * coefv)<<24 ; + pos = (y * prevX + x) * 2; + coeffs[pos] = (npx10 + prevX * npy10) * 4; + + if (!(coefh || coefv)) + coeffs[pos + 1] = (sqrtperte * sqrtperte - 1); + else + coeffs[pos + 1] = ((sqrtperte - coefh) * (sqrtperte - coefv)); + + coeffs[pos + 1] |= (coefh * (sqrtperte - coefv)) << 8; + coeffs[pos + 1] |= ((sqrtperte - coefh) * coefv) << 16; + coeffs[pos + 1] |= (coefh * coefv) << 24; #else - pos = y*prevX+x; - pos10[pos]= npx10 + prevX * npy10 ; - - if (!(coefh || coefv)) - c1[pos] = sqrtperte*sqrtperte-1 ; - else - c1[pos] = (sqrtperte-coefh) * (sqrtperte-coefv); - - c2[pos] = coefh * (sqrtperte-coefv) ; - c3[pos] = (sqrtperte-coefh) * coefv ; - c4[pos] = coefh * coefv ; + pos = y * prevX + x; + pos10[pos] = npx10 + prevX * npy10; + + if (!(coefh || coefv)) + c1[pos] = sqrtperte * sqrtperte - 1; + else + c1[pos] = (sqrtperte - coefh) * (sqrtperte - coefv); + + c2[pos] = coefh * (sqrtperte - coefv); + c3[pos] = (sqrtperte - coefh) * coefv; + c4[pos] = coefh * coefv; #endif - } - } - } - + } + } + } #ifdef USE_ASM - #ifdef MMX - zoom_width = prevX ; - mmx_zoom_size = prevX * prevY ; - mmx_zoom () ; - #endif - - #ifdef POWERPC - zoom_width = prevX; - if (useAltivec) - { - ppcsize4 = ((unsigned int)(prevX*prevY))/4; - ppc_zoom_altivec(); - } - else - { - ppcsize4 = ((unsigned int)(prevX*prevY)); - ppc_zoom(); - } - #endif +#ifdef MMX + zoom_width = prevX; + mmx_zoom_size = prevX * prevY; + mmx_zoom (); +#endif + +#ifdef POWERPC + zoom_width = prevX; + if (useAltivec) { + ppcsize4 = ((unsigned int) (prevX * prevY)) / 4; + ppc_zoom_altivec (); + } else { + ppcsize4 = ((unsigned int) (prevX * prevY)); + ppc_zoom (); + } +#endif #else - for (position=0; position>= pertedec ; - - couleur.v = col1.v * c1[position] - + col2.v * c2[position] - + col3.v * c3[position] - + col4.v * c4[position]; - couleur.v >>= pertedec ; - - couleur.b = col1.b * c1[position] - + col2.b * c2[position] - + col3.b * c3[position] - + col4.b * c4[position]; - couleur.b >>= pertedec ; - - setPixelRGB_(pix2,position,couleur); - } + for (position = 0; position < prevX * prevY; position++) { + getPixelRGB_ (pix1, pos10[position], &col1); + getPixelRGB_ (pix1, pos10[position] + 1, &col2); + getPixelRGB_ (pix1, pos10[position] + prevX, &col3); + getPixelRGB_ (pix1, pos10[position] + prevX + 1, &col4); + + couleur.r = col1.r * c1[position] + + col2.r * c2[position] + + col3.r * c3[position] + + col4.r * c4[position]; + couleur.r >>= pertedec; + + couleur.v = col1.v * c1[position] + + col2.v * c2[position] + + col3.v * c3[position] + + col4.v * c4[position]; + couleur.v >>= pertedec; + + couleur.b = col1.b * c1[position] + + col2.b * c2[position] + + col3.b * c3[position] + + col4.b * c4[position]; + couleur.b >>= pertedec; + + setPixelRGB_ (pix2, position, couleur); + } #endif } -void pointFilter(Uint *pix1, Color c, - float t1, float t2, float t3, float t4, - Uint cycle) +void +pointFilter (Uint * pix1, Color c, + float t1, float t2, float t3, float t4, Uint cycle) { - Uint x = (Uint)((int)middleX + (int)(t1*cos((float)cycle/t3))); - Uint y = (Uint)((int)middleY + (int)(t2*sin((float)cycle/t4))); - if ((x>1) && (y>1) && (x 1) && (y > 1) && (x < resolx - 2) && (y < resoly - 2)) { + setPixelRGB (pix1, x + 1, y, c); + setPixelRGB (pix1, x, y + 1, c); + setPixelRGB (pix1, x + 1, y + 1, WHITE); + setPixelRGB (pix1, x + 2, y + 1, c); + setPixelRGB (pix1, x + 1, y + 2, c); + } } diff --git a/gst/goom/filters.h b/gst/goom/filters.h index 33784c29..c4f0926d 100644 --- a/gst/goom/filters.h +++ b/gst/goom/filters.h @@ -7,17 +7,17 @@ typedef struct { - int vitesse ; - unsigned char pertedec ; - unsigned char sqrtperte ; - int middleX,middleY ; - char reverse ; - char mode ; + int vitesse; + unsigned char pertedec; + unsigned char sqrtperte; + int middleX, middleY; + char reverse; + char mode; /** @since June 2001 */ - int hPlaneEffect ; - int vPlaneEffect ; - char noisify ; -} ZoomFilterData ; + int hPlaneEffect; + int vPlaneEffect; + char noisify; +} ZoomFilterData; #define NORMAL_MODE 0 @@ -27,9 +27,8 @@ typedef struct #define AMULETTE_MODE 4 #define WATER_MODE 5 -void pointFilter(guint32 *pix1, Color c, - float t1, float t2, float t3, float t4, - guint32 cycle); +void pointFilter (guint32 * pix1, Color c, + float t1, float t2, float t3, float t4, guint32 cycle); /* filtre de zoom : le contenu de pix1 est copie dans pix2, avec l'effet appliqué @@ -42,10 +41,8 @@ Uint middleX, Uint middleY); */ -void zoomFilterFastRGB (guint32 *pix1, - guint32 *pix2, - ZoomFilterData *zf, - guint32 resx, guint32 resy); +void zoomFilterFastRGB (guint32 * pix1, + guint32 * pix2, ZoomFilterData * zf, guint32 resx, guint32 resy); /* filtre sin : diff --git a/gst/goom/goom_core.c b/gst/goom/goom_core.c index cf841127..5c4a75a3 100644 --- a/gst/goom/goom_core.c +++ b/gst/goom/goom_core.c @@ -17,410 +17,393 @@ /**-----------------------------------------------------** ** SHARED DATA ** **-----------------------------------------------------**/ -static guint32 *pixel ; -static guint32 *back ; -static guint32 *p1,*p2,*tmp; +static guint32 *pixel; +static guint32 *back; +static guint32 *p1, *p2, *tmp; static guint32 cycle; guint32 resolx, resoly, buffsize; -void goom_init (guint32 resx, guint32 resy) +void +goom_init (guint32 resx, guint32 resy) { #ifdef VERBOSE - printf ("GOOM: init (%d, %d);\n", resx,resy); + printf ("GOOM: init (%d, %d);\n", resx, resy); #endif - resolx = resx; - resoly = resy; - buffsize = resx * resy; + resolx = resx; + resoly = resy; + buffsize = resx * resy; - pixel = (guint32 *) malloc (buffsize * sizeof(guint32) + 128); - back = (guint32 *) malloc (buffsize * sizeof(guint32) + 128); - RAND_INIT (GPOINTER_TO_INT(pixel)); - cycle = 0 ; + pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + RAND_INIT (GPOINTER_TO_INT (pixel)); + cycle = 0; - p1 = (void *)(((unsigned long)pixel + 0x7f)&(~0x7f)); - p2 = (void *)(((unsigned long)back + 0x7f)&(~0x7f)); + p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f)); + p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f)); } -void goom_set_resolution (guint32 resx, guint32 resy) +void +goom_set_resolution (guint32 resx, guint32 resy) { - free (pixel); - free (back); + free (pixel); + free (back); - resolx = resx; - resoly = resy; - buffsize = resx * resy; + resolx = resx; + resoly = resy; + buffsize = resx * resy; - pixel = (guint32 *) malloc (buffsize * sizeof(guint32) + 128); - memset(pixel,0,buffsize * sizeof(guint32) + 128); - back = (guint32 *) malloc (buffsize * sizeof(guint32) + 128); - memset(back,0,buffsize * sizeof(guint32) + 128); + pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + memset (pixel, 0, buffsize * sizeof (guint32) + 128); + back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + memset (back, 0, buffsize * sizeof (guint32) + 128); - p1 = (void *)(((unsigned long)pixel + 0x7f)&(~0x7f)); - p2 = (void *)(((unsigned long)back + 0x7f)&(~0x7f)); + p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f)); + p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f)); } -guint32 * goom_update (gint16 data [2][512]) +guint32 * +goom_update (gint16 data[2][512]) { - static int lockvar = 0 ; /* pour empecher de nouveaux changements */ - static int goomvar = 0 ; /* boucle des gooms */ - static int totalgoom = 0 ; /* nombre de gooms par seconds */ - static int agoom = 0 ; /* un goom a eu lieu.. */ - static int loopvar = 0 ; /* mouvement des points */ - static int speedvar = 0 ; /* vitesse des particules */ - static int lineMode = 0 ; /* l'effet lineaire a dessiner */ - guint32 * return_val; - guint32 pointWidth; - guint32 pointHeight; - int incvar ; /* volume du son */ - int accelvar ; /* acceleration des particules */ - int i ; - float largfactor ; /* elargissement de l'intervalle d'évolution des points */ - static char goomlimit = 2 ; /* sensibilité du goom */ - static ZoomFilterData zfd = - { - 128, 8, 16, - 1, 1, 0, WAVE_MODE, - 0, 0, 0}; - - ZoomFilterData *pzfd; - - /* test if the config has changed, update it if so */ - pointWidth = (resolx * 2) / 5; - pointHeight = (resoly * 2) / 5; - - /* ! etude du signal ... */ - incvar = 0 ; - for (i=0;i<512;i++) - { - if (incvar < data[0][i]) incvar = data[0][i] ; - } + static int lockvar = 0; /* pour empecher de nouveaux changements */ + static int goomvar = 0; /* boucle des gooms */ + static int totalgoom = 0; /* nombre de gooms par seconds */ + static int agoom = 0; /* un goom a eu lieu.. */ + static int loopvar = 0; /* mouvement des points */ + static int speedvar = 0; /* vitesse des particules */ + static int lineMode = 0; /* l'effet lineaire a dessiner */ + guint32 *return_val; + guint32 pointWidth; + guint32 pointHeight; + int incvar; /* volume du son */ + int accelvar; /* acceleration des particules */ + int i; + float largfactor; /* elargissement de l'intervalle d'évolution des points */ + static char goomlimit = 2; /* sensibilité du goom */ + static ZoomFilterData zfd = { + 128, 8, 16, + 1, 1, 0, WAVE_MODE, + 0, 0, 0 + }; + + ZoomFilterData *pzfd; + + /* test if the config has changed, update it if so */ + pointWidth = (resolx * 2) / 5; + pointHeight = (resoly * 2) / 5; + + /* ! etude du signal ... */ + incvar = 0; + for (i = 0; i < 512; i++) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } - accelvar = incvar / 5000 ; - if (speedvar>5) - { - accelvar-- ; - if (speedvar>20) accelvar -- ; - if (speedvar>40) speedvar = 40 ; - } - accelvar -- ; - speedvar += accelvar ; - - if (speedvar<0) speedvar=0; - if (speedvar>40) speedvar = 40 ; + accelvar = incvar / 5000; + if (speedvar > 5) { + accelvar--; + if (speedvar > 20) + accelvar--; + if (speedvar > 40) + speedvar = 40; + } + accelvar--; + speedvar += accelvar; + + if (speedvar < 0) + speedvar = 0; + if (speedvar > 40) + speedvar = 40; /* ! calcul du deplacement des petits points ... */ - largfactor = ((float)speedvar / 40.0f + (float)incvar / 50000.0f) / 1.5f ; - if (largfactor>1.5f) largfactor = 1.5f ; - - for (i = 1 ; i*15 <= speedvar + 15; i ++) { - loopvar += speedvar + 1 ; - - pointFilter(p1, - YELLOW, - ((pointWidth - 6.0f) * largfactor + 5.0f), - ((pointHeight - 6.0f) * largfactor + 5.0f), - i * 152.0f, 128.0f, - loopvar + i*2032); - pointFilter(p1, ORANGE, - ((pointWidth / 2) * largfactor) / i + 10.0f * i, - ((pointHeight / 2) * largfactor) / i + 10.0f * i, - 96.0f, i * 80.0f, loopvar / i); - pointFilter(p1, VIOLET, - ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, - ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, - i + 122.0f, 134.0f, loopvar / i); - pointFilter(p1, BLACK, - ((pointHeight / 3) * largfactor + 20.0f), - ((pointHeight / 3) * largfactor + 20.0f), - 58.0f, i * 66.0f, loopvar / i); - pointFilter(p1, WHITE, - (pointHeight * largfactor + 10.0f * i) / i, - (pointHeight * largfactor + 10.0f * i) / i, - 66.0f, 74.0f, loopvar + i * 500); + largfactor = ((float) speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f; + if (largfactor > 1.5f) + largfactor = 1.5f; + + for (i = 1; i * 15 <= speedvar + 15; i++) { + loopvar += speedvar + 1; + + pointFilter (p1, + YELLOW, + ((pointWidth - 6.0f) * largfactor + 5.0f), + ((pointHeight - 6.0f) * largfactor + 5.0f), + i * 152.0f, 128.0f, loopvar + i * 2032); + pointFilter (p1, ORANGE, + ((pointWidth / 2) * largfactor) / i + 10.0f * i, + ((pointHeight / 2) * largfactor) / i + 10.0f * i, + 96.0f, i * 80.0f, loopvar / i); + pointFilter (p1, VIOLET, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + i + 122.0f, 134.0f, loopvar / i); + pointFilter (p1, BLACK, + ((pointHeight / 3) * largfactor + 20.0f), + ((pointHeight / 3) * largfactor + 20.0f), + 58.0f, i * 66.0f, loopvar / i); + pointFilter (p1, WHITE, + (pointHeight * largfactor + 10.0f * i) / i, + (pointHeight * largfactor + 10.0f * i) / i, + 66.0f, 74.0f, loopvar + i * 500); } - /* par défaut pas de changement de zoom */ - pzfd = NULL ; - - /* diminuer de 1 le temps de lockage */ - /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ - /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */ - if (--lockvar < 0) lockvar = 0 ; - - /* temps du goom */ - if (--agoom < 0) agoom = 0 ; - - /* on verifie qu'il ne se pas un truc interressant avec le son. */ - if ((accelvar>goomlimit) || (accelvar<-goomlimit)) - { - /* UN GOOM !!! YAHOO ! */ - totalgoom ++ ; - agoom = 20 ; /* mais pdt 20 cycles, il n'y en aura plus. */ - lineMode = (lineMode + 1)%20; /* Tous les 10 gooms on change de mode lineaire */ - - /* changement eventuel de mode */ - switch (iRAND(10)) - { - case 0: - case 1: - case 2: - zfd.mode=WAVE_MODE; - zfd.vitesse=STOP_SPEED-1; - zfd.reverse=0; - break; - case 3: - case 4: - zfd.mode=CRYSTAL_BALL_MODE; - break; - case 5: - zfd.mode=AMULETTE_MODE; - break; - case 6: - zfd.mode = WATER_MODE ; - break; - case 7: - zfd.mode=SCRUNCH_MODE; - break; - default: - zfd.mode=NORMAL_MODE; - } + /* par défaut pas de changement de zoom */ + pzfd = NULL; + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */ + if (--lockvar < 0) + lockvar = 0; + + /* temps du goom */ + if (--agoom < 0) + agoom = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((accelvar > goomlimit) || (accelvar < -goomlimit)) { + /* UN GOOM !!! YAHOO ! */ + totalgoom++; + agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */ + lineMode = (lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */ + + /* changement eventuel de mode */ + switch (iRAND (10)) { + case 0: + case 1: + case 2: + zfd.mode = WAVE_MODE; + zfd.vitesse = STOP_SPEED - 1; + zfd.reverse = 0; + break; + case 3: + case 4: + zfd.mode = CRYSTAL_BALL_MODE; + break; + case 5: + zfd.mode = AMULETTE_MODE; + break; + case 6: + zfd.mode = WATER_MODE; + break; + case 7: + zfd.mode = SCRUNCH_MODE; + break; + default: + zfd.mode = NORMAL_MODE; } + } - /* tout ceci ne sera fait qu'en cas de non-blocage */ - if (lockvar == 0) - { - /* reperage de goom (acceleration forte de l'acceleration du volume) */ - /* -> coup de boost de la vitesse si besoin.. */ - if ( (accelvar>goomlimit) || (accelvar<-goomlimit) ) - { - goomvar ++ ; - /*if (goomvar % 1 == 0) */ - { - guint32 vtmp ; - guint32 newvit ; - newvit = STOP_SPEED - speedvar / 2 ; - /* retablir le zoom avant.. */ - if ((zfd.reverse) && - (!(cycle%12)) && - (rand ()%3==0)) - { - zfd.reverse = 0 ; - zfd.vitesse = STOP_SPEED - 2 ; - lockvar = 50 ; - } - if (iRAND (10) == 0) - { - zfd.reverse = 1; - lockvar = 100; - } - - /* changement de milieu.. */ - switch (iRAND(20)) - { - case 0: - zfd.middleY = resoly - 1 ; - zfd.middleX = resolx / 2 ; - break ; - case 1: - zfd.middleX = resolx - 1 ; - break ; - case 2: - zfd.middleX = 1 ; - break ; - default: - zfd.middleY = resoly / 2 ; - zfd.middleX = resolx / 2 ; - } - - if (zfd.mode == WATER_MODE) - { - zfd.middleX = resolx / 2; - zfd.middleY = resoly / 2; - } - - switch (vtmp = (iRAND (27))) - { - case 0: - zfd.vPlaneEffect = iRAND(3); - zfd.vPlaneEffect -= iRAND(3); - zfd.hPlaneEffect = iRAND(3); - zfd.hPlaneEffect -= iRAND(3); - break; - case 3: - zfd.vPlaneEffect = 0 ; - zfd.hPlaneEffect = iRAND(8); - zfd.hPlaneEffect -= iRAND(8); - break; - case 4: - case 5: - case 6: - case 7: - zfd.vPlaneEffect = iRAND(5); - zfd.vPlaneEffect -= iRAND(5); - zfd.hPlaneEffect = - zfd.vPlaneEffect; - break; - case 8: - zfd.hPlaneEffect = 5 + iRAND (8); - zfd.vPlaneEffect = - zfd.hPlaneEffect ; - break; - case 9: - zfd.vPlaneEffect = 5 + iRAND (8); - zfd.hPlaneEffect = - zfd.hPlaneEffect ; - break; - case 13: - zfd.hPlaneEffect = 0; - zfd.vPlaneEffect = iRAND(10); - zfd.vPlaneEffect -= iRAND(10); - break; - default: - if (vtmp < 10) - { - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = 0; - } - } - - if (iRAND (3) != 0) zfd.noisify = 0 ; - else - { - zfd.noisify = iRAND (3) + 2 ; - lockvar *= 3; - } - - if (zfd.mode == AMULETTE_MODE) - { - zfd.vPlaneEffect = 0; - zfd.hPlaneEffect = 0; - zfd.noisify = 0; - } - - if ((zfd.middleX == 1) || (zfd.middleX == resolx - 1)) - { - zfd.vPlaneEffect = 0 ; - zfd.hPlaneEffect = iRAND (2) ? 0 : zfd.hPlaneEffect; - } - - if (newvit < zfd.vitesse) /* on accelere */ - { - pzfd = &zfd; - if ( ( (newvit < STOP_SPEED - 7) && - (zfd.vitesse < STOP_SPEED - 6) && - (cycle % 3 == 0)) || - (iRAND (40) == 0)) - { - zfd.vitesse = STOP_SPEED - 1 ; - zfd.reverse = ! zfd.reverse ; - } - else - { - zfd.vitesse = (newvit + zfd.vitesse * 4) / 5 ; - } - lockvar += 50 ; - } - } - } - /* mode mega-lent */ - if (iRAND(1000) == 0) - { - /* - printf ("coup du sort...\n") ; - */ - pzfd = &zfd ; - zfd.vitesse = STOP_SPEED - 1 ; - zfd.pertedec = 8 ; - zfd.sqrtperte = 16 ; - goomvar = 1 ; - lockvar += 70 ; - } + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if ((accelvar > goomlimit) || (accelvar < -goomlimit)) { + goomvar++; + /*if (goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + newvit = STOP_SPEED - speedvar / 2; + /* retablir le zoom avant.. */ + if ((zfd.reverse) && (!(cycle % 12)) && (rand () % 3 == 0)) { + zfd.reverse = 0; + zfd.vitesse = STOP_SPEED - 2; + lockvar = 50; } - - /* gros frein si la musique est calme */ - if ((speedvar < 1) && (zfd.vitesse < STOP_SPEED - 4) && (cycle % 16 == 0)) - { - /* - printf ("++slow part... %i\n", zfd.vitesse) ; - */ - pzfd = &zfd ; - zfd.vitesse += 3 ; - zfd.pertedec = 8 ; - zfd.sqrtperte = 16 ; - goomvar = 0 ; - /* - printf ("--slow part... %i\n", zfd.vitesse) ; - */ + if (iRAND (10) == 0) { + zfd.reverse = 1; + lockvar = 100; } - - /* baisser regulierement la vitesse... */ - if ( (cycle % 73 == 0) && (zfd.vitesse < STOP_SPEED - 5)) - { - /* - printf ("slow down...\n") ; - */ - pzfd = &zfd ; - zfd.vitesse ++ ; + + /* changement de milieu.. */ + switch (iRAND (20)) { + case 0: + zfd.middleY = resoly - 1; + zfd.middleX = resolx / 2; + break; + case 1: + zfd.middleX = resolx - 1; + break; + case 2: + zfd.middleX = 1; + break; + default: + zfd.middleY = resoly / 2; + zfd.middleX = resolx / 2; } - - /* arreter de decrémenter au bout d'un certain temps */ - if ((cycle % 101 == 0) && (zfd.pertedec == 7)) - { - pzfd = &zfd ; - zfd.pertedec=8 ; - zfd.sqrtperte=16 ; + + if (zfd.mode == WATER_MODE) { + zfd.middleX = resolx / 2; + zfd.middleY = resoly / 2; } - -#ifdef VERBOSE - if (pzfd) - { - printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + + switch (vtmp = (iRAND (27))) { + case 0: + zfd.vPlaneEffect = iRAND (3); + zfd.vPlaneEffect -= iRAND (3); + zfd.hPlaneEffect = iRAND (3); + zfd.hPlaneEffect -= iRAND (3); + break; + case 3: + zfd.vPlaneEffect = 0; + zfd.hPlaneEffect = iRAND (8); + zfd.hPlaneEffect -= iRAND (8); + break; + case 4: + case 5: + case 6: + case 7: + zfd.vPlaneEffect = iRAND (5); + zfd.vPlaneEffect -= iRAND (5); + zfd.hPlaneEffect = -zfd.vPlaneEffect; + break; + case 8: + zfd.hPlaneEffect = 5 + iRAND (8); + zfd.vPlaneEffect = -zfd.hPlaneEffect; + break; + case 9: + zfd.vPlaneEffect = 5 + iRAND (8); + zfd.hPlaneEffect = -zfd.hPlaneEffect; + break; + case 13: + zfd.hPlaneEffect = 0; + zfd.vPlaneEffect = iRAND (10); + zfd.vPlaneEffect -= iRAND (10); + break; + default: + if (vtmp < 10) { + zfd.vPlaneEffect = 0; + zfd.hPlaneEffect = 0; + } + } + + if (iRAND (3) != 0) + zfd.noisify = 0; + else { + zfd.noisify = iRAND (3) + 2; + lockvar *= 3; + } + + if (zfd.mode == AMULETTE_MODE) { + zfd.vPlaneEffect = 0; + zfd.hPlaneEffect = 0; + zfd.noisify = 0; + } + + if ((zfd.middleX == 1) || (zfd.middleX == resolx - 1)) { + zfd.vPlaneEffect = 0; + zfd.hPlaneEffect = iRAND (2) ? 0 : zfd.hPlaneEffect; + } + + if (newvit < zfd.vitesse) { /* on accelere */ + pzfd = &zfd; + if (((newvit < STOP_SPEED - 7) && + (zfd.vitesse < STOP_SPEED - 6) && + (cycle % 3 == 0)) || (iRAND (40) == 0)) { + zfd.vitesse = STOP_SPEED - 1; + zfd.reverse = !zfd.reverse; + } else { + zfd.vitesse = (newvit + zfd.vitesse * 4) / 5; + } + lockvar += 50; } + } + } + /* mode mega-lent */ + if (iRAND (1000) == 0) { + /* + printf ("coup du sort...\n") ; + */ + pzfd = &zfd; + zfd.vitesse = STOP_SPEED - 1; + zfd.pertedec = 8; + zfd.sqrtperte = 16; + goomvar = 1; + lockvar += 70; + } + } + + /* gros frein si la musique est calme */ + if ((speedvar < 1) && (zfd.vitesse < STOP_SPEED - 4) && (cycle % 16 == 0)) { + /* + printf ("++slow part... %i\n", zfd.vitesse) ; + */ + pzfd = &zfd; + zfd.vitesse += 3; + zfd.pertedec = 8; + zfd.sqrtperte = 16; + goomvar = 0; + /* + printf ("--slow part... %i\n", zfd.vitesse) ; + */ + } + + /* baisser regulierement la vitesse... */ + if ((cycle % 73 == 0) && (zfd.vitesse < STOP_SPEED - 5)) { + /* + printf ("slow down...\n") ; + */ + pzfd = &zfd; + zfd.vitesse++; + } + + /* arreter de decrémenter au bout d'un certain temps */ + if ((cycle % 101 == 0) && (zfd.pertedec == 7)) { + pzfd = &zfd; + zfd.pertedec = 8; + zfd.sqrtperte = 16; + } +#ifdef VERBOSE + if (pzfd) { + printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + } #endif - /* Zoom here ! */ - zoomFilterFastRGB (p1, p2, pzfd, resolx, resoly) ; - - /* si on est dans un goom : afficher les lignes... */ - if (agoom > 15) goom_lines - (data, - ((zfd.middleX==resolx/2) && (zfd.middleY==resoly/2) && (zfd.mode!=WATER_MODE)) - ? (lineMode/10) : 0, - p2,agoom-15); - - return_val = p2 ; - tmp=p1; - p1=p2; - p2=tmp; - - /* affichage et swappage des buffers.. */ - cycle++; - - /* tous les 100 cycles : vérifier si le taux de goom est correct */ - /* et le modifier sinon.. */ - if (!(cycle%100)) - { - if (totalgoom>15) - { - /* printf ("less gooms\n") ; */ - goomlimit ++ ; - } - else - { - if ((totalgoom==0) && (goomlimit>1)) - goomlimit -- ; - } - totalgoom = 0 ; + /* Zoom here ! */ + zoomFilterFastRGB (p1, p2, pzfd, resolx, resoly); + + /* si on est dans un goom : afficher les lignes... */ + if (agoom > 15) + goom_lines + (data, ((zfd.middleX == resolx / 2) && (zfd.middleY == resoly / 2) + && (zfd.mode != WATER_MODE)) + ? (lineMode / 10) : 0, p2, agoom - 15); + + return_val = p2; + tmp = p1; + p1 = p2; + p2 = tmp; + + /* affichage et swappage des buffers.. */ + cycle++; + + /* tous les 100 cycles : vérifier si le taux de goom est correct */ + /* et le modifier sinon.. */ + if (!(cycle % 100)) { + if (totalgoom > 15) { + /* printf ("less gooms\n") ; */ + goomlimit++; + } else { + if ((totalgoom == 0) && (goomlimit > 1)) + goomlimit--; } - return return_val; + totalgoom = 0; + } + return return_val; } -void goom_close () +void +goom_close () { - if (pixel!=NULL) free (pixel) ; - if (back!=NULL) free (back) ; - pixel = back = NULL; - RAND_CLOSE(); + if (pixel != NULL) + free (pixel); + if (back != NULL) + free (back); + pixel = back = NULL; + RAND_CLOSE (); } diff --git a/gst/goom/goom_core.h b/gst/goom/goom_core.h index 15f942d2..3751b522 100644 --- a/gst/goom/goom_core.h +++ b/gst/goom/goom_core.h @@ -6,7 +6,7 @@ void goom_init (guint32 resx, guint32 resy); void goom_set_resolution (guint32 resx, guint32 resy); -guint32 * goom_update (gint16 data [2][512]); +guint32 *goom_update (gint16 data[2][512]); void goom_close (); diff --git a/gst/goom/goom_tools.h b/gst/goom/goom_tools.h index e3613825..5159cf91 100644 --- a/gst/goom/goom_tools.h +++ b/gst/goom/goom_tools.h @@ -4,8 +4,8 @@ #define NB_RAND 0x10000 /* in graphic.c */ -extern int * rand_tab ; -extern unsigned short rand_pos ; +extern int *rand_tab; +extern unsigned short rand_pos; #define RAND_INIT(i) \ srand (i) ;\ @@ -25,5 +25,5 @@ extern unsigned short rand_pos ; /*#define iRAND(i) ((guint32)((float)i * RAND()/RAND_MAX)) */ #define iRAND(i) (RAND()%i) - + #endif diff --git a/gst/goom/graphic.c b/gst/goom/graphic.c index cd24d49f..33fff165 100644 --- a/gst/goom/graphic.c +++ b/gst/goom/graphic.c @@ -4,18 +4,18 @@ #include "graphic.h" -const Color BLACK = {0,0,0} ; -const Color WHITE = {0xff,0xff,0xff} ; -const Color RED = {0xff,0,0} ; -const Color GREEN = {0,0xff,0} ; -const Color BLUE = {0,0,0xff} ; -const Color YELLOW = {0xff, 0xff, 0x33} ; -const Color ORANGE = {0xff, 0xcc, 0x00} ; -const Color VIOLET = {0x55, 0x00, 0xff} ; +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0, 0 }; +const Color GREEN = { 0, 0xff, 0 }; +const Color BLUE = { 0, 0, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x00 }; +const Color VIOLET = { 0x55, 0x00, 0xff }; -unsigned int SIZE ; -unsigned int HEIGHT ; -unsigned int WIDTH ; +unsigned int SIZE; +unsigned int HEIGHT; +unsigned int WIDTH; -int * rand_tab = 0 ; -unsigned short int rand_pos = 0 ; +int *rand_tab = 0; +unsigned short int rand_pos = 0; diff --git a/gst/goom/graphic.h b/gst/goom/graphic.h index 415dde73..1af1030a 100644 --- a/gst/goom/graphic.h +++ b/gst/goom/graphic.h @@ -5,7 +5,7 @@ typedef unsigned int Uint; typedef struct { - unsigned short r,v,b; + unsigned short r, v, b; } Color; @@ -18,7 +18,7 @@ extern const Color YELLOW; extern const Color ORANGE; extern const Color VIOLET; -inline void setPixelRGB (Uint *buffer, Uint x, Uint y, Color c) ; -inline void getPixelRGB (Uint *buffer, Uint x, Uint y, Color *c) ; +inline void setPixelRGB (Uint * buffer, Uint x, Uint y, Color c); +inline void getPixelRGB (Uint * buffer, Uint x, Uint y, Color * c); -#endif /*GRAPHIC_H*/ +#endif /*GRAPHIC_H */ diff --git a/gst/goom/gstgoom.c b/gst/goom/gstgoom.c index 35d5e098..b5ad63a5 100644 --- a/gst/goom/gstgoom.c +++ b/gst/goom/gstgoom.c @@ -34,11 +34,12 @@ typedef struct _GstGOOM GstGOOM; typedef struct _GstGOOMClass GstGOOMClass; -struct _GstGOOM { +struct _GstGOOM +{ GstElement element; /* pads */ - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* the timestamp of the next frame */ guint64 next_time; @@ -52,11 +53,12 @@ struct _GstGOOM { gboolean srcnegotiated; }; -struct _GstGOOMClass { +struct _GstGOOMClass +{ GstElementClass parent_class; }; -GType gst_goom_get_type(void); +GType gst_goom_get_type (void); /* elementfactory information */ @@ -68,53 +70,50 @@ static GstElementDetails gst_goom_details = { }; /* signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_xRGB_HOST_ENDIAN ) -); - -static GstStaticPadTemplate sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", /* the name of the pads */ - GST_PAD_SINK, /* type of the pad */ - GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ - 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, 2 ]" - ) -); - - -static void gst_goom_class_init (GstGOOMClass *klass); -static void gst_goom_base_init (GstGOOMClass *klass); -static void gst_goom_init (GstGOOM *goom); -static void gst_goom_dispose (GObject *object); +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); -static GstElementStateReturn - gst_goom_change_state (GstElement *element); +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pads */ + GST_PAD_SINK, /* type of the pad */ + GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ + 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, 2 ]") + ); + + +static void gst_goom_class_init (GstGOOMClass * klass); +static void gst_goom_base_init (GstGOOMClass * klass); +static void gst_goom_init (GstGOOM * goom); +static void gst_goom_dispose (GObject * object); -static void gst_goom_chain (GstPad *pad, GstData *_data); +static GstElementStateReturn gst_goom_change_state (GstElement * element); -static GstPadLinkReturn gst_goom_sinkconnect (GstPad *pad, const GstCaps *caps); -static GstPadLinkReturn gst_goom_srcconnect (GstPad *pad, const GstCaps *caps); -static GstCaps * gst_goom_src_fixate (GstPad *pad, const GstCaps *caps); +static void gst_goom_chain (GstPad * pad, GstData * _data); + +static GstPadLinkReturn gst_goom_sinkconnect (GstPad * pad, + const GstCaps * caps); +static GstPadLinkReturn gst_goom_srcconnect (GstPad * pad, + const GstCaps * caps); +static GstCaps *gst_goom_src_fixate (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; @@ -125,9 +124,9 @@ gst_goom_get_type (void) if (!type) { static const GTypeInfo info = { - sizeof (GstGOOMClass), - (GBaseInitFunc) gst_goom_base_init, - NULL, + sizeof (GstGOOMClass), + (GBaseInitFunc) gst_goom_base_init, + NULL, (GClassInitFunc) gst_goom_class_init, NULL, NULL, @@ -141,41 +140,43 @@ gst_goom_get_type (void) } static void -gst_goom_base_init (GstGOOMClass *klass) +gst_goom_base_init (GstGOOMClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details (element_class, &gst_goom_details); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_template)); + gst_static_pad_template_get (&sink_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_template)); + gst_static_pad_template_get (&src_template)); } static void -gst_goom_class_init(GstGOOMClass *klass) +gst_goom_class_init (GstGOOMClass * 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); - gobject_class->dispose = gst_goom_dispose; + gobject_class->dispose = gst_goom_dispose; gstelement_class->change_state = gst_goom_change_state; } static void -gst_goom_init (GstGOOM *goom) +gst_goom_init (GstGOOM * goom) { /* create the sink and src pads */ - goom->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_template ), "sink"); - goom->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_template ), "src"); + goom->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_template), + "sink"); + goom->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_template), + "src"); gst_element_add_pad (GST_ELEMENT (goom), goom->sinkpad); gst_element_add_pad (GST_ELEMENT (goom), goom->srcpad); @@ -189,22 +190,22 @@ gst_goom_init (GstGOOM *goom) goom->width = 320; goom->height = 200; - goom->fps = 25.; /* desired frame rate */ + goom->fps = 25.; /* desired frame rate */ goom->channels = 0; /* set to something */ goom_init (50, 50); } static void -gst_goom_dispose (GObject *object) +gst_goom_dispose (GObject * object) { goom_close (); - + G_OBJECT_CLASS (parent_class)->dispose (object); } static GstPadLinkReturn -gst_goom_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_goom_sinkconnect (GstPad * pad, const GstCaps * caps) { GstGOOM *goom; GstStructure *structure; @@ -219,7 +220,7 @@ gst_goom_sinkconnect (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_goom_srcconnect (GstPad *pad, const GstCaps *caps) +gst_goom_srcconnect (GstPad * pad, const GstCaps * caps) { GstGOOM *goom; GstStructure *structure; @@ -239,12 +240,13 @@ gst_goom_srcconnect (GstPad *pad, const GstCaps *caps) } static GstCaps * -gst_goom_src_fixate (GstPad *pad, const GstCaps *caps) +gst_goom_src_fixate (GstPad * pad, const GstCaps * caps) { GstCaps *newcaps; GstStructure *structure; - if (!gst_caps_is_simple (caps)) return NULL; + if (!gst_caps_is_simple (caps)) + return NULL; newcaps = gst_caps_copy (caps); structure = gst_caps_get_structure (newcaps, 0); @@ -256,7 +258,7 @@ gst_goom_src_fixate (GstPad *pad, const GstCaps *caps) return newcaps; } if (gst_caps_structure_fixate_field_nearest_double (structure, "framerate", - 30.0)) { + 30.0)) { return newcaps; } @@ -266,7 +268,7 @@ gst_goom_src_fixate (GstPad *pad, const GstCaps *caps) } static void -gst_goom_chain (GstPad *pad, GstData *_data) +gst_goom_chain (GstPad * pad, GstData * _data) { GstBuffer *bufin = GST_BUFFER (_data); GstGOOM *goom; @@ -289,7 +291,7 @@ gst_goom_chain (GstPad *pad, GstData *_data) gst_event_discont_get_value (event, GST_FORMAT_TIME, &value); - goom->next_time = value; + goom->next_time = value; } default: gst_pad_event_default (pad, event); @@ -300,7 +302,7 @@ gst_goom_chain (GstPad *pad, GstData *_data) if (goom->channels == 0) { GST_ELEMENT_ERROR (goom, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + ("format wasn't negotiated before chain function")); goto done; } @@ -318,13 +320,12 @@ gst_goom_chain (GstPad *pad, GstData *_data) data = (gint16 *) GST_BUFFER_DATA (bufin); if (goom->channels == 2) { - for (i=0; i < 512; i++) { + for (i = 0; i < 512; i++) { goom->datain[0][i] = *data++; goom->datain[1][i] = *data++; } - } - else { - for (i=0; i < 512; i++) { + } else { + for (i = 0; i < 512; i++) { goom->datain[0][i] = *data; goom->datain[1][i] = *data++; } @@ -347,15 +348,15 @@ done: } static GstElementStateReturn -gst_goom_change_state (GstElement *element) -{ +gst_goom_change_state (GstElement * element) +{ GstGOOM *goom = GST_GOOM (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: break; case GST_STATE_READY_TO_NULL: - break; + break; case GST_STATE_READY_TO_PAUSED: goom->next_time = 0; goom->srcnegotiated = FALSE; @@ -374,20 +375,13 @@ gst_goom_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "goom", - GST_RANK_NONE, GST_TYPE_GOOM); + return gst_element_register (plugin, "goom", GST_RANK_NONE, GST_TYPE_GOOM); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "goom", - "GOOM visualization filter", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "goom", + "GOOM visualization filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/goom/lines.c b/gst/goom/lines.c index 131fd002..611f9a52 100644 --- a/gst/goom/lines.c +++ b/gst/goom/lines.c @@ -14,81 +14,94 @@ #include "lines.h" #include -extern unsigned int resolx,resoly; +extern unsigned int resolx, resoly; -inline unsigned char lighten(unsigned char value,unsigned char power) +inline unsigned char +lighten (unsigned char value, unsigned char power) { - unsigned char i; - for (i=0;i < power; i++) value += (255-value)/5; - return value; + unsigned char i; + + for (i = 0; i < power; i++) + value += (255 - value) / 5; + return value; } -void goom_lines(gint16 data [2][512], unsigned int ID,unsigned int* p, guint32 power) +void +goom_lines (gint16 data[2][512], unsigned int ID, unsigned int *p, + guint32 power) { - guint32 color1; - guint32 color2; - unsigned char * color = 1 + (unsigned char *) &color1; + guint32 color1; + guint32 color2; + unsigned char *color = 1 + (unsigned char *) &color1; + + switch (ID) { + case 0: /* Horizontal stereo lines */ + { + color1 = 0x0000AA00; + color2 = 0x00AA0000; + break; + } + + case 1: /* Stereo circles */ + { + color1 = 0x00AA33DD; + color2 = 0x00AA33DD; + break; + } + } + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color = 1 + (unsigned char *) &color2; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); - switch (ID) + switch (ID) { + case 0: /* Horizontal stereo lines */ { - case 0: /* Horizontal stereo lines */ - { - color1 = 0x0000AA00; - color2 = 0x00AA0000; - break; - } + unsigned int i; + + for (i = 0; i < 512; i++) { + guint32 plot; - case 1: /* Stereo circles */ - { - color1 = 0x00AA33DD; - color2 = 0x00AA33DD; - break; - } + plot = i * resolx / 512 + (resoly / 4 + data[0][i] / 1600) * resolx; + p[plot] = color1; + p[plot + 1] = color1; + plot = i * resolx / 512 + (resoly * 3 / 4 - data[1][i] / 1600) * resolx; + p[plot] = color2; + p[plot + 1] = color2; + } + break; } - *color = lighten(*color,power); - color++; - * color = lighten(*color,power); - color++; - * color = lighten(*color,power); - color = 1 + (unsigned char *) &color2; - * color = lighten(*color,power); - color++; - * color = lighten(*color,power); - color++; - * color = lighten(*color,power); - - switch (ID) + + case 1: /* Stereo circles */ { - case 0: /* Horizontal stereo lines */ - { - unsigned int i; - for (i=0;i<512;i++) - { - guint32 plot ; - plot = i * resolx / 512 + (resoly / 4 + data[0][i] / 1600) * resolx; - p[plot] = color1; - p[plot+1] = color1; - plot = i * resolx / 512 + (resoly * 3 / 4 - data[1][i] / 1600) * resolx; - p[plot] = color2; - p[plot+1] = color2; - } - break; - } + float z; + unsigned int monX = resolx / 2; + float monY = resoly / 4; + float monY2 = resoly / 2; - case 1: /* Stereo circles */ - { - float z; - unsigned int monX = resolx/2; - float monY = resoly/4; - float monY2 = resoly/2; - for (z=0;z<6.2832f; z+=1.0f/monY) - { - /* float offset1 = 128+data[1][(unsigned int)(z*81.33f)])/200000; */ - p[ monX + (unsigned int)( (monY + ((float)resoly) * (128+data[1][(unsigned int)(z*81.33f)])/200000) * cos (z) + resolx * (unsigned int)( monY2 + (monY + ((float)resoly)*(128+data[1][(unsigned int)(z*81.33f)])/400000) * sin (z)))] = color1; - p[ monX + (unsigned int)((monY - ((float)resoly) * (128+data[0][(unsigned int)(z*81.33f)])/200000) * cos (z) + resolx * (unsigned int)( monY2 + (monY - ((float)resoly)*(128+data[0][(unsigned int)(z*81.33f)])/400000) * sin (z)))] = color2; - } - break; - } + for (z = 0; z < 6.2832f; z += 1.0f / monY) { + /* float offset1 = 128+data[1][(unsigned int)(z*81.33f)])/200000; */ + p[monX + (unsigned int) ((monY + ((float) resoly) * (128 + + data[1][(unsigned int) (z * 81.33f)]) / 200000) * + cos (z) + resolx * (unsigned int) (monY2 + (monY + + ((float) resoly) * (128 + + data[1][(unsigned int) (z * 81.33f)]) / 400000) * + sin (z)))] = color1; + p[monX + (unsigned int) ((monY - ((float) resoly) * (128 + + data[0][(unsigned int) (z * 81.33f)]) / 200000) * + cos (z) + resolx * (unsigned int) (monY2 + (monY - + ((float) resoly) * (128 + + data[0][(unsigned int) (z * 81.33f)]) / 400000) * + sin (z)))] = color2; + } + break; } + } } - diff --git a/gst/goom/lines.h b/gst/goom/lines.h index 3582d380..988605ee 100644 --- a/gst/goom/lines.h +++ b/gst/goom/lines.h @@ -10,6 +10,6 @@ #include "graphic.h" -void goom_lines(gint16 data [2][512], unsigned int ID,unsigned int* p, guint32 power); -void goom_lines_conf(gint16 config [25]); - +void goom_lines (gint16 data[2][512], unsigned int ID, unsigned int *p, + guint32 power); +void goom_lines_conf (gint16 config[25]); diff --git a/gst/law/alaw-decode.c b/gst/law/alaw-decode.c index 00108948..4bae398e 100644 --- a/gst/law/alaw-decode.c +++ b/gst/law/alaw-decode.c @@ -36,100 +36,108 @@ static GstElementDetails alawdec_details = { }; /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; -static void gst_alawdec_class_init (GstALawDecClass *klass); -static void gst_alawdec_base_init (GstALawDecClass *klass); -static void gst_alawdec_init (GstALawDec *alawdec); +static void gst_alawdec_class_init (GstALawDecClass * klass); +static void gst_alawdec_base_init (GstALawDecClass * klass); +static void gst_alawdec_init (GstALawDec * alawdec); -static void gst_alawdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_alawdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_alawdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_alawdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_alawdec_chain (GstPad *pad, GstData *_data); +static void gst_alawdec_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ /* * alaw_to_s16() - Convert an A-law value to 16-bit linear PCM * */ -static gint alaw_to_s16(guint8 a_val) +static gint +alaw_to_s16 (guint8 a_val) { - gint t; - gint seg; - - a_val ^= 0x55; - t = a_val & 0x7f; - if (t < 16) - t = (t << 4) + 8; - else { - seg = (t >> 4) & 0x07; - t = ((t & 0x0f) << 4) + 0x108; - t <<= seg -1; - } - return ((a_val & 0x80) ? t : -t); + gint t; + gint seg; + + a_val ^= 0x55; + t = a_val & 0x7f; + if (t < 16) + t = (t << 4) + 8; + else { + seg = (t >> 4) & 0x07; + t = ((t & 0x0f) << 4) + 0x108; + t <<= seg - 1; + } + return ((a_val & 0x80) ? t : -t); } static GstPadLinkReturn -alawdec_link (GstPad *pad, const GstCaps *caps) +alawdec_link (GstPad * pad, const GstCaps * caps) { - GstCaps* tempcaps; + GstCaps *tempcaps; gint rate, channels; GstStructure *structure; gboolean ret; - - GstALawDec* alawdec = GST_ALAWDEC (GST_OBJECT_PARENT (pad)); - + + GstALawDec *alawdec = GST_ALAWDEC (GST_OBJECT_PARENT (pad)); + structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret &= gst_structure_get_int (structure, "channels", &channels); - if (!ret) return GST_PAD_LINK_REFUSED; - - tempcaps = gst_caps_new_simple ( "audio/x-raw-int", - "depth", G_TYPE_INT, 16, - "width", G_TYPE_INT, 16, - "signed", G_TYPE_BOOLEAN, TRUE, - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "rate", G_TYPE_INT, rate, - "channels", G_TYPE_INT, channels, - NULL); - + if (!ret) + return GST_PAD_LINK_REFUSED; + + tempcaps = gst_caps_new_simple ("audio/x-raw-int", + "depth", G_TYPE_INT, 16, + "width", G_TYPE_INT, 16, + "signed", G_TYPE_BOOLEAN, TRUE, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); + return gst_pad_try_set_caps (alawdec->srcpad, tempcaps); } GType -gst_alawdec_get_type(void) { +gst_alawdec_get_type (void) +{ static GType alawdec_type = 0; if (!alawdec_type) { static const GTypeInfo alawdec_info = { - sizeof(GstALawDecClass), - (GBaseInitFunc)gst_alawdec_base_init, + sizeof (GstALawDecClass), + (GBaseInitFunc) gst_alawdec_base_init, NULL, - (GClassInitFunc)gst_alawdec_class_init, + (GClassInitFunc) gst_alawdec_class_init, NULL, NULL, - sizeof(GstALawDec), + sizeof (GstALawDec), 0, - (GInstanceInitFunc)gst_alawdec_init, + (GInstanceInitFunc) gst_alawdec_init, }; - alawdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstALawDec", &alawdec_info, 0); + alawdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstALawDec", &alawdec_info, + 0); } return alawdec_type; } static void -gst_alawdec_base_init (GstALawDecClass *klass) +gst_alawdec_base_init (GstALawDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -139,74 +147,75 @@ gst_alawdec_base_init (GstALawDecClass *klass) } static void -gst_alawdec_class_init (GstALawDecClass *klass) +gst_alawdec_class_init (GstALawDecClass * 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_alawdec_set_property; gobject_class->get_property = gst_alawdec_get_property; } static void -gst_alawdec_init (GstALawDec *alawdec) +gst_alawdec_init (GstALawDec * alawdec) { - alawdec->sinkpad = gst_pad_new_from_template(alawdec_sink_template,"sink"); - alawdec->srcpad = gst_pad_new_from_template(alawdec_src_template,"src"); - gst_pad_set_link_function(alawdec->sinkpad, alawdec_link); + alawdec->sinkpad = gst_pad_new_from_template (alawdec_sink_template, "sink"); + alawdec->srcpad = gst_pad_new_from_template (alawdec_src_template, "src"); + gst_pad_set_link_function (alawdec->sinkpad, alawdec_link); - gst_element_add_pad(GST_ELEMENT(alawdec),alawdec->sinkpad); - gst_pad_set_chain_function(alawdec->sinkpad,gst_alawdec_chain); - gst_element_add_pad(GST_ELEMENT(alawdec),alawdec->srcpad); + gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->sinkpad); + gst_pad_set_chain_function (alawdec->sinkpad, gst_alawdec_chain); + gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->srcpad); } static void -gst_alawdec_chain (GstPad *pad,GstData *_data) +gst_alawdec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstALawDec *alawdec; gint16 *linear_data; guint8 *alaw_data; - GstBuffer* outbuf; + GstBuffer *outbuf; gint i; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); - alawdec = GST_ALAWDEC(GST_OBJECT_PARENT (pad)); - g_return_if_fail(alawdec != NULL); - g_return_if_fail(GST_IS_ALAWDEC(alawdec)); + alawdec = GST_ALAWDEC (GST_OBJECT_PARENT (pad)); + g_return_if_fail (alawdec != NULL); + g_return_if_fail (GST_IS_ALAWDEC (alawdec)); - alaw_data = (guint8 *)GST_BUFFER_DATA(buf); - outbuf=gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = (gchar*)g_new(gint16,GST_BUFFER_SIZE(buf)); - GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf)*2; + alaw_data = (guint8 *) GST_BUFFER_DATA (buf); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = (gchar *) g_new (gint16, GST_BUFFER_SIZE (buf)); + GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf) * 2; - linear_data = (gint16*)GST_BUFFER_DATA(outbuf); - for (i = 0; i < GST_BUFFER_SIZE(buf); i++) { + linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); + for (i = 0; i < GST_BUFFER_SIZE (buf); i++) { *linear_data = alaw_to_s16 (*alaw_data); linear_data++; alaw_data++; } - - gst_buffer_unref(buf); - gst_pad_push(alawdec->srcpad,GST_DATA (outbuf)); + + gst_buffer_unref (buf); + gst_pad_push (alawdec->srcpad, GST_DATA (outbuf)); } static void -gst_alawdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_alawdec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstALawDec *alawdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ALAWDEC(object)); - alawdec = GST_ALAWDEC(object); + g_return_if_fail (GST_IS_ALAWDEC (object)); + alawdec = GST_ALAWDEC (object); switch (prop_id) { default: @@ -215,13 +224,14 @@ gst_alawdec_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -gst_alawdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_alawdec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstALawDec *alawdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ALAWDEC(object)); - alawdec = GST_ALAWDEC(object); + g_return_if_fail (GST_IS_ALAWDEC (object)); + alawdec = GST_ALAWDEC (object); switch (prop_id) { default: @@ -229,5 +239,3 @@ gst_alawdec_get_property (GObject *object, guint prop_id, GValue *value, GParamS break; } } - - diff --git a/gst/law/alaw-decode.h b/gst/law/alaw-decode.h index aa3a418c..8a6ac61b 100644 --- a/gst/law/alaw-decode.h +++ b/gst/law/alaw-decode.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_ALAWDEC \ @@ -42,27 +43,29 @@ extern "C" { #define GST_IS_ALAWDEC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAWDEC)) -typedef struct _GstALawDec GstALawDec; -typedef struct _GstALawDecClass GstALawDecClass; + typedef struct _GstALawDec GstALawDec; + typedef struct _GstALawDecClass GstALawDecClass; -struct _GstALawDec { - GstElement element; + struct _GstALawDec + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - /*MetaAudioRaw meta; */ + /*MetaAudioRaw meta; */ -}; + }; -struct _GstALawDecClass { - GstElementClass parent_class; -}; + struct _GstALawDecClass + { + GstElementClass parent_class; + }; -GType gst_alawdec_get_type(void); + GType gst_alawdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c index 6efdb64f..052f2e00 100644 --- a/gst/law/alaw-encode.c +++ b/gst/law/alaw-encode.c @@ -36,23 +36,27 @@ static GstElementDetails alawenc_details = { }; /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; -static void gst_alawenc_class_init (GstALawEncClass *klass); -static void gst_alawenc_base_init (GstALawEncClass *klass); -static void gst_alawenc_init (GstALawEnc *alawenc); +static void gst_alawenc_class_init (GstALawEncClass * klass); +static void gst_alawenc_base_init (GstALawEncClass * klass); +static void gst_alawenc_init (GstALawEnc * alawenc); -static void gst_alawenc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_alawenc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_alawenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_alawenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_alawenc_chain (GstPad *pad, GstData *_data); +static void gst_alawenc_chain (GstPad * pad, GstData * _data); /* * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law @@ -74,102 +78,108 @@ static void gst_alawenc_chain (GstPad *pad, GstData *_data); * John Wiley & Sons, pps 98-111 and 472-476. */ -static inline gint val_seg(gint val) +static inline gint +val_seg (gint val) { - gint r = 1; - val >>= 8; - if (val & 0xf0) { - val >>= 4; - r += 4; - } - if (val & 0x0c) { - val >>= 2; - r += 2; - } - if (val & 0x02) - r += 1; - return r; + gint r = 1; + + val >>= 8; + if (val & 0xf0) { + val >>= 4; + r += 4; + } + if (val & 0x0c) { + val >>= 2; + r += 2; + } + if (val & 0x02) + r += 1; + return r; } -static guint8 s16_to_alaw(gint pcm_val) +static guint8 +s16_to_alaw (gint pcm_val) { - gint seg; - guint8 mask; - guint8 aval; - - if (pcm_val >= 0) { - mask = 0xD5; - } else { - mask = 0x55; - pcm_val = -pcm_val; - if (pcm_val > 0x7fff) - pcm_val = 0x7fff; - } - - if (pcm_val < 256) - aval = pcm_val >> 4; - else { - /* Convert the scaled magnitude to segment number. */ - seg = val_seg(pcm_val); - aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); - } - return aval ^ mask; + gint seg; + guint8 mask; + guint8 aval; + + if (pcm_val >= 0) { + mask = 0xD5; + } else { + mask = 0x55; + pcm_val = -pcm_val; + if (pcm_val > 0x7fff) + pcm_val = 0x7fff; + } + + if (pcm_val < 256) + aval = pcm_val >> 4; + else { + /* Convert the scaled magnitude to segment number. */ + seg = val_seg (pcm_val); + aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); + } + return aval ^ mask; } static GstElementClass *parent_class = NULL; + /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ static GstPadLinkReturn -alawenc_link (GstPad *pad, const GstCaps *caps) +alawenc_link (GstPad * pad, const GstCaps * caps) { - GstCaps* tempcaps; + GstCaps *tempcaps; gint rate, channels; GstStructure *structure; gboolean ret; - - GstALawEnc* alawenc = GST_ALAWENC (GST_OBJECT_PARENT (pad)); - + + GstALawEnc *alawenc = GST_ALAWENC (GST_OBJECT_PARENT (pad)); + structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret &= gst_structure_get_int (structure, "channels", &channels); - if (!ret) return GST_PAD_LINK_REFUSED; - + if (!ret) + return GST_PAD_LINK_REFUSED; + tempcaps = gst_caps_new_simple ("audio/x-alaw", - "depth", G_TYPE_INT, 8, - "width", G_TYPE_INT, 8, - "signed", G_TYPE_BOOLEAN, FALSE, - "rate", G_TYPE_INT, rate, - "channels", G_TYPE_INT, channels, - NULL); - + "depth", G_TYPE_INT, 8, + "width", G_TYPE_INT, 8, + "signed", G_TYPE_BOOLEAN, FALSE, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); + return gst_pad_try_set_caps (alawenc->srcpad, tempcaps); -} +} GType -gst_alawenc_get_type(void) { +gst_alawenc_get_type (void) +{ static GType alawenc_type = 0; if (!alawenc_type) { static const GTypeInfo alawenc_info = { - sizeof(GstALawEncClass), - (GBaseInitFunc)gst_alawenc_base_init, + sizeof (GstALawEncClass), + (GBaseInitFunc) gst_alawenc_base_init, NULL, - (GClassInitFunc)gst_alawenc_class_init, + (GClassInitFunc) gst_alawenc_class_init, NULL, NULL, - sizeof(GstALawEnc), + sizeof (GstALawEnc), 0, - (GInstanceInitFunc)gst_alawenc_init, + (GInstanceInitFunc) gst_alawenc_init, }; - alawenc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstALawEnc", &alawenc_info, 0); + alawenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstALawEnc", &alawenc_info, + 0); } return alawenc_type; } static void -gst_alawenc_base_init (GstALawEncClass *klass) +gst_alawenc_base_init (GstALawEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -179,74 +189,76 @@ gst_alawenc_base_init (GstALawEncClass *klass) } static void -gst_alawenc_class_init (GstALawEncClass *klass) +gst_alawenc_class_init (GstALawEncClass * 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_alawenc_set_property; gobject_class->get_property = gst_alawenc_get_property; } static void -gst_alawenc_init (GstALawEnc *alawenc) +gst_alawenc_init (GstALawEnc * alawenc) { - alawenc->sinkpad = gst_pad_new_from_template(alawenc_sink_template,"sink"); - alawenc->srcpad = gst_pad_new_from_template(alawenc_src_template,"src"); + alawenc->sinkpad = gst_pad_new_from_template (alawenc_sink_template, "sink"); + alawenc->srcpad = gst_pad_new_from_template (alawenc_src_template, "src"); gst_pad_set_link_function (alawenc->sinkpad, alawenc_link); - gst_element_add_pad(GST_ELEMENT(alawenc),alawenc->sinkpad); - gst_pad_set_chain_function(alawenc->sinkpad,gst_alawenc_chain); - gst_element_add_pad(GST_ELEMENT(alawenc),alawenc->srcpad); + gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->sinkpad); + gst_pad_set_chain_function (alawenc->sinkpad, gst_alawenc_chain); + gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad); } static void -gst_alawenc_chain (GstPad *pad,GstData *_data) +gst_alawenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstALawEnc *alawenc; gint16 *linear_data; guint8 *alaw_data; - GstBuffer* outbuf; + GstBuffer *outbuf; gint i; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); + + alawenc = GST_ALAWENC (GST_OBJECT_PARENT (pad)); + g_return_if_fail (alawenc != NULL); + g_return_if_fail (GST_IS_ALAWENC (alawenc)); - alawenc = GST_ALAWENC(GST_OBJECT_PARENT (pad)); - g_return_if_fail(alawenc != NULL); - g_return_if_fail(GST_IS_ALAWENC(alawenc)); + linear_data = (gint16 *) GST_BUFFER_DATA (buf); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = + (gchar *) g_new (guint8, GST_BUFFER_SIZE (buf) / 2); + GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf) / 2; - linear_data = (gint16 *)GST_BUFFER_DATA(buf); - outbuf=gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = (gchar*)g_new(guint8,GST_BUFFER_SIZE(buf)/2); - GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf)/2; - - alaw_data = (guint8*)GST_BUFFER_DATA(outbuf); - for (i = 0; i < GST_BUFFER_SIZE(outbuf); i++) { + alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); + for (i = 0; i < GST_BUFFER_SIZE (outbuf); i++) { *alaw_data = s16_to_alaw (*linear_data); alaw_data++; linear_data++; } - gst_buffer_unref(buf); - gst_pad_push(alawenc->srcpad,GST_DATA (outbuf)); + gst_buffer_unref (buf); + gst_pad_push (alawenc->srcpad, GST_DATA (outbuf)); } static void -gst_alawenc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_alawenc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstALawEnc *alawenc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ALAWENC(object)); - alawenc = GST_ALAWENC(object); + g_return_if_fail (GST_IS_ALAWENC (object)); + alawenc = GST_ALAWENC (object); switch (prop_id) { default: @@ -255,13 +267,14 @@ gst_alawenc_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -gst_alawenc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_alawenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstALawEnc *alawenc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_ALAWENC(object)); - alawenc = GST_ALAWENC(object); + g_return_if_fail (GST_IS_ALAWENC (object)); + alawenc = GST_ALAWENC (object); switch (prop_id) { default: diff --git a/gst/law/alaw-encode.h b/gst/law/alaw-encode.h index e0801036..907fa3d8 100644 --- a/gst/law/alaw-encode.h +++ b/gst/law/alaw-encode.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_ALAWENC \ @@ -42,27 +43,29 @@ extern "C" { #define GST_IS_ALAWENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAWENC)) -typedef struct _GstALawEnc GstALawEnc; -typedef struct _GstALawEncClass GstALawEncClass; + typedef struct _GstALawEnc GstALawEnc; + typedef struct _GstALawEncClass GstALawEncClass; -struct _GstALawEnc { - GstElement element; + struct _GstALawEnc + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - /*MetaAudioRaw meta; */ + /*MetaAudioRaw meta; */ -}; + }; -struct _GstALawEncClass { - GstElementClass parent_class; -}; + struct _GstALawEncClass + { + GstElementClass parent_class; + }; -GType gst_alawenc_get_type(void); + GType gst_alawenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/alaw.c b/gst/law/alaw.c index be0559bb..05ac2d23 100644 --- a/gst/law/alaw.c +++ b/gst/law/alaw.c @@ -4,62 +4,58 @@ #include "alaw-encode.h" #include "alaw-decode.h" -static GstCaps* +static GstCaps * alaw_factory (void) { return gst_caps_new_simple ("audio/x-alaw", - "rate", GST_TYPE_INT_RANGE, 8000, 192000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "rate", GST_TYPE_INT_RANGE, 8000, 192000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } -static GstCaps* +static GstCaps * linear_factory (void) { return gst_caps_new_simple ("audio/x-raw-int", - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "rate", GST_TYPE_INT_RANGE, 8000, 192000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", GST_TYPE_INT_RANGE, 8000, 192000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } GstPadTemplate *alawenc_src_template, *alawenc_sink_template; GstPadTemplate *alawdec_src_template, *alawdec_sink_template; static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - GstCaps* alaw_caps, *linear_caps; + GstCaps *alaw_caps, *linear_caps; alaw_caps = alaw_factory (); linear_caps = linear_factory (); - alawenc_src_template = gst_pad_template_new ("src",GST_PAD_SRC,GST_PAD_ALWAYS,alaw_caps); - alawenc_sink_template = gst_pad_template_new ("sink",GST_PAD_SINK,GST_PAD_ALWAYS,linear_caps); + alawenc_src_template = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, alaw_caps); + alawenc_sink_template = + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, linear_caps); - alawdec_src_template = gst_pad_template_new ("src",GST_PAD_SRC,GST_PAD_ALWAYS,linear_caps); - alawdec_sink_template = gst_pad_template_new ("sink",GST_PAD_SINK,GST_PAD_ALWAYS,alaw_caps); + alawdec_src_template = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, linear_caps); + alawdec_sink_template = + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, alaw_caps); if (!gst_element_register (plugin, "alawenc", - GST_RANK_NONE, GST_TYPE_ALAWENC) || + GST_RANK_NONE, GST_TYPE_ALAWENC) || !gst_element_register (plugin, "alawdec", - GST_RANK_PRIMARY, GST_TYPE_ALAWENC)) + GST_RANK_PRIMARY, GST_TYPE_ALAWENC)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "alaw", - "ALaw audio conversion routines", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "alaw", + "ALaw audio conversion routines", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/law/mulaw-conversion.c b/gst/law/mulaw-conversion.c index e921fb88..fa4db3cb 100644 --- a/gst/law/mulaw-conversion.c +++ b/gst/law/mulaw-conversion.c @@ -25,49 +25,53 @@ #include -#define ZEROTRAP /* turn on the trap as per the MIL-STD */ -#define BIAS 0x84 /* define the add-in bias for 16 bit samples */ +#define ZEROTRAP /* turn on the trap as per the MIL-STD */ +#define BIAS 0x84 /* define the add-in bias for 16 bit samples */ #define CLIP 32635 void -mulaw_encode(gint16* in, guint8* out, gint numsamples) +mulaw_encode (gint16 * in, guint8 * out, gint numsamples) { - static gint16 exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}; - gint16 sign, exponent, mantissa,i; - gint16 sample; - guint8 ulawbyte; + static gint16 exp_lut[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + }; + gint16 sign, exponent, mantissa, i; + gint16 sample; + guint8 ulawbyte; - for(i=0;i> 8) & 0x80; /* set aside the sign */ - if (sign != 0) sample = -sample; /* get magnitude */ - if (sample > CLIP) sample = CLIP; /* clip the magnitude */ + sign = (sample >> 8) & 0x80; /* set aside the sign */ + if (sign != 0) + sample = -sample; /* get magnitude */ + if (sample > CLIP) + sample = CLIP; /* clip the magnitude */ /** convert from 16 bit linear to ulaw **/ - sample = sample + BIAS; - exponent = exp_lut[(sample>>7) & 0xFF]; - mantissa = (sample >> (exponent+3)) & 0x0F; - ulawbyte = ~(sign | (exponent << 4) | mantissa); + sample = sample + BIAS; + exponent = exp_lut[(sample >> 7) & 0xFF]; + mantissa = (sample >> (exponent + 3)) & 0x0F; + ulawbyte = ~(sign | (exponent << 4) | mantissa); #ifdef ZEROTRAP - if (ulawbyte == 0 ) ulawbyte = 0x02; /* optional CCITT trap */ + if (ulawbyte == 0) + ulawbyte = 0x02; /* optional CCITT trap */ #endif - out[i]=ulawbyte; - } + out[i] = ulawbyte; + } } /* @@ -87,20 +91,22 @@ mulaw_encode(gint16* in, guint8* out, gint numsamples) */ void -mulaw_decode(guint8* in,gint16* out,gint numsamples) +mulaw_decode (guint8 * in, gint16 * out, gint numsamples) { - static gint16 exp_lut[8]={0,132,396,924,1980,4092,8316,16764}; - gint16 sign, exponent, mantissa; - guint8 ulawbyte; - gint16 linear,i; - for(i=0;i> 4) & 0x07; - mantissa = ulawbyte & 0x0F; - linear = exp_lut[exponent] + (mantissa << (exponent+3)); - if (sign != 0) linear = -linear; - out[i]=linear; - } + static gint16 exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 }; + gint16 sign, exponent, mantissa; + guint8 ulawbyte; + gint16 linear, i; + + for (i = 0; i < numsamples; i++) { + ulawbyte = in[i]; + ulawbyte = ~ulawbyte; + sign = (ulawbyte & 0x80); + exponent = (ulawbyte >> 4) & 0x07; + mantissa = ulawbyte & 0x0F; + linear = exp_lut[exponent] + (mantissa << (exponent + 3)); + if (sign != 0) + linear = -linear; + out[i] = linear; + } } diff --git a/gst/law/mulaw-conversion.h b/gst/law/mulaw-conversion.h index 55180121..db07789d 100644 --- a/gst/law/mulaw-conversion.h +++ b/gst/law/mulaw-conversion.h @@ -3,8 +3,6 @@ #include -void -mulaw_encode(gint16* in, guint8* out, gint numsamples); -void -mulaw_decode(guint8* in,gint16* out,gint numsamples); +void mulaw_encode (gint16 * in, guint8 * out, gint numsamples); +void mulaw_decode (guint8 * in, gint16 * out, gint numsamples); #endif diff --git a/gst/law/mulaw-decode.c b/gst/law/mulaw-decode.c index fcf023c1..6a8f9e81 100644 --- a/gst/law/mulaw-decode.c +++ b/gst/law/mulaw-decode.c @@ -35,79 +35,86 @@ static GstElementDetails mulawdec_details = { }; /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; -static void gst_mulawdec_class_init (GstMuLawDecClass *klass); -static void gst_mulawdec_base_init (GstMuLawDecClass *klass); -static void gst_mulawdec_init (GstMuLawDec *mulawdec); +static void gst_mulawdec_class_init (GstMuLawDecClass * klass); +static void gst_mulawdec_base_init (GstMuLawDecClass * klass); +static void gst_mulawdec_init (GstMuLawDec * mulawdec); -static void gst_mulawdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_mulawdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_mulawdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mulawdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_mulawdec_chain (GstPad *pad, GstData *_data); +static void gst_mulawdec_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 };*/ static GstPadLinkReturn -mulawdec_link (GstPad *pad, const GstCaps *caps) +mulawdec_link (GstPad * pad, const GstCaps * caps) { - GstCaps* tempcaps; + GstCaps *tempcaps; gint rate, channels; GstStructure *structure; gboolean ret; - - GstMuLawDec* mulawdec = GST_MULAWDEC (GST_OBJECT_PARENT (pad)); - + + GstMuLawDec *mulawdec = GST_MULAWDEC (GST_OBJECT_PARENT (pad)); + structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret = gst_structure_get_int (structure, "channels", &channels); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; tempcaps = gst_caps_new_simple ("audio/x-raw-int", - "depth", G_TYPE_INT, 16, - "width", G_TYPE_INT, 16, - "signed", G_TYPE_BOOLEAN, TRUE, - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "rate", G_TYPE_INT, rate, - "channels", G_TYPE_INT, channels, - NULL); + "depth", G_TYPE_INT, 16, + "width", G_TYPE_INT, 16, + "signed", G_TYPE_BOOLEAN, TRUE, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); return gst_pad_try_set_caps (mulawdec->srcpad, tempcaps); } GType -gst_mulawdec_get_type(void) { +gst_mulawdec_get_type (void) +{ static GType mulawdec_type = 0; if (!mulawdec_type) { static const GTypeInfo mulawdec_info = { - sizeof(GstMuLawDecClass), - (GBaseInitFunc)gst_mulawdec_base_init, + sizeof (GstMuLawDecClass), + (GBaseInitFunc) gst_mulawdec_base_init, NULL, - (GClassInitFunc)gst_mulawdec_class_init, + (GClassInitFunc) gst_mulawdec_class_init, NULL, NULL, - sizeof(GstMuLawDec), + sizeof (GstMuLawDec), 0, - (GInstanceInitFunc)gst_mulawdec_init, + (GInstanceInitFunc) gst_mulawdec_init, }; - mulawdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMuLawDec", &mulawdec_info, 0); + mulawdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawDec", &mulawdec_info, + 0); } return mulawdec_type; } static void -gst_mulawdec_base_init (GstMuLawDecClass *klass) +gst_mulawdec_base_init (GstMuLawDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -117,69 +124,71 @@ gst_mulawdec_base_init (GstMuLawDecClass *klass) } static void -gst_mulawdec_class_init (GstMuLawDecClass *klass) +gst_mulawdec_class_init (GstMuLawDecClass * 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_mulawdec_set_property; gobject_class->get_property = gst_mulawdec_get_property; } static void -gst_mulawdec_init (GstMuLawDec *mulawdec) +gst_mulawdec_init (GstMuLawDec * mulawdec) { - mulawdec->sinkpad = gst_pad_new_from_template(mulawdec_sink_template,"sink"); - mulawdec->srcpad = gst_pad_new_from_template(mulawdec_src_template,"src"); - gst_pad_set_link_function(mulawdec->sinkpad, mulawdec_link); - - gst_element_add_pad(GST_ELEMENT(mulawdec),mulawdec->sinkpad); - gst_pad_set_chain_function(mulawdec->sinkpad,gst_mulawdec_chain); - gst_element_add_pad(GST_ELEMENT(mulawdec),mulawdec->srcpad); + mulawdec->sinkpad = + gst_pad_new_from_template (mulawdec_sink_template, "sink"); + mulawdec->srcpad = gst_pad_new_from_template (mulawdec_src_template, "src"); + gst_pad_set_link_function (mulawdec->sinkpad, mulawdec_link); + + gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->sinkpad); + gst_pad_set_chain_function (mulawdec->sinkpad, gst_mulawdec_chain); + gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->srcpad); } static void -gst_mulawdec_chain (GstPad *pad,GstData *_data) +gst_mulawdec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMuLawDec *mulawdec; gint16 *linear_data; guint8 *mulaw_data; - GstBuffer* outbuf; + GstBuffer *outbuf; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); - mulawdec = GST_MULAWDEC(GST_OBJECT_PARENT (pad)); - g_return_if_fail(mulawdec != NULL); - g_return_if_fail(GST_IS_MULAWDEC(mulawdec)); + mulawdec = GST_MULAWDEC (GST_OBJECT_PARENT (pad)); + g_return_if_fail (mulawdec != NULL); + g_return_if_fail (GST_IS_MULAWDEC (mulawdec)); - mulaw_data = (guint8 *)GST_BUFFER_DATA(buf); - outbuf=gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = (gchar*)g_new(gint16,GST_BUFFER_SIZE(buf)); - GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf)*2; + mulaw_data = (guint8 *) GST_BUFFER_DATA (buf); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = (gchar *) g_new (gint16, GST_BUFFER_SIZE (buf)); + GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf) * 2; - linear_data = (gint16*)GST_BUFFER_DATA(outbuf); - mulaw_decode(mulaw_data,linear_data,GST_BUFFER_SIZE(buf)); + linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); + mulaw_decode (mulaw_data, linear_data, GST_BUFFER_SIZE (buf)); - gst_buffer_unref(buf); - gst_pad_push(mulawdec->srcpad,GST_DATA (outbuf)); + gst_buffer_unref (buf); + gst_pad_push (mulawdec->srcpad, GST_DATA (outbuf)); } static void -gst_mulawdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_mulawdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMuLawDec *mulawdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MULAWDEC(object)); - mulawdec = GST_MULAWDEC(object); + g_return_if_fail (GST_IS_MULAWDEC (object)); + mulawdec = GST_MULAWDEC (object); switch (prop_id) { default: @@ -188,13 +197,14 @@ gst_mulawdec_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_mulawdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_mulawdec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMuLawDec *mulawdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MULAWDEC(object)); - mulawdec = GST_MULAWDEC(object); + g_return_if_fail (GST_IS_MULAWDEC (object)); + mulawdec = GST_MULAWDEC (object); switch (prop_id) { default: diff --git a/gst/law/mulaw-decode.h b/gst/law/mulaw-decode.h index d34c8c06..9fb32267 100644 --- a/gst/law/mulaw-decode.h +++ b/gst/law/mulaw-decode.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MULAWDEC \ @@ -42,27 +43,29 @@ extern "C" { #define GST_IS_MULAWDEC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWDEC)) -typedef struct _GstMuLawDec GstMuLawDec; -typedef struct _GstMuLawDecClass GstMuLawDecClass; + typedef struct _GstMuLawDec GstMuLawDec; + typedef struct _GstMuLawDecClass GstMuLawDecClass; -struct _GstMuLawDec { - GstElement element; + struct _GstMuLawDec + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - /*MetaAudioRaw meta; */ + /*MetaAudioRaw meta; */ -}; + }; -struct _GstMuLawDecClass { - GstElementClass parent_class; -}; + struct _GstMuLawDecClass + { + GstElementClass parent_class; + }; -GType gst_mulawdec_get_type(void); + GType gst_mulawdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c index b15815a1..db65e169 100644 --- a/gst/law/mulaw-encode.c +++ b/gst/law/mulaw-encode.c @@ -35,77 +35,84 @@ static GstElementDetails mulawenc_details = { }; /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; -static void gst_mulawenc_class_init (GstMuLawEncClass *klass); -static void gst_mulawenc_base_init (GstMuLawEncClass *klass); -static void gst_mulawenc_init (GstMuLawEnc *mulawenc); +static void gst_mulawenc_class_init (GstMuLawEncClass * klass); +static void gst_mulawenc_base_init (GstMuLawEncClass * klass); +static void gst_mulawenc_init (GstMuLawEnc * mulawenc); -static void gst_mulawenc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_mulawenc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_mulawenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mulawenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_mulawenc_chain (GstPad *pad, GstData *_data); +static void gst_mulawenc_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ static GstPadLinkReturn -mulawenc_link (GstPad *pad, const GstCaps *caps) +mulawenc_link (GstPad * pad, const GstCaps * caps) { - GstCaps* tempcaps; + GstCaps *tempcaps; gint rate, channels; GstStructure *structure; gboolean ret; - - GstMuLawEnc* mulawenc = GST_MULAWENC (GST_OBJECT_PARENT (pad)); - + + GstMuLawEnc *mulawenc = GST_MULAWENC (GST_OBJECT_PARENT (pad)); + structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret = gst_structure_get_int (structure, "channels", &channels); - if (!ret) return GST_PAD_LINK_REFUSED; - + if (!ret) + return GST_PAD_LINK_REFUSED; + tempcaps = gst_caps_new_simple ("audio/x-mulaw", - "depth", G_TYPE_INT, 8, - "width", G_TYPE_INT, 8, - "signed", G_TYPE_BOOLEAN, FALSE, - "rate", G_TYPE_INT, rate, - "channels", G_TYPE_INT, channels, - NULL); - + "depth", G_TYPE_INT, 8, + "width", G_TYPE_INT, 8, + "signed", G_TYPE_BOOLEAN, FALSE, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); + return gst_pad_try_set_caps (mulawenc->srcpad, tempcaps); } GType -gst_mulawenc_get_type(void) { +gst_mulawenc_get_type (void) +{ static GType mulawenc_type = 0; if (!mulawenc_type) { static const GTypeInfo mulawenc_info = { - sizeof(GstMuLawEncClass), - (GBaseInitFunc)gst_mulawenc_base_init, + sizeof (GstMuLawEncClass), + (GBaseInitFunc) gst_mulawenc_base_init, NULL, - (GClassInitFunc)gst_mulawenc_class_init, + (GClassInitFunc) gst_mulawenc_class_init, NULL, NULL, - sizeof(GstMuLawEnc), + sizeof (GstMuLawEnc), 0, - (GInstanceInitFunc)gst_mulawenc_init, + (GInstanceInitFunc) gst_mulawenc_init, }; - mulawenc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMuLawEnc", &mulawenc_info, 0); + mulawenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawEnc", &mulawenc_info, + 0); } return mulawenc_type; } static void -gst_mulawenc_base_init (GstMuLawEncClass *klass) +gst_mulawenc_base_init (GstMuLawEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -115,69 +122,72 @@ gst_mulawenc_base_init (GstMuLawEncClass *klass) } static void -gst_mulawenc_class_init (GstMuLawEncClass *klass) +gst_mulawenc_class_init (GstMuLawEncClass * 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_mulawenc_set_property; gobject_class->get_property = gst_mulawenc_get_property; } static void -gst_mulawenc_init (GstMuLawEnc *mulawenc) +gst_mulawenc_init (GstMuLawEnc * mulawenc) { - mulawenc->sinkpad = gst_pad_new_from_template(mulawenc_sink_template,"sink"); - mulawenc->srcpad = gst_pad_new_from_template(mulawenc_src_template,"src"); + mulawenc->sinkpad = + gst_pad_new_from_template (mulawenc_sink_template, "sink"); + mulawenc->srcpad = gst_pad_new_from_template (mulawenc_src_template, "src"); gst_pad_set_link_function (mulawenc->sinkpad, mulawenc_link); - gst_element_add_pad(GST_ELEMENT(mulawenc),mulawenc->sinkpad); - gst_pad_set_chain_function(mulawenc->sinkpad,gst_mulawenc_chain); - gst_element_add_pad(GST_ELEMENT(mulawenc),mulawenc->srcpad); + gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->sinkpad); + gst_pad_set_chain_function (mulawenc->sinkpad, gst_mulawenc_chain); + gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad); } static void -gst_mulawenc_chain (GstPad *pad,GstData *_data) +gst_mulawenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMuLawEnc *mulawenc; gint16 *linear_data; guint8 *mulaw_data; - GstBuffer* outbuf; + GstBuffer *outbuf; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); - mulawenc = GST_MULAWENC(GST_OBJECT_PARENT (pad)); - g_return_if_fail(mulawenc != NULL); - g_return_if_fail(GST_IS_MULAWENC(mulawenc)); + mulawenc = GST_MULAWENC (GST_OBJECT_PARENT (pad)); + g_return_if_fail (mulawenc != NULL); + g_return_if_fail (GST_IS_MULAWENC (mulawenc)); - linear_data = (gint16 *)GST_BUFFER_DATA(buf); - outbuf=gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = (gchar*)g_new(gint16,GST_BUFFER_SIZE(buf)/4); - GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf)/2; + linear_data = (gint16 *) GST_BUFFER_DATA (buf); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = + (gchar *) g_new (gint16, GST_BUFFER_SIZE (buf) / 4); + GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf) / 2; - mulaw_data = (gint8*)GST_BUFFER_DATA(outbuf); - mulaw_encode(linear_data,mulaw_data,GST_BUFFER_SIZE(outbuf)); + mulaw_data = (gint8 *) GST_BUFFER_DATA (outbuf); + mulaw_encode (linear_data, mulaw_data, GST_BUFFER_SIZE (outbuf)); - gst_buffer_unref(buf); - gst_pad_push(mulawenc->srcpad,GST_DATA (outbuf)); + gst_buffer_unref (buf); + gst_pad_push (mulawenc->srcpad, GST_DATA (outbuf)); } static void -gst_mulawenc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_mulawenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMuLawEnc *mulawenc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MULAWENC(object)); - mulawenc = GST_MULAWENC(object); + g_return_if_fail (GST_IS_MULAWENC (object)); + mulawenc = GST_MULAWENC (object); switch (prop_id) { default: @@ -186,13 +196,14 @@ gst_mulawenc_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_mulawenc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_mulawenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMuLawEnc *mulawenc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MULAWENC(object)); - mulawenc = GST_MULAWENC(object); + g_return_if_fail (GST_IS_MULAWENC (object)); + mulawenc = GST_MULAWENC (object); switch (prop_id) { default: diff --git a/gst/law/mulaw-encode.h b/gst/law/mulaw-encode.h index 6d99759b..2ef39d23 100644 --- a/gst/law/mulaw-encode.h +++ b/gst/law/mulaw-encode.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MULAWENC \ @@ -42,27 +43,29 @@ extern "C" { #define GST_IS_MULAWENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWENC)) -typedef struct _GstMuLawEnc GstMuLawEnc; -typedef struct _GstMuLawEncClass GstMuLawEncClass; + typedef struct _GstMuLawEnc GstMuLawEnc; + typedef struct _GstMuLawEncClass GstMuLawEncClass; -struct _GstMuLawEnc { - GstElement element; + struct _GstMuLawEnc + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - /*MetaAudioRaw meta; */ + /*MetaAudioRaw meta; */ -}; + }; -struct _GstMuLawEncClass { - GstElementClass parent_class; -}; + struct _GstMuLawEncClass + { + GstElementClass parent_class; + }; -GType gst_mulawenc_get_type(void); + GType gst_mulawenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/mulaw.c b/gst/law/mulaw.c index 632aa03f..3702aaa6 100644 --- a/gst/law/mulaw.c +++ b/gst/law/mulaw.c @@ -4,66 +4,58 @@ #include "mulaw-encode.h" #include "mulaw-decode.h" -static GstCaps* +static GstCaps * mulaw_factory (void) { return gst_caps_new_simple ("audio/x-mulaw", - "rate", GST_TYPE_INT_RANGE, 8000, 192000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "rate", GST_TYPE_INT_RANGE, 8000, 192000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } -static GstCaps* +static GstCaps * linear_factory (void) { return gst_caps_new_simple ("audio/x-raw-int", - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "rate", GST_TYPE_INT_RANGE, 8000, 192000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", GST_TYPE_INT_RANGE, 8000, 192000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } GstPadTemplate *mulawenc_src_template, *mulawenc_sink_template; GstPadTemplate *mulawdec_src_template, *mulawdec_sink_template; static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - GstCaps* mulaw_caps, *linear_caps; + GstCaps *mulaw_caps, *linear_caps; mulaw_caps = mulaw_factory (); linear_caps = linear_factory (); - mulawenc_src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - mulaw_caps); - mulawenc_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - linear_caps); + mulawenc_src_template = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, mulaw_caps); + mulawenc_sink_template = + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, linear_caps); - mulawdec_src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - linear_caps); - mulawdec_sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - mulaw_caps); + mulawdec_src_template = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, linear_caps); + mulawdec_sink_template = + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, mulaw_caps); if (!gst_element_register (plugin, "mulawenc", - GST_RANK_NONE, GST_TYPE_MULAWENC) || + GST_RANK_NONE, GST_TYPE_MULAWENC) || !gst_element_register (plugin, "mulawdec", - GST_RANK_PRIMARY, GST_TYPE_MULAWDEC)) + GST_RANK_PRIMARY, GST_TYPE_MULAWDEC)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mulaw", - "MuLaw audio conversion routines", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mulaw", + "MuLaw audio conversion routines", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/level/demo.c b/gst/level/demo.c index 98781b46..3d7bfc64 100644 --- a/gst/level/demo.c +++ b/gst/level/demo.c @@ -33,8 +33,8 @@ GtkWidget *elapsed; GtkWidget *scale[2][3]; static void -level_callback (GstElement *element, gdouble time, gint channel, - gdouble rms, gdouble peak, gdouble decay) +level_callback (GstElement * element, gdouble time, gint channel, + gdouble rms, gdouble peak, gdouble decay) { gchar *label; @@ -50,6 +50,7 @@ static gboolean idler (gpointer data) { GstElement *pipeline = GST_ELEMENT (data); + g_print ("+"); if (gst_bin_iterate (GST_BIN (pipeline))) return TRUE; @@ -79,8 +80,7 @@ setup_gui () gtk_container_add (GTK_CONTAINER (hbox), elapsed); gtk_container_add (GTK_CONTAINER (vbox), hbox); - for (c = 0; c < 2; ++c) - { + for (c = 0; c < 2; ++c) { /* RMS */ hbox = gtk_hbox_new (TRUE, 0); label = gtk_label_new ("RMS"); @@ -110,8 +110,8 @@ setup_gui () gtk_widget_show_all (GTK_WIDGET (window)); } -int main -(int argc, char *argv[]) +int +main (int argc, char *argv[]) { GstElement *pipeline = NULL; @@ -122,8 +122,7 @@ int main gtk_init (&argc, &argv); pipeline = gst_parse_launchv ((const gchar **) &argv[1], &error); - if (error) - { + if (error) { g_print ("pipeline could not be constructed: %s\n", error->message); g_print ("Please give a complete pipeline with a 'level' element.\n"); g_print ("Example: sinesrc ! level ! osssink\n"); @@ -132,8 +131,7 @@ int main } level = gst_bin_get_by_name (GST_BIN (pipeline), "level0"); - if (level == NULL) - { + if (level == NULL) { g_print ("Please give a pipeline with a 'level' element in it\n"); return 1; } @@ -141,7 +139,7 @@ int main g_object_set (level, "signal", TRUE, NULL); g_signal_connect (level, "level", G_CALLBACK (level_callback), NULL); - + /* setup GUI */ setup_gui (); @@ -155,4 +153,3 @@ int main return 0; } - diff --git a/gst/level/gstlevel.c b/gst/level/gstlevel.c index e81828aa..9a822436 100644 --- a/gst/level/gstlevel.c +++ b/gst/level/gstlevel.c @@ -40,29 +40,29 @@ static GstElementDetails level_details = { /* pad templates */ static GstStaticPadTemplate sink_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "level_sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS) -); +GST_STATIC_PAD_TEMPLATE ("level_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate src_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "level_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS) -); +GST_STATIC_PAD_TEMPLATE ("level_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS) + ); /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ SIGNAL_LEVEL, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SIGNAL_LEVEL, ARG_SIGNAL_INTERVAL, @@ -70,42 +70,42 @@ enum { ARG_PEAK_FALLOFF }; -static void gst_level_class_init (GstLevelClass *klass); -static void gst_level_base_init (GstLevelClass *klass); -static void gst_level_init (GstLevel *filter); +static void gst_level_class_init (GstLevelClass * klass); +static void gst_level_base_init (GstLevelClass * klass); +static void gst_level_init (GstLevel * filter); -static GstElementStateReturn gst_level_change_state (GstElement *element); -static void gst_level_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_level_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static GstElementStateReturn gst_level_change_state (GstElement * element); +static void gst_level_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_level_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_level_chain (GstPad *pad, GstData *_data); +static void gst_level_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; GType -gst_level_get_type (void) +gst_level_get_type (void) { static GType level_type = 0; - if (!level_type) - { - static const GTypeInfo level_info = - { + if (!level_type) { + static const GTypeInfo level_info = { sizeof (GstLevelClass), (GBaseInitFunc) gst_level_base_init, NULL, (GClassInitFunc) gst_level_class_init, NULL, NULL, sizeof (GstLevel), 0, (GInstanceInitFunc) gst_level_init }; - level_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLevel", - &level_info, 0); + level_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLevel", + &level_info, 0); } return level_type; } static GstPadLinkReturn -gst_level_link (GstPad *pad, const GstCaps *caps) +gst_level_link (GstPad * pad, const GstCaps * caps) { GstLevel *filter; GstPad *otherpad; @@ -118,7 +118,7 @@ gst_level_link (GstPad *pad, const GstCaps *caps) g_return_val_if_fail (filter != NULL, GST_PAD_LINK_REFUSED); g_return_val_if_fail (GST_IS_LEVEL (filter), GST_PAD_LINK_REFUSED); otherpad = (pad == filter->srcpad ? filter->sinkpad : filter->srcpad); - + res = gst_pad_try_set_caps (otherpad, caps); /* if ok, set filter */ if (res != GST_PAD_LINK_OK && res != GST_PAD_LINK_DONE) { @@ -126,22 +126,30 @@ gst_level_link (GstPad *pad, const GstCaps *caps) } filter->num_samples = 0; - + structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &filter->rate); ret &= gst_structure_get_int (structure, "width", &filter->width); ret &= gst_structure_get_int (structure, "channels", &filter->channels); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; /* allocate channel variable arrays */ - if (filter->CS) g_free (filter->CS); - if (filter->peak) g_free (filter->peak); - if (filter->last_peak) g_free (filter->last_peak); - if (filter->decay_peak) g_free (filter->decay_peak); - if (filter->decay_peak_age) g_free (filter->decay_peak_age); - if (filter->MS) g_free (filter->MS); - if (filter->RMS_dB) g_free (filter->RMS_dB); + if (filter->CS) + g_free (filter->CS); + if (filter->peak) + g_free (filter->peak); + if (filter->last_peak) + g_free (filter->last_peak); + if (filter->decay_peak) + g_free (filter->decay_peak); + if (filter->decay_peak_age) + g_free (filter->decay_peak_age); + if (filter->MS) + g_free (filter->MS); + if (filter->RMS_dB) + g_free (filter->RMS_dB); filter->CS = g_new (double, filter->channels); filter->peak = g_new (double, filter->channels); filter->last_peak = g_new (double, filter->channels); @@ -149,10 +157,11 @@ gst_level_link (GstPad *pad, const GstCaps *caps) filter->decay_peak_age = g_new (double, filter->channels); filter->MS = g_new (double, filter->channels); filter->RMS_dB = g_new (double, filter->channels); + for (i = 0; i < filter->channels; ++i) { filter->CS[i] = filter->peak[i] = filter->last_peak[i] = - filter->decay_peak[i] = filter->decay_peak_age[i] = - filter->MS[i] = filter->RMS_dB[i] = 0.0; + filter->decay_peak[i] = filter->decay_peak_age[i] = + filter->MS[i] = filter->RMS_dB[i] = 0.0; } filter->inited = TRUE; @@ -161,17 +170,14 @@ gst_level_link (GstPad *pad, const GstCaps *caps) } static void inline -gst_level_fast_16bit_chain (gint16* in, guint num, gint channels, - gint resolution, double *CS, double *peak) +gst_level_fast_16bit_chain (gint16 * in, guint num, gint channels, + gint resolution, double *CS, double *peak) #include "filter.func" - -static void inline -gst_level_fast_8bit_chain (gint8* in, guint num, gint channels, - gint resolution, double *CS, double *peak) + static void inline + gst_level_fast_8bit_chain (gint8 * in, guint num, gint channels, + gint resolution, double *CS, double *peak) #include "filter.func" - -static void -gst_level_chain (GstPad *pad, GstData *_data) + static void gst_level_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstLevel *filter; @@ -191,27 +197,24 @@ gst_level_chain (GstPad *pad, GstData *_data) for (i = 0; i < filter->channels; ++i) filter->CS[i] = filter->peak[i] = filter->MS[i] = filter->RMS_dB[i] = 0.0; - + in_data = (gint16 *) GST_BUFFER_DATA (buf); - + num_samples = GST_BUFFER_SIZE (buf) / (filter->width / 8); if (num_samples % filter->channels != 0) - g_warning ("WARNING: level: programming error, data not properly interleaved"); + g_warning + ("WARNING: level: programming error, data not properly interleaved"); - for (i = 0; i < filter->channels; ++i) - { - switch (filter->width) - { + for (i = 0; i < filter->channels; ++i) { + switch (filter->width) { case 16: - gst_level_fast_16bit_chain (in_data + i, num_samples, - filter->channels, filter->width - 1, - &CS, &filter->peak[i]); - break; + gst_level_fast_16bit_chain (in_data + i, num_samples, + filter->channels, filter->width - 1, &CS, &filter->peak[i]); + break; case 8: - gst_level_fast_8bit_chain (((gint8 *) in_data) + i, num_samples, - filter->channels, filter->width - 1, - &CS, &filter->peak[i]); - break; + gst_level_fast_8bit_chain (((gint8 *) in_data) + i, num_samples, + filter->channels, filter->width - 1, &CS, &filter->peak[i]); + break; } /* g_print ("DEBUG: CS %f, peak %f\n", CS, filter->peak[i]); */ filter->CS[i] += CS; @@ -221,91 +224,86 @@ gst_level_chain (GstPad *pad, GstData *_data) filter->num_samples += num_samples; - for (i = 0; i < filter->channels; ++i) - { + for (i = 0; i < filter->channels; ++i) { filter->decay_peak_age[i] += num_samples; /* g_print ("filter peak info [%d]: peak %f, age %f\n", i, - filter->last_peak[i], filter->decay_peak_age[i]); */ + filter->last_peak[i], filter->decay_peak_age[i]); */ /* update running peak */ if (filter->peak[i] > filter->last_peak[i]) - filter->last_peak[i] = filter->peak[i]; + filter->last_peak[i] = filter->peak[i]; /* update decay peak */ - if (filter->peak[i] >= filter->decay_peak[i]) - { - /* g_print ("new peak, %f\n", filter->peak[i]); */ - filter->decay_peak[i] = filter->peak[i]; - filter->decay_peak_age[i] = 0; - } - else - { + if (filter->peak[i] >= filter->decay_peak[i]) { + /* g_print ("new peak, %f\n", filter->peak[i]); */ + filter->decay_peak[i] = filter->peak[i]; + filter->decay_peak_age[i] = 0; + } else { /* make decay peak fall off if too old */ - if (filter->decay_peak_age[i] > filter->rate * filter->decay_peak_ttl) - { - double falloff_dB; - double falloff; - double length; /* length of buffer in seconds */ - - - length = (double) num_samples / (filter->channels * filter->rate); - falloff_dB = filter->decay_peak_falloff * length; - falloff = pow (10, falloff_dB / -20.0); - - /* g_print ("falloff: length %f, dB falloff %f, falloff factor %e\n", - length, falloff_dB, falloff); */ - filter->decay_peak[i] *= falloff; - /* g_print ("peak is %f samples old, decayed with factor %e to %f\n", - filter->decay_peak_age[i], falloff, filter->decay_peak[i]); */ + if (filter->decay_peak_age[i] > filter->rate * filter->decay_peak_ttl) { + double falloff_dB; + double falloff; + double length; /* length of buffer in seconds */ + + + length = (double) num_samples / (filter->channels * filter->rate); + falloff_dB = filter->decay_peak_falloff * length; + falloff = pow (10, falloff_dB / -20.0); + + /* g_print ("falloff: length %f, dB falloff %f, falloff factor %e\n", + length, falloff_dB, falloff); */ + filter->decay_peak[i] *= falloff; + /* g_print ("peak is %f samples old, decayed with factor %e to %f\n", + filter->decay_peak_age[i], falloff, filter->decay_peak[i]); */ } } } /* do we need to emit ? */ - - if (filter->num_samples >= filter->interval * (gdouble) filter->rate) - { - if (filter->signal) - { + + if (filter->num_samples >= filter->interval * (gdouble) filter->rate) { + if (filter->signal) { gdouble RMS, peak, endtime; - for (i = 0; i < filter->channels; ++i) - { - RMS = sqrt (filter->CS[i] / (filter->num_samples / filter->channels)); - peak = filter->last_peak[i]; - num_samples = GST_BUFFER_SIZE (buf) / (filter->width / 8); - endtime = (double) GST_BUFFER_TIMESTAMP (buf) / GST_SECOND - + (double) num_samples / (double) filter->rate; - - g_signal_emit (G_OBJECT (filter), gst_filter_signals[SIGNAL_LEVEL], 0, - endtime, i, - 20 * log10 (RMS), 20 * log10 (filter->last_peak[i]), - 20 * log10 (filter->decay_peak[i])); - /* we emitted, so reset cumulative and normal peak */ - filter->CS[i] = 0.0; - filter->last_peak[i] = 0.0; + + for (i = 0; i < filter->channels; ++i) { + RMS = sqrt (filter->CS[i] / (filter->num_samples / filter->channels)); + peak = filter->last_peak[i]; + num_samples = GST_BUFFER_SIZE (buf) / (filter->width / 8); + endtime = (double) GST_BUFFER_TIMESTAMP (buf) / GST_SECOND + + (double) num_samples / (double) filter->rate; + + g_signal_emit (G_OBJECT (filter), gst_filter_signals[SIGNAL_LEVEL], 0, + endtime, i, + 20 * log10 (RMS), 20 * log10 (filter->last_peak[i]), + 20 * log10 (filter->decay_peak[i])); + /* we emitted, so reset cumulative and normal peak */ + filter->CS[i] = 0.0; + filter->last_peak[i] = 0.0; } } filter->num_samples = 0; } } -static GstElementStateReturn gst_level_change_state (GstElement *element) +static GstElementStateReturn +gst_level_change_state (GstElement * element) { GstLevel *filter = GST_LEVEL (element); - switch(GST_STATE_TRANSITION(element)){ + switch (GST_STATE_TRANSITION (element)) { case GST_STATE_PAUSED_TO_PLAYING: - if (!filter->inited) return GST_STATE_FAILURE; + if (!filter->inited) + return GST_STATE_FAILURE; break; default: break; } - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + return GST_ELEMENT_CLASS (parent_class)->change_state (element); } static void -gst_level_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_level_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstLevel *filter; @@ -332,8 +330,8 @@ gst_level_set_property (GObject *object, guint prop_id, } static void -gst_level_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_level_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstLevel *filter; @@ -345,7 +343,7 @@ gst_level_get_property (GObject *object, guint prop_id, case ARG_SIGNAL_LEVEL: g_value_set_boolean (value, filter->signal); break; - case ARG_SIGNAL_INTERVAL: + case ARG_SIGNAL_INTERVAL: g_value_set_double (value, filter->interval); break; case ARG_PEAK_TTL: @@ -354,71 +352,73 @@ gst_level_get_property (GObject *object, guint prop_id, case ARG_PEAK_FALLOFF: g_value_set_double (value, filter->decay_peak_falloff); break; - default: + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void -gst_level_base_init (GstLevelClass *klass) +gst_level_base_init (GstLevelClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_template_factory)); + gst_static_pad_template_get (&sink_template_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_template_factory)); + gst_static_pad_template_get (&src_template_factory)); gst_element_class_set_details (element_class, &level_details); element_class->change_state = gst_level_change_state; } static void -gst_level_class_init (GstLevelClass *klass) +gst_level_class_init (GstLevelClass * 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); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIGNAL_LEVEL, - g_param_spec_boolean ("signal", "Signal", - "Emit level signals for each interval", - TRUE, G_PARAM_READWRITE)); + g_param_spec_boolean ("signal", "Signal", + "Emit level signals for each interval", TRUE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIGNAL_INTERVAL, - g_param_spec_double ("interval", "Interval", - "Interval between emissions (in seconds)", - 0.01, 100.0, 0.1, G_PARAM_READWRITE)); + g_param_spec_double ("interval", "Interval", + "Interval between emissions (in seconds)", + 0.01, 100.0, 0.1, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PEAK_TTL, - g_param_spec_double ("peak_ttl", "Peak TTL", - "Time To Live of decay peak before it falls back", - 0, 100.0, 0.3, G_PARAM_READWRITE)); + g_param_spec_double ("peak_ttl", "Peak TTL", + "Time To Live of decay peak before it falls back", + 0, 100.0, 0.3, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PEAK_FALLOFF, - g_param_spec_double ("peak_falloff", "Peak Falloff", - "Decay rate of decay peak after TTL (in dB/sec)", - 0.0, G_MAXDOUBLE, 10.0, G_PARAM_READWRITE)); + g_param_spec_double ("peak_falloff", "Peak Falloff", + "Decay rate of decay peak after TTL (in dB/sec)", + 0.0, G_MAXDOUBLE, 10.0, G_PARAM_READWRITE)); gobject_class->set_property = gst_level_set_property; gobject_class->get_property = gst_level_get_property; - gst_filter_signals[SIGNAL_LEVEL] = - g_signal_new ("level", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstLevelClass, level), NULL, NULL, - gstlevel_cclosure_marshal_VOID__DOUBLE_INT_DOUBLE_DOUBLE_DOUBLE, - G_TYPE_NONE, 5, - G_TYPE_DOUBLE, G_TYPE_INT, - G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + gst_filter_signals[SIGNAL_LEVEL] = + g_signal_new ("level", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstLevelClass, level), NULL, NULL, + gstlevel_cclosure_marshal_VOID__DOUBLE_INT_DOUBLE_DOUBLE_DOUBLE, + G_TYPE_NONE, 5, + G_TYPE_DOUBLE, G_TYPE_INT, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE); } static void -gst_level_init (GstLevel *filter) +gst_level_init (GstLevel * filter) { - filter->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&sink_template_factory), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&sink_template_factory), "sink"); gst_pad_set_link_function (filter->sinkpad, gst_level_link); - filter->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&src_template_factory), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&src_template_factory), "src"); gst_pad_set_link_function (filter->srcpad, gst_level_link); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); @@ -441,20 +441,13 @@ gst_level_init (GstLevel *filter) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "level", - GST_RANK_NONE, GST_TYPE_LEVEL); + return gst_element_register (plugin, "level", GST_RANK_NONE, GST_TYPE_LEVEL); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "level", - "Audio level plugin", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "level", + "Audio level plugin", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/level/gstlevel.h b/gst/level/gstlevel.h index 7a853771..4158b9b0 100644 --- a/gst/level/gstlevel.h +++ b/gst/level/gstlevel.h @@ -31,8 +31,9 @@ #include "gstlevel-marshal.h" #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_LEVEL \ @@ -46,46 +47,48 @@ extern "C" { #define GST_IS_LEVEL_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LEVEL)) -typedef struct _GstLevel GstLevel; -typedef struct _GstLevelClass GstLevelClass; - -struct _GstLevel { - GstElement element; - - GstPad *sinkpad, *srcpad; - gboolean signal; /* whether or not to emit signals */ - gboolean inited; /* whether or not the element is initialized */ - gdouble interval; /* how many seconds between emits */ - - gint rate; /* caps variables */ - gint width; - gint channels; - - gdouble decay_peak_ttl; /* time to live for peak in seconds */ - gdouble decay_peak_falloff; /* falloff in dB/sec */ - gdouble num_samples; /* cumulative sample count */ - - /* per-channel arrays for intermediate values */ - gdouble *CS; /* normalized Cumulative Square */ - gdouble *peak; /* normalized Peak value over buffer */ - gdouble *last_peak; /* last normalized Peak value over interval */ - gdouble *decay_peak; /* running decaying normalized Peak */ - gdouble *MS; /* normalized Mean Square of buffer */ - gdouble *RMS_dB; /* RMS in dB to emit */ - gdouble *decay_peak_age; /* age of last peak */ -}; - -struct _GstLevelClass { - GstElementClass parent_class; - void (*level) (GstElement *element, gdouble time, gint channel, - gdouble RMS_dB, gdouble peak_dB, gdouble decay_peak_dB); -}; - -GType gst_level_get_type(void); + typedef struct _GstLevel GstLevel; + typedef struct _GstLevelClass GstLevelClass; + + struct _GstLevel + { + GstElement element; + + GstPad *sinkpad, *srcpad; + gboolean signal; /* whether or not to emit signals */ + gboolean inited; /* whether or not the element is initialized */ + gdouble interval; /* how many seconds between emits */ + + gint rate; /* caps variables */ + gint width; + gint channels; + + gdouble decay_peak_ttl; /* time to live for peak in seconds */ + gdouble decay_peak_falloff; /* falloff in dB/sec */ + gdouble num_samples; /* cumulative sample count */ + + /* per-channel arrays for intermediate values */ + gdouble *CS; /* normalized Cumulative Square */ + gdouble *peak; /* normalized Peak value over buffer */ + gdouble *last_peak; /* last normalized Peak value over interval */ + gdouble *decay_peak; /* running decaying normalized Peak */ + gdouble *MS; /* normalized Mean Square of buffer */ + gdouble *RMS_dB; /* RMS in dB to emit */ + gdouble *decay_peak_age; /* age of last peak */ + }; + + struct _GstLevelClass + { + GstElementClass parent_class; + void (*level) (GstElement * element, gdouble time, gint channel, + gdouble RMS_dB, gdouble peak_dB, gdouble decay_peak_dB); + }; + + GType gst_level_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/level/plot.c b/gst/level/plot.c index 27ecd01a..ad6d70d7 100644 --- a/gst/level/plot.c +++ b/gst/level/plot.c @@ -28,24 +28,25 @@ #include #include -gboolean got_channel[2] = { FALSE, FALSE}; /* to see if we got the signal for this one yet */ -gint channels = 0 ; /* guess at how many channels there are */ -gdouble last_time = 0.0; /* time of last signal */ -gdouble values[2][3]; /* array of levels from which to print */ +gboolean got_channel[2] = { FALSE, FALSE }; /* to see if we got the signal for this one yet */ +gint channels = 0; /* guess at how many channels there are */ +gdouble last_time = 0.0; /* time of last signal */ +gdouble values[2][3]; /* array of levels from which to print */ static void -level_callback (GstElement *element, gdouble time, gint channel, - gdouble rms, gdouble peak, gdouble decay) +level_callback (GstElement * element, gdouble time, gint channel, + gdouble rms, gdouble peak, gdouble decay) { int i = 0, j = 0; gboolean got_all = FALSE; - if (channel + 1> channels) channels = channel + 1; + if (channel + 1 > channels) + channels = channel + 1; /* reset got_channel if this is a new time point */ - if (time > last_time) - { - for (i = 0; i < channels; ++i) got_channel[i] = FALSE; + if (time > last_time) { + for (i = 0; i < channels; ++i) + got_channel[i] = FALSE; last_time = time; } @@ -59,13 +60,13 @@ level_callback (GstElement *element, gdouble time, gint channel, /* FIXME: this fails on the first, no ? */ got_all = TRUE; for (i = 0; i < channels; ++i) - if (!got_channel[i]) got_all = FALSE; - if (got_all) - { + if (!got_channel[i]) + got_all = FALSE; + if (got_all) { g_print ("%f ", time); for (i = 0; i < channels; ++i) for (j = 0; j < 3; ++j) - g_print ("%f ", values[i][j]); + g_print ("%f ", values[i][j]); g_print ("\n"); } } @@ -74,6 +75,7 @@ static gboolean idler (gpointer data) { GstElement *pipeline = GST_ELEMENT (data); + if (gst_bin_iterate (GST_BIN (pipeline))) return TRUE; @@ -81,8 +83,8 @@ idler (gpointer data) return FALSE; } -int main -(int argc, char *argv[]) +int +main (int argc, char *argv[]) { GstElement *pipeline = NULL; @@ -93,8 +95,7 @@ int main gtk_init (&argc, &argv); pipeline = gst_parse_launchv ((const gchar **) &argv[1], &error); - if (error) - { + if (error) { g_print ("pipeline could not be constructed: %s\n", error->message); g_print ("Please give a complete pipeline with a 'level' element.\n"); g_print ("Example: sinesrc ! level ! osssink\n"); @@ -103,8 +104,7 @@ int main } level = gst_bin_get_by_name (GST_BIN (pipeline), "level0"); - if (level == NULL) - { + if (level == NULL) { g_print ("Please give a pipeline with a 'level' element in it\n"); return 1; } @@ -112,7 +112,7 @@ int main g_object_set (level, "signal", TRUE, NULL); g_signal_connect (level, "level", G_CALLBACK (level_callback), NULL); - + /* go to main loop */ gst_element_set_state (pipeline, GST_STATE_PLAYING); g_idle_add (idler, pipeline); @@ -121,4 +121,3 @@ int main return 0; } - diff --git a/gst/matroska/ebml-ids.h b/gst/matroska/ebml-ids.h index 329f036c..eb396b23 100644 --- a/gst/matroska/ebml-ids.h +++ b/gst/matroska/ebml-ids.h @@ -23,13 +23,10 @@ #define __GST_EBML_IDS_H__ G_BEGIN_DECLS - /* EBML version supported */ #define GST_EBML_VERSION 1 - /* top-level master-IDs */ #define GST_EBML_ID_HEADER 0x1A45DFA3 - /* IDs in the HEADER master */ #define GST_EBML_ID_EBMLVERSION 0x4286 #define GST_EBML_ID_EBMLREADVERSION 0x42F7 @@ -38,10 +35,7 @@ G_BEGIN_DECLS #define GST_EBML_ID_DOCTYPE 0x4282 #define GST_EBML_ID_DOCTYPEVERSION 0x4287 #define GST_EBML_ID_DOCTYPEREADVERSION 0x4285 - /* general EBML types */ #define GST_EBML_ID_VOID 0xEC - -G_END_DECLS - + G_END_DECLS #endif /* __GST_EBML_IDS_H__ */ diff --git a/gst/matroska/ebml-read.c b/gst/matroska/ebml-read.c index 4661ef80..6fa53565 100644 --- a/gst/matroska/ebml-read.c +++ b/gst/matroska/ebml-read.c @@ -28,26 +28,26 @@ #include "ebml-read.h" #include "ebml-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -static void gst_ebml_read_class_init (GstEbmlReadClass *klass); -static void gst_ebml_read_init (GstEbmlRead *ebml); -static GstElementStateReturn - gst_ebml_read_change_state (GstElement *element); +static void gst_ebml_read_class_init (GstEbmlReadClass * klass); +static void gst_ebml_read_init (GstEbmlRead * ebml); +static GstElementStateReturn gst_ebml_read_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_ebml_read_get_type (void) +gst_ebml_read_get_type (void) { static GType gst_ebml_read_type = 0; if (!gst_ebml_read_type) { static const GTypeInfo gst_ebml_read_info = { - sizeof (GstEbmlReadClass), + sizeof (GstEbmlReadClass), NULL, NULL, (GClassInitFunc) gst_ebml_read_class_init, @@ -60,14 +60,14 @@ gst_ebml_read_get_type (void) gst_ebml_read_type = g_type_register_static (GST_TYPE_ELEMENT, "GstEbmlRead", - &gst_ebml_read_info, 0); + &gst_ebml_read_info, 0); } return gst_ebml_read_type; } static void -gst_ebml_read_class_init (GstEbmlReadClass *klass) +gst_ebml_read_class_init (GstEbmlReadClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; @@ -77,7 +77,7 @@ gst_ebml_read_class_init (GstEbmlReadClass *klass) } static void -gst_ebml_read_init (GstEbmlRead *ebml) +gst_ebml_read_init (GstEbmlRead * ebml) { ebml->sinkpad = NULL; ebml->bs = NULL; @@ -85,23 +85,23 @@ gst_ebml_read_init (GstEbmlRead *ebml) } static GstElementStateReturn -gst_ebml_read_change_state (GstElement *element) +gst_ebml_read_change_state (GstElement * element) { GstEbmlRead *ebml = GST_EBML_READ (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_READY_TO_PAUSED: if (!ebml->sinkpad) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; ebml->bs = gst_bytestream_new (ebml->sinkpad); break; case GST_STATE_PAUSED_TO_READY: gst_bytestream_destroy (ebml->bs); while (ebml->level) { - GstEbmlLevel *level = ebml->level->data; + GstEbmlLevel *level = ebml->level->data; - ebml->level = g_list_remove (ebml->level, level); - g_free (level); + ebml->level = g_list_remove (ebml->level, level); + g_free (level); } break; default: @@ -122,7 +122,7 @@ gst_ebml_read_change_state (GstElement *element) */ static guint -gst_ebml_read_element_level_up (GstEbmlRead *ebml) +gst_ebml_read_element_level_up (GstEbmlRead * ebml) { guint num = 0; guint64 pos = gst_bytestream_tell (ebml->bs); @@ -148,9 +148,7 @@ gst_ebml_read_element_level_up (GstEbmlRead *ebml) */ static gint -gst_ebml_read_element_id (GstEbmlRead *ebml, - guint32 *id, - guint *level_up) +gst_ebml_read_element_id (GstEbmlRead * ebml, guint32 * id, guint * level_up) { guint8 *data; gint len_mask = 0x80, read = 1, n = 1; @@ -166,10 +164,10 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, gst_pad_event_default (ebml->sinkpad, event); } else { guint64 pos = gst_bytestream_tell (ebml->bs); + gst_event_unref (event); GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", - pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } } @@ -180,16 +178,18 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, } if (read > 4) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)", - data[0], pos, pos)); + ("Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)", + data[0], pos, pos)); return -1; } if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } while (n < read) @@ -210,8 +210,7 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, */ static gint -gst_ebml_read_element_length (GstEbmlRead *ebml, - guint64 *length) +gst_ebml_read_element_length (GstEbmlRead * ebml, guint64 * length) { guint8 *data; gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; @@ -219,8 +218,9 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } total = data[0]; @@ -230,9 +230,10 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, } if (read > 8) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid EBML length size tag (0x%x) at position %llu (0x%llx)", - data[0], pos, pos)); + ("Invalid EBML length size tag (0x%x) at position %llu (0x%llx)", + data[0], pos, pos)); return -1; } @@ -240,8 +241,9 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, num_ffs++; if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } while (n < read) { @@ -265,15 +267,15 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, */ static GstBuffer * -gst_ebml_read_element_data (GstEbmlRead *ebml, - guint64 length) +gst_ebml_read_element_data (GstEbmlRead * ebml, guint64 length) { GstBuffer *buf = NULL; if (gst_bytestream_peek (ebml->bs, &buf, length) != length) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); if (buf) gst_buffer_unref (buf); return NULL; @@ -291,8 +293,7 @@ gst_ebml_read_element_data (GstEbmlRead *ebml, */ guint32 -gst_ebml_peek_id (GstEbmlRead *ebml, - guint *level_up) +gst_ebml_peek_id (GstEbmlRead * ebml, guint * level_up) { guint32 id; @@ -309,8 +310,7 @@ gst_ebml_peek_id (GstEbmlRead *ebml, */ GstEvent * -gst_ebml_read_seek (GstEbmlRead *ebml, - guint64 offset) +gst_ebml_read_seek (GstEbmlRead * ebml, guint64 offset) { guint32 remaining; GstEvent *event = NULL; @@ -328,7 +328,7 @@ gst_ebml_read_seek (GstEbmlRead *ebml, /* now seek */ if (!gst_bytestream_seek (ebml->bs, offset, GST_SEEK_METHOD_SET)) { GST_ELEMENT_ERROR (ebml, RESOURCE, SEEK, (NULL), - ("Seek to position %llu (0x%llx) failed", offset, offset)); + ("Seek to position %llu (0x%llx) failed", offset, offset)); return NULL; } @@ -359,7 +359,7 @@ gst_ebml_read_seek (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_skip (GstEbmlRead *ebml) +gst_ebml_read_skip (GstEbmlRead * ebml) { gint bytes; guint32 id, remaining; @@ -385,7 +385,7 @@ gst_ebml_read_skip (GstEbmlRead *ebml) return gst_bytestream_flush (ebml->bs, length); if (!(event = gst_ebml_read_seek (ebml, - gst_bytestream_tell (ebml->bs) + length))) + gst_bytestream_tell (ebml->bs) + length))) return FALSE; gst_event_unref (event); @@ -398,9 +398,7 @@ gst_ebml_read_skip (GstEbmlRead *ebml) */ gboolean -gst_ebml_read_buffer (GstEbmlRead *ebml, - guint32 *id, - GstBuffer **buf) +gst_ebml_read_buffer (GstEbmlRead * ebml, guint32 * id, GstBuffer ** buf) { gint bytes; guint64 length; @@ -421,9 +419,7 @@ gst_ebml_read_buffer (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_uint (GstEbmlRead *ebml, - guint32 *id, - guint64 *num) +gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num) { GstBuffer *buf; guint8 *data; @@ -436,8 +432,8 @@ gst_ebml_read_uint (GstEbmlRead *ebml, size = GST_BUFFER_SIZE (buf); if (size < 1 || size > 8) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid integer element size %d at position %llu (0x%llu)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid integer element size %d at position %llu (0x%llu)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } @@ -457,9 +453,7 @@ gst_ebml_read_uint (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_sint (GstEbmlRead *ebml, - guint32 *id, - gint64 *num) +gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num) { GstBuffer *buf; guint8 *data; @@ -472,8 +466,8 @@ gst_ebml_read_sint (GstEbmlRead *ebml, size = GST_BUFFER_SIZE (buf); if (size < 1 || size > 8) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid integer element size %d at position %llu (0x%llx)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid integer element size %d at position %llu (0x%llx)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } @@ -501,9 +495,7 @@ gst_ebml_read_sint (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_float (GstEbmlRead *ebml, - guint32 *id, - gdouble *num) +gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num) { GstBuffer *buf; guint8 *data; @@ -517,15 +509,15 @@ gst_ebml_read_float (GstEbmlRead *ebml, if (size != 4 && size != 8 && size != 10) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid float element size %d at position %llu (0x%llx)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid float element size %d at position %llu (0x%llx)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } if (size == 10) { GST_ELEMENT_ERROR (ebml, CORE, NOT_IMPLEMENTED, (NULL), - ("FIXME! 10-byte floats unimplemented")); + ("FIXME! 10-byte floats unimplemented")); gst_buffer_unref (buf); return FALSE; } @@ -534,10 +526,10 @@ gst_ebml_read_float (GstEbmlRead *ebml, gfloat f; #if (G_BYTE_ORDER == G_BIG_ENDIAN) - f = * (gfloat *) data; + f = *(gfloat *) data; #else while (size > 0) { - ((guint8 *) &f)[size - 1] = data[4 - size]; + ((guint8 *) & f)[size - 1] = data[4 - size]; size--; } #endif @@ -547,10 +539,10 @@ gst_ebml_read_float (GstEbmlRead *ebml, gdouble d; #if (G_BYTE_ORDER == G_BIG_ENDIAN) - d = * (gdouble *) data; + d = *(gdouble *) data; #else while (size > 0) { - ((guint8 *) &d)[size - 1] = data[8 - size]; + ((guint8 *) & d)[size - 1] = data[8 - size]; size--; } #endif @@ -568,9 +560,7 @@ gst_ebml_read_float (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_ascii (GstEbmlRead *ebml, - guint32 *id, - gchar **str) +gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str) { GstBuffer *buf; @@ -591,9 +581,7 @@ gst_ebml_read_ascii (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_utf8 (GstEbmlRead *ebml, - guint32 *id, - gchar **str) +gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str) { return gst_ebml_read_ascii (ebml, id, str); } @@ -603,9 +591,7 @@ gst_ebml_read_utf8 (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_date (GstEbmlRead *ebml, - guint32 *id, - gint64 *date) +gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date) { return gst_ebml_read_sint (ebml, id, date); } @@ -616,8 +602,7 @@ gst_ebml_read_date (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_master (GstEbmlRead *ebml, - guint32 *id) +gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id) { gint bytes; guint64 length; @@ -645,10 +630,8 @@ gst_ebml_read_master (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_binary (GstEbmlRead *ebml, - guint32 *id, - guint8 **binary, - guint64 *length) +gst_ebml_read_binary (GstEbmlRead * ebml, + guint32 * id, guint8 ** binary, guint64 * length) { GstBuffer *buf; @@ -668,9 +651,7 @@ gst_ebml_read_binary (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_header (GstEbmlRead *ebml, - gchar **doctype, - guint *version) +gst_ebml_read_header (GstEbmlRead * ebml, gchar ** doctype, guint * version) { /* this function is the first to be called */ guint32 id; @@ -701,79 +682,79 @@ gst_ebml_read_header (GstEbmlRead *ebml, break; switch (id) { - /* is our read version uptodate? */ - case GST_EBML_ID_EBMLREADVERSION: { - guint64 num; - - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLREADVERSION); - if (num != GST_EBML_VERSION) - return FALSE; - break; + /* is our read version uptodate? */ + case GST_EBML_ID_EBMLREADVERSION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLREADVERSION); + if (num != GST_EBML_VERSION) + return FALSE; + break; } - /* we only handle 8 byte lengths at max */ - case GST_EBML_ID_EBMLMAXSIZELENGTH: { - guint64 num; + /* we only handle 8 byte lengths at max */ + case GST_EBML_ID_EBMLMAXSIZELENGTH:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLMAXSIZELENGTH); - if (num != sizeof (guint64)) - return FALSE; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLMAXSIZELENGTH); + if (num != sizeof (guint64)) + return FALSE; + break; } - /* we handle 4 byte IDs at max */ - case GST_EBML_ID_EBMLMAXIDLENGTH: { - guint64 num; + /* we handle 4 byte IDs at max */ + case GST_EBML_ID_EBMLMAXIDLENGTH:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLMAXIDLENGTH); - if (num != sizeof (guint32)) - return FALSE; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLMAXIDLENGTH); + if (num != sizeof (guint32)) + return FALSE; + break; } - case GST_EBML_ID_DOCTYPE: { - gchar *text; - - if (!gst_ebml_read_ascii (ebml, &id, &text)) - return FALSE; - g_assert (id == GST_EBML_ID_DOCTYPE); - if (doctype) { - if (doctype) - g_free (*doctype); - *doctype = text; - } else - g_free (text); - break; + case GST_EBML_ID_DOCTYPE:{ + gchar *text; + + if (!gst_ebml_read_ascii (ebml, &id, &text)) + return FALSE; + g_assert (id == GST_EBML_ID_DOCTYPE); + if (doctype) { + if (doctype) + g_free (*doctype); + *doctype = text; + } else + g_free (text); + break; } - case GST_EBML_ID_DOCTYPEREADVERSION: { - guint64 num; + case GST_EBML_ID_DOCTYPEREADVERSION:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_DOCTYPEREADVERSION); - if (version) - *version = num; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_DOCTYPEREADVERSION); + if (version) + *version = num; + break; } default: - GST_WARNING ("Unknown data type 0x%x in EBML header (ignored)", id); - /* pass-through */ + GST_WARNING ("Unknown data type 0x%x in EBML header (ignored)", id); + /* pass-through */ - /* we ignore these two, as they don't tell us anything we care about */ + /* we ignore these two, as they don't tell us anything we care about */ case GST_EBML_ID_VOID: case GST_EBML_ID_EBMLVERSION: case GST_EBML_ID_DOCTYPEVERSION: - if (!gst_ebml_read_skip (ebml)) - return FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + return FALSE; + break; } } diff --git a/gst/matroska/ebml-read.h b/gst/matroska/ebml-read.h index d78d13ce..c7a981dc 100644 --- a/gst/matroska/ebml-read.h +++ b/gst/matroska/ebml-read.h @@ -27,7 +27,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_EBML_READ \ (gst_ebml_read_get_type ()) #define GST_EBML_READ(obj) \ @@ -40,13 +39,13 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_READ)) #define GST_EBML_READ_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_READ, GstEbmlReadClass)) - -typedef struct _GstEbmlLevel { - guint64 start, - length; + typedef struct _GstEbmlLevel +{ + guint64 start, length; } GstEbmlLevel; -typedef struct _GstEbmlRead { +typedef struct _GstEbmlRead +{ GstElement parent; GstPad *sinkpad; @@ -55,48 +54,29 @@ typedef struct _GstEbmlRead { GList *level; } GstEbmlRead; -typedef struct _GstEbmlReadClass { +typedef struct _GstEbmlReadClass +{ GstElementClass parent; } GstEbmlReadClass; -GType gst_ebml_read_get_type (void); +GType gst_ebml_read_get_type (void); -guint32 gst_ebml_peek_id (GstEbmlRead *ebml, - guint *level_up); -GstEvent *gst_ebml_read_seek (GstEbmlRead *ebml, - guint64 offset); -gboolean gst_ebml_read_skip (GstEbmlRead *ebml); -gboolean gst_ebml_read_buffer (GstEbmlRead *ebml, - guint32 *id, - GstBuffer **buf); -gboolean gst_ebml_read_uint (GstEbmlRead *ebml, - guint32 *id, - guint64 *num); -gboolean gst_ebml_read_sint (GstEbmlRead *ebml, - guint32 *id, - gint64 *num); -gboolean gst_ebml_read_float (GstEbmlRead *ebml, - guint32 *id, - gdouble *num); -gboolean gst_ebml_read_ascii (GstEbmlRead *ebml, - guint32 *id, - gchar **str); -gboolean gst_ebml_read_utf8 (GstEbmlRead *ebml, - guint32 *id, - gchar **str); -gboolean gst_ebml_read_date (GstEbmlRead *ebml, - guint32 *id, - gint64 *date); -gboolean gst_ebml_read_master (GstEbmlRead *ebml, - guint32 *id); -gboolean gst_ebml_read_binary (GstEbmlRead *ebml, - guint32 *id, - guint8 **binary, - guint64 *length); -gboolean gst_ebml_read_header (GstEbmlRead *read, - gchar **doctype, - guint *version); +guint32 gst_ebml_peek_id (GstEbmlRead * ebml, guint * level_up); +GstEvent *gst_ebml_read_seek (GstEbmlRead * ebml, guint64 offset); +gboolean gst_ebml_read_skip (GstEbmlRead * ebml); +gboolean gst_ebml_read_buffer (GstEbmlRead * ebml, + guint32 * id, GstBuffer ** buf); +gboolean gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num); +gboolean gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num); +gboolean gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num); +gboolean gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str); +gboolean gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str); +gboolean gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date); +gboolean gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id); +gboolean gst_ebml_read_binary (GstEbmlRead * ebml, + guint32 * id, guint8 ** binary, guint64 * length); +gboolean gst_ebml_read_header (GstEbmlRead * read, + gchar ** doctype, guint * version); G_END_DECLS - #endif /* __GST_EBML_READ_H__ */ diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c index b6504867..d136a8d4 100644 --- a/gst/matroska/ebml-write.c +++ b/gst/matroska/ebml-write.c @@ -28,26 +28,26 @@ #include "ebml-write.h" #include "ebml-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -static void gst_ebml_write_class_init (GstEbmlWriteClass *klass); -static void gst_ebml_write_init (GstEbmlWrite *ebml); -static GstElementStateReturn - gst_ebml_write_change_state (GstElement *element); +static void gst_ebml_write_class_init (GstEbmlWriteClass * klass); +static void gst_ebml_write_init (GstEbmlWrite * ebml); +static GstElementStateReturn gst_ebml_write_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_ebml_write_get_type (void) +gst_ebml_write_get_type (void) { static GType gst_ebml_write_type = 0; if (!gst_ebml_write_type) { static const GTypeInfo gst_ebml_write_info = { - sizeof (GstEbmlWriteClass), + sizeof (GstEbmlWriteClass), NULL, NULL, (GClassInitFunc) gst_ebml_write_class_init, @@ -60,14 +60,14 @@ gst_ebml_write_get_type (void) gst_ebml_write_type = g_type_register_static (GST_TYPE_ELEMENT, "GstEbmlWrite", - &gst_ebml_write_info, 0); + &gst_ebml_write_info, 0); } return gst_ebml_write_type; } static void -gst_ebml_write_class_init (GstEbmlWriteClass *klass) +gst_ebml_write_class_init (GstEbmlWriteClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; @@ -77,7 +77,7 @@ gst_ebml_write_class_init (GstEbmlWriteClass *klass) } static void -gst_ebml_write_init (GstEbmlWrite *ebml) +gst_ebml_write_init (GstEbmlWrite * ebml) { ebml->srcpad = NULL; ebml->pos = 0; @@ -86,7 +86,7 @@ gst_ebml_write_init (GstEbmlWrite *ebml) } static GstElementStateReturn -gst_ebml_write_change_state (GstElement *element) +gst_ebml_write_change_state (GstElement * element) { GstEbmlWrite *ebml = GST_EBML_WRITE (element); @@ -115,8 +115,7 @@ gst_ebml_write_change_state (GstElement *element) */ void -gst_ebml_write_set_cache (GstEbmlWrite *ebml, - guint size) +gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size) { /* This is currently broken. I don't know why yet. */ return; @@ -130,7 +129,7 @@ gst_ebml_write_set_cache (GstEbmlWrite *ebml, } void -gst_ebml_write_flush_cache (GstEbmlWrite *ebml) +gst_ebml_write_flush_cache (GstEbmlWrite * ebml) { if (!ebml->cache) return; @@ -139,7 +138,7 @@ gst_ebml_write_flush_cache (GstEbmlWrite *ebml) * programmer didn't use the cache somewhere. That's fatal. */ g_assert (ebml->handled == GST_BUFFER_SIZE (ebml->cache)); g_assert (GST_BUFFER_SIZE (ebml->cache) + - GST_BUFFER_OFFSET (ebml->cache) == ebml->pos); + GST_BUFFER_OFFSET (ebml->cache) == ebml->pos); gst_pad_push (ebml->srcpad, GST_DATA (ebml->cache)); ebml->cache = NULL; @@ -152,8 +151,7 @@ gst_ebml_write_flush_cache (GstEbmlWrite *ebml) */ static GstBuffer * -gst_ebml_write_element_new (GstEbmlWrite *ebml, - guint size) +gst_ebml_write_element_new (GstEbmlWrite * ebml, guint size) { /* Create new buffer of size + ID + length */ GstBuffer *buf; @@ -163,8 +161,7 @@ gst_ebml_write_element_new (GstEbmlWrite *ebml, /* prefer cache */ if (ebml->cache) { - if (GST_BUFFER_MAXSIZE (ebml->cache) - - GST_BUFFER_SIZE (ebml->cache) < size) { + if (GST_BUFFER_MAXSIZE (ebml->cache) - GST_BUFFER_SIZE (ebml->cache) < size) { GST_LOG ("Cache available, but too small. Clearing..."); gst_ebml_write_flush_cache (ebml); } else { @@ -184,8 +181,7 @@ gst_ebml_write_element_new (GstEbmlWrite *ebml, */ static void -gst_ebml_write_element_id (GstBuffer *buf, - guint32 id) +gst_ebml_write_element_id (GstBuffer * buf, guint32 id) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); guint bytes = 4, mask = 0x10; @@ -216,8 +212,7 @@ gst_ebml_write_element_id (GstBuffer *buf, */ static void -gst_ebml_write_element_size (GstBuffer *buf, - guint64 size) +gst_ebml_write_element_size (GstBuffer * buf, guint64 size) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); guint bytes = 1, mask = 0x80; @@ -252,9 +247,7 @@ gst_ebml_write_element_size (GstBuffer *buf, */ static void -gst_ebml_write_element_data (GstBuffer *buf, - guint8 *write, - guint64 length) +gst_ebml_write_element_data (GstBuffer * buf, guint8 * write, guint64 length) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); @@ -267,8 +260,7 @@ gst_ebml_write_element_data (GstBuffer *buf, */ static void -gst_ebml_write_element_push (GstEbmlWrite *ebml, - GstBuffer *buf) +gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf) { guint data_size = GST_BUFFER_SIZE (buf) - ebml->handled; @@ -291,8 +283,7 @@ gst_ebml_write_element_push (GstEbmlWrite *ebml, */ void -gst_ebml_write_seek (GstEbmlWrite *ebml, - guint64 pos) +gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) { GstEvent *seek; @@ -301,12 +292,13 @@ gst_ebml_write_seek (GstEbmlWrite *ebml, if (ebml->cache) { /* within bounds? */ if (pos >= GST_BUFFER_OFFSET (ebml->cache) && - pos < GST_BUFFER_OFFSET (ebml->cache) + GST_BUFFER_MAXSIZE (ebml->cache)) { + pos < + GST_BUFFER_OFFSET (ebml->cache) + GST_BUFFER_MAXSIZE (ebml->cache)) { GST_BUFFER_SIZE (ebml->cache) = pos - GST_BUFFER_OFFSET (ebml->cache); if (ebml->pos > pos) - ebml->handled -= ebml->pos - pos; + ebml->handled -= ebml->pos - pos; else - ebml->handled += pos - ebml->pos; + ebml->handled += pos - ebml->pos; ebml->pos = pos; } else { GST_LOG ("Seek outside cache range. Clearing..."); @@ -314,9 +306,7 @@ gst_ebml_write_seek (GstEbmlWrite *ebml, } } - seek = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, - pos); + seek = gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_SET, pos); gst_pad_push (ebml->srcpad, GST_DATA (seek)); ebml->pos = pos; } @@ -344,9 +334,7 @@ gst_ebml_write_get_uint_size (guint64 num) */ static void -gst_ebml_write_set_uint (GstBuffer *buf, - guint64 num, - guint size) +gst_ebml_write_set_uint (GstBuffer * buf, guint64 num, guint size) { guint8 *data; @@ -363,9 +351,7 @@ gst_ebml_write_set_uint (GstBuffer *buf, */ void -gst_ebml_write_uint (GstEbmlWrite *ebml, - guint32 id, - guint64 num) +gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num) { GstBuffer *buf = gst_ebml_write_element_new (ebml, sizeof (num)); guint size = gst_ebml_write_get_uint_size (num); @@ -378,11 +364,10 @@ gst_ebml_write_uint (GstEbmlWrite *ebml, } void -gst_ebml_write_sint (GstEbmlWrite *ebml, - guint32 id, - gint64 num) +gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num) { GstBuffer *buf = gst_ebml_write_element_new (ebml, sizeof (num)); + /* if the signed number is on the edge of a extra-byte, * then we'll fall over when detecting it. Example: if I * have a number (-)0x8000 (G_MINSHORT), then my abs()<<1 @@ -407,9 +392,7 @@ gst_ebml_write_sint (GstEbmlWrite *ebml, } void -gst_ebml_write_float (GstEbmlWrite *ebml, - guint32 id, - gdouble num) +gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num) { #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) gint n; @@ -420,20 +403,18 @@ gst_ebml_write_float (GstEbmlWrite *ebml, gst_ebml_write_element_size (buf, 8); #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) for (n = 0; n < 8; n++) - GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf)] = ((guint8 *) &num)[7-n]; + GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf)] = ((guint8 *) & num)[7 - n]; GST_BUFFER_SIZE (buf) += 8; #else - gst_ebml_write_element_data (buf, (guint8 *) &num, 8); + gst_ebml_write_element_data (buf, (guint8 *) & num, 8); #endif gst_ebml_write_element_push (ebml, buf); } void -gst_ebml_write_ascii (GstEbmlWrite *ebml, - guint32 id, - const gchar *str) +gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str) { - gint len = strlen (str) + 1; /* add trailing '\0' */ + gint len = strlen (str) + 1; /* add trailing '\0' */ GstBuffer *buf = gst_ebml_write_element_new (ebml, len); gst_ebml_write_element_id (buf, id); @@ -443,17 +424,13 @@ gst_ebml_write_ascii (GstEbmlWrite *ebml, } void -gst_ebml_write_utf8 (GstEbmlWrite *ebml, - guint32 id, - const gchar *str) +gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str) { gst_ebml_write_ascii (ebml, id, str); } void -gst_ebml_write_date (GstEbmlWrite *ebml, - guint32 id, - gint64 date) +gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date) { gst_ebml_write_sint (ebml, id, date); } @@ -465,8 +442,7 @@ gst_ebml_write_date (GstEbmlWrite *ebml, */ guint64 -gst_ebml_write_master_start (GstEbmlWrite *ebml, - guint32 id) +gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id) { guint64 pos = ebml->pos, t; GstBuffer *buf = gst_ebml_write_element_new (ebml, 0); @@ -481,8 +457,7 @@ gst_ebml_write_master_start (GstEbmlWrite *ebml, } void -gst_ebml_write_master_finish (GstEbmlWrite *ebml, - guint64 startpos) +gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos) { guint64 pos = ebml->pos; GstBuffer *buf; @@ -491,17 +466,15 @@ gst_ebml_write_master_finish (GstEbmlWrite *ebml, buf = gst_ebml_write_element_new (ebml, 0); startpos = GUINT64_TO_BE ((1LLU << 56) | (pos - startpos - 8)); memcpy (GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf), - (guint8 *) &startpos, 8); + (guint8 *) & startpos, 8); GST_BUFFER_SIZE (buf) += 8; gst_ebml_write_element_push (ebml, buf); gst_ebml_write_seek (ebml, pos); } void -gst_ebml_write_binary (GstEbmlWrite *ebml, - guint32 id, - guint8 *binary, - guint64 length) +gst_ebml_write_binary (GstEbmlWrite * ebml, + guint32 id, guint8 * binary, guint64 length) { GstBuffer *buf = gst_ebml_write_element_new (ebml, length); @@ -519,9 +492,7 @@ gst_ebml_write_binary (GstEbmlWrite *ebml, */ void -gst_ebml_write_buffer_header (GstEbmlWrite *ebml, - guint32 id, - guint64 length) +gst_ebml_write_buffer_header (GstEbmlWrite * ebml, guint32 id, guint64 length) { GstBuffer *buf = gst_ebml_write_element_new (ebml, 0); @@ -531,8 +502,7 @@ gst_ebml_write_buffer_header (GstEbmlWrite *ebml, } void -gst_ebml_write_buffer (GstEbmlWrite *ebml, - GstBuffer *data) +gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * data) { gst_ebml_write_element_push (ebml, data); } @@ -547,9 +517,7 @@ gst_ebml_write_buffer (GstEbmlWrite *ebml, */ void -gst_ebml_replace_uint (GstEbmlWrite *ebml, - guint64 pos, - guint64 num) +gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num) { guint64 oldpos = ebml->pos; GstBuffer *buf = gst_buffer_new_and_alloc (8); @@ -566,9 +534,7 @@ gst_ebml_replace_uint (GstEbmlWrite *ebml, */ void -gst_ebml_write_header (GstEbmlWrite *ebml, - gchar *doctype, - guint version) +gst_ebml_write_header (GstEbmlWrite * ebml, gchar * doctype, guint version) { guint64 pos; diff --git a/gst/matroska/ebml-write.h b/gst/matroska/ebml-write.h index 43d2f8b2..8974ecbe 100644 --- a/gst/matroska/ebml-write.h +++ b/gst/matroska/ebml-write.h @@ -26,7 +26,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_EBML_WRITE \ (gst_ebml_write_get_type ()) #define GST_EBML_WRITE(obj) \ @@ -39,8 +38,8 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE)) #define GST_EBML_WRITE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) - -typedef struct _GstEbmlWrite { + typedef struct _GstEbmlWrite +{ GstElement parent; GstPad *srcpad; @@ -50,77 +49,54 @@ typedef struct _GstEbmlWrite { guint handled; } GstEbmlWrite; -typedef struct _GstEbmlWriteClass { +typedef struct _GstEbmlWriteClass +{ GstElementClass parent; } GstEbmlWriteClass; -GType gst_ebml_write_get_type (void); +GType gst_ebml_write_get_type (void); /* * Caching means that we do not push one buffer for * each element, but fill this one until a flush. */ -void gst_ebml_write_set_cache (GstEbmlWrite *ebml, - guint size); -void gst_ebml_write_flush_cache (GstEbmlWrite *ebml); +void gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size); +void gst_ebml_write_flush_cache (GstEbmlWrite * ebml); /* * Seeking. */ -void gst_ebml_write_seek (GstEbmlWrite *ebml, - guint64 pos); +void gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos); /* * Data writing. */ -void gst_ebml_write_uint (GstEbmlWrite *ebml, - guint32 id, - guint64 num); -void gst_ebml_write_sint (GstEbmlWrite *ebml, - guint32 id, - gint64 num); -void gst_ebml_write_float (GstEbmlWrite *ebml, - guint32 id, - gdouble num); -void gst_ebml_write_ascii (GstEbmlWrite *ebml, - guint32 id, - const gchar *str); -void gst_ebml_write_utf8 (GstEbmlWrite *ebml, - guint32 id, - const gchar *str); -void gst_ebml_write_date (GstEbmlWrite *ebml, - guint32 id, - gint64 date); -guint64 gst_ebml_write_master_start (GstEbmlWrite *ebml, - guint32 id); -void gst_ebml_write_master_finish (GstEbmlWrite *ebml, - guint64 startpos); -void gst_ebml_write_binary (GstEbmlWrite *ebml, - guint32 id, - guchar *binary, - guint64 length); -void gst_ebml_write_header (GstEbmlWrite *ebml, - gchar *doctype, - guint version); +void gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num); +void gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num); +void gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num); +void gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str); +void gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str); +void gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date); +guint64 gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id); +void gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos); +void gst_ebml_write_binary (GstEbmlWrite * ebml, + guint32 id, guchar * binary, guint64 length); +void gst_ebml_write_header (GstEbmlWrite * ebml, + gchar * doctype, guint version); /* * Note: this is supposed to be used only for media data. */ -void gst_ebml_write_buffer_header (GstEbmlWrite *ebml, - guint32 id, - guint64 length); -void gst_ebml_write_buffer (GstEbmlWrite *ebml, - GstBuffer *data); +void gst_ebml_write_buffer_header (GstEbmlWrite * ebml, + guint32 id, guint64 length); +void gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * data); /* * A hack, basically... See matroska-mux.c. I should actually * make a nice _replace_element_with_size() or so, but this * works for now. */ -void gst_ebml_replace_uint (GstEbmlWrite *ebml, - guint64 pos, - guint64 num); +void gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num); G_END_DECLS - #endif /* __GST_EBML_WRITE_H__ */ diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index 66537966..383ec020 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -33,101 +33,87 @@ #include "matroska-demux.h" #include "matroska-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA, ARG_STREAMINFO, /* FILL ME */ }; -static GstStaticPadTemplate sink_templ = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/x-matroska" ) -); +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska") + ); /* gobject magic foo */ -static void gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass); -static void gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass); -static void gst_matroska_demux_init (GstMatroskaDemux *demux); +static void gst_matroska_demux_base_init (GstMatroskaDemuxClass * klass); +static void gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass); +static void gst_matroska_demux_init (GstMatroskaDemux * demux); /* element functions */ -static void gst_matroska_demux_loop (GstElement *element); -static gboolean gst_matroska_demux_send_event (GstElement *element, - GstEvent *event); +static void gst_matroska_demux_loop (GstElement * element); +static gboolean gst_matroska_demux_send_event (GstElement * element, + GstEvent * event); /* pad functions */ -static const GstEventMask * - gst_matroska_demux_get_event_mask (GstPad *pad); -static gboolean gst_matroska_demux_handle_src_event (GstPad *pad, - GstEvent *event); -static const GstFormat * - gst_matroska_demux_get_src_formats (GstPad *pad); -static const GstQueryType* - gst_matroska_demux_get_src_query_types(GstPad *pad); -static gboolean gst_matroska_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); +static const GstEventMask *gst_matroska_demux_get_event_mask (GstPad * pad); +static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, + GstEvent * event); +static const GstFormat *gst_matroska_demux_get_src_formats (GstPad * pad); +static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad * + pad); +static gboolean gst_matroska_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); /* gst internal change state handler */ static GstElementStateReturn - gst_matroska_demux_change_state (GstElement *element); -static void gst_matroska_demux_set_clock (GstElement *element, - GstClock *clock); +gst_matroska_demux_change_state (GstElement * element); +static void gst_matroska_demux_set_clock (GstElement * element, + GstClock * clock); /* gobject bla bla */ -static void gst_matroska_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); /* caps functions */ -static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext - *videocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux); -static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext - *audiocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux); -static GstCaps *gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext - *complexcontext, - const gchar *codec_id, - gpointer data, - guint size); -static GstCaps *gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext - *subtitlecontext, - const gchar *codec_id, - gpointer data, - guint size); +static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext + * videocontext, + const gchar * codec_id, + gpointer data, guint size, GstMatroskaDemux * demux); +static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext + * audiocontext, + const gchar * codec_id, + gpointer data, guint size, GstMatroskaDemux * demux); +static GstCaps *gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext + * complexcontext, const gchar * codec_id, gpointer data, guint size); +static GstCaps + * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size); /* stream methods */ -static void gst_matroska_demux_reset (GstElement *element); +static void gst_matroska_demux_reset (GstElement * element); static GstEbmlReadClass *parent_class = NULL; static GstPadTemplate *videosrctempl, *audiosrctempl, *subtitlesrctempl; + /*static guint gst_matroska_demux_signals[LAST_SIGNAL] = { 0 };*/ GType -gst_matroska_demux_get_type (void) +gst_matroska_demux_get_type (void) { static GType gst_matroska_demux_type = 0; if (!gst_matroska_demux_type) { static const GTypeInfo gst_matroska_demux_info = { - sizeof (GstMatroskaDemuxClass), + sizeof (GstMatroskaDemuxClass), (GBaseInitFunc) gst_matroska_demux_base_init, NULL, (GClassInitFunc) gst_matroska_demux_class_init, @@ -140,15 +126,14 @@ gst_matroska_demux_get_type (void) gst_matroska_demux_type = g_type_register_static (GST_TYPE_EBML_READ, - "GstMatroskaDemux", - &gst_matroska_demux_info, 0); + "GstMatroskaDemux", &gst_matroska_demux_info, 0); } return gst_matroska_demux_type; } static void -gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass) +gst_matroska_demux_base_init (GstMatroskaDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); static GstElementDetails gst_matroska_demux_details = { @@ -162,13 +147,12 @@ gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass) gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, subtitlesrctempl); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_templ)); - gst_element_class_set_details (element_class, - &gst_matroska_demux_details); + gst_static_pad_template_get (&sink_templ)); + gst_element_class_set_details (element_class, &gst_matroska_demux_details); } static void -gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) +gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -177,11 +161,11 @@ gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_METADATA, - g_param_spec_boxed ("metadata", "Metadata", "Metadata", - GST_TYPE_STRUCTURE, G_PARAM_READABLE)); + g_param_spec_boxed ("metadata", "Metadata", "Metadata", + GST_TYPE_STRUCTURE, G_PARAM_READABLE)); g_object_class_install_property (gobject_class, ARG_STREAMINFO, - g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", - GST_TYPE_STRUCTURE, G_PARAM_READABLE)); + g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", + GST_TYPE_STRUCTURE, G_PARAM_READABLE)); parent_class = g_type_class_ref (GST_TYPE_EBML_READ); @@ -192,21 +176,21 @@ gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) gstelement_class->set_clock = gst_matroska_demux_set_clock; } -static void -gst_matroska_demux_init (GstMatroskaDemux *demux) +static void +gst_matroska_demux_init (GstMatroskaDemux * demux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); gint i; GST_FLAG_SET (GST_OBJECT (demux), GST_ELEMENT_EVENT_AWARE); - demux->sinkpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "sink"), "sink"); + demux->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); GST_EBML_READ (demux)->sinkpad = demux->sinkpad; - gst_element_set_loop_function (GST_ELEMENT (demux), - gst_matroska_demux_loop); + gst_element_set_loop_function (GST_ELEMENT (demux), gst_matroska_demux_loop); /* initial stream no. */ for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) { @@ -221,7 +205,7 @@ gst_matroska_demux_init (GstMatroskaDemux *demux) } static void -gst_matroska_demux_reset (GstElement *element) +gst_matroska_demux_reset (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); guint i; @@ -233,7 +217,7 @@ gst_matroska_demux_reset (GstElement *element) for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) { if (demux->src[i] != NULL) { if (demux->src[i]->pad != NULL) { - gst_element_remove_pad (GST_ELEMENT (demux), demux->src[i]->pad); + gst_element_remove_pad (GST_ELEMENT (demux), demux->src[i]->pad); } g_free (demux->src[i]->codec_id); g_free (demux->src[i]->codec_name); @@ -277,39 +261,35 @@ gst_matroska_demux_reset (GstElement *element) } static void -gst_matroska_demux_set_clock (GstElement *element, - GstClock *clock) +gst_matroska_demux_set_clock (GstElement * element, GstClock * clock) { GST_MATROSKA_DEMUX (element)->clock = clock; } static gint -gst_matroska_demux_stream_from_num (GstMatroskaDemux *demux, - guint track_num) +gst_matroska_demux_stream_from_num (GstMatroskaDemux * demux, guint track_num) { guint n; for (n = 0; n < demux->num_streams; n++) { - if (demux->src[n] != NULL && - demux->src[n]->num == track_num) { + if (demux->src[n] != NULL && demux->src[n]->num == track_num) { return n; } } if (n == demux->num_streams) { - GST_WARNING ("Failed to find corresponding pad for tracknum %d", - track_num); + GST_WARNING ("Failed to find corresponding pad for tracknum %d", track_num); } return -1; } static GstCaps * -gst_matroska_demux_src_getcaps (GstPad *pad) +gst_matroska_demux_src_getcaps (GstPad * pad) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); guint n; - + for (n = 0; n < demux->num_streams; n++) { if (demux->src[n] != NULL && demux->src[n]->pad == pad) { break; @@ -317,13 +297,13 @@ gst_matroska_demux_src_getcaps (GstPad *pad) } if (n == demux->num_streams) - return gst_caps_new_empty(); + return gst_caps_new_empty (); return gst_caps_copy (demux->src[n]->caps); } static gboolean -gst_matroska_demux_add_stream (GstMatroskaDemux *demux) +gst_matroska_demux_add_stream (GstMatroskaDemux * demux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); GstEbmlRead *ebml = GST_EBML_READ (demux); @@ -336,8 +316,8 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) if (demux->num_streams >= GST_MATROSKA_DEMUX_MAX_STREAMS) { GST_WARNING ("Maximum number of streams (%d) exceeded, skipping", - GST_MATROSKA_DEMUX_MAX_STREAMS); - return gst_ebml_read_skip (ebml); /* skip-and-continue */ + GST_MATROSKA_DEMUX_MAX_STREAMS); + return gst_ebml_read_skip (ebml); /* skip-and-continue */ } /* allocate generic... if we know the type, we'll g_renew() @@ -345,7 +325,7 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) context = g_new0 (GstMatroskaTrackContext, 1); demux->src[demux->num_streams] = context; context->index = demux->num_streams; - context->type = 0; /* no type yet */ + context->type = 0; /* no type yet */ demux->num_streams++; /* start with the master */ @@ -363,445 +343,474 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } switch (id) { - /* track number (unique stream ID) */ - case GST_MATROSKA_ID_TRACKNUMBER: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->num = num; - break; + /* track number (unique stream ID) */ + case GST_MATROSKA_ID_TRACKNUMBER:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->num = num; + break; } - /* track UID (unique identifier) */ - case GST_MATROSKA_ID_TRACKUID: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->uid = num; - break; + /* track UID (unique identifier) */ + case GST_MATROSKA_ID_TRACKUID:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->uid = num; + break; } - /* track type (video, audio, combined, subtitle, etc.) */ - case GST_MATROSKA_ID_TRACKTYPE: { - guint64 num; - if (context->type != 0) { - GST_WARNING ("More than one tracktype defined in a trackentry - skipping"); - break; - } - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->type = num; - - /* ok, so we're actually going to reallocate this thing */ - switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackVideoContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_AUDIO: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackAudioContext, context, 1); - /* defaults */ - ((GstMatroskaTrackAudioContext *) context)->channels = 1; - ((GstMatroskaTrackAudioContext *) context)->samplerate = 8000; - break; - case GST_MATROSKA_TRACK_TYPE_COMPLEX: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackComplexContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_SUBTITLE: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackSubtitleContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_LOGO: - case GST_MATROSKA_TRACK_TYPE_CONTROL: - default: - GST_WARNING ("Unknown or unsupported track type 0x%x", - context->type); - context->type = 0; - break; - } - demux->src[demux->num_streams-1] = context; - break; + /* track type (video, audio, combined, subtitle, etc.) */ + case GST_MATROSKA_ID_TRACKTYPE:{ + guint64 num; + + if (context->type != 0) { + GST_WARNING + ("More than one tracktype defined in a trackentry - skipping"); + break; + } + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->type = num; + + /* ok, so we're actually going to reallocate this thing */ + switch (context->type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackVideoContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackAudioContext, context, 1); + /* defaults */ + ((GstMatroskaTrackAudioContext *) context)->channels = 1; + ((GstMatroskaTrackAudioContext *) context)->samplerate = 8000; + break; + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackComplexContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackSubtitleContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_LOGO: + case GST_MATROSKA_TRACK_TYPE_CONTROL: + default: + GST_WARNING ("Unknown or unsupported track type 0x%x", + context->type); + context->type = 0; + break; + } + demux->src[demux->num_streams - 1] = context; + break; } - /* tracktype specific stuff for video */ - case GST_MATROSKA_ID_TRACKVIDEO: { - GstMatroskaTrackVideoContext *videocontext; - if (context->type != GST_MATROSKA_TRACK_TYPE_VIDEO) { - GST_WARNING ("trackvideo EBML entry in non-video track - ignoring track"); - res = FALSE; - break; - } else if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - videocontext = (GstMatroskaTrackVideoContext *) context; - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up > 0) { - demux->level_up--; - break; - } - - switch (id) { - /* fixme, this should be one-up, but I get it here (?) */ - case GST_MATROSKA_ID_TRACKDEFAULTDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = num; - break; - } - - /* video framerate */ - case GST_MATROSKA_ID_VIDEOFRAMERATE: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = GST_SECOND * (1. / num); - break; - } - - /* width of the size to display the video at */ - case GST_MATROSKA_ID_VIDEODISPLAYWIDTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->display_width = num; - break; - } - - /* height of the size to display the video at */ - case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->display_height = num; - break; - } - - /* width of the video in the file */ - case GST_MATROSKA_ID_VIDEOPIXELWIDTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->pixel_width = num; - break; - } - - /* height of the video in the file */ - case GST_MATROSKA_ID_VIDEOPIXELHEIGHT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->pixel_height = num; - break; - } - - /* whether the video is interlaced */ - case GST_MATROSKA_ID_VIDEOFLAGINTERLACED: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; - else - context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; - break; - } - - /* stereo mode (whether the video has two streams, where - * one is for the left eye and the other for the right eye, - * which creates a 3D-like effect) */ - case GST_MATROSKA_ID_VIDEOSTEREOMODE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num != GST_MATROSKA_EYE_MODE_MONO && - num != GST_MATROSKA_EYE_MODE_LEFT && - num != GST_MATROSKA_EYE_MODE_RIGHT && - num != GST_MATROSKA_EYE_MODE_BOTH) { - GST_WARNING ("Unknown eye mode 0x%x - ignoring", - (guint) num); - break; - } - videocontext->eye_mode = num; - break; - } - - /* aspect ratio behaviour */ - case GST_MATROSKA_ID_VIDEOASPECTRATIO: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && - num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && - num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { - GST_WARNING ("Unknown aspect ratio mode 0x%x - ignoring", - (guint) num); - break; - } - videocontext->asr_mode = num; - break; - } - - /* colourspace (only matters for raw video) fourcc */ - case GST_MATROSKA_ID_VIDEOCOLOURSPACE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->fourcc = num; - break; - } - - default: - GST_WARNING ("Unknown video track header entry 0x%x - ignoring", - id); - /* pass-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - break; + /* tracktype specific stuff for video */ + case GST_MATROSKA_ID_TRACKVIDEO:{ + GstMatroskaTrackVideoContext *videocontext; + + if (context->type != GST_MATROSKA_TRACK_TYPE_VIDEO) { + GST_WARNING + ("trackvideo EBML entry in non-video track - ignoring track"); + res = FALSE; + break; + } else if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + videocontext = (GstMatroskaTrackVideoContext *) context; + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up > 0) { + demux->level_up--; + break; + } + + switch (id) { + /* fixme, this should be one-up, but I get it here (?) */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = num; + break; + } + + /* video framerate */ + case GST_MATROSKA_ID_VIDEOFRAMERATE:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = GST_SECOND * (1. / num); + break; + } + + /* width of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->display_width = num; + break; + } + + /* height of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->display_height = num; + break; + } + + /* width of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->pixel_width = num; + break; + } + + /* height of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->pixel_height = num; + break; + } + + /* whether the video is interlaced */ + case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; + else + context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; + break; + } + + /* stereo mode (whether the video has two streams, where + * one is for the left eye and the other for the right eye, + * which creates a 3D-like effect) */ + case GST_MATROSKA_ID_VIDEOSTEREOMODE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num != GST_MATROSKA_EYE_MODE_MONO && + num != GST_MATROSKA_EYE_MODE_LEFT && + num != GST_MATROSKA_EYE_MODE_RIGHT && + num != GST_MATROSKA_EYE_MODE_BOTH) { + GST_WARNING ("Unknown eye mode 0x%x - ignoring", (guint) num); + break; + } + videocontext->eye_mode = num; + break; + } + + /* aspect ratio behaviour */ + case GST_MATROSKA_ID_VIDEOASPECTRATIO:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && + num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && + num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { + GST_WARNING ("Unknown aspect ratio mode 0x%x - ignoring", + (guint) num); + break; + } + videocontext->asr_mode = num; + break; + } + + /* colourspace (only matters for raw video) fourcc */ + case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->fourcc = num; + break; + } + + default: + GST_WARNING ("Unknown video track header entry 0x%x - ignoring", + id); + /* pass-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + break; } - /* tracktype specific stuff for audio */ - case GST_MATROSKA_ID_TRACKAUDIO: { - GstMatroskaTrackAudioContext *audiocontext; - if (context->type != GST_MATROSKA_TRACK_TYPE_AUDIO) { - GST_WARNING ("trackaudio EBML entry in non-audio track - ignoring track"); - res = FALSE; - break; - } else if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - audiocontext = (GstMatroskaTrackAudioContext *) context; - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up > 0) { - demux->level_up--; - break; - } - - switch (id) { - /* samplerate */ - case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->samplerate = num; - break; - } - - /* bitdepth */ - case GST_MATROSKA_ID_AUDIOBITDEPTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->bitdepth = num; - break; - } - - /* channels */ - case GST_MATROSKA_ID_AUDIOCHANNELS: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->channels = num; - break; - } - - default: - GST_WARNING ("Unknown audio track header entry 0x%x - ignoring", - id); - /* pass-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - break; + /* tracktype specific stuff for audio */ + case GST_MATROSKA_ID_TRACKAUDIO:{ + GstMatroskaTrackAudioContext *audiocontext; + + if (context->type != GST_MATROSKA_TRACK_TYPE_AUDIO) { + GST_WARNING + ("trackaudio EBML entry in non-audio track - ignoring track"); + res = FALSE; + break; + } else if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + audiocontext = (GstMatroskaTrackAudioContext *) context; + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up > 0) { + demux->level_up--; + break; + } + + switch (id) { + /* samplerate */ + case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->samplerate = num; + break; + } + + /* bitdepth */ + case GST_MATROSKA_ID_AUDIOBITDEPTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->bitdepth = num; + break; + } + + /* channels */ + case GST_MATROSKA_ID_AUDIOCHANNELS:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->channels = num; + break; + } + + default: + GST_WARNING ("Unknown audio track header entry 0x%x - ignoring", + id); + /* pass-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + break; } - /* codec identifier */ - case GST_MATROSKA_ID_CODECID: { - gchar *text; - if (!gst_ebml_read_ascii (ebml, &id, &text)) { - res = FALSE; - break; - } - context->codec_id = text; - break; + /* codec identifier */ + case GST_MATROSKA_ID_CODECID:{ + gchar *text; + + if (!gst_ebml_read_ascii (ebml, &id, &text)) { + res = FALSE; + break; + } + context->codec_id = text; + break; } - /* codec private data */ - case GST_MATROSKA_ID_CODECPRIVATE: { - guint8 *data; - guint64 size; - if (!gst_ebml_read_binary (ebml, &id, &data, &size)) { - res = FALSE; - break; - } - context->codec_priv = data; - context->codec_priv_size = size; - break; + /* codec private data */ + case GST_MATROSKA_ID_CODECPRIVATE:{ + guint8 *data; + guint64 size; + + if (!gst_ebml_read_binary (ebml, &id, &data, &size)) { + res = FALSE; + break; + } + context->codec_priv = data; + context->codec_priv_size = size; + break; } - /* name of the codec */ - case GST_MATROSKA_ID_CODECNAME: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->codec_name = text; - break; + /* name of the codec */ + case GST_MATROSKA_ID_CODECNAME:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->codec_name = text; + break; } - /* name of this track */ - case GST_MATROSKA_ID_TRACKNAME: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->name = text; - break; + /* name of this track */ + case GST_MATROSKA_ID_TRACKNAME:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->name = text; + break; } - /* language (matters for audio/subtitles, mostly) */ - case GST_MATROSKA_ID_TRACKLANGUAGE: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->language = text; - break; + /* language (matters for audio/subtitles, mostly) */ + case GST_MATROSKA_ID_TRACKLANGUAGE:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->language = text; + break; } - /* whether this is actually used */ - case GST_MATROSKA_ID_TRACKFLAGENABLED: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_ENABLED; - else - context->flags &= ~GST_MATROSKA_TRACK_ENABLED; - break; + /* whether this is actually used */ + case GST_MATROSKA_ID_TRACKFLAGENABLED:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_ENABLED; + else + context->flags &= ~GST_MATROSKA_TRACK_ENABLED; + break; } - /* whether it's the default for this track type */ - case GST_MATROSKA_ID_TRACKFLAGDEFAULT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_DEFAULT; - else - context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; - break; + /* whether it's the default for this track type */ + case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_DEFAULT; + else + context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; + break; } - /* lacing (like MPEG, where blocks don't end/start on frame - * boundaries) */ - case GST_MATROSKA_ID_TRACKFLAGLACING: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_LACING; - else - context->flags &= ~GST_MATROSKA_TRACK_LACING; - break; + /* lacing (like MPEG, where blocks don't end/start on frame + * boundaries) */ + case GST_MATROSKA_ID_TRACKFLAGLACING:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_LACING; + else + context->flags &= ~GST_MATROSKA_TRACK_LACING; + break; } - /* default length (in time) of one data block in this track */ - case GST_MATROSKA_ID_TRACKDEFAULTDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = num; - break; + /* default length (in time) of one data block in this track */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = num; + break; } default: - GST_WARNING ("Unknown track header entry 0x%x - ignoring", id); - /* pass-through */ + GST_WARNING ("Unknown track header entry 0x%x - ignoring", id); + /* pass-through */ - /* we ignore these because they're nothing useful (i.e. crap). */ + /* we ignore these because they're nothing useful (i.e. crap). */ case GST_MATROSKA_ID_CODECINFOURL: case GST_MATROSKA_ID_CODECDOWNLOADURL: case GST_MATROSKA_ID_TRACKMINCACHE: case GST_MATROSKA_ID_TRACKMAXCACHE: case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -830,53 +839,45 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) /* now create the GStreamer connectivity */ switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; + (GstMatroskaTrackVideoContext *) context; padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_matroska_demux_video_caps (videocontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size, - demux); + context->codec_id, + context->codec_priv, context->codec_priv_size, demux); break; } - case GST_MATROSKA_TRACK_TYPE_AUDIO: { + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = - (GstMatroskaTrackAudioContext *) context; + (GstMatroskaTrackAudioContext *) context; padname = g_strdup_printf ("audio_%02d", demux->num_a_streams++); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_matroska_demux_audio_caps (audiocontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size, - demux); + context->codec_id, + context->codec_priv, context->codec_priv_size, demux); break; } - case GST_MATROSKA_TRACK_TYPE_COMPLEX: { + case GST_MATROSKA_TRACK_TYPE_COMPLEX:{ GstMatroskaTrackComplexContext *complexcontext = - (GstMatroskaTrackComplexContext *) context; + (GstMatroskaTrackComplexContext *) context; padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_matroska_demux_complex_caps (complexcontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size); + context->codec_id, context->codec_priv, context->codec_priv_size); break; } - case GST_MATROSKA_TRACK_TYPE_SUBTITLE: { + case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{ GstMatroskaTrackSubtitleContext *subtitlecontext = - (GstMatroskaTrackSubtitleContext *) context; + (GstMatroskaTrackSubtitleContext *) context; padname = g_strdup_printf ("subtitle_%02d", demux->num_t_streams++); templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); caps = gst_matroska_demux_subtitle_caps (subtitlecontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size); + context->codec_id, context->codec_priv, context->codec_priv_size); break; } @@ -888,24 +889,23 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } /* the pad in here */ - context->pad = gst_pad_new_from_template (templ, padname); + context->pad = gst_pad_new_from_template (templ, padname); context->caps = caps ? caps : gst_caps_new_empty (); g_free (padname); /* set some functions */ gst_pad_set_formats_function (context->pad, - gst_matroska_demux_get_src_formats); + gst_matroska_demux_get_src_formats); gst_pad_set_event_mask_function (context->pad, - gst_matroska_demux_get_event_mask); + gst_matroska_demux_get_event_mask); gst_pad_set_event_function (context->pad, - gst_matroska_demux_handle_src_event); + gst_matroska_demux_handle_src_event); gst_pad_set_query_type_function (context->pad, - gst_matroska_demux_get_src_query_types); + gst_matroska_demux_get_src_query_types); gst_pad_set_query_function (context->pad, - gst_matroska_demux_handle_src_query); - gst_pad_set_getcaps_function (context->pad, - gst_matroska_demux_src_getcaps); + gst_matroska_demux_handle_src_query); + gst_pad_set_getcaps_function (context->pad, gst_matroska_demux_src_getcaps); gst_element_add_pad (GST_ELEMENT (demux), context->pad); @@ -914,9 +914,9 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } static const GstFormat * -gst_matroska_demux_get_src_formats (GstPad *pad) +gst_matroska_demux_get_src_formats (GstPad * pad) { - /*GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));*/ + /*GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); */ /* we could try to look for units (i.e. samples) in audio streams * or video streams, but both samplerate and framerate are not @@ -932,7 +932,7 @@ gst_matroska_demux_get_src_formats (GstPad *pad) } static const GstQueryType * -gst_matroska_demux_get_src_query_types (GstPad *pad) +gst_matroska_demux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -944,10 +944,8 @@ gst_matroska_demux_get_src_query_types (GstPad *pad) } static gboolean -gst_matroska_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value) +gst_matroska_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value) { gboolean res = TRUE; GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); @@ -955,28 +953,28 @@ gst_matroska_demux_handle_src_query (GstPad *pad, switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_DEFAULT: - *format = GST_FORMAT_TIME; - /* fall through */ - case GST_FORMAT_TIME: - *value = demux->duration; + case GST_FORMAT_DEFAULT: + *format = GST_FORMAT_TIME; + /* fall through */ + case GST_FORMAT_TIME: + *value = demux->duration; break; default: - res = FALSE; + res = FALSE; break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_DEFAULT: - *format = GST_FORMAT_TIME; - /* fall through */ - case GST_FORMAT_TIME: - *value = demux->pos; + case GST_FORMAT_DEFAULT: + *format = GST_FORMAT_TIME; + /* fall through */ + case GST_FORMAT_TIME: + *value = demux->pos; break; default: - res = FALSE; + res = FALSE; break; } break; @@ -990,9 +988,9 @@ gst_matroska_demux_handle_src_query (GstPad *pad, } static GstMatroskaIndex * -gst_matroskademux_seek (GstMatroskaDemux *demux) +gst_matroskademux_seek (GstMatroskaDemux * demux) { - guint entry = (guint) -1; + guint entry = (guint) - 1; guint64 offset = demux->seek_pending; guint n; @@ -1000,19 +998,19 @@ gst_matroskademux_seek (GstMatroskaDemux *demux) demux->seek_pending = GST_CLOCK_TIME_NONE; for (n = 0; n < demux->num_indexes; n++) { - if (entry == (guint) -1) { + if (entry == (guint) - 1) { entry = n; } else { gfloat diff_old = fabs (1. * (demux->index[entry].time - offset)), - diff_new = fabs (1. * (demux->index[n].time - offset)); + diff_new = fabs (1. * (demux->index[n].time - offset)); if (diff_new < diff_old) { - entry = n; + entry = n; } } } - if (entry != (guint) -1) { + if (entry != (guint) - 1) { return &demux->index[entry]; } @@ -1020,8 +1018,7 @@ gst_matroskademux_seek (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_send_event (GstElement *element, - GstEvent *event) +gst_matroska_demux_send_event (GstElement * element, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); gboolean res = TRUE; @@ -1029,20 +1026,19 @@ gst_matroska_demux_send_event (GstElement *element, switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: switch (GST_EVENT_SEEK_FORMAT (event)) { - case GST_FORMAT_TIME: - demux->seek_pending = GST_EVENT_SEEK_OFFSET (event); - break; - - default: - GST_WARNING ("Only time seek is supported"); - res = FALSE; - break; + case GST_FORMAT_TIME: + demux->seek_pending = GST_EVENT_SEEK_OFFSET (event); + break; + + default: + GST_WARNING ("Only time seek is supported"); + res = FALSE; + break; } break; default: - GST_WARNING ("Unhandled event of type %d", - GST_EVENT_TYPE (event)); + GST_WARNING ("Unhandled event of type %d", GST_EVENT_TYPE (event)); res = FALSE; break; } @@ -1053,34 +1049,32 @@ gst_matroska_demux_send_event (GstElement *element, } static const GstEventMask * -gst_matroska_demux_get_event_mask (GstPad *pad) +gst_matroska_demux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | - (gint) GST_SEEK_FLAG_KEY_UNIT) }, - { GST_EVENT_SEEK_SEGMENT, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | - (gint) GST_SEEK_FLAG_KEY_UNIT) }, - { (GstEventType) 0, (GstEventFlag) 0 } + {GST_EVENT_SEEK, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | + (gint) GST_SEEK_FLAG_KEY_UNIT)}, + {GST_EVENT_SEEK_SEGMENT, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | + (gint) GST_SEEK_FLAG_KEY_UNIT)}, + {(GstEventType) 0, (GstEventFlag) 0} }; return masks; } - + static gboolean -gst_matroska_demux_handle_src_event (GstPad *pad, - GstEvent *event) +gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); gboolean res = TRUE; - + switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK_SEGMENT: case GST_EVENT_SEEK: return gst_matroska_demux_send_event (GST_ELEMENT (demux), event); default: - GST_WARNING ("Unhandled event of type %d", - GST_EVENT_TYPE (event)); + GST_WARNING ("Unhandled event of type %d", GST_EVENT_TYPE (event)); res = FALSE; break; } @@ -1091,7 +1085,7 @@ gst_matroska_demux_handle_src_event (GstPad *pad, } static gboolean -gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) +gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); GstMatroskaIndex *entry = gst_matroskademux_seek (demux); @@ -1102,12 +1096,10 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) return FALSE; /* seek (relative to segment) */ - if (!(event = gst_ebml_read_seek (ebml, - entry->pos + demux->segment_start))) + if (!(event = gst_ebml_read_seek (ebml, entry->pos + demux->segment_start))) return FALSE; - gst_event_unref (event); /* byte - we want time */ - event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - entry->time); + gst_event_unref (event); /* byte - we want time */ + event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, entry->time); /* forward to all src pads */ for (i = 0; i < demux->num_streams; i++) { @@ -1123,7 +1115,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_init_stream (GstMatroskaDemux *demux) +gst_matroska_demux_init_stream (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); guint32 id; @@ -1135,16 +1127,15 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) if (!doctype || strcmp (doctype, "matroska") != 0) { GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), - ("Input is not a matroska stream (doctype=%s)", - doctype ? doctype : "none")); + ("Input is not a matroska stream (doctype=%s)", + doctype ? doctype : "none")); g_free (doctype); return FALSE; } g_free (doctype); if (version > 1) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), - ("Demuxer version (1) is too old to read stream version %d", - version)); + ("Demuxer version (1) is too old to read stream version %d", version)); return FALSE; } @@ -1160,7 +1151,7 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) /* oi! */ GST_WARNING ("Expected a Segment ID (0x%x), but received 0x%x!", - GST_MATROSKA_ID_SEGMENT, id); + GST_MATROSKA_ID_SEGMENT, id); if (!gst_ebml_read_skip (ebml)) return FALSE; } @@ -1176,7 +1167,7 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) +gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1192,20 +1183,20 @@ gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) } switch (id) { - /* one track within the "all-tracks" header */ + /* one track within the "all-tracks" header */ case GST_MATROSKA_ID_TRACKENTRY: - if (!gst_matroska_demux_add_stream (demux)) - res = FALSE; - break; + if (!gst_matroska_demux_add_stream (demux)) + res = FALSE; + break; default: - GST_WARNING ("Unknown entry 0x%x in track header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in track header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1218,8 +1209,7 @@ gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_index (GstMatroskaDemux *demux, - gboolean prevent_eos) +gst_matroska_demux_parse_index (GstMatroskaDemux * demux, gboolean prevent_eos) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1247,145 +1237,147 @@ gst_matroska_demux_parse_index (GstMatroskaDemux *demux, } switch (id) { - /* one single index entry ('point') */ + /* one single index entry ('point') */ case GST_MATROSKA_ID_POINTENTRY: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } - /* in the end, we hope to fill one entry with a + /* in the end, we hope to fill one entry with a * timestamp, a file position and a tracknum */ - idx.pos = (guint64) -1; - idx.time = (guint64) -1; - idx.track = (guint16) -1; - - while (res) { - if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { - res = FALSE; - break; - } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - /* one single index entry ('point') */ - case GST_MATROSKA_ID_CUETIME: { - gint64 time; - if (!gst_ebml_read_uint (ebml, &id, &time)) { - res = FALSE; - break; - } - idx.time = time * demux->time_scale; - break; - } - - /* position in the file + track to which it belongs */ - case GST_MATROSKA_ID_CUETRACKPOSITION: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - - while (res) { - if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { - res = FALSE; - break; - } else if (!(id = gst_ebml_peek_id (ebml, - &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - /* track number */ - case GST_MATROSKA_ID_CUETRACK: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - idx.track = num; - break; - } - - /* position in file */ - case GST_MATROSKA_ID_CUECLUSTERPOSITION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - idx.pos = num; - break; - } - - default: - GST_WARNING ("Unknown entry 0x%x in CuesTrackPositions", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - break; - - default: - GST_WARNING ("Unknown entry 0x%x in cuespoint index", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - /* so let's see if we got what we wanted */ - if (idx.pos != (guint64) -1 && - idx.time != (guint64) -1 && - idx.track != (guint16) -1) { - if (demux->num_indexes % 32 == 0) { - /* re-allocate bigger index */ - demux->index = g_renew (GstMatroskaIndex, demux->index, - demux->num_indexes + 32); - } - demux->index[demux->num_indexes].pos = idx.pos; - demux->index[demux->num_indexes].time = idx.time; - demux->index[demux->num_indexes].track = idx.track; - demux->num_indexes++; - } - - break; + idx.pos = (guint64) - 1; + idx.time = (guint64) - 1; + idx.track = (guint16) - 1; + + while (res) { + if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { + res = FALSE; + break; + } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + /* one single index entry ('point') */ + case GST_MATROSKA_ID_CUETIME:{ + gint64 time; + + if (!gst_ebml_read_uint (ebml, &id, &time)) { + res = FALSE; + break; + } + idx.time = time * demux->time_scale; + break; + } + + /* position in the file + track to which it belongs */ + case GST_MATROSKA_ID_CUETRACKPOSITION: + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + + while (res) { + if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { + res = FALSE; + break; + } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + /* track number */ + case GST_MATROSKA_ID_CUETRACK:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + idx.track = num; + break; + } + + /* position in file */ + case GST_MATROSKA_ID_CUECLUSTERPOSITION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + idx.pos = num; + break; + } + + default: + GST_WARNING ("Unknown entry 0x%x in CuesTrackPositions", + id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + break; + + default: + GST_WARNING ("Unknown entry 0x%x in cuespoint index", id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + /* so let's see if we got what we wanted */ + if (idx.pos != (guint64) - 1 && + idx.time != (guint64) - 1 && idx.track != (guint16) - 1) { + if (demux->num_indexes % 32 == 0) { + /* re-allocate bigger index */ + demux->index = g_renew (GstMatroskaIndex, demux->index, + demux->num_indexes + 32); + } + demux->index[demux->num_indexes].pos = idx.pos; + demux->index[demux->num_indexes].time = idx.time; + demux->index[demux->num_indexes].track = idx.track; + demux->num_indexes++; + } + + break; default: - GST_WARNING ("Unknown entry 0x%x in cues header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in cues header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1398,7 +1390,7 @@ gst_matroska_demux_parse_index (GstMatroskaDemux *demux, } static gboolean -gst_matroska_demux_parse_info (GstMatroskaDemux *demux) +gst_matroska_demux_parse_info (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1414,65 +1406,70 @@ gst_matroska_demux_parse_info (GstMatroskaDemux *demux) } switch (id) { - /* cluster timecode */ - case GST_MATROSKA_ID_TIMECODESCALE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - demux->time_scale = num; - break; + /* cluster timecode */ + case GST_MATROSKA_ID_TIMECODESCALE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + demux->time_scale = num; + break; } - case GST_MATROSKA_ID_DURATION: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - demux->duration = num * demux->time_scale; - break; + case GST_MATROSKA_ID_DURATION:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + demux->duration = num * demux->time_scale; + break; } - case GST_MATROSKA_ID_WRITINGAPP: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - demux->writing_app = text; - break; + case GST_MATROSKA_ID_WRITINGAPP:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + demux->writing_app = text; + break; } - case GST_MATROSKA_ID_MUXINGAPP: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - demux->muxing_app = text; - break; + case GST_MATROSKA_ID_MUXINGAPP:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + demux->muxing_app = text; + break; } - case GST_MATROSKA_ID_DATEUTC: { - gint64 time; - if (!gst_ebml_read_date (ebml, &id, &time)) { - res = FALSE; - break; - } - demux->created = time; - break; + case GST_MATROSKA_ID_DATEUTC:{ + gint64 time; + + if (!gst_ebml_read_date (ebml, &id, &time)) { + res = FALSE; + break; + } + demux->created = time; + break; } default: - GST_WARNING ("Unknown entry 0x%x in info header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in info header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1485,8 +1482,8 @@ gst_matroska_demux_parse_info (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, - gboolean prevent_eos) +gst_matroska_demux_parse_metadata (GstMatroskaDemux * demux, + gboolean prevent_eos) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1514,13 +1511,13 @@ gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, switch (id) { default: - GST_WARNING ("metadata unimplemented"); - /* fall-through */ + GST_WARNING ("metadata unimplemented"); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1538,9 +1535,7 @@ gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, */ static gint -gst_matroska_ebmlnum_uint (guint8 *data, - guint size, - guint64 *num) +gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) { gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; guint64 total; @@ -1548,7 +1543,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, if (size <= 0) { return -1; } - + total = data[0]; while (read <= 8 && !(total & len_mask)) { read++; @@ -1556,7 +1551,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, } if (read > 8) return -1; - + if ((total &= (len_mask - 1)) == len_mask - 1) num_ffs++; if (size < read) @@ -1580,9 +1575,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, } static gint -gst_matroska_ebmlnum_sint (guint8 *data, - guint size, - gint64 *num) +gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) { guint64 unum; gint res; @@ -1601,8 +1594,8 @@ gst_matroska_ebmlnum_sint (guint8 *data, } static gboolean -gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, - guint64 cluster_time) +gst_matroska_demux_parse_blockgroup (GstMatroskaDemux * demux, + guint64 cluster_time) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1618,165 +1611,178 @@ gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, } switch (id) { - /* one block inside the group. Note, block parsing is one - * of the harder things, so this code is a bit complicated. - * See http://www.matroska.org/ for documentation. */ - case GST_MATROSKA_ID_BLOCK: { - GstBuffer *buf; - guint8 *data; - gint64 time; - guint size, *lace_size = NULL; - gint n, stream, flags, laces = 0; - guint64 num; - - if (!gst_ebml_read_buffer (ebml, &id, &buf)) { - res = FALSE; - break; - } - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); - - /* first byte(s): blocknum */ - if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - gst_buffer_unref (buf); - res = FALSE; - break; - } - data += n; size -= n; - - /* fetch stream from num */ - stream = gst_matroska_demux_stream_from_num (demux, num); - if (size <= 3 || stream < 0 || stream >= demux->num_streams) { - gst_buffer_unref (buf); - GST_WARNING ("Invalid stream %d or size %u", stream, size); - break; - } - if (!GST_PAD_IS_USABLE (demux->src[stream]->pad)) { - gst_buffer_unref (buf); - break; - } - - /* time (relative to cluster time) */ - time = (GINT16_FROM_BE (* (gint16 *) data)) * demux->time_scale; - data += 2; size -= 2; - flags = * (guint8 *) data; - data += 1; size -= 1; - switch ((flags & 0x06) >> 1) { - case 0x0: /* no lacing */ - laces = 1; - lace_size = g_new (gint, 1); - lace_size[0] = size; - break; - - case 0x1: /* xiph lacing */ - case 0x2: /* fixed-size lacing */ - case 0x3: /* EBML lacing */ - if (size == 0) { - res = FALSE; - break; - } - laces = (* (guint8 *) data) + 1; - data += 1; size -= 1; - lace_size = g_new0 (gint, laces); - - switch ((flags & 0x06) >> 1) { - case 0x1: /* xiph lacing */ { - guint temp, total = 0; - for (n = 0; res && n < laces - 1; n++) { - while (1) { - if (size == 0) { - res = FALSE; - break; - } - temp = * (guint8 *) data; - lace_size[n] += temp; - data += 1; size -= 1; - if (temp != 0xff) - break; - } - total += lace_size[n]; - } - lace_size[n] = size - total; - break; - } - - case 0x2: /* fixed-size lacing */ - for (n = 0; n < laces; n++) - lace_size[n] = size / laces; - break; - - case 0x3: /* EBML lacing */ { - guint total; - if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - res = FALSE; - break; - } - data += n; size -= n; - total = lace_size[0] = num; - for (n = 1; res && n < laces - 1; n++) { - gint64 snum; - gint r; - if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - res = FALSE; - break; - } - data += r; size -= r; - lace_size[n] = lace_size[n - 1] + snum; - total += lace_size[n]; - } - lace_size[n] = size - total; - break; - } - } - break; - } - - if (res) { - for (n = 0; n < laces; n++) { - GstBuffer *sub = gst_buffer_create_sub (buf, - GST_BUFFER_SIZE (buf) - size, - lace_size[n]); - - if (cluster_time != GST_CLOCK_TIME_NONE) { - if (time < 0 && (-time) > cluster_time) - GST_BUFFER_TIMESTAMP (sub) = cluster_time; - else - GST_BUFFER_TIMESTAMP (sub) = cluster_time + time; - } - /* FIXME: duration */ - - gst_pad_push (demux->src[stream]->pad, GST_DATA (sub)); - - size -= lace_size[n]; - } - } - - g_free (lace_size); - gst_buffer_unref (buf); - break; + /* one block inside the group. Note, block parsing is one + * of the harder things, so this code is a bit complicated. + * See http://www.matroska.org/ for documentation. */ + case GST_MATROSKA_ID_BLOCK:{ + GstBuffer *buf; + guint8 *data; + gint64 time; + guint size, *lace_size = NULL; + gint n, stream, flags, laces = 0; + guint64 num; + + if (!gst_ebml_read_buffer (ebml, &id, &buf)) { + res = FALSE; + break; + } + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* first byte(s): blocknum */ + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); + gst_buffer_unref (buf); + res = FALSE; + break; + } + data += n; + size -= n; + + /* fetch stream from num */ + stream = gst_matroska_demux_stream_from_num (demux, num); + if (size <= 3 || stream < 0 || stream >= demux->num_streams) { + gst_buffer_unref (buf); + GST_WARNING ("Invalid stream %d or size %u", stream, size); + break; + } + if (!GST_PAD_IS_USABLE (demux->src[stream]->pad)) { + gst_buffer_unref (buf); + break; + } + + /* time (relative to cluster time) */ + time = (GINT16_FROM_BE (*(gint16 *) data)) * demux->time_scale; + data += 2; + size -= 2; + flags = *(guint8 *) data; + data += 1; + size -= 1; + switch ((flags & 0x06) >> 1) { + case 0x0: /* no lacing */ + laces = 1; + lace_size = g_new (gint, 1); + lace_size[0] = size; + break; + + case 0x1: /* xiph lacing */ + case 0x2: /* fixed-size lacing */ + case 0x3: /* EBML lacing */ + if (size == 0) { + res = FALSE; + break; + } + laces = (*(guint8 *) data) + 1; + data += 1; + size -= 1; + lace_size = g_new0 (gint, laces); + + switch ((flags & 0x06) >> 1) { + case 0x1: /* xiph lacing */ { + guint temp, total = 0; + + for (n = 0; res && n < laces - 1; n++) { + while (1) { + if (size == 0) { + res = FALSE; + break; + } + temp = *(guint8 *) data; + lace_size[n] += temp; + data += 1; + size -= 1; + if (temp != 0xff) + break; + } + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + + case 0x2: /* fixed-size lacing */ + for (n = 0; n < laces; n++) + lace_size[n] = size / laces; + break; + + case 0x3: /* EBML lacing */ { + guint total; + + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Data error")); + res = FALSE; + break; + } + data += n; + size -= n; + total = lace_size[0] = num; + for (n = 1; res && n < laces - 1; n++) { + gint64 snum; + gint r; + + if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Data error")); + res = FALSE; + break; + } + data += r; + size -= r; + lace_size[n] = lace_size[n - 1] + snum; + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + } + break; + } + + if (res) { + for (n = 0; n < laces; n++) { + GstBuffer *sub = gst_buffer_create_sub (buf, + GST_BUFFER_SIZE (buf) - size, + lace_size[n]); + + if (cluster_time != GST_CLOCK_TIME_NONE) { + if (time < 0 && (-time) > cluster_time) + GST_BUFFER_TIMESTAMP (sub) = cluster_time; + else + GST_BUFFER_TIMESTAMP (sub) = cluster_time + time; + } + /* FIXME: duration */ + + gst_pad_push (demux->src[stream]->pad, GST_DATA (sub)); + + size -= lace_size[n]; + } + } + + g_free (lace_size); + gst_buffer_unref (buf); + break; } - case GST_MATROSKA_ID_BLOCKDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - GST_WARNING ("FIXME: implement support for BlockDuration"); - break; + case GST_MATROSKA_ID_BLOCKDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + GST_WARNING ("FIXME: implement support for BlockDuration"); + break; } default: - GST_WARNING ("Unknown entry 0x%x in blockgroup data", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in blockgroup data", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1789,7 +1795,7 @@ gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, } static gboolean -gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) +gst_matroska_demux_parse_cluster (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1814,34 +1820,35 @@ gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) } switch (id) { - /* cluster timecode */ - case GST_MATROSKA_ID_CLUSTERTIMECODE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - cluster_time = num * demux->time_scale; - break; + /* cluster timecode */ + case GST_MATROSKA_ID_CLUSTERTIMECODE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + cluster_time = num * demux->time_scale; + break; } - /* a group of blocks inside a cluster */ + /* a group of blocks inside a cluster */ case GST_MATROSKA_ID_BLOCKGROUP: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_blockgroup (demux, cluster_time); - break; + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_blockgroup (demux, cluster_time); + break; default: - GST_WARNING ("Unknown entry 0x%x in cluster data", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in cluster data", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1854,7 +1861,7 @@ gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) +gst_matroska_demux_parse_contents (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1870,162 +1877,163 @@ gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) } switch (id) { - case GST_MATROSKA_ID_SEEKENTRY: { - guint32 seek_id = 0; - guint64 seek_pos = (guint64) -1, t; - - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - case GST_MATROSKA_ID_SEEKID: - if (!gst_ebml_read_uint (ebml, &id, &t)) - res = FALSE; - seek_id = t; - break; - - case GST_MATROSKA_ID_SEEKPOSITION: - if (!gst_ebml_read_uint (ebml, &id, &seek_pos)) - res = FALSE; - break; - - default: - GST_WARNING ("Unknown seekhead ID 0x%x", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - if (!seek_id || seek_pos == (guint64) -1) { - GST_WARNING ("Incomplete seekhead entry (0x%x/%" - G_GUINT64_FORMAT ")", seek_id, seek_pos); - break; - } - - switch (seek_id) { - case GST_MATROSKA_ID_CUES: - case GST_MATROSKA_ID_TAGS: { - guint level_up = demux->level_up; - guint64 before_pos, length; - GstEbmlLevel *level; - GstEvent *event; - - /* remember */ - length = gst_bytestream_length (ebml->bs); - before_pos = gst_bytestream_tell (ebml->bs); - - /* check for validity */ - if (seek_pos + demux->segment_start + 12 >= length) { - g_warning ("Seekhead reference lies outside file!"); - break; - } - - /* seek */ - if (!(event = gst_ebml_read_seek (ebml, - seek_pos + demux->segment_start))) - return FALSE; - gst_event_unref (event); - - /* we don't want to lose our seekhead level, so we add - * a dummy. This is a crude hack. */ - level = g_new (GstEbmlLevel, 1); - level->start = 0; - level->length = G_MAXUINT64; - ebml->level = g_list_append (ebml->level, level); - - /* check ID */ - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } - if (id != seek_id) { - g_warning ("We looked for ID=0x%x but got ID=0x%x (pos=%llu)", - seek_id, id, seek_pos + demux->segment_start); - goto finish; - } - - /* read master + parse */ - switch (id) { - case GST_MATROSKA_ID_CUES: - if (!gst_ebml_read_master (ebml, &id)) - res = FALSE; - else if (!gst_matroska_demux_parse_index (demux, TRUE) && - gst_bytestream_length (ebml->bs) != - gst_bytestream_tell (ebml->bs)) - res = FALSE; - else - demux->index_parsed = TRUE; - break; - case GST_MATROSKA_ID_TAGS: - if (!gst_ebml_read_master (ebml, &id)) - res = FALSE; - else if (!gst_matroska_demux_parse_metadata (demux, TRUE) && - gst_bytestream_length (ebml->bs) != - gst_bytestream_tell (ebml->bs)) - res = FALSE; - else - demux->metadata_parsed = TRUE; - break; - } - if (!res) - break; - - finish: - /* remove dummy level */ - while (ebml->level) { - guint64 length; - level = g_list_last (ebml->level)->data; - ebml->level = g_list_remove (ebml->level, level); - length = level->length; - g_free (level); - if (length == G_MAXUINT64) - break; - } - - /* seek back */ - if (!(event = gst_ebml_read_seek (ebml, before_pos))) - return FALSE; - gst_event_unref (event); - demux->level_up = level_up; - break; - } - - default: - GST_INFO ("Ignoring seekhead entry for ID=0x%x", seek_id); - break; - } - - break; + case GST_MATROSKA_ID_SEEKENTRY:{ + guint32 seek_id = 0; + guint64 seek_pos = (guint64) - 1, t; + + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + case GST_MATROSKA_ID_SEEKID: + if (!gst_ebml_read_uint (ebml, &id, &t)) + res = FALSE; + seek_id = t; + break; + + case GST_MATROSKA_ID_SEEKPOSITION: + if (!gst_ebml_read_uint (ebml, &id, &seek_pos)) + res = FALSE; + break; + + default: + GST_WARNING ("Unknown seekhead ID 0x%x", id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + if (!seek_id || seek_pos == (guint64) - 1) { + GST_WARNING ("Incomplete seekhead entry (0x%x/%" + G_GUINT64_FORMAT ")", seek_id, seek_pos); + break; + } + + switch (seek_id) { + case GST_MATROSKA_ID_CUES: + case GST_MATROSKA_ID_TAGS:{ + guint level_up = demux->level_up; + guint64 before_pos, length; + GstEbmlLevel *level; + GstEvent *event; + + /* remember */ + length = gst_bytestream_length (ebml->bs); + before_pos = gst_bytestream_tell (ebml->bs); + + /* check for validity */ + if (seek_pos + demux->segment_start + 12 >= length) { + g_warning ("Seekhead reference lies outside file!"); + break; + } + + /* seek */ + if (!(event = gst_ebml_read_seek (ebml, + seek_pos + demux->segment_start))) + return FALSE; + gst_event_unref (event); + + /* we don't want to lose our seekhead level, so we add + * a dummy. This is a crude hack. */ + level = g_new (GstEbmlLevel, 1); + level->start = 0; + level->length = G_MAXUINT64; + ebml->level = g_list_append (ebml->level, level); + + /* check ID */ + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } + if (id != seek_id) { + g_warning ("We looked for ID=0x%x but got ID=0x%x (pos=%llu)", + seek_id, id, seek_pos + demux->segment_start); + goto finish; + } + + /* read master + parse */ + switch (id) { + case GST_MATROSKA_ID_CUES: + if (!gst_ebml_read_master (ebml, &id)) + res = FALSE; + else if (!gst_matroska_demux_parse_index (demux, TRUE) && + gst_bytestream_length (ebml->bs) != + gst_bytestream_tell (ebml->bs)) + res = FALSE; + else + demux->index_parsed = TRUE; + break; + case GST_MATROSKA_ID_TAGS: + if (!gst_ebml_read_master (ebml, &id)) + res = FALSE; + else if (!gst_matroska_demux_parse_metadata (demux, TRUE) && + gst_bytestream_length (ebml->bs) != + gst_bytestream_tell (ebml->bs)) + res = FALSE; + else + demux->metadata_parsed = TRUE; + break; + } + if (!res) + break; + + finish: + /* remove dummy level */ + while (ebml->level) { + guint64 length; + + level = g_list_last (ebml->level)->data; + ebml->level = g_list_remove (ebml->level, level); + length = level->length; + g_free (level); + if (length == G_MAXUINT64) + break; + } + + /* seek back */ + if (!(event = gst_ebml_read_seek (ebml, before_pos))) + return FALSE; + gst_event_unref (event); + demux->level_up = level_up; + break; + } + + default: + GST_INFO ("Ignoring seekhead entry for ID=0x%x", seek_id); + break; + } + + break; } default: - GST_WARNING ("Unknown seekhead ID 0x%x", id); - /* fall-through */ + GST_WARNING ("Unknown seekhead ID 0x%x", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -2038,7 +2046,7 @@ gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) +gst_matroska_demux_loop_stream (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -2055,88 +2063,88 @@ gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) } switch (id) { - /* stream info */ - case GST_MATROSKA_ID_INFO: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_info (demux); - break; + /* stream info */ + case GST_MATROSKA_ID_INFO:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_info (demux); + break; } - /* track info headers */ - case GST_MATROSKA_ID_TRACKS: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_tracks (demux); - break; + /* track info headers */ + case GST_MATROSKA_ID_TRACKS:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_tracks (demux); + break; } - /* stream index */ - case GST_MATROSKA_ID_CUES: { - if (!demux->index_parsed) { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_index (demux, FALSE); - } else - res = gst_ebml_read_skip (ebml); - break; + /* stream index */ + case GST_MATROSKA_ID_CUES:{ + if (!demux->index_parsed) { + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_index (demux, FALSE); + } else + res = gst_ebml_read_skip (ebml); + break; } - /* metadata */ - case GST_MATROSKA_ID_TAGS: { - if (!demux->index_parsed) { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_metadata (demux, FALSE); - } else - res = gst_ebml_read_skip (ebml); - break; + /* metadata */ + case GST_MATROSKA_ID_TAGS:{ + if (!demux->index_parsed) { + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_metadata (demux, FALSE); + } else + res = gst_ebml_read_skip (ebml); + break; } - /* file index (if seekable, seek to Cues/Tags to parse it) */ - case GST_MATROSKA_ID_SEEKHEAD: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_contents (demux); - break; + /* file index (if seekable, seek to Cues/Tags to parse it) */ + case GST_MATROSKA_ID_SEEKHEAD:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_contents (demux); + break; } - case GST_MATROSKA_ID_CLUSTER: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - /* The idea is that we parse one cluster per loop and - * then break out of the loop here. In the next call - * of the loopfunc, we will get back here with the - * next cluster. If an error occurs, we didn't - * actually push a buffer, but we still want to break - * out of the loop to handle a possible error. We'll - * get back here if it's recoverable. */ - gst_matroska_demux_parse_cluster (demux); - demux->state = GST_MATROSKA_DEMUX_STATE_DATA; - res = FALSE; - break; + case GST_MATROSKA_ID_CLUSTER:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + /* The idea is that we parse one cluster per loop and + * then break out of the loop here. In the next call + * of the loopfunc, we will get back here with the + * next cluster. If an error occurs, we didn't + * actually push a buffer, but we still want to break + * out of the loop to handle a possible error. We'll + * get back here if it's recoverable. */ + gst_matroska_demux_parse_cluster (demux); + demux->state = GST_MATROSKA_DEMUX_STATE_DATA; + res = FALSE; + break; } default: - GST_WARNING ("Unknown matroska file header ID 0x%x", id); - /* fall-through */ + GST_WARNING ("Unknown matroska file header ID 0x%x", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -2149,7 +2157,7 @@ gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) } static void -gst_matroska_demux_loop (GstElement *element) +gst_matroska_demux_loop (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); @@ -2165,14 +2173,10 @@ gst_matroska_demux_loop (GstElement *element) } static GstCaps * -gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux) +gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * videocontext, + const gchar * codec_id, gpointer data, guint size, GstMatroskaDemux * demux) { - GstMatroskaTrackContext *context = - (GstMatroskaTrackContext *) videocontext; + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext; GstCaps *caps = NULL; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC)) { @@ -2181,39 +2185,42 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, if (data) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); - + vids = (gst_riff_strf_vids *) data; /* assure size is big enough */ if (size < 24) { - GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); - return NULL; + GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); + return NULL; } if (size < sizeof (gst_riff_strf_vids)) { - vids = (gst_riff_strf_vids *) g_realloc (vids, sizeof (gst_riff_strf_vids)); + vids = + (gst_riff_strf_vids *) g_realloc (vids, + sizeof (gst_riff_strf_vids)); } /* little-endian -> byte-order */ - vids->size = GUINT32_FROM_LE (vids->size); - vids->width = GUINT32_FROM_LE (vids->width); - vids->height = GUINT32_FROM_LE (vids->height); - vids->planes = GUINT16_FROM_LE (vids->planes); - vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); + vids->size = GUINT32_FROM_LE (vids->size); + vids->width = GUINT32_FROM_LE (vids->width); + vids->height = GUINT32_FROM_LE (vids->height); + vids->planes = GUINT16_FROM_LE (vids->planes); + vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); vids->compression = GUINT32_FROM_LE (vids->compression); - vids->image_size = GUINT32_FROM_LE (vids->image_size); + vids->image_size = GUINT32_FROM_LE (vids->image_size); vids->xpels_meter = GUINT32_FROM_LE (vids->xpels_meter); vids->ypels_meter = GUINT32_FROM_LE (vids->ypels_meter); - vids->num_colors = GUINT32_FROM_LE (vids->num_colors); - vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); + vids->num_colors = GUINT32_FROM_LE (vids->num_colors); + vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); caps = gst_riff_create_video_caps (vids->compression, NULL, vids, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); if (GST_IS_ELEMENT (demux)) - gst_element_found_tags (GST_ELEMENT (demux), list); + gst_element_found_tags (GST_ELEMENT (demux), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); } else { caps = gst_riff_create_video_template_caps (); } @@ -2223,15 +2230,15 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, guint32 fourcc = 0; switch (videocontext->fourcc) { - case GST_MAKE_FOURCC ('I','4','2','0'): - case GST_MAKE_FOURCC ('Y','U','Y','2'): - fourcc = videocontext->fourcc; - break; - - default: - GST_DEBUG ("Unknown fourcc " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (videocontext->fourcc)); - return NULL; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + fourcc = videocontext->fourcc; + break; + + default: + GST_DEBUG ("Unknown fourcc " GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (videocontext->fourcc)); + return NULL; } caps = gst_caps_new_simple ("video/x-raw-yuv", @@ -2244,24 +2251,20 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 4, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { - caps = gst_caps_new_full ( - gst_structure_new ("video/x-divx", - "divxversion", G_TYPE_INT, 5, NULL), + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL), gst_structure_new ("video/x-xvid", NULL), gst_structure_new ("video/mpeg", - "mpegversion", G_TYPE_INT, 4, - "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), - NULL); + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) { - caps = gst_caps_new_full ( - gst_structure_new ("video/x-divx", - "divxversion", G_TYPE_INT, 3, NULL), + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 3, NULL), gst_structure_new ("video/x-msmpeg", - "msmpegversion", G_TYPE_INT, 43, NULL), - NULL); + "msmpegversion", G_TYPE_INT, 43, NULL), NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { gint mpegversion = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1)) @@ -2273,12 +2276,11 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, caps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, FALSE, - "mpegversion", G_TYPE_INT, mpegversion, NULL); + "mpegversion", G_TYPE_INT, mpegversion, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MJPEG)) { caps = gst_caps_new_simple ("video/x-jpeg", NULL); } else { - GST_WARNING ("Unknown codec '%s', cannot build Caps", - codec_id); + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } @@ -2286,54 +2288,49 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, int i; GstStructure *structure; - for (i=0;ipixel_width > 0 && - videocontext->pixel_height > 0) { - gint w = videocontext->pixel_width; - gint h = videocontext->pixel_height; + if (videocontext->pixel_width > 0 && videocontext->pixel_height > 0) { + gint w = videocontext->pixel_width; + gint h = videocontext->pixel_height; gst_structure_set (structure, - "width", G_TYPE_INT, w, - "height", G_TYPE_INT, h, NULL); - } else { + "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL); + } else { gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 16, 4096, - "height", GST_TYPE_INT_RANGE, 16, 4096, - NULL); - } + "height", GST_TYPE_INT_RANGE, 16, 4096, NULL); + } #if 0 - if (videocontext->display_width > 0 && - videocontext->display_height > 0) { - gint w = 100 * videocontext->display_width / videocontext->pixel_width; - gint h = 100 * videocontext->display_height / videocontext->pixel_height; + if (videocontext->display_width > 0 && videocontext->display_height > 0) { + gint w = + 100 * videocontext->display_width / videocontext->pixel_width; + gint h = + 100 * videocontext->display_height / videocontext->pixel_height; gst_structure_set (structure, "pixel_width", G_TYPE_INT, w, - "pixel_height", G_TYPE_INT, h, - NULL); - } + "pixel_height", G_TYPE_INT, h, NULL); + } #endif - if (context->default_duration > 0) { - gfloat framerate = 1. * GST_SECOND / context->default_duration; + if (context->default_duration > 0) { + gfloat framerate = 1. * GST_SECOND / context->default_duration; gst_structure_set (structure, "framerate", G_TYPE_DOUBLE, framerate, NULL); - } else { - /* sort of a hack to get most codecs to support, + } else { + /* sort of a hack to get most codecs to support, * even if the default_duration is missing */ - gst_structure_set (structure, - "framerate", G_TYPE_DOUBLE, 25.0, NULL); - } + gst_structure_set (structure, "framerate", G_TYPE_DOUBLE, 25.0, NULL); + } } else { gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 16, 4096, "height", GST_TYPE_INT_RANGE, 16, 4096, "pixel_width", GST_TYPE_INT_RANGE, 0, 255, "pixel_height", GST_TYPE_INT_RANGE, 0, 255, - "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, - NULL); + "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, NULL); } } } @@ -2342,14 +2339,10 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, } static GstCaps * -gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux) +gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * audiocontext, + const gchar * codec_id, gpointer data, guint size, GstMatroskaDemux * demux) { - GstMatroskaTrackContext *context = - (GstMatroskaTrackContext *) audiocontext; + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext; GstCaps *caps = NULL; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) || @@ -2367,10 +2360,9 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, g_assert (0); caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, layer, NULL); + "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { gint endianness = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE)) @@ -2388,8 +2380,7 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, } else { caps = gst_caps_from_string ("audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " - "depth = (int) { 8, 16 }, " - "width = (int) { 8, 16 }"); + "depth = (int) { 8, 16 }, " "width = (int) { 8, 16 }"); } gst_caps_set_simple (caps, "endianness", G_TYPE_INT, endianness, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) { @@ -2400,11 +2391,10 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, gst_caps_set_simple (caps, "width", G_TYPE_INT, audiocontext->bitdepth, NULL); } else { - gst_caps_set_simple (caps, - "width", GST_TYPE_INT_RANGE, 32, 64, NULL); + gst_caps_set_simple (caps, "width", GST_TYPE_INT_RANGE, 32, 64, NULL); } } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AC3) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { caps = gst_caps_new_simple ("audio/x-ac3", NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) { caps = gst_caps_new_simple ("audio/x-vorbis", NULL); @@ -2414,47 +2404,47 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, if (data) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); - + auds = (gst_riff_strf_auds *) data; /* little-endian -> byte-order */ - auds->format = GUINT16_FROM_LE (auds->format); - auds->channels = GUINT16_FROM_LE (auds->channels); - auds->rate = GUINT32_FROM_LE (auds->rate); - auds->av_bps = GUINT32_FROM_LE (auds->av_bps); + auds->format = GUINT16_FROM_LE (auds->format); + auds->channels = GUINT16_FROM_LE (auds->channels); + auds->rate = GUINT32_FROM_LE (auds->rate); + auds->av_bps = GUINT32_FROM_LE (auds->av_bps); auds->blockalign = GUINT16_FROM_LE (auds->blockalign); - auds->size = GUINT16_FROM_LE (auds->size); + auds->size = GUINT16_FROM_LE (auds->size); caps = gst_riff_create_audio_caps (auds->format, NULL, auds, &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, - codec_name, NULL); + codec_name, NULL); if (GST_IS_ELEMENT (demux)) - gst_element_found_tags (GST_ELEMENT (demux), list); + gst_element_found_tags (GST_ELEMENT (demux), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); } else { caps = gst_riff_create_audio_template_caps (); } } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2)) || - !strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) { + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2)) || + !strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) { gint mpegversion = -1; if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2))) + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2))) mpegversion = 2; else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) mpegversion = 4; else g_assert (0); caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, mpegversion, NULL); + "mpegversion", G_TYPE_INT, mpegversion, NULL); } else { - GST_WARNING ("Unknown codec '%s', cannot build Caps", - codec_id); + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } @@ -2462,21 +2452,18 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, GstStructure *structure; int i; - for (i=0; isamplerate > 0 && - audiocontext->channels > 0) { + if (audiocontext->samplerate > 0 && audiocontext->channels > 0) { gst_structure_set (structure, "channels", G_TYPE_INT, audiocontext->channels, - "rate", G_TYPE_INT, audiocontext->samplerate, - NULL); - } + "rate", G_TYPE_INT, audiocontext->samplerate, NULL); + } } else { gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 6, - "rate", GST_TYPE_INT_RANGE, 4000, 96000, - NULL); + "rate", GST_TYPE_INT_RANGE, 4000, 96000, NULL); } } } @@ -2485,10 +2472,8 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, } static GstCaps * -gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext *complexcontext, - const gchar *codec_id, - gpointer data, - guint size) +gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext * + complexcontext, const gchar * codec_id, gpointer data, guint size) { GstCaps *caps = NULL; @@ -2498,10 +2483,8 @@ gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext *complexcontext, } static GstCaps * -gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *subtitlecontext, - const gchar *codec_id, - gpointer data, - guint size) +gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size) { GstCaps *caps = NULL; @@ -2511,7 +2494,7 @@ gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *subtitleconte } static GstElementStateReturn -gst_matroska_demux_change_state (GstElement *element) +gst_matroska_demux_change_state (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); @@ -2530,10 +2513,8 @@ gst_matroska_demux_change_state (GstElement *element) } static void -gst_matroska_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaDemux *demux; @@ -2554,7 +2535,7 @@ gst_matroska_demux_get_property (GObject *object, } gboolean -gst_matroska_demux_plugin_init (GstPlugin *plugin) +gst_matroska_demux_plugin_init (GstPlugin * plugin) { gint i; GstCaps *videosrccaps, *audiosrccaps, *subtitlesrccaps, *temp; @@ -2572,30 +2553,25 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) NULL, }, *audio_id[] = { GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT, - GST_MATROSKA_CODEC_ID_AUDIO_AC3, - GST_MATROSKA_CODEC_ID_AUDIO_ACM, - GST_MATROSKA_CODEC_ID_AUDIO_VORBIS, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - /* TODO: AC3-9/10, Real, Musepack, Quicktime */ + GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2, + GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT, + GST_MATROSKA_CODEC_ID_AUDIO_AC3, + GST_MATROSKA_CODEC_ID_AUDIO_ACM, + GST_MATROSKA_CODEC_ID_AUDIO_VORBIS, + GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, + /* TODO: AC3-9/10, Real, Musepack, Quicktime */ + /* FILLME */ + NULL,}, *complex_id[] = { /* FILLME */ - NULL, - }, *complex_id[] = { - /* FILLME */ - NULL, - }, *subtitle_id[] = { + NULL,}, *subtitle_id[] = { /* FILLME */ - NULL, - }; + NULL,}; /* this filter needs the riff parser */ - if (!gst_library_load ("gstbytestream") || - !gst_library_load ("riff")) /* for fourcc stuff */ + if (!gst_library_load ("gstbytestream") || !gst_library_load ("riff")) /* for fourcc stuff */ return FALSE; /* video src template */ @@ -2609,9 +2585,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (videosrccaps, temp); } videosrctempl = gst_pad_template_new ("video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - videosrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, videosrccaps); audiosrccaps = gst_caps_new_empty (); /* audio src template */ @@ -2620,9 +2594,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (audiosrccaps, temp); } audiosrctempl = gst_pad_template_new ("audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - audiosrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, audiosrccaps); subtitlesrccaps = gst_caps_new_empty (); /* subtitle src template */ @@ -2631,13 +2603,11 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (subtitlesrccaps, temp); } subtitlesrctempl = gst_pad_template_new ("subtitle_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - subtitlesrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, subtitlesrccaps); /* create an elementfactory for the matroska_demux element */ if (!gst_element_register (plugin, "matroskademux", - GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) + GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) return FALSE; return TRUE; diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h index e393a52a..7d55a223 100644 --- a/gst/matroska/matroska-demux.h +++ b/gst/matroska/matroska-demux.h @@ -29,7 +29,6 @@ #include "matroska-ids.h" G_BEGIN_DECLS - #define GST_TYPE_MATROSKA_DEMUX \ (gst_matroska_demux_get_type ()) #define GST_MATROSKA_DEMUX(obj) \ @@ -40,71 +39,69 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX)) #define GST_IS_MATROSKA_DEMUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX)) - -#define GST_MATROSKA_DEMUX_MAX_STREAMS 64 - -typedef enum { +#define GST_MATROSKA_DEMUX_MAX_STREAMS 64 + typedef enum +{ GST_MATROSKA_DEMUX_STATE_START, GST_MATROSKA_DEMUX_STATE_HEADER, GST_MATROSKA_DEMUX_STATE_DATA } GstMatroskaDemuxState; -typedef struct _GstMatroskaDemuxIndex { - guint64 pos; /* of the corresponding *cluster*! */ - guint16 track; /* reference to 'num' */ - guint64 time; /* in nanoseconds */ +typedef struct _GstMatroskaDemuxIndex +{ + guint64 pos; /* of the corresponding *cluster*! */ + guint16 track; /* reference to 'num' */ + guint64 time; /* in nanoseconds */ } GstMatroskaDemuxIndex; -typedef struct _GstMatroskaDemux { - GstEbmlRead parent; +typedef struct _GstMatroskaDemux +{ + GstEbmlRead parent; /* pads */ - GstPad *sinkpad; + GstPad *sinkpad; GstMatroskaTrackContext *src[GST_MATROSKA_DEMUX_MAX_STREAMS]; - guint num_streams, - num_v_streams, num_a_streams, num_t_streams; - GstClock *clock; + guint num_streams, num_v_streams, num_a_streams, num_t_streams; + GstClock *clock; /* metadata */ - GstCaps *metadata; - GstCaps *streaminfo; - gchar *muxing_app, *writing_app; - gint64 created; + GstCaps *metadata; + GstCaps *streaminfo; + gchar *muxing_app, *writing_app; + gint64 created; /* state */ GstMatroskaDemuxState state; - guint level_up; + guint level_up; /* did we parse metadata/cues already? */ - gboolean metadata_parsed, - index_parsed; + gboolean metadata_parsed, index_parsed; /* start-of-segment */ - guint64 segment_start; + guint64 segment_start; /* a cue (index) table */ GstMatroskaIndex *index; - guint num_indexes; + guint num_indexes; /* timescale in the file */ - guint64 time_scale; + guint64 time_scale; /* length, position (time, ns) */ - guint64 duration, - pos; + guint64 duration, pos; /* a possible pending seek */ - guint64 seek_pending; + guint64 seek_pending; } GstMatroskaDemux; -typedef struct _GstMatroskaDemuxClass { +typedef struct _GstMatroskaDemuxClass +{ GstEbmlReadClass parent; } GstMatroskaDemuxClass; -GType gst_matroska_demux_get_type (void); +GType gst_matroska_demux_get_type (void); -gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin); +gboolean gst_matroska_demux_plugin_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_MATROSKA_DEMUX_H__ */ diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h index 64f25c0f..eb4fb315 100644 --- a/gst/matroska/matroska-ids.h +++ b/gst/matroska/matroska-ids.h @@ -148,25 +148,28 @@ * value to what it actually means). */ -typedef enum { - GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, - GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, - GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, - GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, +typedef enum +{ + GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, + GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, + GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, + GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11, - GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, + GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, } GstMatroskaTrackType; -typedef enum { - GST_MATROSKA_EYE_MODE_MONO = 0x0, +typedef enum +{ + GST_MATROSKA_EYE_MODE_MONO = 0x0, GST_MATROSKA_EYE_MODE_RIGHT = 0x1, - GST_MATROSKA_EYE_MODE_LEFT = 0x2, - GST_MATROSKA_EYE_MODE_BOTH = 0x3, + GST_MATROSKA_EYE_MODE_LEFT = 0x2, + GST_MATROSKA_EYE_MODE_BOTH = 0x3, } GstMatroskaEyeMode; -typedef enum { - GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, - GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, +typedef enum +{ + GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, + GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2, } GstMatroskaAspectRatioMode; @@ -175,64 +178,71 @@ typedef enum { * it's just something I use in the muxer/demuxer. */ -typedef enum { - GST_MATROSKA_TRACK_ENABLED = (1<<0), - GST_MATROSKA_TRACK_DEFAULT = (1<<1), - GST_MATROSKA_TRACK_LACING = (1<<2), - GST_MATROSKA_TRACK_SHIFT = (1<<16) +typedef enum +{ + GST_MATROSKA_TRACK_ENABLED = (1 << 0), + GST_MATROSKA_TRACK_DEFAULT = (1 << 1), + GST_MATROSKA_TRACK_LACING = (1 << 2), + GST_MATROSKA_TRACK_SHIFT = (1 << 16) } GstMatroskaTrackFlags; -typedef enum { - GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0) +typedef enum +{ + GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT << 0) } GstMatroskaVideoTrackFlags; -typedef struct _GstMatroskaTrackContext { - GstPad *pad; - GstCaps *caps; - guint index; +typedef struct _GstMatroskaTrackContext +{ + GstPad *pad; + GstCaps *caps; + guint index; /* some often-used info */ - gchar *codec_id, *codec_name, *name, *language; - gpointer codec_priv; - guint codec_priv_size; + gchar *codec_id, *codec_name, *name, *language; + gpointer codec_priv; + guint codec_priv_size; GstMatroskaTrackType type; - guint uid, num; + guint uid, num; GstMatroskaTrackFlags flags; - guint64 default_duration; + guint64 default_duration; } GstMatroskaTrackContext; -typedef struct _GstMatroskaTrackVideoContext { +typedef struct _GstMatroskaTrackVideoContext +{ GstMatroskaTrackContext parent; - guint pixel_width, pixel_height, - display_width, display_height; + guint pixel_width, pixel_height, display_width, display_height; GstMatroskaEyeMode eye_mode; GstMatroskaAspectRatioMode asr_mode; - guint32 fourcc; + guint32 fourcc; } GstMatroskaTrackVideoContext; -typedef struct _GstMatroskaTrackAudioContext { +typedef struct _GstMatroskaTrackAudioContext +{ GstMatroskaTrackContext parent; - guint samplerate, channels, bitdepth; + guint samplerate, channels, bitdepth; } GstMatroskaTrackAudioContext; -typedef struct _GstMatroskaTrackComplexContext { +typedef struct _GstMatroskaTrackComplexContext +{ GstMatroskaTrackContext parent; /* nothing special goes here, apparently */ } GstMatroskaTrackComplexContext; -typedef struct _GstMatroskaTrackSubtitleContext { +typedef struct _GstMatroskaTrackSubtitleContext +{ GstMatroskaTrackContext parent; /* or here... */ } GstMatroskaTrackSubtitleContext; -typedef struct _GstMatroskaIndex { - guint64 pos; /* of the corresponding *cluster*! */ - guint16 track; /* reference to 'num' */ - guint64 time; /* in nanoseconds */ +typedef struct _GstMatroskaIndex +{ + guint64 pos; /* of the corresponding *cluster*! */ + guint16 track; /* reference to 'num' */ + guint64 time; /* in nanoseconds */ } GstMatroskaIndex; #endif /* __GST_MATROSKA_IDS_H__ */ diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index a80be303..ebaff887 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -29,24 +29,24 @@ #include "matroska-mux.h" #include "matroska-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA, /* FILL ME */ }; -static GstStaticPadTemplate src_templ = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-matroska") -); +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska") + ); #define COMMON_VIDEO_CAPS \ "width = (int) [ 16, 4096 ], " \ @@ -54,28 +54,24 @@ GST_STATIC_PAD_TEMPLATE ( "framerate = (double) [ 0, MAX ]" static GstStaticPadTemplate videosink_templ = -GST_STATIC_PAD_TEMPLATE ( - "video_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "video/mpeg, " - "mpegversion = (int) { 1, 2, 4 }, " - "systemstream = (boolean) false, " - COMMON_VIDEO_CAPS "; " - "video/x-divx, " - COMMON_VIDEO_CAPS "; " - "video/x-xvid, " - COMMON_VIDEO_CAPS "; " - "video/x-msmpeg, " - COMMON_VIDEO_CAPS "; " - "video/x-jpeg, " - COMMON_VIDEO_CAPS "; " - "video/x-raw-yuv, " - "format = (fourcc) { YUY2, I420 }, " - COMMON_VIDEO_CAPS - ) -); + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) { 1, 2, 4 }, " + "systemstream = (boolean) false, " + COMMON_VIDEO_CAPS "; " + "video/x-divx, " + COMMON_VIDEO_CAPS "; " + "video/x-xvid, " + COMMON_VIDEO_CAPS "; " + "video/x-msmpeg, " + COMMON_VIDEO_CAPS "; " + "video/x-jpeg, " + COMMON_VIDEO_CAPS "; " + "video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420 }, " COMMON_VIDEO_CAPS) + ); #define COMMON_AUDIO_CAPS \ "channels = (int) [ 1, 8 ], " \ @@ -86,78 +82,68 @@ GST_STATIC_PAD_TEMPLATE ( * * audio/x-vorbis: private data setup needs work. */ static GstStaticPadTemplate audiosink_templ = -GST_STATIC_PAD_TEMPLATE ( - "audio_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - COMMON_AUDIO_CAPS "; " - "audio/mpeg, " - "mpegversion = (int) { 2, 4 }, " - COMMON_AUDIO_CAPS "; " - "audio/x-ac3, " - COMMON_AUDIO_CAPS "; " - "audio/x-raw-int, " - "width = (int) { 8, 16, 24 }, " - "depth = (int) { 8, 16, 24 }, " - "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " - "signed = (boolean) { true, false }, " - COMMON_AUDIO_CAPS - ) -); + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + COMMON_AUDIO_CAPS "; " + "audio/mpeg, " + "mpegversion = (int) { 2, 4 }, " + COMMON_AUDIO_CAPS "; " + "audio/x-ac3, " + COMMON_AUDIO_CAPS "; " + "audio/x-raw-int, " + "width = (int) { 8, 16, 24 }, " + "depth = (int) { 8, 16, 24 }, " + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " + "signed = (boolean) { true, false }, " COMMON_AUDIO_CAPS) + ); static GstStaticPadTemplate subtitlesink_templ = -GST_STATIC_PAD_TEMPLATE ( - "subtitle_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("subtitle_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS_ANY); /* gobject magic foo */ -static void gst_matroska_mux_base_init (GstMatroskaMuxClass *klass); -static void gst_matroska_mux_class_init (GstMatroskaMuxClass *klass); -static void gst_matroska_mux_init (GstMatroskaMux *mux); +static void gst_matroska_mux_base_init (GstMatroskaMuxClass * klass); +static void gst_matroska_mux_class_init (GstMatroskaMuxClass * klass); +static void gst_matroska_mux_init (GstMatroskaMux * mux); /* element functions */ -static void gst_matroska_mux_loop (GstElement *element); +static void gst_matroska_mux_loop (GstElement * element); /* pad functions */ -static GstPad * gst_matroska_mux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *name); +static GstPad *gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); /* gst internal change state handler */ static GstElementStateReturn - gst_matroska_mux_change_state (GstElement *element); +gst_matroska_mux_change_state (GstElement * element); /* gobject bla bla */ -static void gst_matroska_mux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_matroska_mux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); /* reset muxer */ -static void gst_matroska_mux_reset (GstElement *element); +static void gst_matroska_mux_reset (GstElement * element); static GstEbmlWriteClass *parent_class = NULL; + /*static guint gst_matroska_mux_signals[LAST_SIGNAL] = { 0 };*/ GType -gst_matroska_mux_get_type (void) +gst_matroska_mux_get_type (void) { static GType gst_matroska_mux_type = 0; if (!gst_matroska_mux_type) { static const GTypeInfo gst_matroska_mux_info = { - sizeof (GstMatroskaMuxClass), + sizeof (GstMatroskaMuxClass), (GBaseInitFunc) gst_matroska_mux_base_init, NULL, (GClassInitFunc) gst_matroska_mux_class_init, @@ -170,15 +156,14 @@ gst_matroska_mux_get_type (void) gst_matroska_mux_type = g_type_register_static (GST_TYPE_EBML_WRITE, - "GstMatroskaMmux", - &gst_matroska_mux_info, 0); + "GstMatroskaMmux", &gst_matroska_mux_info, 0); } return gst_matroska_mux_type; } static void -gst_matroska_mux_base_init (GstMatroskaMuxClass *klass) +gst_matroska_mux_base_init (GstMatroskaMuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); static GstElementDetails gst_matroska_mux_details = { @@ -189,19 +174,18 @@ gst_matroska_mux_base_init (GstMatroskaMuxClass *klass) }; gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&videosink_templ)); + gst_static_pad_template_get (&videosink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&audiosink_templ)); + gst_static_pad_template_get (&audiosink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&subtitlesink_templ)); + gst_static_pad_template_get (&subtitlesink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_templ)); - gst_element_class_set_details (element_class, - &gst_matroska_mux_details); + gst_static_pad_template_get (&src_templ)); + gst_element_class_set_details (element_class, &gst_matroska_mux_details); } static void -gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) +gst_matroska_mux_class_init (GstMatroskaMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -210,8 +194,8 @@ gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_METADATA, - g_param_spec_boxed ("metadata", "Metadata", "Metadata", - GST_TYPE_CAPS, G_PARAM_READWRITE)); + g_param_spec_boxed ("metadata", "Metadata", "Metadata", + GST_TYPE_CAPS, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_EBML_WRITE); @@ -222,19 +206,19 @@ gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) gstelement_class->request_new_pad = gst_matroska_mux_request_new_pad; } -static void -gst_matroska_mux_init (GstMatroskaMux *mux) +static void +gst_matroska_mux_init (GstMatroskaMux * mux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (mux); gint i; - mux->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "src"), "src"); + mux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); GST_EBML_WRITE (mux)->srcpad = mux->srcpad; - gst_element_set_loop_function (GST_ELEMENT (mux), - gst_matroska_mux_loop); + gst_element_set_loop_function (GST_ELEMENT (mux), gst_matroska_mux_loop); /* initial stream no. */ for (i = 0; i < GST_MATROSKA_MUX_MAX_STREAMS; i++) { @@ -248,7 +232,7 @@ gst_matroska_mux_init (GstMatroskaMux *mux) } static void -gst_matroska_mux_reset (GstElement *element) +gst_matroska_mux_reset (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); guint i; @@ -260,7 +244,7 @@ gst_matroska_mux_reset (GstElement *element) for (i = 0; i < GST_MATROSKA_MUX_MAX_STREAMS; i++) { if (mux->sink[i].track != NULL) { if (mux->sink[i].track->pad != NULL) { - gst_element_remove_pad (GST_ELEMENT (mux), mux->sink[i].track->pad); + gst_element_remove_pad (GST_ELEMENT (mux), mux->sink[i].track->pad); } g_free (mux->sink[i].track->codec_id); g_free (mux->sink[i].track->codec_name); @@ -284,8 +268,7 @@ gst_matroska_mux_reset (GstElement *element) /* reset media info (to default) */ gst_caps_replace (&mux->metadata, gst_caps_new_simple ("application/x-gst-metadata", - "application", G_TYPE_STRING, "", - "date", G_TYPE_STRING, "", NULL)); + "application", G_TYPE_STRING, "", "date", G_TYPE_STRING, "", NULL)); /* reset indexes */ mux->num_indexes = 0; @@ -298,7 +281,7 @@ gst_matroska_mux_reset (GstElement *element) } static GstPadLinkReturn -gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) +gst_matroska_mux_video_pad_link (GstPad * pad, const GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackVideoContext *videocontext; @@ -312,7 +295,7 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) /* find context */ for (i = 0; i < mux->num_streams; i++) { if (mux->sink[i].track && mux->sink[i].track->pad && - mux->sink[i].track->pad == pad) { + mux->sink[i].track->pad == pad) { context = mux->sink[i].track; break; } @@ -373,14 +356,14 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); + break; case 4: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP); + break; case 5: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); + break; } return GST_PAD_LINK_OK; @@ -394,14 +377,14 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); + break; case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); + break; case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); + break; } return GST_PAD_LINK_OK; @@ -415,8 +398,7 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_matroska_mux_audio_pad_link (GstPad *pad, - const GstCaps *caps) +gst_matroska_mux_audio_pad_link (GstPad * pad, const GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackAudioContext *audiocontext; @@ -428,7 +410,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, /* find context */ for (i = 0; i < mux->num_streams; i++) { if (mux->sink[i].track && mux->sink[i].track->pad && - mux->sink[i].track->pad == pad) { + mux->sink[i].track->pad == pad) { context = mux->sink[i].track; break; } @@ -453,31 +435,29 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { - case 1: { - gint layer; - - gst_structure_get_int (structure, "layer", &layer); - switch (layer) { - case 1: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); - break; - case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); - break; - case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); - break; - } - break; + case 1:{ + gint layer; + + gst_structure_get_int (structure, "layer", &layer); + switch (layer) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); + break; + case 3: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); + break; + } + break; } case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2 - "MAIN"); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2 "MAIN"); + break; case 4: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4 - "MAIN"); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4 "MAIN"); + break; } return GST_PAD_LINK_OK; @@ -490,7 +470,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, gst_structure_get_int (structure, "depth", &depth); gst_structure_get_int (structure, "signed", &signedness); if (width != depth || - (width == 8 && signedness) || (width == 16 && !signedness)) + (width == 8 && signedness) || (width == 16 && !signedness)) return GST_PAD_LINK_REFUSED; audiocontext->bitdepth = depth; @@ -514,8 +494,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, } static GstPadLinkReturn -gst_matroska_mux_subtitle_pad_link (GstPad *pad, - const GstCaps *caps) +gst_matroska_mux_subtitle_pad_link (GstPad * pad, const GstCaps * caps) { /* Consider this as boilerplate code for now. There is * no single subtitle creation element in GStreamer, @@ -525,9 +504,8 @@ gst_matroska_mux_subtitle_pad_link (GstPad *pad, } static GstPad * -gst_matroska_mux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *pad_name) +gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * pad_name) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -540,21 +518,21 @@ gst_matroska_mux_request_new_pad (GstElement *element, name = g_strdup_printf ("audio_%d", mux->num_a_streams++); linkfunc = gst_matroska_mux_audio_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackAudioContext, 1); + g_new0 (GstMatroskaTrackAudioContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_AUDIO; context->name = g_strdup ("Audio"); } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { name = g_strdup_printf ("video_%d", mux->num_v_streams++); linkfunc = gst_matroska_mux_video_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackVideoContext, 1); + g_new0 (GstMatroskaTrackVideoContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_VIDEO; context->name = g_strdup ("Video"); } else if (templ == gst_element_class_get_pad_template (klass, "subtitle_%d")) { name = g_strdup_printf ("subtitle_%d", mux->num_t_streams++); linkfunc = gst_matroska_mux_subtitle_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackSubtitleContext, 1); + g_new0 (GstMatroskaTrackSubtitleContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; context->name = g_strdup ("Subtitle"); } else { @@ -569,15 +547,14 @@ gst_matroska_mux_request_new_pad (GstElement *element, context->index = mux->num_streams++; mux->sink[context->index].track = context; context->pad = pad; - context->flags = GST_MATROSKA_TRACK_ENABLED | - GST_MATROSKA_TRACK_DEFAULT; - + context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT; + return pad; } static void -gst_matroska_mux_track_header (GstMatroskaMux *mux, - GstMatroskaTrackContext *context) +gst_matroska_mux_track_header (GstMatroskaMux * mux, + GstMatroskaTrackContext * context) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint64 master; @@ -588,53 +565,52 @@ gst_matroska_mux_track_header (GstMatroskaMux *mux, /* type-specific stuff */ switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; + (GstMatroskaTrackVideoContext *) context; /* framerate, but not in the video part */ gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKDEFAULTDURATION, - context->default_duration); + context->default_duration); - master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_TRACKVIDEO); + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKVIDEO); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELWIDTH, - videocontext->pixel_width); + videocontext->pixel_width); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELHEIGHT, - videocontext->pixel_height); + videocontext->pixel_height); if (videocontext->display_width && videocontext->display_height) { - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, - videocontext->display_width); - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, - videocontext->display_height); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, + videocontext->display_width); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, + videocontext->display_height); } if (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); if (videocontext->fourcc) { - guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); - gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, - (gpointer) &fcc_le, 4); + guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); + + gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, + (gpointer) & fcc_le, 4); } gst_ebml_write_master_finish (ebml, master); break; } - case GST_MATROSKA_TRACK_TYPE_AUDIO: { + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = - (GstMatroskaTrackAudioContext *) context; + (GstMatroskaTrackAudioContext *) context; - master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_TRACKAUDIO); + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKAUDIO); if (audiocontext->samplerate != 8000) - gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, - audiocontext->samplerate); + gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, + audiocontext->samplerate); if (audiocontext->channels != 1) - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, - audiocontext->channels); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, + audiocontext->channels); if (audiocontext->bitdepth) { - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, - audiocontext->bitdepth); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, + audiocontext->bitdepth); } gst_ebml_write_master_finish (ebml, master); @@ -646,31 +622,30 @@ gst_matroska_mux_track_header (GstMatroskaMux *mux, break; } - gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, - context->codec_id); + gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, context->codec_id); if (context->codec_priv) gst_ebml_write_binary (ebml, GST_MATROSKA_ID_CODECPRIVATE, - context->codec_priv, context->codec_priv_size); + context->codec_priv, context->codec_priv_size); /* FIXME: until we have a nice way of getting the codecname * out of the caps, I'm not going to enable this. Too much * (useless, double, boring) work... */ /*gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_CODECNAME, - context->codec_name);*/ - gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, - context->name); + context->codec_name); */ + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, context->name); } static void -gst_matroska_mux_start (GstMatroskaMux *mux) +gst_matroska_mux_start (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint32 seekhead_id[] = { GST_MATROSKA_ID_INFO, - GST_MATROSKA_ID_TRACKS, - GST_MATROSKA_ID_CUES, + GST_MATROSKA_ID_TRACKS, + GST_MATROSKA_ID_CUES, #if 0 - GST_MATROSKA_ID_TAGS, + GST_MATROSKA_ID_TAGS, #endif - 0 }; + 0 + }; guint64 master, child; gint i; guint tracknum = 1; @@ -679,7 +654,8 @@ gst_matroska_mux_start (GstMatroskaMux *mux) gst_ebml_write_header (ebml, "matroska", 1); /* start a segment */ - mux->segment_pos = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); + mux->segment_pos = + gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); mux->segment_master = ebml->pos; /* the rest of the header is cached */ @@ -704,18 +680,18 @@ gst_matroska_mux_start (GstMatroskaMux *mux) gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, 0); gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_MUXINGAPP, "GStreamer"); if (mux->metadata && - gst_structure_has_field (gst_caps_get_structure(mux->metadata,0), - "application")) { + gst_structure_has_field (gst_caps_get_structure (mux->metadata, 0), + "application")) { const gchar *app; - app = gst_structure_get_string (gst_caps_get_structure(mux->metadata, 0), - "application"); + app = gst_structure_get_string (gst_caps_get_structure (mux->metadata, 0), + "application"); if (app && app[0]) { gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_WRITINGAPP, app); } } /* FIXME: how do I get this? Automatic? Via tags? */ - /*gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, 0);*/ + /*gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, 0); */ gst_ebml_write_master_finish (ebml, master); /* tracks */ @@ -736,7 +712,7 @@ gst_matroska_mux_start (GstMatroskaMux *mux) } static void -gst_matroska_mux_finish (GstMatroskaMux *mux) +gst_matroska_mux_finish (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint64 pos; @@ -754,14 +730,14 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) GstMatroskaIndex *idx = &mux->index[n]; pointentry_master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_POINTENTRY); + GST_MATROSKA_ID_POINTENTRY); gst_ebml_write_date (ebml, GST_MATROSKA_ID_CUETIME, - idx->time / mux->time_scale); + idx->time / mux->time_scale); trackpos_master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_CUETRACKPOSITION); + GST_MATROSKA_ID_CUETRACKPOSITION); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETRACK, idx->track); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUECLUSTERPOSITION, - idx->pos - mux->segment_master); + idx->pos - mux->segment_master); gst_ebml_write_master_finish (ebml, trackpos_master); gst_ebml_write_master_finish (ebml, pointentry_master); } @@ -783,29 +759,30 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) * - all entries are local to the segment (so pos - segment_master). * - so each entry is at 12 + 20 + num * 28. */ gst_ebml_replace_uint (ebml, mux->seekhead_pos + 32, - mux->info_pos - mux->segment_master); + mux->info_pos - mux->segment_master); gst_ebml_replace_uint (ebml, mux->seekhead_pos + 60, - mux->tracks_pos - mux->segment_master); + mux->tracks_pos - mux->segment_master); if (mux->index != NULL) { gst_ebml_replace_uint (ebml, mux->seekhead_pos + 88, - mux->cues_pos - mux->segment_master); + mux->cues_pos - mux->segment_master); } else { /* void'ify */ guint64 my_pos = ebml->pos; + gst_ebml_write_seek (ebml, mux->seekhead_pos + 68); gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); gst_ebml_write_seek (ebml, my_pos); } #if 0 gst_ebml_replace_uint (ebml, mux->seekhead_pos + 116, - mux->tags_pos - mux->segment_master); + mux->tags_pos - mux->segment_master); #endif /* update duration */ pos = GST_EBML_WRITE (mux)->pos; gst_ebml_write_seek (ebml, mux->duration_pos); gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, - mux->duration / mux->time_scale); + mux->duration / mux->time_scale); gst_ebml_write_seek (ebml, pos); /* finish segment - this also writes element length */ @@ -813,30 +790,30 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) } static gint -gst_matroska_mux_prepare_data (GstMatroskaMux *mux) +gst_matroska_mux_prepare_data (GstMatroskaMux * mux) { gint i, first = -1; for (i = 0; i < mux->num_streams; i++) { while (!mux->sink[i].eos && !mux->sink[i].buffer && - mux->sink[i].track->num > 0 && - GST_PAD_IS_USABLE (mux->sink[i].track->pad)) { + mux->sink[i].track->num > 0 && + GST_PAD_IS_USABLE (mux->sink[i].track->pad)) { GstData *data; data = gst_pad_pull (mux->sink[i].track->pad); if (GST_IS_EVENT (data)) { - if (GST_EVENT_TYPE (GST_EVENT (data)) == GST_EVENT_EOS) - mux->sink[i].eos = TRUE; - gst_event_unref (GST_EVENT (data)); + if (GST_EVENT_TYPE (GST_EVENT (data)) == GST_EVENT_EOS) + mux->sink[i].eos = TRUE; + gst_event_unref (GST_EVENT (data)); } else { - mux->sink[i].buffer = GST_BUFFER (data); + mux->sink[i].buffer = GST_BUFFER (data); } } if (mux->sink[i].buffer) { if (first < 0 || GST_BUFFER_TIMESTAMP (mux->sink[i].buffer) < - GST_BUFFER_TIMESTAMP (mux->sink[first].buffer)) - first = i; + GST_BUFFER_TIMESTAMP (mux->sink[first].buffer)) + first = i; } } @@ -844,7 +821,7 @@ gst_matroska_mux_prepare_data (GstMatroskaMux *mux) } static void -gst_matroska_mux_write_data (GstMatroskaMux *mux) +gst_matroska_mux_write_data (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); GstBuffer *buf, *hdr; @@ -877,12 +854,12 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) if (mux->num_indexes % 32 == 0) { mux->index = g_renew (GstMatroskaIndex, mux->index, - mux->num_indexes + 32); + mux->num_indexes + 32); } idx = &mux->index[mux->num_indexes++]; - idx->pos = ebml->pos; - idx->time = GST_BUFFER_TIMESTAMP (buf); + idx->pos = ebml->pos; + idx->time = GST_BUFFER_TIMESTAMP (buf); idx->track = mux->sink[i].track->num; } @@ -891,15 +868,15 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) * FIXME: lacing, multiple frames/cluster, etc. */ cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, - GST_BUFFER_TIMESTAMP (buf) / mux->time_scale); + GST_BUFFER_TIMESTAMP (buf) / mux->time_scale); blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP); gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK, - GST_BUFFER_SIZE (buf) + 4); + GST_BUFFER_SIZE (buf) + 4); hdr = gst_buffer_new_and_alloc (4); /* track num - FIXME: what if num >= 0x80 (unlikely)? */ GST_BUFFER_DATA (hdr)[0] = mux->sink[i].track->num | 0x80; /* time relative to clustertime - we don't use this yet */ - * (guint16 *) &GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (0); + *(guint16 *) & GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (0); /* flags - no lacing (yet) */ GST_BUFFER_DATA (hdr)[3] = 0; gst_ebml_write_buffer (ebml, hdr); @@ -909,7 +886,7 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) } static void -gst_matroska_mux_loop (GstElement *element) +gst_matroska_mux_loop (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -925,7 +902,7 @@ gst_matroska_mux_loop (GstElement *element) } static GstElementStateReturn -gst_matroska_mux_change_state (GstElement *element) +gst_matroska_mux_change_state (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -944,10 +921,8 @@ gst_matroska_mux_change_state (GstElement *element) } static void -gst_matroska_mux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; @@ -956,8 +931,7 @@ gst_matroska_mux_set_property (GObject *object, switch (prop_id) { case ARG_METADATA: - gst_caps_replace (&mux->metadata, - g_value_get_boxed (value)); + gst_caps_replace (&mux->metadata, g_value_get_boxed (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -966,10 +940,8 @@ gst_matroska_mux_set_property (GObject *object, } static void -gst_matroska_mux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; @@ -987,9 +959,8 @@ gst_matroska_mux_get_property (GObject *object, } gboolean -gst_matroska_mux_plugin_init (GstPlugin *plugin) +gst_matroska_mux_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "matroskamux", - GST_RANK_NONE, - GST_TYPE_MATROSKA_MUX); + GST_RANK_NONE, GST_TYPE_MATROSKA_MUX); } diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h index 119237c9..ab018688 100644 --- a/gst/matroska/matroska-mux.h +++ b/gst/matroska/matroska-mux.h @@ -28,7 +28,6 @@ #include "matroska-ids.h" G_BEGIN_DECLS - #define GST_TYPE_MATROSKA_MUX \ (gst_matroska_mux_get_type ()) #define GST_MATROSKA_MUX(obj) \ @@ -39,65 +38,61 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_MUX)) #define GST_IS_MATROSKA_MUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_MUX)) - #define GST_MATROSKA_MUX_MAX_STREAMS 64 - -typedef enum { + typedef enum +{ GST_MATROSKA_MUX_STATE_START, GST_MATROSKA_MUX_STATE_HEADER, GST_MATROSKA_MUX_STATE_DATA, } GstMatroskaMuxState; -typedef struct _GstMatroskaMux { - GstEbmlWrite parent; +typedef struct _GstMatroskaMux +{ + GstEbmlWrite parent; /* pads */ - GstPad *srcpad; - struct { + GstPad *srcpad; + struct + { GstMatroskaTrackContext *track; - GstBuffer *buffer; - gboolean eos; + GstBuffer *buffer; + gboolean eos; } sink[GST_MATROSKA_MUX_MAX_STREAMS]; - guint num_streams, - num_v_streams, num_a_streams, num_t_streams; + guint num_streams, num_v_streams, num_a_streams, num_t_streams; /* metadata - includes writing_app and creation_time */ - GstCaps *metadata; + GstCaps *metadata; /* state */ GstMatroskaMuxState state; /* a cue (index) table */ GstMatroskaIndex *index; - guint num_indexes; + guint num_indexes; /* timescale in the file */ - guint64 time_scale; + guint64 time_scale; /* length, position (time, ns) */ - guint64 duration; + guint64 duration; /* byte-positions of master-elements (for replacing contents) */ - guint64 segment_pos, - seekhead_pos, - cues_pos, + guint64 segment_pos, seekhead_pos, cues_pos, #if 0 - tags_pos, + tags_pos, #endif - info_pos, - tracks_pos, - duration_pos; - guint64 segment_master; + info_pos, tracks_pos, duration_pos; + guint64 segment_master; } GstMatroskaMux; -typedef struct _GstMatroskaMuxClass { +typedef struct _GstMatroskaMuxClass +{ GstEbmlWriteClass parent; } GstMatroskaMuxClass; -GType gst_matroska_mux_get_type (void); +GType gst_matroska_mux_get_type (void); -gboolean gst_matroska_mux_plugin_init (GstPlugin *plugin); +gboolean gst_matroska_mux_plugin_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_MATROSKA_MUX_H__ */ diff --git a/gst/matroska/matroska.c b/gst/matroska/matroska.c index 49657818..67b5f267 100644 --- a/gst/matroska/matroska.c +++ b/gst/matroska/matroska.c @@ -27,20 +27,14 @@ #include "matroska-mux.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return (gst_matroska_demux_plugin_init (plugin) && - gst_matroska_mux_plugin_init (plugin)); + gst_matroska_mux_plugin_init (plugin)); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "matroska", - "Matroska stream handling", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "matroska", + "Matroska stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/median/gstmedian.c b/gst/median/gstmedian.c index c30b8ce3..9ce8430a 100644 --- a/gst/median/gstmedian.c +++ b/gst/median/gstmedian.c @@ -32,49 +32,53 @@ static GstElementDetails median_details = { "Wim Taymans " }; -static GstStaticPadTemplate median_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +static GstStaticPadTemplate median_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate median_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); /* Median signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_ACTIVE, ARG_FILTERSIZE, ARG_LUM_ONLY }; -static GType gst_median_get_type (void); -static void gst_median_class_init (GstMedianClass *klass); -static void gst_median_base_init (GstMedianClass *klass); -static void gst_median_init (GstMedian *median); +static GType gst_median_get_type (void); +static void gst_median_class_init (GstMedianClass * klass); +static void gst_median_base_init (GstMedianClass * klass); +static void gst_median_init (GstMedian * median); -static void median_5 (unsigned char *src, unsigned char *dest, int height, int width); -static void median_9 (unsigned char *src, unsigned char *dest, int height, int width); -static void gst_median_chain (GstPad *pad, GstData *_data); +static void median_5 (unsigned char *src, unsigned char *dest, int height, + int width); +static void median_9 (unsigned char *src, unsigned char *dest, int height, + int width); +static void gst_median_chain (GstPad * pad, GstData * _data); -static void gst_median_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_median_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_median_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_median_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_median_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -84,60 +88,55 @@ gst_median_get_type (void) if (!median_type) { static const GTypeInfo median_info = { - sizeof(GstMedianClass), - (GBaseInitFunc)gst_median_base_init, + sizeof (GstMedianClass), + (GBaseInitFunc) gst_median_base_init, NULL, - (GClassInitFunc)gst_median_class_init, + (GClassInitFunc) gst_median_class_init, NULL, NULL, - sizeof(GstMedian), + sizeof (GstMedian), 0, - (GInstanceInitFunc)gst_median_init, + (GInstanceInitFunc) gst_median_init, }; - median_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMedian", &median_info, 0); + median_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMedian", &median_info, 0); } return median_type; } static void -gst_median_base_init (GstMedianClass *klass) +gst_median_base_init (GstMedianClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&median_sink_factory)); + gst_static_pad_template_get (&median_sink_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&median_src_factory)); + gst_static_pad_template_get (&median_src_factory)); gst_element_class_set_details (element_class, &median_details); } static void -gst_median_class_init (GstMedianClass *klass) +gst_median_class_init (GstMedianClass * 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); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_ACTIVE, - g_param_spec_boolean("active","active","active", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FILTERSIZE, - g_param_spec_int("filtersize","filtersize","filtersize", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_LUM_ONLY, - g_param_spec_boolean("lum_only","lum_only","lum_only", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACTIVE, g_param_spec_boolean ("active", "active", "active", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FILTERSIZE, g_param_spec_int ("filtersize", "filtersize", "filtersize", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LUM_ONLY, g_param_spec_boolean ("lum_only", "lum_only", "lum_only", TRUE, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_median_set_property; gobject_class->get_property = gst_median_get_property; } static gboolean -gst_median_link (GstPad *pad, const GstCaps *caps) +gst_median_link (GstPad * pad, const GstCaps * caps) { GstMedian *filter = GST_MEDIAN (gst_pad_get_parent (pad)); GstPad *otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; @@ -157,17 +156,20 @@ gst_median_link (GstPad *pad, const GstCaps *caps) return ret; } -void gst_median_init (GstMedian *median) +void +gst_median_init (GstMedian * median) { - median->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&median_sink_factory), "sink"); + median->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&median_sink_factory), "sink"); gst_pad_set_getcaps_function (median->sinkpad, gst_pad_proxy_getcaps); gst_pad_set_link_function (median->sinkpad, gst_median_link); gst_pad_set_chain_function (median->sinkpad, gst_median_chain); gst_element_add_pad (GST_ELEMENT (median), median->sinkpad); - median->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&median_src_factory), "src"); + median->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&median_src_factory), "src"); gst_pad_set_getcaps_function (median->srcpad, gst_pad_proxy_getcaps); gst_pad_set_link_function (median->sinkpad, gst_median_link); gst_element_add_pad (GST_ELEMENT (median), median->srcpad); @@ -192,7 +194,7 @@ median_5 (unsigned char *src, unsigned char *dest, int width, int height) nLastRow = height - 1; /*copy the top and bottom rows into the result array */ - for (i=0; iactive) { - gst_pad_push(median->srcpad,GST_DATA (buf)); + gst_pad_push (median->srcpad, GST_DATA (buf)); return; } - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - GST_DEBUG ("median: have buffer of %d", GST_BUFFER_SIZE(buf)); + GST_DEBUG ("median: have buffer of %d", GST_BUFFER_SIZE (buf)); - outbuf = gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = g_malloc(GST_BUFFER_SIZE(buf)); - GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (buf)); + GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf); lumsize = median->width * median->height; - chromsize = lumsize/4; + chromsize = lumsize / 4; if (median->filtersize == 5) { - median_5(data, GST_BUFFER_DATA(outbuf), median->width, median->height); + median_5 (data, GST_BUFFER_DATA (outbuf), median->width, median->height); if (!median->lum_only) { - median_5(data+lumsize, GST_BUFFER_DATA(outbuf)+lumsize, median->width/2, median->height/2); - median_5(data+lumsize+chromsize, GST_BUFFER_DATA(outbuf)+lumsize+chromsize, median->width/2, median->height/2); + median_5 (data + lumsize, GST_BUFFER_DATA (outbuf) + lumsize, + median->width / 2, median->height / 2); + median_5 (data + lumsize + chromsize, + GST_BUFFER_DATA (outbuf) + lumsize + chromsize, median->width / 2, + median->height / 2); + } else { + memcpy (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, + chromsize * 2); } - else { - memcpy (GST_BUFFER_DATA (outbuf)+lumsize, data+lumsize, chromsize*2); - } - } - else { - median_9(data, GST_BUFFER_DATA(outbuf), median->width, median->height); + } else { + median_9 (data, GST_BUFFER_DATA (outbuf), median->width, median->height); if (!median->lum_only) { - median_9(data+lumsize, GST_BUFFER_DATA(outbuf)+lumsize, median->width/2, median->height/2); - median_9(data+lumsize+chromsize, GST_BUFFER_DATA(outbuf)+lumsize+chromsize, median->width/2, median->height/2); - } - else { - memcpy (GST_BUFFER_DATA (outbuf)+lumsize, data+lumsize, chromsize*2); + median_9 (data + lumsize, GST_BUFFER_DATA (outbuf) + lumsize, + median->width / 2, median->height / 2); + median_9 (data + lumsize + chromsize, + GST_BUFFER_DATA (outbuf) + lumsize + chromsize, median->width / 2, + median->height / 2); + } else { + memcpy (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, + chromsize * 2); } } GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - gst_buffer_unref(buf); + gst_buffer_unref (buf); - gst_pad_push(median->srcpad,GST_DATA (outbuf)); + gst_pad_push (median->srcpad, GST_DATA (outbuf)); } static void -gst_median_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_median_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstMedian *median; gint argvalue; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MEDIAN(object)); - median = GST_MEDIAN(object); + g_return_if_fail (GST_IS_MEDIAN (object)); + median = GST_MEDIAN (object); switch (prop_id) { case ARG_FILTERSIZE: argvalue = g_value_get_int (value); if (argvalue != 5 && argvalue != 9) { - g_warning ("median: invalid filtersize (%d), must be 5 or 9\n", argvalue); - } - else { + g_warning ("median: invalid filtersize (%d), must be 5 or 9\n", + argvalue); + } else { median->filtersize = argvalue; } break; @@ -369,13 +394,14 @@ gst_median_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_median_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_median_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMedian *median; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MEDIAN(object)); - median = GST_MEDIAN(object); + g_return_if_fail (GST_IS_MEDIAN (object)); + median = GST_MEDIAN (object); switch (prop_id) { case ARG_FILTERSIZE: @@ -395,20 +421,14 @@ gst_median_get_property (GObject *object, guint prop_id, GValue *value, GParamSp static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "median", - GST_RANK_NONE, GST_TYPE_MEDIAN); + GST_RANK_NONE, GST_TYPE_MEDIAN); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "median", - "Video median filter", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "median", + "Video median filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/median/gstmedian.h b/gst/median/gstmedian.h index c22b80d1..5e558bae 100644 --- a/gst/median/gstmedian.h +++ b/gst/median/gstmedian.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MEDIAN \ @@ -41,31 +42,33 @@ extern "C" { #define GST_IS_MEDIAN_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MEDIAN)) -typedef struct _GstMedian GstMedian; -typedef struct _GstMedianClass GstMedianClass; + typedef struct _GstMedian GstMedian; + typedef struct _GstMedianClass GstMedianClass; -struct _GstMedian { - GstElement element; + struct _GstMedian + { + GstElement element; - int format; - int width; - int height; + int format; + int width; + int height; - int filtersize; + int filtersize; - gboolean active; - gboolean lum_only; + gboolean active; + gboolean lum_only; - GstPad *sinkpad,*srcpad; -}; + GstPad *sinkpad, *srcpad; + }; -struct _GstMedianClass { - GstElementClass parent_class; -}; + struct _GstMedianClass + { + GstElementClass parent_class; + }; #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_MEDIAN_H__ */ +#endif /* __GST_MEDIAN_H__ */ diff --git a/gst/monoscope/convolve.c b/gst/monoscope/convolve.c index b707621b..6b8cdd50 100644 --- a/gst/monoscope/convolve.c +++ b/gst/monoscope/convolve.c @@ -62,19 +62,28 @@ #include #include "convolve.h" -typedef union stack_entry_s { - struct {const double * left, * right; double * out;} v; - struct {double * main, * null;} b; +typedef union stack_entry_s +{ + struct + { + const double *left, *right; + double *out; + } v; + struct + { + double *main, *null; + } b; } stack_entry; #define STACK_SIZE (CONVOLVE_DEPTH * 3) -struct _struct_convolve_state { - double left [CONVOLVE_BIG]; - double right [CONVOLVE_SMALL * 3]; - double scratch [CONVOLVE_SMALL * 3]; - stack_entry stack[STACK_SIZE]; +struct _struct_convolve_state +{ + double left[CONVOLVE_BIG]; + double right[CONVOLVE_SMALL * 3]; + double scratch[CONVOLVE_SMALL * 3]; + stack_entry stack[STACK_SIZE]; }; /* @@ -83,48 +92,53 @@ struct _struct_convolve_state { * On error, returns NULL. * The pointer should be freed when it is finished with, by convolve_close(). */ -convolve_state *convolve_init(void) +convolve_state * +convolve_init (void) { - return (convolve_state *) malloc (sizeof(convolve_state)); + return (convolve_state *) malloc (sizeof (convolve_state)); } /* * Free the state allocated with convolve_init(). */ -void convolve_close(convolve_state *state) +void +convolve_close (convolve_state * state) { - if (state) - free(state); + if (state) + free (state); } -static void convolve_4 (double * out, const double * left, const double * right) +static void +convolve_4 (double *out, const double *left, const double *right) /* This does a 4x4 -> 7 convolution. For what it's worth, the slightly odd * ordering gives about a 1% speed up on my Pentium II. */ { - double l0, l1, l2, l3, r0, r1, r2, r3; - double a; - l0 = left[0]; - r0 = right[0]; - a = l0 * r0; - l1 = left[1]; - r1 = right[1]; - out[0] = a; - a = (l0 * r1) + (l1 * r0); - l2 = left[2]; - r2 = right[2]; - out[1] = a; - a = (l0 * r2) + (l1 * r1) + (l2 * r0); - l3 = left[3]; - r3 = right[3]; - out[2] = a; - - out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0); - out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1); - out[5] = (l2 * r3) + (l3 * r2); - out[6] = l3 * r3; + double l0, l1, l2, l3, r0, r1, r2, r3; + double a; + + l0 = left[0]; + r0 = right[0]; + a = l0 * r0; + l1 = left[1]; + r1 = right[1]; + out[0] = a; + a = (l0 * r1) + (l1 * r0); + l2 = left[2]; + r2 = right[2]; + out[1] = a; + a = (l0 * r2) + (l1 * r1) + (l2 * r0); + l3 = left[3]; + r3 = right[3]; + out[2] = a; + + out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0); + out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1); + out[5] = (l2 * r3) + (l3 * r2); + out[6] = l3 * r3; } -static void convolve_run (stack_entry * top, unsigned size, double * scratch) +static void +convolve_run (stack_entry * top, unsigned size, double *scratch) /* Interpret a stack of commands. The stack starts with two entries; the * convolution to do, and an illegal entry used to mark the stack top. The * size is the number of entries in each input, and must be a power of 2, @@ -132,102 +146,105 @@ static void convolve_run (stack_entry * top, unsigned size, double * scratch) * scratch must have length 3*size. The number of stack entries needed is * 3n-4 where size=2^n. */ { - do { - const double * left; - const double * right; - double * out; - - /* When we get here, the stack top is always a convolve, - * with size > 4. So we will split it. We repeatedly split - * the top entry until we get to size = 4. */ - - left = top->v.left; - right = top->v.right; - out = top->v.out; - top++; - - do { - double * s_left, * s_right; - int i; - - /* Halve the size. */ - size >>= 1; - - /* Allocate the scratch areas. */ - s_left = scratch + size * 3; - /* s_right is a length 2*size buffer also used for - * intermediate output. */ - s_right = scratch + size * 4; - - /* Create the intermediate factors. */ - for (i = 0; i < size; i++) { - double l = left[i] + left[i + size]; - double r = right[i] + right[i + size]; - s_left[i + size] = r; - s_left[i] = l; - } - - /* Push the combine entry onto the stack. */ - top -= 3; - top[2].b.main = out; - top[2].b.null = NULL; - - /* Push the low entry onto the stack. This must be - * the last of the three sub-convolutions, because - * it may overwrite the arguments. */ - top[1].v.left = left; - top[1].v.right = right; - top[1].v.out = out; - - /* Push the mid entry onto the stack. */ - top[0].v.left = s_left; - top[0].v.right = s_right; - top[0].v.out = s_right; - - /* Leave the high entry in variables. */ - left += size; - right += size; - out += size * 2; - - } while (size > 4); - - /* When we get here, the stack top is a group of 3 - * convolves, with size = 4, followed by some combines. */ - convolve_4 (out, left, right); - convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right); - convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right); - top += 2; - - /* Now process combines. */ - do { - /* b.main is the output buffer, mid is the middle - * part which needs to be adjusted in place, and - * then folded back into the output. We do this in - * a slightly strange way, so as to avoid having - * two loops. */ - double * out = top->b.main; - double * mid = scratch + size * 4; - unsigned int i; - top++; - out[size * 2 - 1] = 0; - for (i = 0; i < size-1; i++) { - double lo; - double hi; - lo = mid[0] - (out[0] + out[2 * size]) + out[size]; - hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size]; - out[size] = lo; - out[2 * size] = hi; - out++; - mid++; - } - size <<= 1; - } while (top->b.null == NULL); - } while (top->b.main != NULL); + do { + const double *left; + const double *right; + double *out; + + /* When we get here, the stack top is always a convolve, + * with size > 4. So we will split it. We repeatedly split + * the top entry until we get to size = 4. */ + + left = top->v.left; + right = top->v.right; + out = top->v.out; + top++; + + do { + double *s_left, *s_right; + int i; + + /* Halve the size. */ + size >>= 1; + + /* Allocate the scratch areas. */ + s_left = scratch + size * 3; + /* s_right is a length 2*size buffer also used for + * intermediate output. */ + s_right = scratch + size * 4; + + /* Create the intermediate factors. */ + for (i = 0; i < size; i++) { + double l = left[i] + left[i + size]; + double r = right[i] + right[i + size]; + + s_left[i + size] = r; + s_left[i] = l; + } + + /* Push the combine entry onto the stack. */ + top -= 3; + top[2].b.main = out; + top[2].b.null = NULL; + + /* Push the low entry onto the stack. This must be + * the last of the three sub-convolutions, because + * it may overwrite the arguments. */ + top[1].v.left = left; + top[1].v.right = right; + top[1].v.out = out; + + /* Push the mid entry onto the stack. */ + top[0].v.left = s_left; + top[0].v.right = s_right; + top[0].v.out = s_right; + + /* Leave the high entry in variables. */ + left += size; + right += size; + out += size * 2; + + } while (size > 4); + + /* When we get here, the stack top is a group of 3 + * convolves, with size = 4, followed by some combines. */ + convolve_4 (out, left, right); + convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right); + convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right); + top += 2; + + /* Now process combines. */ + do { + /* b.main is the output buffer, mid is the middle + * part which needs to be adjusted in place, and + * then folded back into the output. We do this in + * a slightly strange way, so as to avoid having + * two loops. */ + double *out = top->b.main; + double *mid = scratch + size * 4; + unsigned int i; + + top++; + out[size * 2 - 1] = 0; + for (i = 0; i < size - 1; i++) { + double lo; + double hi; + + lo = mid[0] - (out[0] + out[2 * size]) + out[size]; + hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size]; + out[size] = lo; + out[2 * size] = hi; + out++; + mid++; + } + size <<= 1; + } while (top->b.null == NULL); + } while (top->b.main != NULL); } -int convolve_match (const int * lastchoice, - const short * input, - convolve_state * state) +int +convolve_match (const int *lastchoice, + const short *input, convolve_state * state) /* lastchoice is a 256 sized array. input is a 512 array. We find the * contiguous length 256 sub-array of input that best matches lastchoice. * A measure of how good a sub-array is compared with the lastchoice is @@ -236,85 +253,90 @@ int convolve_match (const int * lastchoice, * entry in the convolutions. state is a (non-NULL) pointer returned by * convolve_init. */ { - double avg; - double best; - int p = 0; - int i; - double * left = state->left; - double * right = state->right; - double * scratch = state->scratch; - stack_entry * top = state->stack + STACK_SIZE - 1; + double avg; + double best; + int p = 0; + int i; + double *left = state->left; + double *right = state->right; + double *scratch = state->scratch; + stack_entry *top = state->stack + STACK_SIZE - 1; + #if 1 - for (i = 0; i < 512; i++) - left[i] = input[i]; - - avg = 0; - for (i = 0; i < 256; i++) { - double a = lastchoice[255 - i]; - right[i] = a; - avg += a; - } + for (i = 0; i < 512; i++) + left[i] = input[i]; + + avg = 0; + for (i = 0; i < 256; i++) { + double a = lastchoice[255 - i]; + + right[i] = a; + avg += a; + } #endif - /* We adjust the smaller of the two input arrays to have average - * value 0. This makes the eventual result insensitive to both - * constant offsets and positive multipliers of the inputs. */ - avg /= 256; - for (i = 0; i < 256; i++) - right[i] -= avg; - /* End-of-stack marker. */ -#if 0 /* The following line produces a CRASH, need to figure out why?!! */ - top[1].b.null = scratch; -#endif - top[1].b.main = NULL; - /* The low 256x256, of which we want the high 256 outputs. */ - top->v.left = left; - top->v.right = right; - top->v.out = right + 256; - convolve_run (top, 256, scratch); - - /* The high 256x256, of which we want the low 256 outputs. */ - top->v.left = left + 256; - top->v.right = right; - top->v.out = right; - convolve_run (top, 256, scratch); - - /* Now find the best position amoungs this. Apart from the first - * and last, the required convolution outputs are formed by adding - * outputs from the two convolutions above. */ - best = right[511]; - right[767] = 0; - p = -1; - for (i = 0; i < 256; i++) { - double a = right[i] + right[i + 512]; - if (a > best) { - best = a; - p = i; - } - } - p++; - + /* We adjust the smaller of the two input arrays to have average + * value 0. This makes the eventual result insensitive to both + * constant offsets and positive multipliers of the inputs. */ + avg /= 256; + for (i = 0; i < 256; i++) + right[i] -= avg; + /* End-of-stack marker. */ +#if 0 /* The following line produces a CRASH, need to figure out why?!! */ + top[1].b.null = scratch; +#endif + top[1].b.main = NULL; + /* The low 256x256, of which we want the high 256 outputs. */ + top->v.left = left; + top->v.right = right; + top->v.out = right + 256; + convolve_run (top, 256, scratch); + + /* The high 256x256, of which we want the low 256 outputs. */ + top->v.left = left + 256; + top->v.right = right; + top->v.out = right; + convolve_run (top, 256, scratch); + + /* Now find the best position amoungs this. Apart from the first + * and last, the required convolution outputs are formed by adding + * outputs from the two convolutions above. */ + best = right[511]; + right[767] = 0; + p = -1; + for (i = 0; i < 256; i++) { + double a = right[i] + right[i + 512]; + + if (a > best) { + best = a; + p = i; + } + } + p++; + #if 0 - { - /* This is some debugging code... */ - int bad = 0; - best = 0; - for (i = 0; i < 256; i++) - best += ((double) input[i+p]) * ((double) lastchoice[i] - avg); - - for (i = 0; i < 257; i++) { - double tot = 0; - unsigned int j; - for (j = 0; j < 256; j++) - tot += ((double) input[i+j]) * ((double) lastchoice[j] - avg); - if (tot > best) - printf ("(%i)", i); - if (tot != left[i + 255]) - printf ("!"); - } - - printf ("%i\n", p); - } -#endif - - return p; + { + /* This is some debugging code... */ + int bad = 0; + + best = 0; + for (i = 0; i < 256; i++) + best += ((double) input[i + p]) * ((double) lastchoice[i] - avg); + + for (i = 0; i < 257; i++) { + double tot = 0; + unsigned int j; + + for (j = 0; j < 256; j++) + tot += ((double) input[i + j]) * ((double) lastchoice[j] - avg); + if (tot > best) + printf ("(%i)", i); + if (tot != left[i + 255]) + printf ("!"); + } + + printf ("%i\n", p); + } +#endif + + return p; } diff --git a/gst/monoscope/convolve.h b/gst/monoscope/convolve.h index d9709edc..d5f34d2b 100644 --- a/gst/monoscope/convolve.h +++ b/gst/monoscope/convolve.h @@ -21,7 +21,8 @@ #define CONVOLVE_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif /* convolve_match takes two blocks, one twice the size of the other. The @@ -31,14 +32,13 @@ extern "C" { #define CONVOLVE_BIG (CONVOLVE_SMALL * 2) /* Convolution stuff */ -typedef struct _struct_convolve_state convolve_state; + typedef struct _struct_convolve_state convolve_state; -convolve_state *convolve_init (void); -void convolve_close (convolve_state * state); + convolve_state *convolve_init (void); + void convolve_close (convolve_state * state); -int convolve_match (const int * lastchoice, - const short int * input, - convolve_state * state); + int convolve_match (const int *lastchoice, + const short int *input, convolve_state * state); #ifdef __cplusplus } diff --git a/gst/monoscope/gstmonoscope.c b/gst/monoscope/gstmonoscope.c index d3157d97..f8e82b2f 100644 --- a/gst/monoscope/gstmonoscope.c +++ b/gst/monoscope/gstmonoscope.c @@ -35,11 +35,12 @@ typedef struct _GstMonoscope GstMonoscope; typedef struct _GstMonoscopeClass GstMonoscopeClass; -struct _GstMonoscope { +struct _GstMonoscope +{ GstElement element; /* pads */ - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* the timestamp of the next frame */ guint64 next_time; @@ -52,14 +53,15 @@ struct _GstMonoscope { gboolean first_buffer; /* visualisation state */ - struct monoscope_state * visstate; + struct monoscope_state *visstate; }; -struct _GstMonoscopeClass { +struct _GstMonoscopeClass +{ GstElementClass parent_class; }; -GType gst_monoscope_get_type(void); +GType gst_monoscope_get_type (void); /* elementfactory information */ @@ -71,41 +73,39 @@ static GstElementDetails gst_monoscope_details = { }; /* signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) -); +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); -static GstStaticPadTemplate sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) -); +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + ); -static void gst_monoscope_class_init (GstMonoscopeClass *klass); -static void gst_monoscope_base_init (GstMonoscopeClass *klass); -static void gst_monoscope_init (GstMonoscope *monoscope); +static void gst_monoscope_class_init (GstMonoscopeClass * klass); +static void gst_monoscope_base_init (GstMonoscopeClass * klass); +static void gst_monoscope_init (GstMonoscope * monoscope); -static void gst_monoscope_chain (GstPad *pad, GstData *_data); +static void gst_monoscope_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_monoscope_srcconnect (GstPad *pad, const GstCaps *caps); +gst_monoscope_srcconnect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; @@ -116,9 +116,9 @@ gst_monoscope_get_type (void) if (!type) { static const GTypeInfo info = { - sizeof (GstMonoscopeClass), - (GBaseInitFunc) gst_monoscope_base_init, - NULL, + sizeof (GstMonoscopeClass), + (GBaseInitFunc) gst_monoscope_base_init, + NULL, (GClassInitFunc) gst_monoscope_class_init, NULL, NULL, @@ -132,37 +132,39 @@ gst_monoscope_get_type (void) } static void -gst_monoscope_base_init (GstMonoscopeClass *klass) +gst_monoscope_base_init (GstMonoscopeClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_template)); + gst_static_pad_template_get (&src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_template)); + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details (element_class, &gst_monoscope_details); } static void -gst_monoscope_class_init(GstMonoscopeClass *klass) +gst_monoscope_class_init (GstMonoscopeClass * 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); } static void -gst_monoscope_init (GstMonoscope *monoscope) +gst_monoscope_init (GstMonoscope * monoscope) { /* create the sink and src pads */ - monoscope->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_template ), "sink"); - monoscope->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_template ), "src"); + monoscope->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_template), + "sink"); + monoscope->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_template), + "src"); gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->sinkpad); gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->srcpad); @@ -175,11 +177,11 @@ gst_monoscope_init (GstMonoscope *monoscope) monoscope->first_buffer = TRUE; monoscope->width = 256; monoscope->height = 128; - monoscope->fps = 25.; /* desired frame rate */ + monoscope->fps = 25.; /* desired frame rate */ } static GstPadLinkReturn -gst_monoscope_srcconnect (GstPad *pad, const GstCaps *caps) +gst_monoscope_srcconnect (GstPad * pad, const GstCaps * caps) { GstMonoscope *monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad)); GstStructure *structure; @@ -194,7 +196,7 @@ gst_monoscope_srcconnect (GstPad *pad, const GstCaps *caps) } static void -gst_monoscope_chain (GstPad *pad, GstData *_data) +gst_monoscope_chain (GstPad * pad, GstData * _data) { GstBuffer *bufin = GST_BUFFER (_data); GstMonoscope *monoscope; @@ -213,25 +215,26 @@ gst_monoscope_chain (GstPad *pad, GstData *_data) /* FIXME: should really select the first 1024 samples after the timestamp. */ if (GST_BUFFER_TIMESTAMP (bufin) < monoscope->next_time || samples_in < 1024) { - GST_DEBUG ("timestamp is %" G_GUINT64_FORMAT ": want >= %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP (bufin), monoscope->next_time); + GST_DEBUG ("timestamp is %" G_GUINT64_FORMAT ": want >= %" G_GUINT64_FORMAT, + GST_BUFFER_TIMESTAMP (bufin), monoscope->next_time); gst_buffer_unref (bufin); return; } data = (gint16 *) GST_BUFFER_DATA (bufin); /* FIXME: Select samples in a better way. */ - for (i=0; i < 512; i++) { + for (i = 0; i < 512; i++) { monoscope->datain[i] = *data++; } if (monoscope->first_buffer) { monoscope->visstate = monoscope_init (monoscope->width, monoscope->height); - g_assert(monoscope->visstate != 0); + g_assert (monoscope->visstate != 0); GST_DEBUG ("making new pad"); if (!gst_pad_is_negotiated (monoscope->srcpad)) { if (gst_pad_renegotiate (monoscope->srcpad) <= 0) { - GST_ELEMENT_ERROR (monoscope, CORE, NEGOTIATION, (NULL), (NULL)); - return; + GST_ELEMENT_ERROR (monoscope, CORE, NEGOTIATION, (NULL), (NULL)); + return; } } monoscope->first_buffer = FALSE; @@ -239,7 +242,8 @@ gst_monoscope_chain (GstPad *pad, GstData *_data) bufout = gst_buffer_new (); GST_BUFFER_SIZE (bufout) = monoscope->width * monoscope->height * 4; - GST_BUFFER_DATA (bufout) = (guchar *) monoscope_update (monoscope->visstate, monoscope->datain); + GST_BUFFER_DATA (bufout) = + (guchar *) monoscope_update (monoscope->visstate, monoscope->datain); GST_BUFFER_TIMESTAMP (bufout) = monoscope->next_time; GST_BUFFER_FLAG_SET (bufout, GST_BUFFER_DONTFREE); @@ -254,20 +258,14 @@ gst_monoscope_chain (GstPad *pad, GstData *_data) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "monoscope", - GST_RANK_NONE, GST_TYPE_MONOSCOPE); + return gst_element_register (plugin, "monoscope", + GST_RANK_NONE, GST_TYPE_MONOSCOPE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "monoscope", - "Monoscope visualization", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "monoscope", + "Monoscope visualization", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/monoscope/monoscope.c b/gst/monoscope/monoscope.c index eb0e728a..20a68099 100644 --- a/gst/monoscope/monoscope.c +++ b/gst/monoscope/monoscope.c @@ -29,110 +29,114 @@ #include #include -static void colors_init(guint32 * colors) +static void +colors_init (guint32 * colors) { - int i; - for (i = 0; i < 32; i++) { - colors[i] = (i*8 << 16) + (255 << 8); - colors[i+31] = (255 << 16) + (((31 - i) * 8) << 8); - } - colors[63] = (40 << 16) + (75 << 8); + int i; + + for (i = 0; i < 32; i++) { + colors[i] = (i * 8 << 16) + (255 << 8); + colors[i + 31] = (255 << 16) + (((31 - i) * 8) << 8); + } + colors[63] = (40 << 16) + (75 << 8); } -struct monoscope_state * monoscope_init (guint32 resx, guint32 resy) +struct monoscope_state * +monoscope_init (guint32 resx, guint32 resy) { - struct monoscope_state * stateptr; - stateptr = calloc(1, sizeof(struct monoscope_state)); - if (stateptr == 0) return 0; - stateptr->cstate = convolve_init(); - colors_init(stateptr->colors); - return stateptr; + struct monoscope_state *stateptr; + stateptr = calloc (1, sizeof (struct monoscope_state)); + if (stateptr == 0) + return 0; + stateptr->cstate = convolve_init (); + colors_init (stateptr->colors); + return stateptr; } -guint32 * monoscope_update (struct monoscope_state * stateptr, - gint16 data [512]) +guint32 * +monoscope_update (struct monoscope_state * stateptr, gint16 data[512]) { - /* Note that CONVOLVE_BIG must == data size here, ie 512. */ - /* Really, we want samples evenly spread over the available data. - * Just taking a continuous chunk will do for now, though. */ - int i; - int foo; - int bar; - int h; - guint32 *loc; + /* Note that CONVOLVE_BIG must == data size here, ie 512. */ + /* Really, we want samples evenly spread over the available data. + * Just taking a continuous chunk will do for now, though. */ + int i; + int foo; + int bar; + int h; + guint32 *loc; - int factor; - int val; - int max = 1; - short * thisEq; + int factor; + int val; + int max = 1; + short *thisEq; - memcpy (stateptr->copyEq, data, sizeof (short) * CONVOLVE_BIG); - thisEq = stateptr->copyEq; -#if 1 - val = convolve_match (stateptr->avgEq, stateptr->copyEq, stateptr->cstate); - thisEq += val; -#endif - memset(stateptr->display, 0, 256 * 128 * sizeof(guint32)); - for (i=0; i < 256; i++) { - foo = thisEq[i] + (stateptr->avgEq[i] >> 1); - stateptr->avgEq[i] = foo; - if (foo < 0) - foo = -foo; - if (foo > max) - max = foo; + memcpy (stateptr->copyEq, data, sizeof (short) * CONVOLVE_BIG); + thisEq = stateptr->copyEq; +#if 1 + val = convolve_match (stateptr->avgEq, stateptr->copyEq, stateptr->cstate); + thisEq += val; +#endif + memset (stateptr->display, 0, 256 * 128 * sizeof (guint32)); + for (i = 0; i < 256; i++) { + foo = thisEq[i] + (stateptr->avgEq[i] >> 1); + stateptr->avgEq[i] = foo; + if (foo < 0) + foo = -foo; + if (foo > max) + max = foo; + } + stateptr->avgMax += max - (stateptr->avgMax >> 8); + if (stateptr->avgMax < max) + stateptr->avgMax = max; /* Avoid overflow */ + factor = 0x7fffffff / stateptr->avgMax; + /* Keep the scaling sensible. */ + if (factor > (1 << 18)) + factor = 1 << 18; + if (factor < (1 << 8)) + factor = 1 << 8; + for (i = 0; i < 256; i++) { + foo = stateptr->avgEq[i] * factor; + foo >>= 18; + if (foo > 63) + foo = 63; + if (foo < -64) + foo = -64; + val = (i + ((foo + 64) << 8)); + bar = val; + if ((bar > 0) && (bar < (256 * 128))) { + loc = stateptr->display + bar; + if (foo < 0) { + for (h = 0; h <= (-foo); h++) { + *loc = stateptr->colors[h]; + loc += 256; } - stateptr->avgMax += max - (stateptr->avgMax >> 8); - if (stateptr->avgMax < max) - stateptr->avgMax = max; /* Avoid overflow */ - factor = 0x7fffffff / stateptr->avgMax; - /* Keep the scaling sensible. */ - if (factor > (1 << 18)) - factor = 1 << 18; - if (factor < (1 << 8)) - factor = 1 << 8; - for (i=0; i < 256; i++) { - foo = stateptr->avgEq[i] * factor; - foo >>= 18; - if (foo > 63) - foo = 63; - if (foo < -64) - foo = -64; - val = (i + ((foo+64) << 8)); - bar = val; - if ((bar > 0) && (bar < (256 * 128))) { - loc = stateptr->display + bar; - if (foo < 0) { - for (h = 0; h <= (-foo); h++) { - *loc = stateptr->colors[h]; - loc+=256; - } - } else { - for (h = 0; h <= foo; h++) { - *loc = stateptr->colors[h]; - loc-=256; - } - } - } + } else { + for (h = 0; h <= foo; h++) { + *loc = stateptr->colors[h]; + loc -= 256; } + } + } + } - /* Draw grid. */ - for (i=16;i < 128; i+=16) { - for (h = 0; h < 256; h+=2) { - stateptr->display[(i << 8) + h] = stateptr->colors[63]; - if (i == 64) - stateptr->display[(i << 8) + h + 1] = stateptr->colors[63]; - } - } - for (i = 16; i < 256; i+=16) { - for (h = 0; h < 128; h+=2) { - stateptr->display[i + (h << 8)] = stateptr->colors[63]; - } - } + /* Draw grid. */ + for (i = 16; i < 128; i += 16) { + for (h = 0; h < 256; h += 2) { + stateptr->display[(i << 8) + h] = stateptr->colors[63]; + if (i == 64) + stateptr->display[(i << 8) + h + 1] = stateptr->colors[63]; + } + } + for (i = 16; i < 256; i += 16) { + for (h = 0; h < 128; h += 2) { + stateptr->display[i + (h << 8)] = stateptr->colors[63]; + } + } - return stateptr->display; + return stateptr->display; } -void monoscope_close (struct monoscope_state * stateptr) +void +monoscope_close (struct monoscope_state *stateptr) { } - diff --git a/gst/monoscope/monoscope.h b/gst/monoscope/monoscope.h index 8e7d7591..37be6fff 100644 --- a/gst/monoscope/monoscope.h +++ b/gst/monoscope/monoscope.h @@ -7,18 +7,19 @@ #define scope_width 256 #define scope_height 128 -struct monoscope_state { - gint16 copyEq[CONVOLVE_BIG]; - int avgEq[CONVOLVE_SMALL]; /* a running average of the last few. */ - int avgMax; /* running average of max sample. */ - guint32 display[(scope_width + 1) * (scope_height + 1)]; +struct monoscope_state +{ + gint16 copyEq[CONVOLVE_BIG]; + int avgEq[CONVOLVE_SMALL]; /* a running average of the last few. */ + int avgMax; /* running average of max sample. */ + guint32 display[(scope_width + 1) * (scope_height + 1)]; - convolve_state *cstate; - guint32 colors[64]; + convolve_state *cstate; + guint32 colors[64]; }; -struct monoscope_state * monoscope_init (guint32 resx, guint32 resy); -guint32 * monoscope_update (struct monoscope_state * stateptr, gint16 data [512]); -void monoscope_close (struct monoscope_state * stateptr); +struct monoscope_state *monoscope_init (guint32 resx, guint32 resy); +guint32 *monoscope_update (struct monoscope_state *stateptr, gint16 data[512]); +void monoscope_close (struct monoscope_state *stateptr); #endif diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 4826821b..f7914e24 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -41,22 +41,26 @@ GST_DEBUG_CATEGORY_EXTERN (qtdemux_debug); typedef struct _QtNode QtNode; typedef struct _QtNodeType QtNodeType; typedef struct _QtDemuxSample QtDemuxSample; + //typedef struct _QtDemuxStream QtDemuxStream; -struct _QtNode { +struct _QtNode +{ guint32 type; gpointer data; int len; }; -struct _QtNodeType { +struct _QtNodeType +{ guint32 fourcc; char *name; int flags; - void (*dump)(GstQTDemux *qtdemux, void *buffer, int depth); + void (*dump) (GstQTDemux * qtdemux, void *buffer, int depth); }; -struct _QtDemuxSample { +struct _QtDemuxSample +{ int sample_index; int chunk; int size; @@ -65,7 +69,8 @@ struct _QtDemuxSample { guint64 duration; }; -struct _QtDemuxStream { +struct _QtDemuxStream +{ guint32 subtype; GstCaps *caps; GstPad *pad; @@ -78,14 +83,15 @@ struct _QtDemuxStream { int width; int height; float fps; - + double rate; int n_channels; guint bytes_per_frame; guint samples_per_packet; }; -enum QtDemuxState { +enum QtDemuxState +{ QTDEMUX_STATE_NULL, QTDEMUX_STATE_HEADER, QTDEMUX_STATE_HEADER_SEEKING, @@ -95,85 +101,87 @@ enum QtDemuxState { QTDEMUX_STATE_EOS, }; -static GNode *qtdemux_tree_get_child_by_type(GNode *node, guint32 fourcc); -static GNode *qtdemux_tree_get_sibling_by_type(GNode *node, guint32 fourcc); +static GNode *qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc); +static GNode *qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc); -static GstElementDetails -gst_qtdemux_details = -{ +static GstElementDetails gst_qtdemux_details = { "QuickTime Demuxer", "Codec/Demuxer", "Demultiplex a QuickTime file into audio and video streams", "David Schleef " }; -enum { +enum +{ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; static GstStaticPadTemplate gst_qtdemux_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS ("video/quicktime") -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("video/quicktime") + ); static GstStaticPadTemplate gst_qtdemux_videosrc_template = -GST_STATIC_PAD_TEMPLATE ( - "audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("audio_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_qtdemux_audiosrc_template = -GST_STATIC_PAD_TEMPLATE ( - "video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("video_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); static GstElementClass *parent_class = NULL; -static void gst_qtdemux_class_init (GstQTDemuxClass *klass); -static void gst_qtdemux_base_init (GstQTDemuxClass *klass); -static void gst_qtdemux_init (GstQTDemux *quicktime_demux); -static GstElementStateReturn gst_qtdemux_change_state(GstElement *element); -static void gst_qtdemux_loop_header (GstElement *element); -static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux); - -static void qtdemux_parse_moov(GstQTDemux *qtdemux, void *buffer, int length); -static void qtdemux_parse(GstQTDemux *qtdemux, GNode *node, void *buffer, int length); -static QtNodeType *qtdemux_type_get(guint32 fourcc); -static void qtdemux_node_dump(GstQTDemux *qtdemux, GNode *node); -static void qtdemux_parse_tree(GstQTDemux *qtdemux); -static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *stsd_data); -static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data); - -static GType gst_qtdemux_get_type (void) +static void gst_qtdemux_class_init (GstQTDemuxClass * klass); +static void gst_qtdemux_base_init (GstQTDemuxClass * klass); +static void gst_qtdemux_init (GstQTDemux * quicktime_demux); +static GstElementStateReturn gst_qtdemux_change_state (GstElement * element); +static void gst_qtdemux_loop_header (GstElement * element); +static gboolean gst_qtdemux_handle_sink_event (GstQTDemux * qtdemux); + +static void qtdemux_parse_moov (GstQTDemux * qtdemux, void *buffer, int length); +static void qtdemux_parse (GstQTDemux * qtdemux, GNode * node, void *buffer, + int length); +static QtNodeType *qtdemux_type_get (guint32 fourcc); +static void qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node); +static void qtdemux_parse_tree (GstQTDemux * qtdemux); +static GstCaps *qtdemux_video_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * stsd_data); +static GstCaps *qtdemux_audio_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * data); + +static GType +gst_qtdemux_get_type (void) { static GType qtdemux_type = 0; if (!qtdemux_type) { static const GTypeInfo qtdemux_info = { - sizeof(GstQTDemuxClass), - (GBaseInitFunc)gst_qtdemux_base_init, NULL, - (GClassInitFunc)gst_qtdemux_class_init, - NULL, NULL, sizeof(GstQTDemux), 0, - (GInstanceInitFunc)gst_qtdemux_init, + sizeof (GstQTDemuxClass), + (GBaseInitFunc) gst_qtdemux_base_init, NULL, + (GClassInitFunc) gst_qtdemux_class_init, + NULL, NULL, sizeof (GstQTDemux), 0, + (GInstanceInitFunc) gst_qtdemux_init, }; - qtdemux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstQTDemux", &qtdemux_info, 0); + qtdemux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstQTDemux", &qtdemux_info, + 0); } return qtdemux_type; } -static void gst_qtdemux_base_init (GstQTDemuxClass *klass) +static void +gst_qtdemux_base_init (GstQTDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -187,31 +195,33 @@ static void gst_qtdemux_base_init (GstQTDemuxClass *klass) } -static void gst_qtdemux_class_init (GstQTDemuxClass *klass) +static void +gst_qtdemux_class_init (GstQTDemuxClass * 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); gstelement_class->change_state = gst_qtdemux_change_state; } -static void -gst_qtdemux_init (GstQTDemux *qtdemux) +static void +gst_qtdemux_init (GstQTDemux * qtdemux) { - qtdemux->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_qtdemux_sink_template), "sink"); + qtdemux->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_sink_template), "sink"); gst_element_set_loop_function (GST_ELEMENT (qtdemux), gst_qtdemux_loop_header); gst_element_add_pad (GST_ELEMENT (qtdemux), qtdemux->sinkpad); } static const GstFormat * -gst_qtdemux_get_src_formats (GstPad *pad) +gst_qtdemux_get_src_formats (GstPad * pad) { static const GstFormat src_a_formats[] = { GST_FORMAT_TIME, @@ -224,55 +234,55 @@ gst_qtdemux_get_src_formats (GstPad *pad) GST_FORMAT_DEFAULT, 0 }; - QtDemuxStream *stream = gst_pad_get_element_private(pad); + QtDemuxStream *stream = gst_pad_get_element_private (pad); - return (stream->subtype == GST_MAKE_FOURCC('v','i','d','e')) ? - src_v_formats : src_a_formats; + return (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) ? + src_v_formats : src_a_formats; } static gboolean -gst_qtdemux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_qtdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; - QtDemuxStream *stream = gst_pad_get_element_private(pad); + QtDemuxStream *stream = gst_pad_get_element_private (pad); - if (stream->subtype == GST_MAKE_FOURCC('v','i','d','e') && + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e') && (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES)) return FALSE; switch (src_format) { case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_BYTES: - *dest_value = src_value * 1; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_BYTES: + *dest_value = src_value * 1; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_TIME: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_TIME: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; default: @@ -283,7 +293,7 @@ gst_qtdemux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value, } static const GstQueryType * -gst_qtdemux_get_src_query_types (GstPad *pad) +gst_qtdemux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -295,54 +305,55 @@ gst_qtdemux_get_src_query_types (GstPad *pad) } static const GstEventMask * -gst_qtdemux_get_event_mask (GstPad *pad) +gst_qtdemux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT }, - { 0, } + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, + {0,} }; return masks; } static gboolean -gst_qtdemux_handle_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value) +gst_qtdemux_handle_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value) { gboolean res = TRUE; + //QtDemuxStream *stream = gst_pad_get_element_private(pad); switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_TIME: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_BYTES: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *value = 0; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_BYTES: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *value = 0; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_TIME: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_BYTES: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *value = 0; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_BYTES: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *value = 0; /* FIXME */ + break; + default: + res = FALSE; + break; } break; default: @@ -354,9 +365,10 @@ gst_qtdemux_handle_src_query (GstPad *pad, GstQueryType type, } static gboolean -gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) +gst_qtdemux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; + //QtDemuxStream *stream = gst_pad_get_element_private(pad); switch (GST_EVENT_TYPE (event)) { @@ -364,19 +376,19 @@ gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) GST_DEBUG ("seek format %d", GST_EVENT_SEEK_FORMAT (event)); switch (GST_EVENT_SEEK_FORMAT (event)) { - case GST_FORMAT_BYTES: - case GST_FORMAT_DEFAULT: - case GST_FORMAT_TIME: - { - gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); - - GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); - - res = FALSE; - } - default: - res = FALSE; - break; + case GST_FORMAT_BYTES: + case GST_FORMAT_DEFAULT: + case GST_FORMAT_TIME: + { + gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); + + GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); + + res = FALSE; + } + default: + res = FALSE; + break; } default: res = FALSE; @@ -393,7 +405,7 @@ gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) GST_DEBUG_CATEGORY (qtdemux_debug); static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (qtdemux_debug, "qtdemux", 0, "qtdemux plugin"); @@ -404,36 +416,30 @@ plugin_init (GstPlugin *plugin) return FALSE; return gst_element_register (plugin, "qtdemux", - GST_RANK_PRIMARY, GST_TYPE_QTDEMUX); + GST_RANK_PRIMARY, GST_TYPE_QTDEMUX); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "qtdemux", - "Quicktime stream demuxer", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) - -static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "qtdemux", + "Quicktime stream demuxer", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) + + static gboolean gst_qtdemux_handle_sink_event (GstQTDemux * qtdemux) { guint32 remaining; GstEvent *event; GstEventType type; - gst_bytestream_get_status(qtdemux->bs, &remaining, &event); + gst_bytestream_get_status (qtdemux->bs, &remaining, &event); - type = event ? GST_EVENT_TYPE(event) : GST_EVENT_UNKNOWN; + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; GST_DEBUG ("qtdemux: event %p %d", event, type); - switch(type){ + switch (type) { case GST_EVENT_EOS: - gst_bytestream_flush(qtdemux->bs, remaining); - gst_pad_event_default(qtdemux->sinkpad, event); + gst_bytestream_flush (qtdemux->bs, remaining); + gst_pad_event_default (qtdemux->sinkpad, event); return FALSE; case GST_EVENT_FLUSH: //g_warning("flush event"); @@ -443,23 +449,24 @@ static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux) //gst_bytestream_flush_fast(qtdemux->bs, remaining); break; default: - g_warning("unhandled event %d",type); + g_warning ("unhandled event %d", type); break; } - gst_event_unref(event); + gst_event_unref (event); return TRUE; } -static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) +static GstElementStateReturn +gst_qtdemux_change_state (GstElement * element) { - GstQTDemux *qtdemux = GST_QTDEMUX(element); + GstQTDemux *qtdemux = GST_QTDEMUX (element); - switch(GST_STATE_TRANSITION(element)){ + switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: break; case GST_STATE_READY_TO_PAUSED: - qtdemux->bs = gst_bytestream_new(qtdemux->sinkpad); + qtdemux->bs = gst_bytestream_new (qtdemux->sinkpad); qtdemux->state = QTDEMUX_STATE_HEADER; /* FIXME */ break; @@ -468,7 +475,7 @@ static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) case GST_STATE_PLAYING_TO_PAUSED: break; case GST_STATE_PAUSED_TO_READY: - gst_bytestream_destroy(qtdemux->bs); + gst_bytestream_destroy (qtdemux->bs); break; case GST_STATE_READY_TO_NULL: break; @@ -476,12 +483,13 @@ static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) break; } - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + return GST_ELEMENT_CLASS (parent_class)->change_state (element); } -static void gst_qtdemux_loop_header (GstElement *element) +static void +gst_qtdemux_loop_header (GstElement * element) { - GstQTDemux *qtdemux = GST_QTDEMUX(element); + GstQTDemux *qtdemux = GST_QTDEMUX (element); guint8 *data; guint32 length; guint32 fourcc; @@ -493,220 +501,230 @@ static void gst_qtdemux_loop_header (GstElement *element) /* FIXME _tell gets the offset wrong */ //cur_offset = gst_bytestream_tell(qtdemux->bs); - + cur_offset = qtdemux->offset; - GST_DEBUG ("loop at position %d",cur_offset); - - switch(qtdemux->state){ - case QTDEMUX_STATE_HEADER: - { - do{ - ret = gst_bytestream_peek_bytes(qtdemux->bs, &data, 16); - if(ret<16){ - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + GST_DEBUG ("loop at position %d", cur_offset); + + switch (qtdemux->state) { + case QTDEMUX_STATE_HEADER: + { + do { + ret = gst_bytestream_peek_bytes (qtdemux->bs, &data, 16); + if (ret < 16) { + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; } - }else{ - break; + } while (1); + + length = GUINT32_FROM_BE (*(guint32 *) data); + GST_DEBUG ("length %08x", length); + fourcc = GUINT32_FROM_LE (*(guint32 *) (data + 4)); + GST_DEBUG ("fourcc " GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); + + if (length == 0) { + length = gst_bytestream_length (qtdemux->bs) - cur_offset; } - }while(1); + if (length == 1) { + guint32 length1, length2; - length = GUINT32_FROM_BE(*(guint32 *)data); - GST_DEBUG ("length %08x",length); - fourcc = GUINT32_FROM_LE(*(guint32 *)(data+4)); - GST_DEBUG ("fourcc " GST_FOURCC_FORMAT, GST_FOURCC_ARGS(fourcc)); + length1 = GUINT32_FROM_BE (*(guint32 *) (data + 8)); + GST_DEBUG ("length1 %08x", length1); + length2 = GUINT32_FROM_BE (*(guint32 *) (data + 12)); + GST_DEBUG ("length2 %08x", length2); - if(length==0){ - length = gst_bytestream_length(qtdemux->bs) - cur_offset; - } - if(length==1){ - guint32 length1, length2; - - length1 = GUINT32_FROM_BE(*(guint32 *)(data+8)); - GST_DEBUG ("length1 %08x",length1); - length2 = GUINT32_FROM_BE(*(guint32 *)(data+12)); - GST_DEBUG ("length2 %08x",length2); - - length=length2; - } - - switch(fourcc){ - case GST_MAKE_FOURCC('m','d','a','t'): - case GST_MAKE_FOURCC('f','r','e','e'): - case GST_MAKE_FOURCC('w','i','d','e'): - case GST_MAKE_FOURCC('P','I','C','T'): - case GST_MAKE_FOURCC('p','n','o','t'): - break; - case GST_MAKE_FOURCC('m','o','o','v'): - { - GstBuffer *moov; - - do{ - ret = gst_bytestream_read(qtdemux->bs, &moov, length); - if(ret < length){ - GST_DEBUG ("read failed (%d < %d)",ret,length); - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + length = length2; + } + + switch (fourcc) { + case GST_MAKE_FOURCC ('m', 'd', 'a', 't'): + case GST_MAKE_FOURCC ('f', 'r', 'e', 'e'): + case GST_MAKE_FOURCC ('w', 'i', 'd', 'e'): + case GST_MAKE_FOURCC ('P', 'I', 'C', 'T'): + case GST_MAKE_FOURCC ('p', 'n', 'o', 't'): + break; + case GST_MAKE_FOURCC ('m', 'o', 'o', 'v'): + { + GstBuffer *moov; + + do { + ret = gst_bytestream_read (qtdemux->bs, &moov, length); + if (ret < length) { + GST_DEBUG ("read failed (%d < %d)", ret, length); + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; } - }else{ - break; + } while (1); + + qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); + if (1) + qtdemux_node_dump (qtdemux, qtdemux->moov_node); + qtdemux_parse_tree (qtdemux); + qtdemux->state = QTDEMUX_STATE_MOVIE; + break; + } + default: + { + GST_LOG ("unknown %08x '" GST_FOURCC_FORMAT "' at %d\n", + fourcc, GST_FOURCC_ARGS (fourcc), cur_offset); + break; + } + } + ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length, + GST_SEEK_METHOD_SET); + qtdemux->offset = cur_offset + length; + GST_DEBUG ("seek returned %d\n", ret); + break; + } + case QTDEMUX_STATE_SEEKING_EOS: + { + guint8 *data; + + do { + ret = gst_bytestream_peek_bytes (qtdemux->bs, &data, 1); + if (ret < 1) { + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; } - }while(1); + } else { + break; + } + } while (TRUE); + gst_element_set_eos (element); - qtdemux_parse_moov(qtdemux, GST_BUFFER_DATA(moov), length); - if(1)qtdemux_node_dump(qtdemux, qtdemux->moov_node); - qtdemux_parse_tree(qtdemux); - qtdemux->state = QTDEMUX_STATE_MOVIE; - break; - } - default: - { - GST_LOG("unknown %08x '" GST_FOURCC_FORMAT "' at %d\n", - fourcc, GST_FOURCC_ARGS(fourcc), cur_offset); - break; - } + qtdemux->state = QTDEMUX_STATE_EOS; + return; } - ret = gst_bytestream_seek(qtdemux->bs, cur_offset + length, - GST_SEEK_METHOD_SET); - qtdemux->offset = cur_offset + length; - GST_DEBUG ("seek returned %d\n",ret); - break; - } - case QTDEMUX_STATE_SEEKING_EOS: - { - guint8 *data; - - do{ - ret = gst_bytestream_peek_bytes(qtdemux->bs, &data, 1); - if(ret<1){ - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; - } - }else{ - break; + case QTDEMUX_STATE_EOS: + g_warning ("spinning in EOS\n"); + return; + case QTDEMUX_STATE_MOVIE: + { + QtDemuxStream *stream; + guint64 min_time; + int index = -1; + int i; + + min_time = G_MAXUINT64; + for (i = 0; i < qtdemux->n_streams; i++) { + stream = qtdemux->streams[i]; + + if (stream->sample_index < stream->n_samples && + stream->samples[stream->sample_index].timestamp < min_time) { + min_time = stream->samples[stream->sample_index].timestamp; + index = i; + } } - }while(TRUE); - gst_element_set_eos(element); - qtdemux->state = QTDEMUX_STATE_EOS; - return; - } - case QTDEMUX_STATE_EOS: - g_warning("spinning in EOS\n"); - return; - case QTDEMUX_STATE_MOVIE: - { - QtDemuxStream *stream; - guint64 min_time; - int index = -1; - int i; - - min_time = G_MAXUINT64; - for(i=0;in_streams;i++){ - stream = qtdemux->streams[i]; - - if(stream->sample_index < stream->n_samples && - stream->samples[stream->sample_index].timestamp < min_time){ - min_time = stream->samples[stream->sample_index].timestamp; - index = i; - } - } + if (index == -1) { + for (i = 0; i < qtdemux->n_streams; i++) { + gst_pad_push (qtdemux->streams[i]->pad, + GST_DATA (gst_event_new (GST_EVENT_EOS))); + } + ret = gst_bytestream_seek (qtdemux->bs, 0, GST_SEEK_METHOD_END); + GST_DEBUG ("seek returned %d", ret); - if(index==-1){ - for(i=0;in_streams;i++){ - gst_pad_push(qtdemux->streams[i]->pad, - GST_DATA(gst_event_new (GST_EVENT_EOS))); + qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; + return; } - ret = gst_bytestream_seek(qtdemux->bs, 0, GST_SEEK_METHOD_END); - GST_DEBUG ("seek returned %d",ret); - - qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; - return; - } - stream = qtdemux->streams[index]; + stream = qtdemux->streams[index]; - offset = stream->samples[stream->sample_index].offset; - size = stream->samples[stream->sample_index].size; + offset = stream->samples[stream->sample_index].offset; + size = stream->samples[stream->sample_index].size; - GST_INFO ("pushing from stream %d, sample_index=%d offset=%d size=%d timestamp=%lld", - index, stream->sample_index, offset, size, - stream->samples[stream->sample_index].timestamp); + GST_INFO + ("pushing from stream %d, sample_index=%d offset=%d size=%d timestamp=%lld", + index, stream->sample_index, offset, size, + stream->samples[stream->sample_index].timestamp); - cur_offset = gst_bytestream_tell(qtdemux->bs); - if(offset != cur_offset){ - GST_DEBUG ("seeking to offset %d",offset); - GST_LOG ("seeking to offset %d\n",offset); - ret = gst_bytestream_seek(qtdemux->bs, offset, GST_SEEK_METHOD_SET); - GST_DEBUG ("seek returned %d",ret); - return; - } + cur_offset = gst_bytestream_tell (qtdemux->bs); + if (offset != cur_offset) { + GST_DEBUG ("seeking to offset %d", offset); + GST_LOG ("seeking to offset %d\n", offset); + ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET); + GST_DEBUG ("seek returned %d", ret); + return; + } - GST_DEBUG ("reading %d bytes\n",size); - buf = NULL; - do{ - ret = gst_bytestream_read(qtdemux->bs, &buf, size); - if(ret < size){ - GST_DEBUG ("read failed (%d < %d)",ret,size); - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + GST_DEBUG ("reading %d bytes\n", size); + buf = NULL; + do { + ret = gst_bytestream_read (qtdemux->bs, &buf, size); + if (ret < size) { + GST_DEBUG ("read failed (%d < %d)", ret, size); + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; + } + } while (TRUE); + + if (buf) { + /* hum... */ + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) { + float fps = + 1. * GST_SECOND / stream->samples[stream->sample_index].duration; + if (fps != stream->fps) { + gst_caps_set_simple (stream->caps, "framerate", G_TYPE_DOUBLE, fps, + NULL); + stream->fps = fps; + gst_pad_set_explicit_caps (stream->pad, stream->caps); + } } - }else{ - break; - } - }while(TRUE); - - if(buf){ - /* hum... */ - if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){ - float fps = 1. * GST_SECOND / stream->samples[stream->sample_index].duration; - if (fps != stream->fps) { - gst_caps_set_simple (stream->caps, "framerate", G_TYPE_DOUBLE, fps, - NULL); - stream->fps = fps; - gst_pad_set_explicit_caps(stream->pad, stream->caps); - } - } - GST_BUFFER_TIMESTAMP(buf) = stream->samples[stream->sample_index].timestamp; - GST_BUFFER_DURATION(buf) = stream->samples[stream->sample_index].duration; - gst_pad_push(stream->pad, GST_DATA (buf)); + GST_BUFFER_TIMESTAMP (buf) = + stream->samples[stream->sample_index].timestamp; + GST_BUFFER_DURATION (buf) = + stream->samples[stream->sample_index].duration; + gst_pad_push (stream->pad, GST_DATA (buf)); - GST_DEBUG ("pushing buffer on %" GST_PTR_FORMAT, stream->pad); + GST_DEBUG ("pushing buffer on %" GST_PTR_FORMAT, stream->pad); + } + stream->sample_index++; + break; } - stream->sample_index++; - break; - } - default: - /* unreached */ - g_assert(0); + default: + /* unreached */ + g_assert (0); } } -void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) +void +gst_qtdemux_add_stream (GstQTDemux * qtdemux, QtDemuxStream * stream) { - if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){ + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) { gchar *name = g_strdup_printf ("video_%02d", qtdemux->n_video_streams); - stream->pad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_qtdemux_videosrc_template), name); + + stream->pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_videosrc_template), name); g_free (name); stream->fps = 1. * GST_SECOND / stream->samples[0].duration; - if(stream->caps){ - gst_caps_set_simple(stream->caps, + if (stream->caps) { + gst_caps_set_simple (stream->caps, "width", G_TYPE_INT, stream->width, "height", G_TYPE_INT, stream->height, "framerate", G_TYPE_DOUBLE, stream->fps, NULL); } qtdemux->n_video_streams++; - }else{ + } else { gchar *name = g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams); - stream->pad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_qtdemux_audiosrc_template), name); + + stream->pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_audiosrc_template), name); g_free (name); - if(stream->caps){ - gst_caps_set_simple(stream->caps, - "rate", G_TYPE_INT, (int)stream->rate, + if (stream->caps) { + gst_caps_set_simple (stream->caps, + "rate", G_TYPE_INT, (int) stream->rate, "channels", G_TYPE_INT, stream->n_channels, NULL); } qtdemux->n_audio_streams++; @@ -714,22 +732,23 @@ void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) gst_pad_use_explicit_caps (stream->pad); - GST_PAD_ELEMENT_PRIVATE(stream->pad) = stream; + GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; qtdemux->streams[qtdemux->n_streams] = stream; qtdemux->n_streams++; GST_DEBUG ("n_streams is now %d", qtdemux->n_streams); gst_pad_set_event_mask_function (stream->pad, gst_qtdemux_get_event_mask); gst_pad_set_event_function (stream->pad, gst_qtdemux_handle_src_event); - gst_pad_set_query_type_function (stream->pad, gst_qtdemux_get_src_query_types); + gst_pad_set_query_type_function (stream->pad, + gst_qtdemux_get_src_query_types); gst_pad_set_query_function (stream->pad, gst_qtdemux_handle_src_query); gst_pad_set_formats_function (stream->pad, gst_qtdemux_get_src_formats); gst_pad_set_convert_function (stream->pad, gst_qtdemux_src_convert); - gst_pad_set_explicit_caps(stream->pad, stream->caps); + gst_pad_set_explicit_caps (stream->pad, stream->caps); GST_DEBUG ("adding pad %p to qtdemux %p", stream->pad, qtdemux); - gst_element_add_pad(GST_ELEMENT (qtdemux), stream->pad); + gst_element_add_pad (GST_ELEMENT (qtdemux), stream->pad); } @@ -777,101 +796,104 @@ void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) #define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') -static void qtdemux_dump_mvhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_tkhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_elst(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_mdhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_hdlr(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_vmhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_dref(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stts(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stss(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsc(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsz(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stco(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_co64(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_dcom(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_cmvd(GstQTDemux *qtdemux, void *buffer, int depth); +static void qtdemux_dump_mvhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_tkhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_elst (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_mdhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_hdlr (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_vmhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_dref (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stts (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stss (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsc (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsz (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stco (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_co64 (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_dcom (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_cmvd (GstQTDemux * qtdemux, void *buffer, int depth); QtNodeType qt_node_types[] = { - { FOURCC_moov, "movie", QT_CONTAINER, }, - { FOURCC_mvhd, "movie header", 0, - qtdemux_dump_mvhd }, - { FOURCC_clip, "clipping", QT_CONTAINER, }, - { FOURCC_trak, "track", QT_CONTAINER, }, - { FOURCC_udta, "user data", 0, }, /* special container */ - { FOURCC_ctab, "color table", 0, }, - { FOURCC_tkhd, "track header", 0, - qtdemux_dump_tkhd }, - { FOURCC_crgn, "clipping region", 0, }, - { FOURCC_matt, "track matte", QT_CONTAINER, }, - { FOURCC_kmat, "compressed matte", 0, }, - { FOURCC_edts, "edit", QT_CONTAINER, }, - { FOURCC_elst, "edit list", 0, - qtdemux_dump_elst }, - { FOURCC_load, "track load settings", 0, }, - { FOURCC_tref, "track reference", QT_CONTAINER, }, - { FOURCC_imap, "track input map", QT_CONTAINER, }, - { FOURCC___in, "track input", 0, }, /* special container */ - { FOURCC___ty, "input type", 0, }, - { FOURCC_mdia, "media", QT_CONTAINER }, - { FOURCC_mdhd, "media header", 0, - qtdemux_dump_mdhd }, - { FOURCC_hdlr, "handler reference", 0, - qtdemux_dump_hdlr }, - { FOURCC_minf, "media information", QT_CONTAINER }, - { FOURCC_vmhd, "video media information", 0, - qtdemux_dump_vmhd }, - { FOURCC_smhd, "sound media information", 0 }, - { FOURCC_gmhd, "base media information header", 0 }, - { FOURCC_gmin, "base media info", 0 }, - { FOURCC_dinf, "data information", QT_CONTAINER }, - { FOURCC_dref, "data reference", 0, - qtdemux_dump_dref }, - { FOURCC_stbl, "sample table", QT_CONTAINER }, - { FOURCC_stsd, "sample description", 0, - qtdemux_dump_stsd }, - { FOURCC_stts, "time-to-sample", 0, - qtdemux_dump_stts }, - { FOURCC_stss, "sync sample", 0, - qtdemux_dump_stss }, - { FOURCC_stsc, "sample-to-chunk", 0, - qtdemux_dump_stsc }, - { FOURCC_stsz, "sample size", 0, - qtdemux_dump_stsz }, - { FOURCC_stco, "chunk offset", 0, - qtdemux_dump_stco }, - { FOURCC_co64, "64-bit chunk offset", 0, - qtdemux_dump_co64 }, - { FOURCC_vide, "video media", 0 }, - { FOURCC_cmov, "compressed movie", QT_CONTAINER }, - { FOURCC_dcom, "compressed data", 0, - qtdemux_dump_dcom }, - { FOURCC_cmvd, "compressed movie data", 0, - qtdemux_dump_cmvd }, - { 0, "unknown", 0 }, + {FOURCC_moov, "movie", QT_CONTAINER,}, + {FOURCC_mvhd, "movie header", 0, + qtdemux_dump_mvhd}, + {FOURCC_clip, "clipping", QT_CONTAINER,}, + {FOURCC_trak, "track", QT_CONTAINER,}, + {FOURCC_udta, "user data", 0,}, /* special container */ + {FOURCC_ctab, "color table", 0,}, + {FOURCC_tkhd, "track header", 0, + qtdemux_dump_tkhd}, + {FOURCC_crgn, "clipping region", 0,}, + {FOURCC_matt, "track matte", QT_CONTAINER,}, + {FOURCC_kmat, "compressed matte", 0,}, + {FOURCC_edts, "edit", QT_CONTAINER,}, + {FOURCC_elst, "edit list", 0, + qtdemux_dump_elst}, + {FOURCC_load, "track load settings", 0,}, + {FOURCC_tref, "track reference", QT_CONTAINER,}, + {FOURCC_imap, "track input map", QT_CONTAINER,}, + {FOURCC___in, "track input", 0,}, /* special container */ + {FOURCC___ty, "input type", 0,}, + {FOURCC_mdia, "media", QT_CONTAINER}, + {FOURCC_mdhd, "media header", 0, + qtdemux_dump_mdhd}, + {FOURCC_hdlr, "handler reference", 0, + qtdemux_dump_hdlr}, + {FOURCC_minf, "media information", QT_CONTAINER}, + {FOURCC_vmhd, "video media information", 0, + qtdemux_dump_vmhd}, + {FOURCC_smhd, "sound media information", 0}, + {FOURCC_gmhd, "base media information header", 0}, + {FOURCC_gmin, "base media info", 0}, + {FOURCC_dinf, "data information", QT_CONTAINER}, + {FOURCC_dref, "data reference", 0, + qtdemux_dump_dref}, + {FOURCC_stbl, "sample table", QT_CONTAINER}, + {FOURCC_stsd, "sample description", 0, + qtdemux_dump_stsd}, + {FOURCC_stts, "time-to-sample", 0, + qtdemux_dump_stts}, + {FOURCC_stss, "sync sample", 0, + qtdemux_dump_stss}, + {FOURCC_stsc, "sample-to-chunk", 0, + qtdemux_dump_stsc}, + {FOURCC_stsz, "sample size", 0, + qtdemux_dump_stsz}, + {FOURCC_stco, "chunk offset", 0, + qtdemux_dump_stco}, + {FOURCC_co64, "64-bit chunk offset", 0, + qtdemux_dump_co64}, + {FOURCC_vide, "video media", 0}, + {FOURCC_cmov, "compressed movie", QT_CONTAINER}, + {FOURCC_dcom, "compressed data", 0, + qtdemux_dump_dcom}, + {FOURCC_cmvd, "compressed movie data", 0, + qtdemux_dump_cmvd}, + {0, "unknown", 0}, }; -static int n_qt_node_types = sizeof(qt_node_types)/sizeof(qt_node_types[0]); +static int n_qt_node_types = sizeof (qt_node_types) / sizeof (qt_node_types[0]); -static void *qtdemux_zalloc(void *opaque, unsigned int items, unsigned int size) +static void * +qtdemux_zalloc (void *opaque, unsigned int items, unsigned int size) { - return g_malloc(items*size); + return g_malloc (items * size); } -static void qtdemux_zfree(void *opaque, void *addr) +static void +qtdemux_zfree (void *opaque, void *addr) { - g_free(addr); + g_free (addr); } -static void *qtdemux_inflate(void *z_buffer, int z_length, int length) +static void * +qtdemux_inflate (void *z_buffer, int z_length, int length) { void *buffer; z_stream *z; int ret; - z = g_new0(z_stream, 1); + z = g_new0 (z_stream, 1); z->zalloc = qtdemux_zalloc; z->zfree = qtdemux_zfree; z->opaque = NULL; @@ -879,147 +901,154 @@ static void *qtdemux_inflate(void *z_buffer, int z_length, int length) z->next_in = z_buffer; z->avail_in = z_length; - buffer = g_malloc(length); - ret = inflateInit(z); - while(z->avail_in > 0){ - if(z->avail_out == 0){ + buffer = g_malloc (length); + ret = inflateInit (z); + while (z->avail_in > 0) { + if (z->avail_out == 0) { length += 1024; - buffer = realloc(buffer, length); + buffer = realloc (buffer, length); z->next_out = buffer + z->total_out; z->avail_out = 1024; } - ret = inflate(z,Z_SYNC_FLUSH); - if(ret != Z_OK)break; + ret = inflate (z, Z_SYNC_FLUSH); + if (ret != Z_OK) + break; } - if(ret != Z_STREAM_END){ - g_warning("inflate() returned %d\n",ret); + if (ret != Z_STREAM_END) { + g_warning ("inflate() returned %d\n", ret); } - g_free(z); + g_free (z); return buffer; } -static void qtdemux_parse_moov(GstQTDemux *qtdemux, void *buffer, int length) +static void +qtdemux_parse_moov (GstQTDemux * qtdemux, void *buffer, int length) { GNode *cmov; - qtdemux->moov_node = g_node_new(buffer); + qtdemux->moov_node = g_node_new (buffer); - qtdemux_parse(qtdemux, qtdemux->moov_node, buffer, length); + qtdemux_parse (qtdemux, qtdemux->moov_node, buffer, length); - cmov = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_cmov); - if(cmov){ + cmov = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_cmov); + if (cmov) { GNode *dcom; GNode *cmvd; - dcom = qtdemux_tree_get_child_by_type(cmov, FOURCC_dcom); - cmvd = qtdemux_tree_get_child_by_type(cmov, FOURCC_cmvd); + dcom = qtdemux_tree_get_child_by_type (cmov, FOURCC_dcom); + cmvd = qtdemux_tree_get_child_by_type (cmov, FOURCC_cmvd); - if(QTDEMUX_FOURCC_GET(dcom->data+8) == GST_MAKE_FOURCC('z','l','i','b')){ + if (QTDEMUX_FOURCC_GET (dcom->data + 8) == GST_MAKE_FOURCC ('z', 'l', 'i', + 'b')) { int uncompressed_length; int compressed_length; void *buf; - - uncompressed_length = QTDEMUX_GUINT32_GET(cmvd->data+8); - compressed_length = QTDEMUX_GUINT32_GET(cmvd->data+4) - 12; - GST_LOG("length = %d\n",uncompressed_length); - buf = qtdemux_inflate(cmvd->data + 12, compressed_length, + uncompressed_length = QTDEMUX_GUINT32_GET (cmvd->data + 8); + compressed_length = QTDEMUX_GUINT32_GET (cmvd->data + 4) - 12; + GST_LOG ("length = %d\n", uncompressed_length); + + buf = qtdemux_inflate (cmvd->data + 12, compressed_length, uncompressed_length); qtdemux->moov_node_compressed = qtdemux->moov_node; - qtdemux->moov_node = g_node_new(buf); + qtdemux->moov_node = g_node_new (buf); - qtdemux_parse(qtdemux, qtdemux->moov_node, buf, uncompressed_length); - }else{ - GST_LOG("unknown header compression type\n"); + qtdemux_parse (qtdemux, qtdemux->moov_node, buf, uncompressed_length); + } else { + GST_LOG ("unknown header compression type\n"); } } } -static void qtdemux_parse(GstQTDemux *qtdemux, GNode *node, void *buffer, int length) +static void +qtdemux_parse (GstQTDemux * qtdemux, GNode * node, void *buffer, int length) { guint32 fourcc; guint32 node_length; QtNodeType *type; void *end; - GST_LOG("qtdemux_parse %p %d\n",buffer, length); + GST_LOG ("qtdemux_parse %p %d\n", buffer, length); - node_length = QTDEMUX_GUINT32_GET(buffer); - fourcc = QTDEMUX_FOURCC_GET(buffer+4); + node_length = QTDEMUX_GUINT32_GET (buffer); + fourcc = QTDEMUX_FOURCC_GET (buffer + 4); - type = qtdemux_type_get(fourcc); - - GST_LOG("parsing '" GST_FOURCC_FORMAT "', length=%d\n", - GST_FOURCC_ARGS(fourcc), node_length); + type = qtdemux_type_get (fourcc); - if(type->flags & QT_CONTAINER){ + GST_LOG ("parsing '" GST_FOURCC_FORMAT "', length=%d\n", + GST_FOURCC_ARGS (fourcc), node_length); + + if (type->flags & QT_CONTAINER) { void *buf; guint32 len; buf = buffer + 8; end = buffer + length; - while(buf < end){ + while (buf < end) { GNode *child; - if(buf + 8 >= end){ + if (buf + 8 >= end) { /* FIXME: get annoyed */ - GST_LOG("buffer overrun\n"); + GST_LOG ("buffer overrun\n"); } - len = QTDEMUX_GUINT32_GET(buf); + len = QTDEMUX_GUINT32_GET (buf); - child = g_node_new(buf); - g_node_append(node, child); - qtdemux_parse(qtdemux, child, buf, len); + child = g_node_new (buf); + g_node_append (node, child); + qtdemux_parse (qtdemux, child, buf, len); buf += len; } - }else{ + } else { #if 0 - if(fourcc == FOURCC_cmvd){ + if (fourcc == FOURCC_cmvd) { int uncompressed_length; void *buf; - - uncompressed_length = QTDEMUX_GUINT32_GET(buffer+8); - GST_LOG("length = %d\n",uncompressed_length); - buf = qtdemux_inflate(buffer + 12, node_length-12, uncompressed_length); + uncompressed_length = QTDEMUX_GUINT32_GET (buffer + 8); + GST_LOG ("length = %d\n", uncompressed_length); + + buf = + qtdemux_inflate (buffer + 12, node_length - 12, uncompressed_length); end = buf + uncompressed_length; - while(buf < end){ - GNode *child; + while (buf < end) { + GNode *child; guint32 len; - if(buf + 8 >= end){ + if (buf + 8 >= end) { /* FIXME: get annoyed */ - GST_LOG("buffer overrun\n"); - } - len = QTDEMUX_GUINT32_GET(buf); + GST_LOG ("buffer overrun\n"); + } + len = QTDEMUX_GUINT32_GET (buf); - child = g_node_new(buf); - g_node_append(node, child); - qtdemux_parse(qtdemux, child, buf, len); + child = g_node_new (buf); + g_node_append (node, child); + qtdemux_parse (qtdemux, child, buf, len); - buf += len; + buf += len; } } #endif } } -static QtNodeType *qtdemux_type_get(guint32 fourcc) +static QtNodeType * +qtdemux_type_get (guint32 fourcc) { int i; - for(i=0;idata; guint32 node_length; @@ -1027,353 +1056,456 @@ static gboolean qtdemux_node_dump_foreach(GNode *node, gpointer data) QtNodeType *type; int depth; - node_length = GUINT32_FROM_BE(*(guint32 *)buffer); - fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + node_length = GUINT32_FROM_BE (*(guint32 *) buffer); + fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - type = qtdemux_type_get(fourcc); + type = qtdemux_type_get (fourcc); - depth = (g_node_depth(node)-1)*2; - GST_LOG("%*s'" GST_FOURCC_FORMAT "', [%d], %s\n", - depth, "", - GST_FOURCC_ARGS(fourcc), - node_length, - type->name); + depth = (g_node_depth (node) - 1) * 2; + GST_LOG ("%*s'" GST_FOURCC_FORMAT "', [%d], %s\n", + depth, "", GST_FOURCC_ARGS (fourcc), node_length, type->name); - if(type->dump)type->dump(data, buffer, depth); + if (type->dump) + type->dump (data, buffer, depth); return FALSE; } -static void qtdemux_node_dump(GstQTDemux *qtdemux, GNode *node) +static void +qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node) { - g_node_traverse(qtdemux->moov_node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, + g_node_traverse (qtdemux->moov_node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, qtdemux_node_dump_foreach, qtdemux); } -static void qtdemux_dump_mvhd(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_mvhd (GstQTDemux * qtdemux, void *buffer, int depth) { - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s creation time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - GST_LOG("%*s modify time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+16)); - GST_LOG("%*s time scale: 1/%u sec\n", depth, "", QTDEMUX_GUINT32_GET(buffer+20)); - GST_LOG("%*s duration: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+24)); - GST_LOG("%*s pref. rate: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+28)); - GST_LOG("%*s pref. volume: %g\n", depth, "", QTDEMUX_FP16_GET(buffer+32)); - GST_LOG("%*s preview time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+80)); - GST_LOG("%*s preview dur.: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+84)); - GST_LOG("%*s poster time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+88)); - GST_LOG("%*s select time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+92)); - GST_LOG("%*s select dur.: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+96)); - GST_LOG("%*s current time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+100)); - GST_LOG("%*s next track ID: %d\n", depth, "", QTDEMUX_GUINT32_GET(buffer+104)); + GST_LOG ("%*s version/flags: %08x\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 8)); + GST_LOG ("%*s creation time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 12)); + GST_LOG ("%*s modify time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 16)); + GST_LOG ("%*s time scale: 1/%u sec\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 20)); + GST_LOG ("%*s duration: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 24)); + GST_LOG ("%*s pref. rate: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 28)); + GST_LOG ("%*s pref. volume: %g\n", depth, "", + QTDEMUX_FP16_GET (buffer + 32)); + GST_LOG ("%*s preview time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 80)); + GST_LOG ("%*s preview dur.: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 84)); + GST_LOG ("%*s poster time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 88)); + GST_LOG ("%*s select time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 92)); + GST_LOG ("%*s select dur.: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 96)); + GST_LOG ("%*s current time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 100)); + GST_LOG ("%*s next track ID: %d\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 104)); } -static void qtdemux_dump_tkhd(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_tkhd (GstQTDemux * qtdemux, void *buffer, int depth) { - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s creation time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - GST_LOG("%*s modify time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+16)); - GST_LOG("%*s track ID: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+20)); - GST_LOG("%*s duration: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+28)); - GST_LOG("%*s layer: %u\n", depth, "", QTDEMUX_GUINT16_GET(buffer+36)); - GST_LOG("%*s alt group: %u\n", depth, "", QTDEMUX_GUINT16_GET(buffer+38)); - GST_LOG("%*s volume: %g\n", depth, "", QTDEMUX_FP16_GET(buffer+44)); - GST_LOG("%*s track width: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+84)); - GST_LOG("%*s track height: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+88)); + GST_LOG ("%*s version/flags: %08x\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 8)); + GST_LOG ("%*s creation time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 12)); + GST_LOG ("%*s modify time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 16)); + GST_LOG ("%*s track ID: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 20)); + GST_LOG ("%*s duration: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 28)); + GST_LOG ("%*s layer: %u\n", depth, "", + QTDEMUX_GUINT16_GET (buffer + 36)); + GST_LOG ("%*s alt group: %u\n", depth, "", + QTDEMUX_GUINT16_GET (buffer + 38)); + GST_LOG ("%*s volume: %g\n", depth, "", + QTDEMUX_FP16_GET (buffer + 44)); + GST_LOG ("%*s track width: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 84)); + GST_LOG ("%*s track height: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 88)); } -static void qtdemux_dump_elst(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_elst (GstQTDemux * qtdemux, void *buffer, int depth) { int i; int n; - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s n entries: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - n = QTDEMUX_GUINT32_GET(buffer+12); - for(i=0;idata; - child_fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + child_fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - if(child_fourcc == fourcc){ + if (child_fourcc == fourcc) { return child; } } return NULL; } -static GNode *qtdemux_tree_get_sibling_by_type(GNode *node, guint32 fourcc) +static GNode * +qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc) { GNode *child; void *buffer; guint32 child_fourcc; - for(child = g_node_next_sibling(node); child; child = g_node_next_sibling(child)){ + for (child = g_node_next_sibling (node); child; + child = g_node_next_sibling (child)) { buffer = child->data; - child_fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + child_fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - if(child_fourcc == fourcc){ + if (child_fourcc == fourcc) { return child; } } return NULL; } -static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak); +static void qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak); -static void qtdemux_parse_tree(GstQTDemux *qtdemux) +static void +qtdemux_parse_tree (GstQTDemux * qtdemux) { GNode *mvhd; GNode *trak; - mvhd = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_mvhd); - if(mvhd==NULL){ - GST_LOG("No mvhd node found.\n"); + mvhd = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvhd); + if (mvhd == NULL) { + GST_LOG ("No mvhd node found.\n"); return; } - qtdemux->timescale = QTDEMUX_GUINT32_GET(mvhd->data + 20); - qtdemux->duration = QTDEMUX_GUINT32_GET(mvhd->data + 24); + qtdemux->timescale = QTDEMUX_GUINT32_GET (mvhd->data + 20); + qtdemux->duration = QTDEMUX_GUINT32_GET (mvhd->data + 24); - GST_INFO("timescale: %d\n", qtdemux->timescale); - GST_INFO("duration: %d\n", qtdemux->duration); + GST_INFO ("timescale: %d\n", qtdemux->timescale); + GST_INFO ("duration: %d\n", qtdemux->duration); - trak = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_trak); - qtdemux_parse_trak(qtdemux, trak); + trak = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_trak); + qtdemux_parse_trak (qtdemux, trak); /* trak = qtdemux_tree_get_sibling_by_type(trak, FOURCC_trak); if(trak)qtdemux_parse_trak(qtdemux, trak);*/ - while ((trak = qtdemux_tree_get_sibling_by_type(trak, FOURCC_trak)) != NULL) - qtdemux_parse_trak(qtdemux, trak); + while ((trak = qtdemux_tree_get_sibling_by_type (trak, FOURCC_trak)) != NULL) + qtdemux_parse_trak (qtdemux, trak); } -static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak) +static void +qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) { int offset; GNode *tkhd; @@ -1392,235 +1524,257 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak) QtDemuxSample *samples; int n_samples_per_chunk; int index; - int i,j,k; + int i, j, k; QtDemuxStream *stream; int n_sample_times; guint64 timestamp; int sample_size; int sample_index; - stream = g_new0(QtDemuxStream,1); + stream = g_new0 (QtDemuxStream, 1); - tkhd = qtdemux_tree_get_child_by_type(trak, FOURCC_tkhd); - g_assert(tkhd); + tkhd = qtdemux_tree_get_child_by_type (trak, FOURCC_tkhd); + g_assert (tkhd); /* track duration? */ - mdia = qtdemux_tree_get_child_by_type(trak, FOURCC_mdia); - g_assert(mdia); + mdia = qtdemux_tree_get_child_by_type (trak, FOURCC_mdia); + g_assert (mdia); - mdhd = qtdemux_tree_get_child_by_type(mdia, FOURCC_mdhd); - g_assert(mdhd); + mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mdhd); + g_assert (mdhd); - stream->timescale = QTDEMUX_GUINT32_GET(mdhd->data+20); - GST_INFO("track timescale: %d", stream->timescale); - - hdlr = qtdemux_tree_get_child_by_type(mdia, FOURCC_hdlr); - g_assert(hdlr); - - GST_LOG("track type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(hdlr->data+12))); - GST_LOG("track subtype: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(hdlr->data+16))); + stream->timescale = QTDEMUX_GUINT32_GET (mdhd->data + 20); + GST_INFO ("track timescale: %d", stream->timescale); + + hdlr = qtdemux_tree_get_child_by_type (mdia, FOURCC_hdlr); + g_assert (hdlr); - stream->subtype = QTDEMUX_FOURCC_GET(hdlr->data+16); + GST_LOG ("track type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (hdlr->data + 12))); + GST_LOG ("track subtype: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (hdlr->data + 16))); - minf = qtdemux_tree_get_child_by_type(mdia, FOURCC_minf); - g_assert(minf); + stream->subtype = QTDEMUX_FOURCC_GET (hdlr->data + 16); - stbl = qtdemux_tree_get_child_by_type(minf, FOURCC_stbl); - g_assert(stbl); + minf = qtdemux_tree_get_child_by_type (mdia, FOURCC_minf); + g_assert (minf); - stsd = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsd); - g_assert(stsd); + stbl = qtdemux_tree_get_child_by_type (minf, FOURCC_stbl); + g_assert (stbl); - if(stream->subtype == FOURCC_vide){ + stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd); + g_assert (stsd); + + if (stream->subtype == FOURCC_vide) { offset = 16; - GST_LOG("st type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+offset+4))); - - stream->width = QTDEMUX_GUINT16_GET(stsd->data+offset+32); - stream->height = QTDEMUX_GUINT16_GET(stsd->data+offset+34); - stream->fps = 0.; /* this is filled in later */ - - GST_LOG("frame count: %u\n", QTDEMUX_GUINT16_GET(stsd->data+offset+48)); - - stream->caps = qtdemux_video_caps(qtdemux, - QTDEMUX_FOURCC_GET(stsd->data+offset+4), stsd->data); - GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", - GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET(stsd->data+offset+4)), - stream->caps); - }else if(stream->subtype == FOURCC_soun){ + GST_LOG ("st type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + offset + 4))); + + stream->width = QTDEMUX_GUINT16_GET (stsd->data + offset + 32); + stream->height = QTDEMUX_GUINT16_GET (stsd->data + offset + 34); + stream->fps = 0.; /* this is filled in later */ + + GST_LOG ("frame count: %u\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 48)); + + stream->caps = qtdemux_video_caps (qtdemux, + QTDEMUX_FOURCC_GET (stsd->data + offset + 4), stsd->data); + GST_INFO ("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + offset + 4)), + stream->caps); + } else if (stream->subtype == FOURCC_soun) { int version, samplesize; - GST_LOG("st type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+16+4))); + GST_LOG ("st type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4))); offset = 32; - GST_LOG("version/rev: %08x\n", QTDEMUX_GUINT32_GET(stsd->data+offset)); - version = QTDEMUX_GUINT32_GET(stsd->data+offset); - GST_LOG("vendor: %08x\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 4)); - GST_LOG("n_channels: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 8)); - stream->n_channels = QTDEMUX_GUINT16_GET(stsd->data+offset + 8); - GST_LOG("sample_size: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 10)); - samplesize = QTDEMUX_GUINT16_GET(stsd->data+offset + 10); - GST_LOG("compression_id: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 12)); - GST_LOG("packet size: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 14)); - GST_LOG("sample rate: %g\n", QTDEMUX_FP32_GET(stsd->data+offset + 16)); - stream->rate = QTDEMUX_FP32_GET(stsd->data+offset + 16); + GST_LOG ("version/rev: %08x\n", + QTDEMUX_GUINT32_GET (stsd->data + offset)); + version = QTDEMUX_GUINT32_GET (stsd->data + offset); + GST_LOG ("vendor: %08x\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 4)); + GST_LOG ("n_channels: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 8)); + stream->n_channels = QTDEMUX_GUINT16_GET (stsd->data + offset + 8); + GST_LOG ("sample_size: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 10)); + samplesize = QTDEMUX_GUINT16_GET (stsd->data + offset + 10); + GST_LOG ("compression_id: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 12)); + GST_LOG ("packet size: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 14)); + GST_LOG ("sample rate: %g\n", + QTDEMUX_FP32_GET (stsd->data + offset + 16)); + stream->rate = QTDEMUX_FP32_GET (stsd->data + offset + 16); offset = 52; - if(version == 0x00010000){ - GST_LOG("samples/packet: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset)); - stream->samples_per_packet = QTDEMUX_GUINT32_GET(stsd->data+offset); - GST_LOG("bytes/packet: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 4)); - GST_LOG("bytes/frame: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 8)); - stream->bytes_per_frame = QTDEMUX_GUINT32_GET(stsd->data+offset + 8); - GST_LOG("bytes/sample: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 12)); + if (version == 0x00010000) { + GST_LOG ("samples/packet: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset)); + stream->samples_per_packet = QTDEMUX_GUINT32_GET (stsd->data + offset); + GST_LOG ("bytes/packet: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 4)); + GST_LOG ("bytes/frame: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 8)); + stream->bytes_per_frame = QTDEMUX_GUINT32_GET (stsd->data + offset + 8); + GST_LOG ("bytes/sample: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 12)); offset = 68; } else { stream->bytes_per_frame = stream->n_channels * samplesize / 8; stream->samples_per_packet = 1; } - stream->caps = qtdemux_audio_caps(qtdemux, - QTDEMUX_FOURCC_GET(stsd->data+16+4), (QTDEMUX_GUINT32_GET(stsd->data) > offset) ? stsd->data + offset : NULL); - GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+16+4)), stream->caps); - }else{ - GST_LOG("unknown subtype\n"); + stream->caps = qtdemux_audio_caps (qtdemux, + QTDEMUX_FOURCC_GET (stsd->data + 16 + 4), + (QTDEMUX_GUINT32_GET (stsd->data) > + offset) ? stsd->data + offset : NULL); + GST_INFO ("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4)), + stream->caps); + } else { + GST_LOG ("unknown subtype\n"); return; } /* sample to chunk */ - stsc = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsc); - g_assert(stsc); + stsc = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsc); + g_assert (stsc); /* sample size */ - stsz = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsz); - g_assert(stsz); + stsz = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsz); + g_assert (stsz); /* chunk offsets */ - stco = qtdemux_tree_get_child_by_type(stbl, FOURCC_stco); - co64 = qtdemux_tree_get_child_by_type(stbl, FOURCC_co64); - g_assert(stco || co64); + stco = qtdemux_tree_get_child_by_type (stbl, FOURCC_stco); + co64 = qtdemux_tree_get_child_by_type (stbl, FOURCC_co64); + g_assert (stco || co64); /* sample time */ - stts = qtdemux_tree_get_child_by_type(stbl, FOURCC_stts); - g_assert(stts); + stts = qtdemux_tree_get_child_by_type (stbl, FOURCC_stts); + g_assert (stts); - sample_size = QTDEMUX_GUINT32_GET(stsz->data+12); - if(sample_size == 0){ - n_samples = QTDEMUX_GUINT32_GET(stsz->data+16); + sample_size = QTDEMUX_GUINT32_GET (stsz->data + 12); + if (sample_size == 0) { + n_samples = QTDEMUX_GUINT32_GET (stsz->data + 16); stream->n_samples = n_samples; - samples = g_malloc(sizeof(QtDemuxSample)*n_samples); + samples = g_malloc (sizeof (QtDemuxSample) * n_samples); stream->samples = samples; - for(i=0;idata + i*4 + 20); + for (i = 0; i < n_samples; i++) { + samples[i].size = QTDEMUX_GUINT32_GET (stsz->data + i * 4 + 20); } - n_samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data+12); + n_samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 12); index = 0; offset = 16; - for(i=0;idata + 16 + i*12 + 0) - 1; - if(i==n_samples_per_chunk-1){ - last_chunk = INT_MAX; - }else{ - last_chunk = QTDEMUX_GUINT32_GET(stsc->data +16 + i*12 + 12) - 1; + + first_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 0) - 1; + if (i == n_samples_per_chunk - 1) { + last_chunk = INT_MAX; + } else { + last_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 12) - 1; } - samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data + 16 + i*12 + 4); - - for(j=first_chunk;jdata + 16 + j*4); - }else{ - chunk_offset = QTDEMUX_GUINT64_GET(co64->data + 16 + j*8); - } - for(k=0;kdata + 16 + i * 12 + 4); + + for (j = first_chunk; j < last_chunk; j++) { + int chunk_offset; + + if (stco) { + chunk_offset = QTDEMUX_GUINT32_GET (stco->data + 16 + j * 4); + } else { + chunk_offset = QTDEMUX_GUINT64_GET (co64->data + 16 + j * 8); + } + for (k = 0; k < samples_per_chunk; k++) { samples[index].chunk = j; samples[index].offset = chunk_offset; chunk_offset += samples[index].size; index++; - if(index>=n_samples)goto done; - } + if (index >= n_samples) + goto done; + } } } -done: - - n_sample_times = QTDEMUX_GUINT32_GET(stts->data + 12); + done: + + n_sample_times = QTDEMUX_GUINT32_GET (stts->data + 12); timestamp = 0; index = 0; - for(i=0;idata + 16 + 8*i); - duration = QTDEMUX_GUINT32_GET(stts->data + 16 + 8*i + 4); - time = (GST_SECOND * duration)/stream->timescale; - for(j=0;jdata + 16 + 8 * i); + duration = QTDEMUX_GUINT32_GET (stts->data + 16 + 8 * i + 4); + time = (GST_SECOND * duration) / stream->timescale; + for (j = 0; j < n; j++) { + //GST_INFO("moo %lld", timestamp); + samples[index].timestamp = timestamp; + samples[index].duration = time; + timestamp += time; + index++; } } - }else{ + } else { int sample_width; guint64 timestamp = 0; - GST_LOG("treating chunks as samples\n"); + GST_LOG ("treating chunks as samples\n"); /* treat chunks as samples */ - if(stco){ - n_samples = QTDEMUX_GUINT32_GET(stco->data+12); - }else{ - n_samples = QTDEMUX_GUINT32_GET(co64->data+12); + if (stco) { + n_samples = QTDEMUX_GUINT32_GET (stco->data + 12); + } else { + n_samples = QTDEMUX_GUINT32_GET (co64->data + 12); } stream->n_samples = n_samples; - samples = g_malloc(sizeof(QtDemuxSample)*n_samples); + samples = g_malloc (sizeof (QtDemuxSample) * n_samples); stream->samples = samples; - sample_width = QTDEMUX_GUINT16_GET(stsd->data+offset + 10) / 8; + sample_width = QTDEMUX_GUINT16_GET (stsd->data + offset + 10) / 8; - n_samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data+12); + n_samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 12); offset = 16; sample_index = 0; - for(i=0;idata + 16 + i*12 + 0) - 1; - if(i==n_samples-1){ - last_chunk = INT_MAX; - }else{ - last_chunk = QTDEMUX_GUINT32_GET(stsc->data +16 + i*12 + 12) - 1; + + first_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 0) - 1; + if (i == n_samples - 1) { + last_chunk = INT_MAX; + } else { + last_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 12) - 1; } - samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data + 16 + i*12 + 4); - - for(j=first_chunk;j=n_samples)goto done2; - if(stco){ - chunk_offset = QTDEMUX_GUINT32_GET(stco->data + 16 + j*4); - }else{ - chunk_offset = QTDEMUX_GUINT64_GET(co64->data + 16 + j*8); - } + samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 4); + + for (j = first_chunk; j < last_chunk; j++) { + int chunk_offset; + + if (j >= n_samples) + goto done2; + if (stco) { + chunk_offset = QTDEMUX_GUINT32_GET (stco->data + 16 + j * 4); + } else { + chunk_offset = QTDEMUX_GUINT64_GET (co64->data + 16 + j * 8); + } samples[j].chunk = j; samples[j].offset = chunk_offset; - samples[j].size = samples_per_chunk * stream->bytes_per_frame / stream->samples_per_packet; - samples[j].duration = samples_per_chunk * GST_SECOND / (stream->rate/2); + samples[j].size = + samples_per_chunk * stream->bytes_per_frame / + stream->samples_per_packet; + samples[j].duration = + samples_per_chunk * GST_SECOND / (stream->rate / 2); samples[j].timestamp = timestamp; timestamp += (samples_per_chunk * GST_SECOND) / stream->rate; #if 0 - GST_INFO("moo samples_per_chunk=%d rate=%d dur=%lld %lld", - (int)samples_per_chunk, - (int)stream->rate, - (long long)((samples_per_chunk * GST_SECOND) / stream->rate), - (long long)timestamp); + GST_INFO ("moo samples_per_chunk=%d rate=%d dur=%lld %lld", + (int) samples_per_chunk, + (int) stream->rate, + (long long) ((samples_per_chunk * GST_SECOND) / stream->rate), + (long long) timestamp); #endif samples[j].sample_index = sample_index; sample_index += samples_per_chunk; @@ -1653,183 +1807,175 @@ done2: } done2: #if 0 - for(i=0;i10)break; + if (i > 10) + break; } #endif - gst_qtdemux_add_stream(qtdemux,stream); + gst_qtdemux_add_stream (qtdemux, stream); } -static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *stsd_data) +static GstCaps * +qtdemux_video_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * stsd_data) { - switch(fourcc){ - case GST_MAKE_FOURCC('j','p','e','g'): + switch (fourcc) { + case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): /* JPEG */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('m','j','p','a'): + case GST_MAKE_FOURCC ('m', 'j', 'p', 'a'): /* Motion-JPEG (format A) */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('m','j','p','b'): + case GST_MAKE_FOURCC ('m', 'j', 'p', 'b'): /* Motion-JPEG (format B) */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('S','V','Q','3'): + case GST_MAKE_FOURCC ('S', 'V', 'Q', '3'): if (stsd_data != NULL) { - gst_getbits_t gb; + gst_getbits_t gb; gint halfpel_flag; gint thirdpel_flag; gint unknown_svq3_flag; gint low_delay; gint size; - size = QTDEMUX_GUINT32_GET(stsd_data + 16); + size = QTDEMUX_GUINT32_GET (stsd_data + 16); + + gst_getbits_init (&gb, NULL, NULL); + gst_getbits_newbuf (&gb, (unsigned char *) stsd_data + 98 + 16 + 4, + (size - 102 + 16)); + + /* Infos ripped from ffmpeg see libavcodec/svq3.c */ - gst_getbits_init (&gb, NULL, NULL); - gst_getbits_newbuf (&gb, (unsigned char *)stsd_data + 98 + 16 + 4 , (size - 102 + 16)); - - /* Infos ripped from ffmpeg see libavcodec/svq3.c */ - /* 'frame size code' and optional 'width, height' */ - if (gst_getbitsn (&gb, 3) == 7) { - gst_getbitsn (&gb, 12); - gst_getbitsn (&gb, 12); + if (gst_getbitsn (&gb, 3) == 7) { + gst_getbitsn (&gb, 12); + gst_getbitsn (&gb, 12); } halfpel_flag = gst_get1bit (&gb); - thirdpel_flag = gst_get1bit (&gb); + thirdpel_flag = gst_get1bit (&gb); - /* unknown fields */ - gst_get1bit (&gb); - gst_get1bit (&gb); - gst_get1bit (&gb); - gst_get1bit (&gb); + /* unknown fields */ + gst_get1bit (&gb); + gst_get1bit (&gb); + gst_get1bit (&gb); + gst_get1bit (&gb); - low_delay = gst_get1bit (&gb); + low_delay = gst_get1bit (&gb); - /* unknown field */ - gst_get1bit (&gb); + /* unknown field */ + gst_get1bit (&gb); while (gst_get1bit (&gb)) { - gst_getbitsn (&gb, 8); - } - - unknown_svq3_flag = gst_get1bit (&gb); - - return gst_caps_new_simple ("video/x-svq", - "svqversion", G_TYPE_INT, 3, - "halfpel_flag", G_TYPE_INT, halfpel_flag, - "thirdpel_flag", G_TYPE_INT, thirdpel_flag, - "low_delay", G_TYPE_INT, low_delay, - "unknown_svq3_flag", G_TYPE_INT, unknown_svq3_flag, - NULL); + gst_getbitsn (&gb, 8); + } + + unknown_svq3_flag = gst_get1bit (&gb); + + return gst_caps_new_simple ("video/x-svq", + "svqversion", G_TYPE_INT, 3, + "halfpel_flag", G_TYPE_INT, halfpel_flag, + "thirdpel_flag", G_TYPE_INT, thirdpel_flag, + "low_delay", G_TYPE_INT, low_delay, + "unknown_svq3_flag", G_TYPE_INT, unknown_svq3_flag, NULL); } - return gst_caps_from_string ("video/x-svq, " - "svqversion = (int) 3"); - case GST_MAKE_FOURCC('s','v','q','i'): - case GST_MAKE_FOURCC('S','V','Q','1'): - return gst_caps_from_string ("video/x-svq, " - "svqversion = (int) 1"); - case GST_MAKE_FOURCC('r','a','w',' '): + return gst_caps_from_string ("video/x-svq, " "svqversion = (int) 3"); + case GST_MAKE_FOURCC ('s', 'v', 'q', 'i'): + case GST_MAKE_FOURCC ('S', 'V', 'Q', '1'): + return gst_caps_from_string ("video/x-svq, " "svqversion = (int) 1"); + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): /* uncompressed RGB */ return gst_caps_from_string ("video/x-raw-rgb, " "endianness = (int) BIG_ENDIAN"); - /*"bpp", GST_PROPS_INT(x), - "depth", GST_PROPS_INT(x), - "red_mask", GST_PROPS_INT(x), - "green_mask", GST_PROPS_INT(x), - "blue_mask", GST_PROPS_INT(x), FIXME! */ - case GST_MAKE_FOURCC('Y','u','v','2'): + /*"bpp", GST_PROPS_INT(x), + "depth", GST_PROPS_INT(x), + "red_mask", GST_PROPS_INT(x), + "green_mask", GST_PROPS_INT(x), + "blue_mask", GST_PROPS_INT(x), FIXME! */ + case GST_MAKE_FOURCC ('Y', 'u', 'v', '2'): /* uncompressed YUV2 */ return gst_caps_from_string ("video/x-raw-yuv, " "format = (fourcc) YUY2"); - case GST_MAKE_FOURCC('m','p','e','g'): + case GST_MAKE_FOURCC ('m', 'p', 'e', 'g'): /* MPEG */ return gst_caps_from_string ("video/mpeg, " - "systemstream = (boolean) false, " - "mpegversion = (int) 1"); - case GST_MAKE_FOURCC('g','i','f',' '): + "systemstream = (boolean) false, " "mpegversion = (int) 1"); + case GST_MAKE_FOURCC ('g', 'i', 'f', ' '): return gst_caps_from_string ("image/gif"); - case GST_MAKE_FOURCC('h','2','6','3'): + case GST_MAKE_FOURCC ('h', '2', '6', '3'): /* H.263 */ /* ffmpeg uses the height/width props, don't know why */ return gst_caps_from_string ("video/x-h263"); - case GST_MAKE_FOURCC('m','p','4','v'): + case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): /* MPEG-4 */ return gst_caps_from_string ("video/mpeg, " - "mpegversion = (int) 4, " - "systemstream = (boolean) false"); - case GST_MAKE_FOURCC('3','I','V','1'): + "mpegversion = (int) 4, " "systemstream = (boolean) false"); + case GST_MAKE_FOURCC ('3', 'I', 'V', '1'): return gst_caps_from_string ("video/x-3ivx"); - case GST_MAKE_FOURCC('c','v','i','d'): + case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'): /* Cinepak */ return gst_caps_from_string ("video/x-cinepak"); - case GST_MAKE_FOURCC('r','p','z','a'): - case GST_MAKE_FOURCC('r','l','e',' '): + case GST_MAKE_FOURCC ('r', 'p', 'z', 'a'): + case GST_MAKE_FOURCC ('r', 'l', 'e', ' '): /* Run-length encoding */ - case GST_MAKE_FOURCC('s','m','c',' '): - case GST_MAKE_FOURCC('k','p','c','d'): + case GST_MAKE_FOURCC ('s', 'm', 'c', ' '): + case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'): default: g_critical ("Don't know how to convert fourcc '" GST_FOURCC_FORMAT - "' to caps\n", GST_FOURCC_ARGS(fourcc)); + "' to caps\n", GST_FOURCC_ARGS (fourcc)); return NULL; } } -static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data) +static GstCaps * +qtdemux_audio_caps (GstQTDemux * qtdemux, guint32 fourcc, const guint8 * data) { - switch(fourcc){ - case GST_MAKE_FOURCC('N','O','N','E'): - return NULL; /*gst_caps_from_string ("audio/raw");*/ - case GST_MAKE_FOURCC('r','a','w',' '): + switch (fourcc) { + case GST_MAKE_FOURCC ('N', 'O', 'N', 'E'): + return NULL; /*gst_caps_from_string ("audio/raw"); */ + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " - "width = (int) 8, " - "depth = (int) 8, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('t','w','o','s'): + "width = (int) 8, " "depth = (int) 8, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('t', 'w', 'o', 's'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 16, " "depth = (int) 16, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('s','o','w','t'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('s', 'o', 'w', 't'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 16, " "depth = (int) 16, " - "endianness = (int) G_LITTLE_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('f','l','6','4'): + "endianness = (int) G_LITTLE_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('f', 'l', '6', '4'): return gst_caps_from_string ("audio/x-raw-float, " - "width = (int) 64, " - "endianness = (int) G_BIG_ENDIAN"); - case GST_MAKE_FOURCC('f','l','3','2'): + "width = (int) 64, " "endianness = (int) G_BIG_ENDIAN"); + case GST_MAKE_FOURCC ('f', 'l', '3', '2'): return gst_caps_from_string ("audio/x-raw-float, " - "width = (int) 32, " - "endianness = (int) G_BIG_ENDIAN"); - case GST_MAKE_FOURCC('i','n','2','4'): + "width = (int) 32, " "endianness = (int) G_BIG_ENDIAN"); + case GST_MAKE_FOURCC ('i', 'n', '2', '4'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 24, " "depth = (int) 32, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('i','n','3','2'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('i', 'n', '3', '2'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) 32, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('u','l','a','w'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('u', 'l', 'a', 'w'): /* FIXME */ return gst_caps_from_string ("audio/x-mulaw"); - case GST_MAKE_FOURCC('a','l','a','w'): + case GST_MAKE_FOURCC ('a', 'l', 'a', 'w'): /* FIXME */ return gst_caps_from_string ("audio/x-alaw"); case 0x6d730002: @@ -1843,53 +1989,47 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const gu case 0x6d730055: /* MPEG layer 3, CBR only (pre QT4.1) */ case 0x5500736d: - case GST_MAKE_FOURCC('.','m','p','3'): + case GST_MAKE_FOURCC ('.', 'm', 'p', '3'): /* MPEG layer 3, CBR & VBR (QT4.1 and later) */ return gst_caps_from_string ("audio/mpeg, " - "layer = (int) 3, " - "mpegversion = (int) 1"); - case GST_MAKE_FOURCC('M','A','C','3'): + "layer = (int) 3, " "mpegversion = (int) 1"); + case GST_MAKE_FOURCC ('M', 'A', 'C', '3'): /* MACE 3:1 */ - return gst_caps_from_string ("audio/x-mace, " - "maceversion = (int) 3"); - case GST_MAKE_FOURCC('M','A','C','6'): + return gst_caps_from_string ("audio/x-mace, " "maceversion = (int) 3"); + case GST_MAKE_FOURCC ('M', 'A', 'C', '6'): /* MACE 6:1 */ - return gst_caps_from_string ("audio/x-mace, " - "maceversion = (int) 6"); - case GST_MAKE_FOURCC('O','g','g','V'): + return gst_caps_from_string ("audio/x-mace, " "maceversion = (int) 6"); + case GST_MAKE_FOURCC ('O', 'g', 'g', 'V'): /* Ogg Vorbis */ return gst_caps_from_string ("application/ogg"); - case GST_MAKE_FOURCC('d','v','c','a'): + case GST_MAKE_FOURCC ('d', 'v', 'c', 'a'): /* DV audio */ return gst_caps_from_string ("audio/x-dv"); - case GST_MAKE_FOURCC('m','p','4','a'): + case GST_MAKE_FOURCC ('m', 'p', '4', 'a'): /* MPEG-4 AAC */ - return gst_caps_from_string ("audio/mpeg, " - "mpegversion = (int) 4"); - case GST_MAKE_FOURCC('Q','D','M','2'): + return gst_caps_from_string ("audio/mpeg, " "mpegversion = (int) 4"); + case GST_MAKE_FOURCC ('Q', 'D', 'M', '2'): /* FIXME: QDesign music version 2 (no constant) */ if (QTDEMUX_GUINT32_GET (data) <= 100) { - gst_util_dump_mem ((guint8*)data, 100); + gst_util_dump_mem ((guint8 *) data, 100); return gst_caps_new_simple ("audio/x-qdm2", - "framesize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 52), - "bitrate", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 40), - "blocksize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 44), - NULL); + "framesize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 52), + "bitrate", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 40), + "blocksize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 44), NULL); } - case GST_MAKE_FOURCC('q','t','v','r'): + case GST_MAKE_FOURCC ('q', 't', 'v', 'r'): /* ? */ - case GST_MAKE_FOURCC('Q','D','M','C'): + case GST_MAKE_FOURCC ('Q', 'D', 'M', 'C'): /* QDesign music */ - case GST_MAKE_FOURCC('i','m','a','4'): + case GST_MAKE_FOURCC ('i', 'm', 'a', '4'): /* IMA 4:1 */ - case GST_MAKE_FOURCC('Q','c','l','p'): + case GST_MAKE_FOURCC ('Q', 'c', 'l', 'p'): /* QUALCOMM PureVoice */ - case GST_MAKE_FOURCC('a','g','s','m'): + case GST_MAKE_FOURCC ('a', 'g', 's', 'm'): /* ? */ default: g_critical ("Don't know how to convert fourcc '" GST_FOURCC_FORMAT - "' to caps\n", GST_FOURCC_ARGS(fourcc)); + "' to caps\n", GST_FOURCC_ARGS (fourcc)); return NULL; } } - diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h index 249ef216..ed0f3154 100644 --- a/gst/qtdemux/qtdemux.h +++ b/gst/qtdemux/qtdemux.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_QTDEMUX \ @@ -43,43 +44,45 @@ extern "C" { #define GST_QTDEMUX_MAX_STREAMS 8 -typedef struct _GstQTDemux GstQTDemux; -typedef struct _GstQTDemuxClass GstQTDemuxClass; -typedef struct _QtDemuxStream QtDemuxStream; + typedef struct _GstQTDemux GstQTDemux; + typedef struct _GstQTDemuxClass GstQTDemuxClass; + typedef struct _QtDemuxStream QtDemuxStream; -struct _GstQTDemux { - GstElement element; + struct _GstQTDemux + { + GstElement element; - /* pads */ - GstPad *sinkpad; + /* pads */ + GstPad *sinkpad; - QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; - int n_streams; - int n_video_streams; - int n_audio_streams; + QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; + int n_streams; + int n_video_streams; + int n_audio_streams; - GstByteStream *bs; + GstByteStream *bs; - GNode *moov_node; - GNode *moov_node_compressed; + GNode *moov_node; + GNode *moov_node_compressed; - guint32 timescale; - guint32 duration; + guint32 timescale; + guint32 duration; - int state; + int state; - int offset; + int offset; - /* track stuff */ + /* track stuff */ -}; + }; -struct _GstQTDemuxClass { - GstElementClass parent_class; -}; + struct _GstQTDemuxClass + { + GstElementClass parent_class; + }; #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_QTDEMUX_H__ */ +#endif /* __GST_QTDEMUX_H__ */ diff --git a/gst/rtp/gstrtp-common.h b/gst/rtp/gstrtp-common.h index fb675189..ec4cd947 100644 --- a/gst/rtp/gstrtp-common.h +++ b/gst/rtp/gstrtp-common.h @@ -26,7 +26,7 @@ typedef enum { /* Audio: */ - PAYLOAD_PCMU = 0, /* ITU-T G.711. mu-law audio (RFC 3551) */ + PAYLOAD_PCMU = 0, /* ITU-T G.711. mu-law audio (RFC 3551) */ PAYLOAD_GSM = 3, PAYLOAD_PCMA = 8, /* ITU-T G.711 A-law audio (RFC 3551) */ PAYLOAD_L16_STEREO = 10, diff --git a/gst/rtp/gstrtp.c b/gst/rtp/gstrtp.c index 4f3f7d46..fd1a3aa1 100644 --- a/gst/rtp/gstrtp.c +++ b/gst/rtp/gstrtp.c @@ -27,7 +27,7 @@ #include "gstrtpgsmparse.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_rtpL16enc_plugin_init (plugin) || !gst_rtpL16parse_plugin_init (plugin) || @@ -38,14 +38,8 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "rtp", - "Real-time protocol plugins", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "rtp", + "Real-time protocol plugins", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/rtp/gstrtpL16depay.c b/gst/rtp/gstrtpL16depay.c index 51ec258c..07bfb6a0 100644 --- a/gst/rtp/gstrtpL16depay.c +++ b/gst/rtp/gstrtpL16depay.c @@ -42,43 +42,41 @@ enum }; static GstStaticPadTemplate gst_rtpL16parse_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, 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) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate gst_rtpL16parse_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass); static void gst_rtpL16parse_base_init (GstRtpL16ParseClass * klass); static void gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse); -static void gst_rtpL16parse_chain (GstPad * pad, GstData *_data); +static void gst_rtpL16parse_chain (GstPad * pad, GstData * _data); static void gst_rtpL16parse_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpL16parse_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_rtpL16parse_change_state (GstElement * element); + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_rtpL16parse_change_state (GstElement * + element); static GstElementClass *parent_class = NULL; -static GType gst_rtpL16parse_get_type (void) +static GType +gst_rtpL16parse_get_type (void) { static GType rtpL16parse_type = 0; @@ -95,7 +93,9 @@ static GType gst_rtpL16parse_get_type (void) (GInstanceInitFunc) gst_rtpL16parse_init, }; - rtpL16parse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Parse", &rtpL16parse_info, 0); + rtpL16parse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Parse", + &rtpL16parse_info, 0); } return rtpL16parse_type; } @@ -123,12 +123,12 @@ gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PAYLOAD_TYPE, - g_param_spec_int ("payload_type", "payload_type", "payload type", - G_MININT, G_MAXINT, PAYLOAD_L16_STEREO, G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "frequency", "frequency", - G_MININT, G_MAXINT, 44100, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PAYLOAD_TYPE, + g_param_spec_int ("payload_type", "payload_type", "payload type", + G_MININT, G_MAXINT, PAYLOAD_L16_STEREO, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, + g_param_spec_int ("frequency", "frequency", "frequency", + G_MININT, G_MAXINT, 44100, G_PARAM_READWRITE)); gobject_class->set_property = gst_rtpL16parse_set_property; gobject_class->get_property = gst_rtpL16parse_get_property; @@ -139,10 +139,12 @@ gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass) static void gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse) { - rtpL16parse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16parse_src_template), "src"); - rtpL16parse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16parse_sink_template), "sink"); + rtpL16parse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16parse_src_template), "src"); + rtpL16parse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16parse_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (rtpL16parse), rtpL16parse->srcpad); gst_element_add_pad (GST_ELEMENT (rtpL16parse), rtpL16parse->sinkpad); gst_pad_set_chain_function (rtpL16parse->sinkpad, gst_rtpL16parse_chain); @@ -154,25 +156,27 @@ gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse) } void -gst_rtpL16parse_ntohs (GstBuffer *buf) +gst_rtpL16parse_ntohs (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; ifrequency, @@ -182,26 +186,27 @@ gst_rtpL16_caps_nego (GstRtpL16Parse *rtpL16parse) } void -gst_rtpL16parse_payloadtype_change (GstRtpL16Parse *rtpL16parse, rtp_payload_t pt) +gst_rtpL16parse_payloadtype_change (GstRtpL16Parse * rtpL16parse, + rtp_payload_t pt) { rtpL16parse->payload_type = pt; - + switch (pt) { - case PAYLOAD_L16_MONO: - rtpL16parse->channels = 1; - break; - case PAYLOAD_L16_STEREO: - rtpL16parse->channels = 2; - break; - default: - g_warning ("unknown payload_t %d\n", pt); + case PAYLOAD_L16_MONO: + rtpL16parse->channels = 1; + break; + case PAYLOAD_L16_STEREO: + rtpL16parse->channels = 2; + break; + default: + g_warning ("unknown payload_t %d\n", pt); } gst_rtpL16_caps_nego (rtpL16parse); } static void -gst_rtpL16parse_chain (GstPad * pad, GstData *_data) +gst_rtpL16parse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRtpL16Parse *rtpL16parse; @@ -220,8 +225,9 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); + gst_pad_event_default (pad, event); - + return; } @@ -229,26 +235,30 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) gst_rtpL16_caps_nego (rtpL16parse); } - packet = rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + packet = + rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); pt = rtp_packet_get_payload_type (packet); if (pt != rtpL16parse->payload_type) { - gst_rtpL16parse_payloadtype_change (rtpL16parse, pt); + gst_rtpL16parse_payloadtype_change (rtpL16parse, pt); } outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + GST_BUFFER_TIMESTAMP (outbuf) = + g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + + memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), + GST_BUFFER_SIZE (outbuf)); - memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), GST_BUFFER_SIZE (outbuf)); - - GST_DEBUG ("gst_rtpL16parse_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpL16parse_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpL16parse_ntohs (outbuf); + gst_rtpL16parse_ntohs (outbuf); #endif gst_pad_push (rtpL16parse->srcpad, GST_DATA (outbuf)); @@ -258,7 +268,8 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) } static void -gst_rtpL16parse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpL16parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpL16Parse *rtpL16parse; @@ -279,7 +290,8 @@ gst_rtpL16parse_set_property (GObject * object, guint prop_id, const GValue * va } static void -gst_rtpL16parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpL16parse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpL16Parse *rtpL16parse; @@ -331,5 +343,5 @@ gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16parse", - GST_RANK_NONE, GST_TYPE_RTP_L16_PARSE); + GST_RANK_NONE, GST_TYPE_RTP_L16_PARSE); } diff --git a/gst/rtp/gstrtpL16depay.h b/gst/rtp/gstrtpL16depay.h index dad467bf..b49cf240 100644 --- a/gst/rtp/gstrtpL16depay.h +++ b/gst/rtp/gstrtpL16depay.h @@ -30,26 +30,26 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpL16Parse GstRtpL16Parse; -struct _GstRtpL16Parse -{ - GstElement element; + typedef struct _GstRtpL16Parse GstRtpL16Parse; + struct _GstRtpL16Parse + { + GstElement element; - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; - guint frequency; - guint channels; + guint frequency; + guint channels; - rtp_payload_t payload_type; -}; + rtp_payload_t payload_type; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16ParseClass GstRtpL16ParseClass; -struct _GstRtpL16ParseClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpL16ParseClass GstRtpL16ParseClass; + struct _GstRtpL16ParseClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_PARSE \ @@ -63,7 +63,7 @@ struct _GstRtpL16ParseClass #define GST_IS_RTP_L16_PARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PARSE)) -gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin); + gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpL16enc.c b/gst/rtp/gstrtpL16enc.c index 45d6a95a..0914d2fb 100644 --- a/gst/rtp/gstrtpL16enc.c +++ b/gst/rtp/gstrtpL16enc.c @@ -45,42 +45,40 @@ enum }; static GstStaticPadTemplate gst_rtpL16enc_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +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) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate gst_rtpL16enc_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpL16enc_class_init (GstRtpL16EncClass * klass); static void gst_rtpL16enc_base_init (GstRtpL16EncClass * klass); static void gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc); -static void gst_rtpL16enc_chain (GstPad * pad, GstData *_data); +static void gst_rtpL16enc_chain (GstPad * pad, GstData * _data); static void gst_rtpL16enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpL16enc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstPadLinkReturn gst_rtpL16enc_sinkconnect (GstPad * pad, const GstCaps * caps); + GValue * value, GParamSpec * pspec); +static GstPadLinkReturn gst_rtpL16enc_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementStateReturn gst_rtpL16enc_change_state (GstElement * element); static GstElementClass *parent_class = NULL; -static GType gst_rtpL16enc_get_type (void) +static GType +gst_rtpL16enc_get_type (void) { static GType rtpL16enc_type = 0; @@ -97,7 +95,9 @@ static GType gst_rtpL16enc_get_type (void) (GInstanceInitFunc) gst_rtpL16enc_init, }; - rtpL16enc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Enc", &rtpL16enc_info, 0); + rtpL16enc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Enc", + &rtpL16enc_info, 0); } return rtpL16enc_type; } @@ -134,10 +134,12 @@ gst_rtpL16enc_class_init (GstRtpL16EncClass * klass) static void gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc) { - rtpL16enc->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16enc_sink_template), "sink"); - rtpL16enc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16enc_src_template), "src"); + rtpL16enc->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16enc_sink_template), "sink"); + rtpL16enc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16enc_src_template), "src"); gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->sinkpad); gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->srcpad); gst_pad_set_chain_function (rtpL16enc->sinkpad, gst_rtpL16enc_chain); @@ -146,7 +148,7 @@ gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc) rtpL16enc->frequency = 44100; rtpL16enc->channels = 2; - rtpL16enc->next_time = 0; + rtpL16enc->next_time = 0; rtpL16enc->time_interval = 0; rtpL16enc->seq = 0; @@ -167,31 +169,33 @@ gst_rtpL16enc_sinkconnect (GstPad * pad, const GstCaps * caps) ret = gst_structure_get_int (structure, "rate", &rtpL16enc->frequency); ret &= gst_structure_get_int (structure, "channels", &rtpL16enc->channels); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; /* Pre-calculate what we can */ - rtpL16enc->time_interval = GST_SECOND / (2 * rtpL16enc->channels * rtpL16enc->frequency); + rtpL16enc->time_interval = + GST_SECOND / (2 * rtpL16enc->channels * rtpL16enc->frequency); return GST_PAD_LINK_OK; } void -gst_rtpL16enc_htons (GstBuffer *buf) +gst_rtpL16enc_htons (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; inext_time = 0; - gst_pad_event_default (pad, event); + GST_DEBUG ("discont"); + rtpL16enc->next_time = 0; + gst_pad_event_default (pad, event); return; default: - gst_pad_event_default (pad, event); + gst_pad_event_default (pad, event); return; } } @@ -232,41 +236,47 @@ gst_rtpL16enc_chain (GstPad * pad, GstData *_data) rtp_packet_set_marker (packet, 0); rtp_packet_set_ssrc (packet, g_htonl (rtpL16enc->ssrc)); rtp_packet_set_seq (packet, g_htons (rtpL16enc->seq)); - rtp_packet_set_timestamp (packet, g_htonl ((guint32) rtpL16enc->next_time / GST_SECOND)); + rtp_packet_set_timestamp (packet, + g_htonl ((guint32) rtpL16enc->next_time / GST_SECOND)); if (rtpL16enc->channels == 1) { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_MONO); + rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_MONO); } else { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_STEREO); + rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_STEREO); } /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpL16enc_htons (buf); + gst_rtpL16enc_htons (buf); #endif outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); + GST_BUFFER_SIZE (outbuf) = + rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = rtpL16enc->next_time; - memcpy (GST_BUFFER_DATA (outbuf), packet->data, rtp_packet_get_packet_len (packet)); - memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len(packet), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + memcpy (GST_BUFFER_DATA (outbuf), packet->data, + rtp_packet_get_packet_len (packet)); + memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len (packet), + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - GST_DEBUG ("gst_rtpL16enc_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpL16enc_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); gst_pad_push (rtpL16enc->srcpad, GST_DATA (outbuf)); ++rtpL16enc->seq; rtpL16enc->next_time += rtpL16enc->time_interval * GST_BUFFER_SIZE (buf); - + rtp_packet_free (packet); gst_buffer_unref (buf); } static void -gst_rtpL16enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpL16enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpL16Enc *rtpL16enc; @@ -281,7 +291,8 @@ gst_rtpL16enc_set_property (GObject * object, guint prop_id, const GValue * valu } static void -gst_rtpL16enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpL16enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpL16Enc *rtpL16enc; @@ -330,5 +341,5 @@ gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16enc", - GST_RANK_NONE, GST_TYPE_RTP_L16_ENC); + GST_RANK_NONE, GST_TYPE_RTP_L16_ENC); } diff --git a/gst/rtp/gstrtpL16enc.h b/gst/rtp/gstrtpL16enc.h index 15ed92f6..7e902483 100644 --- a/gst/rtp/gstrtpL16enc.h +++ b/gst/rtp/gstrtpL16enc.h @@ -31,32 +31,32 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpL16Enc GstRtpL16Enc; -struct _GstRtpL16Enc -{ - GstElement element; + typedef struct _GstRtpL16Enc GstRtpL16Enc; + struct _GstRtpL16Enc + { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; - GstPad *sinkpad; - GstPad *srcpad; + guint frequency; + guint channels; - guint frequency; - guint channels; + /* the timestamp of the next frame */ + guint64 next_time; + /* the interval between frames */ + guint64 time_interval; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; - - guint32 ssrc; - guint16 seq; -}; + guint32 ssrc; + guint16 seq; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16EncClass GstRtpL16EncClass; -struct _GstRtpL16EncClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpL16EncClass GstRtpL16EncClass; + struct _GstRtpL16EncClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_ENC \ @@ -70,7 +70,7 @@ struct _GstRtpL16EncClass #define GST_IS_RTP_L16_ENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_ENC)) -gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin); + gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpL16parse.c b/gst/rtp/gstrtpL16parse.c index 51ec258c..07bfb6a0 100644 --- a/gst/rtp/gstrtpL16parse.c +++ b/gst/rtp/gstrtpL16parse.c @@ -42,43 +42,41 @@ enum }; static GstStaticPadTemplate gst_rtpL16parse_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, 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) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate gst_rtpL16parse_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass); static void gst_rtpL16parse_base_init (GstRtpL16ParseClass * klass); static void gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse); -static void gst_rtpL16parse_chain (GstPad * pad, GstData *_data); +static void gst_rtpL16parse_chain (GstPad * pad, GstData * _data); static void gst_rtpL16parse_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpL16parse_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_rtpL16parse_change_state (GstElement * element); + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_rtpL16parse_change_state (GstElement * + element); static GstElementClass *parent_class = NULL; -static GType gst_rtpL16parse_get_type (void) +static GType +gst_rtpL16parse_get_type (void) { static GType rtpL16parse_type = 0; @@ -95,7 +93,9 @@ static GType gst_rtpL16parse_get_type (void) (GInstanceInitFunc) gst_rtpL16parse_init, }; - rtpL16parse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Parse", &rtpL16parse_info, 0); + rtpL16parse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Parse", + &rtpL16parse_info, 0); } return rtpL16parse_type; } @@ -123,12 +123,12 @@ gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PAYLOAD_TYPE, - g_param_spec_int ("payload_type", "payload_type", "payload type", - G_MININT, G_MAXINT, PAYLOAD_L16_STEREO, G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "frequency", "frequency", - G_MININT, G_MAXINT, 44100, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PAYLOAD_TYPE, + g_param_spec_int ("payload_type", "payload_type", "payload type", + G_MININT, G_MAXINT, PAYLOAD_L16_STEREO, G_PARAM_READABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, + g_param_spec_int ("frequency", "frequency", "frequency", + G_MININT, G_MAXINT, 44100, G_PARAM_READWRITE)); gobject_class->set_property = gst_rtpL16parse_set_property; gobject_class->get_property = gst_rtpL16parse_get_property; @@ -139,10 +139,12 @@ gst_rtpL16parse_class_init (GstRtpL16ParseClass * klass) static void gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse) { - rtpL16parse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16parse_src_template), "src"); - rtpL16parse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16parse_sink_template), "sink"); + rtpL16parse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16parse_src_template), "src"); + rtpL16parse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16parse_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (rtpL16parse), rtpL16parse->srcpad); gst_element_add_pad (GST_ELEMENT (rtpL16parse), rtpL16parse->sinkpad); gst_pad_set_chain_function (rtpL16parse->sinkpad, gst_rtpL16parse_chain); @@ -154,25 +156,27 @@ gst_rtpL16parse_init (GstRtpL16Parse * rtpL16parse) } void -gst_rtpL16parse_ntohs (GstBuffer *buf) +gst_rtpL16parse_ntohs (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; ifrequency, @@ -182,26 +186,27 @@ gst_rtpL16_caps_nego (GstRtpL16Parse *rtpL16parse) } void -gst_rtpL16parse_payloadtype_change (GstRtpL16Parse *rtpL16parse, rtp_payload_t pt) +gst_rtpL16parse_payloadtype_change (GstRtpL16Parse * rtpL16parse, + rtp_payload_t pt) { rtpL16parse->payload_type = pt; - + switch (pt) { - case PAYLOAD_L16_MONO: - rtpL16parse->channels = 1; - break; - case PAYLOAD_L16_STEREO: - rtpL16parse->channels = 2; - break; - default: - g_warning ("unknown payload_t %d\n", pt); + case PAYLOAD_L16_MONO: + rtpL16parse->channels = 1; + break; + case PAYLOAD_L16_STEREO: + rtpL16parse->channels = 2; + break; + default: + g_warning ("unknown payload_t %d\n", pt); } gst_rtpL16_caps_nego (rtpL16parse); } static void -gst_rtpL16parse_chain (GstPad * pad, GstData *_data) +gst_rtpL16parse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRtpL16Parse *rtpL16parse; @@ -220,8 +225,9 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); + gst_pad_event_default (pad, event); - + return; } @@ -229,26 +235,30 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) gst_rtpL16_caps_nego (rtpL16parse); } - packet = rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + packet = + rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); pt = rtp_packet_get_payload_type (packet); if (pt != rtpL16parse->payload_type) { - gst_rtpL16parse_payloadtype_change (rtpL16parse, pt); + gst_rtpL16parse_payloadtype_change (rtpL16parse, pt); } outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + GST_BUFFER_TIMESTAMP (outbuf) = + g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + + memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), + GST_BUFFER_SIZE (outbuf)); - memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), GST_BUFFER_SIZE (outbuf)); - - GST_DEBUG ("gst_rtpL16parse_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpL16parse_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpL16parse_ntohs (outbuf); + gst_rtpL16parse_ntohs (outbuf); #endif gst_pad_push (rtpL16parse->srcpad, GST_DATA (outbuf)); @@ -258,7 +268,8 @@ gst_rtpL16parse_chain (GstPad * pad, GstData *_data) } static void -gst_rtpL16parse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpL16parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpL16Parse *rtpL16parse; @@ -279,7 +290,8 @@ gst_rtpL16parse_set_property (GObject * object, guint prop_id, const GValue * va } static void -gst_rtpL16parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpL16parse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpL16Parse *rtpL16parse; @@ -331,5 +343,5 @@ gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16parse", - GST_RANK_NONE, GST_TYPE_RTP_L16_PARSE); + GST_RANK_NONE, GST_TYPE_RTP_L16_PARSE); } diff --git a/gst/rtp/gstrtpL16parse.h b/gst/rtp/gstrtpL16parse.h index dad467bf..b49cf240 100644 --- a/gst/rtp/gstrtpL16parse.h +++ b/gst/rtp/gstrtpL16parse.h @@ -30,26 +30,26 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpL16Parse GstRtpL16Parse; -struct _GstRtpL16Parse -{ - GstElement element; + typedef struct _GstRtpL16Parse GstRtpL16Parse; + struct _GstRtpL16Parse + { + GstElement element; - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; - guint frequency; - guint channels; + guint frequency; + guint channels; - rtp_payload_t payload_type; -}; + rtp_payload_t payload_type; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16ParseClass GstRtpL16ParseClass; -struct _GstRtpL16ParseClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpL16ParseClass GstRtpL16ParseClass; + struct _GstRtpL16ParseClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_PARSE \ @@ -63,7 +63,7 @@ struct _GstRtpL16ParseClass #define GST_IS_RTP_L16_PARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PARSE)) -gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin); + gboolean gst_rtpL16parse_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpL16pay.c b/gst/rtp/gstrtpL16pay.c index 45d6a95a..0914d2fb 100644 --- a/gst/rtp/gstrtpL16pay.c +++ b/gst/rtp/gstrtpL16pay.c @@ -45,42 +45,40 @@ enum }; static GstStaticPadTemplate gst_rtpL16enc_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +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) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstStaticPadTemplate gst_rtpL16enc_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpL16enc_class_init (GstRtpL16EncClass * klass); static void gst_rtpL16enc_base_init (GstRtpL16EncClass * klass); static void gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc); -static void gst_rtpL16enc_chain (GstPad * pad, GstData *_data); +static void gst_rtpL16enc_chain (GstPad * pad, GstData * _data); static void gst_rtpL16enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpL16enc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstPadLinkReturn gst_rtpL16enc_sinkconnect (GstPad * pad, const GstCaps * caps); + GValue * value, GParamSpec * pspec); +static GstPadLinkReturn gst_rtpL16enc_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementStateReturn gst_rtpL16enc_change_state (GstElement * element); static GstElementClass *parent_class = NULL; -static GType gst_rtpL16enc_get_type (void) +static GType +gst_rtpL16enc_get_type (void) { static GType rtpL16enc_type = 0; @@ -97,7 +95,9 @@ static GType gst_rtpL16enc_get_type (void) (GInstanceInitFunc) gst_rtpL16enc_init, }; - rtpL16enc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Enc", &rtpL16enc_info, 0); + rtpL16enc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Enc", + &rtpL16enc_info, 0); } return rtpL16enc_type; } @@ -134,10 +134,12 @@ gst_rtpL16enc_class_init (GstRtpL16EncClass * klass) static void gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc) { - rtpL16enc->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16enc_sink_template), "sink"); - rtpL16enc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpL16enc_src_template), "src"); + rtpL16enc->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16enc_sink_template), "sink"); + rtpL16enc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpL16enc_src_template), "src"); gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->sinkpad); gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->srcpad); gst_pad_set_chain_function (rtpL16enc->sinkpad, gst_rtpL16enc_chain); @@ -146,7 +148,7 @@ gst_rtpL16enc_init (GstRtpL16Enc * rtpL16enc) rtpL16enc->frequency = 44100; rtpL16enc->channels = 2; - rtpL16enc->next_time = 0; + rtpL16enc->next_time = 0; rtpL16enc->time_interval = 0; rtpL16enc->seq = 0; @@ -167,31 +169,33 @@ gst_rtpL16enc_sinkconnect (GstPad * pad, const GstCaps * caps) ret = gst_structure_get_int (structure, "rate", &rtpL16enc->frequency); ret &= gst_structure_get_int (structure, "channels", &rtpL16enc->channels); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; /* Pre-calculate what we can */ - rtpL16enc->time_interval = GST_SECOND / (2 * rtpL16enc->channels * rtpL16enc->frequency); + rtpL16enc->time_interval = + GST_SECOND / (2 * rtpL16enc->channels * rtpL16enc->frequency); return GST_PAD_LINK_OK; } void -gst_rtpL16enc_htons (GstBuffer *buf) +gst_rtpL16enc_htons (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; inext_time = 0; - gst_pad_event_default (pad, event); + GST_DEBUG ("discont"); + rtpL16enc->next_time = 0; + gst_pad_event_default (pad, event); return; default: - gst_pad_event_default (pad, event); + gst_pad_event_default (pad, event); return; } } @@ -232,41 +236,47 @@ gst_rtpL16enc_chain (GstPad * pad, GstData *_data) rtp_packet_set_marker (packet, 0); rtp_packet_set_ssrc (packet, g_htonl (rtpL16enc->ssrc)); rtp_packet_set_seq (packet, g_htons (rtpL16enc->seq)); - rtp_packet_set_timestamp (packet, g_htonl ((guint32) rtpL16enc->next_time / GST_SECOND)); + rtp_packet_set_timestamp (packet, + g_htonl ((guint32) rtpL16enc->next_time / GST_SECOND)); if (rtpL16enc->channels == 1) { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_MONO); + rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_MONO); } else { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_STEREO); + rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_STEREO); } /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpL16enc_htons (buf); + gst_rtpL16enc_htons (buf); #endif outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); + GST_BUFFER_SIZE (outbuf) = + rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = rtpL16enc->next_time; - memcpy (GST_BUFFER_DATA (outbuf), packet->data, rtp_packet_get_packet_len (packet)); - memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len(packet), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + memcpy (GST_BUFFER_DATA (outbuf), packet->data, + rtp_packet_get_packet_len (packet)); + memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len (packet), + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - GST_DEBUG ("gst_rtpL16enc_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpL16enc_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); gst_pad_push (rtpL16enc->srcpad, GST_DATA (outbuf)); ++rtpL16enc->seq; rtpL16enc->next_time += rtpL16enc->time_interval * GST_BUFFER_SIZE (buf); - + rtp_packet_free (packet); gst_buffer_unref (buf); } static void -gst_rtpL16enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpL16enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpL16Enc *rtpL16enc; @@ -281,7 +291,8 @@ gst_rtpL16enc_set_property (GObject * object, guint prop_id, const GValue * valu } static void -gst_rtpL16enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpL16enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpL16Enc *rtpL16enc; @@ -330,5 +341,5 @@ gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16enc", - GST_RANK_NONE, GST_TYPE_RTP_L16_ENC); + GST_RANK_NONE, GST_TYPE_RTP_L16_ENC); } diff --git a/gst/rtp/gstrtpL16pay.h b/gst/rtp/gstrtpL16pay.h index 15ed92f6..7e902483 100644 --- a/gst/rtp/gstrtpL16pay.h +++ b/gst/rtp/gstrtpL16pay.h @@ -31,32 +31,32 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpL16Enc GstRtpL16Enc; -struct _GstRtpL16Enc -{ - GstElement element; + typedef struct _GstRtpL16Enc GstRtpL16Enc; + struct _GstRtpL16Enc + { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; - GstPad *sinkpad; - GstPad *srcpad; + guint frequency; + guint channels; - guint frequency; - guint channels; + /* the timestamp of the next frame */ + guint64 next_time; + /* the interval between frames */ + guint64 time_interval; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; - - guint32 ssrc; - guint16 seq; -}; + guint32 ssrc; + guint16 seq; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16EncClass GstRtpL16EncClass; -struct _GstRtpL16EncClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpL16EncClass GstRtpL16EncClass; + struct _GstRtpL16EncClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_ENC \ @@ -70,7 +70,7 @@ struct _GstRtpL16EncClass #define GST_IS_RTP_L16_ENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_ENC)) -gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin); + gboolean gst_rtpL16enc_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpgsmdepay.c b/gst/rtp/gstrtpgsmdepay.c index 8f1b301a..55b96945 100644 --- a/gst/rtp/gstrtpgsmdepay.c +++ b/gst/rtp/gstrtpgsmdepay.c @@ -42,39 +42,37 @@ enum }; static GstStaticPadTemplate gst_rtpgsmparse_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-gsm, " - "rate = (int) [ 1000, 48000 ]" - ) -); + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]") + ); static GstStaticPadTemplate gst_rtpgsmparse_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, + GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass); static void gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass); static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse); -static void gst_rtpgsmparse_chain (GstPad * pad, GstData *_data); +static void gst_rtpgsmparse_chain (GstPad * pad, GstData * _data); static void gst_rtpgsmparse_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpgsmparse_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_rtpgsmparse_change_state (GstElement * element); + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_rtpgsmparse_change_state (GstElement * + element); static GstElementClass *parent_class = NULL; -static GType gst_rtpgsmparse_get_type (void) +static GType +gst_rtpgsmparse_get_type (void) { static GType rtpgsmparse_type = 0; @@ -91,7 +89,9 @@ static GType gst_rtpgsmparse_get_type (void) (GInstanceInitFunc) gst_rtpgsmparse_init, }; - rtpgsmparse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMParse", &rtpgsmparse_info, 0); + rtpgsmparse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMParse", + &rtpgsmparse_info, 0); } return rtpgsmparse_type; } @@ -102,9 +102,9 @@ gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_rtpgsmparse_src_template)); + gst_static_pad_template_get (&gst_rtpgsmparse_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_rtpgsmparse_sink_template)); + gst_static_pad_template_get (&gst_rtpgsmparse_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_gsmparse_details); } @@ -119,9 +119,9 @@ gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "frequency", "frequency", - G_MININT, G_MAXINT, 8000, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, + g_param_spec_int ("frequency", "frequency", "frequency", + G_MININT, G_MAXINT, 8000, G_PARAM_READWRITE)); gobject_class->set_property = gst_rtpgsmparse_set_property; gobject_class->get_property = gst_rtpgsmparse_get_property; @@ -132,10 +132,12 @@ gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass) static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse) { - rtpgsmparse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_rtpgsmparse_src_template), "src"); - rtpgsmparse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_rtpgsmparse_sink_template), "sink"); + rtpgsmparse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmparse_src_template), "src"); + rtpgsmparse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmparse_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->srcpad); gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->sinkpad); gst_pad_set_chain_function (rtpgsmparse->sinkpad, gst_rtpgsmparse_chain); @@ -144,32 +146,32 @@ gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse) } void -gst_rtpgsmparse_ntohs (GstBuffer *buf) +gst_rtpgsmparse_ntohs (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; ifrequency); + "rate", G_TYPE_INT, rtpgsmparse->frequency); gst_pad_try_set_caps (rtpgsmparse->srcpad, caps); } static void -gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) +gst_rtpgsmparse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRtpGSMParse *rtpgsmparse; @@ -188,8 +190,9 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); + gst_pad_event_default (pad, event); - + return; } @@ -197,7 +200,8 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) gst_rtpgsm_caps_nego (rtpgsmparse); } - packet = rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + packet = + rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); pt = rtp_packet_get_payload_type (packet); @@ -211,15 +215,18 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + GST_BUFFER_TIMESTAMP (outbuf) = + g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + + memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), + GST_BUFFER_SIZE (outbuf)); - memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), GST_BUFFER_SIZE (outbuf)); - - GST_DEBUG ("gst_rtpgsmparse_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpgsmparse_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpgsmparse_ntohs (outbuf); + gst_rtpgsmparse_ntohs (outbuf); #endif gst_pad_push (rtpgsmparse->srcpad, GST_DATA (outbuf)); @@ -229,7 +236,8 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) } static void -gst_rtpgsmparse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpgsmparse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpGSMParse *rtpgsmparse; @@ -247,7 +255,8 @@ gst_rtpgsmparse_set_property (GObject * object, guint prop_id, const GValue * va } static void -gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpGSMParse *rtpgsmparse; @@ -296,5 +305,5 @@ gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmparse", - GST_RANK_NONE, GST_TYPE_RTP_GSM_PARSE); + GST_RANK_NONE, GST_TYPE_RTP_GSM_PARSE); } diff --git a/gst/rtp/gstrtpgsmdepay.h b/gst/rtp/gstrtpgsmdepay.h index 0a006e70..f3b0e659 100644 --- a/gst/rtp/gstrtpgsmdepay.h +++ b/gst/rtp/gstrtpgsmdepay.h @@ -30,23 +30,23 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpGSMParse GstRtpGSMParse; -struct _GstRtpGSMParse -{ - GstElement element; + typedef struct _GstRtpGSMParse GstRtpGSMParse; + struct _GstRtpGSMParse + { + GstElement element; - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; - guint frequency; -}; + guint frequency; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass; -struct _GstRtpGSMParseClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass; + struct _GstRtpGSMParseClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_GSM_PARSE \ @@ -60,7 +60,7 @@ struct _GstRtpGSMParseClass #define GST_IS_RTP_GSM_PARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PARSE)) -gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin); + gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpgsmenc.c b/gst/rtp/gstrtpgsmenc.c index 495e4367..6301dd8c 100644 --- a/gst/rtp/gstrtpgsmenc.c +++ b/gst/rtp/gstrtpgsmenc.c @@ -46,38 +46,36 @@ enum }; static GstStaticPadTemplate gst_rtpgsmenc_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-gsm, " - "rate = (int) [ 1000, 48000 ]" - ) -); + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]") + ); static GstStaticPadTemplate gst_rtpgsmenc_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass); static void gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass); static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc); -static void gst_rtpgsmenc_chain (GstPad * pad, GstData *_data); +static void gst_rtpgsmenc_chain (GstPad * pad, GstData * _data); static void gst_rtpgsmenc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpgsmenc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstPadLinkReturn gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps); + GValue * value, GParamSpec * pspec); +static GstPadLinkReturn gst_rtpgsmenc_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementStateReturn gst_rtpgsmenc_change_state (GstElement * element); static GstElementClass *parent_class = NULL; -static GType gst_rtpgsmenc_get_type (void) +static GType +gst_rtpgsmenc_get_type (void) { static GType rtpgsmenc_type = 0; @@ -94,7 +92,9 @@ static GType gst_rtpgsmenc_get_type (void) (GInstanceInitFunc) gst_rtpgsmenc_init, }; - rtpgsmenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMEnc", &rtpgsmenc_info, 0); + rtpgsmenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMEnc", + &rtpgsmenc_info, 0); } return rtpgsmenc_type; } @@ -131,10 +131,12 @@ gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass) static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc) { - rtpgsmenc->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpgsmenc_sink_template), "sink"); - rtpgsmenc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpgsmenc_sink_template), "src"); + rtpgsmenc->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmenc_sink_template), "sink"); + rtpgsmenc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmenc_sink_template), "src"); gst_element_add_pad (GST_ELEMENT (rtpgsmenc), rtpgsmenc->sinkpad); gst_element_add_pad (GST_ELEMENT (rtpgsmenc), rtpgsmenc->srcpad); gst_pad_set_chain_function (rtpgsmenc->sinkpad, gst_rtpgsmenc_chain); @@ -142,7 +144,7 @@ gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc) rtpgsmenc->frequency = 8000; - rtpgsmenc->next_time = 0; + rtpgsmenc->next_time = 0; rtpgsmenc->time_interval = 0; rtpgsmenc->seq = 0; @@ -161,7 +163,8 @@ gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps) structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rtpgsmenc->frequency); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; /* Pre-calculate what we can */ rtpgsmenc->time_interval = GST_SECOND / (2 * rtpgsmenc->frequency); @@ -171,21 +174,21 @@ gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps) void -gst_rtpgsmenc_htons (GstBuffer *buf) +gst_rtpgsmenc_htons (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; inext_time = 0; - gst_pad_event_default (pad, event); + GST_DEBUG ("discont"); + rtpgsmenc->next_time = 0; + gst_pad_event_default (pad, event); return; default: - gst_pad_event_default (pad, event); + gst_pad_event_default (pad, event); return; } } @@ -226,7 +229,8 @@ gst_rtpgsmenc_chain (GstPad * pad, GstData *_data) rtp_packet_set_marker (packet, 0); rtp_packet_set_ssrc (packet, g_htonl (rtpgsmenc->ssrc)); rtp_packet_set_seq (packet, g_htons (rtpgsmenc->seq)); - rtp_packet_set_timestamp (packet, g_htonl ((guint32) rtpgsmenc->next_time / GST_SECOND)); + rtp_packet_set_timestamp (packet, + g_htonl ((guint32) rtpgsmenc->next_time / GST_SECOND)); rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_GSM); /* FIXME: According to RFC 1890, this is required, right? */ @@ -235,25 +239,30 @@ gst_rtpgsmenc_chain (GstPad * pad, GstData *_data) #endif outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); + GST_BUFFER_SIZE (outbuf) = + rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = rtpgsmenc->next_time; - memcpy (GST_BUFFER_DATA (outbuf), packet->data, rtp_packet_get_packet_len (packet)); - memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len(packet), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + memcpy (GST_BUFFER_DATA (outbuf), packet->data, + rtp_packet_get_packet_len (packet)); + memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len (packet), + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - GST_DEBUG ("gst_rtpgsmenc_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpgsmenc_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); gst_pad_push (rtpgsmenc->srcpad, GST_DATA (outbuf)); ++rtpgsmenc->seq; rtpgsmenc->next_time += rtpgsmenc->time_interval * GST_BUFFER_SIZE (buf); - + rtp_packet_free (packet); gst_buffer_unref (buf); } static void -gst_rtpgsmenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpgsmenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpGSMEnc *rtpgsmenc; @@ -268,7 +277,8 @@ gst_rtpgsmenc_set_property (GObject * object, guint prop_id, const GValue * valu } static void -gst_rtpgsmenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpgsmenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpGSMEnc *rtpgsmenc; @@ -317,5 +327,5 @@ gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmenc", - GST_RANK_NONE, GST_TYPE_RTP_GSM_ENC); + GST_RANK_NONE, GST_TYPE_RTP_GSM_ENC); } diff --git a/gst/rtp/gstrtpgsmenc.h b/gst/rtp/gstrtpgsmenc.h index 1220d402..e44e5dae 100644 --- a/gst/rtp/gstrtpgsmenc.h +++ b/gst/rtp/gstrtpgsmenc.h @@ -31,31 +31,31 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpGSMEnc GstRtpGSMEnc; -struct _GstRtpGSMEnc -{ - GstElement element; + typedef struct _GstRtpGSMEnc GstRtpGSMEnc; + struct _GstRtpGSMEnc + { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; - GstPad *sinkpad; - GstPad *srcpad; + guint frequency; - guint frequency; + /* the timestamp of the next frame */ + guint64 next_time; + /* the interval between frames */ + guint64 time_interval; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; - - guint32 ssrc; - guint16 seq; -}; + guint32 ssrc; + guint16 seq; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass; -struct _GstRtpGSMEncClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass; + struct _GstRtpGSMEncClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_GSM_ENC \ @@ -69,7 +69,7 @@ struct _GstRtpGSMEncClass #define GST_IS_RTP_GSM_ENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_ENC)) -gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin); + gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpgsmparse.c b/gst/rtp/gstrtpgsmparse.c index 8f1b301a..55b96945 100644 --- a/gst/rtp/gstrtpgsmparse.c +++ b/gst/rtp/gstrtpgsmparse.c @@ -42,39 +42,37 @@ enum }; static GstStaticPadTemplate gst_rtpgsmparse_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-gsm, " - "rate = (int) [ 1000, 48000 ]" - ) -); + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]") + ); static GstStaticPadTemplate gst_rtpgsmparse_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, + GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass); static void gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass); static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse); -static void gst_rtpgsmparse_chain (GstPad * pad, GstData *_data); +static void gst_rtpgsmparse_chain (GstPad * pad, GstData * _data); static void gst_rtpgsmparse_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpgsmparse_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstElementStateReturn gst_rtpgsmparse_change_state (GstElement * element); + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_rtpgsmparse_change_state (GstElement * + element); static GstElementClass *parent_class = NULL; -static GType gst_rtpgsmparse_get_type (void) +static GType +gst_rtpgsmparse_get_type (void) { static GType rtpgsmparse_type = 0; @@ -91,7 +89,9 @@ static GType gst_rtpgsmparse_get_type (void) (GInstanceInitFunc) gst_rtpgsmparse_init, }; - rtpgsmparse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMParse", &rtpgsmparse_info, 0); + rtpgsmparse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMParse", + &rtpgsmparse_info, 0); } return rtpgsmparse_type; } @@ -102,9 +102,9 @@ gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_rtpgsmparse_src_template)); + gst_static_pad_template_get (&gst_rtpgsmparse_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_rtpgsmparse_sink_template)); + gst_static_pad_template_get (&gst_rtpgsmparse_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_gsmparse_details); } @@ -119,9 +119,9 @@ gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "frequency", "frequency", - G_MININT, G_MAXINT, 8000, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, + g_param_spec_int ("frequency", "frequency", "frequency", + G_MININT, G_MAXINT, 8000, G_PARAM_READWRITE)); gobject_class->set_property = gst_rtpgsmparse_set_property; gobject_class->get_property = gst_rtpgsmparse_get_property; @@ -132,10 +132,12 @@ gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass) static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse) { - rtpgsmparse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_rtpgsmparse_src_template), "src"); - rtpgsmparse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_rtpgsmparse_sink_template), "sink"); + rtpgsmparse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmparse_src_template), "src"); + rtpgsmparse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmparse_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->srcpad); gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->sinkpad); gst_pad_set_chain_function (rtpgsmparse->sinkpad, gst_rtpgsmparse_chain); @@ -144,32 +146,32 @@ gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse) } void -gst_rtpgsmparse_ntohs (GstBuffer *buf) +gst_rtpgsmparse_ntohs (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; ifrequency); + "rate", G_TYPE_INT, rtpgsmparse->frequency); gst_pad_try_set_caps (rtpgsmparse->srcpad, caps); } static void -gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) +gst_rtpgsmparse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRtpGSMParse *rtpgsmparse; @@ -188,8 +190,9 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); + gst_pad_event_default (pad, event); - + return; } @@ -197,7 +200,8 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) gst_rtpgsm_caps_nego (rtpgsmparse); } - packet = rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + packet = + rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); pt = rtp_packet_get_payload_type (packet); @@ -211,15 +215,18 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + GST_BUFFER_TIMESTAMP (outbuf) = + g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; + + memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), + GST_BUFFER_SIZE (outbuf)); - memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), GST_BUFFER_SIZE (outbuf)); - - GST_DEBUG ("gst_rtpgsmparse_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpgsmparse_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); /* FIXME: According to RFC 1890, this is required, right? */ #if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtpgsmparse_ntohs (outbuf); + gst_rtpgsmparse_ntohs (outbuf); #endif gst_pad_push (rtpgsmparse->srcpad, GST_DATA (outbuf)); @@ -229,7 +236,8 @@ gst_rtpgsmparse_chain (GstPad * pad, GstData *_data) } static void -gst_rtpgsmparse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpgsmparse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpGSMParse *rtpgsmparse; @@ -247,7 +255,8 @@ gst_rtpgsmparse_set_property (GObject * object, guint prop_id, const GValue * va } static void -gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpGSMParse *rtpgsmparse; @@ -296,5 +305,5 @@ gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmparse", - GST_RANK_NONE, GST_TYPE_RTP_GSM_PARSE); + GST_RANK_NONE, GST_TYPE_RTP_GSM_PARSE); } diff --git a/gst/rtp/gstrtpgsmparse.h b/gst/rtp/gstrtpgsmparse.h index 0a006e70..f3b0e659 100644 --- a/gst/rtp/gstrtpgsmparse.h +++ b/gst/rtp/gstrtpgsmparse.h @@ -30,23 +30,23 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpGSMParse GstRtpGSMParse; -struct _GstRtpGSMParse -{ - GstElement element; + typedef struct _GstRtpGSMParse GstRtpGSMParse; + struct _GstRtpGSMParse + { + GstElement element; - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; - guint frequency; -}; + guint frequency; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass; -struct _GstRtpGSMParseClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass; + struct _GstRtpGSMParseClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_GSM_PARSE \ @@ -60,7 +60,7 @@ struct _GstRtpGSMParseClass #define GST_IS_RTP_GSM_PARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PARSE)) -gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin); + gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/gstrtpgsmpay.c b/gst/rtp/gstrtpgsmpay.c index 495e4367..6301dd8c 100644 --- a/gst/rtp/gstrtpgsmpay.c +++ b/gst/rtp/gstrtpgsmpay.c @@ -46,38 +46,36 @@ enum }; static GstStaticPadTemplate gst_rtpgsmenc_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-gsm, " - "rate = (int) [ 1000, 48000 ]" - ) -); + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]") + ); static GstStaticPadTemplate gst_rtpgsmenc_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") -); + ); static void gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass); static void gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass); static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc); -static void gst_rtpgsmenc_chain (GstPad * pad, GstData *_data); +static void gst_rtpgsmenc_chain (GstPad * pad, GstData * _data); static void gst_rtpgsmenc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); + const GValue * value, GParamSpec * pspec); static void gst_rtpgsmenc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstPadLinkReturn gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps); + GValue * value, GParamSpec * pspec); +static GstPadLinkReturn gst_rtpgsmenc_sinkconnect (GstPad * pad, + const GstCaps * caps); static GstElementStateReturn gst_rtpgsmenc_change_state (GstElement * element); static GstElementClass *parent_class = NULL; -static GType gst_rtpgsmenc_get_type (void) +static GType +gst_rtpgsmenc_get_type (void) { static GType rtpgsmenc_type = 0; @@ -94,7 +92,9 @@ static GType gst_rtpgsmenc_get_type (void) (GInstanceInitFunc) gst_rtpgsmenc_init, }; - rtpgsmenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMEnc", &rtpgsmenc_info, 0); + rtpgsmenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMEnc", + &rtpgsmenc_info, 0); } return rtpgsmenc_type; } @@ -131,10 +131,12 @@ gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass) static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc) { - rtpgsmenc->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpgsmenc_sink_template), "sink"); - rtpgsmenc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_rtpgsmenc_sink_template), "src"); + rtpgsmenc->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmenc_sink_template), "sink"); + rtpgsmenc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_rtpgsmenc_sink_template), "src"); gst_element_add_pad (GST_ELEMENT (rtpgsmenc), rtpgsmenc->sinkpad); gst_element_add_pad (GST_ELEMENT (rtpgsmenc), rtpgsmenc->srcpad); gst_pad_set_chain_function (rtpgsmenc->sinkpad, gst_rtpgsmenc_chain); @@ -142,7 +144,7 @@ gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc) rtpgsmenc->frequency = 8000; - rtpgsmenc->next_time = 0; + rtpgsmenc->next_time = 0; rtpgsmenc->time_interval = 0; rtpgsmenc->seq = 0; @@ -161,7 +163,8 @@ gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps) structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rtpgsmenc->frequency); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; /* Pre-calculate what we can */ rtpgsmenc->time_interval = GST_SECOND / (2 * rtpgsmenc->frequency); @@ -171,21 +174,21 @@ gst_rtpgsmenc_sinkconnect (GstPad * pad, const GstCaps * caps) void -gst_rtpgsmenc_htons (GstBuffer *buf) +gst_rtpgsmenc_htons (GstBuffer * buf) { gint16 *i, *len; /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA(buf); + i = (gint16 *) GST_BUFFER_DATA (buf); len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); - for (; inext_time = 0; - gst_pad_event_default (pad, event); + GST_DEBUG ("discont"); + rtpgsmenc->next_time = 0; + gst_pad_event_default (pad, event); return; default: - gst_pad_event_default (pad, event); + gst_pad_event_default (pad, event); return; } } @@ -226,7 +229,8 @@ gst_rtpgsmenc_chain (GstPad * pad, GstData *_data) rtp_packet_set_marker (packet, 0); rtp_packet_set_ssrc (packet, g_htonl (rtpgsmenc->ssrc)); rtp_packet_set_seq (packet, g_htons (rtpgsmenc->seq)); - rtp_packet_set_timestamp (packet, g_htonl ((guint32) rtpgsmenc->next_time / GST_SECOND)); + rtp_packet_set_timestamp (packet, + g_htonl ((guint32) rtpgsmenc->next_time / GST_SECOND)); rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_GSM); /* FIXME: According to RFC 1890, this is required, right? */ @@ -235,25 +239,30 @@ gst_rtpgsmenc_chain (GstPad * pad, GstData *_data) #endif outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); + GST_BUFFER_SIZE (outbuf) = + rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = rtpgsmenc->next_time; - memcpy (GST_BUFFER_DATA (outbuf), packet->data, rtp_packet_get_packet_len (packet)); - memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len(packet), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + memcpy (GST_BUFFER_DATA (outbuf), packet->data, + rtp_packet_get_packet_len (packet)); + memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len (packet), + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - GST_DEBUG ("gst_rtpgsmenc_chain: pushing buffer of size %d", GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("gst_rtpgsmenc_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); gst_pad_push (rtpgsmenc->srcpad, GST_DATA (outbuf)); ++rtpgsmenc->seq; rtpgsmenc->next_time += rtpgsmenc->time_interval * GST_BUFFER_SIZE (buf); - + rtp_packet_free (packet); gst_buffer_unref (buf); } static void -gst_rtpgsmenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_rtpgsmenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstRtpGSMEnc *rtpgsmenc; @@ -268,7 +277,8 @@ gst_rtpgsmenc_set_property (GObject * object, guint prop_id, const GValue * valu } static void -gst_rtpgsmenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_rtpgsmenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstRtpGSMEnc *rtpgsmenc; @@ -317,5 +327,5 @@ gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmenc", - GST_RANK_NONE, GST_TYPE_RTP_GSM_ENC); + GST_RANK_NONE, GST_TYPE_RTP_GSM_ENC); } diff --git a/gst/rtp/gstrtpgsmpay.h b/gst/rtp/gstrtpgsmpay.h index 1220d402..e44e5dae 100644 --- a/gst/rtp/gstrtpgsmpay.h +++ b/gst/rtp/gstrtpgsmpay.h @@ -31,31 +31,31 @@ extern "C" #endif /* __cplusplus */ /* Definition of structure storing data for this element. */ -typedef struct _GstRtpGSMEnc GstRtpGSMEnc; -struct _GstRtpGSMEnc -{ - GstElement element; + typedef struct _GstRtpGSMEnc GstRtpGSMEnc; + struct _GstRtpGSMEnc + { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; - GstPad *sinkpad; - GstPad *srcpad; + guint frequency; - guint frequency; + /* the timestamp of the next frame */ + guint64 next_time; + /* the interval between frames */ + guint64 time_interval; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; - - guint32 ssrc; - guint16 seq; -}; + guint32 ssrc; + guint16 seq; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass; -struct _GstRtpGSMEncClass -{ - GstElementClass parent_class; -}; + typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass; + struct _GstRtpGSMEncClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_GSM_ENC \ @@ -69,7 +69,7 @@ struct _GstRtpGSMEncClass #define GST_IS_RTP_GSM_ENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_ENC)) -gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin); + gboolean gst_rtpgsmenc_plugin_init (GstPlugin * plugin); #ifdef __cplusplus } diff --git a/gst/rtp/rtp-packet.c b/gst/rtp/rtp-packet.c index 11077ef6..f33772b5 100644 --- a/gst/rtp/rtp-packet.c +++ b/gst/rtp/rtp-packet.c @@ -33,65 +33,64 @@ #include "rtp-packet.h" Rtp_Packet -rtp_packet_new_take_data(gpointer data, guint data_len) +rtp_packet_new_take_data (gpointer data, guint data_len) { Rtp_Packet packet; //g_return_val_if_fail(data_len < RTP_MTU, NULL); - packet = g_malloc(sizeof *packet); + packet = g_malloc (sizeof *packet); - packet -> data = data; - packet -> data_len = data_len; + packet->data = data; + packet->data_len = data_len; return packet; } Rtp_Packet -rtp_packet_new_copy_data(gpointer data, guint data_len) +rtp_packet_new_copy_data (gpointer data, guint data_len) { Rtp_Packet packet; //g_return_val_if_fail(data_len < RTP_MTU, NULL); - packet = g_malloc(sizeof *packet); + packet = g_malloc (sizeof *packet); - packet -> data = g_memdup(data, data_len); - packet -> data_len = data_len; + packet->data = g_memdup (data, data_len); + packet->data_len = data_len; return packet; } Rtp_Packet -rtp_packet_new_allocate(guint payload_len, guint pad_len, guint csrc_count) +rtp_packet_new_allocate (guint payload_len, guint pad_len, guint csrc_count) { guint len; Rtp_Packet packet; - g_return_val_if_fail(csrc_count <= 15, NULL); + g_return_val_if_fail (csrc_count <= 15, NULL); - len = RTP_HEADER_LEN - + csrc_count * sizeof(guint32) - + payload_len + pad_len; + len = RTP_HEADER_LEN + csrc_count * sizeof (guint32) + + payload_len + pad_len; //g_return_val_if_fail(len < RTP_MTU, NULL); - packet = g_malloc(sizeof *packet); + packet = g_malloc (sizeof *packet); - packet -> data_len = len; - packet -> data = g_malloc(len); + packet->data_len = len; + packet->data = g_malloc (len); - return(packet); + return (packet); } void -rtp_packet_free(Rtp_Packet packet) +rtp_packet_free (Rtp_Packet packet) { - g_return_if_fail(packet != NULL); + g_return_if_fail (packet != NULL); - g_free(packet -> data); - g_free(packet); + g_free (packet->data); + g_free (packet); } /*Rtp_Packet @@ -124,187 +123,185 @@ rtp_packet_send(Rtp_Packet packet, int fd, struct sockaddr *toaddr, socklen_t to }*/ guint8 -rtp_packet_get_version(Rtp_Packet packet) +rtp_packet_get_version (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> version; + return ((Rtp_Header) packet->data)->version; } void -rtp_packet_set_version(Rtp_Packet packet, guint8 version) +rtp_packet_set_version (Rtp_Packet packet, guint8 version) { - g_return_if_fail(packet != NULL); - g_return_if_fail(version < 0x04); + g_return_if_fail (packet != NULL); + g_return_if_fail (version < 0x04); - ((Rtp_Header) packet -> data) -> version = version; + ((Rtp_Header) packet->data)->version = version; } guint8 -rtp_packet_get_padding(Rtp_Packet packet) +rtp_packet_get_padding (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> padding; + return ((Rtp_Header) packet->data)->padding; } void -rtp_packet_set_padding(Rtp_Packet packet, guint8 padding) +rtp_packet_set_padding (Rtp_Packet packet, guint8 padding) { - g_return_if_fail(packet != NULL); - g_return_if_fail(padding < 0x02); + g_return_if_fail (packet != NULL); + g_return_if_fail (padding < 0x02); - ((Rtp_Header) packet -> data) -> padding = padding; + ((Rtp_Header) packet->data)->padding = padding; } guint8 -rtp_packet_get_csrc_count(Rtp_Packet packet) +rtp_packet_get_csrc_count (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> csrc_count; + return ((Rtp_Header) packet->data)->csrc_count; } guint8 -rtp_packet_get_extension(Rtp_Packet packet) +rtp_packet_get_extension (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> extension; + return ((Rtp_Header) packet->data)->extension; } void -rtp_packet_set_extension(Rtp_Packet packet, guint8 extension) +rtp_packet_set_extension (Rtp_Packet packet, guint8 extension) { - g_return_if_fail(packet != NULL); - g_return_if_fail(extension < 0x02); + g_return_if_fail (packet != NULL); + g_return_if_fail (extension < 0x02); - ((Rtp_Header) packet -> data) -> extension = extension; + ((Rtp_Header) packet->data)->extension = extension; } void -rtp_packet_set_csrc_count(Rtp_Packet packet, guint8 csrc_count) +rtp_packet_set_csrc_count (Rtp_Packet packet, guint8 csrc_count) { - g_return_if_fail(packet != NULL); - g_return_if_fail(csrc_count < 0x04); + g_return_if_fail (packet != NULL); + g_return_if_fail (csrc_count < 0x04); - ((Rtp_Header) packet -> data) -> csrc_count = csrc_count; + ((Rtp_Header) packet->data)->csrc_count = csrc_count; } guint8 -rtp_packet_get_marker(Rtp_Packet packet) +rtp_packet_get_marker (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> marker; + return ((Rtp_Header) packet->data)->marker; } void -rtp_packet_set_marker(Rtp_Packet packet, guint8 marker) +rtp_packet_set_marker (Rtp_Packet packet, guint8 marker) { - g_return_if_fail(packet != NULL); - g_return_if_fail(marker < 0x02); + g_return_if_fail (packet != NULL); + g_return_if_fail (marker < 0x02); - ((Rtp_Header) packet -> data) -> marker = marker; + ((Rtp_Header) packet->data)->marker = marker; } guint8 -rtp_packet_get_payload_type(Rtp_Packet packet) +rtp_packet_get_payload_type (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return ((Rtp_Header) packet -> data) -> payload_type; + return ((Rtp_Header) packet->data)->payload_type; } void -rtp_packet_set_payload_type(Rtp_Packet packet, guint8 payload_type) +rtp_packet_set_payload_type (Rtp_Packet packet, guint8 payload_type) { - g_return_if_fail(packet != NULL); - g_return_if_fail(payload_type < 0x80); + g_return_if_fail (packet != NULL); + g_return_if_fail (payload_type < 0x80); - ((Rtp_Header) packet -> data) -> payload_type = payload_type; + ((Rtp_Header) packet->data)->payload_type = payload_type; } guint16 -rtp_packet_get_seq(Rtp_Packet packet) +rtp_packet_get_seq (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return g_ntohs(((Rtp_Header) packet -> data) -> seq); + return g_ntohs (((Rtp_Header) packet->data)->seq); } void -rtp_packet_set_seq(Rtp_Packet packet, guint16 seq) +rtp_packet_set_seq (Rtp_Packet packet, guint16 seq) { - g_return_if_fail(packet != NULL); + g_return_if_fail (packet != NULL); - ((Rtp_Header) packet -> data) -> seq = g_htons(seq); + ((Rtp_Header) packet->data)->seq = g_htons (seq); } guint32 -rtp_packet_get_timestamp(Rtp_Packet packet) +rtp_packet_get_timestamp (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return g_ntohl(((Rtp_Header) packet -> data) -> timestamp); + return g_ntohl (((Rtp_Header) packet->data)->timestamp); } void -rtp_packet_set_timestamp(Rtp_Packet packet, guint32 timestamp) +rtp_packet_set_timestamp (Rtp_Packet packet, guint32 timestamp) { - g_return_if_fail(packet != NULL); + g_return_if_fail (packet != NULL); - ((Rtp_Header) packet -> data) -> timestamp = g_htonl(timestamp); + ((Rtp_Header) packet->data)->timestamp = g_htonl (timestamp); } guint32 -rtp_packet_get_ssrc(Rtp_Packet packet) +rtp_packet_get_ssrc (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return g_ntohl(((Rtp_Header) packet -> data) -> ssrc); + return g_ntohl (((Rtp_Header) packet->data)->ssrc); } void -rtp_packet_set_ssrc(Rtp_Packet packet, guint32 ssrc) +rtp_packet_set_ssrc (Rtp_Packet packet, guint32 ssrc) { - g_return_if_fail(packet != NULL); + g_return_if_fail (packet != NULL); - ((Rtp_Header) packet -> data) -> ssrc = g_htonl(ssrc); + ((Rtp_Header) packet->data)->ssrc = g_htonl (ssrc); } guint -rtp_packet_get_payload_len(Rtp_Packet packet) +rtp_packet_get_payload_len (Rtp_Packet packet) { guint len; - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - len = packet -> data_len - - RTP_HEADER_LEN - - rtp_packet_get_csrc_count(packet) * sizeof(guint32); + len = packet->data_len + - RTP_HEADER_LEN - rtp_packet_get_csrc_count (packet) * sizeof (guint32); - if (rtp_packet_get_padding(packet)) { - len -= ((guint8 *) packet -> data)[packet -> data_len - 1]; + if (rtp_packet_get_padding (packet)) { + len -= ((guint8 *) packet->data)[packet->data_len - 1]; } return len; } gpointer -rtp_packet_get_payload(Rtp_Packet packet) +rtp_packet_get_payload (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, NULL); + g_return_val_if_fail (packet != NULL, NULL); - return ((char *) packet -> data) - + RTP_HEADER_LEN - + rtp_packet_get_csrc_count(packet) * sizeof(guint32); + return ((char *) packet->data) + + RTP_HEADER_LEN + rtp_packet_get_csrc_count (packet) * sizeof (guint32); } guint -rtp_packet_get_packet_len(Rtp_Packet packet) +rtp_packet_get_packet_len (Rtp_Packet packet) { - g_return_val_if_fail(packet != NULL, 0); + g_return_val_if_fail (packet != NULL, 0); - return packet -> data_len; + return packet->data_len; } diff --git a/gst/rtp/rtp-packet.h b/gst/rtp/rtp-packet.h index f731c5f0..b130c86e 100644 --- a/gst/rtp/rtp-packet.h +++ b/gst/rtp/rtp-packet.h @@ -30,77 +30,80 @@ #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #define RTP_VERSION 2 #define RTP_HEADER_LEN 12 #define RTP_MTU 2048 -typedef struct Rtp_Header *Rtp_Header; + typedef struct Rtp_Header *Rtp_Header; -struct Rtp_Packet_Struct { - gpointer data; - guint data_len; -}; + struct Rtp_Packet_Struct + { + gpointer data; + guint data_len; + }; -struct Rtp_Header { + struct Rtp_Header + { #if G_BYTE_ORDER == G_LITTLE_ENDIAN - unsigned int csrc_count:4; /* CSRC count */ - unsigned int extension:1; /* header extension flag */ - unsigned int padding:1; /* padding flag */ - unsigned int version:2; /* protocol version */ - unsigned int payload_type:7; /* payload type */ - unsigned int marker:1; /* marker bit */ + unsigned int csrc_count:4; /* CSRC count */ + unsigned int extension:1; /* header extension flag */ + unsigned int padding:1; /* padding flag */ + unsigned int version:2; /* protocol version */ + unsigned int payload_type:7; /* payload type */ + unsigned int marker:1; /* marker bit */ #elif G_BYTE_ORDER == G_BIG_ENDIAN - unsigned int version:2; /* protocol version */ - unsigned int padding:1; /* padding flag */ - unsigned int extension:1; /* header extension flag */ - unsigned int csrc_count:4; /* CSRC count */ - unsigned int marker:1; /* marker bit */ - unsigned int payload_type:7; /* payload type */ + unsigned int version:2; /* protocol version */ + unsigned int padding:1; /* padding flag */ + unsigned int extension:1; /* header extension flag */ + unsigned int csrc_count:4; /* CSRC count */ + unsigned int marker:1; /* marker bit */ + unsigned int payload_type:7; /* payload type */ #else #error "G_BYTE_ORDER should be big or little endian." #endif - guint16 seq; /* sequence number */ - guint32 timestamp; /* timestamp */ - guint32 ssrc; /* synchronization source */ - guint32 csrc[1]; /* optional CSRC list */ -}; + guint16 seq; /* sequence number */ + guint32 timestamp; /* timestamp */ + guint32 ssrc; /* synchronization source */ + guint32 csrc[1]; /* optional CSRC list */ + }; -typedef struct Rtp_Packet_Struct *Rtp_Packet; + typedef struct Rtp_Packet_Struct *Rtp_Packet; -Rtp_Packet rtp_packet_new_take_data(gpointer data, guint data_len); -Rtp_Packet rtp_packet_new_copy_data(gpointer data, guint data_len); -Rtp_Packet rtp_packet_new_allocate(guint payload_len, - guint pad_len, guint csrc_count); -void rtp_packet_free(Rtp_Packet packet); + Rtp_Packet rtp_packet_new_take_data (gpointer data, guint data_len); + Rtp_Packet rtp_packet_new_copy_data (gpointer data, guint data_len); + Rtp_Packet rtp_packet_new_allocate (guint payload_len, + guint pad_len, guint csrc_count); + void rtp_packet_free (Rtp_Packet packet); //Rtp_Packet rtp_packet_read(int fd, struct sockaddr *fromaddr, socklen_t *fromlen); //void rtp_packet_send(Rtp_Packet packet, int fd, struct sockaddr *toaddr, socklen_t tolen); -guint8 rtp_packet_get_version(Rtp_Packet packet); -void rtp_packet_set_version(Rtp_Packet packet, guint8 version); -guint8 rtp_packet_get_padding(Rtp_Packet packet); -void rtp_packet_set_padding(Rtp_Packet packet, guint8 padding); -guint8 rtp_packet_get_csrc_count(Rtp_Packet packet); -guint8 rtp_packet_get_extension(Rtp_Packet packet); -void rtp_packet_set_extension(Rtp_Packet packet, guint8 extension); -void rtp_packet_set_csrc_count(Rtp_Packet packet, guint8 csrc_count); -guint8 rtp_packet_get_marker(Rtp_Packet packet); -void rtp_packet_set_marker(Rtp_Packet packet, guint8 marker); -guint8 rtp_packet_get_payload_type(Rtp_Packet packet); -void rtp_packet_set_payload_type(Rtp_Packet packet, guint8 payload_type); -guint16 rtp_packet_get_seq(Rtp_Packet packet); -void rtp_packet_set_seq(Rtp_Packet packet, guint16 seq); -guint32 rtp_packet_get_timestamp(Rtp_Packet packet); -void rtp_packet_set_timestamp(Rtp_Packet packet, guint32 timestamp); -guint32 rtp_packet_get_ssrc(Rtp_Packet packet); -void rtp_packet_set_ssrc(Rtp_Packet packet, guint32 ssrc); -guint rtp_packet_get_payload_len(Rtp_Packet packet); -gpointer rtp_packet_get_payload(Rtp_Packet packet); -guint rtp_packet_get_packet_len(Rtp_Packet packet); + guint8 rtp_packet_get_version (Rtp_Packet packet); + void rtp_packet_set_version (Rtp_Packet packet, guint8 version); + guint8 rtp_packet_get_padding (Rtp_Packet packet); + void rtp_packet_set_padding (Rtp_Packet packet, guint8 padding); + guint8 rtp_packet_get_csrc_count (Rtp_Packet packet); + guint8 rtp_packet_get_extension (Rtp_Packet packet); + void rtp_packet_set_extension (Rtp_Packet packet, guint8 extension); + void rtp_packet_set_csrc_count (Rtp_Packet packet, guint8 csrc_count); + guint8 rtp_packet_get_marker (Rtp_Packet packet); + void rtp_packet_set_marker (Rtp_Packet packet, guint8 marker); + guint8 rtp_packet_get_payload_type (Rtp_Packet packet); + void rtp_packet_set_payload_type (Rtp_Packet packet, guint8 payload_type); + guint16 rtp_packet_get_seq (Rtp_Packet packet); + void rtp_packet_set_seq (Rtp_Packet packet, guint16 seq); + guint32 rtp_packet_get_timestamp (Rtp_Packet packet); + void rtp_packet_set_timestamp (Rtp_Packet packet, guint32 timestamp); + guint32 rtp_packet_get_ssrc (Rtp_Packet packet); + void rtp_packet_set_ssrc (Rtp_Packet packet, guint32 ssrc); + guint rtp_packet_get_payload_len (Rtp_Packet packet); + gpointer rtp_packet_get_payload (Rtp_Packet packet); + guint rtp_packet_get_packet_len (Rtp_Packet packet); #ifdef __cplusplus } #endif -#endif /* rtp-packet.h */ +#endif /* rtp-packet.h */ diff --git a/gst/smoothwave/demo-osssrc.c b/gst/smoothwave/demo-osssrc.c index 457900d7..c39bc72c 100644 --- a/gst/smoothwave/demo-osssrc.c +++ b/gst/smoothwave/demo-osssrc.c @@ -3,11 +3,13 @@ extern gboolean _gst_plugin_spew; -gboolean idle_func(gpointer data); +gboolean idle_func (gpointer data); GtkWidget *drawingarea; -int main(int argc,char *argv[]) { +int +main (int argc, char *argv[]) +{ GstElement *bin; GstElementFactory *srcfactory; GstElement *src; @@ -16,46 +18,47 @@ int main(int argc,char *argv[]) { GtkWidget *wave_widget; GtkWidget *appwindow; - gst_init(&argc,&argv); - gst_plugin_load("libsmoothwave.so"); - gtk_init(&argc,&argv); + gst_init (&argc, &argv); + gst_plugin_load ("libsmoothwave.so"); + gtk_init (&argc, &argv); - bin = gst_pipeline_new("bin"); + bin = gst_pipeline_new ("bin"); - srcfactory = gst_element_factory_find("sinesrc"); - g_return_val_if_fail(srcfactory != NULL, -1); - wavefactory = gst_element_factory_find("smoothwave"); - g_return_val_if_fail(wavefactory != NULL, -1); + srcfactory = gst_element_factory_find ("sinesrc"); + g_return_val_if_fail (srcfactory != NULL, -1); + wavefactory = gst_element_factory_find ("smoothwave"); + g_return_val_if_fail (wavefactory != NULL, -1); - src = gst_element_factory_create(srcfactory,"src"); + src = gst_element_factory_create (srcfactory, "src"); //g_object_set(G_OBJECT(src),"bytes_per_read",(gulong)2048,NULL); - wave = gst_element_factory_create(wavefactory,"wave"); - g_object_set(G_OBJECT(wave),"width",256,"height",100,NULL); + wave = gst_element_factory_create (wavefactory, "wave"); + g_object_set (G_OBJECT (wave), "width", 256, "height", 100, NULL); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(src)); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(wave)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (src)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (wave)); - gst_pad_link(gst_element_get_pad(src,"src"), - gst_element_get_pad(wave,"sink")); + gst_pad_link (gst_element_get_pad (src, "src"), + gst_element_get_pad (wave, "sink")); - appwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_object_get(G_OBJECT(wave),"widget",&wave_widget,NULL); - gtk_container_add(GTK_CONTAINER(appwindow), wave_widget); - gtk_widget_show_all(appwindow); + appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_object_get (G_OBJECT (wave), "widget", &wave_widget, NULL); + gtk_container_add (GTK_CONTAINER (appwindow), wave_widget); + gtk_widget_show_all (appwindow); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_READY); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_PLAYING); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING); - g_idle_add(idle_func,bin); + g_idle_add (idle_func, bin); - gtk_main(); + gtk_main (); return 0; } -gboolean idle_func(gpointer data) +gboolean +idle_func (gpointer data) { - gst_bin_iterate(GST_BIN(data)); + gst_bin_iterate (GST_BIN (data)); return TRUE; } diff --git a/gst/smoothwave/gstsmoothwave.c b/gst/smoothwave/gstsmoothwave.c index 57c267e5..2abbdec2 100644 --- a/gst/smoothwave/gstsmoothwave.c +++ b/gst/smoothwave/gstsmoothwave.c @@ -25,37 +25,41 @@ #include "gstsmoothwave.h" -static GstElementDetails gst_smoothwave_details = GST_ELEMENT_DETAILS ( - "Smooth waveform", - "Visualization", - "Fading grayscale waveform display", - "Erik Walthinsen " -); +static GstElementDetails gst_smoothwave_details = +GST_ELEMENT_DETAILS ("Smooth waveform", + "Visualization", + "Fading grayscale waveform display", + "Erik Walthinsen "); /* SmoothWave signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_WIDTH, ARG_HEIGHT, ARG_WIDGET, }; -static void gst_smoothwave_base_init (gpointer g_class); -static void gst_smoothwave_class_init (GstSmoothWaveClass *klass); -static void gst_smoothwave_init (GstSmoothWave *smoothwave); +static void gst_smoothwave_base_init (gpointer g_class); +static void gst_smoothwave_class_init (GstSmoothWaveClass * klass); +static void gst_smoothwave_init (GstSmoothWave * smoothwave); -static void gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_smoothwave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smoothwave_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_smoothwave_chain (GstPad *pad, GstData *_data); +static void gst_smoothwave_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_smoothwave_signals[LAST_SIGNAL] = { 0 }; */ @@ -66,17 +70,19 @@ gst_smoothwave_get_type (void) if (!smoothwave_type) { static const GTypeInfo smoothwave_info = { - sizeof(GstSmoothWaveClass), + sizeof (GstSmoothWaveClass), gst_smoothwave_base_init, NULL, - (GClassInitFunc)gst_smoothwave_class_init, + (GClassInitFunc) gst_smoothwave_class_init, NULL, NULL, - sizeof(GstSmoothWave), + sizeof (GstSmoothWave), 0, - (GInstanceInitFunc)gst_smoothwave_init, + (GInstanceInitFunc) gst_smoothwave_init, }; - smoothwave_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSmoothWave", &smoothwave_info, 0); + smoothwave_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSmoothWave", + &smoothwave_info, 0); } return smoothwave_type; } @@ -90,83 +96,77 @@ gst_smoothwave_base_init (gpointer g_class) } static void -gst_smoothwave_class_init (GstSmoothWaveClass *klass) +gst_smoothwave_class_init (GstSmoothWaveClass * 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); - 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_WIDGET, - g_param_spec_object("widget","widget","widget", - GTK_TYPE_WIDGET,G_PARAM_READABLE)); /* CHECKME! */ + 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_WIDGET, g_param_spec_object ("widget", "widget", "widget", GTK_TYPE_WIDGET, G_PARAM_READABLE)); /* CHECKME! */ gobject_class->set_property = gst_smoothwave_set_property; gobject_class->get_property = gst_smoothwave_get_property; } static void -gst_smoothwave_init (GstSmoothWave *smoothwave) +gst_smoothwave_init (GstSmoothWave * smoothwave) { int i; guint32 palette[256]; - smoothwave->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(smoothwave),smoothwave->sinkpad); - gst_pad_set_chain_function(smoothwave->sinkpad,gst_smoothwave_chain); - smoothwave->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(smoothwave),smoothwave->srcpad); + smoothwave->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (smoothwave), smoothwave->sinkpad); + gst_pad_set_chain_function (smoothwave->sinkpad, gst_smoothwave_chain); + smoothwave->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (smoothwave), smoothwave->srcpad); /* smoothwave->meta = NULL; */ smoothwave->width = 512; smoothwave->height = 256; - gdk_rgb_init(); + gdk_rgb_init (); /* gtk_widget_set_default_colormap (gdk_rgb_get_cmap()); */ /* gtk_widget_set_default_visual (gdk_rgb_get_visual()); */ /* GST_DEBUG ("creating palette"); */ - for (i=0;i<256;i++) + for (i = 0; i < 256; i++) palette[i] = (i << 16) || (i << 8); /* GST_DEBUG ("creating cmap"); */ - smoothwave->cmap = gdk_rgb_cmap_new(palette,256); + smoothwave->cmap = gdk_rgb_cmap_new (palette, 256); /* GST_DEBUG ("created cmap"); */ /* gtk_widget_set_default_colormap (smoothwave->cmap); */ - smoothwave->image = gtk_drawing_area_new(); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_show(smoothwave->image); + smoothwave->image = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_show (smoothwave->image); - smoothwave->imagebuffer = g_malloc(smoothwave->width*smoothwave->height); - memset(smoothwave->imagebuffer,0,smoothwave->width*smoothwave->height); + smoothwave->imagebuffer = g_malloc (smoothwave->width * smoothwave->height); + memset (smoothwave->imagebuffer, 0, smoothwave->width * smoothwave->height); } static void -gst_smoothwave_chain (GstPad *pad, GstData *_data) +gst_smoothwave_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSmoothWave *smoothwave; gint16 *samples; - gint samplecount,i; + gint samplecount, i; register guint32 *ptr; gint qheight; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); /* g_return_if_fail(GST_IS_BUFFER(buf)); */ - smoothwave = GST_SMOOTHWAVE(GST_OBJECT_PARENT (pad)); + smoothwave = GST_SMOOTHWAVE (GST_OBJECT_PARENT (pad)); /* first deal with audio metadata */ #if 0 @@ -175,36 +175,35 @@ gst_smoothwave_chain (GstPad *pad, GstData *_data) /* FIXME: need to unref the old metadata so it goes away */ } /* we just make a copy of the pointer */ - smoothwave->meta = (MetaAudioRaw *)(buf->meta); + smoothwave->meta = (MetaAudioRaw *) (buf->meta); /* FIXME: now we have to ref the metadata so it doesn't go away */ } #endif /* g_return_if_fail(smoothwave->meta != NULL); */ - samples = (gint16 *)GST_BUFFER_DATA(buf); + samples = (gint16 *) GST_BUFFER_DATA (buf); /* samplecount = buf->datasize / (smoothwave->meta->channels * sizeof(gint16)); */ - samplecount = GST_BUFFER_SIZE(buf) / (2 * sizeof(gint16)); + samplecount = GST_BUFFER_SIZE (buf) / (2 * sizeof (gint16)); - qheight = smoothwave->height/4; + qheight = smoothwave->height / 4; /* GST_DEBUG ("traversing %d",smoothwave->width); */ - for (i=0;iwidth,samplecount);i++) { - gint16 y1 = (gint32)(samples[i*2] * qheight) / 32768 + - qheight; - gint16 y2 = (gint32)(samples[(i*2)+1] * qheight) / 32768 + - (qheight*3); - smoothwave->imagebuffer[y1*smoothwave->width + i] = 0xff; - smoothwave->imagebuffer[y2*smoothwave->width + i] = 0xff; + for (i = 0; i < MAX (smoothwave->width, samplecount); i++) { + gint16 y1 = (gint32) (samples[i * 2] * qheight) / 32768 + qheight; + gint16 y2 = (gint32) (samples[(i * 2) + 1] * qheight) / 32768 + + (qheight * 3); + smoothwave->imagebuffer[y1 * smoothwave->width + i] = 0xff; + smoothwave->imagebuffer[y2 * smoothwave->width + i] = 0xff; /* smoothwave->imagebuffer[i+(smoothwave->width*5)] = i; */ } - ptr = (guint32 *)smoothwave->imagebuffer; - for (i=0;i<(smoothwave->width*smoothwave->height)/4;i++) { - if (*ptr){ + ptr = (guint32 *) smoothwave->imagebuffer; + for (i = 0; i < (smoothwave->width * smoothwave->height) / 4; i++) { + if (*ptr) { *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5); ptr++; - }else{ + } else { ptr++; } } @@ -223,40 +222,40 @@ gst_smoothwave_chain (GstPad *pad, GstData *_data) GDK_RGB_DITHER_NONE, smoothwave->imagebuffer,smoothwave->width, smoothwave->cmap);*/ - gdk_draw_gray_image(smoothwave->image->window, - smoothwave->image->style->fg_gc[GTK_STATE_NORMAL], - 0,0,smoothwave->width,smoothwave->height, - GDK_RGB_DITHER_NORMAL, - smoothwave->imagebuffer,smoothwave->width); + gdk_draw_gray_image (smoothwave->image->window, + smoothwave->image->style->fg_gc[GTK_STATE_NORMAL], + 0, 0, smoothwave->width, smoothwave->height, + GDK_RGB_DITHER_NORMAL, smoothwave->imagebuffer, smoothwave->width); /* gst_trace_add_entry(NULL,0,buf,"smoothwave: calculated smoothwave"); */ - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_smoothwave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSmoothWave *smoothwave; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SMOOTHWAVE(object)); - smoothwave = GST_SMOOTHWAVE(object); + g_return_if_fail (GST_IS_SMOOTHWAVE (object)); + smoothwave = GST_SMOOTHWAVE (object); switch (prop_id) { case ARG_WIDTH: smoothwave->width = g_value_get_int (value); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_set_usize(GTK_WIDGET(smoothwave->image), - smoothwave->width,smoothwave->height); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_set_usize (GTK_WIDGET (smoothwave->image), + smoothwave->width, smoothwave->height); break; case ARG_HEIGHT: smoothwave->height = g_value_get_int (value); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_set_usize(GTK_WIDGET(smoothwave->image), - smoothwave->width,smoothwave->height); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_set_usize (GTK_WIDGET (smoothwave->image), + smoothwave->width, smoothwave->height); break; default: break; @@ -264,27 +263,28 @@ gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value } static void -gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_smoothwave_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstSmoothWave *smoothwave; /* it's not null if we got it, but it might not be ours */ - smoothwave = GST_SMOOTHWAVE(object); + smoothwave = GST_SMOOTHWAVE (object); switch (prop_id) { - case ARG_WIDTH: { + case ARG_WIDTH:{ g_value_set_int (value, smoothwave->width); break; } - case ARG_HEIGHT: { + case ARG_HEIGHT:{ g_value_set_int (value, smoothwave->height); break; } - case ARG_WIDGET: { + case ARG_WIDGET:{ g_value_set_object (value, smoothwave->image); break; } - default: { + default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } @@ -294,21 +294,17 @@ gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GPar static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "smoothwave", GST_RANK_NONE, GST_TYPE_SMOOTHWAVE)) + if (!gst_element_register (plugin, "smoothwave", GST_RANK_NONE, + GST_TYPE_SMOOTHWAVE)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "smoothwave", - "Fading greyscale waveform display", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smoothwave", + "Fading greyscale waveform display", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/smoothwave/gstsmoothwave.h b/gst/smoothwave/gstsmoothwave.h index 87165131..df4d8763 100644 --- a/gst/smoothwave/gstsmoothwave.h +++ b/gst/smoothwave/gstsmoothwave.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SMOOTHWAVE \ @@ -41,31 +42,33 @@ extern "C" { #define GST_IS_SMOOTHWAVE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOOTHWAVE)) -typedef struct _GstSmoothWave GstSmoothWave; -typedef struct _GstSmoothWaveClass GstSmoothWaveClass; + typedef struct _GstSmoothWave GstSmoothWave; + typedef struct _GstSmoothWaveClass GstSmoothWaveClass; -struct _GstSmoothWave { - GstElement element; + struct _GstSmoothWave + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width,height; + gint width, height; - GdkRgbCmap *cmap; - GtkWidget *image; - guchar *imagebuffer; -}; + GdkRgbCmap *cmap; + GtkWidget *image; + guchar *imagebuffer; + }; -struct _GstSmoothWaveClass { - GstElementClass parent_class; -}; + struct _GstSmoothWaveClass + { + GstElementClass parent_class; + }; -GType gst_smoothwave_get_type(void); + GType gst_smoothwave_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SMOOTHWAVE_H__ */ +#endif /* __GST_SMOOTHWAVE_H__ */ diff --git a/gst/smpte/barboxwipes.c b/gst/smpte/barboxwipes.c index a490f632..2508adf4 100644 --- a/gst/smpte/barboxwipes.c +++ b/gst/smpte/barboxwipes.c @@ -26,544 +26,533 @@ enum { - BOX_VERTICAL = 1, - BOX_HORIZONTAL = 2, - BOX_CLOCK = 3, - TRIGANLE_LINEAR = 4, + BOX_VERTICAL = 1, + BOX_HORIZONTAL = 2, + BOX_CLOCK = 3, + TRIGANLE_LINEAR = 4, }; -static gint boxes_1b[][7] = -{ +static gint boxes_1b[][7] = { #define WIPE_B1_1 0 - { BOX_VERTICAL, 0, 0, 0, 1, 1, 1 }, + {BOX_VERTICAL, 0, 0, 0, 1, 1, 1}, #define WIPE_B1_2 1 - { BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1 } + {BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1} }; -static gint boxes_2b[][7*2] = -{ +static gint boxes_2b[][7 * 2] = { #define WIPE_B2_21 0 - { BOX_VERTICAL, 0, 0, 1, 1, 2, 0, - BOX_VERTICAL, 1, 0, 0, 2, 2, 1 }, + {BOX_VERTICAL, 0, 0, 1, 1, 2, 0, + BOX_VERTICAL, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_22 1 - { BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, - BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1 }, + {BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, + BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1}, }; -static gint box_clock_1b[][1*10] = -{ +static gint box_clock_1b[][1 * 10] = { #define WIPE_B1_241 0 - { BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1 }, + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1}, #define WIPE_B1_242 1 - { BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1 }, + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1}, #define WIPE_B1_243 2 - { BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B1_244 3 - { BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1 }, + {BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1}, }; #define WIPE_B2_221 0 -static gint box_clock_2b[][2*10] = -{ +static gint box_clock_2b[][2 * 10] = { #define WIPE_B2_221 0 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, - BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2}, #define WIPE_B2_222 1 - { BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2 }, + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2}, #define WIPE_B2_223 2 - { BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2 }, + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2}, #define WIPE_B2_224 3 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, - BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2}, #define WIPE_B2_225 4 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, - BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1}, #define WIPE_B2_226 5 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, - BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1}, #define WIPE_B2_231 6 - { BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, - BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1 }, + {BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1}, #define WIPE_B2_232 7 - { BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_233 8 - { BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1 }, + {BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1}, #define WIPE_B2_234 9 - { BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, - BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1}, #define WIPE_B2_251 10 - { BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, - BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, + BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_252 11 - { BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, - BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_253 12 - { BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, - BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1 }, + {BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1}, #define WIPE_B2_254 13 - { BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, - BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1}, }; -static gint box_clock_4b[][4*10] = -{ +static gint box_clock_4b[][4 * 10] = { #define WIPE_B4_201 0 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, - BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, + BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4}, #define WIPE_B4_202 1 - { BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3}, #define WIPE_B4_203 2 - { BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, - BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, + BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_204 3 - { BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, - BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, + BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_205 4 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_206 5 - { BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_207 6 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_211 7 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2}, #define WIPE_B4_212 8 - { BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2 }, + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2}, #define WIPE_B4_213 9 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1}, #define WIPE_B4_214 10 - { BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1 }, + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1}, #define WIPE_B4_227 11 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, - BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, - BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, + BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2}, #define WIPE_B4_228 12 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, - BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2}, #define WIPE_B4_235 13 - { BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, - BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1}, #define WIPE_B4_236 14 - { BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, - BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1}, }; -static gint box_clock_8b[][8*10] = -{ +static gint box_clock_8b[][8 * 10] = { #define WIPE_B8_261 0 - { BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, - BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, - BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, - BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, - BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, - BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4 }, + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, + BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, + BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, + BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4}, #define WIPE_B8_262 1 - { BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, - BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, - BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, - BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, - BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, - BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4 }, + {BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, + BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, + BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, + BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4}, #define WIPE_B8_263 2 - { BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, - BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, - BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, - BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2 }, + {BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, + BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2}, #define WIPE_B8_264 3 - { BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, - BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, - BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, - BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, - BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2 }, + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, + BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, + BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2}, }; -static gint triangles_2t[][2*9] = -{ +static gint triangles_2t[][2 * 9] = { /* 3 -> 6 */ #define WIPE_T2_3 0 - { 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 0, 1, 1, 1 }, + {0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 1, 1, 1}, #define WIPE_T2_4 WIPE_T2_3+1 - { 0, 0, 1, 1, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T2_5 WIPE_T2_4+1 - { 0, 0, 1, 0, 1, 1, 1, 1, 0, - 1, 0, 1, 0, 0, 1, 1, 1, 0 }, + {0, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 0}, #define WIPE_T2_6 WIPE_T2_5+1 - { 0, 0, 1, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_41 WIPE_T2_6+1 - { 0, 0, 0, 1, 0, 1, 0, 1, 1, - 1, 0, 1, 0, 1, 1, 1, 1, 2 }, + {0, 0, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 0, 1, 1, 1, 1, 2}, #define WIPE_T2_42 WIPE_T2_41+1 - { 0, 0, 1, 1, 0, 0, 1, 1, 1, - 0, 0, 1, 0, 1, 2, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T2_45 WIPE_T2_42+1 - { 0, 0, 1, 1, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_46 WIPE_T2_45+1 - { 0, 0, 0, 1, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0 }, + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T2_245 WIPE_T2_46+1 - { 0, 0, 0, 2, 0, 0, 2, 2, 1, - 2, 2, 0, 0, 2, 0, 0, 0, 1 }, + {0, 0, 0, 2, 0, 0, 2, 2, 1, + 2, 2, 0, 0, 2, 0, 0, 0, 1}, #define WIPE_T2_246 WIPE_T2_245+1 - { 0, 2, 0, 0, 0, 0, 2, 0, 1, - 2, 0, 0, 2, 2, 0, 0, 2, 1 }, + {0, 2, 0, 0, 0, 0, 2, 0, 1, + 2, 0, 0, 2, 2, 0, 0, 2, 1}, }; -static gint triangles_3t[][3*9] = -{ +static gint triangles_3t[][3 * 9] = { /* 23 -> 26 */ #define WIPE_T3_23 0 - { 0, 0, 1, 1, 0, 0, 0, 2, 1, - 1, 0, 0, 0, 2, 1, 2, 2, 1, - 1, 0, 0, 2, 0, 1, 2, 2, 1 }, + {0, 0, 1, 1, 0, 0, 0, 2, 1, + 1, 0, 0, 0, 2, 1, 2, 2, 1, + 1, 0, 0, 2, 0, 1, 2, 2, 1}, #define WIPE_T3_24 1 - { 0, 0, 1, 2, 0, 1, 2, 1, 0, - 0, 0, 1, 2, 1, 0, 0, 2, 1, - 2, 1, 0, 0, 2, 1, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 2, 1, 0, + 0, 0, 1, 2, 1, 0, 0, 2, 1, + 2, 1, 0, 0, 2, 1, 2, 2, 1}, #define WIPE_T3_25 2 - { 0, 0, 1, 0, 2, 1, 1, 2, 0, - 0, 0, 1, 2, 0, 1, 1, 2, 0, - 2, 0, 1, 1, 2, 0, 2, 2, 1 }, + {0, 0, 1, 0, 2, 1, 1, 2, 0, + 0, 0, 1, 2, 0, 1, 1, 2, 0, + 2, 0, 1, 1, 2, 0, 2, 2, 1}, #define WIPE_T3_26 3 - { 0, 0, 1, 2, 0, 1, 0, 1, 0, - 2, 0, 1, 0, 1, 0, 2, 2, 1, - 0, 1, 0, 0, 2, 1, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 0, 1, 0, + 2, 0, 1, 0, 1, 0, 2, 2, 1, + 0, 1, 0, 0, 2, 1, 2, 2, 1}, }; -static gint triangles_4t[][4*9] = -{ +static gint triangles_4t[][4 * 9] = { #define WIPE_T4_61 0 - { 0, 0, 1, 1, 0, 0, 1, 2, 1, - 0, 0, 1, 0, 2, 2, 1, 2, 1, - 1, 0, 0, 2, 0, 1, 1, 2, 1, - 2, 0, 1, 1, 2, 1, 2, 2, 2 }, + {0, 0, 1, 1, 0, 0, 1, 2, 1, + 0, 0, 1, 0, 2, 2, 1, 2, 1, + 1, 0, 0, 2, 0, 1, 1, 2, 1, + 2, 0, 1, 1, 2, 1, 2, 2, 2}, #define WIPE_T4_62 1 - { 0, 0, 2, 2, 0, 1, 0, 1, 1, - 2, 0, 1, 0, 1, 1, 2, 1, 0, - 0, 1, 1, 2, 1, 0, 2, 2, 1, - 0, 1, 1, 0, 2, 2, 2, 2, 1 }, + {0, 0, 2, 2, 0, 1, 0, 1, 1, + 2, 0, 1, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 2, 2, 1, + 0, 1, 1, 0, 2, 2, 2, 2, 1}, #define WIPE_T4_63 2 - { 0, 0, 2, 1, 0, 1, 0, 2, 1, - 1, 0, 1, 0, 2, 1, 1, 2, 0, - 1, 0, 1, 1, 2, 0, 2, 2, 1, - 1, 0, 1, 2, 0, 2, 2, 2, 1 }, + {0, 0, 2, 1, 0, 1, 0, 2, 1, + 1, 0, 1, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 1, 2, 0, 2, 2, 1, + 1, 0, 1, 2, 0, 2, 2, 2, 1}, #define WIPE_T4_64 3 - { 0, 0, 1, 2, 0, 2, 2, 1, 1, - 0, 0, 1, 0, 1, 0, 2, 1, 1, - 0, 1, 0, 2, 1, 1, 0, 2, 1, - 2, 1, 1, 0, 2, 1, 2, 2, 2 }, + {0, 0, 1, 2, 0, 2, 2, 1, 1, + 0, 0, 1, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 0, 2, 1, + 2, 1, 1, 0, 2, 1, 2, 2, 2}, #define WIPE_T4_65 4 - { 0, 0, 0, 1, 0, 1, 1, 2, 0, - 0, 0, 0, 0, 2, 1, 1, 2, 0, - 1, 0, 1, 2, 0, 0, 1, 2, 0, - 2, 0, 0, 1, 2, 0, 2, 2, 1 }, + {0, 0, 0, 1, 0, 1, 1, 2, 0, + 0, 0, 0, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 2, 0, 0, 1, 2, 0, + 2, 0, 0, 1, 2, 0, 2, 2, 1}, #define WIPE_T4_66 5 - { 0, 0, 1, 2, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 1, 0, 2, 1, 1, - 0, 1, 0, 2, 1, 1, 2, 2, 0, - 0, 1, 0, 0, 2, 1, 2, 2, 0 }, + {0, 0, 1, 2, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 2, 2, 0, + 0, 1, 0, 0, 2, 1, 2, 2, 0}, #define WIPE_T4_67 6 - { 0, 0, 1, 1, 0, 0, 0, 2, 0, - 1, 0, 0, 0, 2, 0, 1, 2, 1, - 1, 0, 0, 1, 2, 1, 2, 2, 0, - 1, 0, 0, 2, 0, 1, 2, 2, 0 }, + {0, 0, 1, 1, 0, 0, 0, 2, 0, + 1, 0, 0, 0, 2, 0, 1, 2, 1, + 1, 0, 0, 1, 2, 1, 2, 2, 0, + 1, 0, 0, 2, 0, 1, 2, 2, 0}, #define WIPE_T4_68 7 - { 0, 0, 0, 2, 0, 1, 2, 1, 0, - 0, 0, 0, 0, 1, 1, 2, 1, 0, - 0, 1, 1, 2, 1, 0, 0, 2, 0, - 2, 1, 0, 0, 2, 0, 2, 2, 1 }, + {0, 0, 0, 2, 0, 1, 2, 1, 0, + 0, 0, 0, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 0, 2, 0, + 2, 1, 0, 0, 2, 0, 2, 2, 1}, #define WIPE_T4_101 8 - { 0, 0, 1, 2, 0, 1, 1, 1, 0, - 0, 0, 1, 1, 1, 0, 0, 2, 1, - 1, 1, 0, 0, 2, 1, 2, 2, 1, - 2, 0, 1, 1, 1, 0, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 2, 0, 1, 1, 1, 0, 2, 2, 1}, }; -static gint triangles_8t[][8*9] = -{ +static gint triangles_8t[][8 * 9] = { /* 7 */ #define WIPE_T8_7 0 - { 0, 0, 0, 1, 0, 1, 1, 1, 1, - 1, 0, 1, 2, 0, 0, 1, 1, 1, - 2, 0, 0, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 2, 0, - 1, 1, 1, 1, 2, 1, 2, 2, 0, - 1, 1, 1, 0, 2, 0, 1, 2, 1, - 0, 1, 1, 1, 1, 1, 0, 2, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + {0, 0, 0, 1, 0, 1, 1, 1, 1, + 1, 0, 1, 2, 0, 0, 1, 1, 1, + 2, 0, 0, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 2, 0, + 1, 1, 1, 1, 2, 1, 2, 2, 0, + 1, 1, 1, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 1, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T8_43 1 - { 0, 0, 1, 1, 0, 0, 1, 1, 1, - 1, 0, 0, 2, 0, 1, 1, 1, 1, - 2, 0, 1, 1, 1, 1, 2, 1, 2, - 1, 1, 1, 2, 1, 2, 2, 2, 1, - 1, 1, 1, 1, 2, 0, 2, 2, 1, - 1, 1, 1, 0, 2, 1, 1, 2, 0, - 0, 1, 2, 1, 1, 1, 0, 2, 1, - 0, 0, 1, 0, 1, 2, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 2, + 1, 1, 1, 2, 1, 2, 2, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 0, + 0, 1, 2, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T8_44 2 - { 0, 0, 1, 1, 0, 2, 1, 1, 1, - 1, 0, 2, 2, 0, 1, 1, 1, 1, - 2, 0, 1, 1, 1, 1, 2, 1, 0, - 1, 1, 1, 2, 1, 0, 2, 2, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 1, - 1, 1, 1, 0, 2, 1, 1, 2, 2, - 0, 1, 0, 1, 1, 1, 0, 2, 1, - 0, 0, 1, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 2, 1, 1, 1, + 1, 0, 2, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 0, + 1, 1, 1, 2, 1, 0, 2, 2, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 2, + 0, 1, 0, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T8_47 3 - { 0, 0, 0, 1, 0, 1, 1, 1, 0, - 1, 0, 1, 2, 0, 0, 1, 1, 0, - 2, 0, 0, 1, 1, 0, 2, 1, 1, - 1, 1, 0, 2, 1, 1, 2, 2, 0, - 1, 1, 0, 1, 2, 1, 2, 2, 0, - 1, 1, 0, 0, 2, 0, 1, 2, 1, - 0, 1, 1, 1, 1, 0, 0, 2, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0 }, + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 1, 0, 1, 2, 0, 0, 1, 1, 0, + 2, 0, 0, 1, 1, 0, 2, 1, 1, + 1, 1, 0, 2, 1, 1, 2, 2, 0, + 1, 1, 0, 1, 2, 1, 2, 2, 0, + 1, 1, 0, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 0, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T8_48 4 - { 0, 0, 1, 1, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 1, 1, - 1, 0, 0, 2, 0, 1, 2, 1, 0, - 1, 0, 0, 1, 1, 1, 2, 1, 0, - 0, 1, 0, 1, 1, 1, 1, 2, 0, - 0, 1, 0, 0, 2, 1, 1, 2, 0, - 1, 1, 1, 2, 1, 0, 1, 2, 0, - 2, 1, 0, 1, 2, 0, 2, 2, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 2, 1, 0, + 1, 0, 0, 1, 1, 1, 2, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 2, 0, + 0, 1, 0, 0, 2, 1, 1, 2, 0, + 1, 1, 1, 2, 1, 0, 1, 2, 0, + 2, 1, 0, 1, 2, 0, 2, 2, 1}, }; -static gint triangles_16t[][16*9] = -{ +static gint triangles_16t[][16 * 9] = { /* 8 */ #define WIPE_T16_8 0 - { 0, 0, 1, 2, 0, 1, 1, 1, 0, - 2, 0, 1, 1, 1, 0, 2, 2, 1, - 1, 1, 0, 0, 2, 1, 2, 2, 1, - 0, 0, 1, 1, 1, 0, 0, 2, 1, - 2, 0, 1, 4, 0, 1, 3, 1, 0, - 4, 0, 1, 3, 1, 0, 4, 2, 1, - 3, 1, 0, 2, 2, 1, 4, 2, 1, - 2, 0, 1, 3, 1, 0, 2, 2, 1, - 0, 2, 1, 2, 2, 1, 1, 3, 0, - 2, 2, 1, 1, 3, 0, 2, 4, 1, - 1, 3, 0, 0, 4, 1, 2, 4, 1, - 0, 2, 1, 1, 3, 0, 0, 4, 1, - 2, 2, 1, 4, 2, 1, 3, 3, 0, - 4, 2, 1, 3, 3, 0, 4, 4, 1, - 3, 3, 0, 2, 4, 1, 4, 4, 1, - 2, 2, 1, 3, 3, 0, 2, 4, 1 } + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 2, 0, 1, 1, 1, 0, 2, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 2, 0, 1, 4, 0, 1, 3, 1, 0, + 4, 0, 1, 3, 1, 0, 4, 2, 1, + 3, 1, 0, 2, 2, 1, 4, 2, 1, + 2, 0, 1, 3, 1, 0, 2, 2, 1, + 0, 2, 1, 2, 2, 1, 1, 3, 0, + 2, 2, 1, 1, 3, 0, 2, 4, 1, + 1, 3, 0, 0, 4, 1, 2, 4, 1, + 0, 2, 1, 1, 3, 0, 0, 4, 1, + 2, 2, 1, 4, 2, 1, 3, 3, 0, + 4, 2, 1, 3, 3, 0, 4, 4, 1, + 3, 3, 0, 2, 4, 1, 4, 4, 1, + 2, 2, 1, 3, 3, 0, 2, 4, 1} }; typedef struct _GstWipeConfig GstWipeConfig; -struct _GstWipeConfig { - gint *objects; - gint nobjects; - gint xscale; - gint yscale; - gint cscale; +struct _GstWipeConfig +{ + gint *objects; + gint nobjects; + gint xscale; + gint yscale; + gint cscale; }; -static GstWipeConfig wipe_config[] = -{ +static GstWipeConfig wipe_config[] = { #define WIPE_CONFIG_1 0 - { boxes_1b[WIPE_B1_1], 1, 0, 0, 0 }, /* 1 */ + {boxes_1b[WIPE_B1_1], 1, 0, 0, 0}, /* 1 */ #define WIPE_CONFIG_2 WIPE_CONFIG_1+1 - { boxes_1b[WIPE_B1_2], 1, 0, 0, 0 }, /* 2 */ + {boxes_1b[WIPE_B1_2], 1, 0, 0, 0}, /* 2 */ #define WIPE_CONFIG_3 WIPE_CONFIG_2+1 - { triangles_2t[WIPE_T2_3], 2, 0, 0, 0 }, /* 3 */ + {triangles_2t[WIPE_T2_3], 2, 0, 0, 0}, /* 3 */ #define WIPE_CONFIG_4 WIPE_CONFIG_3+1 - { triangles_2t[WIPE_T2_4], 2, 0, 0, 0 }, /* 4 */ + {triangles_2t[WIPE_T2_4], 2, 0, 0, 0}, /* 4 */ #define WIPE_CONFIG_5 WIPE_CONFIG_4+1 - { triangles_2t[WIPE_T2_5], 2, 0, 0, 0 }, /* 5 */ + {triangles_2t[WIPE_T2_5], 2, 0, 0, 0}, /* 5 */ #define WIPE_CONFIG_6 WIPE_CONFIG_5+1 - { triangles_2t[WIPE_T2_6], 2, 0, 0, 0 }, /* 6 */ + {triangles_2t[WIPE_T2_6], 2, 0, 0, 0}, /* 6 */ #define WIPE_CONFIG_7 WIPE_CONFIG_6+1 - { triangles_8t[WIPE_T8_7], 8, 1, 1, 0 }, /* 7 */ + {triangles_8t[WIPE_T8_7], 8, 1, 1, 0}, /* 7 */ #define WIPE_CONFIG_8 WIPE_CONFIG_7+1 - { triangles_16t[WIPE_T16_8], 16, 2, 2, 0 }, /* 8 */ + {triangles_16t[WIPE_T16_8], 16, 2, 2, 0}, /* 8 */ #define WIPE_CONFIG_21 WIPE_CONFIG_8+1 - { boxes_2b[WIPE_B2_21], 2, 1, 1, 0 }, /* 21 */ + {boxes_2b[WIPE_B2_21], 2, 1, 1, 0}, /* 21 */ #define WIPE_CONFIG_22 WIPE_CONFIG_21+1 - { boxes_2b[WIPE_B2_22], 2, 1, 1, 0 }, /* 22 */ + {boxes_2b[WIPE_B2_22], 2, 1, 1, 0}, /* 22 */ #define WIPE_CONFIG_23 WIPE_CONFIG_22+1 - { triangles_3t[WIPE_T3_23], 3, 1, 1, 0 }, /* 23 */ + {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 23 */ #define WIPE_CONFIG_24 WIPE_CONFIG_23+1 - { triangles_3t[WIPE_T3_24], 3, 1, 1, 0 }, /* 24 */ + {triangles_3t[WIPE_T3_24], 3, 1, 1, 0}, /* 24 */ #define WIPE_CONFIG_25 WIPE_CONFIG_24+1 - { triangles_3t[WIPE_T3_23], 3, 1, 1, 0 }, /* 25 */ + {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 25 */ #define WIPE_CONFIG_26 WIPE_CONFIG_25+1 - { triangles_3t[WIPE_T3_26], 3, 1, 1, 0 }, /* 26 */ + {triangles_3t[WIPE_T3_26], 3, 1, 1, 0}, /* 26 */ #define WIPE_CONFIG_41 WIPE_CONFIG_26+1 - { triangles_2t[WIPE_T2_41], 2, 0, 0, 1 }, /* 41 */ + {triangles_2t[WIPE_T2_41], 2, 0, 0, 1}, /* 41 */ #define WIPE_CONFIG_42 WIPE_CONFIG_41+1 - { triangles_2t[WIPE_T2_42], 2, 0, 0, 1 }, /* 42 */ + {triangles_2t[WIPE_T2_42], 2, 0, 0, 1}, /* 42 */ #define WIPE_CONFIG_43 WIPE_CONFIG_42+1 - { triangles_8t[WIPE_T8_43], 8, 1, 1, 1 }, /* 43 */ + {triangles_8t[WIPE_T8_43], 8, 1, 1, 1}, /* 43 */ #define WIPE_CONFIG_44 WIPE_CONFIG_43+1 - { triangles_8t[WIPE_T8_44], 8, 1, 1, 1 }, /* 44 */ + {triangles_8t[WIPE_T8_44], 8, 1, 1, 1}, /* 44 */ #define WIPE_CONFIG_45 WIPE_CONFIG_44+1 - { triangles_2t[WIPE_T2_45], 2, 0, 0, 0 }, /* 45 */ + {triangles_2t[WIPE_T2_45], 2, 0, 0, 0}, /* 45 */ #define WIPE_CONFIG_46 WIPE_CONFIG_45+1 - { triangles_2t[WIPE_T2_46], 2, 0, 0, 0 }, /* 46 */ + {triangles_2t[WIPE_T2_46], 2, 0, 0, 0}, /* 46 */ #define WIPE_CONFIG_47 WIPE_CONFIG_46+1 - { triangles_8t[WIPE_T8_47], 8, 1, 1, 0 }, /* 47 */ + {triangles_8t[WIPE_T8_47], 8, 1, 1, 0}, /* 47 */ #define WIPE_CONFIG_48 WIPE_CONFIG_47+1 - { triangles_8t[WIPE_T8_48], 8, 1, 1, 0 }, /* 48 */ + {triangles_8t[WIPE_T8_48], 8, 1, 1, 0}, /* 48 */ #define WIPE_CONFIG_61 WIPE_CONFIG_48+1 - { triangles_4t[WIPE_T4_61], 4, 1, 1, 1 }, /* 61 */ + {triangles_4t[WIPE_T4_61], 4, 1, 1, 1}, /* 61 */ #define WIPE_CONFIG_62 WIPE_CONFIG_61+1 - { triangles_4t[WIPE_T4_62], 4, 1, 1, 1 }, /* 62 */ + {triangles_4t[WIPE_T4_62], 4, 1, 1, 1}, /* 62 */ #define WIPE_CONFIG_63 WIPE_CONFIG_62+1 - { triangles_4t[WIPE_T4_63], 4, 1, 1, 1 }, /* 63 */ + {triangles_4t[WIPE_T4_63], 4, 1, 1, 1}, /* 63 */ #define WIPE_CONFIG_64 WIPE_CONFIG_63+1 - { triangles_4t[WIPE_T4_64], 4, 1, 1, 1 }, /* 64 */ + {triangles_4t[WIPE_T4_64], 4, 1, 1, 1}, /* 64 */ #define WIPE_CONFIG_65 WIPE_CONFIG_64+1 - { triangles_4t[WIPE_T4_65], 4, 1, 1, 0 }, /* 65 */ + {triangles_4t[WIPE_T4_65], 4, 1, 1, 0}, /* 65 */ #define WIPE_CONFIG_66 WIPE_CONFIG_65+1 - { triangles_4t[WIPE_T4_66], 4, 1, 1, 0 }, /* 66 */ + {triangles_4t[WIPE_T4_66], 4, 1, 1, 0}, /* 66 */ #define WIPE_CONFIG_67 WIPE_CONFIG_66+1 - { triangles_4t[WIPE_T4_67], 4, 1, 1, 0 }, /* 67 */ + {triangles_4t[WIPE_T4_67], 4, 1, 1, 0}, /* 67 */ #define WIPE_CONFIG_68 WIPE_CONFIG_67+1 - { triangles_4t[WIPE_T4_68], 4, 1, 1, 0 }, /* 68 */ + {triangles_4t[WIPE_T4_68], 4, 1, 1, 0}, /* 68 */ #define WIPE_CONFIG_101 WIPE_CONFIG_68+1 - { triangles_4t[WIPE_T4_101], 4, 1, 1, 0 }, /* 101 */ + {triangles_4t[WIPE_T4_101], 4, 1, 1, 0}, /* 101 */ #define WIPE_CONFIG_201 WIPE_CONFIG_101+1 - { box_clock_4b[WIPE_B4_201], 4, 1, 1, 2 }, /* 201 */ + {box_clock_4b[WIPE_B4_201], 4, 1, 1, 2}, /* 201 */ #define WIPE_CONFIG_202 WIPE_CONFIG_201+1 - { box_clock_4b[WIPE_B4_202], 4, 1, 1, 2 }, /* 202 */ + {box_clock_4b[WIPE_B4_202], 4, 1, 1, 2}, /* 202 */ #define WIPE_CONFIG_203 WIPE_CONFIG_202+1 - { box_clock_4b[WIPE_B4_203], 4, 1, 1, 2 }, /* 203 */ + {box_clock_4b[WIPE_B4_203], 4, 1, 1, 2}, /* 203 */ #define WIPE_CONFIG_204 WIPE_CONFIG_203+1 - { box_clock_4b[WIPE_B4_204], 4, 1, 1, 2 }, /* 204 */ + {box_clock_4b[WIPE_B4_204], 4, 1, 1, 2}, /* 204 */ #define WIPE_CONFIG_205 WIPE_CONFIG_204+1 - { box_clock_4b[WIPE_B4_205], 4, 1, 1, 1 }, /* 205 */ + {box_clock_4b[WIPE_B4_205], 4, 1, 1, 1}, /* 205 */ #define WIPE_CONFIG_206 WIPE_CONFIG_205+1 - { box_clock_4b[WIPE_B4_206], 4, 1, 1, 1 }, /* 206 */ + {box_clock_4b[WIPE_B4_206], 4, 1, 1, 1}, /* 206 */ #define WIPE_CONFIG_207 WIPE_CONFIG_206+1 - { box_clock_4b[WIPE_B4_207], 4, 1, 1, 0 }, /* 207 */ + {box_clock_4b[WIPE_B4_207], 4, 1, 1, 0}, /* 207 */ #define WIPE_CONFIG_211 WIPE_CONFIG_207+1 - { box_clock_4b[WIPE_B4_211], 4, 1, 1, 1 }, /* 211 */ + {box_clock_4b[WIPE_B4_211], 4, 1, 1, 1}, /* 211 */ #define WIPE_CONFIG_212 WIPE_CONFIG_211+1 - { box_clock_4b[WIPE_B4_212], 4, 1, 1, 1 }, /* 212 */ + {box_clock_4b[WIPE_B4_212], 4, 1, 1, 1}, /* 212 */ #define WIPE_CONFIG_213 WIPE_CONFIG_212+1 - { box_clock_4b[WIPE_B4_213], 4, 1, 1, 0 }, /* 213 */ + {box_clock_4b[WIPE_B4_213], 4, 1, 1, 0}, /* 213 */ #define WIPE_CONFIG_214 WIPE_CONFIG_213+1 - { box_clock_4b[WIPE_B4_214], 4, 1, 1, 0 }, /* 214 */ + {box_clock_4b[WIPE_B4_214], 4, 1, 1, 0}, /* 214 */ #define WIPE_CONFIG_221 WIPE_CONFIG_214+1 - { box_clock_2b[WIPE_B2_221], 2, 1, 1, 1 }, /* 221 */ + {box_clock_2b[WIPE_B2_221], 2, 1, 1, 1}, /* 221 */ #define WIPE_CONFIG_222 WIPE_CONFIG_221+1 - { box_clock_2b[WIPE_B2_222], 2, 1, 1, 1 }, /* 222 */ + {box_clock_2b[WIPE_B2_222], 2, 1, 1, 1}, /* 222 */ #define WIPE_CONFIG_223 WIPE_CONFIG_222+1 - { box_clock_2b[WIPE_B2_223], 2, 1, 1, 1 }, /* 223 */ + {box_clock_2b[WIPE_B2_223], 2, 1, 1, 1}, /* 223 */ #define WIPE_CONFIG_224 WIPE_CONFIG_223+1 - { box_clock_2b[WIPE_B2_224], 2, 1, 1, 1 }, /* 224 */ + {box_clock_2b[WIPE_B2_224], 2, 1, 1, 1}, /* 224 */ #define WIPE_CONFIG_225 WIPE_CONFIG_224+1 - { box_clock_2b[WIPE_B2_225], 2, 1, 1, 0 }, /* 225 */ + {box_clock_2b[WIPE_B2_225], 2, 1, 1, 0}, /* 225 */ #define WIPE_CONFIG_226 WIPE_CONFIG_225+1 - { box_clock_2b[WIPE_B2_226], 2, 1, 1, 0 }, /* 226 */ + {box_clock_2b[WIPE_B2_226], 2, 1, 1, 0}, /* 226 */ #define WIPE_CONFIG_227 WIPE_CONFIG_226+1 - { box_clock_4b[WIPE_B4_227], 4, 1, 1, 1 }, /* 227 */ + {box_clock_4b[WIPE_B4_227], 4, 1, 1, 1}, /* 227 */ #define WIPE_CONFIG_228 WIPE_CONFIG_227+1 - { box_clock_4b[WIPE_B4_228], 4, 1, 1, 1 }, /* 228 */ + {box_clock_4b[WIPE_B4_228], 4, 1, 1, 1}, /* 228 */ #define WIPE_CONFIG_231 WIPE_CONFIG_228+1 - { box_clock_2b[WIPE_B2_231], 2, 1, 1, 0 }, /* 231 */ + {box_clock_2b[WIPE_B2_231], 2, 1, 1, 0}, /* 231 */ #define WIPE_CONFIG_232 WIPE_CONFIG_231+1 - { box_clock_2b[WIPE_B2_232], 2, 1, 1, 0 }, /* 232 */ + {box_clock_2b[WIPE_B2_232], 2, 1, 1, 0}, /* 232 */ #define WIPE_CONFIG_233 WIPE_CONFIG_232+1 - { box_clock_2b[WIPE_B2_233], 2, 1, 1, 0 }, /* 233 */ + {box_clock_2b[WIPE_B2_233], 2, 1, 1, 0}, /* 233 */ #define WIPE_CONFIG_234 WIPE_CONFIG_233+1 - { box_clock_2b[WIPE_B2_234], 2, 1, 1, 0 }, /* 234 */ + {box_clock_2b[WIPE_B2_234], 2, 1, 1, 0}, /* 234 */ #define WIPE_CONFIG_235 WIPE_CONFIG_234+1 - { box_clock_4b[WIPE_B4_235], 4, 1, 1, 0 }, /* 235 */ + {box_clock_4b[WIPE_B4_235], 4, 1, 1, 0}, /* 235 */ #define WIPE_CONFIG_236 WIPE_CONFIG_235+1 - { box_clock_4b[WIPE_B4_236], 4, 1, 1, 0 }, /* 236 */ + {box_clock_4b[WIPE_B4_236], 4, 1, 1, 0}, /* 236 */ #define WIPE_CONFIG_241 WIPE_CONFIG_236+1 - { box_clock_1b[WIPE_B1_241], 1, 0, 0, 0 }, /* 241 */ + {box_clock_1b[WIPE_B1_241], 1, 0, 0, 0}, /* 241 */ #define WIPE_CONFIG_242 WIPE_CONFIG_241+1 - { box_clock_1b[WIPE_B1_242], 1, 0, 0, 0 }, /* 242 */ + {box_clock_1b[WIPE_B1_242], 1, 0, 0, 0}, /* 242 */ #define WIPE_CONFIG_243 WIPE_CONFIG_242+1 - { box_clock_1b[WIPE_B1_243], 1, 0, 0, 0 }, /* 243 */ + {box_clock_1b[WIPE_B1_243], 1, 0, 0, 0}, /* 243 */ #define WIPE_CONFIG_244 WIPE_CONFIG_243+1 - { box_clock_1b[WIPE_B1_244], 1, 0, 0, 0 }, /* 244 */ + {box_clock_1b[WIPE_B1_244], 1, 0, 0, 0}, /* 244 */ #define WIPE_CONFIG_245 WIPE_CONFIG_244+1 - { triangles_2t[WIPE_T2_245], 2, 1, 1, 0 }, /* 245 */ + {triangles_2t[WIPE_T2_245], 2, 1, 1, 0}, /* 245 */ #define WIPE_CONFIG_246 WIPE_CONFIG_245+1 - { triangles_2t[WIPE_T2_246], 2, 1, 1, 0 }, /* 246 */ + {triangles_2t[WIPE_T2_246], 2, 1, 1, 0}, /* 246 */ #define WIPE_CONFIG_251 WIPE_CONFIG_246+1 - { box_clock_2b[WIPE_B2_251], 2, 1, 1, 0 }, /* 251 */ + {box_clock_2b[WIPE_B2_251], 2, 1, 1, 0}, /* 251 */ #define WIPE_CONFIG_252 WIPE_CONFIG_251+1 - { box_clock_2b[WIPE_B2_252], 2, 1, 1, 0 }, /* 252 */ + {box_clock_2b[WIPE_B2_252], 2, 1, 1, 0}, /* 252 */ #define WIPE_CONFIG_253 WIPE_CONFIG_252+1 - { box_clock_2b[WIPE_B2_253], 2, 1, 1, 0 }, /* 253 */ + {box_clock_2b[WIPE_B2_253], 2, 1, 1, 0}, /* 253 */ #define WIPE_CONFIG_254 WIPE_CONFIG_253+1 - { box_clock_2b[WIPE_B2_254], 2, 1, 1, 0 }, /* 254 */ + {box_clock_2b[WIPE_B2_254], 2, 1, 1, 0}, /* 254 */ #define WIPE_CONFIG_261 WIPE_CONFIG_254+1 - { box_clock_8b[WIPE_B8_261], 8, 2, 2, 2 }, /* 261 */ + {box_clock_8b[WIPE_B8_261], 8, 2, 2, 2}, /* 261 */ #define WIPE_CONFIG_262 WIPE_CONFIG_261+1 - { box_clock_8b[WIPE_B8_262], 8, 2, 2, 2 }, /* 262 */ + {box_clock_8b[WIPE_B8_262], 8, 2, 2, 2}, /* 262 */ #define WIPE_CONFIG_263 WIPE_CONFIG_262+1 - { box_clock_8b[WIPE_B8_263], 8, 2, 2, 1 }, /* 263 */ + {box_clock_8b[WIPE_B8_263], 8, 2, 2, 1}, /* 263 */ #define WIPE_CONFIG_264 WIPE_CONFIG_263+1 - { box_clock_8b[WIPE_B8_264], 8, 2, 2, 1 }, /* 264 */ + {box_clock_8b[WIPE_B8_264], 8, 2, 2, 1}, /* 264 */ }; static void -gst_wipe_boxes_draw (GstMask *mask) +gst_wipe_boxes_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -576,30 +565,30 @@ gst_wipe_boxes_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { switch (impacts[0]) { case BOX_VERTICAL: - gst_smpte_paint_vbox (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth); + gst_smpte_paint_vbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; - break; + break; case BOX_HORIZONTAL: - gst_smpte_paint_hbox (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth); + gst_smpte_paint_hbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; case BOX_CLOCK: - gst_smpte_paint_box_clock (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth, - impacts[7] * width, impacts[8] * height, impacts[9] * depth); + gst_smpte_paint_box_clock (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth, + impacts[7] * width, impacts[8] * height, impacts[9] * depth); impacts += 10; default: - break; + break; } } } static void -gst_wipe_triangles_clock_draw (GstMask *mask) +gst_wipe_triangles_clock_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -610,15 +599,15 @@ gst_wipe_triangles_clock_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { gst_smpte_paint_triangle_clock (mask->data, mask->width, - impacts[0] * width, impacts[1] * height, impacts[2] * depth, - impacts[3] * width, impacts[4] * height, impacts[5] * depth, - impacts[6] * width, impacts[7] * height, impacts[8] * depth); + impacts[0] * width, impacts[1] * height, impacts[2] * depth, + impacts[3] * width, impacts[4] * height, impacts[5] * depth, + impacts[6] * width, impacts[7] * height, impacts[8] * depth); impacts += 9; } } static void -gst_wipe_triangles_draw (GstMask *mask) +gst_wipe_triangles_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -630,295 +619,295 @@ gst_wipe_triangles_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { gst_smpte_paint_triangle_linear (mask->data, mask->width, - impacts[0] * width, impacts[1] * height, impacts[2] * depth, - impacts[3] * width, impacts[4] * height, impacts[5] * depth, - impacts[6] * width, impacts[7] * height, impacts[8] * depth); + impacts[0] * width, impacts[1] * height, impacts[2] * depth, + impacts[3] * width, impacts[4] * height, impacts[5] * depth, + impacts[6] * width, impacts[7] * height, impacts[8] * depth); impacts += 9; } } -static GstMaskDefinition definitions[] = { - { 1, "bar_wipe_lr", - "A bar moves from left to right", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_1] }, - { 2, "bar_wipe_tb", - "A bar moves from top to bottom", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_2] }, - { 3, "box_wipe_tl", - "A box expands from the upper-left corner to the lower-right corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_3] }, - { 4, "box_wipe_tr", - "A box expands from the upper-right corner to the lower-left corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_4] }, - { 5, "box_wipe_br", - "A box expands from the lower-right corner to the upper-left corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_5] }, - { 6, "box_wipe_bl", - "A box expands from the lower-left corner to the upper-right corner", +static GstMaskDefinition definitions[] = { + {1, "bar_wipe_lr", + "A bar moves from left to right", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_1]}, + {2, "bar_wipe_tb", + "A bar moves from top to bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_2]}, + {3, "box_wipe_tl", + "A box expands from the upper-left corner to the lower-right corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_3]}, + {4, "box_wipe_tr", + "A box expands from the upper-right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_6] }, - { 7 , "four_box_wipe_ci", - "A box shape expands from each of the four corners toward the center", + &wipe_config[WIPE_CONFIG_4]}, + {5, "box_wipe_br", + "A box expands from the lower-right corner to the upper-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_7] }, - { 8 , "four_box_wipe_co", - "A box shape expands from the center of each quadrant toward the corners of each quadrant", + &wipe_config[WIPE_CONFIG_5]}, + {6, "box_wipe_bl", + "A box expands from the lower-left corner to the upper-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_8] }, - { 21, "barndoor_v", - "A central, vertical line splits and expands toward the left and right edges", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_21] }, - { 22, "barndoor_h", - "A central, horizontal line splits and expands toward the top and bottom edges", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_22] }, - { 23, "box_wipe_tc", - "A box expands from the top edge's midpoint to the bottom corners", + &wipe_config[WIPE_CONFIG_6]}, + {7, "four_box_wipe_ci", + "A box shape expands from each of the four corners toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_23] }, - { 24, "box_wipe_rc", - "A box expands from the right edge's midpoint to the left corners", + &wipe_config[WIPE_CONFIG_7]}, + {8, "four_box_wipe_co", + "A box shape expands from the center of each quadrant toward the corners of each quadrant", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_24] }, - { 25, "box_wipe_bc", - "A box expands from the bottom edge's midpoint to the top corners", + &wipe_config[WIPE_CONFIG_8]}, + {21, "barndoor_v", + "A central, vertical line splits and expands toward the left and right edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_21]}, + {22, "barndoor_h", + "A central, horizontal line splits and expands toward the top and bottom edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_22]}, + {23, "box_wipe_tc", + "A box expands from the top edge's midpoint to the bottom corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_23]}, + {24, "box_wipe_rc", + "A box expands from the right edge's midpoint to the left corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_25] }, - { 26, "box_wipe_lc", - "A box expands from the left edge's midpoint to the right corners", + &wipe_config[WIPE_CONFIG_24]}, + {25, "box_wipe_bc", + "A box expands from the bottom edge's midpoint to the top corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_26] }, - { 41, "diagonal_tl", - "A diagonal line moves from the upper-left corner to the lower-right corner", + &wipe_config[WIPE_CONFIG_25]}, + {26, "box_wipe_lc", + "A box expands from the left edge's midpoint to the right corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_41] }, - { 42, "diagonal_tr", - "A diagonal line moves from the upper right corner to the lower-left corner", + &wipe_config[WIPE_CONFIG_26]}, + {41, "diagonal_tl", + "A diagonal line moves from the upper-left corner to the lower-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_42] }, - { 43, "bowtie_v", - "Two wedge shapes slide in from the top and bottom edges toward the center", + &wipe_config[WIPE_CONFIG_41]}, + {42, "diagonal_tr", + "A diagonal line moves from the upper right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_43] }, - { 44, "bowtie_h", - "Two wedge shapes slide in from the left and right edges toward the center", + &wipe_config[WIPE_CONFIG_42]}, + {43, "bowtie_v", + "Two wedge shapes slide in from the top and bottom edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_44] }, - { 45, "barndoor_dbl", - "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", + &wipe_config[WIPE_CONFIG_43]}, + {44, "bowtie_h", + "Two wedge shapes slide in from the left and right edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_45] }, - { 46, "barndoor_dtl", - "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", + &wipe_config[WIPE_CONFIG_44]}, + {45, "barndoor_dbl", + "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_46] }, - { 47, "misc_diagonal_dbd", - "Four wedge shapes split from the center and retract toward the four edges", + &wipe_config[WIPE_CONFIG_45]}, + {46, "barndoor_dtl", + "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_47] }, - { 48, "misc_diagonal_dd", - "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_46]}, + {47, "misc_diagonal_dbd", + "Four wedge shapes split from the center and retract toward the four edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_48] }, - { 61, "vee_d", - "A wedge shape moves from top to bottom", + &wipe_config[WIPE_CONFIG_47]}, + {48, "misc_diagonal_dd", + "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_61] }, - { 62, "vee_l", - "A wedge shape moves from right to left", + &wipe_config[WIPE_CONFIG_48]}, + {61, "vee_d", + "A wedge shape moves from top to bottom", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_62] }, - { 63, "vee_u", - "A wedge shape moves from bottom to top", + &wipe_config[WIPE_CONFIG_61]}, + {62, "vee_l", + "A wedge shape moves from right to left", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_63] }, - { 64, "vee_r", - "A wedge shape moves from left to right", + &wipe_config[WIPE_CONFIG_62]}, + {63, "vee_u", + "A wedge shape moves from bottom to top", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_64] }, - { 65, "barnvee_d", - "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_63]}, + {64, "vee_r", + "A wedge shape moves from left to right", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_65] }, - { 66, "barnvee_l", - "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_64]}, + {65, "barnvee_d", + "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_66] }, - { 67, "barnvee_u", - "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_65]}, + {66, "barnvee_l", + "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_67] }, - { 68, "barnvee_r", - "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_66]}, + {67, "barnvee_u", + "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_68] }, - { 101, "iris_rect", - "A rectangle expands from the center.", + &wipe_config[WIPE_CONFIG_67]}, + {68, "barnvee_r", + "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_101] }, - { 201, "clock_cw12", - "A radial hand sweeps clockwise from the twelve o'clock position", + &wipe_config[WIPE_CONFIG_68]}, + {101, "iris_rect", + "A rectangle expands from the center.", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_101]}, + {201, "clock_cw12", + "A radial hand sweeps clockwise from the twelve o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_201] }, - { 202, "clock_cw3", - "A radial hand sweeps clockwise from the three o'clock position", + &wipe_config[WIPE_CONFIG_201]}, + {202, "clock_cw3", + "A radial hand sweeps clockwise from the three o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_202] }, - { 203, "clock_cw6", - "A radial hand sweeps clockwise from the six o'clock position", + &wipe_config[WIPE_CONFIG_202]}, + {203, "clock_cw6", + "A radial hand sweeps clockwise from the six o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_203] }, - { 204, "clock_cw9", - "A radial hand sweeps clockwise from the nine o'clock position", + &wipe_config[WIPE_CONFIG_203]}, + {204, "clock_cw9", + "A radial hand sweeps clockwise from the nine o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_204] }, - { 205, "pinwheel_tbv", - "Two radial hands sweep clockwise from the twelve and six o'clock positions", + &wipe_config[WIPE_CONFIG_204]}, + {205, "pinwheel_tbv", + "Two radial hands sweep clockwise from the twelve and six o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_205] }, - { 206, "pinwheel_tbh", - "Two radial hands sweep clockwise from the nine and three o'clock positions", + &wipe_config[WIPE_CONFIG_205]}, + {206, "pinwheel_tbh", + "Two radial hands sweep clockwise from the nine and three o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_206] }, - { 207, "pinwheel_fb", - "Four radial hands sweep clockwise", + &wipe_config[WIPE_CONFIG_206]}, + {207, "pinwheel_fb", + "Four radial hands sweep clockwise", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_207] }, - { 211, "fan_ct", - "A fan unfolds from the top edge, the fan axis at the center", + &wipe_config[WIPE_CONFIG_207]}, + {211, "fan_ct", + "A fan unfolds from the top edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_211] }, - { 212, "fan_cr", - "A fan unfolds from the right edge, the fan axis at the center", + &wipe_config[WIPE_CONFIG_211]}, + {212, "fan_cr", + "A fan unfolds from the right edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_212] }, - { 213, "doublefan_fov", - "Two fans, their axes at the center, unfold from the top and bottom", + &wipe_config[WIPE_CONFIG_212]}, + {213, "doublefan_fov", + "Two fans, their axes at the center, unfold from the top and bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_213] }, - { 214, "doublefan_foh", - "Two fans, their axes at the center, unfold from the left and right", + &wipe_config[WIPE_CONFIG_213]}, + {214, "doublefan_foh", + "Two fans, their axes at the center, unfold from the left and right", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_214] }, - { 221, "singlesweep_cwt", - "A radial hand sweeps clockwise from the top edge's midpoint", + &wipe_config[WIPE_CONFIG_214]}, + {221, "singlesweep_cwt", + "A radial hand sweeps clockwise from the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_221] }, - { 222, "singlesweep_cwr", - "A radial hand sweeps clockwise from the right edge's midpoint", + &wipe_config[WIPE_CONFIG_221]}, + {222, "singlesweep_cwr", + "A radial hand sweeps clockwise from the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_222] }, - { 223, "singlesweep_cwb", - "A radial hand sweeps clockwise from the bottom edge's midpoint", + &wipe_config[WIPE_CONFIG_222]}, + {223, "singlesweep_cwb", + "A radial hand sweeps clockwise from the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_223] }, - { 224, "singlesweep_cwl", - "A radial hand sweeps clockwise from the left edge's midpoint", + &wipe_config[WIPE_CONFIG_223]}, + {224, "singlesweep_cwl", + "A radial hand sweeps clockwise from the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_224] }, - { 225, "doublesweep_pv", - "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", + &wipe_config[WIPE_CONFIG_224]}, + {225, "doublesweep_pv", + "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_225] }, - { 226, "doublesweep_pd", - "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", + &wipe_config[WIPE_CONFIG_225]}, + {226, "doublesweep_pd", + "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_226] }, - { 227, "doublesweep_ov", - "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", + &wipe_config[WIPE_CONFIG_226]}, + {227, "doublesweep_ov", + "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_227] }, - { 228, "doublesweep_oh", - "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", + &wipe_config[WIPE_CONFIG_227]}, + {228, "doublesweep_oh", + "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_228] }, - { 231, "fan_t", - "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", + &wipe_config[WIPE_CONFIG_228]}, + {231, "fan_t", + "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_231] }, - { 232, "fan_r", - "A fan unfolds from the left, the fan axis at the right edge's midpoint", + &wipe_config[WIPE_CONFIG_231]}, + {232, "fan_r", + "A fan unfolds from the left, the fan axis at the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_232] }, - { 233, "fan_b", - "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", + &wipe_config[WIPE_CONFIG_232]}, + {233, "fan_b", + "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_233] }, - { 234, "fan_l", - "A fan unfolds from the right, the fan axis at the left edge's midpoint", + &wipe_config[WIPE_CONFIG_233]}, + {234, "fan_l", + "A fan unfolds from the right, the fan axis at the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_234] }, - { 235, "doublefan_fiv", - "Two fans, their axes at the top and bottom, unfold from the center", + &wipe_config[WIPE_CONFIG_234]}, + {235, "doublefan_fiv", + "Two fans, their axes at the top and bottom, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_235] }, - { 236, "doublefan_fih", - "Two fans, their axes at the left and right, unfold from the center", + &wipe_config[WIPE_CONFIG_235]}, + {236, "doublefan_fih", + "Two fans, their axes at the left and right, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_236] }, - { 241, "singlesweep_cwtl", - "A radial hand sweeps clockwise from the upper-left corner", + &wipe_config[WIPE_CONFIG_236]}, + {241, "singlesweep_cwtl", + "A radial hand sweeps clockwise from the upper-left corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_241] }, - { 242, "singlesweep_cwbl", - "A radial hand sweeps counter-clockwise from the lower-left corner.", + &wipe_config[WIPE_CONFIG_241]}, + {242, "singlesweep_cwbl", + "A radial hand sweeps counter-clockwise from the lower-left corner.", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_242] }, - { 243, "singlesweep_cwbr", - "A radial hand sweeps clockwise from the lower-right corner", + &wipe_config[WIPE_CONFIG_242]}, + {243, "singlesweep_cwbr", + "A radial hand sweeps clockwise from the lower-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_243] }, - { 244, "singlesweep_cwtr", - "A radial hand sweeps counter-clockwise from the upper-right corner", + &wipe_config[WIPE_CONFIG_243]}, + {244, "singlesweep_cwtr", + "A radial hand sweeps counter-clockwise from the upper-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_244] }, - { 245, "doublesweep_pdtl", - "Two radial hands attached at the upper-left and lower-right corners sweep down and up", + &wipe_config[WIPE_CONFIG_244]}, + {245, "doublesweep_pdtl", + "Two radial hands attached at the upper-left and lower-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_245] }, - { 246, "doublesweep_pdbl", - "Two radial hands attached at the lower-left and upper-right corners sweep down and up", + &wipe_config[WIPE_CONFIG_245]}, + {246, "doublesweep_pdbl", + "Two radial hands attached at the lower-left and upper-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_246] }, - { 251, "saloondoor_t", - "Two radial hands attached at the upper-left and upper-right corners sweep down", + &wipe_config[WIPE_CONFIG_246]}, + {251, "saloondoor_t", + "Two radial hands attached at the upper-left and upper-right corners sweep down", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_251] }, - { 252, "saloondoor_l", - "Two radial hands attached at the upper-left and lower-left corners sweep to the right", + &wipe_config[WIPE_CONFIG_251]}, + {252, "saloondoor_l", + "Two radial hands attached at the upper-left and lower-left corners sweep to the right", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_252] }, - { 253, "saloondoor_b", - "Two radial hands attached at the lower-left and lower-right corners sweep up", + &wipe_config[WIPE_CONFIG_252]}, + {253, "saloondoor_b", + "Two radial hands attached at the lower-left and lower-right corners sweep up", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_253] }, - { 254, "saloondoor_r", - "Two radial hands attached at the upper-right and lower-right corners sweep to the left", + &wipe_config[WIPE_CONFIG_253]}, + {254, "saloondoor_r", + "Two radial hands attached at the upper-right and lower-right corners sweep to the left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_254] }, - { 261, "windshield_r", - "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", + &wipe_config[WIPE_CONFIG_254]}, + {261, "windshield_r", + "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_261] }, - { 262, "windshield_u", - "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", + &wipe_config[WIPE_CONFIG_261]}, + {262, "windshield_u", + "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_262] }, - { 263, "windshield_v", - "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", + &wipe_config[WIPE_CONFIG_262]}, + {263, "windshield_v", + "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_263] }, - { 264, "windshield_h", - "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", + &wipe_config[WIPE_CONFIG_263]}, + {264, "windshield_h", + "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_264] }, - { 0, NULL, NULL, NULL } + &wipe_config[WIPE_CONFIG_264]}, + {0, NULL, NULL, NULL} }; void @@ -931,4 +920,3 @@ _gst_barboxwipes_register (void) i++; } } - diff --git a/gst/smpte/gstmask.c b/gst/smpte/gstmask.c index 13c79b34..0e2cf01f 100644 --- a/gst/smpte/gstmask.c +++ b/gst/smpte/gstmask.c @@ -35,25 +35,25 @@ _gst_mask_init (void) } static gint -gst_mask_compare (GstMaskDefinition *def1, - GstMaskDefinition *def2) +gst_mask_compare (GstMaskDefinition * def1, GstMaskDefinition * def2) { return (def1->type - def2->type); } void -_gst_mask_register (GstMaskDefinition *definition) +_gst_mask_register (GstMaskDefinition * definition) { - masks = g_list_insert_sorted (masks, definition, (GCompareFunc) gst_mask_compare); + masks = + g_list_insert_sorted (masks, definition, (GCompareFunc) gst_mask_compare); } -const GList* +const GList * gst_mask_get_definitions (void) { return masks; } -static GstMaskDefinition* +static GstMaskDefinition * gst_mask_find_definition (gint type) { GList *walk = masks; @@ -63,13 +63,13 @@ gst_mask_find_definition (gint type) if (def->type == type) return def; - + walk = g_list_next (walk); } return NULL; } -GstMask* +GstMask * gst_mask_factory_new (gint type, gint bpp, gint width, gint height) { GstMaskDefinition *definition; @@ -95,14 +95,14 @@ gst_mask_factory_new (gint type, gint bpp, gint width, gint height) } void -_gst_mask_default_destroy (GstMask *mask) +_gst_mask_default_destroy (GstMask * mask) { g_free (mask->data); g_free (mask); } void -gst_mask_destroy (GstMask *mask) +gst_mask_destroy (GstMask * mask) { if (mask->destroy_func) mask->destroy_func (mask); diff --git a/gst/smpte/gstmask.h b/gst/smpte/gstmask.h index 6131c624..6f82078f 100644 --- a/gst/smpte/gstmask.h +++ b/gst/smpte/gstmask.h @@ -27,37 +27,39 @@ typedef struct _GstMask GstMask; typedef struct _GstMaskDefinition GstMaskDefinition; -typedef void (*GstMaskDrawFunc) (GstMask *mask); -typedef void (*GstMaskDestroyFunc) (GstMask *mask); - -struct _GstMaskDefinition { - gint type; - gchar *short_name; - gchar *long_name; - GstMaskDrawFunc draw_func; - GstMaskDestroyFunc destroy_func; - gpointer user_data; +typedef void (*GstMaskDrawFunc) (GstMask * mask); +typedef void (*GstMaskDestroyFunc) (GstMask * mask); + +struct _GstMaskDefinition +{ + gint type; + gchar *short_name; + gchar *long_name; + GstMaskDrawFunc draw_func; + GstMaskDestroyFunc destroy_func; + gpointer user_data; }; -struct _GstMask { - gint type; - guint32 *data; - gpointer user_data; +struct _GstMask +{ + gint type; + guint32 *data; + gpointer user_data; - gint width; - gint height; - gint bpp; + gint width; + gint height; + gint bpp; - GstMaskDestroyFunc destroy_func; + GstMaskDestroyFunc destroy_func; }; -void _gst_mask_init (void); -void _gst_mask_register (GstMaskDefinition *definition); +void _gst_mask_init (void); +void _gst_mask_register (GstMaskDefinition * definition); -void _gst_mask_default_destroy (GstMask *mask); +void _gst_mask_default_destroy (GstMask * mask); -const GList* gst_mask_get_definitions (void); -GstMask* gst_mask_factory_new (gint type, gint bpp, gint width, gint height); -void gst_mask_destroy (GstMask *mask); +const GList *gst_mask_get_definitions (void); +GstMask *gst_mask_factory_new (gint type, gint bpp, gint width, gint height); +void gst_mask_destroy (GstMask * mask); #endif /* __GST_MASK_H__ */ diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c index 5899a9a1..91b91d9d 100644 --- a/gst/smpte/gstsmpte.c +++ b/gst/smpte/gstsmpte.c @@ -34,43 +34,39 @@ static GstElementDetails smpte_details = { }; static GstStaticPadTemplate gst_smpte_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); static GstStaticPadTemplate gst_smpte_sink1_template = -GST_STATIC_PAD_TEMPLATE ( - "sink1", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("sink1", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); static GstStaticPadTemplate gst_smpte_sink2_template = -GST_STATIC_PAD_TEMPLATE ( - "sink2", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("sink2", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); /* SMPTE signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_TYPE, ARG_BORDER, @@ -80,48 +76,51 @@ enum { #define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_transition_type_get_type()) static GType -gst_smpte_transition_type_get_type (void) +gst_smpte_transition_type_get_type (void) { static GType smpte_transition_type = 0; GEnumValue *smpte_transitions; if (!smpte_transition_type) { const GList *definitions; - gint i=0; + gint i = 0; definitions = gst_mask_get_definitions (); - smpte_transitions = g_new0 (GEnumValue, g_list_length ((GList *)definitions)+1); + smpte_transitions = + g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); while (definitions) { GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; + definitions = g_list_next (definitions); smpte_transitions[i].value = definition->type; smpte_transitions[i].value_name = definition->short_name; smpte_transitions[i].value_nick = definition->long_name; - + i++; } - smpte_transition_type = - g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); + smpte_transition_type = + g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); } return smpte_transition_type; -} +} -static void gst_smpte_class_init (GstSMPTEClass *klass); -static void gst_smpte_base_init (GstSMPTEClass *klass); -static void gst_smpte_init (GstSMPTE *smpte); +static void gst_smpte_class_init (GstSMPTEClass * klass); +static void gst_smpte_base_init (GstSMPTEClass * klass); +static void gst_smpte_init (GstSMPTE * smpte); -static void gst_smpte_loop (GstElement *element); +static void gst_smpte_loop (GstElement * element); -static void gst_smpte_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_smpte_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_smpte_signals[LAST_SIGNAL] = { 0 }; */ static GType @@ -131,45 +130,46 @@ gst_smpte_get_type (void) if (!smpte_type) { static const GTypeInfo smpte_info = { - sizeof(GstSMPTEClass), - (GBaseInitFunc)gst_smpte_base_init, + sizeof (GstSMPTEClass), + (GBaseInitFunc) gst_smpte_base_init, NULL, - (GClassInitFunc)gst_smpte_class_init, + (GClassInitFunc) gst_smpte_class_init, NULL, NULL, - sizeof(GstSMPTE), + sizeof (GstSMPTE), 0, - (GInstanceInitFunc)gst_smpte_init, + (GInstanceInitFunc) gst_smpte_init, }; - smpte_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); + smpte_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); } return smpte_type; } static void -gst_smpte_base_init (GstSMPTEClass *klass) +gst_smpte_base_init (GstSMPTEClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_sink1_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_sink2_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_sink1_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_sink2_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_src_template)); gst_element_class_set_details (element_class, &smpte_details); } static void -gst_smpte_class_init (GstSMPTEClass *klass) +gst_smpte_class_init (GstSMPTEClass * 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_smpte_set_property; gobject_class->get_property = gst_smpte_get_property; @@ -177,39 +177,42 @@ gst_smpte_class_init (GstSMPTEClass *klass) _gst_mask_init (); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, - g_param_spec_enum ("type", "Type", "The type of transition to use", - GST_TYPE_SMPTE_TRANSITION_TYPE, 1, G_PARAM_READWRITE)); + g_param_spec_enum ("type", "Type", "The type of transition to use", + GST_TYPE_SMPTE_TRANSITION_TYPE, 1, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FPS, - g_param_spec_float ("fps", "FPS", "Frames per second if no input files are given", - 0., G_MAXFLOAT, 25., G_PARAM_READWRITE)); + g_param_spec_float ("fps", "FPS", + "Frames per second if no input files are given", 0., G_MAXFLOAT, 25., + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BORDER, - g_param_spec_int ("border", "Border", "The border width of the transition", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("border", "Border", + "The border width of the transition", 0, G_MAXINT, 0, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEPTH, - g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", - 1, 24, 16, G_PARAM_READWRITE)); + g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, + 16, G_PARAM_READWRITE)); } /* 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 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 -fill_i420 (guint8 *data, gint width, gint height, gint color) +fill_i420 (guint8 * data, gint width, gint height, gint color) { gint size = width * height, size4 = size >> 2; guint8 *yp = data; guint8 *up = data + size; guint8 *vp = data + size + size4; - + memset (yp, y_colors[color], size); memset (up, u_colors[color], size4); memset (vp, v_colors[color], size4); } static gboolean -gst_smpte_update_mask (GstSMPTE *smpte, gint type, gint depth, gint width, gint height) +gst_smpte_update_mask (GstSMPTE * smpte, gint type, gint depth, gint width, + gint height) { GstMask *newmask; @@ -230,7 +233,7 @@ gst_smpte_update_mask (GstSMPTE *smpte, gint type, gint depth, gint width, gint } static gboolean -gst_smpte_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_smpte_sinkconnect (GstPad * pad, const GstCaps * caps) { GstSMPTE *smpte; GstStructure *structure; @@ -243,29 +246,34 @@ gst_smpte_sinkconnect (GstPad *pad, const GstCaps *caps) ret = gst_structure_get_int (structure, "width", &smpte->width); ret &= gst_structure_get_int (structure, "height", &smpte->height); ret &= gst_structure_get_double (structure, "framerate", &smpte->fps); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; - gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, + smpte->height); /* forward to the next plugin */ - return gst_pad_try_set_caps(smpte->srcpad, caps); + return gst_pad_try_set_caps (smpte->srcpad, caps); } -static void -gst_smpte_init (GstSMPTE *smpte) +static void +gst_smpte_init (GstSMPTE * smpte) { - smpte->sinkpad1 = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_sink1_template), "sink1"); + smpte->sinkpad1 = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_sink1_template), "sink1"); gst_pad_set_link_function (smpte->sinkpad1, gst_smpte_sinkconnect); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad1); - smpte->sinkpad2 = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_sink2_template), "sink2"); + smpte->sinkpad2 = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_sink2_template), "sink2"); gst_pad_set_link_function (smpte->sinkpad2, gst_smpte_sinkconnect); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad2); - smpte->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_src_template), "src"); + smpte->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_src_template), "src"); gst_element_add_pad (GST_ELEMENT (smpte), smpte->srcpad); gst_element_set_loop_function (GST_ELEMENT (smpte), gst_smpte_loop); @@ -278,48 +286,53 @@ gst_smpte_init (GstSMPTE *smpte) smpte->type = 1; smpte->border = 0; smpte->depth = 16; - gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, + smpte->height); } static void -gst_smpte_blend_i420 (guint8 *in1, guint8 *in2, guint8 *out, GstMask *mask, - gint width, gint height, gint border, gint pos) +gst_smpte_blend_i420 (guint8 * in1, guint8 * in2, guint8 * out, GstMask * mask, + gint width, gint height, gint border, gint pos) { guint32 *maskp; gint value; gint i, j; gint min, max; - guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; + guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; gint lumsize = width * height; gint chromsize = lumsize >> 2; - if (border == 0) border++; + if (border == 0) + border++; - min = pos - border; + min = pos - border; max = pos; - in1u = in1 + lumsize; in1v = in1u + chromsize; - in2u = in2 + lumsize; in2v = in2u + chromsize; - outu = out + lumsize; outv = outu + chromsize; - + in1u = in1 + lumsize; + in1v = in1u + chromsize; + in2u = in2 + lumsize; + in2v = in2u + chromsize; + outu = out + lumsize; + outv = outu + chromsize; + maskp = mask->data; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { value = *maskp++; value = ((CLAMP (value, min, max) - min) << 8) / border; - + *out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8; if (!(i & 1) && !(j & 1)) { - *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; - *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; + *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; + *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; } } } } static void -gst_smpte_loop (GstElement *element) +gst_smpte_loop (GstElement * element) { GstSMPTE *smpte; GstBuffer *outbuf; @@ -335,8 +348,7 @@ gst_smpte_loop (GstElement *element) if (GST_IS_EVENT (in1)) { gst_pad_push (smpte->srcpad, GST_DATA (in1)); in1 = NULL; - } - else + } else ts = GST_BUFFER_TIMESTAMP (in1); } if (GST_PAD_IS_USABLE (smpte->sinkpad2) && in2 == NULL) { @@ -344,8 +356,7 @@ gst_smpte_loop (GstElement *element) if (GST_IS_EVENT (in2)) { gst_pad_push (smpte->srcpad, GST_DATA (in2)); in2 = NULL; - } - else + } else ts = GST_BUFFER_TIMESTAMP (in2); } @@ -358,33 +369,33 @@ gst_smpte_loop (GstElement *element) fill_i420 (GST_BUFFER_DATA (in2), smpte->width, smpte->height, 0); } - if (smpte->position < smpte->duration) { + if (smpte->position < smpte->duration) { outbuf = gst_buffer_new_and_alloc (smpte->width * smpte->height * 3); if (!GST_PAD_CAPS (smpte->srcpad)) { GstCaps *caps; - caps = gst_caps_copy (gst_static_caps_get ( - &gst_smpte_src_template.static_caps)); - gst_caps_set_simple (caps, - "width", G_TYPE_INT, smpte->width, - "height", G_TYPE_INT, smpte->height, - "framerate", G_TYPE_DOUBLE, smpte->fps, NULL); + + caps = + gst_caps_copy (gst_static_caps_get (&gst_smpte_src_template. + static_caps)); + gst_caps_set_simple (caps, "width", G_TYPE_INT, smpte->width, "height", + G_TYPE_INT, smpte->height, "framerate", G_TYPE_DOUBLE, smpte->fps, + NULL); if (!gst_pad_try_set_caps (smpte->srcpad, caps)) { - GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), (NULL)); - return; + GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), (NULL)); + return; } } - gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), - GST_BUFFER_DATA (in2), - GST_BUFFER_DATA (outbuf), - smpte->mask, smpte->width, smpte->height, - smpte->border, - ((1 << smpte->depth) + smpte->border) * - smpte->position / smpte->duration); - } - else { + gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), + GST_BUFFER_DATA (in2), + GST_BUFFER_DATA (outbuf), + smpte->mask, smpte->width, smpte->height, + smpte->border, + ((1 << smpte->depth) + smpte->border) * + smpte->position / smpte->duration); + } else { outbuf = in2; gst_buffer_ref (in2); } @@ -401,20 +412,20 @@ gst_smpte_loop (GstElement *element) } static void -gst_smpte_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; - smpte = GST_SMPTE(object); + smpte = GST_SMPTE (object); switch (prop_id) { case ARG_TYPE: { gint type = g_value_get_enum (value); - gst_smpte_update_mask (smpte, type, smpte->depth, - smpte->width, smpte->height); + gst_smpte_update_mask (smpte, type, smpte->depth, + smpte->width, smpte->height); break; } case ARG_BORDER: @@ -427,8 +438,8 @@ gst_smpte_set_property (GObject *object, guint prop_id, { gint depth = g_value_get_int (value); - gst_smpte_update_mask (smpte, smpte->type, depth, - smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, depth, + smpte->width, smpte->height); break; } default: @@ -438,12 +449,12 @@ gst_smpte_set_property (GObject *object, guint prop_id, } static void -gst_smpte_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; - smpte = GST_SMPTE(object); + smpte = GST_SMPTE (object); switch (prop_id) { case ARG_TYPE: @@ -468,20 +479,13 @@ gst_smpte_get_property (GObject *object, guint prop_id, static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "smpte", - GST_RANK_NONE, GST_TYPE_SMPTE); + return gst_element_register (plugin, "smpte", GST_RANK_NONE, GST_TYPE_SMPTE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "smpte", - "Apply the standard SMPTE transitions on video images", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smpte", + "Apply the standard SMPTE transitions on video images", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/smpte/gstsmpte.h b/gst/smpte/gstsmpte.h index 40844209..762eebf8 100644 --- a/gst/smpte/gstsmpte.h +++ b/gst/smpte/gstsmpte.h @@ -38,28 +38,28 @@ typedef struct _GstSMPTE GstSMPTE; typedef struct _GstSMPTEClass GstSMPTEClass; -struct _GstSMPTE { - GstElement element; +struct _GstSMPTE +{ + GstElement element; - gint format; - gint width; - gint height; - gdouble fps; + gint format; + gint width; + gint height; + gdouble fps; - gint duration; - gint position; + gint duration; + gint position; - GstPad *srcpad, - *sinkpad1, - *sinkpad2; + GstPad *srcpad, *sinkpad1, *sinkpad2; - gint type; - gint border; - gint depth; - GstMask *mask; + gint type; + gint border; + gint depth; + GstMask *mask; }; -struct _GstSMPTEClass { +struct _GstSMPTEClass +{ GstElementClass parent_class; }; diff --git a/gst/smpte/paint.c b/gst/smpte/paint.c index dae3c6f1..fdff77e5 100644 --- a/gst/smpte/paint.c +++ b/gst/smpte/paint.c @@ -26,21 +26,20 @@ #include "paint.h" void -gst_smpte_paint_vbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1) +gst_smpte_paint_vbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; - + g_assert (width > 0); g_assert (height > 0); dest = dest + y0 * stride + x0; - + for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[j] = (c1 * j + c0 * (width - j)) / width; @@ -50,16 +49,15 @@ gst_smpte_paint_vbox (guint32 *dest, gint stride, } void -gst_smpte_paint_hbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1) +gst_smpte_paint_hbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; - + g_assert (width > 0); g_assert (height > 0); @@ -68,7 +66,8 @@ gst_smpte_paint_hbox (guint32 *dest, gint stride, dest = dest + y0 * stride + x0; for (i = 0; i < height; i++) { - guint32 value = (c1 * i + c0 * (height - i)) / height; + guint32 value = (c1 * i + c0 * (height - i)) / height; + for (j = 0; j < width; j++) { dest[j] = value; } @@ -148,29 +147,35 @@ G_STMT_START { \ } G_STMT_END void -gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint sdxl, sdyl, sdcl, dxlabs, dylabs, dclabs, xrl, yrl, crl, pxl, pyl, pcl; gint sdxr, sdyr, sdcr, dxrabs, dyrabs, dcrabs, xrr, yrr, crr, pxr, pyr, pcr; gint i, j, k, seg_start, seg_end; - if (y0 > y1) { SWAP_INT (x0, x1); SWAP_INT (y0, y1); SWAP_INT (c0, c1); } - if (y0 > y2) { SWAP_INT (x0, x2); SWAP_INT (y0, y2); SWAP_INT (c0, c2); } - if (y1 > y2) { SWAP_INT (x1, x2); SWAP_INT (y1, y2); SWAP_INT (c1, c2); } - - PREPARE_3D_LINE (x0,y0,c0,x2,y2,c2, - dxlabs,dylabs,dclabs, - sdxl, sdyl,sdcl, - xrl,yrl,crl, - pxl,pyl,pcl); - - PREPARE_3D_LINE (x0,y0,c0,x1,y1,c1, - dxrabs,dyrabs,dcrabs, - sdxr, sdyr,sdcr, - xrr,yrr,crr, - pxr,pyr,pcr); + if (y0 > y1) { + SWAP_INT (x0, x1); + SWAP_INT (y0, y1); + SWAP_INT (c0, c1); + } + if (y0 > y2) { + SWAP_INT (x0, x2); + SWAP_INT (y0, y2); + SWAP_INT (c0, c2); + } + if (y1 > y2) { + SWAP_INT (x1, x2); + SWAP_INT (y1, y2); + SWAP_INT (c1, c2); + } + + PREPARE_3D_LINE (x0, y0, c0, x2, y2, c2, + dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, xrl, yrl, crl, pxl, pyl, pcl); + + PREPARE_3D_LINE (x0, y0, c0, x1, y1, c1, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); dest = dest + stride * y0; seg_start = y0; @@ -183,37 +188,32 @@ gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, gint sign = SIGN (e - s); e += sign; - for (j = s; j != e; j+=sign) { - dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); + for (j = s; j != e; j += sign) { + dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); } while (pyr == i) { - STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, - xrr, yrr, crr, pxr, pyr, pcr); + STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, + xrr, yrr, crr, pxr, pyr, pcr); } while (pyl == i) { - STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, - xrl, yrl, crl, pxl, pyl, pcl); + STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, + xrl, yrl, crl, pxl, pyl, pcl); } dest += stride; } - PREPARE_3D_LINE (x1,y1,c1,x2,y2,c2, - dxrabs,dyrabs,dcrabs, - sdxr, sdyr,sdcr, - xrr,yrr,crr, - pxr,pyr,pcr); + PREPARE_3D_LINE (x1, y1, c1, x2, y2, c2, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); seg_start = y1; seg_end = y2; } } -static void -draw_bresenham_line (guint32 *dest, gint stride, - gint x0, gint y0, - gint x1, gint y1, - guint32 col) +static void +draw_bresenham_line (guint32 * dest, gint stride, + gint x0, gint y0, gint x1, gint y1, guint32 col) { gint dx = abs (x1 - x0); gint dy = abs (y1 - y0); @@ -224,13 +224,12 @@ draw_bresenham_line (guint32 *dest, gint stride, x_incr = SIGN (x1 - x0); y_incr = SIGN (y1 - y0) * stride; - - if (dx >= dy) { + + if (dx >= dy) { dpr = dy << 1; i = dx; indep = x_incr; - } - else { + } else { dpr = dx << 1; i = dy; indep = y_incr; @@ -242,7 +241,7 @@ draw_bresenham_line (guint32 *dest, gint stride, for (; i >= 0; i--) { *dest = col; - if (P > 0) { + if (P > 0) { dest += x_incr; dest += y_incr; P += dpru; @@ -254,10 +253,9 @@ draw_bresenham_line (guint32 *dest, gint stride, } void -gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2) +gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint i; gint sign; @@ -265,11 +263,11 @@ gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, gfloat len1; angle_s = 0.0; - angle_e = acos (((x1-x0) * (x2-x0) + (y1-y0) * (y2-y0))/ - (sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) * - sqrt ((x2-x0) * (x2-x0) + (y2-y0) * (y2-y0)))); + angle_e = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0)))); - len1 = sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)); + len1 = sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); if (x1 == x2) { sign = SIGN (y2 - y1); @@ -278,65 +276,57 @@ gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, if (y1 == i) angle = 0; else - angle = acos (((x1-x0) * (x2-x0) + (y1-y0) * (i-y0)) / - (len1 * sqrt ((x1-x0) * (x1-x0) + (i-y0) * (i-y0)))) / angle_e; + angle = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (i - y0)) / + (len1 * sqrt ((x1 - x0) * (x1 - x0) + (i - y0) * (i - + y0)))) / angle_e; draw_bresenham_line (dest, stride, - x0, y0, x1, i, - (c2 * angle + c1 * (1.0-angle))); + x0, y0, x1, i, (c2 * angle + c1 * (1.0 - angle))); } - } - else if (y1 == y2) { + } else if (y1 == y2) { sign = SIGN (x2 - x1); for (i = x1; i != (x2 + sign); i += sign) { if (x1 == i) angle = 0; else - angle = acos (((x1-x0) * (i-x0) + (y1-y0) * (y2-y0)) / - (len1 * sqrt ((i-x0) * (i-x0) + (y2-y0) * (y2-y0)))) / angle_e; + angle = acos (((x1 - x0) * (i - x0) + (y1 - y0) * (y2 - y0)) / + (len1 * sqrt ((i - x0) * (i - x0) + (y2 - y0) * (y2 - + y0)))) / angle_e; draw_bresenham_line (dest, stride, - x0, y0, i, y1, - (c2 * angle + c1 * (1.0-angle))); + x0, y0, i, y1, (c2 * angle + c1 * (1.0 - angle))); } } } void -gst_smpte_paint_box_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2) +gst_smpte_paint_box_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gfloat angle_m, col_m; gint xv, yv; - if (x1 == x0) { + if (x1 == x0) { xv = x2; yv = y1; } else if (y1 == y0) { xv = x1; yv = y2; - } - else { + } else { g_warning ("paint box clock: not supported"); return; } - angle_m = 2 * acos (((x1-x0) * (xv-x0) + (y1-y0) * (yv-y0))/ - (sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) * - sqrt ((xv-x0) * (xv-x0) + (yv-y0) * (yv-y0)))) / M_PI; - - col_m = c2 * angle_m + c1 * (1.0-angle_m); + angle_m = 2 * acos (((x1 - x0) * (xv - x0) + (y1 - y0) * (yv - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((xv - x0) * (xv - x0) + (yv - y0) * (yv - y0)))) / M_PI; + + col_m = c2 * angle_m + c1 * (1.0 - angle_m); gst_smpte_paint_triangle_clock (dest, stride, - x0, y0, c0, - x1, y1, c1, - xv, yv, col_m); + x0, y0, c0, x1, y1, c1, xv, yv, col_m); gst_smpte_paint_triangle_clock (dest, stride, - x0, y0, c0, - xv, yv, col_m, - x2, y2, c2); + x0, y0, c0, xv, yv, col_m, x2, y2, c2); } - diff --git a/gst/smpte/paint.h b/gst/smpte/paint.h index 4c34cf92..aa9fd425 100644 --- a/gst/smpte/paint.h +++ b/gst/smpte/paint.h @@ -22,26 +22,21 @@ #include -void gst_smpte_paint_vbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1); -void gst_smpte_paint_hbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1); +void gst_smpte_paint_vbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); +void gst_smpte_paint_hbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); -void gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); -void gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); -void gst_smpte_paint_box_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_box_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); #endif /* __GST_SMPTE_PAINT_H__ */ diff --git a/gst/spectrum/gstspectrum.c b/gst/spectrum/gstspectrum.c index 920d69ee..aa309f1c 100644 --- a/gst/spectrum/gstspectrum.c +++ b/gst/spectrum/gstspectrum.c @@ -25,40 +25,44 @@ #include "gstspectrum.h" /* elementfactory information */ -static GstElementDetails gst_spectrum_details = GST_ELEMENT_DETAILS ( - "Spectrum analyzer", - "Filter/Analyzer/Audio", - "Run an FFT on the audio signal, output spectrum data", - "Erik Walthinsen " -); +static GstElementDetails gst_spectrum_details = +GST_ELEMENT_DETAILS ("Spectrum analyzer", + "Filter/Analyzer/Audio", + "Run an FFT on the audio signal, output spectrum data", + "Erik Walthinsen "); /* Spectrum signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_WIDTH, }; -static void gst_spectrum_base_init (gpointer g_class); -static void gst_spectrum_class_init (GstSpectrumClass *klass); -static void gst_spectrum_init (GstSpectrum *spectrum); +static void gst_spectrum_base_init (gpointer g_class); +static void gst_spectrum_class_init (GstSpectrumClass * klass); +static void gst_spectrum_init (GstSpectrum * spectrum); -static void gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); -static void gst_spectrum_chain (GstPad *pad, GstData *_data); +static void gst_spectrum_chain (GstPad * pad, GstData * _data); #define fixed short -int gst_spectrum_fix_fft(fixed fr[], fixed fi[], int m, int inverse); -void gst_spectrum_fix_loud(fixed loud[], fixed fr[], fixed fi[], int n, int scale_shift); -void gst_spectrum_window(fixed fr[], int n); +int gst_spectrum_fix_fft (fixed fr[], fixed fi[], int m, int inverse); +void gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, + int scale_shift); +void gst_spectrum_window (fixed fr[], int n); static GstElementClass *parent_class = NULL; + /*static guint gst_spectrum_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -68,17 +72,19 @@ gst_spectrum_get_type (void) if (!spectrum_type) { static const GTypeInfo spectrum_info = { - sizeof(GstSpectrumClass), + sizeof (GstSpectrumClass), gst_spectrum_base_init, NULL, - (GClassInitFunc)gst_spectrum_class_init, + (GClassInitFunc) gst_spectrum_class_init, NULL, NULL, - sizeof(GstSpectrum), + sizeof (GstSpectrum), 0, - (GInstanceInitFunc)gst_spectrum_init, + (GInstanceInitFunc) gst_spectrum_init, }; - spectrum_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSpectrum", &spectrum_info, 0); + spectrum_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSpectrum", &spectrum_info, + 0); } return spectrum_type; } @@ -91,41 +97,40 @@ gst_spectrum_base_init (gpointer g_class) gst_element_class_set_details (element_class, &gst_spectrum_details); } static void -gst_spectrum_class_init (GstSpectrumClass *klass) +gst_spectrum_class_init (GstSpectrumClass * klass) { GObjectClass *gobject_class; - gobject_class = (GObjectClass*)klass; + gobject_class = (GObjectClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - 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_WRITABLE)); /* CHECKME */ + 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_WRITABLE)); /* CHECKME */ gobject_class->set_property = gst_spectrum_set_property; } static void -gst_spectrum_init (GstSpectrum *spectrum) +gst_spectrum_init (GstSpectrum * spectrum) { - spectrum->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(spectrum),spectrum->sinkpad); - gst_pad_set_chain_function(spectrum->sinkpad,gst_spectrum_chain); - spectrum->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(spectrum),spectrum->srcpad); + spectrum->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->sinkpad); + gst_pad_set_chain_function (spectrum->sinkpad, gst_spectrum_chain); + spectrum->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->srcpad); spectrum->width = 75; } static void -gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSpectrum *spectrum; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SPECTRUM(object)); - spectrum = GST_SPECTRUM(object); + g_return_if_fail (GST_IS_SPECTRUM (object)); + spectrum = GST_SPECTRUM (object); switch (prop_id) { case ARG_WIDTH: @@ -137,48 +142,49 @@ gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_spectrum_chain (GstPad *pad, GstData *_data) +gst_spectrum_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSpectrum *spectrum; gint spec_base, spec_len; gint16 *re, *im, *loud; gint16 *samples; - gint step,pos,i; + gint step, pos, i; guchar *spect; GstBuffer *newbuf; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); spectrum = GST_SPECTRUM (GST_OBJECT_PARENT (pad)); - samples = (gint16 *)GST_BUFFER_DATA(buf); + samples = (gint16 *) GST_BUFFER_DATA (buf); spec_base = 8; spec_len = 1024; - im = g_malloc(spec_len * sizeof(gint16)); - g_return_if_fail(im != NULL); - loud = g_malloc(spec_len * sizeof(gint16)); - g_return_if_fail(loud != NULL); + im = g_malloc (spec_len * sizeof (gint16)); + g_return_if_fail (im != NULL); + loud = g_malloc (spec_len * sizeof (gint16)); + g_return_if_fail (loud != NULL); - memset(im,0,spec_len * sizeof(gint16)); + memset (im, 0, spec_len * sizeof (gint16)); /*if (spectrum->meta->channels == 2) { */ - re = g_malloc(spec_len * sizeof(gint16)); - for (i=0;i> 1; + re = g_malloc (spec_len * sizeof (gint16)); + for (i = 0; i < spec_len; i++) + re[i] = (samples[(i * 2)] + samples[(i * 2) + 1]) >> 1; /*} else */ /* re = samples; */ - gst_spectrum_window(re,spec_len); - gst_spectrum_fix_fft(re,im,spec_base,FALSE); - gst_spectrum_fix_loud(loud,re,im,spec_len,0); - if (re != samples) g_free(re); - g_free(im); - step = spec_len / (spectrum->width*2); - spect = (guchar *)g_malloc(spectrum->width); - for (i=0,pos=0;iwidth;i++,pos += step) { + gst_spectrum_window (re, spec_len); + gst_spectrum_fix_fft (re, im, spec_base, FALSE); + gst_spectrum_fix_loud (loud, re, im, spec_len, 0); + if (re != samples) + g_free (re); + g_free (im); + step = spec_len / (spectrum->width * 2); + spect = (guchar *) g_malloc (spectrum->width); + for (i = 0, pos = 0; i < spectrum->width; i++, pos += step) { if (loud[pos] > -60) spect[i] = (loud[pos] + 60) / 2; else @@ -186,32 +192,27 @@ gst_spectrum_chain (GstPad *pad, GstData *_data) /* if (spect[i] > 15); */ /* spect[i] = 15; */ } - g_free(loud); - gst_buffer_unref(buf); + g_free (loud); + gst_buffer_unref (buf); /* g_free(samples); */ - newbuf = gst_buffer_new(); - g_return_if_fail(newbuf != NULL); - GST_BUFFER_DATA(newbuf) = spect; - GST_BUFFER_SIZE(newbuf) = spectrum->width; + newbuf = gst_buffer_new (); + g_return_if_fail (newbuf != NULL); + GST_BUFFER_DATA (newbuf) = spect; + GST_BUFFER_SIZE (newbuf) = spectrum->width; - gst_pad_push(spectrum->srcpad,GST_DATA (newbuf)); + gst_pad_push (spectrum->srcpad, GST_DATA (newbuf)); } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "spectrum", GST_RANK_NONE, GST_TYPE_SPECTRUM); + return gst_element_register (plugin, "spectrum", GST_RANK_NONE, + GST_TYPE_SPECTRUM); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "spectrum", - "Run an FFT on the audio signal, output spectrum data", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "spectrum", + "Run an FFT on the audio signal, output spectrum data", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/spectrum/gstspectrum.h b/gst/spectrum/gstspectrum.h index 8cc546ec..23c4ef4b 100644 --- a/gst/spectrum/gstspectrum.h +++ b/gst/spectrum/gstspectrum.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SPECTRUM \ @@ -41,27 +42,29 @@ extern "C" { #define GST_IS_SPECTRUM_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPECTRUM)) -typedef struct _GstSpectrum GstSpectrum; -typedef struct _GstSpectrumClass GstSpectrumClass; + typedef struct _GstSpectrum GstSpectrum; + typedef struct _GstSpectrumClass GstSpectrumClass; -struct _GstSpectrum { - GstElement element; + struct _GstSpectrum + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width; -}; + gint width; + }; -struct _GstSpectrumClass { - GstElementClass parent_class; -}; + struct _GstSpectrumClass + { + GstElementClass parent_class; + }; -GType gst_spectrum_get_type(void); + GType gst_spectrum_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SPECTRUM_H__ */ +#endif /* __GST_SPECTRUM_H__ */ diff --git a/gst/udp/gstudp.c b/gst/udp/gstudp.c index b98e6129..1192f6d7 100644 --- a/gst/udp/gstudp.c +++ b/gst/udp/gstudp.c @@ -25,25 +25,20 @@ #include "gstudpsink.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "udpsink", GST_RANK_NONE, GST_TYPE_UDPSINK)) + if (!gst_element_register (plugin, "udpsink", GST_RANK_NONE, + GST_TYPE_UDPSINK)) return FALSE; - + if (!gst_element_register (plugin, "udpsrc", GST_RANK_NONE, GST_TYPE_UDPSRC)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "udp", - "transfer data via UDP", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "udp", + "transfer data via UDP", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/udp/gstudp.h b/gst/udp/gstudp.h index 89103e93..e5fda050 100644 --- a/gst/udp/gstudp.h +++ b/gst/udp/gstudp.h @@ -36,7 +36,6 @@ extern "C" #ifdef __cplusplus } -#endif /* __cplusplus */ - -#endif /* __GST_UDP_H__ */ +#endif /* __cplusplus */ +#endif /* __GST_UDP_H__ */ diff --git a/gst/udp/gstudpsink.c b/gst/udp/gstudpsink.c index 86238af2..af365613 100644 --- a/gst/udp/gstudpsink.c +++ b/gst/udp/gstudpsink.c @@ -28,32 +28,34 @@ #define UDP_DEFAULT_CONTROL 1 /* elementfactory information */ -static GstElementDetails gst_udpsink_details = GST_ELEMENT_DETAILS ( - "UDP packet sender", - "Sink/Network", - "Send data over the network via UDP", - "Wim Taymans " -); +static GstElementDetails gst_udpsink_details = +GST_ELEMENT_DETAILS ("UDP packet sender", + "Sink/Network", + "Send data over the network via UDP", + "Wim Taymans "); /* UDPSink signals and args */ -enum { +enum +{ FRAME_ENCODED, /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_HOST, ARG_PORT, ARG_CONTROL, ARG_MTU - /* FILL ME */ + /* FILL ME */ }; #define GST_TYPE_UDPSINK_CONTROL (gst_udpsink_control_get_type()) static GType -gst_udpsink_control_get_type(void) { +gst_udpsink_control_get_type (void) +{ static GType udpsink_control_type = 0; static GEnumValue udpsink_control[] = { {CONTROL_NONE, "1", "none"}, @@ -62,27 +64,29 @@ gst_udpsink_control_get_type(void) { {CONTROL_ZERO, NULL, NULL}, }; if (!udpsink_control_type) { - udpsink_control_type = g_enum_register_static("GstUDPSinkControl", udpsink_control); + udpsink_control_type = + g_enum_register_static ("GstUDPSinkControl", udpsink_control); } return udpsink_control_type; } -static void gst_udpsink_base_init (gpointer g_class); -static void gst_udpsink_class_init (GstUDPSink *klass); -static void gst_udpsink_init (GstUDPSink *udpsink); +static void gst_udpsink_base_init (gpointer g_class); +static void gst_udpsink_class_init (GstUDPSink * klass); +static void gst_udpsink_init (GstUDPSink * udpsink); -static void gst_udpsink_set_clock (GstElement *element, GstClock *clock); +static void gst_udpsink_set_clock (GstElement * element, GstClock * clock); -static void gst_udpsink_chain (GstPad *pad,GstData *_data); -static GstElementStateReturn gst_udpsink_change_state (GstElement *element); +static void gst_udpsink_chain (GstPad * pad, GstData * _data); +static GstElementStateReturn gst_udpsink_change_state (GstElement * element); -static void gst_udpsink_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_udpsink_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_udpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_udpsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_udpsink_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -92,18 +96,20 @@ gst_udpsink_get_type (void) if (!udpsink_type) { static const GTypeInfo udpsink_info = { - sizeof(GstUDPSinkClass), + sizeof (GstUDPSinkClass), gst_udpsink_base_init, NULL, - (GClassInitFunc)gst_udpsink_class_init, + (GClassInitFunc) gst_udpsink_class_init, NULL, NULL, - sizeof(GstUDPSink), + sizeof (GstUDPSink), 0, - (GInstanceInitFunc)gst_udpsink_init, + (GInstanceInitFunc) gst_udpsink_init, NULL }; - udpsink_type = g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSink", &udpsink_info, 0); + udpsink_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSink", &udpsink_info, + 0); } return udpsink_type; } @@ -117,29 +123,27 @@ gst_udpsink_base_init (gpointer g_class) } static void -gst_udpsink_class_init (GstUDPSink *klass) +gst_udpsink_class_init (GstUDPSink * 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); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HOST, - g_param_spec_string ("host", "host", - "The host/IP/Multicast group to send the packets to", - UDP_DEFAULT_HOST, G_PARAM_READWRITE)); + g_param_spec_string ("host", "host", + "The host/IP/Multicast group to send the packets to", + UDP_DEFAULT_HOST, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT, - g_param_spec_int ("port", "port", "The port to send the packets to", - 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE)); + g_param_spec_int ("port", "port", "The port to send the packets to", + 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_CONTROL, - g_param_spec_enum ("control", "control", "The type of control", - GST_TYPE_UDPSINK_CONTROL, CONTROL_UDP, G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, ARG_MTU, - g_param_spec_int ("mtu", "mtu", "maximun transmit unit", G_MININT, G_MAXINT, - 0, G_PARAM_READWRITE)); /* CHECKME */ + g_param_spec_enum ("control", "control", "The type of control", + GST_TYPE_UDPSINK_CONTROL, CONTROL_UDP, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_MTU, g_param_spec_int ("mtu", "mtu", "maximun transmit unit", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_udpsink_set_property; gobject_class->get_property = gst_udpsink_get_property; @@ -150,7 +154,7 @@ gst_udpsink_class_init (GstUDPSink *klass) static GstPadLinkReturn -gst_udpsink_sink_link (GstPad *pad, const GstCaps *caps) +gst_udpsink_sink_link (GstPad * pad, const GstCaps * caps) { GstUDPSink *udpsink; struct sockaddr_in serv_addr; @@ -158,27 +162,28 @@ gst_udpsink_sink_link (GstPad *pad, const GstCaps *caps) int fd; FILE *f; guint bc_val; + #ifndef GST_DISABLE_LOADSAVE xmlDocPtr doc; xmlChar *buf; int buf_size; udpsink = GST_UDPSINK (gst_pad_get_parent (pad)); - - memset(&serv_addr, 0, sizeof(serv_addr)); - + + memset (&serv_addr, 0, sizeof (serv_addr)); + /* its a name rather than an ipnum */ - serverhost = gethostbyname(udpsink->host); - if (serverhost == (struct hostent *)0) { - perror("gethostbyname"); - return GST_PAD_LINK_REFUSED; + serverhost = gethostbyname (udpsink->host); + if (serverhost == (struct hostent *) 0) { + perror ("gethostbyname"); + return GST_PAD_LINK_REFUSED; } - - memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length); + + memmove (&serv_addr.sin_addr, serverhost->h_addr, serverhost->h_length); serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(udpsink->port+1); - + serv_addr.sin_port = htons (udpsink->port + 1); + doc = xmlNewDoc ("1.0"); doc->xmlRootNode = xmlNewDocNode (doc, NULL, "NewCaps", NULL); @@ -186,66 +191,66 @@ gst_udpsink_sink_link (GstPad *pad, const GstCaps *caps) switch (udpsink->control) { case CONTROL_UDP: - if ((fd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { - perror("socket"); - return GST_PAD_LINK_REFUSED; - } - - /* We can only do broadcast in udp */ - bc_val = 1; - setsockopt (fd,SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)); - - xmlDocDumpMemory(doc, &buf, &buf_size); - - if (sendto (fd, buf, buf_size, 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) - { - perror("sending"); - return GST_PAD_LINK_REFUSED; - } - close (fd); - break; + if ((fd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { + perror ("socket"); + return GST_PAD_LINK_REFUSED; + } + + /* We can only do broadcast in udp */ + bc_val = 1; + setsockopt (fd, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)); + + xmlDocDumpMemory (doc, &buf, &buf_size); + + if (sendto (fd, buf, buf_size, 0, (struct sockaddr *) &serv_addr, + sizeof (serv_addr)) == -1) { + perror ("sending"); + return GST_PAD_LINK_REFUSED; + } + close (fd); + break; case CONTROL_TCP: - if ((fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { - perror("socket"); - return GST_PAD_LINK_REFUSED; - } - - if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) { - g_printerr ("udpsink: connect to %s port %d failed: %s\n", - udpsink->host, udpsink->port, g_strerror(errno)); - return GST_PAD_LINK_REFUSED; - } - - f = fdopen (dup (fd), "wb"); - - xmlDocDump(f, doc); - fclose (f); - close (fd); - break; + if ((fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { + perror ("socket"); + return GST_PAD_LINK_REFUSED; + } + + if (connect (fd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) != 0) { + g_printerr ("udpsink: connect to %s port %d failed: %s\n", + udpsink->host, udpsink->port, g_strerror (errno)); + return GST_PAD_LINK_REFUSED; + } + + f = fdopen (dup (fd), "wb"); + + xmlDocDump (f, doc); + fclose (f); + close (fd); + break; case CONTROL_NONE: - return GST_PAD_LINK_OK; - break; + return GST_PAD_LINK_OK; + break; default: - return GST_PAD_LINK_REFUSED; - break; + return GST_PAD_LINK_REFUSED; + break; } #endif - + return GST_PAD_LINK_OK; } static void -gst_udpsink_set_clock (GstElement *element, GstClock *clock) +gst_udpsink_set_clock (GstElement * element, GstClock * clock) { GstUDPSink *udpsink; - + udpsink = GST_UDPSINK (element); udpsink->clock = clock; } static void -gst_udpsink_init (GstUDPSink *udpsink) +gst_udpsink_init (GstUDPSink * udpsink) { /* create the sink and src pads */ udpsink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); @@ -257,12 +262,12 @@ gst_udpsink_init (GstUDPSink *udpsink) udpsink->port = UDP_DEFAULT_PORT; udpsink->control = CONTROL_UDP; udpsink->mtu = 1024; - + udpsink->clock = NULL; } static void -gst_udpsink_chain (GstPad *pad, GstData *_data) +gst_udpsink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstUDPSink *udpsink; @@ -273,63 +278,64 @@ gst_udpsink_chain (GstPad *pad, GstData *_data) g_return_if_fail (buf != NULL); udpsink = GST_UDPSINK (GST_OBJECT_PARENT (pad)); - + if (udpsink->clock && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { gst_element_wait (GST_ELEMENT (udpsink), GST_BUFFER_TIMESTAMP (buf)); } - - tolen = sizeof(udpsink->theiraddr); - - /* - if (sendto (udpsink->sock, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf), 0, (struct sockaddr *) &udpsink->theiraddr, - tolen) == -1) { - perror("sending"); - } -*/ - /* MTU */ + + tolen = sizeof (udpsink->theiraddr); + + /* + if (sendto (udpsink->sock, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), 0, (struct sockaddr *) &udpsink->theiraddr, + tolen) == -1) { + perror("sending"); + } + */ + /* MTU */ for (i = 0; i < GST_BUFFER_SIZE (buf); i += udpsink->mtu) { if (GST_BUFFER_SIZE (buf) - i > udpsink->mtu) { - if (sendto (udpsink->sock, GST_BUFFER_DATA (buf) + i, - udpsink->mtu, 0, (struct sockaddr *) &udpsink->theiraddr, - tolen) == -1) { - perror("sending"); - } - } - else { - if (sendto (udpsink->sock, GST_BUFFER_DATA (buf) + i, - GST_BUFFER_SIZE (buf) -i, 0, - (struct sockaddr *) &udpsink->theiraddr, tolen) == -1) { - perror("sending"); - } + if (sendto (udpsink->sock, GST_BUFFER_DATA (buf) + i, + udpsink->mtu, 0, (struct sockaddr *) &udpsink->theiraddr, + tolen) == -1) { + perror ("sending"); + } + } else { + if (sendto (udpsink->sock, GST_BUFFER_DATA (buf) + i, + GST_BUFFER_SIZE (buf) - i, 0, + (struct sockaddr *) &udpsink->theiraddr, tolen) == -1) { + perror ("sending"); + } } } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_udpsink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstUDPSink *udpsink; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_UDPSINK(object)); - udpsink = GST_UDPSINK(object); + g_return_if_fail (GST_IS_UDPSINK (object)); + udpsink = GST_UDPSINK (object); switch (prop_id) { case ARG_HOST: - if (udpsink->host != NULL) g_free(udpsink->host); + if (udpsink->host != NULL) + g_free (udpsink->host); if (g_value_get_string (value) == NULL) - udpsink->host = NULL; + udpsink->host = NULL; else - udpsink->host = g_strdup (g_value_get_string (value)); + udpsink->host = g_strdup (g_value_get_string (value)); break; case ARG_PORT: - udpsink->port = g_value_get_int (value); + udpsink->port = g_value_get_int (value); break; case ARG_CONTROL: - udpsink->control = g_value_get_enum (value); + udpsink->control = g_value_get_enum (value); break; case ARG_MTU: udpsink->mtu = g_value_get_int (value); @@ -340,13 +346,14 @@ gst_udpsink_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -gst_udpsink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstUDPSink *udpsink; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_UDPSINK(object)); - udpsink = GST_UDPSINK(object); + g_return_if_fail (GST_IS_UDPSINK (object)); + udpsink = GST_UDPSINK (object); switch (prop_id) { case ARG_HOST: @@ -370,67 +377,66 @@ gst_udpsink_get_property (GObject *object, guint prop_id, GValue *value, GParamS /* create a socket for sending to remote machine */ static gboolean -gst_udpsink_init_send (GstUDPSink *sink) +gst_udpsink_init_send (GstUDPSink * sink) { struct hostent *he; struct in_addr addr; guint bc_val; memset (&sink->theiraddr, 0, sizeof (sink->theiraddr)); - sink->theiraddr.sin_family = AF_INET; /* host byte order */ - sink->theiraddr.sin_port = htons (sink->port); /* short, network byte order */ + sink->theiraddr.sin_family = AF_INET; /* host byte order */ + sink->theiraddr.sin_port = htons (sink->port); /* short, network byte order */ /* if its an IP address */ if (inet_aton (sink->host, &addr)) { /* check if its a multicast address */ if ((ntohl (addr.s_addr) & 0xe0000000) == 0xe0000000) { - sink->multi_addr.imr_multiaddr.s_addr = addr.s_addr; - sink->multi_addr.imr_interface.s_addr = INADDR_ANY; - - sink->theiraddr.sin_addr = sink->multi_addr.imr_multiaddr; - - /* Joining the multicast group */ - setsockopt (sink->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &sink->multi_addr, sizeof(sink->multi_addr)); + sink->multi_addr.imr_multiaddr.s_addr = addr.s_addr; + sink->multi_addr.imr_interface.s_addr = INADDR_ANY; + + sink->theiraddr.sin_addr = sink->multi_addr.imr_multiaddr; + + /* Joining the multicast group */ + setsockopt (sink->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &sink->multi_addr, + sizeof (sink->multi_addr)); } - + else { - sink->theiraddr.sin_addr = - *((struct in_addr *) &addr); + sink->theiraddr.sin_addr = *((struct in_addr *) &addr); } } - + /* we dont need to lookup for localhost */ - else if (strcmp (sink->host, UDP_DEFAULT_HOST) == 0 && - inet_aton ("127.0.0.1", &addr)) { - sink->theiraddr.sin_addr = - *((struct in_addr *) &addr); + else if (strcmp (sink->host, UDP_DEFAULT_HOST) == 0 && + inet_aton ("127.0.0.1", &addr)) { + sink->theiraddr.sin_addr = *((struct in_addr *) &addr); } /* if its a hostname */ else if ((he = gethostbyname (sink->host))) { sink->theiraddr.sin_addr = *((struct in_addr *) he->h_addr); } - + else { - perror("hostname lookup error?"); - return FALSE; + perror ("hostname lookup error?"); + return FALSE; } if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) { - perror("socket"); - return FALSE; + perror ("socket"); + return FALSE; } bc_val = 1; setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)); - + GST_FLAG_SET (sink, GST_UDPSINK_OPEN); return TRUE; } static void -gst_udpsink_close (GstUDPSink *sink) +gst_udpsink_close (GstUDPSink * sink) { close (sink->sock); @@ -438,7 +444,7 @@ gst_udpsink_close (GstUDPSink *sink) } static GstElementStateReturn -gst_udpsink_change_state (GstElement *element) +gst_udpsink_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_UDPSINK (element), GST_STATE_FAILURE); @@ -448,7 +454,7 @@ gst_udpsink_change_state (GstElement *element) } else { if (!GST_FLAG_IS_SET (element, GST_UDPSINK_OPEN)) { if (!gst_udpsink_init_send (GST_UDPSINK (element))) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } } @@ -457,4 +463,3 @@ gst_udpsink_change_state (GstElement *element) return GST_STATE_SUCCESS; } - diff --git a/gst/udp/gstudpsink.h b/gst/udp/gstudpsink.h index f49b4efe..9a08f709 100644 --- a/gst/udp/gstudpsink.h +++ b/gst/udp/gstudpsink.h @@ -25,8 +25,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #include #include @@ -54,45 +55,48 @@ extern "C" { #define GST_IS_UDPSINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSINK)) -typedef struct _GstUDPSink GstUDPSink; -typedef struct _GstUDPSinkClass GstUDPSinkClass; + typedef struct _GstUDPSink GstUDPSink; + typedef struct _GstUDPSinkClass GstUDPSinkClass; -typedef enum { - GST_UDPSINK_OPEN = GST_ELEMENT_FLAG_LAST, + typedef enum + { + GST_UDPSINK_OPEN = GST_ELEMENT_FLAG_LAST, - GST_UDPSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, -} GstUDPSinkFlags; + GST_UDPSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, + } GstUDPSinkFlags; -struct _GstUDPSink { - GstElement element; + struct _GstUDPSink + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - int sock; - struct sockaddr_in theiraddr; - struct ip_mreq multi_addr; + int sock; + struct sockaddr_in theiraddr; + struct ip_mreq multi_addr; - gint port; - Gst_UDP_Control control; - gchar *host; - - guint mtu; - - GstClock *clock; -}; + gint port; + Gst_UDP_Control control; + gchar *host; -struct _GstUDPSinkClass { - GstElementClass parent_class; + guint mtu; -}; + GstClock *clock; + }; -GType gst_udpsink_get_type(void); + struct _GstUDPSinkClass + { + GstElementClass parent_class; + + }; + + GType gst_udpsink_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_UDPSINK_H__ */ +#endif /* __GST_UDPSINK_H__ */ diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c index 66bcd268..48e00862 100644 --- a/gst/udp/gstudpsrc.c +++ b/gst/udp/gstudpsrc.c @@ -29,30 +29,32 @@ #define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" /* elementfactory information */ -static GstElementDetails gst_udpsrc_details = GST_ELEMENT_DETAILS ( - "UDP packet receiver", - "Source/Network", - "Receive data over the network via UDP", - "Wim Taymans " -); +static GstElementDetails gst_udpsrc_details = +GST_ELEMENT_DETAILS ("UDP packet receiver", + "Source/Network", + "Receive data over the network via UDP", + "Wim Taymans "); /* UDPSrc signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_PORT, ARG_CONTROL, ARG_MULTICAST_GROUP - /* FILL ME */ + /* FILL ME */ }; #define GST_TYPE_UDPSRC_CONTROL (gst_udpsrc_control_get_type()) static GType -gst_udpsrc_control_get_type(void) { +gst_udpsrc_control_get_type (void) +{ static GType udpsrc_control_type = 0; static GEnumValue udpsrc_control[] = { {CONTROL_NONE, "1", "none"}, @@ -61,26 +63,27 @@ gst_udpsrc_control_get_type(void) { {CONTROL_ZERO, NULL, NULL}, }; if (!udpsrc_control_type) { - udpsrc_control_type = g_enum_register_static("GstUDPSrcControl", udpsrc_control); + udpsrc_control_type = + g_enum_register_static ("GstUDPSrcControl", udpsrc_control); } return udpsrc_control_type; } -static void gst_udpsrc_base_init (gpointer g_class); -static void gst_udpsrc_class_init (GstUDPSrc *klass); -static void gst_udpsrc_init (GstUDPSrc *udpsrc); +static void gst_udpsrc_base_init (gpointer g_class); +static void gst_udpsrc_class_init (GstUDPSrc * klass); +static void gst_udpsrc_init (GstUDPSrc * udpsrc); -static GstData* gst_udpsrc_get (GstPad *pad); -static GstElementStateReturn - gst_udpsrc_change_state (GstElement *element); +static GstData *gst_udpsrc_get (GstPad * pad); +static GstElementStateReturn gst_udpsrc_change_state (GstElement * element); -static void gst_udpsrc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_udpsrc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static void gst_udpsrc_set_clock (GstElement *element, GstClock *clock); +static void gst_udpsrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_udpsrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_udpsrc_set_clock (GstElement * element, GstClock * clock); static GstElementClass *parent_class = NULL; + /*static guint gst_udpsrc_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -90,18 +93,19 @@ gst_udpsrc_get_type (void) if (!udpsrc_type) { static const GTypeInfo udpsrc_info = { - sizeof(GstUDPSrcClass), + sizeof (GstUDPSrcClass), gst_udpsrc_base_init, NULL, - (GClassInitFunc)gst_udpsrc_class_init, + (GClassInitFunc) gst_udpsrc_class_init, NULL, NULL, - sizeof(GstUDPSrc), + sizeof (GstUDPSrc), 0, - (GInstanceInitFunc)gst_udpsrc_init, + (GInstanceInitFunc) gst_udpsrc_init, NULL }; - udpsrc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSrc", &udpsrc_info, 0); + udpsrc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstUDPSrc", &udpsrc_info, 0); } return udpsrc_type; } @@ -115,26 +119,26 @@ gst_udpsrc_base_init (gpointer g_class) } static void -gst_udpsrc_class_init (GstUDPSrc *klass) +gst_udpsrc_class_init (GstUDPSrc * 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); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT, - g_param_spec_int ("port", "port", "The port to receive the packets from", - 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE)); + g_param_spec_int ("port", "port", "The port to receive the packets from", + 0, 32768, UDP_DEFAULT_PORT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_CONTROL, - g_param_spec_enum ("control", "control", "The type of control", - GST_TYPE_UDPSRC_CONTROL, CONTROL_UDP, G_PARAM_READWRITE)); + g_param_spec_enum ("control", "control", "The type of control", + GST_TYPE_UDPSRC_CONTROL, CONTROL_UDP, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_MULTICAST_GROUP, - g_param_spec_string ("multicast_group", "multicast_group", - "The Address of multicast group to join", - UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE)); + g_param_spec_string ("multicast_group", "multicast_group", + "The Address of multicast group to join", + UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE)); gobject_class->set_property = gst_udpsrc_set_property; gobject_class->get_property = gst_udpsrc_get_property; @@ -144,17 +148,17 @@ gst_udpsrc_class_init (GstUDPSrc *klass) } static void -gst_udpsrc_set_clock (GstElement *element, GstClock *clock) +gst_udpsrc_set_clock (GstElement * element, GstClock * clock) { GstUDPSrc *udpsrc; - + udpsrc = GST_UDPSRC (element); udpsrc->clock = clock; } static void -gst_udpsrc_init (GstUDPSrc *udpsrc) +gst_udpsrc_init (GstUDPSrc * udpsrc) { /* create the src and src pads */ udpsrc->srcpad = gst_pad_new ("src", GST_PAD_SRC); @@ -171,8 +175,8 @@ gst_udpsrc_init (GstUDPSrc *udpsrc) udpsrc->first_buf = TRUE; } -static GstData* -gst_udpsrc_get (GstPad *pad) +static GstData * +gst_udpsrc_get (GstPad * pad) { GstUDPSrc *udpsrc; GstBuffer *outbuf; @@ -190,13 +194,13 @@ gst_udpsrc_get (GstPad *pad) FD_ZERO (&read_fds); FD_SET (udpsrc->sock, &read_fds); if (udpsrc->control != CONTROL_NONE) { - FD_SET (udpsrc->control_sock, &read_fds); + FD_SET (udpsrc->control_sock, &read_fds); } - max_sock = MAX(udpsrc->sock, udpsrc->control_sock); + max_sock = MAX (udpsrc->sock, udpsrc->control_sock); - if (select (max_sock+1, &read_fds, NULL, NULL, NULL) > 0) { + if (select (max_sock + 1, &read_fds, NULL, NULL, NULL) > 0) { if ((udpsrc->control_sock != -1) && - FD_ISSET (udpsrc->control_sock, &read_fds)) { + FD_ISSET (udpsrc->control_sock, &read_fds)) { #ifndef GST_DISABLE_LOADSAVE guchar *buf; int ret; @@ -205,94 +209,94 @@ gst_udpsrc_get (GstPad *pad) xmlDocPtr doc; GstCaps *caps; - buf = g_malloc (1024*10); + buf = g_malloc (1024 * 10); switch (udpsrc->control) { - case CONTROL_TCP: - len = sizeof (struct sockaddr); - fdread = accept (udpsrc->control_sock, &addr, &len); - if (fdread < 0) { - perror ("accept"); - } - - ret = read (fdread, buf, 1024*10); - break; - case CONTROL_UDP: - len = sizeof (struct sockaddr); - ret = recvfrom (udpsrc->control_sock, buf, 1024*10, 0, (struct sockaddr *)&tmpaddr, &len); - if (ret < 0) { - perror ("recvfrom"); - } - break; - case CONTROL_NONE: + case CONTROL_TCP: + len = sizeof (struct sockaddr); + fdread = accept (udpsrc->control_sock, &addr, &len); + if (fdread < 0) { + perror ("accept"); + } + + ret = read (fdread, buf, 1024 * 10); + break; + case CONTROL_UDP: + len = sizeof (struct sockaddr); + ret = + recvfrom (udpsrc->control_sock, buf, 1024 * 10, 0, + (struct sockaddr *) &tmpaddr, &len); + if (ret < 0) { + perror ("recvfrom"); + } + break; + case CONTROL_NONE: default: - g_free (buf); - return NULL; - break; + g_free (buf); + return NULL; + break; } buf[ret] = '\0'; - doc = xmlParseMemory(buf, ret); - caps = gst_caps_load_thyself(doc->xmlRootNode); + doc = xmlParseMemory (buf, ret); + caps = gst_caps_load_thyself (doc->xmlRootNode); if (caps == NULL) { - return NULL; + return NULL; } - + /* foward the connect, we don't signal back the result here... */ if (gst_caps_is_fixed (caps)) { - gst_pad_try_set_caps (udpsrc->srcpad, caps); + gst_pad_try_set_caps (udpsrc->srcpad, caps); } else { - GST_ERROR ("caps %" GST_PTR_FORMAT, caps); - GST_ELEMENT_ERROR (udpsrc, CORE, NEGOTIATION, (NULL), ("Got unfixed caps from peer")); + GST_ERROR ("caps %" GST_PTR_FORMAT, caps); + GST_ELEMENT_ERROR (udpsrc, CORE, NEGOTIATION, (NULL), + ("Got unfixed caps from peer")); } #endif g_free (buf); outbuf = NULL; - } - else { + } else { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = g_malloc (24000); GST_BUFFER_SIZE (outbuf) = 24000; if (udpsrc->first_buf) { - if (udpsrc->clock) { - GstClockTime current_time; - GstEvent *discont; + if (udpsrc->clock) { + GstClockTime current_time; + GstEvent *discont; + + current_time = gst_clock_get_time (udpsrc->clock); - current_time = gst_clock_get_time (udpsrc->clock); - - GST_BUFFER_TIMESTAMP (outbuf) = current_time; + GST_BUFFER_TIMESTAMP (outbuf) = current_time; - discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - current_time, NULL); + discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, + current_time, NULL); - gst_pad_push (udpsrc->srcpad, GST_DATA (discont)); + gst_pad_push (udpsrc->srcpad, GST_DATA (discont)); } udpsrc->first_buf = FALSE; } - + else { - GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE; + GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE; } len = sizeof (struct sockaddr); numbytes = recvfrom (udpsrc->sock, GST_BUFFER_DATA (outbuf), - GST_BUFFER_SIZE (outbuf), 0, (struct sockaddr *)&tmpaddr, &len); + GST_BUFFER_SIZE (outbuf), 0, (struct sockaddr *) &tmpaddr, &len); if (numbytes != -1) { - GST_BUFFER_SIZE (outbuf) = numbytes; - } - else { + GST_BUFFER_SIZE (outbuf) = numbytes; + } else { perror ("recvfrom"); - gst_buffer_unref (outbuf); - outbuf = NULL; + gst_buffer_unref (outbuf); + outbuf = NULL; } - + } - } - else { + } else { perror ("select"); outbuf = NULL; } @@ -301,29 +305,30 @@ gst_udpsrc_get (GstPad *pad) static void -gst_udpsrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstUDPSrc *udpsrc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_UDPSRC(object)); - udpsrc = GST_UDPSRC(object); + g_return_if_fail (GST_IS_UDPSRC (object)); + udpsrc = GST_UDPSRC (object); switch (prop_id) { case ARG_PORT: - udpsrc->port = g_value_get_int (value); + udpsrc->port = g_value_get_int (value); break; case ARG_MULTICAST_GROUP: - g_free(udpsrc->multi_group); - + g_free (udpsrc->multi_group); + if (g_value_get_string (value) == NULL) - udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); + udpsrc->multi_group = g_strdup (UDP_DEFAULT_MULTICAST_GROUP); else - udpsrc->multi_group = g_strdup (g_value_get_string (value)); - + udpsrc->multi_group = g_strdup (g_value_get_string (value)); + break; case ARG_CONTROL: - udpsrc->control = g_value_get_enum (value); + udpsrc->control = g_value_get_enum (value); break; default: break; @@ -331,13 +336,14 @@ gst_udpsrc_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_udpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstUDPSrc *udpsrc; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_UDPSRC(object)); - udpsrc = GST_UDPSRC(object); + g_return_if_fail (GST_IS_UDPSRC (object)); + udpsrc = GST_UDPSRC (object); switch (prop_id) { case ARG_PORT: @@ -357,92 +363,98 @@ gst_udpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp /* create a socket for sending to remote machine */ static gboolean -gst_udpsrc_init_receive (GstUDPSrc *src) +gst_udpsrc_init_receive (GstUDPSrc * src) { guint bc_val; - gint reuse=1; + gint reuse = 1; + memset (&src->myaddr, 0, sizeof (src->myaddr)); - src->myaddr.sin_family = AF_INET; /* host byte order */ - src->myaddr.sin_port = htons (src->port); /* short, network byte order */ + src->myaddr.sin_family = AF_INET; /* host byte order */ + src->myaddr.sin_port = htons (src->port); /* short, network byte order */ src->myaddr.sin_addr.s_addr = INADDR_ANY; if ((src->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) { - perror("socket"); + perror ("socket"); return FALSE; } - - if (setsockopt(src->sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) { - perror("setsockopt"); - return FALSE; + + if (setsockopt (src->sock, SOL_SOCKET, SO_REUSEADDR, &reuse, + sizeof (reuse)) == -1) { + perror ("setsockopt"); + return FALSE; } - if (bind (src->sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) { - perror("bind"); + if (bind (src->sock, (struct sockaddr *) &src->myaddr, + sizeof (src->myaddr)) == -1) { + perror ("bind"); return FALSE; } if (inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) { if (src->multi_addr.imr_multiaddr.s_addr) { src->multi_addr.imr_interface.s_addr = INADDR_ANY; - setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr, sizeof(src->multi_addr)); + setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &src->multi_addr, + sizeof (src->multi_addr)); } } bc_val = 1; setsockopt (src->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)); - src->myaddr.sin_port = htons (src->port+1); - + src->myaddr.sin_port = htons (src->port + 1); + switch (src->control) { case CONTROL_TCP: - if ((src->control_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) { - perror("control_socket"); - return FALSE; - } - - if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) { - perror("control_bind"); - return FALSE; - } - - if (listen (src->control_sock, 5) == -1) { - perror("listen"); - return FALSE; - } - - fcntl (src->control_sock, F_SETFL, O_NONBLOCK); - - break; + if ((src->control_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) { + perror ("control_socket"); + return FALSE; + } + + if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, + sizeof (src->myaddr)) == -1) { + perror ("control_bind"); + return FALSE; + } + + if (listen (src->control_sock, 5) == -1) { + perror ("listen"); + return FALSE; + } + + fcntl (src->control_sock, F_SETFL, O_NONBLOCK); + + break; case CONTROL_UDP: - if ((src->control_sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) { - perror("socket"); - return FALSE; - } - - if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) - { - perror("control_bind"); - return FALSE; - } - /* We can only do broadcast in udp */ - bc_val = 1; - setsockopt (src->control_sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)); - break; + if ((src->control_sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) { + perror ("socket"); + return FALSE; + } + + if (bind (src->control_sock, (struct sockaddr *) &src->myaddr, + sizeof (src->myaddr)) == -1) { + perror ("control_bind"); + return FALSE; + } + /* We can only do broadcast in udp */ + bc_val = 1; + setsockopt (src->control_sock, SOL_SOCKET, SO_BROADCAST, &bc_val, + sizeof (bc_val)); + break; case CONTROL_NONE: - GST_FLAG_SET (src, GST_UDPSRC_OPEN); - return TRUE; - break; + GST_FLAG_SET (src, GST_UDPSRC_OPEN); + return TRUE; + break; default: - return FALSE; - break; + return FALSE; + break; } GST_FLAG_SET (src, GST_UDPSRC_OPEN); - + return TRUE; } static void -gst_udpsrc_close (GstUDPSrc *src) +gst_udpsrc_close (GstUDPSrc * src) { if (src->sock != -1) { close (src->sock); @@ -457,7 +469,7 @@ gst_udpsrc_close (GstUDPSrc *src) } static GstElementStateReturn -gst_udpsrc_change_state (GstElement *element) +gst_udpsrc_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_UDPSRC (element), GST_STATE_FAILURE); @@ -467,7 +479,7 @@ gst_udpsrc_change_state (GstElement *element) } else { if (!GST_FLAG_IS_SET (element, GST_UDPSRC_OPEN)) { if (!gst_udpsrc_init_receive (GST_UDPSRC (element))) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } } @@ -476,4 +488,3 @@ gst_udpsrc_change_state (GstElement *element) return GST_STATE_SUCCESS; } - diff --git a/gst/udp/gstudpsrc.h b/gst/udp/gstudpsrc.h index f16673df..bb4273e7 100644 --- a/gst/udp/gstudpsrc.h +++ b/gst/udp/gstudpsrc.h @@ -24,8 +24,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #include #include @@ -49,44 +50,47 @@ extern "C" { #define GST_IS_UDPSRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSRC)) -typedef struct _GstUDPSrc GstUDPSrc; -typedef struct _GstUDPSrcClass GstUDPSrcClass; + typedef struct _GstUDPSrc GstUDPSrc; + typedef struct _GstUDPSrcClass GstUDPSrcClass; -typedef enum { - GST_UDPSRC_OPEN = GST_ELEMENT_FLAG_LAST, + typedef enum + { + GST_UDPSRC_OPEN = GST_ELEMENT_FLAG_LAST, - GST_UDPSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, -} GstUDPSrcFlags; + GST_UDPSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, + } GstUDPSrcFlags; -struct _GstUDPSrc { - GstElement element; + struct _GstUDPSrc + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - int port; - int sock; - int control_sock; - Gst_UDP_Control control; - gchar *multi_group; + int port; + int sock; + int control_sock; + Gst_UDP_Control control; + gchar *multi_group; - struct sockaddr_in myaddr; - struct ip_mreq multi_addr; - GstClock *clock; + struct sockaddr_in myaddr; + struct ip_mreq multi_addr; + GstClock *clock; - gboolean first_buf; -}; + gboolean first_buf; + }; -struct _GstUDPSrcClass { - GstElementClass parent_class; -}; + struct _GstUDPSrcClass + { + GstElementClass parent_class; + }; -GType gst_udpsrc_get_type(void); + GType gst_udpsrc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_UDPSRC_H__ */ +#endif /* __GST_UDPSRC_H__ */ diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c index 6a90b5b3..f13610bc 100644 --- a/gst/videocrop/gstvideocrop.c +++ b/gst/videocrop/gstvideocrop.c @@ -39,39 +39,42 @@ typedef struct _GstVideoCrop GstVideoCrop; typedef struct _GstVideoCropClass GstVideoCropClass; -struct _GstVideoCrop { - GstElement element; +struct _GstVideoCrop +{ + GstElement element; /* pads */ - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; /* caps */ - gint width, height; - gdouble fps; - gint crop_left, crop_right, crop_top, crop_bottom; + gint width, height; + gdouble fps; + gint crop_left, crop_right, crop_top, crop_bottom; }; -struct _GstVideoCropClass { +struct _GstVideoCropClass +{ GstElementClass parent_class; }; /* elementfactory information */ -static GstElementDetails gst_video_crop_details = GST_ELEMENT_DETAILS ( - "video crop filter", - "Filter/Effect/Video", - "Crops video into a user defined region", - "Wim Taymans " -); +static GstElementDetails gst_video_crop_details = +GST_ELEMENT_DETAILS ("video crop filter", + "Filter/Effect/Video", + "Crops video into a user defined region", + "Wim Taymans "); /* VideoCrop signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LEFT, ARG_RIGHT, @@ -81,40 +84,38 @@ enum { }; static GstStaticPadTemplate gst_video_crop_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate gst_video_crop_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); -static void gst_video_crop_base_init (gpointer g_class); -static void gst_video_crop_class_init (GstVideoCropClass *klass); -static void gst_video_crop_init (GstVideoCrop *video_crop); +static void gst_video_crop_base_init (gpointer g_class); +static void gst_video_crop_class_init (GstVideoCropClass * klass); +static void gst_video_crop_init (GstVideoCrop * video_crop); -static void gst_video_crop_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_video_crop_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstPadLinkReturn - gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps); -static void gst_video_crop_chain (GstPad *pad, GstData *_data); +gst_video_crop_sink_link (GstPad * pad, const GstCaps * caps); +static void gst_video_crop_chain (GstPad * pad, GstData * _data); -static GstElementStateReturn - gst_video_crop_change_state (GstElement *element); +static GstElementStateReturn gst_video_crop_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /* static guint gst_video_crop_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -124,17 +125,19 @@ gst_video_crop_get_type (void) if (!video_crop_type) { static const GTypeInfo video_crop_info = { - sizeof(GstVideoCropClass), + sizeof (GstVideoCropClass), gst_video_crop_base_init, NULL, - (GClassInitFunc)gst_video_crop_class_init, + (GClassInitFunc) gst_video_crop_class_init, NULL, NULL, - sizeof(GstVideoCrop), + sizeof (GstVideoCrop), 0, - (GInstanceInitFunc)gst_video_crop_init, + (GInstanceInitFunc) gst_video_crop_init, }; - video_crop_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVideoCrop", &video_crop_info, 0); + video_crop_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstVideoCrop", + &video_crop_info, 0); } return video_crop_type; } @@ -146,34 +149,34 @@ gst_video_crop_base_init (gpointer g_class) gst_element_class_set_details (element_class, &gst_video_crop_details); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_crop_sink_template)); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_crop_src_template)); } static void -gst_video_crop_class_init (GstVideoCropClass *klass) +gst_video_crop_class_init (GstVideoCropClass * 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); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LEFT, - g_param_spec_int ("left", "Left", "Pixels to crop at left", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("left", "Left", "Pixels to crop at left", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RIGHT, - g_param_spec_int ("right", "Right", "Pixels to crop at right", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("right", "Right", "Pixels to crop at right", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOP, - g_param_spec_int ("top", "Top", "Pixels to crop at top", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("top", "Top", "Pixels to crop at top", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOTTOM, - g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); gobject_class->set_property = gst_video_crop_set_property; gobject_class->get_property = gst_video_crop_get_property; @@ -182,17 +185,19 @@ gst_video_crop_class_init (GstVideoCropClass *klass) } static void -gst_video_crop_init (GstVideoCrop *video_crop) +gst_video_crop_init (GstVideoCrop * video_crop) { /* create the sink and src pads */ - video_crop->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_video_crop_sink_template), "sink"); + video_crop->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_video_crop_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (video_crop), video_crop->sinkpad); gst_pad_set_chain_function (video_crop->sinkpad, gst_video_crop_chain); gst_pad_set_link_function (video_crop->sinkpad, gst_video_crop_sink_link); - video_crop->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_video_crop_src_template), "src"); + video_crop->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_video_crop_src_template), "src"); gst_element_add_pad (GST_ELEMENT (video_crop), video_crop->srcpad); video_crop->crop_right = 0; @@ -205,13 +210,14 @@ gst_video_crop_init (GstVideoCrop *video_crop) /* do we need this function? */ static void -gst_video_crop_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideoCrop *video_crop; - + /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEO_CROP (object)); - + video_crop = GST_VIDEO_CROP (object); switch (prop_id) { @@ -233,13 +239,14 @@ gst_video_crop_set_property (GObject *object, guint prop_id, const GValue *value } } static void -gst_video_crop_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideoCrop *video_crop; - + /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEO_CROP (object)); - + video_crop = GST_VIDEO_CROP (object); switch (prop_id) { @@ -262,7 +269,7 @@ gst_video_crop_get_property (GObject *object, guint prop_id, GValue *value, GPar } static GstPadLinkReturn -gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) +gst_video_crop_sink_link (GstPad * pad, const GstCaps * caps) { GstVideoCrop *video_crop; GstStructure *structure; @@ -271,7 +278,7 @@ gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) video_crop = GST_VIDEO_CROP (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); - ret = gst_structure_get_int (structure, "width", &video_crop->width); + ret = gst_structure_get_int (structure, "width", &video_crop->width); ret &= gst_structure_get_int (structure, "height", &video_crop->height); ret &= gst_structure_get_double (structure, "framerate", &video_crop->fps); @@ -289,28 +296,30 @@ gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) #define GST_VIDEO_I420_V_ROWSTRIDE(width) ((width)/2) static void -gst_video_crop_i420 (GstVideoCrop *video_crop, GstBuffer *src_buffer, GstBuffer *dest_buffer) +gst_video_crop_i420 (GstVideoCrop * video_crop, GstBuffer * src_buffer, + GstBuffer * dest_buffer) { guint8 *src; guint8 *dest; guint8 *srcY, *srcU, *srcV; guint8 *destY, *destU, *destV; gint out_width = video_crop->width - - (video_crop->crop_left + video_crop->crop_right); + (video_crop->crop_left + video_crop->crop_right); gint out_height = video_crop->height - - (video_crop->crop_top + video_crop->crop_bottom); + (video_crop->crop_top + video_crop->crop_bottom); gint src_stride; gint j; src = GST_BUFFER_DATA (src_buffer); dest = GST_BUFFER_DATA (dest_buffer); - g_return_if_fail(GST_BUFFER_SIZE (dest_buffer) == GST_VIDEO_I420_SIZE(out_width,out_height)); + g_return_if_fail (GST_BUFFER_SIZE (dest_buffer) == + GST_VIDEO_I420_SIZE (out_width, out_height)); - srcY = src + GST_VIDEO_I420_Y_OFFSET(video_crop->width, video_crop->height); - destY = dest + GST_VIDEO_I420_Y_OFFSET(out_width, out_height); + srcY = src + GST_VIDEO_I420_Y_OFFSET (video_crop->width, video_crop->height); + destY = dest + GST_VIDEO_I420_Y_OFFSET (out_width, out_height); - src_stride = GST_VIDEO_I420_Y_ROWSTRIDE(video_crop->width); + src_stride = GST_VIDEO_I420_Y_ROWSTRIDE (video_crop->width); /* copy Y plane first */ @@ -321,32 +330,32 @@ gst_video_crop_i420 (GstVideoCrop *video_crop, GstBuffer *src_buffer, GstBuffer destY += out_width; } - src_stride = GST_VIDEO_I420_U_ROWSTRIDE(video_crop->width); + src_stride = GST_VIDEO_I420_U_ROWSTRIDE (video_crop->width); - destU = dest + GST_VIDEO_I420_U_OFFSET(out_width, out_height); - destV = dest + GST_VIDEO_I420_V_OFFSET(out_width, out_height); + destU = dest + GST_VIDEO_I420_U_OFFSET (out_width, out_height); + destV = dest + GST_VIDEO_I420_V_OFFSET (out_width, out_height); - srcU = src + GST_VIDEO_I420_U_OFFSET(video_crop->width, video_crop->height); - srcV = src + GST_VIDEO_I420_V_OFFSET(video_crop->width, video_crop->height); + srcU = src + GST_VIDEO_I420_U_OFFSET (video_crop->width, video_crop->height); + srcV = src + GST_VIDEO_I420_V_OFFSET (video_crop->width, video_crop->height); - srcU += src_stride * (video_crop->crop_top/2) + (video_crop->crop_left/2); - srcV += src_stride * (video_crop->crop_top/2) + (video_crop->crop_left/2); + srcU += src_stride * (video_crop->crop_top / 2) + (video_crop->crop_left / 2); + srcV += src_stride * (video_crop->crop_top / 2) + (video_crop->crop_left / 2); - for (j = 0; j < out_height/2; j++) { + for (j = 0; j < out_height / 2; j++) { /* copy U plane */ - memcpy (destU, srcU, out_width/2); + memcpy (destU, srcU, out_width / 2); srcU += src_stride; - destU += out_width/2; + destU += out_width / 2; /* copy V plane */ - memcpy (destV, srcV, out_width/2); + memcpy (destV, srcV, out_width / 2); srcV += src_stride; - destV += out_width/2; + destV += out_width / 2; } } static void -gst_video_crop_chain (GstPad *pad, GstData *_data) +gst_video_crop_chain (GstPad * pad, GstData * _data) { GstBuffer *buffer = GST_BUFFER (_data); GstVideoCrop *video_crop; @@ -367,9 +376,9 @@ gst_video_crop_chain (GstPad *pad, GstData *_data) } new_width = video_crop->width - - (video_crop->crop_left + video_crop->crop_right); + (video_crop->crop_left + video_crop->crop_right); new_height = video_crop->height - - (video_crop->crop_top + video_crop->crop_bottom); + (video_crop->crop_top + video_crop->crop_bottom); outbuf = gst_buffer_new_and_alloc ((new_width * new_height * 3) / 2); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); @@ -381,7 +390,7 @@ gst_video_crop_chain (GstPad *pad, GstData *_data) } static GstElementStateReturn -gst_video_crop_change_state (GstElement *element) +gst_video_crop_change_state (GstElement * element) { GstVideoCrop *video_crop; @@ -408,19 +417,14 @@ gst_video_crop_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "videocrop", GST_RANK_PRIMARY, GST_TYPE_VIDEO_CROP); + return gst_element_register (plugin, "videocrop", GST_RANK_PRIMARY, + GST_TYPE_VIDEO_CROP); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videocrop", - "Crops video into a user defined region", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videocrop", + "Crops video into a user defined region", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/videofilter/gstgamma.c b/gst/videofilter/gstgamma.c index 8f4ff28f..7cc2b0fd 100644 --- a/gst/videofilter/gstgamma.c +++ b/gst/videofilter/gstgamma.c @@ -49,7 +49,8 @@ typedef struct _GstGamma GstGamma; typedef struct _GstGammaClass GstGammaClass; -struct _GstGamma { +struct _GstGamma +{ GstVideofilter videofilter; double gamma; @@ -60,18 +61,21 @@ struct _GstGamma { guint8 gamma_table_b[256]; }; -struct _GstGammaClass { +struct _GstGammaClass +{ GstVideofilterClass parent_class; }; /* GstGamma signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_GAMMA, ARG_GAMMA_R, @@ -80,18 +84,23 @@ enum { /* FILL ME */ }; -static void gst_gamma_base_init (gpointer g_class); -static void gst_gamma_class_init (gpointer g_class, gpointer class_data); -static void gst_gamma_init (GTypeInstance *instance, gpointer g_class); +static void gst_gamma_base_init (gpointer g_class); +static void gst_gamma_class_init (gpointer g_class, gpointer class_data); +static void gst_gamma_init (GTypeInstance * instance, gpointer g_class); -static void gst_gamma_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_gamma_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_gamma_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gamma_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_gamma_planar411(GstVideofilter *videofilter, void *dest, void *src); -static void gst_gamma_rgb24(GstVideofilter *videofilter, void *dest, void *src); -static void gst_gamma_rgb32(GstVideofilter *videofilter, void *dest, void *src); -static void gst_gamma_setup(GstVideofilter *videofilter); -static void gst_gamma_calculate_tables (GstGamma *gamma); +static void gst_gamma_planar411 (GstVideofilter * videofilter, void *dest, + void *src); +static void gst_gamma_rgb24 (GstVideofilter * videofilter, void *dest, + void *src); +static void gst_gamma_rgb32 (GstVideofilter * videofilter, void *dest, + void *src); +static void gst_gamma_setup (GstVideofilter * videofilter); +static void gst_gamma_calculate_tables (GstGamma * gamma); GType gst_gamma_get_type (void) @@ -100,47 +109,46 @@ gst_gamma_get_type (void) if (!gamma_type) { static const GTypeInfo gamma_info = { - sizeof(GstGammaClass), + sizeof (GstGammaClass), gst_gamma_base_init, NULL, gst_gamma_class_init, NULL, NULL, - sizeof(GstGamma), + sizeof (GstGamma), 0, gst_gamma_init, }; - gamma_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstGamma", &gamma_info, 0); + gamma_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstGamma", &gamma_info, 0); } return gamma_type; } static GstVideofilterFormat gst_gamma_formats[] = { - { "I420", 12, gst_gamma_planar411, }, - { "RGB ", 24, gst_gamma_rgb24, 24, G_BIG_ENDIAN, 0xff0000, 0xff00, 0xff }, - { "RGB ", 32, gst_gamma_rgb32, 24, G_BIG_ENDIAN, 0x00ff00, 0xff0000, 0xff000000 }, + {"I420", 12, gst_gamma_planar411,}, + {"RGB ", 24, gst_gamma_rgb24, 24, G_BIG_ENDIAN, 0xff0000, 0xff00, 0xff}, + {"RGB ", 32, gst_gamma_rgb32, 24, G_BIG_ENDIAN, 0x00ff00, 0xff0000, + 0xff000000}, }; - + static void gst_gamma_base_init (gpointer g_class) { - static GstElementDetails gamma_details = GST_ELEMENT_DETAILS ( - "Video Gamma Correction", - "Filter/Effect/Video", - "Adjusts gamma on a video stream", - "Arwed v. Merkatz set_property = gst_gamma_set_property; gobject_class->get_property = gst_gamma_get_property; @@ -175,14 +183,14 @@ gst_gamma_class_init (gpointer g_class, gpointer class_data) } static void -gst_gamma_init (GTypeInstance *instance, gpointer g_class) +gst_gamma_init (GTypeInstance * instance, gpointer g_class) { GstGamma *gamma = GST_GAMMA (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_gamma_init"); + GST_DEBUG ("gst_gamma_init"); - videofilter = GST_VIDEOFILTER(gamma); + videofilter = GST_VIDEOFILTER (gamma); /* do stuff */ gamma->gamma = 1; @@ -193,15 +201,16 @@ gst_gamma_init (GTypeInstance *instance, gpointer g_class) } static void -gst_gamma_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstGamma *gamma; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_GAMMA(object)); - gamma = GST_GAMMA(object); + g_return_if_fail (GST_IS_GAMMA (object)); + gamma = GST_GAMMA (object); - GST_DEBUG("gst_gamma_set_property"); + GST_DEBUG ("gst_gamma_set_property"); switch (prop_id) { case ARG_GAMMA: gamma->gamma = g_value_get_double (value); @@ -225,13 +234,14 @@ gst_gamma_set_property (GObject *object, guint prop_id, const GValue *value, GPa } static void -gst_gamma_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_gamma_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstGamma *gamma; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_GAMMA(object)); - gamma = GST_GAMMA(object); + g_return_if_fail (GST_IS_GAMMA (object)); + gamma = GST_GAMMA (object); switch (prop_id) { case ARG_GAMMA: @@ -252,50 +262,42 @@ gst_gamma_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; - return gst_element_register (plugin, "gamma", GST_RANK_NONE, - GST_TYPE_GAMMA); + return gst_element_register (plugin, "gamma", GST_RANK_NONE, GST_TYPE_GAMMA); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gamma", - "Changes gamma on video images", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gamma", + "Changes gamma on video images", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) -static void gst_gamma_setup(GstVideofilter *videofilter) + static void gst_gamma_setup (GstVideofilter * videofilter) { GstGamma *gamma; - g_return_if_fail(GST_IS_GAMMA(videofilter)); - gamma = GST_GAMMA(videofilter); + g_return_if_fail (GST_IS_GAMMA (videofilter)); + gamma = GST_GAMMA (videofilter); /* if any setup needs to be done, do it here */ } static void -gst_gamma_calculate_tables (GstGamma *gamma) +gst_gamma_calculate_tables (GstGamma * gamma) { int n; double val; double exp; - if (gamma->gamma == 1.0 && - gamma->gamma_r == 1.0 && - gamma->gamma_g == 1.0 && - gamma->gamma_b == 1.0) { + if (gamma->gamma == 1.0 && + gamma->gamma_r == 1.0 && gamma->gamma_g == 1.0 && gamma->gamma_b == 1.0) { GST_VIDEOFILTER (gamma)->passthru = TRUE; return; } @@ -303,77 +305,80 @@ gst_gamma_calculate_tables (GstGamma *gamma) exp = 1.0 / gamma->gamma; for (n = 0; n < 256; n++) { - val = n/255.0; - val = pow(val, exp); + val = n / 255.0; + val = pow (val, exp); val = 255.0 * val; - gamma->gamma_table[n] = (unsigned char) floor(val + 0.5); + gamma->gamma_table[n] = (unsigned char) floor (val + 0.5); } exp = 1.0 / gamma->gamma_r; for (n = 0; n < 256; n++) { - val = n/255.0; - val = pow(val, exp); + val = n / 255.0; + val = pow (val, exp); val = 255.0 * val; - gamma->gamma_table_r[n] = (unsigned char) floor(val + 0.5); + gamma->gamma_table_r[n] = (unsigned char) floor (val + 0.5); } exp = 1.0 / gamma->gamma_g; for (n = 0; n < 256; n++) { - val = n/255.0; - val = pow(val, exp); + val = n / 255.0; + val = pow (val, exp); val = 255.0 * val; - gamma->gamma_table_g[n] = (unsigned char) floor(val + 0.5); + gamma->gamma_table_g[n] = (unsigned char) floor (val + 0.5); } exp = 1.0 / gamma->gamma_b; for (n = 0; n < 256; n++) { - val = n/255.0; - val = pow(val, exp); + val = n / 255.0; + val = pow (val, exp); val = 255.0 * val; - gamma->gamma_table_b[n] = (unsigned char) floor(val + 0.5); + gamma->gamma_table_b[n] = (unsigned char) floor (val + 0.5); } } -static void gst_gamma_planar411(GstVideofilter *videofilter, - void *dest, void *src) +static void +gst_gamma_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstGamma *gamma; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); - g_return_if_fail(GST_IS_GAMMA(videofilter)); - gamma = GST_GAMMA(videofilter); + g_return_if_fail (GST_IS_GAMMA (videofilter)); + gamma = GST_GAMMA (videofilter); - memcpy(dest,src,width * height + (width/2) * (height/2) * 2); + memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2); if (gamma->gamma != 1.0) { { guint8 *cdest = dest; guint8 *csrc = src; - int x,y; - for (y=0; y < height; y++) { - for (x=0; x < width; x++) { - cdest[y*width + x] = gamma->gamma_table[(unsigned char)csrc[y*width + x]]; - } + int x, y; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + cdest[y * width + x] = + gamma->gamma_table[(unsigned char) csrc[y * width + x]]; + } } } } } -static void gst_gamma_rgb24(GstVideofilter *videofilter, void *dest, void *src) +static void +gst_gamma_rgb24 (GstVideofilter * videofilter, void *dest, void *src) { GstGamma *gamma; int i; int width, height; guint8 *csrc = src; guint8 *cdest = dest; - - g_return_if_fail(GST_IS_GAMMA(videofilter)); - gamma = GST_GAMMA(videofilter); - width = gst_videofilter_get_input_width(videofilter); - height = gst_videofilter_get_input_height(videofilter); + g_return_if_fail (GST_IS_GAMMA (videofilter)); + gamma = GST_GAMMA (videofilter); + + width = gst_videofilter_get_input_width (videofilter); + height = gst_videofilter_get_input_height (videofilter); if (gamma->gamma == 1.0) { i = 0; - while ( i < width * height * 3) { + while (i < width * height * 3) { *cdest++ = gamma->gamma_table_r[*csrc++]; *cdest++ = gamma->gamma_table_g[*csrc++]; *cdest++ = gamma->gamma_table_b[*csrc++]; @@ -388,22 +393,23 @@ static void gst_gamma_rgb24(GstVideofilter *videofilter, void *dest, void *src) } } -static void gst_gamma_rgb32(GstVideofilter *videofilter, void *dest, void *src) +static void +gst_gamma_rgb32 (GstVideofilter * videofilter, void *dest, void *src) { GstGamma *gamma; int i; int width, height; guint8 *csrc = src; guint8 *cdest = dest; - - g_return_if_fail(GST_IS_GAMMA(videofilter)); - gamma = GST_GAMMA(videofilter); - width = gst_videofilter_get_input_width(videofilter); - height = gst_videofilter_get_input_height(videofilter); + g_return_if_fail (GST_IS_GAMMA (videofilter)); + gamma = GST_GAMMA (videofilter); + + width = gst_videofilter_get_input_width (videofilter); + height = gst_videofilter_get_input_height (videofilter); if (gamma->gamma == 1.0) { i = 0; - while ( i < width * height * 4) { + while (i < width * height * 4) { *cdest++ = gamma->gamma_table_b[*csrc++]; *cdest++ = gamma->gamma_table_g[*csrc++]; *cdest++ = gamma->gamma_table_r[*csrc++]; @@ -415,10 +421,10 @@ static void gst_gamma_rgb32(GstVideofilter *videofilter, void *dest, void *src) i = 0; while (i < width * height * 4) { if ((i % 4) != 3) - *cdest++ = gamma->gamma_table[*csrc++]; + *cdest++ = gamma->gamma_table[*csrc++]; else { - cdest++; - csrc++; + cdest++; + csrc++; } i++; } diff --git a/gst/videofilter/gstvideobalance.c b/gst/videofilter/gstvideobalance.c index ddbf76b9..2acad7c3 100644 --- a/gst/videofilter/gstvideobalance.c +++ b/gst/videofilter/gstvideobalance.c @@ -38,37 +38,43 @@ #include /* GstVideobalance signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_CONTRAST, ARG_BRIGHTNESS, ARG_HUE, ARG_SATURATION - /* FILL ME */ + /* FILL ME */ }; static GstVideofilterClass *parent_class = NULL; -static void gst_videobalance_base_init (gpointer g_class); -static void gst_videobalance_class_init (gpointer g_class, gpointer class_data); -static void gst_videobalance_init (GTypeInstance *instance, gpointer g_class); +static void gst_videobalance_base_init (gpointer g_class); +static void gst_videobalance_class_init (gpointer g_class, gpointer class_data); +static void gst_videobalance_init (GTypeInstance * instance, gpointer g_class); -static void gst_videobalance_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_videobalance_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_videobalance_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videobalance_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_videobalance_planar411(GstVideofilter *videofilter, void *dest, void *src); -static void gst_videobalance_setup(GstVideofilter *videofilter); +static void gst_videobalance_planar411 (GstVideofilter * videofilter, + void *dest, void *src); +static void gst_videobalance_setup (GstVideofilter * videofilter); -static void gst_videobalance_interface_init (GstImplementsInterfaceClass *klass); -static void gst_videobalance_colorbalance_init (GstColorBalanceClass *iface); +static void gst_videobalance_interface_init (GstImplementsInterfaceClass * + klass); +static void gst_videobalance_colorbalance_init (GstColorBalanceClass * iface); -static void gst_videobalance_dispose (GObject *object); -static void gst_videobalance_update_properties (GstVideobalance *videobalance); +static void gst_videobalance_dispose (GObject * object); +static void gst_videobalance_update_properties (GstVideobalance * videobalance); GType gst_videobalance_get_type (void) @@ -77,62 +83,61 @@ gst_videobalance_get_type (void) if (!videobalance_type) { static const GTypeInfo videobalance_info = { - sizeof(GstVideobalanceClass), + sizeof (GstVideobalanceClass), gst_videobalance_base_init, NULL, gst_videobalance_class_init, NULL, NULL, - sizeof(GstVideobalance), + sizeof (GstVideobalance), 0, gst_videobalance_init, }; - + static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gst_videobalance_interface_init, NULL, NULL, }; - + static const GInterfaceInfo colorbalance_info = { (GInterfaceInitFunc) gst_videobalance_colorbalance_init, NULL, NULL, }; - - videobalance_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstVideobalance", &videobalance_info, 0); - - g_type_add_interface_static (videobalance_type, GST_TYPE_IMPLEMENTS_INTERFACE, - &iface_info); + + videobalance_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstVideobalance", &videobalance_info, 0); + + g_type_add_interface_static (videobalance_type, + GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); g_type_add_interface_static (videobalance_type, GST_TYPE_COLOR_BALANCE, - &colorbalance_info); + &colorbalance_info); } return videobalance_type; } static GstVideofilterFormat gst_videobalance_formats[] = { - { "I420", 12, gst_videobalance_planar411, }, + {"I420", 12, gst_videobalance_planar411,}, }; - + static void gst_videobalance_base_init (gpointer g_class) { - static GstElementDetails videobalance_details = GST_ELEMENT_DETAILS ( - "Video Balance Control", - "Filter/Effect/Video", - "Adjusts brightness, contrast, hue, saturation on a video stream", - "David Schleef " - ); + static GstElementDetails videobalance_details = + GST_ELEMENT_DETAILS ("Video Balance Control", + "Filter/Effect/Video", + "Adjusts brightness, contrast, hue, saturation on a video stream", + "David Schleef "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &videobalance_details); - for(i=0;itabley); g_free (balance->tableu); g_free (balance->tablev); - + channels = balance->channels; - - while (channels) - { - GstColorBalanceChannel *channel = channels->data; - g_object_unref (channel); - channels = g_list_next (channels); - } - + + while (channels) { + GstColorBalanceChannel *channel = channels->data; + + g_object_unref (channel); + channels = g_list_next (channels); + } + if (balance->channels) g_list_free (balance->channels); - + G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -181,19 +186,18 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data) videofilter_class = GST_VIDEOFILTER_CLASS (g_class); parent_class = g_type_class_ref (GST_TYPE_VIDEOFILTER); - - g_object_class_install_property(gobject_class, ARG_CONTRAST, - g_param_spec_double("contrast","Contrast","contrast", - 0, 2, 1, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_BRIGHTNESS, - g_param_spec_double("brightness","Brightness","brightness", - -1, 1, 0, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_HUE, - g_param_spec_double("hue","Hue","hue", - -1, 1, 0, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_SATURATION, - g_param_spec_double("saturation","Saturation","saturation", - 0, 2, 1, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, ARG_CONTRAST, + g_param_spec_double ("contrast", "Contrast", "contrast", + 0, 2, 1, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_BRIGHTNESS, + g_param_spec_double ("brightness", "Brightness", "brightness", + -1, 1, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_HUE, + g_param_spec_double ("hue", "Hue", "hue", -1, 1, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_SATURATION, + g_param_spec_double ("saturation", "Saturation", "saturation", + 0, 2, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_videobalance_set_property; gobject_class->get_property = gst_videobalance_get_property; @@ -202,28 +206,29 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data) videofilter_class->setup = gst_videobalance_setup; #ifdef HAVE_LIBOIL - oil_init(); + oil_init (); #endif } static void -gst_videobalance_init (GTypeInstance *instance, gpointer g_class) +gst_videobalance_init (GTypeInstance * instance, gpointer g_class) { GstVideobalance *videobalance = GST_VIDEOBALANCE (instance); GstVideofilter *videofilter; char *channels[4] = { "HUE", "SATURATION", - "BRIGHTNESS", "CONTRAST" }; + "BRIGHTNESS", "CONTRAST" + }; gint i; - - GST_DEBUG("gst_videobalance_init"); - videofilter = GST_VIDEOFILTER(videobalance); + GST_DEBUG ("gst_videobalance_init"); + + videofilter = GST_VIDEOFILTER (videobalance); /* do stuff */ - videobalance->contrast = 1.0; + videobalance->contrast = 1.0; videobalance->brightness = 0.0; videobalance->saturation = 1.0; - videobalance->hue = 0.0; + videobalance->hue = 0.0; videobalance->needupdate = FALSE; videofilter->passthru = TRUE; @@ -235,60 +240,58 @@ gst_videobalance_init (GTypeInstance *instance, gpointer g_class) videobalance->tableu[i] = g_new (guint8, 256); videobalance->tablev[i] = g_new (guint8, 256); } - + /* Generate the channels list */ - for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) - { - GstColorBalanceChannel *channel; - - channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); - channel->label = g_strdup (channels[i]); - channel->min_value = -1000; - channel->max_value = 1000; - - videobalance->channels = g_list_append (videobalance->channels, - channel); - } + for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) { + GstColorBalanceChannel *channel; + + channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); + channel->label = g_strdup (channels[i]); + channel->min_value = -1000; + channel->max_value = 1000; + + videobalance->channels = g_list_append (videobalance->channels, channel); + } } static gboolean -gst_videobalance_interface_supported (GstImplementsInterface *iface, GType type) +gst_videobalance_interface_supported (GstImplementsInterface * iface, + GType type) { g_assert (type == GST_TYPE_COLOR_BALANCE); return TRUE; } static void -gst_videobalance_interface_init (GstImplementsInterfaceClass *klass) +gst_videobalance_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_videobalance_interface_supported; } static const GList * -gst_videobalance_colorbalance_list_channels (GstColorBalance *balance) +gst_videobalance_colorbalance_list_channels (GstColorBalance * balance) { GstVideobalance *videobalance = GST_VIDEOBALANCE (balance); - + g_return_val_if_fail (videobalance != NULL, NULL); g_return_val_if_fail (GST_IS_VIDEOBALANCE (videobalance), NULL); - + return videobalance->channels; } static void -gst_videobalance_colorbalance_set_value (GstColorBalance *balance, - GstColorBalanceChannel *channel, - gint value) +gst_videobalance_colorbalance_set_value (GstColorBalance * balance, + GstColorBalanceChannel * channel, gint value) { GstVideobalance *vb = GST_VIDEOBALANCE (balance); GstVideofilter *vf = GST_VIDEOFILTER (vb); - + g_return_if_fail (vb != NULL); g_return_if_fail (GST_IS_VIDEOBALANCE (vb)); g_return_if_fail (GST_IS_VIDEOFILTER (vf)); g_return_if_fail (channel->label != NULL); - + if (!g_ascii_strcasecmp (channel->label, "HUE")) { vb->hue = (value + 1000.0) * 2.0 / 2000.0 - 1.0; } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { @@ -298,21 +301,21 @@ gst_videobalance_colorbalance_set_value (GstColorBalance *balance, } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { vb->contrast = (value + 1000.0) * 2.0 / 2000.0; } - + gst_videobalance_update_properties (vb); } static gint -gst_videobalance_colorbalance_get_value (GstColorBalance *balance, - GstColorBalanceChannel *channel) +gst_videobalance_colorbalance_get_value (GstColorBalance * balance, + GstColorBalanceChannel * channel) { GstVideobalance *vb = GST_VIDEOBALANCE (balance); gint value = 0; - + g_return_val_if_fail (vb != NULL, 0); g_return_val_if_fail (GST_IS_VIDEOBALANCE (vb), 0); g_return_val_if_fail (channel->label != NULL, 0); - + if (!g_ascii_strcasecmp (channel->label, "HUE")) { value = (vb->hue + 1) * 2000.0 / 2.0 - 1000.0; } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { @@ -322,12 +325,12 @@ gst_videobalance_colorbalance_get_value (GstColorBalance *balance, } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { value = vb->contrast * 2000.0 / 2.0 - 1000.0; } - + return value; } static void -gst_videobalance_colorbalance_init (GstColorBalanceClass *iface) +gst_videobalance_colorbalance_init (GstColorBalanceClass * iface) { GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_SOFTWARE; iface->list_channels = gst_videobalance_colorbalance_list_channels; @@ -336,7 +339,7 @@ gst_videobalance_colorbalance_init (GstColorBalanceClass *iface) } static void -gst_videobalance_update_properties (GstVideobalance *videobalance) +gst_videobalance_update_properties (GstVideobalance * videobalance) { GstVideofilter *vf = GST_VIDEOFILTER (videobalance); @@ -344,8 +347,7 @@ gst_videobalance_update_properties (GstVideobalance *videobalance) if (videobalance->contrast == 1.0 && videobalance->brightness == 0.0 && - videobalance->hue == 0.0 && - videobalance->saturation == 1.0) { + videobalance->hue == 0.0 && videobalance->saturation == 1.0) { vf->passthru = TRUE; } else { vf->passthru = FALSE; @@ -353,15 +355,16 @@ gst_videobalance_update_properties (GstVideobalance *videobalance) } static void -gst_videobalance_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_videobalance_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideobalance *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOBALANCE(object)); - src = GST_VIDEOBALANCE(object); + g_return_if_fail (GST_IS_VIDEOBALANCE (object)); + src = GST_VIDEOBALANCE (object); - GST_DEBUG("gst_videobalance_set_property"); + GST_DEBUG ("gst_videobalance_set_property"); switch (prop_id) { case ARG_CONTRAST: src->contrast = g_value_get_double (value); @@ -383,13 +386,14 @@ gst_videobalance_set_property (GObject *object, guint prop_id, const GValue *val } static void -gst_videobalance_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_videobalance_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideobalance *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOBALANCE(object)); - src = GST_VIDEOBALANCE(object); + g_return_if_fail (GST_IS_VIDEOBALANCE (object)); + src = GST_VIDEOBALANCE (object); switch (prop_id) { case ARG_CONTRAST: @@ -410,33 +414,28 @@ gst_videobalance_get_property (GObject *object, guint prop_id, GValue *value, GP } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; return gst_element_register (plugin, "videobalance", GST_RANK_NONE, GST_TYPE_VIDEOBALANCE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videobalance", - "Changes hue, saturation, brightness etc. on video images", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - -static void gst_videobalance_setup(GstVideofilter *videofilter) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videobalance", + "Changes hue, saturation, brightness etc. on video images", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) + + static void gst_videobalance_setup (GstVideofilter * videofilter) { GstVideobalance *videobalance; - g_return_if_fail(GST_IS_VIDEOBALANCE(videofilter)); - videobalance = GST_VIDEOBALANCE(videofilter); + g_return_if_fail (GST_IS_VIDEOBALANCE (videofilter)); + videobalance = GST_VIDEOBALANCE (videofilter); /* if any setup needs to be done, do it here */ @@ -447,7 +446,7 @@ static void gst_videobalance_setup(GstVideofilter *videofilter) */ static void -gst_videobalance_update_tables_planar411 (GstVideobalance *vb) +gst_videobalance_update_tables_planar411 (GstVideobalance * vb) { gint i, j; gdouble y, u, v, hue_cos, hue_sin; @@ -471,28 +470,30 @@ gst_videobalance_update_tables_planar411 (GstVideobalance *vb) * separately. */ for (i = -128; i < 128; i++) { for (j = -128; j < 128; j++) { - u = 128 + (( i * hue_cos + j * hue_sin) * vb->saturation); + u = 128 + ((i * hue_cos + j * hue_sin) * vb->saturation); v = 128 + ((-i * hue_sin + j * hue_cos) * vb->saturation); - if(u < 0) - u = 0; + if (u < 0) + u = 0; else if (u > 255) - u = 255; + u = 255; if (v < 0) - v = 0; + v = 0; else if (v > 255) - v = 255; - vb->tableu[i+128][j+128] = rint (u); - vb->tablev[i+128][j+128] = rint (v); + v = 255; + vb->tableu[i + 128][j + 128] = rint (u); + vb->tablev[i + 128][j + 128] = rint (v); } } } #ifndef HAVE_LIBOIL -void tablelookup_u8 (guint8 *dest, int dstr, guint8 *src, int sstr, - guint8 *table, int tstr, int n) +void +tablelookup_u8 (guint8 * dest, int dstr, guint8 * src, int sstr, + guint8 * table, int tstr, int n) { int i; - for(i=0;ineedupdate) { gst_videobalance_update_tables_planar411 (videobalance); @@ -523,9 +524,9 @@ static void gst_videobalance_planar411(GstVideofilter *videofilter, guint8 *cdest = dest; guint8 *csrc = src; - for(y=0;ytabley, 1, width); + for (y = 0; y < height; y++) { + tablelookup_u8 (cdest + y * width, 1, csrc + y * width, 1, + videobalance->tabley, 1, width); } } @@ -534,17 +535,17 @@ static void gst_videobalance_planar411(GstVideofilter *videofilter, guint8 *usrc, *vsrc; guint8 *udest, *vdest; - usrc = src + width*height; - udest = dest + width*height; - vsrc = src + width*height + (width/2)*(height/2); - vdest = dest + width*height + (width/2)*(height/2); - - for(y=0;ytableu[u1][v1]; - vdest[y*(width/2) + x] = videobalance->tablev[u1][v1]; + usrc = src + width * height; + udest = dest + width * height; + vsrc = src + width * height + (width / 2) * (height / 2); + vdest = dest + width * height + (width / 2) * (height / 2); + + for (y = 0; y < height / 2; y++) { + for (x = 0; x < width / 2; x++) { + u1 = usrc[y * (width / 2) + x]; + v1 = vsrc[y * (width / 2) + x]; + udest[y * (width / 2) + x] = videobalance->tableu[u1][v1]; + vdest[y * (width / 2) + x] = videobalance->tablev[u1][v1]; } } } diff --git a/gst/videofilter/gstvideobalance.h b/gst/videofilter/gstvideobalance.h index 45aab910..03a3d066 100644 --- a/gst/videofilter/gstvideobalance.h +++ b/gst/videofilter/gstvideobalance.h @@ -28,7 +28,6 @@ G_BEGIN_DECLS - #define GST_TYPE_VIDEOBALANCE \ (gst_videobalance_get_type()) #define GST_VIDEOBALANCE(obj) \ @@ -39,30 +38,30 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOBALANCE)) #define GST_IS_VIDEOBALANCE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOBALANCE)) - typedef struct _GstVideobalance GstVideobalance; typedef struct _GstVideobalanceClass GstVideobalanceClass; -struct _GstVideobalance { +struct _GstVideobalance +{ GstVideofilter videofilter; - guint8 *tabley, **tableu, **tablev; + guint8 *tabley, **tableu, **tablev; gboolean needupdate; gdouble contrast; gdouble brightness; gdouble hue; gdouble saturation; - + GList *channels; }; -struct _GstVideobalanceClass { +struct _GstVideobalanceClass +{ GstVideofilterClass parent_class; }; -GType gst_videobalance_get_type(void); +GType gst_videobalance_get_type (void); G_END_DECLS - #endif /* __GST_VIDEOBALANCE_H__ */ diff --git a/gst/videofilter/gstvideofilter.c b/gst/videofilter/gstvideofilter.c index 7ef18e4a..590616bc 100644 --- a/gst/videofilter/gstvideofilter.c +++ b/gst/videofilter/gstvideofilter.c @@ -29,27 +29,31 @@ /* GstVideofilter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METHOD, /* FILL ME */ }; -static void gst_videofilter_base_init (gpointer g_class); -static void gst_videofilter_class_init (gpointer g_class, gpointer class_data); -static void gst_videofilter_init (GTypeInstance *instance, gpointer g_class); +static void gst_videofilter_base_init (gpointer g_class); +static void gst_videofilter_class_init (gpointer g_class, gpointer class_data); +static void gst_videofilter_init (GTypeInstance * instance, gpointer g_class); -static void gst_videofilter_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_videofilter_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_videofilter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videofilter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_videofilter_chain (GstPad *pad, GstData *_data); -GstCaps * gst_videofilter_class_get_capslist(GstVideofilterClass *klass); -static void gst_videofilter_setup(GstVideofilter *videofilter); +static void gst_videofilter_chain (GstPad * pad, GstData * _data); +GstCaps *gst_videofilter_class_get_capslist (GstVideofilterClass * klass); +static void gst_videofilter_setup (GstVideofilter * videofilter); static GstElementClass *parent_class = NULL; @@ -60,23 +64,24 @@ gst_videofilter_get_type (void) if (!videofilter_type) { static const GTypeInfo videofilter_info = { - sizeof(GstVideofilterClass), + sizeof (GstVideofilterClass), gst_videofilter_base_init, NULL, gst_videofilter_class_init, NULL, NULL, - sizeof(GstVideofilter), + sizeof (GstVideofilter), 0, gst_videofilter_init, }; - videofilter_type = g_type_register_static(GST_TYPE_ELEMENT, + videofilter_type = g_type_register_static (GST_TYPE_ELEMENT, "GstVideofilter", &videofilter_info, G_TYPE_FLAG_ABSTRACT); } return videofilter_type; } -static void gst_videofilter_base_init (gpointer g_class) +static void +gst_videofilter_base_init (gpointer g_class) { static GstElementDetails videofilter_details = { "Video scaler", @@ -87,38 +92,42 @@ static void gst_videofilter_base_init (gpointer g_class) GstVideofilterClass *klass = (GstVideofilterClass *) g_class; GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - klass->formats = g_ptr_array_new(); + klass->formats = g_ptr_array_new (); gst_element_class_set_details (element_class, &videofilter_details); } -static void gst_videofilter_class_init (gpointer g_class, gpointer class_data) +static void +gst_videofilter_class_init (gpointer g_class, gpointer class_data) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstVideofilterClass *klass; - klass = (GstVideofilterClass *)g_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + klass = (GstVideofilterClass *) g_class; + 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_videofilter_set_property; gobject_class->get_property = gst_videofilter_get_property; } -static GstStructure *gst_videofilter_format_get_structure(GstVideofilterFormat *format) +static GstStructure * +gst_videofilter_format_get_structure (GstVideofilterFormat * format) { unsigned int fourcc; GstStructure *structure; - if(format->filter_func==NULL) + if (format->filter_func == NULL) return NULL; - fourcc = GST_MAKE_FOURCC(format->fourcc[0],format->fourcc[1],format->fourcc[2],format->fourcc[3]); + fourcc = + GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], + format->fourcc[3]); - if(format->depth){ + if (format->depth) { structure = gst_structure_new ("video/x-raw-rgb", "depth", G_TYPE_INT, format->depth, "bpp", G_TYPE_INT, format->bpp, @@ -126,29 +135,31 @@ static GstStructure *gst_videofilter_format_get_structure(GstVideofilterFormat * "red_mask", G_TYPE_INT, format->red_mask, "green_mask", G_TYPE_INT, format->green_mask, "blue_mask", G_TYPE_INT, format->blue_mask, NULL); - }else{ + } else { structure = gst_structure_new ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, fourcc, NULL); } - gst_structure_set(structure, + gst_structure_set (structure, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, - "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, - NULL); + "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, NULL); return structure; } -GstCaps * gst_videofilter_class_get_capslist(GstVideofilterClass *klass) +GstCaps * +gst_videofilter_class_get_capslist (GstVideofilterClass * klass) { GstCaps *caps; GstStructure *structure; int i; - caps = gst_caps_new_empty(); - for(i=0;iformats->len;i++){ - structure = gst_videofilter_format_get_structure(g_ptr_array_index(klass->formats,i)); + caps = gst_caps_new_empty (); + for (i = 0; i < klass->formats->len; i++) { + structure = + gst_videofilter_format_get_structure (g_ptr_array_index (klass->formats, + i)); gst_caps_append_structure (caps, structure); } @@ -156,22 +167,24 @@ GstCaps * gst_videofilter_class_get_capslist(GstVideofilterClass *klass) } static GstCaps * -gst_videofilter_getcaps (GstPad *pad) +gst_videofilter_getcaps (GstPad * pad) { GstVideofilter *videofilter; GstVideofilterClass *klass; + //GstCaps *caps; GstCaps *othercaps; GstPad *otherpad; + //int i; - GST_DEBUG("gst_videofilter_getcaps"); + GST_DEBUG ("gst_videofilter_getcaps"); videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad)); - - klass = GST_VIDEOFILTER_CLASS(G_OBJECT_GET_CLASS(videofilter)); + + klass = GST_VIDEOFILTER_CLASS (G_OBJECT_GET_CLASS (videofilter)); otherpad = (pad == videofilter->srcpad) ? videofilter->sinkpad : - videofilter->srcpad; + videofilter->srcpad; othercaps = gst_pad_get_allowed_caps (otherpad); @@ -183,20 +196,22 @@ gst_videofilter_getcaps (GstPad *pad) * the peer's formats. Create a list of them. */ /* FIXME optimize if peercaps == NULL */ caps = gst_caps_new_empty (); - for(i=0;iformats->len;i++){ + for (i = 0; i < klass->formats->len; i++) { GstCaps *icaps; GstCaps *fromcaps; - - fromcaps = gst_caps_new_full (gst_videofilter_format_get_structure ( - g_ptr_array_index (klass->formats,i)), NULL); + + fromcaps = + gst_caps_new_full (gst_videofilter_format_get_structure + (g_ptr_array_index (klass->formats, i)), NULL); icaps = gst_caps_intersect (fromcaps, peercaps); - if(icaps != NULL){ + if (icaps != NULL) { gst_caps_append (caps, fromcaps); } else { gst_caps_free (fromcaps); } - if(icaps) gst_caps_free (icaps); + if (icaps) + gst_caps_free (icaps); } gst_caps_free (peercaps); @@ -205,7 +220,7 @@ gst_videofilter_getcaps (GstPad *pad) } static GstPadLinkReturn -gst_videofilter_link (GstPad *pad, const GstCaps *caps) +gst_videofilter_link (GstPad * pad, const GstCaps * caps) { GstVideofilter *videofilter; GstStructure *structure; @@ -215,28 +230,30 @@ gst_videofilter_link (GstPad *pad, const GstCaps *caps) GstPadLinkReturn lret; GstPad *otherpad; - GST_DEBUG("gst_videofilter_src_link"); + GST_DEBUG ("gst_videofilter_src_link"); videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad)); otherpad = (pad == videofilter->srcpad) ? videofilter->sinkpad : - videofilter->srcpad; + videofilter->srcpad; structure = gst_caps_get_structure (caps, 0); - videofilter->format = gst_videofilter_find_format_by_structure ( - videofilter, structure); - g_return_val_if_fail(videofilter->format, GST_PAD_LINK_REFUSED); + videofilter->format = + gst_videofilter_find_format_by_structure (videofilter, structure); + g_return_val_if_fail (videofilter->format, GST_PAD_LINK_REFUSED); ret = gst_structure_get_int (structure, "width", &width); ret &= gst_structure_get_int (structure, "height", &height); ret &= gst_structure_get_double (structure, "framerate", &framerate); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; lret = gst_pad_try_set_caps (otherpad, caps); - if (GST_PAD_LINK_FAILED (lret)) return lret; + if (GST_PAD_LINK_FAILED (lret)) + return lret; - GST_DEBUG("width %d height %d",width,height); + GST_DEBUG ("width %d height %d", width, height); #if 0 if (pad == videofilter->srcpad) { @@ -253,41 +270,41 @@ gst_videofilter_link (GstPad *pad, const GstCaps *caps) videofilter->from_height = height; videofilter->framerate = framerate; - gst_videofilter_setup(videofilter); + gst_videofilter_setup (videofilter); return GST_PAD_LINK_OK; } static void -gst_videofilter_init (GTypeInstance *instance, gpointer g_class) +gst_videofilter_init (GTypeInstance * instance, gpointer g_class) { GstVideofilter *videofilter = GST_VIDEOFILTER (instance); GstPadTemplate *pad_template; - GST_DEBUG("gst_videofilter_init"); - - pad_template = gst_element_class_get_pad_template(GST_ELEMENT_CLASS(g_class), - "sink"); - g_return_if_fail(pad_template != NULL); - videofilter->sinkpad = gst_pad_new_from_template(pad_template, "sink"); - gst_element_add_pad(GST_ELEMENT(videofilter),videofilter->sinkpad); - gst_pad_set_chain_function(videofilter->sinkpad,gst_videofilter_chain); - gst_pad_set_link_function(videofilter->sinkpad,gst_videofilter_link); - gst_pad_set_getcaps_function(videofilter->sinkpad,gst_videofilter_getcaps); - - pad_template = gst_element_class_get_pad_template(GST_ELEMENT_CLASS(g_class), - "src"); - g_return_if_fail(pad_template != NULL); - videofilter->srcpad = gst_pad_new_from_template(pad_template, "src"); - gst_element_add_pad(GST_ELEMENT(videofilter),videofilter->srcpad); - gst_pad_set_link_function(videofilter->srcpad,gst_videofilter_link); - gst_pad_set_getcaps_function(videofilter->srcpad,gst_videofilter_getcaps); + GST_DEBUG ("gst_videofilter_init"); + + pad_template = + gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink"); + g_return_if_fail (pad_template != NULL); + videofilter->sinkpad = gst_pad_new_from_template (pad_template, "sink"); + gst_element_add_pad (GST_ELEMENT (videofilter), videofilter->sinkpad); + gst_pad_set_chain_function (videofilter->sinkpad, gst_videofilter_chain); + gst_pad_set_link_function (videofilter->sinkpad, gst_videofilter_link); + gst_pad_set_getcaps_function (videofilter->sinkpad, gst_videofilter_getcaps); + + pad_template = + gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src"); + g_return_if_fail (pad_template != NULL); + videofilter->srcpad = gst_pad_new_from_template (pad_template, "src"); + gst_element_add_pad (GST_ELEMENT (videofilter), videofilter->srcpad); + gst_pad_set_link_function (videofilter->srcpad, gst_videofilter_link); + gst_pad_set_getcaps_function (videofilter->srcpad, gst_videofilter_getcaps); videofilter->inited = FALSE; } static void -gst_videofilter_chain (GstPad *pad, GstData *_data) +gst_videofilter_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstVideofilter *videofilter; @@ -304,62 +321,63 @@ gst_videofilter_chain (GstPad *pad, GstData *_data) videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad)); //g_return_if_fail (videofilter->inited); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - if(videofilter->passthru){ - gst_pad_push(videofilter->srcpad, GST_DATA (buf)); + if (videofilter->passthru) { + gst_pad_push (videofilter->srcpad, GST_DATA (buf)); return; } - GST_DEBUG ("gst_videofilter_chain: got buffer of %ld bytes in '%s'",size, - GST_OBJECT_NAME (videofilter)); - - GST_DEBUG("size=%ld from=%dx%d to=%dx%d fromsize=%ld (should be %d) tosize=%d", - size, - videofilter->from_width, videofilter->from_height, - videofilter->to_width, videofilter->to_height, - size, videofilter->from_buf_size, - videofilter->to_buf_size); + GST_DEBUG ("gst_videofilter_chain: got buffer of %ld bytes in '%s'", size, + GST_OBJECT_NAME (videofilter)); + + GST_DEBUG + ("size=%ld from=%dx%d to=%dx%d fromsize=%ld (should be %d) tosize=%d", + size, videofilter->from_width, videofilter->from_height, + videofilter->to_width, videofilter->to_height, size, + videofilter->from_buf_size, videofilter->to_buf_size); g_return_if_fail (size >= videofilter->from_buf_size); if (size > videofilter->from_buf_size) { - GST_INFO("buffer size %ld larger than expected (%d)", - size, videofilter->from_buf_size); + GST_INFO ("buffer size %ld larger than expected (%d)", + size, videofilter->from_buf_size); } - outbuf = gst_pad_alloc_buffer(videofilter->srcpad, GST_BUFFER_OFFSET_NONE, + outbuf = gst_pad_alloc_buffer (videofilter->srcpad, GST_BUFFER_OFFSET_NONE, videofilter->to_buf_size); - GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf); - GST_BUFFER_DURATION(outbuf) = GST_BUFFER_DURATION(buf); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); - g_return_if_fail(videofilter->format); - GST_DEBUG ("format %s",videofilter->format->fourcc); + g_return_if_fail (videofilter->format); + GST_DEBUG ("format %s", videofilter->format->fourcc); videofilter->in_buf = buf; videofilter->out_buf = outbuf; - videofilter->format->filter_func(videofilter, GST_BUFFER_DATA(outbuf), data); + videofilter->format->filter_func (videofilter, GST_BUFFER_DATA (outbuf), + data); - GST_DEBUG ("gst_videofilter_chain: pushing buffer of %d bytes in '%s'",GST_BUFFER_SIZE(outbuf), - GST_OBJECT_NAME (videofilter)); + GST_DEBUG ("gst_videofilter_chain: pushing buffer of %d bytes in '%s'", + GST_BUFFER_SIZE (outbuf), GST_OBJECT_NAME (videofilter)); - gst_pad_push(videofilter->srcpad, GST_DATA (outbuf)); + gst_pad_push (videofilter->srcpad, GST_DATA (outbuf)); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_videofilter_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_videofilter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideofilter *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFILTER(object)); - src = GST_VIDEOFILTER(object); + g_return_if_fail (GST_IS_VIDEOFILTER (object)); + src = GST_VIDEOFILTER (object); - GST_DEBUG("gst_videofilter_set_property"); + GST_DEBUG ("gst_videofilter_set_property"); switch (prop_id) { default: break; @@ -367,13 +385,14 @@ gst_videofilter_set_property (GObject *object, guint prop_id, const GValue *valu } static void -gst_videofilter_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_videofilter_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideofilter *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFILTER(object)); - src = GST_VIDEOFILTER(object); + g_return_if_fail (GST_IS_VIDEOFILTER (object)); + src = GST_VIDEOFILTER (object); switch (prop_id) { default: @@ -382,36 +401,39 @@ gst_videofilter_get_property (GObject *object, guint prop_id, GValue *value, GPa } } -int gst_videofilter_get_input_width(GstVideofilter *videofilter) +int +gst_videofilter_get_input_width (GstVideofilter * videofilter) { - g_return_val_if_fail(GST_IS_VIDEOFILTER(videofilter),0); + g_return_val_if_fail (GST_IS_VIDEOFILTER (videofilter), 0); return videofilter->from_width; } -int gst_videofilter_get_input_height(GstVideofilter *videofilter) +int +gst_videofilter_get_input_height (GstVideofilter * videofilter) { - g_return_val_if_fail(GST_IS_VIDEOFILTER(videofilter),0); + g_return_val_if_fail (GST_IS_VIDEOFILTER (videofilter), 0); return videofilter->from_height; } -void gst_videofilter_set_output_size(GstVideofilter *videofilter, +void +gst_videofilter_set_output_size (GstVideofilter * videofilter, int width, int height) { int ret; GstCaps *srccaps; GstStructure *structure; - g_return_if_fail(GST_IS_VIDEOFILTER(videofilter)); + g_return_if_fail (GST_IS_VIDEOFILTER (videofilter)); videofilter->to_width = width; videofilter->to_height = height; videofilter->to_buf_size = (videofilter->to_width * videofilter->to_height - * videofilter->format->bpp)/8; + * videofilter->format->bpp) / 8; - srccaps = gst_caps_copy (gst_pad_get_negotiated_caps(videofilter->srcpad)); + srccaps = gst_caps_copy (gst_pad_get_negotiated_caps (videofilter->srcpad)); structure = gst_caps_get_structure (srccaps, 0); gst_structure_set (structure, "width", G_TYPE_INT, width, @@ -424,60 +446,66 @@ void gst_videofilter_set_output_size(GstVideofilter *videofilter, } } -static void gst_videofilter_setup(GstVideofilter *videofilter) +static void +gst_videofilter_setup (GstVideofilter * videofilter) { GstVideofilterClass *klass; - klass = GST_VIDEOFILTER_CLASS(G_OBJECT_GET_CLASS(videofilter)); + klass = GST_VIDEOFILTER_CLASS (G_OBJECT_GET_CLASS (videofilter)); - if(klass->setup){ - klass->setup(videofilter); + if (klass->setup) { + klass->setup (videofilter); } - if(videofilter->to_width == 0){ + if (videofilter->to_width == 0) { videofilter->to_width = videofilter->from_width; } - if(videofilter->to_height == 0){ + if (videofilter->to_height == 0) { videofilter->to_height = videofilter->from_height; } - g_return_if_fail(videofilter->format != NULL); - g_return_if_fail(videofilter->from_width > 0); - g_return_if_fail(videofilter->from_height > 0); - g_return_if_fail(videofilter->to_width > 0); - g_return_if_fail(videofilter->to_height > 0); + g_return_if_fail (videofilter->format != NULL); + g_return_if_fail (videofilter->from_width > 0); + g_return_if_fail (videofilter->from_height > 0); + g_return_if_fail (videofilter->to_width > 0); + g_return_if_fail (videofilter->to_height > 0); - videofilter->from_buf_size = (videofilter->from_width * videofilter->from_height * + videofilter->from_buf_size = + (videofilter->from_width * videofilter->from_height * videofilter->format->bpp) / 8; - videofilter->to_buf_size = (videofilter->to_width * videofilter->to_height * + videofilter->to_buf_size = + (videofilter->to_width * videofilter->to_height * videofilter->format->bpp) / 8; videofilter->inited = TRUE; } -GstVideofilterFormat *gst_videofilter_find_format_by_structure ( - GstVideofilter *videofilter, const GstStructure *structure) +GstVideofilterFormat * +gst_videofilter_find_format_by_structure (GstVideofilter * videofilter, + const GstStructure * structure) { int i; GstVideofilterClass *klass; GstVideofilterFormat *format; gboolean ret; - klass = GST_VIDEOFILTER_CLASS(G_OBJECT_GET_CLASS(videofilter)); + klass = GST_VIDEOFILTER_CLASS (G_OBJECT_GET_CLASS (videofilter)); - g_return_val_if_fail(structure != NULL, NULL); + g_return_val_if_fail (structure != NULL, NULL); if (strcmp (gst_structure_get_name (structure), "video/x-raw-yuv") == 0) { guint32 fourcc; ret = gst_structure_get_fourcc (structure, "format", &fourcc); - if (!ret) return NULL; - for(i=0;iformats->len;i++){ + if (!ret) + return NULL; + for (i = 0; i < klass->formats->len; i++) { guint32 format_fourcc; - format = g_ptr_array_index(klass->formats,i); + + format = g_ptr_array_index (klass->formats, i); format_fourcc = GST_STR_FOURCC (format->fourcc); if (format->depth == 0 && format_fourcc == fourcc) { - return format; + return format; } } } else if (strcmp (gst_structure_get_name (structure), "video/x-raw-rgb") @@ -495,13 +523,14 @@ GstVideofilterFormat *gst_videofilter_find_format_by_structure ( ret &= gst_structure_get_int (structure, "red_mask", &red_mask); ret &= gst_structure_get_int (structure, "green_mask", &green_mask); ret &= gst_structure_get_int (structure, "blue_mask", &blue_mask); - if (!ret) return NULL; - for(i=0;iformats->len;i++){ - format = g_ptr_array_index(klass->formats,i); + if (!ret) + return NULL; + for (i = 0; i < klass->formats->len; i++) { + format = g_ptr_array_index (klass->formats, i); if (format->bpp == bpp && format->depth == depth && - format->endianness == endianness && format->red_mask == red_mask && - format->green_mask == green_mask && format->blue_mask == blue_mask) { - return format; + format->endianness == endianness && format->red_mask == red_mask && + format->green_mask == green_mask && format->blue_mask == blue_mask) { + return format; } } } @@ -509,39 +538,36 @@ GstVideofilterFormat *gst_videofilter_find_format_by_structure ( return NULL; } -void gst_videofilter_class_add_format(GstVideofilterClass *videofilterclass, - GstVideofilterFormat *format) +void +gst_videofilter_class_add_format (GstVideofilterClass * videofilterclass, + GstVideofilterFormat * format) { - g_ptr_array_add(videofilterclass->formats, format); + g_ptr_array_add (videofilterclass->formats, format); } -void gst_videofilter_class_add_pad_templates (GstVideofilterClass *videofilter_class) +void +gst_videofilter_class_add_pad_templates (GstVideofilterClass * + videofilter_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (videofilter_class); gst_element_class_add_pad_template (element_class, - gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_videofilter_class_get_capslist (videofilter_class))); + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_videofilter_class_get_capslist (videofilter_class))); gst_element_class_add_pad_template (element_class, - gst_pad_template_new("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - gst_videofilter_class_get_capslist (videofilter_class))); + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_videofilter_class_get_capslist (videofilter_class))); } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gstvideofilter", - "Video filter parent class", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gstvideofilter", + "Video filter parent class", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/videofilter/gstvideofilter.h b/gst/videofilter/gstvideofilter.h index e6c346c0..2c10a211 100644 --- a/gst/videofilter/gstvideofilter.h +++ b/gst/videofilter/gstvideofilter.h @@ -25,18 +25,17 @@ #include -G_BEGIN_DECLS - -typedef struct _GstVideofilter GstVideofilter; +G_BEGIN_DECLS typedef struct _GstVideofilter GstVideofilter; typedef struct _GstVideofilterClass GstVideofilterClass; -typedef void (*GstVideofilterFilterFunc)(GstVideofilter *filter, +typedef void (*GstVideofilterFilterFunc) (GstVideofilter * filter, void *out_data, void *in_data); -typedef void (*GstVideofilterSetupFunc)(GstVideofilter *filter); +typedef void (*GstVideofilterSetupFunc) (GstVideofilter * filter); typedef struct _GstVideofilterFormat GstVideofilterFormat; -struct _GstVideofilterFormat { +struct _GstVideofilterFormat +{ char *fourcc; int bpp; GstVideofilterFilterFunc filter_func; @@ -58,10 +57,11 @@ struct _GstVideofilterFormat { #define GST_IS_VIDEOFILTER_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOFILTER)) -struct _GstVideofilter { +struct _GstVideofilter +{ GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* video state */ gboolean inited; @@ -81,28 +81,29 @@ struct _GstVideofilter { GstBuffer *out_buf; }; -struct _GstVideofilterClass { +struct _GstVideofilterClass +{ GstElementClass parent_class; GPtrArray *formats; GstVideofilterSetupFunc setup; }; -GType gst_videofilter_get_type(void); +GType gst_videofilter_get_type (void); -int gst_videofilter_get_input_width(GstVideofilter *videofilter); -int gst_videofilter_get_input_height(GstVideofilter *videofilter); -void gst_videofilter_set_output_size(GstVideofilter *videofilter, +int gst_videofilter_get_input_width (GstVideofilter * videofilter); +int gst_videofilter_get_input_height (GstVideofilter * videofilter); +void gst_videofilter_set_output_size (GstVideofilter * videofilter, int width, int height); -GstVideofilterFormat *gst_videofilter_find_format_by_structure (GstVideofilter *filter, - const GstStructure *structure); -GstCaps *gst_videofilter_class_get_capslist(GstVideofilterClass *videofilterclass); +GstVideofilterFormat *gst_videofilter_find_format_by_structure (GstVideofilter * + filter, const GstStructure * structure); +GstCaps *gst_videofilter_class_get_capslist (GstVideofilterClass * + videofilterclass); -void gst_videofilter_class_add_format(GstVideofilterClass *videofilterclass, - GstVideofilterFormat *format); -void gst_videofilter_class_add_pad_templates (GstVideofilterClass *videofilterclass); +void gst_videofilter_class_add_format (GstVideofilterClass * videofilterclass, + GstVideofilterFormat * format); +void gst_videofilter_class_add_pad_templates (GstVideofilterClass * + videofilterclass); G_END_DECLS - #endif /* __GST_VIDEOFILTER_H__ */ - diff --git a/gst/videofilter/gstvideoflip.c b/gst/videofilter/gstvideoflip.c index 3ba70ee8..32157b61 100644 --- a/gst/videofilter/gstvideoflip.c +++ b/gst/videofilter/gstvideoflip.c @@ -32,47 +32,54 @@ #include /* GstVideoflip signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METHOD, /* FILL ME */ }; -static void gst_videoflip_base_init (gpointer g_class); -static void gst_videoflip_class_init (gpointer g_class, gpointer class_data); -static void gst_videoflip_init (GTypeInstance *instance, gpointer g_class); +static void gst_videoflip_base_init (gpointer g_class); +static void gst_videoflip_class_init (gpointer g_class, gpointer class_data); +static void gst_videoflip_init (GTypeInstance * instance, gpointer g_class); -static void gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_videoflip_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videoflip_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_videoflip_planar411(GstVideofilter *videofilter, void *dest, void *src); -static void gst_videoflip_setup(GstVideofilter *videofilter); +static void gst_videoflip_planar411 (GstVideofilter * videofilter, void *dest, + void *src); +static void gst_videoflip_setup (GstVideofilter * videofilter); #define GST_TYPE_VIDEOFLIP_METHOD (gst_videoflip_method_get_type()) static GType -gst_videoflip_method_get_type(void) +gst_videoflip_method_get_type (void) { static GType videoflip_method_type = 0; static GEnumValue videoflip_methods[] = { - { GST_VIDEOFLIP_METHOD_IDENTITY, "0", "Identity (no rotation)" }, - { GST_VIDEOFLIP_METHOD_90R, "1", "Rotate clockwise 90 degrees" }, - { GST_VIDEOFLIP_METHOD_180, "2", "Rotate 180 degrees" }, - { GST_VIDEOFLIP_METHOD_90L, "3", "Rotate counter-clockwise 90 degrees" }, - { GST_VIDEOFLIP_METHOD_HORIZ, "4", "Flip horizontally" }, - { GST_VIDEOFLIP_METHOD_VERT, "5", "Flip vertically" }, - { GST_VIDEOFLIP_METHOD_TRANS, "6", "Flip across upper left/lower right diagonal" }, - { GST_VIDEOFLIP_METHOD_OTHER, "7", "Flip across upper right/lower left diagonal" }, - { 0, NULL, NULL }, + {GST_VIDEOFLIP_METHOD_IDENTITY, "0", "Identity (no rotation)"}, + {GST_VIDEOFLIP_METHOD_90R, "1", "Rotate clockwise 90 degrees"}, + {GST_VIDEOFLIP_METHOD_180, "2", "Rotate 180 degrees"}, + {GST_VIDEOFLIP_METHOD_90L, "3", "Rotate counter-clockwise 90 degrees"}, + {GST_VIDEOFLIP_METHOD_HORIZ, "4", "Flip horizontally"}, + {GST_VIDEOFLIP_METHOD_VERT, "5", "Flip vertically"}, + {GST_VIDEOFLIP_METHOD_TRANS, "6", + "Flip across upper left/lower right diagonal"}, + {GST_VIDEOFLIP_METHOD_OTHER, "7", + "Flip across upper right/lower left diagonal"}, + {0, NULL, NULL}, }; - if(!videoflip_method_type){ - videoflip_method_type = g_enum_register_static("GstVideoflipMethod", - videoflip_methods); + if (!videoflip_method_type) { + videoflip_method_type = g_enum_register_static ("GstVideoflipMethod", + videoflip_methods); } return videoflip_method_type; } @@ -84,46 +91,45 @@ gst_videoflip_get_type (void) if (!videoflip_type) { static const GTypeInfo videoflip_info = { - sizeof(GstVideoflipClass), + sizeof (GstVideoflipClass), gst_videoflip_base_init, NULL, gst_videoflip_class_init, NULL, NULL, - sizeof(GstVideoflip), + sizeof (GstVideoflip), 0, gst_videoflip_init, }; - videoflip_type = g_type_register_static(GST_TYPE_VIDEOFILTER, - "GstVideoflip", &videoflip_info, 0); + videoflip_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstVideoflip", &videoflip_info, 0); } return videoflip_type; } static GstVideofilterFormat gst_videoflip_formats[] = { /* planar */ - { "YV12", 12, gst_videoflip_planar411, }, - { "I420", 12, gst_videoflip_planar411, }, - { "IYUV", 12, gst_videoflip_planar411, }, + {"YV12", 12, gst_videoflip_planar411,}, + {"I420", 12, gst_videoflip_planar411,}, + {"IYUV", 12, gst_videoflip_planar411,}, }; static void gst_videoflip_base_init (gpointer g_class) { - static GstElementDetails videoflip_details = GST_ELEMENT_DETAILS ( - "Video Flipper", - "Filter/Effect/Video", - "Flips and rotates video", - "David Schleef " - ); + static GstElementDetails videoflip_details = + GST_ELEMENT_DETAILS ("Video Flipper", + "Filter/Effect/Video", + "Flips and rotates video", + "David Schleef "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &videoflip_details); - for(i=0;iset_property = gst_videoflip_set_property; gobject_class->get_property = gst_videoflip_get_property; @@ -151,33 +157,34 @@ gst_videoflip_class_init (gpointer g_class, gpointer class_data) } static void -gst_videoflip_init (GTypeInstance *instance, gpointer g_class) +gst_videoflip_init (GTypeInstance * instance, gpointer g_class) { GstVideoflip *videoflip = GST_VIDEOFLIP (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_videoflip_init"); + GST_DEBUG ("gst_videoflip_init"); - videofilter = GST_VIDEOFILTER(videoflip); + videofilter = GST_VIDEOFILTER (videoflip); /* do stuff */ } static void -gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_videoflip_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideoflip *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFLIP(object)); - src = GST_VIDEOFLIP(object); + g_return_if_fail (GST_IS_VIDEOFLIP (object)); + src = GST_VIDEOFLIP (object); - GST_DEBUG("gst_videoflip_set_property"); + GST_DEBUG ("gst_videoflip_set_property"); switch (prop_id) { case ARG_METHOD: src->method = g_value_get_enum (value); /* FIXME is this ok? (threading issues) */ - gst_videoflip_setup(GST_VIDEOFILTER(src)); + gst_videoflip_setup (GST_VIDEOFILTER (src)); break; default: break; @@ -185,13 +192,14 @@ gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_videoflip_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideoflip *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFLIP(object)); - src = GST_VIDEOFLIP(object); + g_return_if_fail (GST_IS_VIDEOFLIP (object)); + src = GST_VIDEOFLIP (object); switch (prop_id) { case ARG_METHOD: @@ -203,87 +211,83 @@ gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GPara } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; return gst_element_register (plugin, "videoflip", GST_RANK_NONE, GST_TYPE_VIDEOFLIP); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videoflip", - "Flips and rotates video", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videoflip", + "Flips and rotates video", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) -static void gst_videoflip_flip(GstVideoflip *videoflip, unsigned char *dest, - unsigned char *src, int sw, int sh, int dw, int dh); + static void gst_videoflip_flip (GstVideoflip * videoflip, + unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); -static void gst_videoflip_setup (GstVideofilter *videofilter) + static void gst_videoflip_setup (GstVideofilter * videofilter) { int from_width, from_height; GstVideoflip *videoflip; - GST_DEBUG("gst_videoflip_setup"); + GST_DEBUG ("gst_videoflip_setup"); - videoflip = GST_VIDEOFLIP(videofilter); + videoflip = GST_VIDEOFLIP (videofilter); - from_width = gst_videofilter_get_input_width(videofilter); - from_height = gst_videofilter_get_input_height(videofilter); + from_width = gst_videofilter_get_input_width (videofilter); + from_height = gst_videofilter_get_input_height (videofilter); - if(from_width==0 || from_height==0){ + if (from_width == 0 || from_height == 0) { return; } - switch(videoflip->method){ + switch (videoflip->method) { case GST_VIDEOFLIP_METHOD_90R: case GST_VIDEOFLIP_METHOD_90L: case GST_VIDEOFLIP_METHOD_TRANS: case GST_VIDEOFLIP_METHOD_OTHER: - gst_videofilter_set_output_size(videofilter, from_height, from_width); + gst_videofilter_set_output_size (videofilter, from_height, from_width); break; case GST_VIDEOFLIP_METHOD_IDENTITY: case GST_VIDEOFLIP_METHOD_180: case GST_VIDEOFLIP_METHOD_HORIZ: case GST_VIDEOFLIP_METHOD_VERT: - gst_videofilter_set_output_size(videofilter, from_width, from_height); + gst_videofilter_set_output_size (videofilter, from_width, from_height); break; default: - g_assert_not_reached(); + g_assert_not_reached (); break; } GST_DEBUG ("format=%p \"%s\" from %dx%d to %dx%d", - videofilter->format, videofilter->format->fourcc, - from_width, from_height, - videofilter->to_width, videofilter->to_height); + videofilter->format, videofilter->format->fourcc, + from_width, from_height, videofilter->to_width, videofilter->to_height); - if(videoflip->method == GST_VIDEOFLIP_METHOD_IDENTITY){ + if (videoflip->method == GST_VIDEOFLIP_METHOD_IDENTITY) { GST_DEBUG ("videoflip: using passthru"); videofilter->passthru = TRUE; - }else{ + } else { videofilter->passthru = FALSE; } - videofilter->from_buf_size = (videofilter->from_width * videofilter->from_height - * videofilter->format->depth) / 8; - videofilter->to_buf_size = (videofilter->to_width * videofilter->to_height - * videofilter->format->depth) / 8; + videofilter->from_buf_size = + (videofilter->from_width * videofilter->from_height * + videofilter->format->depth) / 8; + videofilter->to_buf_size = + (videofilter->to_width * videofilter->to_height * + videofilter->format->depth) / 8; videofilter->inited = TRUE; } -static void gst_videoflip_planar411(GstVideofilter *videofilter, - void *dest, void *src) +static void +gst_videoflip_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstVideoflip *videoflip; int sw; @@ -291,8 +295,8 @@ static void gst_videoflip_planar411(GstVideofilter *videofilter, int dw; int dh; - g_return_if_fail(GST_IS_VIDEOFLIP(videofilter)); - videoflip = GST_VIDEOFLIP(videofilter); + g_return_if_fail (GST_IS_VIDEOFLIP (videofilter)); + videoflip = GST_VIDEOFLIP (videofilter); sw = videofilter->from_width; sh = videofilter->from_height; @@ -301,78 +305,78 @@ static void gst_videoflip_planar411(GstVideofilter *videofilter, GST_DEBUG ("videoflip: scaling planar 4:1:1 %dx%d to %dx%d", sw, sh, dw, dh); - gst_videoflip_flip(videoflip, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (videoflip, dest, src, sw, sh, dw, dh); - src += sw*sh; - dest += dw*dh; + src += sw * sh; + dest += dw * dh; - dh = dh>>1; - dw = dw>>1; - sh = sh>>1; - sw = sw>>1; + dh = dh >> 1; + dw = dw >> 1; + sh = sh >> 1; + sw = sw >> 1; - gst_videoflip_flip(videoflip, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (videoflip, dest, src, sw, sh, dw, dh); - src += sw*sh; - dest += dw*dh; + src += sw * sh; + dest += dw * dh; - gst_videoflip_flip(videoflip, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (videoflip, dest, src, sw, sh, dw, dh); } static void -gst_videoflip_flip(GstVideoflip *videoflip, unsigned char *dest, +gst_videoflip_flip (GstVideoflip * videoflip, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh) { - int x,y; + int x, y; - switch(videoflip->method){ + switch (videoflip->method) { case GST_VIDEOFLIP_METHOD_90R: - for(y=0;y" - ); + static GstElementDetails videotemplate_details = + GST_ELEMENT_DETAILS ("Video Filter Template", + "Filter/Effect/Video", + "Template for a video filter", + "David Schleef "); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; - + gst_element_class_set_details (element_class, &videotemplate_details); - for(i=0;iset_property = gst_videotemplate_set_property; @@ -152,28 +159,29 @@ gst_videotemplate_class_init (gpointer g_class, gpointer class_data) } static void -gst_videotemplate_init (GTypeInstance *instance, gpointer g_class) +gst_videotemplate_init (GTypeInstance * instance, gpointer g_class) { GstVideotemplate *videotemplate = GST_VIDEOTEMPLATE (instance); GstVideofilter *videofilter; - GST_DEBUG("gst_videotemplate_init"); + GST_DEBUG ("gst_videotemplate_init"); - videofilter = GST_VIDEOFILTER(videotemplate); + videofilter = GST_VIDEOFILTER (videotemplate); /* do stuff */ } static void -gst_videotemplate_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_videotemplate_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideotemplate *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOTEMPLATE(object)); - src = GST_VIDEOTEMPLATE(object); + g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); + src = GST_VIDEOTEMPLATE (object); - GST_DEBUG("gst_videotemplate_set_property"); + GST_DEBUG ("gst_videotemplate_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: @@ -186,13 +194,14 @@ gst_videotemplate_set_property (GObject *object, guint prop_id, const GValue *va } static void -gst_videotemplate_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_videotemplate_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideotemplate *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOTEMPLATE(object)); - src = GST_VIDEOTEMPLATE(object); + g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); + src = GST_VIDEOTEMPLATE (object); switch (prop_id) { #if 0 @@ -206,50 +215,45 @@ gst_videotemplate_get_property (GObject *object, guint prop_id, GValue *value, G } } -static gboolean plugin_init (GstPlugin *plugin) +static gboolean +plugin_init (GstPlugin * plugin) { - if(!gst_library_load("gstvideofilter")) + if (!gst_library_load ("gstvideofilter")) return FALSE; return gst_element_register (plugin, "videotemplate", GST_RANK_NONE, GST_TYPE_VIDEOTEMPLATE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videotemplate", - "Template for a video filter", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - -static void gst_videotemplate_setup(GstVideofilter *videofilter) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videotemplate", + "Template for a video filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) + + static void gst_videotemplate_setup (GstVideofilter * videofilter) { GstVideotemplate *videotemplate; - g_return_if_fail(GST_IS_VIDEOTEMPLATE(videofilter)); - videotemplate = GST_VIDEOTEMPLATE(videofilter); + g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); + videotemplate = GST_VIDEOTEMPLATE (videofilter); /* if any setup needs to be done, do it here */ } -static void gst_videotemplate_planar411(GstVideofilter *videofilter, +static void +gst_videotemplate_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstVideotemplate *videotemplate; - int width = gst_videofilter_get_input_width(videofilter); - int height = gst_videofilter_get_input_height(videofilter); + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); - g_return_if_fail(GST_IS_VIDEOTEMPLATE(videofilter)); - videotemplate = GST_VIDEOTEMPLATE(videofilter); + g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); + videotemplate = GST_VIDEOTEMPLATE (videofilter); /* do something interesting here. This simply copies the source * to the destination. */ - memcpy(dest,src,width * height + (width/2) * (height/2) * 2); + memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2); } - diff --git a/gst/videoflip/gstvideoflip.c b/gst/videoflip/gstvideoflip.c index 0f20f47b..9c7816de 100644 --- a/gst/videoflip/gstvideoflip.c +++ b/gst/videoflip/gstvideoflip.c @@ -28,34 +28,37 @@ /* elementfactory information */ -static GstElementDetails videoflip_details = GST_ELEMENT_DETAILS ( - "Video scaler", - "Filter/Effect/Video", - "Resizes video", - "Wim Taymans " -); +static GstElementDetails videoflip_details = +GST_ELEMENT_DETAILS ("Video scaler", + "Filter/Effect/Video", + "Resizes video", + "Wim Taymans "); /* GstVideoflip signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METHOD, /* FILL ME */ }; -static void gst_videoflip_base_init (gpointer g_class); -static void gst_videoflip_class_init (GstVideoflipClass *klass); -static void gst_videoflip_init (GstVideoflip *videoflip); +static void gst_videoflip_base_init (gpointer g_class); +static void gst_videoflip_class_init (GstVideoflipClass * klass); +static void gst_videoflip_init (GstVideoflip * videoflip); -static void gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_videoflip_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videoflip_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_videoflip_chain (GstPad *pad, GstData *_data); -static GstCaps * gst_videoflip_get_capslist(void); +static void gst_videoflip_chain (GstPad * pad, GstData * _data); +static GstCaps *gst_videoflip_get_capslist (void); static GstElementClass *parent_class = NULL; @@ -63,50 +66,50 @@ static GstElementClass *parent_class = NULL; #define GST_TYPE_VIDEOFLIP_METHOD (gst_videoflip_method_get_type()) static GType -gst_videoflip_method_get_type(void) +gst_videoflip_method_get_type (void) { static GType videoflip_method_type = 0; static GEnumValue videoflip_methods[] = { - { GST_VIDEOFLIP_METHOD_IDENTITY, "0", "Identity (no rotation)" }, - { GST_VIDEOFLIP_METHOD_90R, "1", "Rotate right 90 degrees" }, - { GST_VIDEOFLIP_METHOD_180, "2", "Rotate 180 degrees" }, - { GST_VIDEOFLIP_METHOD_90L, "3", "Rotate left 90 degrees" }, - { GST_VIDEOFLIP_METHOD_HORIZ, "4", "Flip horizontally" }, - { GST_VIDEOFLIP_METHOD_VERT, "5", "Flip vertically" }, - { GST_VIDEOFLIP_METHOD_TRANS, "6", "Flip across upper left/lower right diagonal" }, - { GST_VIDEOFLIP_METHOD_OTHER, "7", "Flip across upper right/lower left diagonal" }, - { 0, NULL, NULL }, + {GST_VIDEOFLIP_METHOD_IDENTITY, "0", "Identity (no rotation)"}, + {GST_VIDEOFLIP_METHOD_90R, "1", "Rotate right 90 degrees"}, + {GST_VIDEOFLIP_METHOD_180, "2", "Rotate 180 degrees"}, + {GST_VIDEOFLIP_METHOD_90L, "3", "Rotate left 90 degrees"}, + {GST_VIDEOFLIP_METHOD_HORIZ, "4", "Flip horizontally"}, + {GST_VIDEOFLIP_METHOD_VERT, "5", "Flip vertically"}, + {GST_VIDEOFLIP_METHOD_TRANS, "6", + "Flip across upper left/lower right diagonal"}, + {GST_VIDEOFLIP_METHOD_OTHER, "7", + "Flip across upper right/lower left diagonal"}, + {0, NULL, NULL}, }; - if(!videoflip_method_type){ - videoflip_method_type = g_enum_register_static("GstVideoflipMethod", + if (!videoflip_method_type) { + videoflip_method_type = g_enum_register_static ("GstVideoflipMethod", videoflip_methods); } return videoflip_method_type; } static GstPadTemplate * -gst_videoflip_src_template_factory(void) +gst_videoflip_src_template_factory (void) { /* well, actually RGB too, but since there's no RGB format anyway */ GstCaps *caps = gst_caps_from_string ("video/x-raw-yuv, " - "width = (int) [ 0, MAX ], " - "height = (int) [ 0, MAX ], " - "framerate = (double) [ 0, MAX ]"); + "width = (int) [ 0, MAX ], " + "height = (int) [ 0, MAX ], " "framerate = (double) [ 0, MAX ]"); - caps = gst_caps_intersect(caps, gst_videoflip_get_capslist ()); + caps = gst_caps_intersect (caps, gst_videoflip_get_capslist ()); return gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); } static GstPadTemplate * -gst_videoflip_sink_template_factory(void) +gst_videoflip_sink_template_factory (void) { GstCaps *caps = gst_caps_from_string ("video/x-raw-yuv, " - "width = (int) [ 0, MAX ], " - "height = (int) [ 0, MAX ], " - "framerate = (double) [ 0, MAX ]"); + "width = (int) [ 0, MAX ], " + "height = (int) [ 0, MAX ], " "framerate = (double) [ 0, MAX ]"); - caps = gst_caps_intersect(caps, gst_videoflip_get_capslist ()); + caps = gst_caps_intersect (caps, gst_videoflip_get_capslist ()); return gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); } @@ -118,17 +121,19 @@ gst_videoflip_get_type (void) if (!videoflip_type) { static const GTypeInfo videoflip_info = { - sizeof(GstVideoflipClass), + sizeof (GstVideoflipClass), gst_videoflip_base_init, NULL, - (GClassInitFunc)gst_videoflip_class_init, + (GClassInitFunc) gst_videoflip_class_init, NULL, NULL, - sizeof(GstVideoflip), + sizeof (GstVideoflip), 0, - (GInstanceInitFunc)gst_videoflip_init, + (GInstanceInitFunc) gst_videoflip_init, }; - videoflip_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVideoflip", &videoflip_info, 0); + videoflip_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstVideoflip", + &videoflip_info, 0); } return videoflip_type; } @@ -146,20 +151,20 @@ gst_videoflip_base_init (gpointer g_class) gst_videoflip_src_template_factory ()); } static void -gst_videoflip_class_init (GstVideoflipClass *klass) +gst_videoflip_class_init (GstVideoflipClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_METHOD, - g_param_spec_enum("method","method","method", - GST_TYPE_VIDEOFLIP_METHOD, GST_VIDEOFLIP_METHOD_90R, - G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_METHOD, + g_param_spec_enum ("method", "method", "method", + GST_TYPE_VIDEOFLIP_METHOD, GST_VIDEOFLIP_METHOD_90R, + G_PARAM_READWRITE)); - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_videoflip_set_property; gobject_class->get_property = gst_videoflip_get_property; @@ -167,14 +172,14 @@ gst_videoflip_class_init (GstVideoflipClass *klass) } static GstCaps * -gst_videoflip_get_capslist(void) +gst_videoflip_get_capslist (void) { GstCaps *caps; GstStructure *structure; int i; caps = gst_caps_new_empty (); - for(i=0;isrcpad){ + if (pad == videoflip->srcpad) { peercaps = gst_pad_get_allowed_caps (videoflip->sinkpad); - }else{ + } else { peercaps = gst_pad_get_allowed_caps (videoflip->srcpad); } @@ -206,21 +211,20 @@ gst_videoflip_sink_getcaps (GstPad *pad) * doesn't understand. */ /* Look through our list of caps and find those that match with * the peer's formats. Create a list of them. */ - for(i=0;iformat = videoflip_find_by_caps (caps); - g_return_val_if_fail(videoflip->format, GST_PAD_LINK_REFUSED); + g_return_val_if_fail (videoflip->format, GST_PAD_LINK_REFUSED); ret = gst_structure_get_int (structure, "width", &videoflip->to_width); ret &= gst_structure_get_int (structure, "height", &videoflip->to_height); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_OK; } static GstPadLinkReturn -gst_videoflip_sink_link (GstPad *pad, const GstCaps *caps) +gst_videoflip_sink_link (GstPad * pad, const GstCaps * caps) { GstVideoflip *videoflip; GstStructure *structure; @@ -259,37 +264,37 @@ gst_videoflip_sink_link (GstPad *pad, const GstCaps *caps) GST_DEBUG ("gst_videoflip_sink_link"); videoflip = GST_VIDEOFLIP (gst_pad_get_parent (pad)); - + structure = gst_caps_get_structure (caps, 0); videoflip->format = videoflip_find_by_caps (caps); - g_return_val_if_fail(videoflip->format, GST_PAD_LINK_REFUSED); + g_return_val_if_fail (videoflip->format, GST_PAD_LINK_REFUSED); ret = gst_structure_get_int (structure, "width", &videoflip->from_width); ret &= gst_structure_get_int (structure, "height", &videoflip->from_height); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_OK; } static void -gst_videoflip_init (GstVideoflip *videoflip) +gst_videoflip_init (GstVideoflip * videoflip) { GST_DEBUG ("gst_videoflip_init"); - videoflip->sinkpad = gst_pad_new_from_template ( - gst_videoflip_sink_template_factory(), - "sink"); - gst_element_add_pad(GST_ELEMENT(videoflip),videoflip->sinkpad); - gst_pad_set_chain_function(videoflip->sinkpad,gst_videoflip_chain); - gst_pad_set_link_function(videoflip->sinkpad,gst_videoflip_sink_link); - gst_pad_set_getcaps_function(videoflip->sinkpad,gst_videoflip_sink_getcaps); - - videoflip->srcpad = gst_pad_new_from_template ( - gst_videoflip_src_template_factory(), - "src"); - gst_element_add_pad(GST_ELEMENT(videoflip),videoflip->srcpad); - gst_pad_set_link_function(videoflip->srcpad,gst_videoflip_src_link); + videoflip->sinkpad = + gst_pad_new_from_template (gst_videoflip_sink_template_factory (), + "sink"); + gst_element_add_pad (GST_ELEMENT (videoflip), videoflip->sinkpad); + gst_pad_set_chain_function (videoflip->sinkpad, gst_videoflip_chain); + gst_pad_set_link_function (videoflip->sinkpad, gst_videoflip_sink_link); + gst_pad_set_getcaps_function (videoflip->sinkpad, gst_videoflip_sink_getcaps); + + videoflip->srcpad = + gst_pad_new_from_template (gst_videoflip_src_template_factory (), "src"); + gst_element_add_pad (GST_ELEMENT (videoflip), videoflip->srcpad); + gst_pad_set_link_function (videoflip->srcpad, gst_videoflip_src_link); //gst_pad_set_getcaps_function(videoflip->srcpad,gst_videoflip_getcaps); videoflip->inited = FALSE; @@ -298,7 +303,7 @@ gst_videoflip_init (GstVideoflip *videoflip) static void -gst_videoflip_chain (GstPad *pad, GstData *_data) +gst_videoflip_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstVideoflip *videoflip; @@ -315,54 +320,54 @@ gst_videoflip_chain (GstPad *pad, GstData *_data) videoflip = GST_VIDEOFLIP (gst_pad_get_parent (pad)); g_return_if_fail (videoflip->inited); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - if(videoflip->passthru){ - gst_pad_push(videoflip->srcpad, GST_DATA (buf)); + if (videoflip->passthru) { + gst_pad_push (videoflip->srcpad, GST_DATA (buf)); return; } - GST_DEBUG ("gst_videoflip_chain: got buffer of %ld bytes in '%s'",size, - GST_OBJECT_NAME (videoflip)); - - GST_DEBUG ("size=%ld from=%dx%d to=%dx%d fromsize=%ld (should be %d) tosize=%d", - size, - videoflip->from_width, videoflip->from_height, - videoflip->to_width, videoflip->to_height, - size, videoflip->from_buf_size, - videoflip->to_buf_size); + GST_DEBUG ("gst_videoflip_chain: got buffer of %ld bytes in '%s'", size, + GST_OBJECT_NAME (videoflip)); + + GST_DEBUG + ("size=%ld from=%dx%d to=%dx%d fromsize=%ld (should be %d) tosize=%d", + size, videoflip->from_width, videoflip->from_height, videoflip->to_width, + videoflip->to_height, size, videoflip->from_buf_size, + videoflip->to_buf_size); g_return_if_fail (size == videoflip->from_buf_size); - outbuf = gst_buffer_new(); + outbuf = gst_buffer_new (); /* FIXME: handle bufferpools */ - GST_BUFFER_SIZE(outbuf) = videoflip->to_buf_size; - GST_BUFFER_DATA(outbuf) = g_malloc (videoflip->to_buf_size); - GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf); + GST_BUFFER_SIZE (outbuf) = videoflip->to_buf_size; + GST_BUFFER_DATA (outbuf) = g_malloc (videoflip->to_buf_size); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - g_return_if_fail(videoflip->format); - GST_DEBUG ("format %s",videoflip->format->fourcc); - g_return_if_fail(videoflip->format->scale); + g_return_if_fail (videoflip->format); + GST_DEBUG ("format %s", videoflip->format->fourcc); + g_return_if_fail (videoflip->format->scale); - videoflip->format->scale(videoflip, GST_BUFFER_DATA(outbuf), data); + videoflip->format->scale (videoflip, GST_BUFFER_DATA (outbuf), data); - GST_DEBUG ("gst_videoflip_chain: pushing buffer of %d bytes in '%s'",GST_BUFFER_SIZE(outbuf), - GST_OBJECT_NAME (videoflip)); + GST_DEBUG ("gst_videoflip_chain: pushing buffer of %d bytes in '%s'", + GST_BUFFER_SIZE (outbuf), GST_OBJECT_NAME (videoflip)); - gst_pad_push(videoflip->srcpad, GST_DATA (outbuf)); + gst_pad_push (videoflip->srcpad, GST_DATA (outbuf)); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_videoflip_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideoflip *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFLIP(object)); - src = GST_VIDEOFLIP(object); + g_return_if_fail (GST_IS_VIDEOFLIP (object)); + src = GST_VIDEOFLIP (object); GST_DEBUG ("gst_videoflip_set_property"); switch (prop_id) { @@ -375,13 +380,14 @@ gst_videoflip_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_videoflip_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideoflip *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_VIDEOFLIP(object)); - src = GST_VIDEOFLIP(object); + g_return_if_fail (GST_IS_VIDEOFLIP (object)); + src = GST_VIDEOFLIP (object); switch (prop_id) { case ARG_METHOD: @@ -395,19 +401,13 @@ gst_videoflip_get_property (GObject *object, guint prop_id, GValue *value, GPara static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "videoflip", GST_RANK_NONE, GST_TYPE_VIDEOFLIP); + return gst_element_register (plugin, "videoflip", GST_RANK_NONE, + GST_TYPE_VIDEOFLIP); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videoflip", - "Resizes video", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videoflip", + "Resizes video", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/videoflip/gstvideoflip.h b/gst/videoflip/gstvideoflip.h index b14b0bd3..4d28ac66 100644 --- a/gst/videoflip/gstvideoflip.h +++ b/gst/videoflip/gstvideoflip.h @@ -25,9 +25,8 @@ #include -G_BEGIN_DECLS - -typedef enum { +G_BEGIN_DECLS typedef enum +{ GST_VIDEOFLIP_METHOD_IDENTITY, GST_VIDEOFLIP_METHOD_90R, GST_VIDEOFLIP_METHOD_180, @@ -53,10 +52,11 @@ typedef enum { typedef struct _GstVideoflip GstVideoflip; typedef struct _GstVideoflipClass GstVideoflipClass; -struct _GstVideoflip { +struct _GstVideoflip +{ GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; gboolean force_size; gint forced_width; @@ -78,16 +78,16 @@ struct _GstVideoflip { gint to_buf_size; }; -struct _GstVideoflipClass { +struct _GstVideoflipClass +{ GstElementClass parent_class; }; -GType gst_videoflip_get_type(void); +GType gst_videoflip_get_type (void); + +void gst_videoflip_setup (GstVideoflip *); -void gst_videoflip_setup(GstVideoflip *); #define gst_videoflip_scale(scale, src, dest) (scale)->scale_cc((scale), (src), (dest)) G_END_DECLS - #endif /* __GST_VIDEOFLIP_H__ */ - diff --git a/gst/videoflip/videoflip.c b/gst/videoflip/videoflip.c index 7956165d..16db2102 100644 --- a/gst/videoflip/videoflip.c +++ b/gst/videoflip/videoflip.c @@ -30,40 +30,44 @@ #include "gstvideoflip.h" -static void gst_videoflip_planar411 (GstVideoflip *scale, unsigned char *dest, unsigned char *src); +static void gst_videoflip_planar411 (GstVideoflip * scale, unsigned char *dest, + unsigned char *src); -static void gst_videoflip_flip(GstVideoflip *videoflip, unsigned char *dest, +static void gst_videoflip_flip (GstVideoflip * videoflip, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh); struct videoflip_format_struct videoflip_formats[] = { - /* planar */ - { "YV12", 12, gst_videoflip_planar411, }, - { "I420", 12, gst_videoflip_planar411, }, + /* planar */ + {"YV12", 12, gst_videoflip_planar411,}, + {"I420", 12, gst_videoflip_planar411,}, }; -int videoflip_n_formats = sizeof(videoflip_formats)/sizeof(videoflip_formats[0]); +int videoflip_n_formats = + sizeof (videoflip_formats) / sizeof (videoflip_formats[0]); GstStructure * -videoflip_get_cap(struct videoflip_format_struct *format) +videoflip_get_cap (struct videoflip_format_struct *format) { unsigned int fourcc; GstStructure *structure; - if(format->scale==NULL) + if (format->scale == NULL) return NULL; - fourcc = GST_MAKE_FOURCC(format->fourcc[0],format->fourcc[1],format->fourcc[2],format->fourcc[3]); + fourcc = + GST_MAKE_FOURCC (format->fourcc[0], format->fourcc[1], format->fourcc[2], + format->fourcc[3]); - if(format->bpp){ - structure = gst_structure_new("video/x-raw-rgb", + if (format->bpp) { + structure = gst_structure_new ("video/x-raw-rgb", "depth", G_TYPE_INT, format->bpp, "bpp", G_TYPE_INT, format->depth, "endianness", G_TYPE_INT, format->endianness, "red_mask", G_TYPE_INT, format->red_mask, "green_mask", G_TYPE_INT, format->green_mask, "blue_mask", G_TYPE_INT, format->blue_mask, NULL); - }else{ - structure = gst_structure_new("video/x-raw-yuv", + } else { + structure = gst_structure_new ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, fourcc, NULL); } @@ -71,24 +75,24 @@ videoflip_get_cap(struct videoflip_format_struct *format) } struct videoflip_format_struct * -videoflip_find_by_caps(const GstCaps *caps) +videoflip_find_by_caps (const GstCaps * caps) { int i; GST_DEBUG ("finding %p", caps); - g_return_val_if_fail(caps != NULL, NULL); + g_return_val_if_fail (caps != NULL, NULL); - for (i = 0; i < videoflip_n_formats; i++){ + for (i = 0; i < videoflip_n_formats; i++) { GstCaps *c; c = gst_caps_new_full (videoflip_get_cap (videoflip_formats + i), NULL); - if(c){ - if(gst_caps_is_always_compatible(caps, c)){ - gst_caps_free(c); - return videoflip_formats + i; + if (c) { + if (gst_caps_is_always_compatible (caps, c)) { + gst_caps_free (c); + return videoflip_formats + i; } - gst_caps_free(c); + gst_caps_free (c); } } @@ -96,13 +100,13 @@ videoflip_find_by_caps(const GstCaps *caps) } void -gst_videoflip_setup (GstVideoflip *videoflip) +gst_videoflip_setup (GstVideoflip * videoflip) { - if(videoflip->from_width==0 || videoflip->from_height==0){ + if (videoflip->from_width == 0 || videoflip->from_height == 0) { return; } - switch(videoflip->method){ + switch (videoflip->method) { case GST_VIDEOFLIP_METHOD_90R: case GST_VIDEOFLIP_METHOD_90L: case GST_VIDEOFLIP_METHOD_TRANS: @@ -123,11 +127,11 @@ gst_videoflip_setup (GstVideoflip *videoflip) } GST_DEBUG ("format=%p \"%s\" from %dx%d to %dx%d", - videoflip->format, videoflip->format->fourcc, - videoflip->from_width, videoflip->from_height, - videoflip->to_width, videoflip->to_height); + videoflip->format, videoflip->format->fourcc, + videoflip->from_width, videoflip->from_height, + videoflip->to_width, videoflip->to_height); - if(videoflip->method == GST_VIDEOFLIP_METHOD_IDENTITY){ + if (videoflip->method == GST_VIDEOFLIP_METHOD_IDENTITY) { GST_DEBUG ("videoflip: using passthru"); videoflip->passthru = TRUE; videoflip->inited = TRUE; @@ -135,15 +139,16 @@ gst_videoflip_setup (GstVideoflip *videoflip) } videoflip->from_buf_size = (videoflip->from_width * videoflip->from_height - * videoflip->format->depth) / 8; + * videoflip->format->depth) / 8; videoflip->to_buf_size = (videoflip->to_width * videoflip->to_height - * videoflip->format->depth) / 8; + * videoflip->format->depth) / 8; videoflip->inited = TRUE; } static void -gst_videoflip_planar411 (GstVideoflip *scale, unsigned char *dest, unsigned char *src) +gst_videoflip_planar411 (GstVideoflip * scale, unsigned char *dest, + unsigned char *src) { int sw = scale->from_width; int sh = scale->from_height; @@ -152,77 +157,77 @@ gst_videoflip_planar411 (GstVideoflip *scale, unsigned char *dest, unsigned char GST_DEBUG ("videoflip: scaling planar 4:1:1 %dx%d to %dx%d", sw, sh, dw, dh); - gst_videoflip_flip(scale, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (scale, dest, src, sw, sh, dw, dh); - src += sw*sh; - dest += dw*dh; + src += sw * sh; + dest += dw * dh; - dh = dh>>1; - dw = dw>>1; - sh = sh>>1; - sw = sw>>1; + dh = dh >> 1; + dw = dw >> 1; + sh = sh >> 1; + sw = sw >> 1; - gst_videoflip_flip(scale, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (scale, dest, src, sw, sh, dw, dh); - src += sw*sh; - dest += dw*dh; + src += sw * sh; + dest += dw * dh; - gst_videoflip_flip(scale, dest, src, sw, sh, dw, dh); + gst_videoflip_flip (scale, dest, src, sw, sh, dw, dh); } static void -gst_videoflip_flip(GstVideoflip *videoflip, unsigned char *dest, +gst_videoflip_flip (GstVideoflip * videoflip, unsigned char *dest, unsigned char *src, int sw, int sh, int dw, int dh) { - int x,y; + int x, y; - switch(videoflip->method){ + switch (videoflip->method) { case GST_VIDEOFLIP_METHOD_90R: - for(y=0;y #include -static void gst_wavenc_base_init (gpointer g_class); -static void gst_wavenc_class_init (GstWavEncClass *klass); -static void gst_wavenc_init (GstWavEnc *wavenc); -static void gst_wavenc_chain (GstPad *pad, GstData *_data); +static void gst_wavenc_base_init (gpointer g_class); +static void gst_wavenc_class_init (GstWavEncClass * klass); +static void gst_wavenc_init (GstWavEnc * wavenc); +static void gst_wavenc_chain (GstPad * pad, GstData * _data); #define WAVE_FORMAT_PCM 0x0001 @@ -42,65 +42,63 @@ static void gst_wavenc_chain (GstPad *pad, GstData *_data); #define WRITE_U16(buf, x) *(buf) = (unsigned char) (x&0xff);\ *((buf)+1) = (unsigned char)((x>>8)&0xff); -struct riff_struct { - guint8 id[4]; /* RIFF */ - guint32 len; - guint8 wav_id[4]; /* WAVE */ +struct riff_struct +{ + guint8 id[4]; /* RIFF */ + guint32 len; + guint8 wav_id[4]; /* WAVE */ }; -struct chunk_struct { - guint8 id[4]; - guint32 len; +struct chunk_struct +{ + guint8 id[4]; + guint32 len; }; -struct common_struct { - guint16 wFormatTag; - guint16 wChannels; - guint32 dwSamplesPerSec; - guint32 dwAvgBytesPerSec; - guint16 wBlockAlign; - guint16 wBitsPerSample; /* Only for PCM */ +struct common_struct +{ + guint16 wFormatTag; + guint16 wChannels; + guint32 dwSamplesPerSec; + guint32 dwAvgBytesPerSec; + guint16 wBlockAlign; + guint16 wBitsPerSample; /* Only for PCM */ }; -struct wave_header { - struct riff_struct riff; - struct chunk_struct format; - struct common_struct common; - struct chunk_struct data; +struct wave_header +{ + struct riff_struct riff; + struct chunk_struct format; + struct common_struct common; + struct chunk_struct data; }; -static GstElementDetails gst_wavenc_details = GST_ELEMENT_DETAILS ( - "WAV encoder", - "Codec/Encoder/Audio", - "Encode raw audio into WAV", - "Iain Holmes " -); - -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 1, MAX ], " - "channels = (int) [ 1, MAX ], " - "endianness = (int) LITTLE_ENDIAN, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "signed = (boolean) true" - ) -); - -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-wav") -); - -enum { - PROP_0, +static GstElementDetails gst_wavenc_details = +GST_ELEMENT_DETAILS ("WAV encoder", + "Codec/Encoder/Audio", + "Encode raw audio into WAV", + "Iain Holmes "); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) LITTLE_ENDIAN, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " "signed = (boolean) true") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wav") + ); + +enum +{ + PROP_0, }; static GstElementClass *parent_class = NULL; @@ -112,14 +110,14 @@ gst_wavenc_get_type (void) if (type == 0) { static const GTypeInfo info = { - sizeof (GstWavEncClass), - gst_wavenc_base_init, + sizeof (GstWavEncClass), + gst_wavenc_base_init, + NULL, + (GClassInitFunc) gst_wavenc_class_init, NULL, - (GClassInitFunc) gst_wavenc_class_init, - NULL, NULL, - sizeof (GstWavEnc), - 0, + sizeof (GstWavEnc), + 0, (GInstanceInitFunc) gst_wavenc_init }; @@ -130,10 +128,10 @@ gst_wavenc_get_type (void) } static GstElementStateReturn -gst_wavenc_change_state (GstElement *element) +gst_wavenc_change_state (GstElement * element) { GstWavEnc *wavenc = GST_WAVENC (element); - + switch (GST_STATE_TRANSITION (element)) { case GST_STATE_PAUSED_TO_READY: wavenc->setup = FALSE; @@ -151,19 +149,17 @@ gst_wavenc_change_state (GstElement *element) } static void -set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { - GstWavEnc *enc; - - enc = GST_WAVENC (object); - - switch (prop_id) { - default: - break; - } + GstWavEnc *enc; + + enc = GST_WAVENC (object); + + switch (prop_id) { + default: + break; + } } static void @@ -172,32 +168,32 @@ gst_wavenc_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details (element_class, &gst_wavenc_details); - + 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)); } static void -gst_wavenc_class_init (GstWavEncClass *klass) +gst_wavenc_class_init (GstWavEncClass * klass) { GstElementClass *element_class; GObjectClass *object_class; - + element_class = (GstElementClass *) klass; object_class = (GObjectClass *) klass; object_class->set_property = set_property; - + element_class->change_state = gst_wavenc_change_state; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } static gboolean -gst_wavenc_setup (GstWavEnc *wavenc) +gst_wavenc_setup (GstWavEnc * wavenc) { struct wave_header wave; - gint size = 0x7fffffff; /* Use a bogus size initially */ + gint size = 0x7fffffff; /* Use a bogus size initially */ wave.common.wChannels = wavenc->channels; wave.common.wBitsPerSample = wavenc->bits; @@ -214,8 +210,11 @@ gst_wavenc_setup (GstWavEnc *wavenc) wave.format.len = 16; wave.common.wFormatTag = WAVE_FORMAT_PCM; - wave.common.dwAvgBytesPerSec = wave.common.wChannels * wave.common.dwSamplesPerSec * (wave.common.wBitsPerSample >> 3); - wave.common.wBlockAlign = wave.common.wChannels * (wave.common.wBitsPerSample >> 3); + wave.common.dwAvgBytesPerSec = + wave.common.wChannels * wave.common.dwSamplesPerSec * + (wave.common.wBitsPerSample >> 3); + wave.common.wBlockAlign = + wave.common.wChannels * (wave.common.wBitsPerSample >> 3); strncpy (wave.data.id, "data", 4); wave.data.len = size - 44; @@ -239,7 +238,7 @@ gst_wavenc_setup (GstWavEnc *wavenc) } static GstPadLinkReturn -gst_wavenc_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_wavenc_sinkconnect (GstPad * pad, const GstCaps * caps) { GstWavEnc *wavenc; GstStructure *structure; @@ -248,9 +247,9 @@ gst_wavenc_sinkconnect (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "channels", &wavenc->channels); - gst_structure_get_int (structure, "rate", &wavenc->rate); - gst_structure_get_int (structure, "depth", &wavenc->bits); + gst_structure_get_int (structure, "channels", &wavenc->channels); + gst_structure_get_int (structure, "rate", &wavenc->rate); + gst_structure_get_int (structure, "depth", &wavenc->bits); gst_wavenc_setup (wavenc); @@ -262,324 +261,328 @@ gst_wavenc_sinkconnect (GstPad *pad, const GstCaps *caps) } static void -gst_wavenc_stop_file (GstWavEnc *wavenc) +gst_wavenc_stop_file (GstWavEnc * wavenc) { GstEvent *event; GstBuffer *outbuf; - - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, 0); + + event = gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_SET, 0); gst_pad_send_event (GST_PAD_PEER (wavenc->srcpad), event); - + outbuf = gst_buffer_new_and_alloc (WAV_HEADER_LEN); WRITE_U32 (wavenc->header + 4, wavenc->length); memcpy (GST_BUFFER_DATA (outbuf), wavenc->header, WAV_HEADER_LEN); - + gst_pad_push (wavenc->srcpad, GST_DATA (outbuf)); } static void -gst_wavenc_init (GstWavEnc *wavenc) +gst_wavenc_init (GstWavEnc * wavenc) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (wavenc); - wavenc->sinkpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "sink"), "sink"); + wavenc->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->sinkpad); gst_pad_set_chain_function (wavenc->sinkpad, gst_wavenc_chain); gst_pad_set_link_function (wavenc->sinkpad, gst_wavenc_sinkconnect); - - wavenc->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "src"), "src"); + + wavenc->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->srcpad); wavenc->setup = FALSE; wavenc->flush_header = TRUE; - + GST_FLAG_SET (wavenc, GST_ELEMENT_EVENT_AWARE); } -struct _maps { - guint32 id; - char *name; +struct _maps +{ + guint32 id; + char *name; } maps[] = { - { GST_RIFF_INFO_IARL, "Location" }, - { GST_RIFF_INFO_IART, "Artist" }, - { GST_RIFF_INFO_ICMS, "Commissioner" }, - { GST_RIFF_INFO_ICMT, "Comment" }, - { GST_RIFF_INFO_ICOP, "Copyright" }, - { GST_RIFF_INFO_ICRD, "Creation Date" }, - { GST_RIFF_INFO_IENG, "Engineer" }, - { GST_RIFF_INFO_IGNR, "Genre" }, - { GST_RIFF_INFO_IKEY, "Keywords" }, - { GST_RIFF_INFO_INAM, "Title" }, /* Name */ - { GST_RIFF_INFO_IPRD, "Product" }, - { GST_RIFF_INFO_ISBJ, "Subject" }, - { GST_RIFF_INFO_ISFT, "Software" }, - { GST_RIFF_INFO_ITCH, "Technician" }, - { 0, NULL } + { + GST_RIFF_INFO_IARL, "Location"}, { + GST_RIFF_INFO_IART, "Artist"}, { + GST_RIFF_INFO_ICMS, "Commissioner"}, { + GST_RIFF_INFO_ICMT, "Comment"}, { + GST_RIFF_INFO_ICOP, "Copyright"}, { + GST_RIFF_INFO_ICRD, "Creation Date"}, { + GST_RIFF_INFO_IENG, "Engineer"}, { + GST_RIFF_INFO_IGNR, "Genre"}, { + GST_RIFF_INFO_IKEY, "Keywords"}, { + GST_RIFF_INFO_INAM, "Title"}, /* Name */ + { + GST_RIFF_INFO_IPRD, "Product"}, { + GST_RIFF_INFO_ISBJ, "Subject"}, { + GST_RIFF_INFO_ISFT, "Software"}, { + GST_RIFF_INFO_ITCH, "Technician"}, { + 0, NULL} }; #if 0 static guint32 get_id_from_name (const char *name) { - int i; + int i; - for (i = 0; maps[i].name; i++) { - if (strcasecmp (maps[i].name, name) == 0) { - return maps[i].id; - } - } + for (i = 0; maps[i].name; i++) { + if (strcasecmp (maps[i].name, name) == 0) { + return maps[i].id; + } + } - return 0; + return 0; } static void -write_metadata (GstWavEnc *wavenc) +write_metadata (GstWavEnc * wavenc) { - GString *info_str; - GList *props; - int total = 4; - gboolean need_to_write = FALSE; - - info_str = g_string_new ("LIST INFO"); - - for (props = wavenc->metadata->properties->properties; props; props = props->next) { - GstPropsEntry *entry = props->data; - const char *name; - guint32 id; - - name = gst_props_entry_get_name (entry); - id = get_id_from_name (name); - if (id != 0) { - const char *text; - char *tmp; - int len, req, i; - - need_to_write = TRUE; /* We've got at least one entry */ - - gst_props_entry_get_string (entry, &text); - len = strlen (text) + 1; /* The length in the file includes the \0 */ - - tmp = g_strdup_printf (GST_FOURCC_FORMAT "%d%s", GST_FOURCC_ARGS (id), - GUINT32_TO_LE (len), text); - g_string_append (info_str, tmp); - g_free (tmp); - - /* Check that we end on an even boundary */ - req = ((len + 8) + 1) & ~1; - for (i = 0; i < req - len; i++) { - g_string_append_printf (info_str, "%c", 0); - } - - total += req; - } - } - - if (need_to_write) { - GstBuffer *buf; - /* Now we've got all the strings together, we can write our length in */ - info_str->str[4] = GUINT32_TO_LE (total); - - buf = gst_buffer_new (); - gst_buffer_set_data (buf, info_str->str, info_str->len); - - gst_pad_push (wavenc->srcpad, GST_DATA (buf)); - g_string_free (info_str, FALSE); - } + GString *info_str; + GList *props; + int total = 4; + gboolean need_to_write = FALSE; + + info_str = g_string_new ("LIST INFO"); + + for (props = wavenc->metadata->properties->properties; props; + props = props->next) { + GstPropsEntry *entry = props->data; + const char *name; + guint32 id; + + name = gst_props_entry_get_name (entry); + id = get_id_from_name (name); + if (id != 0) { + const char *text; + char *tmp; + int len, req, i; + + need_to_write = TRUE; /* We've got at least one entry */ + + gst_props_entry_get_string (entry, &text); + len = strlen (text) + 1; /* The length in the file includes the \0 */ + + tmp = g_strdup_printf (GST_FOURCC_FORMAT "%d%s", GST_FOURCC_ARGS (id), + GUINT32_TO_LE (len), text); + g_string_append (info_str, tmp); + g_free (tmp); + + /* Check that we end on an even boundary */ + req = ((len + 8) + 1) & ~1; + for (i = 0; i < req - len; i++) { + g_string_append_printf (info_str, "%c", 0); + } + + total += req; + } + } + + if (need_to_write) { + GstBuffer *buf; + + /* Now we've got all the strings together, we can write our length in */ + info_str->str[4] = GUINT32_TO_LE (total); + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, info_str->str, info_str->len); + + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (info_str, FALSE); + } } static void -write_cues (GstWavEnc *wavenc) +write_cues (GstWavEnc * wavenc) { - GString *cue_string, *point_string; - GstBuffer *buf; - GList *cue_list, *c; - int num_cues, total = 4; - - if (gst_props_get (wavenc->metadata->properties, - "cues", &cue_list, - NULL) == FALSE) { - /* No cues, move along please, nothing to see here */ - return; - } - - /* Space for 'cue ', chunk size and number of cuepoints */ - cue_string = g_string_new ("cue "); + GString *cue_string, *point_string; + GstBuffer *buf; + GList *cue_list, *c; + int num_cues, total = 4; + + if (gst_props_get (wavenc->metadata->properties, + "cues", &cue_list, NULL) == FALSE) { + /* No cues, move along please, nothing to see here */ + return; + } + + /* Space for 'cue ', chunk size and number of cuepoints */ + cue_string = g_string_new ("cue "); #define CUEPOINT_SIZE 24 - point_string = g_string_sized_new (CUEPOINT_SIZE); - - for (c = cue_list, num_cues = 0; c; c = c->next, num_cues++) { - GstCaps *cue_caps = c->data; - guint32 pos; - - gst_props_get (cue_caps->properties, "position", &pos, NULL); - - point_string->str[0] = GUINT32_TO_LE (num_cues + 1); - point_string->str[4] = GUINT32_TO_LE (0); - /* Fixme: There is probably a macro for this */ - point_string->str[8] = 'd'; - point_string->str[9] = 'a'; - point_string->str[10] = 't'; - point_string->str[11] = 'a'; - point_string->str[12] = GUINT32_TO_LE (0); - point_string->str[16] = GUINT32_TO_LE (0); - point_string->str[20] = GUINT32_TO_LE (pos); - - total += CUEPOINT_SIZE; - } - - /* Set the length and chunk size */ - cue_string->str[4] = GUINT32_TO_LE (total); - cue_string->str[8] = GUINT32_TO_LE (num_cues); - /* Stick the cue points on the end */ - g_string_append (cue_string, point_string->str); - g_string_free (point_string, TRUE); - - buf = gst_buffer_new (); - gst_buffer_set_data (buf, cue_string->str, cue_string->len); - - gst_pad_push (wavenc->srcpad, GST_DATA (buf)); - g_string_free (cue_string, FALSE); + point_string = g_string_sized_new (CUEPOINT_SIZE); + + for (c = cue_list, num_cues = 0; c; c = c->next, num_cues++) { + GstCaps *cue_caps = c->data; + guint32 pos; + + gst_props_get (cue_caps->properties, "position", &pos, NULL); + + point_string->str[0] = GUINT32_TO_LE (num_cues + 1); + point_string->str[4] = GUINT32_TO_LE (0); + /* Fixme: There is probably a macro for this */ + point_string->str[8] = 'd'; + point_string->str[9] = 'a'; + point_string->str[10] = 't'; + point_string->str[11] = 'a'; + point_string->str[12] = GUINT32_TO_LE (0); + point_string->str[16] = GUINT32_TO_LE (0); + point_string->str[20] = GUINT32_TO_LE (pos); + + total += CUEPOINT_SIZE; + } + + /* Set the length and chunk size */ + cue_string->str[4] = GUINT32_TO_LE (total); + cue_string->str[8] = GUINT32_TO_LE (num_cues); + /* Stick the cue points on the end */ + g_string_append (cue_string, point_string->str); + g_string_free (point_string, TRUE); + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, cue_string->str, cue_string->len); + + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (cue_string, FALSE); } static void -write_labels (GstWavEnc *wavenc) +write_labels (GstWavEnc * wavenc) { - GstBuffer *buf; - GString *info_str; - int total = 4; - GList *caps; - - info_str = g_string_new ("LIST adtl"); - if (gst_props_get (wavenc->metadata->properties, "ltxts", &caps, NULL)) { - GList *p; - int i; - - for (p = caps, i = 1; p; p = p->next, i++) { - GstCaps *ltxt_caps = p->data; - GString *ltxt; - char *label = NULL; - int len, req, j; - - gst_props_get (ltxt_caps->properties, "name", &label, NULL); - len = strlen (label); + GstBuffer *buf; + GString *info_str; + int total = 4; + GList *caps; + + info_str = g_string_new ("LIST adtl"); + if (gst_props_get (wavenc->metadata->properties, "ltxts", &caps, NULL)) { + GList *p; + int i; + + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *ltxt_caps = p->data; + GString *ltxt; + char *label = NULL; + int len, req, j; + + gst_props_get (ltxt_caps->properties, "name", &label, NULL); + len = strlen (label); #define LTXT_SIZE 28 - ltxt = g_string_new ("ltxt "); - ltxt->str[8] = GUINT32_TO_LE (i); /* Identifier */ - ltxt->str[12] = GUINT32_TO_LE (0); /* Sample Length */ - ltxt->str[16] = GUINT32_TO_LE (0); /* FIXME: Don't save the purpose yet */ - ltxt->str[20] = GUINT16_TO_LE (0); /* Country */ - ltxt->str[22] = GUINT16_TO_LE (0); /* Language */ - ltxt->str[24] = GUINT16_TO_LE (0); /* Dialect */ - ltxt->str[26] = GUINT16_TO_LE (0); /* Code Page */ - g_string_append (ltxt, label); - g_free (label); - - len += LTXT_SIZE; - - ltxt->str[4] = GUINT32_TO_LE (len); - - /* Check that we end on an even boundary */ - req = ((len + 8) + 1) & ~1; - for (j = 0; j < req - len; j++) { - g_string_append_printf (ltxt, "%c", 0); - } - - total += req; - - g_string_append (info_str, ltxt->str); - g_string_free (ltxt, TRUE); - } - } - - if (gst_props_get (wavenc->metadata->properties, "labels", &caps, NULL)) { - GList *p; - int i; - - for (p = caps, i = 1; p; p = p->next, i++) { - GstCaps *labl_caps = p->data; - GString *labl; - char *label = NULL; - int len, req, j; - - gst_props_get (labl_caps->properties, "name", &label, NULL); - len = strlen (label); + ltxt = g_string_new ("ltxt "); + ltxt->str[8] = GUINT32_TO_LE (i); /* Identifier */ + ltxt->str[12] = GUINT32_TO_LE (0); /* Sample Length */ + ltxt->str[16] = GUINT32_TO_LE (0); /* FIXME: Don't save the purpose yet */ + ltxt->str[20] = GUINT16_TO_LE (0); /* Country */ + ltxt->str[22] = GUINT16_TO_LE (0); /* Language */ + ltxt->str[24] = GUINT16_TO_LE (0); /* Dialect */ + ltxt->str[26] = GUINT16_TO_LE (0); /* Code Page */ + g_string_append (ltxt, label); + g_free (label); + + len += LTXT_SIZE; + + ltxt->str[4] = GUINT32_TO_LE (len); + + /* Check that we end on an even boundary */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (ltxt, "%c", 0); + } + + total += req; + + g_string_append (info_str, ltxt->str); + g_string_free (ltxt, TRUE); + } + } + + if (gst_props_get (wavenc->metadata->properties, "labels", &caps, NULL)) { + GList *p; + int i; + + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *labl_caps = p->data; + GString *labl; + char *label = NULL; + int len, req, j; + + gst_props_get (labl_caps->properties, "name", &label, NULL); + len = strlen (label); #define LABL_SIZE 4 - labl = g_string_new ("labl "); - labl->str[8] = GUINT32_TO_LE (i); - g_string_append (labl, label); - g_free (label); - - len += LABL_SIZE; + labl = g_string_new ("labl "); + labl->str[8] = GUINT32_TO_LE (i); + g_string_append (labl, label); + g_free (label); - labl->str[4] = GUINT32_TO_LE (len); + len += LABL_SIZE; - /* Check our size */ - req = ((len + 8) + 1) & ~1; - for (j = 0; j < req - len; j++) { - g_string_append_printf (labl, "%c", 0); - } + labl->str[4] = GUINT32_TO_LE (len); - total += req; + /* Check our size */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (labl, "%c", 0); + } - g_string_append (info_str, labl->str); - g_string_free (labl, TRUE); - } - } + total += req; - if (gst_props_get (wavenc->metadata->properties, "notes", &caps, NULL)) { - GList *p; - int i; + g_string_append (info_str, labl->str); + g_string_free (labl, TRUE); + } + } + + if (gst_props_get (wavenc->metadata->properties, "notes", &caps, NULL)) { + GList *p; + int i; - for (p = caps, i = 1; p; p = p->next, i++) { - GstCaps *note_caps = p->data; - GString *note; - char *label = NULL; - int len, req, j; + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *note_caps = p->data; + GString *note; + char *label = NULL; + int len, req, j; - gst_props_get (note_caps->properties, "name", &label, NULL); - len = strlen (label); + gst_props_get (note_caps->properties, "name", &label, NULL); + len = strlen (label); #define NOTE_SIZE 4 - note = g_string_new ("note "); - note->str[8] = GUINT32_TO_LE (i); - g_string_append (note, label); - g_free (label); + note = g_string_new ("note "); + note->str[8] = GUINT32_TO_LE (i); + g_string_append (note, label); + g_free (label); - len += NOTE_SIZE; + len += NOTE_SIZE; - note->str[4] = GUINT32_TO_LE (len); + note->str[4] = GUINT32_TO_LE (len); - /* Size check */ - req = ((len + 8) + 1) & ~1; - for (j = 0; j < req - len; j++) { - g_string_append_printf (note, "%c", 0); - } + /* Size check */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (note, "%c", 0); + } - total += req; + total += req; - g_string_append (info_str, note->str); - g_string_free (note, TRUE); - } - } + g_string_append (info_str, note->str); + g_string_free (note, TRUE); + } + } - info_str->str[4] = GUINT32_TO_LE (total); + info_str->str[4] = GUINT32_TO_LE (total); - buf = gst_buffer_new (); - gst_buffer_set_data (buf, info_str->str, info_str->len); + buf = gst_buffer_new (); + gst_buffer_set_data (buf, info_str->str, info_str->len); - gst_pad_push (wavenc->srcpad, GST_DATA (buf)); - g_string_free (info_str, FALSE); + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (info_str, FALSE); } #endif static void -gst_wavenc_chain (GstPad *pad, - GstData *_data) +gst_wavenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstWavEnc *wavenc; @@ -588,41 +591,41 @@ gst_wavenc_chain (GstPad *pad, if (!wavenc->setup) { gst_buffer_unref (buf); - GST_ELEMENT_ERROR (wavenc, CORE, NEGOTIATION, (NULL), ("encoder not initialised (input is not audio?)")); + GST_ELEMENT_ERROR (wavenc, CORE, NEGOTIATION, (NULL), + ("encoder not initialised (input is not audio?)")); return; } - if (GST_IS_EVENT (buf)) { - if (GST_EVENT_TYPE (buf) == GST_EVENT_EOS) { - wavenc->pad_eos = TRUE; + if (GST_IS_EVENT (buf)) { + if (GST_EVENT_TYPE (buf) == GST_EVENT_EOS) { + wavenc->pad_eos = TRUE; #if 0 - /* Write our metadata if we have any */ - if (wavenc->metadata) { - write_metadata (wavenc); - write_cues (wavenc); - write_labels (wavenc); - } + /* Write our metadata if we have any */ + if (wavenc->metadata) { + write_metadata (wavenc); + write_cues (wavenc); + write_labels (wavenc); + } #endif - - gst_wavenc_stop_file (wavenc); - gst_pad_push (wavenc->srcpad, - GST_DATA (gst_event_new (GST_EVENT_EOS))); - gst_element_set_eos (GST_ELEMENT (wavenc)); - } else { - gst_pad_event_default (wavenc->srcpad, GST_EVENT (buf)); - } - return; - } + + gst_wavenc_stop_file (wavenc); + gst_pad_push (wavenc->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); + gst_element_set_eos (GST_ELEMENT (wavenc)); + } else { + gst_pad_event_default (wavenc->srcpad, GST_EVENT (buf)); + } + return; + } if (GST_PAD_IS_USABLE (wavenc->srcpad)) { if (wavenc->flush_header) { GstBuffer *outbuf; - + outbuf = gst_buffer_new_and_alloc (WAV_HEADER_LEN); memcpy (GST_BUFFER_DATA (outbuf), wavenc->header, WAV_HEADER_LEN); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - + gst_pad_push (wavenc->srcpad, GST_DATA (outbuf)); wavenc->flush_header = FALSE; } @@ -633,20 +636,14 @@ gst_wavenc_chain (GstPad *pad, } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "wavenc", GST_RANK_NONE, GST_TYPE_WAVENC); + return gst_element_register (plugin, "wavenc", GST_RANK_NONE, + GST_TYPE_WAVENC); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "wavenc", - "Encode raw audio into WAV", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "wavenc", + "Encode raw audio into WAV", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/wavenc/gstwavenc.h b/gst/wavenc/gstwavenc.h index 8810001a..7711a25d 100644 --- a/gst/wavenc/gstwavenc.h +++ b/gst/wavenc/gstwavenc.h @@ -25,7 +25,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_WAVENC \ (gst_wavenc_get_type()) #define GST_WAVENC(obj) \ @@ -36,17 +35,17 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVENC)) #define GST_IS_WAVENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVENC)) - typedef struct _GstWavEnc GstWavEnc; typedef struct _GstWavEncClass GstWavEncClass; #define WAV_HEADER_LEN 44 -struct _GstWavEnc { +struct _GstWavEnc +{ GstElement element; /* pads */ - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* useful audio data */ guint bits; @@ -54,15 +53,15 @@ struct _GstWavEnc { guint channels; guint width; guint32 length; - + gboolean setup, flush_header, pad_eos; guchar header[WAV_HEADER_LEN]; }; -struct _GstWavEncClass { +struct _GstWavEncClass +{ GstElementClass parent_class; }; G_END_DECLS - #endif /* __GST_ENC_H__ */ diff --git a/gst/wavenc/riff.h b/gst/wavenc/riff.h index 141ed1fa..bf18a1fe 100644 --- a/gst/wavenc/riff.h +++ b/gst/wavenc/riff.h @@ -24,11 +24,12 @@ #include -typedef enum { - GST_RIFF_OK = 0, +typedef enum +{ + GST_RIFF_OK = 0, GST_RIFF_ENOTRIFF = -1, - GST_RIFF_EINVAL = -2, - GST_RIFF_ENOMEM = -3 + GST_RIFF_EINVAL = -2, + GST_RIFF_ENOMEM = -3 } GstRiffReturn; #define MAKE_FOUR_CC(a,b,c,d) GST_MAKE_FOURCC(a,b,c,d) @@ -81,29 +82,29 @@ typedef enum { #define GST_RIFF_FCCH_MSVC MAKE_FOUR_CC('M','S','V','C') /* INFO types - see http://www.saettler.com/RIFFMCI/riffmci.html */ -#define GST_RIFF_INFO_IARL MAKE_FOUR_CC('I','A','R','L') /* location */ -#define GST_RIFF_INFO_IART MAKE_FOUR_CC('I','A','R','T') /* artist */ -#define GST_RIFF_INFO_ICMS MAKE_FOUR_CC('I','C','M','S') /* commissioned */ -#define GST_RIFF_INFO_ICMT MAKE_FOUR_CC('I','C','M','T') /* comment */ -#define GST_RIFF_INFO_ICOP MAKE_FOUR_CC('I','C','O','P') /* copyright */ -#define GST_RIFF_INFO_ICRD MAKE_FOUR_CC('I','C','R','D') /* creation date */ -#define GST_RIFF_INFO_ICRP MAKE_FOUR_CC('I','C','R','P') /* cropped */ -#define GST_RIFF_INFO_IDIM MAKE_FOUR_CC('I','D','I','M') /* dimensions */ -#define GST_RIFF_INFO_IDPI MAKE_FOUR_CC('I','D','P','I') /* dots-per-inch */ -#define GST_RIFF_INFO_IENG MAKE_FOUR_CC('I','E','N','G') /* engineer(s) */ -#define GST_RIFF_INFO_IGNR MAKE_FOUR_CC('I','G','N','R') /* genre */ -#define GST_RIFF_INFO_IKEY MAKE_FOUR_CC('I','K','E','Y') /* keywords */ -#define GST_RIFF_INFO_ILGT MAKE_FOUR_CC('I','L','G','T') /* lightness */ -#define GST_RIFF_INFO_IMED MAKE_FOUR_CC('I','M','E','D') /* medium */ -#define GST_RIFF_INFO_INAM MAKE_FOUR_CC('I','N','A','M') /* name */ -#define GST_RIFF_INFO_IPLT MAKE_FOUR_CC('I','P','L','T') /* palette setting */ -#define GST_RIFF_INFO_IPRD MAKE_FOUR_CC('I','P','R','D') /* product */ -#define GST_RIFF_INFO_ISBJ MAKE_FOUR_CC('I','S','B','J') /* subject */ -#define GST_RIFF_INFO_ISFT MAKE_FOUR_CC('I','S','F','T') /* software */ -#define GST_RIFF_INFO_ISHP MAKE_FOUR_CC('I','S','H','P') /* sharpness */ -#define GST_RIFF_INFO_ISRC MAKE_FOUR_CC('I','S','R','C') /* source */ -#define GST_RIFF_INFO_ISRF MAKE_FOUR_CC('I','S','R','F') /* source form */ -#define GST_RIFF_INFO_ITCH MAKE_FOUR_CC('I','T','C','H') /* technician(s) */ +#define GST_RIFF_INFO_IARL MAKE_FOUR_CC('I','A','R','L') /* location */ +#define GST_RIFF_INFO_IART MAKE_FOUR_CC('I','A','R','T') /* artist */ +#define GST_RIFF_INFO_ICMS MAKE_FOUR_CC('I','C','M','S') /* commissioned */ +#define GST_RIFF_INFO_ICMT MAKE_FOUR_CC('I','C','M','T') /* comment */ +#define GST_RIFF_INFO_ICOP MAKE_FOUR_CC('I','C','O','P') /* copyright */ +#define GST_RIFF_INFO_ICRD MAKE_FOUR_CC('I','C','R','D') /* creation date */ +#define GST_RIFF_INFO_ICRP MAKE_FOUR_CC('I','C','R','P') /* cropped */ +#define GST_RIFF_INFO_IDIM MAKE_FOUR_CC('I','D','I','M') /* dimensions */ +#define GST_RIFF_INFO_IDPI MAKE_FOUR_CC('I','D','P','I') /* dots-per-inch */ +#define GST_RIFF_INFO_IENG MAKE_FOUR_CC('I','E','N','G') /* engineer(s) */ +#define GST_RIFF_INFO_IGNR MAKE_FOUR_CC('I','G','N','R') /* genre */ +#define GST_RIFF_INFO_IKEY MAKE_FOUR_CC('I','K','E','Y') /* keywords */ +#define GST_RIFF_INFO_ILGT MAKE_FOUR_CC('I','L','G','T') /* lightness */ +#define GST_RIFF_INFO_IMED MAKE_FOUR_CC('I','M','E','D') /* medium */ +#define GST_RIFF_INFO_INAM MAKE_FOUR_CC('I','N','A','M') /* name */ +#define GST_RIFF_INFO_IPLT MAKE_FOUR_CC('I','P','L','T') /* palette setting */ +#define GST_RIFF_INFO_IPRD MAKE_FOUR_CC('I','P','R','D') /* product */ +#define GST_RIFF_INFO_ISBJ MAKE_FOUR_CC('I','S','B','J') /* subject */ +#define GST_RIFF_INFO_ISFT MAKE_FOUR_CC('I','S','F','T') /* software */ +#define GST_RIFF_INFO_ISHP MAKE_FOUR_CC('I','S','H','P') /* sharpness */ +#define GST_RIFF_INFO_ISRC MAKE_FOUR_CC('I','S','R','C') /* source */ +#define GST_RIFF_INFO_ISRF MAKE_FOUR_CC('I','S','R','F') /* source form */ +#define GST_RIFF_INFO_ITCH MAKE_FOUR_CC('I','T','C','H') /* technician(s) */ /*********Chunk Names***************/ #define GST_RIFF_FF00 MAKE_FOUR_CC(0xFF,0xFF,0x00,0x00) @@ -182,7 +183,7 @@ typedef enum { #define GST_RIFF_v422 MAKE_FOUR_CC( 'v', '4', '2', '2') #define GST_RIFF_V422 MAKE_FOUR_CC( 'V', '4', '2', '2') #define GST_RIFF_mvi1 MAKE_FOUR_CC( 'm', 'v', 'i', '1') -#define GST_RIFF_MPIX MAKE_FOUR_CC(0x04,0x00, 'i', '1') /* MotionPixels munged their id */ +#define GST_RIFF_MPIX MAKE_FOUR_CC(0x04,0x00, 'i', '1') /* MotionPixels munged their id */ #define GST_RIFF_AURA MAKE_FOUR_CC( 'A', 'U', 'R', 'A') #define GST_RIFF_DMB1 MAKE_FOUR_CC( 'D', 'M', 'B', '1') #define GST_RIFF_dmb1 MAKE_FOUR_CC( 'd', 'm', 'b', '1') @@ -218,7 +219,7 @@ typedef enum { #define GST_RIFF_rpza MAKE_FOUR_CC( 'r', 'p', 'z', 'a') /* And this here's the mistakes that need to be supported */ -#define GST_RIFF_azpr MAKE_FOUR_CC( 'a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */ +#define GST_RIFF_azpr MAKE_FOUR_CC( 'a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */ /*********** FND in MJPG **********/ #define GST_RIFF_ISFT MAKE_FOUR_CC( 'I', 'S', 'F', 'T') @@ -231,21 +232,22 @@ typedef enum { #define GST_RIFF_rec MAKE_FOUR_CC( 'r', 'e', 'c', ' ') /* common data structures */ -struct _gst_riff_avih { - guint32 us_frame; /* microsec per frame */ - guint32 max_bps; /* byte/s overall */ - guint32 pad_gran; /* pad_gran (???) */ +struct _gst_riff_avih +{ + guint32 us_frame; /* microsec per frame */ + guint32 max_bps; /* byte/s overall */ + guint32 pad_gran; /* pad_gran (???) */ guint32 flags; /* flags values */ -#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ -#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ -#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ -#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ -#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ - guint32 tot_frames; /* # of frames (all) */ - guint32 init_frames; /* initial frames (???) */ +#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ +#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ +#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ +#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ +#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ + guint32 tot_frames; /* # of frames (all) */ + guint32 init_frames; /* initial frames (???) */ guint32 streams; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 width; guint32 height; guint32 scale; @@ -254,26 +256,28 @@ struct _gst_riff_avih { guint32 length; }; -struct _gst_riff_strh { - guint32 type; /* stream type */ - guint32 fcc_handler; /* fcc_handler */ +struct _gst_riff_strh +{ + guint32 type; /* stream type */ + guint32 fcc_handler; /* fcc_handler */ guint32 flags; /* flags values */ #define GST_RIFF_STRH_DISABLED 0x000000001 #define GST_RIFF_STRH_VIDEOPALCHANGES 0x000010000 guint32 priority; - guint32 init_frames; /* initial frames (???) */ + guint32 init_frames; /* initial frames (???) */ guint32 scale; guint32 rate; guint32 start; guint32 length; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 quality; guint32 samplesize; /* XXX 16 bytes ? */ }; -struct _gst_riff_strf_vids { /* == BitMapInfoHeader */ +struct _gst_riff_strf_vids +{ /* == BitMapInfoHeader */ guint32 size; guint32 width; guint32 height; @@ -283,13 +287,14 @@ struct _gst_riff_strf_vids { /* == BitMapInfoHeader */ guint32 image_size; guint32 xpels_meter; guint32 ypels_meter; - guint32 num_colors; /* used colors */ - guint32 imp_colors; /* important colors */ + guint32 num_colors; /* used colors */ + guint32 imp_colors; /* important colors */ /* may be more for some codecs */ }; -struct _gst_riff_strf_auds { /* == WaveHeader (?) */ +struct _gst_riff_strf_auds +{ /* == WaveHeader (?) */ guint16 format; /**** from public Microsoft RIFF docs ******/ #define GST_RIFF_WAVE_FORMAT_UNKNOWN (0x0000) @@ -328,7 +333,8 @@ struct _gst_riff_strf_auds { /* == WaveHeader (?) */ guint16 size; }; -struct _gst_riff_strf_iavs { +struct _gst_riff_strf_iavs +{ guint32 DVAAuxSrc; guint32 DVAAuxCtl; guint32 DVAAuxSrc1; @@ -339,26 +345,30 @@ struct _gst_riff_strf_iavs { guint32 DVReserved2; }; -struct _gst_riff_riff { +struct _gst_riff_riff +{ guint32 id; guint32 size; guint32 type; }; -struct _gst_riff_list { +struct _gst_riff_list +{ guint32 id; guint32 size; guint32 type; }; -struct _gst_riff_labl { +struct _gst_riff_labl +{ guint32 id; guint32 size; guint32 identifier; }; -struct _gst_riff_ltxt { +struct _gst_riff_ltxt +{ guint32 id; guint32 size; @@ -371,14 +381,16 @@ struct _gst_riff_ltxt { guint16 codepage; }; -struct _gst_riff_note { +struct _gst_riff_note +{ guint32 id; guint32 size; guint32 identifier; }; -struct _gst_riff_cuepoints { +struct _gst_riff_cuepoints +{ guint32 identifier; guint32 position; guint32 id; @@ -387,19 +399,22 @@ struct _gst_riff_cuepoints { guint32 offset; }; -struct _gst_riff_cue { +struct _gst_riff_cue +{ guint32 id; guint32 size; - guint32 cuepoints; /* Number of cue points held in the data */ + guint32 cuepoints; /* Number of cue points held in the data */ }; -struct _gst_riff_chunk { +struct _gst_riff_chunk +{ guint32 id; guint32 size; }; -struct _gst_riff_index_entry { +struct _gst_riff_index_entry +{ guint32 id; guint32 flags; #define GST_RIFF_IF_LIST (0x00000001L) @@ -410,29 +425,31 @@ struct _gst_riff_index_entry { guint32 size; }; -struct _gst_riff_dmlh { +struct _gst_riff_dmlh +{ guint32 totalframes; }; -typedef struct _gst_riff_riff gst_riff_riff; -typedef struct _gst_riff_list gst_riff_list; -typedef struct _gst_riff_chunk gst_riff_chunk; -typedef struct _gst_riff_index_entry gst_riff_index_entry; - -typedef struct _gst_riff_avih gst_riff_avih; -typedef struct _gst_riff_strh gst_riff_strh; -typedef struct _gst_riff_strf_vids gst_riff_strf_vids; -typedef struct _gst_riff_strf_auds gst_riff_strf_auds; -typedef struct _gst_riff_strf_iavs gst_riff_strf_iavs; -typedef struct _gst_riff_dmlh gst_riff_dmlh; -typedef struct _GstRiffChunk GstRiffChunk; - -struct _GstRiffChunk { +typedef struct _gst_riff_riff gst_riff_riff; +typedef struct _gst_riff_list gst_riff_list; +typedef struct _gst_riff_chunk gst_riff_chunk; +typedef struct _gst_riff_index_entry gst_riff_index_entry; + +typedef struct _gst_riff_avih gst_riff_avih; +typedef struct _gst_riff_strh gst_riff_strh; +typedef struct _gst_riff_strf_vids gst_riff_strf_vids; +typedef struct _gst_riff_strf_auds gst_riff_strf_auds; +typedef struct _gst_riff_strf_iavs gst_riff_strf_iavs; +typedef struct _gst_riff_dmlh gst_riff_dmlh; +typedef struct _GstRiffChunk GstRiffChunk; + +struct _GstRiffChunk +{ gulong offset; guint32 id; guint32 size; - guint32 form; /* for list chunks */ + guint32 form; /* for list chunks */ gchar *data; }; diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index 889d6514..c2f6a00f 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -26,161 +26,161 @@ #include -static void gst_wavparse_base_init (gpointer g_class); -static void gst_wavparse_class_init (GstWavParseClass *klass); -static void gst_wavparse_init (GstWavParse *wavparse); - -static GstElementStateReturn - gst_wavparse_change_state (GstElement *element); - -static const GstFormat* gst_wavparse_get_formats (GstPad *pad); -static const GstQueryType * - gst_wavparse_get_query_types (GstPad *pad); -static gboolean gst_wavparse_pad_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); -static gboolean gst_wavparse_pad_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); - -static void gst_wavparse_loop (GstElement *element); -static const GstEventMask* - gst_wavparse_get_event_masks (GstPad *pad); -static gboolean gst_wavparse_srcpad_event (GstPad *pad, GstEvent *event); -static void gst_wavparse_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_wavparse_base_init (gpointer g_class); +static void gst_wavparse_class_init (GstWavParseClass * klass); +static void gst_wavparse_init (GstWavParse * wavparse); + +static GstElementStateReturn gst_wavparse_change_state (GstElement * element); + +static const GstFormat *gst_wavparse_get_formats (GstPad * pad); +static const GstQueryType *gst_wavparse_get_query_types (GstPad * pad); +static gboolean gst_wavparse_pad_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); +static gboolean gst_wavparse_pad_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); + +static void gst_wavparse_loop (GstElement * element); +static const GstEventMask *gst_wavparse_get_event_masks (GstPad * pad); +static gboolean gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event); +static void gst_wavparse_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); /* elementfactory information */ -static GstElementDetails gst_wavparse_details = GST_ELEMENT_DETAILS ( - ".wav demuxer", - "Codec/Demuxer", - "Parse a .wav file into raw audio", - "Erik Walthinsen " -); +static GstElementDetails gst_wavparse_details = +GST_ELEMENT_DETAILS (".wav demuxer", + "Codec/Demuxer", + "Parse a .wav file into raw audio", + "Erik Walthinsen "); static GstStaticPadTemplate sink_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "wavparse_sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-wav") -); +GST_STATIC_PAD_TEMPLATE ("wavparse_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wav") + ); static GstStaticPadTemplate src_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "wavparse_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "audio/x-raw-int, " - "endianness = (int) little_endian, " - "signed = (boolean) { true, false }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 8000, 48000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - "rate = (int) [ 8000, 48000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-alaw, " - "rate = (int) [ 8000, 48000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-mulaw, " - "rate = (int) [ 8000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); + GST_STATIC_PAD_TEMPLATE ("wavparse_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) little_endian, " + "signed = (boolean) { true, false }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-alaw, " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-mulaw, " + "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); /* WavParse signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ PROP_0, }; static GstElementClass *parent_class = NULL; + /*static guint gst_wavparse_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_wavparse_get_type (void) +gst_wavparse_get_type (void) { static GType wavparse_type = 0; if (!wavparse_type) { static const GTypeInfo wavparse_info = { - sizeof(GstWavParseClass), + sizeof (GstWavParseClass), gst_wavparse_base_init, NULL, (GClassInitFunc) gst_wavparse_class_init, NULL, NULL, - sizeof(GstWavParse), + sizeof (GstWavParse), 0, (GInstanceInitFunc) gst_wavparse_init, }; - wavparse_type = g_type_register_static (GST_TYPE_ELEMENT, "GstWavParse", &wavparse_info, 0); + wavparse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstWavParse", &wavparse_info, + 0); } return wavparse_type; } static void -gst_wavparse_base_init (gpointer g_class) +gst_wavparse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_wavparse_details); /* register src pads */ - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_template_factory)); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template_factory)); } static void -gst_wavparse_class_init (GstWavParseClass *klass) +gst_wavparse_class_init (GstWavParseClass * klass) { GstElementClass *gstelement_class; GObjectClass *object_class; - - gstelement_class = (GstElementClass*) klass; + + gstelement_class = (GstElementClass *) klass; object_class = (GObjectClass *) klass; - + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); object_class->get_property = gst_wavparse_get_property; gstelement_class->change_state = gst_wavparse_change_state; } -static void -gst_wavparse_init (GstWavParse *wavparse) +static void +gst_wavparse_init (GstWavParse * wavparse) { /* sink */ - wavparse->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&sink_template_factory), "sink"); + wavparse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&sink_template_factory), "sink"); gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->sinkpad); gst_pad_set_formats_function (wavparse->sinkpad, gst_wavparse_get_formats); gst_pad_set_convert_function (wavparse->sinkpad, gst_wavparse_pad_convert); - gst_pad_set_query_type_function (wavparse->sinkpad, - gst_wavparse_get_query_types); + gst_pad_set_query_type_function (wavparse->sinkpad, + gst_wavparse_get_query_types); gst_pad_set_query_function (wavparse->sinkpad, gst_wavparse_pad_query); /* source */ - wavparse->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&src_template_factory), "src"); + wavparse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&src_template_factory), "src"); gst_pad_use_explicit_caps (wavparse->srcpad); gst_element_add_pad (GST_ELEMENT (wavparse), wavparse->srcpad); gst_pad_set_formats_function (wavparse->srcpad, gst_wavparse_get_formats); gst_pad_set_convert_function (wavparse->srcpad, gst_wavparse_pad_convert); gst_pad_set_query_type_function (wavparse->srcpad, - gst_wavparse_get_query_types); + gst_wavparse_get_query_types); gst_pad_set_query_function (wavparse->srcpad, gst_wavparse_pad_query); gst_pad_set_event_function (wavparse->srcpad, gst_wavparse_srcpad_event); - gst_pad_set_event_mask_function (wavparse->srcpad, gst_wavparse_get_event_masks); + gst_pad_set_event_mask_function (wavparse->srcpad, + gst_wavparse_get_event_masks); gst_element_set_loop_function (GST_ELEMENT (wavparse), gst_wavparse_loop); @@ -191,25 +191,22 @@ gst_wavparse_init (GstWavParse *wavparse) } static void -gst_wavparse_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_wavparse_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstWavParse *wavparse; wavparse = GST_WAVPARSE (object); switch (prop_id) { - default: - break; + default: + break; } } #if 0 static void -gst_wavparse_parse_adtl (GstWavParse *wavparse, - int len) +gst_wavparse_parse_adtl (GstWavParse * wavparse, int len) { guint32 got_bytes; GstByteStream *bs = wavparse->bs; @@ -225,14 +222,15 @@ gst_wavparse_parse_adtl (GstWavParse *wavparse, GList *caps = NULL; props = wavparse->metadata->properties; - + while (len > 0) { - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); if (got_bytes != sizeof (gst_riff_chunk)) { return; } temp_chunk = (gst_riff_chunk *) tempdata; - + chunk.id = GUINT32_FROM_LE (temp_chunk->id); chunk.size = GUINT32_FROM_LE (temp_chunk->size); @@ -241,148 +239,149 @@ gst_wavparse_parse_adtl (GstWavParse *wavparse, len -= sizeof (gst_riff_chunk); continue; } - - switch (chunk.id) { - case GST_RIFF_adtl_labl: - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_labl)); - if (got_bytes != sizeof (struct _gst_riff_labl)) { - return; - } - - temp_labl = (struct _gst_riff_labl *) tempdata; - labl.id = GUINT32_FROM_LE (temp_labl->id); - labl.size = GUINT32_FROM_LE (temp_labl->size); - labl.identifier = GUINT32_FROM_LE (temp_labl->identifier); - - gst_bytestream_flush (bs, sizeof (struct _gst_riff_labl)); - len -= sizeof (struct _gst_riff_labl); - - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, labl.size - 4); - if (got_bytes != labl.size - 4) { - return; - } - label_name = (char *) tempdata; - - gst_bytestream_flush (bs, ((labl.size - 4) + 1) & ~1); - len -= (( (labl.size - 4) + 1) & ~1); - - new_caps = gst_caps_new ("label", - "application/x-gst-metadata", - gst_props_new ( - "identifier", G_TYPE_INT (labl.identifier), - "name", G_TYPE_STRING (label_name), - NULL)); - - if (gst_props_get (props, "labels", &caps, NULL)) { - caps = g_list_append (caps, new_caps); - } else { - caps = g_list_append (NULL, new_caps); - - entry = gst_props_entry_new ("labels", GST_PROPS_GLIST (caps)); - gst_props_add_entry (props, entry); - } - - break; - - case GST_RIFF_adtl_ltxt: - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_ltxt)); - if (got_bytes != sizeof (struct _gst_riff_ltxt)) { + switch (chunk.id) { + case GST_RIFF_adtl_labl: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_labl)); + if (got_bytes != sizeof (struct _gst_riff_labl)) { + return; + } + + temp_labl = (struct _gst_riff_labl *) tempdata; + labl.id = GUINT32_FROM_LE (temp_labl->id); + labl.size = GUINT32_FROM_LE (temp_labl->size); + labl.identifier = GUINT32_FROM_LE (temp_labl->identifier); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_labl)); + len -= sizeof (struct _gst_riff_labl); + + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, labl.size - 4); + if (got_bytes != labl.size - 4) { + return; + } + + label_name = (char *) tempdata; + + gst_bytestream_flush (bs, ((labl.size - 4) + 1) & ~1); + len -= (((labl.size - 4) + 1) & ~1); + + new_caps = gst_caps_new ("label", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (labl.identifier), + "name", G_TYPE_STRING (label_name), NULL)); + + if (gst_props_get (props, "labels", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("labels", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + case GST_RIFF_adtl_ltxt: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_ltxt)); + if (got_bytes != sizeof (struct _gst_riff_ltxt)) { + return; + } + + temp_ltxt = (struct _gst_riff_ltxt *) tempdata; + ltxt.id = GUINT32_FROM_LE (temp_ltxt->id); + ltxt.size = GUINT32_FROM_LE (temp_ltxt->size); + ltxt.identifier = GUINT32_FROM_LE (temp_ltxt->identifier); + ltxt.length = GUINT32_FROM_LE (temp_ltxt->length); + ltxt.purpose = GUINT32_FROM_LE (temp_ltxt->purpose); + ltxt.country = GUINT16_FROM_LE (temp_ltxt->country); + ltxt.language = GUINT16_FROM_LE (temp_ltxt->language); + ltxt.dialect = GUINT16_FROM_LE (temp_ltxt->dialect); + ltxt.codepage = GUINT16_FROM_LE (temp_ltxt->codepage); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_ltxt)); + len -= sizeof (struct _gst_riff_ltxt); + + if (ltxt.size - 20 > 0) { + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, ltxt.size - 20); + if (got_bytes != ltxt.size - 20) { + return; + } + + gst_bytestream_flush (bs, ((ltxt.size - 20) + 1) & ~1); + len -= (((ltxt.size - 20) + 1) & ~1); + + label_name = (char *) tempdata; + } else { + label_name = ""; + } + + new_caps = gst_caps_new ("ltxt", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (ltxt.identifier), + "name", G_TYPE_STRING (label_name), + "length", G_TYPE_INT (ltxt.length), NULL)); + + if (gst_props_get (props, "ltxts", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("ltxts", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + case GST_RIFF_adtl_note: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_note)); + if (got_bytes != sizeof (struct _gst_riff_note)) { + return; + } + + temp_note = (struct _gst_riff_note *) tempdata; + note.id = GUINT32_FROM_LE (temp_note->id); + note.size = GUINT32_FROM_LE (temp_note->size); + note.identifier = GUINT32_FROM_LE (temp_note->identifier); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_note)); + len -= sizeof (struct _gst_riff_note); + + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, note.size - 4); + if (got_bytes != note.size - 4) { + return; + } + + gst_bytestream_flush (bs, ((note.size - 4) + 1) & ~1); + len -= (((note.size - 4) + 1) & ~1); + + label_name = (char *) tempdata; + + new_caps = gst_caps_new ("note", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (note.identifier), + "name", G_TYPE_STRING (label_name), NULL)); + + if (gst_props_get (props, "notes", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("notes", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + default: + g_print ("Unknown chunk: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (chunk.id)); return; - } - - temp_ltxt = (struct _gst_riff_ltxt *) tempdata; - ltxt.id = GUINT32_FROM_LE (temp_ltxt->id); - ltxt.size = GUINT32_FROM_LE (temp_ltxt->size); - ltxt.identifier = GUINT32_FROM_LE (temp_ltxt->identifier); - ltxt.length = GUINT32_FROM_LE (temp_ltxt->length); - ltxt.purpose = GUINT32_FROM_LE (temp_ltxt->purpose); - ltxt.country = GUINT16_FROM_LE (temp_ltxt->country); - ltxt.language = GUINT16_FROM_LE (temp_ltxt->language); - ltxt.dialect = GUINT16_FROM_LE (temp_ltxt->dialect); - ltxt.codepage = GUINT16_FROM_LE (temp_ltxt->codepage); - - gst_bytestream_flush (bs, sizeof (struct _gst_riff_ltxt)); - len -= sizeof (struct _gst_riff_ltxt); - - if (ltxt.size - 20 > 0) { - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, ltxt.size - 20); - if (got_bytes != ltxt.size - 20) { - return; - } - - gst_bytestream_flush (bs, ((ltxt.size - 20) + 1) & ~1); - len -= (( (ltxt.size - 20) + 1) & ~1); - - label_name = (char *) tempdata; - } else { - label_name = ""; - } - - new_caps = gst_caps_new ("ltxt", - "application/x-gst-metadata", - gst_props_new ( - "identifier", G_TYPE_INT (ltxt.identifier), - "name", G_TYPE_STRING (label_name), - "length", G_TYPE_INT (ltxt.length), - NULL)); - - if (gst_props_get (props, "ltxts", &caps, NULL)) { - caps = g_list_append (caps, new_caps); - } else { - caps = g_list_append (NULL, new_caps); - - entry = gst_props_entry_new ("ltxts", GST_PROPS_GLIST (caps)); - gst_props_add_entry (props, entry); - } - - break; - - case GST_RIFF_adtl_note: - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_note)); - if (got_bytes != sizeof (struct _gst_riff_note)) { - return; - } - - temp_note = (struct _gst_riff_note *) tempdata; - note.id = GUINT32_FROM_LE (temp_note->id); - note.size = GUINT32_FROM_LE (temp_note->size); - note.identifier = GUINT32_FROM_LE (temp_note->identifier); - - gst_bytestream_flush (bs, sizeof (struct _gst_riff_note)); - len -= sizeof (struct _gst_riff_note); - - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, note.size - 4); - if (got_bytes != note.size - 4) { - return; - } - - gst_bytestream_flush (bs, ((note.size - 4) + 1) & ~1); - len -= (( (note.size - 4) + 1) & ~1); - - label_name = (char *) tempdata; - - new_caps = gst_caps_new ("note", - "application/x-gst-metadata", - gst_props_new ( - "identifier", G_TYPE_INT (note.identifier), - "name", G_TYPE_STRING (label_name), - NULL)); - - if (gst_props_get (props, "notes", &caps, NULL)) { - caps = g_list_append (caps, new_caps); - } else { - caps = g_list_append (NULL, new_caps); - - entry = gst_props_entry_new ("notes", GST_PROPS_GLIST (caps)); - gst_props_add_entry (props, entry); - } - - break; - - default: - g_print ("Unknown chunk: " GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS(chunk.id)); - return; } } @@ -392,19 +391,19 @@ gst_wavparse_parse_adtl (GstWavParse *wavparse, #if 0 static void -gst_wavparse_parse_info (GstWavParse *wavparse, - int len) +gst_wavparse_parse_info (GstWavParse * wavparse, int len) { gst_riff_chunk *temp_chunk, chunk; GstByteStream *bs = wavparse->bs; guint8 *tempdata; guint32 got_bytes; char *name, *type; - + while (len > 0) { - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); temp_chunk = (gst_riff_chunk *) tempdata; - + chunk.id = GUINT32_FROM_LE (temp_chunk->id); chunk.size = GUINT32_FROM_LE (temp_chunk->size); @@ -412,87 +411,87 @@ gst_wavparse_parse_info (GstWavParse *wavparse, if (got_bytes != sizeof (gst_riff_chunk)) { return; } - + /* move our pointer on past the header */ len -= sizeof (gst_riff_chunk); - + if (chunk.size == 0) { continue; } - + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, chunk.size); name = (char *) tempdata; if (got_bytes != chunk.size) { return; } - + /* move our pointer on past the data ... on an even boundary */ - gst_bytestream_flush (bs, (chunk.size + 1) & ~1); + gst_bytestream_flush (bs, (chunk.size + 1) & ~1); len -= ((chunk.size + 1) & ~1); /* We now have an info string in 'name' of type chunk.id - find type */ switch (chunk.id) { - case GST_RIFF_INFO_IARL: - type = "Location"; - break; - - case GST_RIFF_INFO_IART: - type = "Artist"; - break; - - case GST_RIFF_INFO_ICMS: - type = "Commissioner"; - break; - - case GST_RIFF_INFO_ICMT: - type = "Comment"; - break; - - case GST_RIFF_INFO_ICOP: - type = "Copyright"; - break; - - case GST_RIFF_INFO_ICRD: - type = "Creation Date"; - break; - - case GST_RIFF_INFO_IENG: - type = "Engineer"; - break; - - case GST_RIFF_INFO_IGNR: - type = "Genre"; - break; - - case GST_RIFF_INFO_IKEY: - type = "Keywords"; - break; - - case GST_RIFF_INFO_INAM: - type = "Title"; /* name */ - break; - - case GST_RIFF_INFO_IPRD: - type = "Product"; - break; - - case GST_RIFF_INFO_ISBJ: - type = "Subject"; - break; - - case GST_RIFF_INFO_ISFT: - type = "Software"; - break; - - case GST_RIFF_INFO_ITCH: - type = "Technician"; - break; - - default: - g_print ("Unknown: %4.4s\n", (char *) &chunk.id); - type = NULL; - break; + case GST_RIFF_INFO_IARL: + type = "Location"; + break; + + case GST_RIFF_INFO_IART: + type = "Artist"; + break; + + case GST_RIFF_INFO_ICMS: + type = "Commissioner"; + break; + + case GST_RIFF_INFO_ICMT: + type = "Comment"; + break; + + case GST_RIFF_INFO_ICOP: + type = "Copyright"; + break; + + case GST_RIFF_INFO_ICRD: + type = "Creation Date"; + break; + + case GST_RIFF_INFO_IENG: + type = "Engineer"; + break; + + case GST_RIFF_INFO_IGNR: + type = "Genre"; + break; + + case GST_RIFF_INFO_IKEY: + type = "Keywords"; + break; + + case GST_RIFF_INFO_INAM: + type = "Title"; /* name */ + break; + + case GST_RIFF_INFO_IPRD: + type = "Product"; + break; + + case GST_RIFF_INFO_ISBJ: + type = "Subject"; + break; + + case GST_RIFF_INFO_ISFT: + type = "Software"; + break; + + case GST_RIFF_INFO_ITCH: + type = "Technician"; + break; + + default: + g_print ("Unknown: %4.4s\n", (char *) &chunk.id); + type = NULL; + break; } if (type) { @@ -509,8 +508,7 @@ gst_wavparse_parse_info (GstWavParse *wavparse, #if 0 static void -gst_wavparse_parse_cues (GstWavParse *wavparse, - int len) +gst_wavparse_parse_cues (GstWavParse * wavparse, int len) { guint32 got_bytes; GstByteStream *bs = wavparse->bs; @@ -523,8 +521,10 @@ gst_wavparse_parse_cues (GstWavParse *wavparse, while (len > 0) { int required; - - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_cue)); + + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_cue)); temp_cue = (struct _gst_riff_cue *) tempdata; /* fixup for our big endian friends */ @@ -548,33 +548,31 @@ gst_wavparse_parse_cues (GstWavParse *wavparse, return; } - len -= ( ((cue.size - 4) + 1) & ~1); + len -= (((cue.size - 4) + 1) & ~1); /* now we have an array of struct _gst_riff_cuepoints in tempdata */ points = (struct _gst_riff_cuepoints *) tempdata; - + for (i = 0; i < cue.cuepoints; i++) { GstCaps *caps; caps = gst_caps_new ("cues", - "application/x-gst-metadata", - gst_props_new ( - "identifier", G_TYPE_INT (points[i].identifier), - "position", G_TYPE_INT (points[i].offset), - NULL)); + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (points[i].identifier), + "position", G_TYPE_INT (points[i].offset), NULL)); cues = g_list_append (cues, caps); } - + entry = gst_props_entry_new ("cues", GST_PROPS_GLIST (cues)); gst_props_add_entry (wavparse->metadata->properties, entry); } - + g_object_notify (G_OBJECT (wavparse), "metadata"); } #endif static void -gst_wavparse_parse_fmt (GstWavParse *wavparse, guint size) +gst_wavparse_parse_fmt (GstWavParse * wavparse, guint size) { GstWavParseFormat *format; GstCaps *caps = NULL; @@ -582,7 +580,8 @@ gst_wavparse_parse_fmt (GstWavParse *wavparse, guint size) GstByteStream *bs = wavparse->bs; guint32 got_bytes; - got_bytes = gst_bytestream_peek_bytes (bs, &fmtdata, sizeof (GstWavParseFormat)); + got_bytes = + gst_bytestream_peek_bytes (bs, &fmtdata, sizeof (GstWavParseFormat)); format = (GstWavParseFormat *) fmtdata; if (got_bytes == sizeof (GstWavParseFormat)) { @@ -596,49 +595,47 @@ gst_wavparse_parse_fmt (GstWavParse *wavparse, guint size) /* set the caps on the src pad */ /* FIXME: handle all of the other formats as well */ switch (wavparse->format) { - case GST_RIFF_WAVE_FORMAT_ALAW: - case GST_RIFF_WAVE_FORMAT_MULAW: { - char *mime = (wavparse->format == GST_RIFF_WAVE_FORMAT_ALAW) ? - "audio/x-alaw" : "audio/x-mulaw"; - if (wavparse->width != 8) { - g_warning ("Ignoring invalid width %d", wavparse->width); - return; + case GST_RIFF_WAVE_FORMAT_ALAW: + case GST_RIFF_WAVE_FORMAT_MULAW:{ + char *mime = (wavparse->format == GST_RIFF_WAVE_FORMAT_ALAW) ? + "audio/x-alaw" : "audio/x-mulaw"; + if (wavparse->width != 8) { + g_warning ("Ignoring invalid width %d", wavparse->width); + return; + } + + caps = gst_caps_new_simple (mime, + "rate", G_TYPE_INT, wavparse->rate, + "channels", G_TYPE_INT, wavparse->channels, NULL); } - - caps = gst_caps_new_simple (mime, - "rate", G_TYPE_INT, wavparse->rate, - "channels", G_TYPE_INT, wavparse->channels, - NULL); - } - break; - - case GST_RIFF_WAVE_FORMAT_PCM: - caps = gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, - "signed", G_TYPE_BOOLEAN, (wavparse->width > 8) ? TRUE : FALSE, - "width", G_TYPE_INT, wavparse->width, - "depth", G_TYPE_INT, wavparse->width, - "rate", G_TYPE_INT, wavparse->rate, - "channels", G_TYPE_INT, wavparse->channels, - NULL); - break; - - case GST_RIFF_WAVE_FORMAT_MPEGL12: - case GST_RIFF_WAVE_FORMAT_MPEGL3: { - int layer = (wavparse->format == GST_RIFF_WAVE_FORMAT_MPEGL12) ? 2 : 3; - - caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, layer, - "rate", G_TYPE_INT, wavparse->rate, - "channels", G_TYPE_INT, wavparse->channels, - NULL); - } - break; - - default: - GST_ELEMENT_ERROR (wavparse, STREAM, NOT_IMPLEMENTED, (NULL), ("format %d not handled", wavparse->format)); - return; + break; + + case GST_RIFF_WAVE_FORMAT_PCM: + caps = gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, + "signed", G_TYPE_BOOLEAN, (wavparse->width > 8) ? TRUE : FALSE, + "width", G_TYPE_INT, wavparse->width, + "depth", G_TYPE_INT, wavparse->width, + "rate", G_TYPE_INT, wavparse->rate, + "channels", G_TYPE_INT, wavparse->channels, NULL); + break; + + case GST_RIFF_WAVE_FORMAT_MPEGL12: + case GST_RIFF_WAVE_FORMAT_MPEGL3:{ + int layer = (wavparse->format == GST_RIFF_WAVE_FORMAT_MPEGL12) ? 2 : 3; + + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, + "layer", G_TYPE_INT, layer, + "rate", G_TYPE_INT, wavparse->rate, + "channels", G_TYPE_INT, wavparse->channels, NULL); + } + break; + + default: + GST_ELEMENT_ERROR (wavparse, STREAM, NOT_IMPLEMENTED, (NULL), + ("format %d not handled", wavparse->format)); + return; } if (caps) { @@ -651,42 +648,42 @@ gst_wavparse_parse_fmt (GstWavParse *wavparse, guint size) } static gboolean -gst_wavparse_handle_sink_event (GstWavParse *wavparse) +gst_wavparse_handle_sink_event (GstWavParse * wavparse) { guint32 remaining; GstEvent *event; GstEventType type; gboolean res = TRUE; - + gst_bytestream_get_status (wavparse->bs, &remaining, &event); - + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; GST_DEBUG ("wavparse: event %p %d", event, type); - + switch (type) { - case GST_EVENT_EOS: - gst_bytestream_flush (wavparse->bs, remaining); - gst_pad_event_default (wavparse->sinkpad, event); - res = FALSE; - goto done; - - case GST_EVENT_FLUSH: - g_warning ("Wavparse: Flush event"); - break; - - default: - g_warning ("Wavparse: Unhandled event %d", type); - break; + case GST_EVENT_EOS: + gst_bytestream_flush (wavparse->bs, remaining); + gst_pad_event_default (wavparse->sinkpad, event); + res = FALSE; + goto done; + + case GST_EVENT_FLUSH: + g_warning ("Wavparse: Flush event"); + break; + + default: + g_warning ("Wavparse: Unhandled event %d", type); + break; } gst_event_unref (event); - done: +done: return res; } - + static void -gst_wavparse_loop (GstElement *element) +gst_wavparse_loop (GstElement * element) { GstWavParse *wavparse; gst_riff_riff chunk; @@ -700,25 +697,24 @@ gst_wavparse_loop (GstElement *element) if (wavparse->seek_pending) { GST_DEBUG ("wavparse: seek pending to %" G_GINT64_FORMAT " %08llx", - wavparse->seek_offset, - (unsigned long long) wavparse->seek_offset); - + wavparse->seek_offset, (unsigned long long) wavparse->seek_offset); + if (!gst_bytestream_seek (bs, wavparse->seek_offset, GST_SEEK_METHOD_SET)) { GST_INFO ("wavparse: Could not seek"); } - + wavparse->seek_pending = FALSE; } - + if (wavparse->state == GST_WAVPARSE_DATA) { GstBuffer *buf; int desired; - + /* This seems to want the whole chunk, Will this screw up streaming? Does anyone care about streaming wavs? FIXME: Should we have a decent buffer size? */ - + #define MAX_BUFFER_SIZE 1024 if (wavparse->dataleft > 0) { @@ -726,15 +722,16 @@ gst_wavparse_loop (GstElement *element) got_bytes = gst_bytestream_peek (bs, &buf, desired); if (got_bytes != desired) { - /* EOS? */ - GstEvent *event; - guint32 remaining; - gst_bytestream_get_status (bs, &remaining, &event); - if (event && GST_EVENT_TYPE (event) == GST_EVENT_EOS) { - gst_pad_event_default (wavparse->sinkpad, event); - } else { - GST_ELEMENT_ERROR (element, RESOURCE, READ, (NULL), (NULL)); - } + /* EOS? */ + GstEvent *event; + guint32 remaining; + + gst_bytestream_get_status (bs, &remaining, &event); + if (event && GST_EVENT_TYPE (event) == GST_EVENT_EOS) { + gst_pad_event_default (wavparse->sinkpad, event); + } else { + GST_ELEMENT_ERROR (element, RESOURCE, READ, (NULL), (NULL)); + } return; } @@ -742,7 +739,7 @@ gst_wavparse_loop (GstElement *element) wavparse->byteoffset += got_bytes; gst_bytestream_flush (bs, got_bytes); - + gst_pad_push (wavparse->srcpad, GST_DATA (buf)); return; } else { @@ -754,51 +751,53 @@ gst_wavparse_loop (GstElement *element) gst_riff_riff *temp_chunk; guint8 *tempdata; guint32 skipsize; - + /* read first two dwords to get chunktype and size */ while (TRUE) { - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); temp_chunk = (gst_riff_riff *) tempdata; if (got_bytes < sizeof (gst_riff_chunk)) { - if (!gst_wavparse_handle_sink_event (wavparse)) { - return; - } + if (!gst_wavparse_handle_sink_event (wavparse)) { + return; + } } else { - break; + break; } } - + chunk.id = GUINT32_FROM_LE (temp_chunk->id); chunk.size = GUINT32_FROM_LE (temp_chunk->size); switch (chunk.id) { - case GST_RIFF_TAG_RIFF: - case GST_RIFF_TAG_LIST: - /* Read complete list chunk */ - while (TRUE) { - got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_list)); - temp_chunk = (gst_riff_riff *) tempdata; - if (got_bytes < sizeof (gst_riff_list)) { - if (!gst_wavparse_handle_sink_event (wavparse)) { - return; + case GST_RIFF_TAG_RIFF: + case GST_RIFF_TAG_LIST: + /* Read complete list chunk */ + while (TRUE) { + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_list)); + temp_chunk = (gst_riff_riff *) tempdata; + if (got_bytes < sizeof (gst_riff_list)) { + if (!gst_wavparse_handle_sink_event (wavparse)) { + return; + } + } else { + break; } - } else { - break; } - } - - chunk.type = GUINT32_FROM_LE (temp_chunk->type); - skipsize = sizeof (gst_riff_list); - break; - case GST_RIFF_TAG_cue: - skipsize = 0; - break; - - default: - skipsize = sizeof (gst_riff_chunk); - break; + chunk.type = GUINT32_FROM_LE (temp_chunk->type); + skipsize = sizeof (gst_riff_list); + break; + + case GST_RIFF_TAG_cue: + skipsize = 0; + break; + + default: + skipsize = sizeof (gst_riff_chunk); + break; } gst_bytestream_flush (bs, skipsize); } while (FALSE); @@ -807,75 +806,74 @@ gst_wavparse_loop (GstElement *element) flush = (chunk.size + 1) & ~1; switch (wavparse->state) { - case GST_WAVPARSE_START: - if (chunk.id != GST_RIFF_TAG_RIFF && - chunk.type != GST_RIFF_RIFF_WAVE) { - GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), - ("chunk.id %08x chunk.type %08x", chunk.id, chunk.type)); - return; - } - - wavparse->state = GST_WAVPARSE_OTHER; - /* We are not going to flush lists */ - flush = 0; - break; - - case GST_WAVPARSE_OTHER: - GST_DEBUG ("riff tag: %4.4s %08x", (char *) &chunk.id, chunk.size); - - switch (chunk.id) { - case GST_RIFF_TAG_data: - wavparse->state = GST_WAVPARSE_DATA; - wavparse->dataleft = chunk.size; - wavparse->byteoffset = 0; - flush = 0; - break; - - case GST_RIFF_TAG_fmt: - gst_wavparse_parse_fmt (wavparse, chunk.size); + case GST_WAVPARSE_START: + if (chunk.id != GST_RIFF_TAG_RIFF && chunk.type != GST_RIFF_RIFF_WAVE) { + GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), + ("chunk.id %08x chunk.type %08x", chunk.id, chunk.type)); + return; + } + + wavparse->state = GST_WAVPARSE_OTHER; + /* We are not going to flush lists */ flush = 0; break; - case GST_RIFF_TAG_cue: - //gst_wavparse_parse_cues (wavparse, chunk.size); - break; - - case GST_RIFF_TAG_LIST: - GST_DEBUG ("list type: %4.4s", (char *) &chunk.type); - switch (chunk.type) { - case GST_RIFF_LIST_INFO: - //gst_wavparse_parse_info (wavparse, chunk.size - 4); - //flush = 0; + case GST_WAVPARSE_OTHER: + GST_DEBUG ("riff tag: %4.4s %08x", (char *) &chunk.id, chunk.size); - break; - - case GST_RIFF_LIST_adtl: - //gst_wavparse_parse_adtl (wavparse, chunk.size - 4); - //flush = 0; - break; + switch (chunk.id) { + case GST_RIFF_TAG_data: + wavparse->state = GST_WAVPARSE_DATA; + wavparse->dataleft = chunk.size; + wavparse->byteoffset = 0; + flush = 0; + break; - default: - //flush = 0; - break; + case GST_RIFF_TAG_fmt: + gst_wavparse_parse_fmt (wavparse, chunk.size); + flush = 0; + break; + + case GST_RIFF_TAG_cue: + //gst_wavparse_parse_cues (wavparse, chunk.size); + break; + + case GST_RIFF_TAG_LIST: + GST_DEBUG ("list type: %4.4s", (char *) &chunk.type); + switch (chunk.type) { + case GST_RIFF_LIST_INFO: + //gst_wavparse_parse_info (wavparse, chunk.size - 4); + //flush = 0; + + break; + + case GST_RIFF_LIST_adtl: + //gst_wavparse_parse_adtl (wavparse, chunk.size - 4); + //flush = 0; + break; + + default: + //flush = 0; + break; + } + + default: + GST_DEBUG (" ***** unknown chunkid %08x", chunk.id); + //flush = 0; + break; } - + break; + + case GST_WAVPARSE_DATA: + /* Should have been handled up there ^^^^ */ + flush = 0; + break; + default: - GST_DEBUG (" ***** unknown chunkid %08x", chunk.id); - //flush = 0; - break; - } - break; - - case GST_WAVPARSE_DATA: - /* Should have been handled up there ^^^^ */ - flush = 0; - break; - - default: - /* Unknown */ - g_warning ("Unknown state %d\n", wavparse->state); - //GST_DEBUG (" ***** unknown chunkid %08x", chunk.id); - break; + /* Unknown */ + g_warning ("Unknown state %d\n", wavparse->state); + //GST_DEBUG (" ***** unknown chunkid %08x", chunk.id); + break; } if (flush > 0) { @@ -888,18 +886,18 @@ gst_wavparse_loop (GstElement *element) gst_bytestream_get_status (bs, &remaining, &event); gst_event_unref (event); - } + } } } /* convert and query stuff */ static const GstFormat * -gst_wavparse_get_formats (GstPad *pad) +gst_wavparse_get_formats (GstPad * pad) { static GstFormat formats[] = { GST_FORMAT_TIME, GST_FORMAT_BYTES, - GST_FORMAT_DEFAULT, /* a "frame", ie a set of samples per Hz */ + GST_FORMAT_DEFAULT, /* a "frame", ie a set of samples per Hz */ 0, 0 }; @@ -907,9 +905,9 @@ gst_wavparse_get_formats (GstPad *pad) } static gboolean -gst_wavparse_pad_convert (GstPad *pad, - GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_wavparse_pad_convert (GstPad * pad, + GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { gint bytes_per_sample; glong byterate; @@ -919,11 +917,11 @@ gst_wavparse_pad_convert (GstPad *pad, gboolean dest_format_ok = FALSE; wavparse = GST_WAVPARSE (gst_pad_get_parent (pad)); - + bytes_per_sample = wavparse->channels * wavparse->width / 8; if (bytes_per_sample == 0) { GST_DEBUG ("bytes_per_sample 0, probably an mp3 - channels %d, width %d", - wavparse->channels, wavparse->width); + wavparse->channels, wavparse->width); return FALSE; } byterate = (glong) (bytes_per_sample * wavparse->rate); @@ -936,8 +934,12 @@ gst_wavparse_pad_convert (GstPad *pad, formats = gst_pad_get_formats (pad); while (formats && *formats) { - if (src_format == *formats) { src_format_ok = TRUE; } - if (*dest_format == *formats) { dest_format_ok = TRUE; } + if (src_format == *formats) { + src_format_ok = TRUE; + } + if (*dest_format == *formats) { + dest_format_ok = TRUE; + } formats++; } if (!src_format_ok || !dest_format_ok) { @@ -949,23 +951,23 @@ gst_wavparse_pad_convert (GstPad *pad, switch (src_format) { case GST_FORMAT_BYTES: if (*dest_format == GST_FORMAT_DEFAULT) - *dest_value = src_value / bytes_per_sample; + *dest_value = src_value / bytes_per_sample; else if (*dest_format == GST_FORMAT_TIME) - *dest_value = src_value * GST_SECOND / byterate; + *dest_value = src_value * GST_SECOND / byterate; else { - GST_DEBUG ("can't convert from bytes to other than units/time"); - return FALSE; + GST_DEBUG ("can't convert from bytes to other than units/time"); + return FALSE; } break; case GST_FORMAT_DEFAULT: if (*dest_format == GST_FORMAT_BYTES) - *dest_value = src_value * bytes_per_sample; + *dest_value = src_value * bytes_per_sample; else if (*dest_format == GST_FORMAT_TIME) - *dest_value = src_value * GST_SECOND / wavparse->rate; + *dest_value = src_value * GST_SECOND / wavparse->rate; else { - GST_DEBUG ("can't convert from units to other than bytes/time"); - return FALSE; + GST_DEBUG ("can't convert from units to other than bytes/time"); + return FALSE; } break; case GST_FORMAT_TIME: @@ -974,8 +976,8 @@ gst_wavparse_pad_convert (GstPad *pad, else if (*dest_format == GST_FORMAT_DEFAULT) *dest_value = src_value * wavparse->rate / GST_SECOND; else { - GST_DEBUG ("can't convert from time to other than bytes/units"); - return FALSE; + GST_DEBUG ("can't convert from time to other than bytes/units"); + return FALSE; } *dest_value = *dest_value & ~(bytes_per_sample - 1); @@ -986,9 +988,9 @@ gst_wavparse_pad_convert (GstPad *pad, } return TRUE; } - + static const GstQueryType * -gst_wavparse_get_query_types (GstPad *pad) +gst_wavparse_get_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_TOTAL, @@ -1000,8 +1002,8 @@ gst_wavparse_get_query_types (GstPad *pad) /* handle queries for location and length in requested format */ static gboolean -gst_wavparse_pad_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value) +gst_wavparse_pad_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value) { GstFormat peer_format = GST_FORMAT_BYTES; gint64 peer_value; @@ -1010,16 +1012,16 @@ gst_wavparse_pad_query (GstPad *pad, GstQueryType type, /* probe sink's peer pad, convert value, and that's it :) */ /* FIXME: ideally we'd loop over possible formats of peer instead * of only using BYTE */ - + /* only support byte, time and unit queries */ wavparse = GST_WAVPARSE (gst_pad_get_parent (pad)); - if (!gst_pad_query (GST_PAD_PEER (wavparse->sinkpad), type, - &peer_format, &peer_value)) { + if (!gst_pad_query (GST_PAD_PEER (wavparse->sinkpad), type, + &peer_format, &peer_value)) { GST_DEBUG ("Could not query sink pad's peer"); return FALSE; } if (!gst_pad_convert (wavparse->sinkpad, peer_format, peer_value, - format, value)) { + format, value)) { GST_DEBUG ("Could not convert sink pad's peer"); return FALSE; } @@ -1027,19 +1029,18 @@ gst_wavparse_pad_query (GstPad *pad, GstQueryType type, return TRUE; } -static const GstEventMask* -gst_wavparse_get_event_masks (GstPad *pad) -{ +static const GstEventMask * +gst_wavparse_get_event_masks (GstPad * pad) +{ static const GstEventMask gst_wavparse_src_event_masks[] = { - { GST_EVENT_SEEK, GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH }, - { 0, } + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH}, + {0,} }; return gst_wavparse_src_event_masks; -} +} static gboolean -gst_wavparse_srcpad_event (GstPad *pad, GstEvent *event) +gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event) { #if 0 GstWavParse *wavparse = GST_WAVPARSE (GST_PAD_PARENT (pad)); @@ -1059,15 +1060,13 @@ gst_wavparse_srcpad_event (GstPad *pad, GstEvent *event) } format = GST_FORMAT_BYTES; - + /* bring format to bytes for the peer element, * FIXME be smarter here */ - res = gst_pad_convert (pad, - GST_EVENT_SEEK_FORMAT (event), - GST_EVENT_SEEK_OFFSET (event), - &format, - &byteoffset); - + res = gst_pad_convert (pad, + GST_EVENT_SEEK_FORMAT (event), + GST_EVENT_SEEK_OFFSET (event), &format, &byteoffset); + if (res) { /* ok, seek worked, update our state */ wavparse->seek_offset = byteoffset; @@ -1088,7 +1087,7 @@ gst_wavparse_srcpad_event (GstPad *pad, GstEvent *event) } static GstElementStateReturn -gst_wavparse_change_state (GstElement *element) +gst_wavparse_change_state (GstElement * element) { GstWavParse *wavparse = GST_WAVPARSE (element); @@ -1121,23 +1120,18 @@ gst_wavparse_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) { return FALSE; } - return gst_element_register (plugin, "wavparse", GST_RANK_SECONDARY, GST_TYPE_WAVPARSE); + return gst_element_register (plugin, "wavparse", GST_RANK_SECONDARY, + GST_TYPE_WAVPARSE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "wavparse", - "Parse a .wav file into raw audio", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "wavparse", + "Parse a .wav file into raw audio", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/wavparse/gstwavparse.h b/gst/wavparse/gstwavparse.h index 3893a293..b8cdd2de 100644 --- a/gst/wavparse/gstwavparse.h +++ b/gst/wavparse/gstwavparse.h @@ -27,8 +27,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_WAVPARSE \ @@ -44,59 +45,62 @@ extern "C" { #define GST_WAVPARSE_UNKNOWN 0 /* initialized state */ -#define GST_WAVPARSE_START 1 /* At the start */ +#define GST_WAVPARSE_START 1 /* At the start */ #define GST_WAVPARSE_DATA 2 /* in data region */ #define GST_WAVPARSE_OTHER 3 /* in unknown region */ - -typedef struct _GstWavParse GstWavParse; -typedef struct _GstWavParseClass GstWavParseClass; - -struct _GstWavParse { - GstElement element; - - GstByteStream *bs; - /* pads */ - GstPad *sinkpad,*srcpad; - - /* WAVE decoding state */ - gint state; - - /* format of audio, see defines below */ - gint format; - - /* useful audio data */ - gint bps; - gint rate; - gint channels; - gint width; - - int dataleft; - int byteoffset; - - gboolean seek_pending; - guint64 seek_offset; - - GstBuffer *buf; -}; - -struct _GstWavParseClass { - GstElementClass parent_class; -}; - -GType gst_wavparse_get_type(void); - -typedef struct _GstWavParseFormat GstWavParseFormat; - -struct _GstWavParseFormat { - gint16 wFormatTag; - guint16 wChannels; - guint32 dwSamplesPerSec; - guint32 dwAvgBytesPerSec; - guint16 wBlockAlign; - guint16 wBitsPerSample; -}; - - + + typedef struct _GstWavParse GstWavParse; + typedef struct _GstWavParseClass GstWavParseClass; + + struct _GstWavParse + { + GstElement element; + + GstByteStream *bs; + /* pads */ + GstPad *sinkpad, *srcpad; + + /* WAVE decoding state */ + gint state; + + /* format of audio, see defines below */ + gint format; + + /* useful audio data */ + gint bps; + gint rate; + gint channels; + gint width; + + int dataleft; + int byteoffset; + + gboolean seek_pending; + guint64 seek_offset; + + GstBuffer *buf; + }; + + struct _GstWavParseClass + { + GstElementClass parent_class; + }; + + GType gst_wavparse_get_type (void); + + typedef struct _GstWavParseFormat GstWavParseFormat; + + struct _GstWavParseFormat + { + gint16 wFormatTag; + guint16 wChannels; + guint32 dwSamplesPerSec; + guint32 dwAvgBytesPerSec; + guint16 wBlockAlign; + guint16 wBitsPerSample; + }; + + /**** from public Microsoft RIFF docs ******/ #define GST_RIFF_WAVE_FORMAT_UNKNOWN (0x0000) #define GST_RIFF_WAVE_FORMAT_PCM (0x0001) @@ -129,7 +133,7 @@ struct _GstWavParseFormat { #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_WAVPARSE_H__ */ +#endif /* __GST_WAVPARSE_H__ */ diff --git a/gst/wavparse/riff.h b/gst/wavparse/riff.h index 141ed1fa..bf18a1fe 100644 --- a/gst/wavparse/riff.h +++ b/gst/wavparse/riff.h @@ -24,11 +24,12 @@ #include -typedef enum { - GST_RIFF_OK = 0, +typedef enum +{ + GST_RIFF_OK = 0, GST_RIFF_ENOTRIFF = -1, - GST_RIFF_EINVAL = -2, - GST_RIFF_ENOMEM = -3 + GST_RIFF_EINVAL = -2, + GST_RIFF_ENOMEM = -3 } GstRiffReturn; #define MAKE_FOUR_CC(a,b,c,d) GST_MAKE_FOURCC(a,b,c,d) @@ -81,29 +82,29 @@ typedef enum { #define GST_RIFF_FCCH_MSVC MAKE_FOUR_CC('M','S','V','C') /* INFO types - see http://www.saettler.com/RIFFMCI/riffmci.html */ -#define GST_RIFF_INFO_IARL MAKE_FOUR_CC('I','A','R','L') /* location */ -#define GST_RIFF_INFO_IART MAKE_FOUR_CC('I','A','R','T') /* artist */ -#define GST_RIFF_INFO_ICMS MAKE_FOUR_CC('I','C','M','S') /* commissioned */ -#define GST_RIFF_INFO_ICMT MAKE_FOUR_CC('I','C','M','T') /* comment */ -#define GST_RIFF_INFO_ICOP MAKE_FOUR_CC('I','C','O','P') /* copyright */ -#define GST_RIFF_INFO_ICRD MAKE_FOUR_CC('I','C','R','D') /* creation date */ -#define GST_RIFF_INFO_ICRP MAKE_FOUR_CC('I','C','R','P') /* cropped */ -#define GST_RIFF_INFO_IDIM MAKE_FOUR_CC('I','D','I','M') /* dimensions */ -#define GST_RIFF_INFO_IDPI MAKE_FOUR_CC('I','D','P','I') /* dots-per-inch */ -#define GST_RIFF_INFO_IENG MAKE_FOUR_CC('I','E','N','G') /* engineer(s) */ -#define GST_RIFF_INFO_IGNR MAKE_FOUR_CC('I','G','N','R') /* genre */ -#define GST_RIFF_INFO_IKEY MAKE_FOUR_CC('I','K','E','Y') /* keywords */ -#define GST_RIFF_INFO_ILGT MAKE_FOUR_CC('I','L','G','T') /* lightness */ -#define GST_RIFF_INFO_IMED MAKE_FOUR_CC('I','M','E','D') /* medium */ -#define GST_RIFF_INFO_INAM MAKE_FOUR_CC('I','N','A','M') /* name */ -#define GST_RIFF_INFO_IPLT MAKE_FOUR_CC('I','P','L','T') /* palette setting */ -#define GST_RIFF_INFO_IPRD MAKE_FOUR_CC('I','P','R','D') /* product */ -#define GST_RIFF_INFO_ISBJ MAKE_FOUR_CC('I','S','B','J') /* subject */ -#define GST_RIFF_INFO_ISFT MAKE_FOUR_CC('I','S','F','T') /* software */ -#define GST_RIFF_INFO_ISHP MAKE_FOUR_CC('I','S','H','P') /* sharpness */ -#define GST_RIFF_INFO_ISRC MAKE_FOUR_CC('I','S','R','C') /* source */ -#define GST_RIFF_INFO_ISRF MAKE_FOUR_CC('I','S','R','F') /* source form */ -#define GST_RIFF_INFO_ITCH MAKE_FOUR_CC('I','T','C','H') /* technician(s) */ +#define GST_RIFF_INFO_IARL MAKE_FOUR_CC('I','A','R','L') /* location */ +#define GST_RIFF_INFO_IART MAKE_FOUR_CC('I','A','R','T') /* artist */ +#define GST_RIFF_INFO_ICMS MAKE_FOUR_CC('I','C','M','S') /* commissioned */ +#define GST_RIFF_INFO_ICMT MAKE_FOUR_CC('I','C','M','T') /* comment */ +#define GST_RIFF_INFO_ICOP MAKE_FOUR_CC('I','C','O','P') /* copyright */ +#define GST_RIFF_INFO_ICRD MAKE_FOUR_CC('I','C','R','D') /* creation date */ +#define GST_RIFF_INFO_ICRP MAKE_FOUR_CC('I','C','R','P') /* cropped */ +#define GST_RIFF_INFO_IDIM MAKE_FOUR_CC('I','D','I','M') /* dimensions */ +#define GST_RIFF_INFO_IDPI MAKE_FOUR_CC('I','D','P','I') /* dots-per-inch */ +#define GST_RIFF_INFO_IENG MAKE_FOUR_CC('I','E','N','G') /* engineer(s) */ +#define GST_RIFF_INFO_IGNR MAKE_FOUR_CC('I','G','N','R') /* genre */ +#define GST_RIFF_INFO_IKEY MAKE_FOUR_CC('I','K','E','Y') /* keywords */ +#define GST_RIFF_INFO_ILGT MAKE_FOUR_CC('I','L','G','T') /* lightness */ +#define GST_RIFF_INFO_IMED MAKE_FOUR_CC('I','M','E','D') /* medium */ +#define GST_RIFF_INFO_INAM MAKE_FOUR_CC('I','N','A','M') /* name */ +#define GST_RIFF_INFO_IPLT MAKE_FOUR_CC('I','P','L','T') /* palette setting */ +#define GST_RIFF_INFO_IPRD MAKE_FOUR_CC('I','P','R','D') /* product */ +#define GST_RIFF_INFO_ISBJ MAKE_FOUR_CC('I','S','B','J') /* subject */ +#define GST_RIFF_INFO_ISFT MAKE_FOUR_CC('I','S','F','T') /* software */ +#define GST_RIFF_INFO_ISHP MAKE_FOUR_CC('I','S','H','P') /* sharpness */ +#define GST_RIFF_INFO_ISRC MAKE_FOUR_CC('I','S','R','C') /* source */ +#define GST_RIFF_INFO_ISRF MAKE_FOUR_CC('I','S','R','F') /* source form */ +#define GST_RIFF_INFO_ITCH MAKE_FOUR_CC('I','T','C','H') /* technician(s) */ /*********Chunk Names***************/ #define GST_RIFF_FF00 MAKE_FOUR_CC(0xFF,0xFF,0x00,0x00) @@ -182,7 +183,7 @@ typedef enum { #define GST_RIFF_v422 MAKE_FOUR_CC( 'v', '4', '2', '2') #define GST_RIFF_V422 MAKE_FOUR_CC( 'V', '4', '2', '2') #define GST_RIFF_mvi1 MAKE_FOUR_CC( 'm', 'v', 'i', '1') -#define GST_RIFF_MPIX MAKE_FOUR_CC(0x04,0x00, 'i', '1') /* MotionPixels munged their id */ +#define GST_RIFF_MPIX MAKE_FOUR_CC(0x04,0x00, 'i', '1') /* MotionPixels munged their id */ #define GST_RIFF_AURA MAKE_FOUR_CC( 'A', 'U', 'R', 'A') #define GST_RIFF_DMB1 MAKE_FOUR_CC( 'D', 'M', 'B', '1') #define GST_RIFF_dmb1 MAKE_FOUR_CC( 'd', 'm', 'b', '1') @@ -218,7 +219,7 @@ typedef enum { #define GST_RIFF_rpza MAKE_FOUR_CC( 'r', 'p', 'z', 'a') /* And this here's the mistakes that need to be supported */ -#define GST_RIFF_azpr MAKE_FOUR_CC( 'a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */ +#define GST_RIFF_azpr MAKE_FOUR_CC( 'a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */ /*********** FND in MJPG **********/ #define GST_RIFF_ISFT MAKE_FOUR_CC( 'I', 'S', 'F', 'T') @@ -231,21 +232,22 @@ typedef enum { #define GST_RIFF_rec MAKE_FOUR_CC( 'r', 'e', 'c', ' ') /* common data structures */ -struct _gst_riff_avih { - guint32 us_frame; /* microsec per frame */ - guint32 max_bps; /* byte/s overall */ - guint32 pad_gran; /* pad_gran (???) */ +struct _gst_riff_avih +{ + guint32 us_frame; /* microsec per frame */ + guint32 max_bps; /* byte/s overall */ + guint32 pad_gran; /* pad_gran (???) */ guint32 flags; /* flags values */ -#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ -#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ -#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ -#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ -#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ - guint32 tot_frames; /* # of frames (all) */ - guint32 init_frames; /* initial frames (???) */ +#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ +#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ +#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ +#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ +#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ + guint32 tot_frames; /* # of frames (all) */ + guint32 init_frames; /* initial frames (???) */ guint32 streams; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 width; guint32 height; guint32 scale; @@ -254,26 +256,28 @@ struct _gst_riff_avih { guint32 length; }; -struct _gst_riff_strh { - guint32 type; /* stream type */ - guint32 fcc_handler; /* fcc_handler */ +struct _gst_riff_strh +{ + guint32 type; /* stream type */ + guint32 fcc_handler; /* fcc_handler */ guint32 flags; /* flags values */ #define GST_RIFF_STRH_DISABLED 0x000000001 #define GST_RIFF_STRH_VIDEOPALCHANGES 0x000010000 guint32 priority; - guint32 init_frames; /* initial frames (???) */ + guint32 init_frames; /* initial frames (???) */ guint32 scale; guint32 rate; guint32 start; guint32 length; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 quality; guint32 samplesize; /* XXX 16 bytes ? */ }; -struct _gst_riff_strf_vids { /* == BitMapInfoHeader */ +struct _gst_riff_strf_vids +{ /* == BitMapInfoHeader */ guint32 size; guint32 width; guint32 height; @@ -283,13 +287,14 @@ struct _gst_riff_strf_vids { /* == BitMapInfoHeader */ guint32 image_size; guint32 xpels_meter; guint32 ypels_meter; - guint32 num_colors; /* used colors */ - guint32 imp_colors; /* important colors */ + guint32 num_colors; /* used colors */ + guint32 imp_colors; /* important colors */ /* may be more for some codecs */ }; -struct _gst_riff_strf_auds { /* == WaveHeader (?) */ +struct _gst_riff_strf_auds +{ /* == WaveHeader (?) */ guint16 format; /**** from public Microsoft RIFF docs ******/ #define GST_RIFF_WAVE_FORMAT_UNKNOWN (0x0000) @@ -328,7 +333,8 @@ struct _gst_riff_strf_auds { /* == WaveHeader (?) */ guint16 size; }; -struct _gst_riff_strf_iavs { +struct _gst_riff_strf_iavs +{ guint32 DVAAuxSrc; guint32 DVAAuxCtl; guint32 DVAAuxSrc1; @@ -339,26 +345,30 @@ struct _gst_riff_strf_iavs { guint32 DVReserved2; }; -struct _gst_riff_riff { +struct _gst_riff_riff +{ guint32 id; guint32 size; guint32 type; }; -struct _gst_riff_list { +struct _gst_riff_list +{ guint32 id; guint32 size; guint32 type; }; -struct _gst_riff_labl { +struct _gst_riff_labl +{ guint32 id; guint32 size; guint32 identifier; }; -struct _gst_riff_ltxt { +struct _gst_riff_ltxt +{ guint32 id; guint32 size; @@ -371,14 +381,16 @@ struct _gst_riff_ltxt { guint16 codepage; }; -struct _gst_riff_note { +struct _gst_riff_note +{ guint32 id; guint32 size; guint32 identifier; }; -struct _gst_riff_cuepoints { +struct _gst_riff_cuepoints +{ guint32 identifier; guint32 position; guint32 id; @@ -387,19 +399,22 @@ struct _gst_riff_cuepoints { guint32 offset; }; -struct _gst_riff_cue { +struct _gst_riff_cue +{ guint32 id; guint32 size; - guint32 cuepoints; /* Number of cue points held in the data */ + guint32 cuepoints; /* Number of cue points held in the data */ }; -struct _gst_riff_chunk { +struct _gst_riff_chunk +{ guint32 id; guint32 size; }; -struct _gst_riff_index_entry { +struct _gst_riff_index_entry +{ guint32 id; guint32 flags; #define GST_RIFF_IF_LIST (0x00000001L) @@ -410,29 +425,31 @@ struct _gst_riff_index_entry { guint32 size; }; -struct _gst_riff_dmlh { +struct _gst_riff_dmlh +{ guint32 totalframes; }; -typedef struct _gst_riff_riff gst_riff_riff; -typedef struct _gst_riff_list gst_riff_list; -typedef struct _gst_riff_chunk gst_riff_chunk; -typedef struct _gst_riff_index_entry gst_riff_index_entry; - -typedef struct _gst_riff_avih gst_riff_avih; -typedef struct _gst_riff_strh gst_riff_strh; -typedef struct _gst_riff_strf_vids gst_riff_strf_vids; -typedef struct _gst_riff_strf_auds gst_riff_strf_auds; -typedef struct _gst_riff_strf_iavs gst_riff_strf_iavs; -typedef struct _gst_riff_dmlh gst_riff_dmlh; -typedef struct _GstRiffChunk GstRiffChunk; - -struct _GstRiffChunk { +typedef struct _gst_riff_riff gst_riff_riff; +typedef struct _gst_riff_list gst_riff_list; +typedef struct _gst_riff_chunk gst_riff_chunk; +typedef struct _gst_riff_index_entry gst_riff_index_entry; + +typedef struct _gst_riff_avih gst_riff_avih; +typedef struct _gst_riff_strh gst_riff_strh; +typedef struct _gst_riff_strf_vids gst_riff_strf_vids; +typedef struct _gst_riff_strf_auds gst_riff_strf_auds; +typedef struct _gst_riff_strf_iavs gst_riff_strf_iavs; +typedef struct _gst_riff_dmlh gst_riff_dmlh; +typedef struct _GstRiffChunk GstRiffChunk; + +struct _GstRiffChunk +{ gulong offset; guint32 id; guint32 size; - guint32 form; /* for list chunks */ + guint32 form; /* for list chunks */ gchar *data; }; diff --git a/sys/oss/gstossaudio.c b/sys/oss/gstossaudio.c index 4387eb07..ecbbd9bc 100644 --- a/sys/oss/gstossaudio.c +++ b/sys/oss/gstossaudio.c @@ -32,17 +32,17 @@ extern gchar *__gst_oss_plugin_dir; GST_DEBUG_CATEGORY (oss_debug); static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstaudio")) return FALSE; if (!gst_element_register (plugin, "ossmixer", GST_RANK_PRIMARY, - GST_TYPE_OSSELEMENT) || + GST_TYPE_OSSELEMENT) || !gst_element_register (plugin, "osssrc", GST_RANK_PRIMARY, - GST_TYPE_OSSSRC) || + GST_TYPE_OSSSRC) || !gst_element_register (plugin, "osssink", GST_RANK_PRIMARY, - GST_TYPE_OSSSINK)) { + GST_TYPE_OSSSINK)) { return FALSE; } @@ -56,14 +56,8 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "ossaudio", - "OSS (Open Sound System) support for GStreamer", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "ossaudio", + "OSS (Open Sound System) support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/sys/oss/gstosselement.c b/sys/oss/gstosselement.c index 7dfac627..56dd20da 100644 --- a/sys/oss/gstosselement.c +++ b/sys/oss/gstosselement.c @@ -39,7 +39,8 @@ #include "gstosselement.h" #include "gstossmixer.h" -enum { +enum +{ ARG_0, ARG_DEVICE, ARG_MIXERDEV, @@ -47,49 +48,45 @@ enum { }; /* elementfactory information */ -static GstElementDetails gst_osselement_details = GST_ELEMENT_DETAILS ( - "Audio Mixer (OSS)", - "Generic/Audio", - "OSS-based mixer element", - "Ronald Bultje " -); - -static void gst_osselement_base_init (GstOssElementClass *klass); -static void gst_osselement_class_init (GstOssElementClass *klass); - -static void gst_ossprobe_interface_init (GstPropertyProbeInterface *iface); -static void gst_osselement_init (GstOssElement *oss); -static void gst_osselement_dispose (GObject *object); - -static void gst_osselement_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_osselement_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static GstElementStateReturn gst_osselement_change_state (GstElement *element); +static GstElementDetails gst_osselement_details = +GST_ELEMENT_DETAILS ("Audio Mixer (OSS)", + "Generic/Audio", + "OSS-based mixer element", + "Ronald Bultje "); + +static void gst_osselement_base_init (GstOssElementClass * klass); +static void gst_osselement_class_init (GstOssElementClass * klass); + +static void gst_ossprobe_interface_init (GstPropertyProbeInterface * iface); +static void gst_osselement_init (GstOssElement * oss); +static void gst_osselement_dispose (GObject * object); + +static void gst_osselement_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_osselement_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_osselement_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_osssrc_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_osselement_get_type (void) +gst_osselement_get_type (void) { static GType osselement_type = 0; if (!osselement_type) { static const GTypeInfo osselement_info = { - sizeof(GstOssElementClass), - (GBaseInitFunc)gst_osselement_base_init, + sizeof (GstOssElementClass), + (GBaseInitFunc) gst_osselement_base_init, NULL, - (GClassInitFunc)gst_osselement_class_init, + (GClassInitFunc) gst_osselement_class_init, NULL, NULL, - sizeof(GstOssElement), + sizeof (GstOssElement), 0, - (GInstanceInitFunc)gst_osselement_init + (GInstanceInitFunc) gst_osselement_init }; static const GInterfaceInfo ossiface_info = { (GInterfaceInitFunc) gst_oss_interface_init, @@ -108,24 +105,20 @@ gst_osselement_get_type (void) }; osselement_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstOssElement", - &osselement_info, 0); + "GstOssElement", &osselement_info, 0); g_type_add_interface_static (osselement_type, - GST_TYPE_IMPLEMENTS_INTERFACE, - &ossiface_info); + GST_TYPE_IMPLEMENTS_INTERFACE, &ossiface_info); g_type_add_interface_static (osselement_type, - GST_TYPE_MIXER, - &ossmixer_info); + GST_TYPE_MIXER, &ossmixer_info); g_type_add_interface_static (osselement_type, - GST_TYPE_PROPERTY_PROBE, - &ossprobe_info); + GST_TYPE_PROPERTY_PROBE, &ossprobe_info); } return osselement_type; } static void -gst_osselement_base_init (GstOssElementClass *klass) +gst_osselement_base_init (GstOssElementClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -135,36 +128,36 @@ gst_osselement_base_init (GstOssElementClass *klass) } static void -gst_osselement_class_init (GstOssElementClass *klass) +gst_osselement_class_init (GstOssElementClass * 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); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DEVICE, - g_param_spec_string ("device", "Device", "OSS device (/dev/dspN usually)", - "default", G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MIXERDEV, - g_param_spec_string ("mixerdev", "Mixer device", - "OSS mixer device (/dev/mixerN usually)", - "default", G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DEVICE_NAME, - g_param_spec_string ("device_name", "Device name", "Name of the device", - NULL, G_PARAM_READABLE)); - + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE, + g_param_spec_string ("device", "Device", "OSS device (/dev/dspN usually)", + "default", G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MIXERDEV, + g_param_spec_string ("mixerdev", "Mixer device", + "OSS mixer device (/dev/mixerN usually)", + "default", G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEVICE_NAME, + g_param_spec_string ("device_name", "Device name", "Name of the device", + NULL, G_PARAM_READABLE)); + gobject_class->set_property = gst_osselement_set_property; gobject_class->get_property = gst_osselement_get_property; - gobject_class->dispose = gst_osselement_dispose; + gobject_class->dispose = gst_osselement_dispose; gstelement_class->change_state = gst_osselement_change_state; } static const GList * -gst_ossprobe_get_properties (GstPropertyProbe *probe) +gst_ossprobe_get_properties (GstPropertyProbe * probe) { GObjectClass *klass = G_OBJECT_GET_CLASS (probe); static GList *list = NULL; @@ -180,10 +173,8 @@ gst_ossprobe_get_properties (GstPropertyProbe *probe) #define MAX_OSS_DEVICES 16 static void -gst_osselement_probe (gchar *device_base, - gint device_num, - gchar **name, - dev_t *devno) +gst_osselement_probe (gchar * device_base, + gint device_num, gchar ** name, dev_t * devno) { gchar *device = NULL; struct stat s; @@ -208,22 +199,22 @@ gst_osselement_probe (gchar *device_base, *name = device; *devno = s.st_rdev; - return; + return; end: g_free (device); } -static GList* -device_combination_append (GList *device_combinations, - GstOssDeviceCombination *combi) +static GList * +device_combination_append (GList * device_combinations, + GstOssDeviceCombination * combi) { GList *it; for (it = device_combinations; it != NULL; it = it->next) { GstOssDeviceCombination *cur; - cur = (GstOssDeviceCombination*)it->data; + cur = (GstOssDeviceCombination *) it->data; if (cur->dev == combi->dev) { return device_combinations; } @@ -233,8 +224,7 @@ device_combination_append (GList *device_combinations, } static gboolean -gst_osselement_class_probe_devices (GstOssElementClass *klass, - gboolean check) +gst_osselement_class_probe_devices (GstOssElementClass * klass, gboolean check) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); static gboolean init = FALSE; @@ -249,6 +239,7 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass, padtempllist = gst_element_class_get_pad_template_list (eklass); if (padtempllist != NULL) { GstPadTemplate *firstpadtempl = padtempllist->data; + if (GST_PAD_TEMPLATE_DIRECTION (firstpadtempl) == GST_PAD_SINK) { openmode = O_WRONLY; } @@ -258,9 +249,12 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass, if (!init && !check) { #define MIXER 0 #define DSP 1 - gchar *dev_base[][2] = { {"/dev/mixer", "/dev/dsp"}, - {"/dev/sound/mixer", "/dev/sound/dsp"}, - {NULL, NULL}}; + gchar *dev_base[][2] = { {"/dev/mixer", "/dev/dsp"} + , + {"/dev/sound/mixer", "/dev/sound/dsp"} + , + {NULL, NULL} + }; gint n; gint base; @@ -285,36 +279,36 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass, dev_t dsp_dev; dev_t mixer_dev; - gst_osselement_probe (dev_base[base][DSP], n, &dsp, &dsp_dev); + gst_osselement_probe (dev_base[base][DSP], n, &dsp, &dsp_dev); if (dsp == NULL) { continue; } gst_osselement_probe (dev_base[base][MIXER], n, &mixer, &mixer_dev); /* does the device exist (can we open them)? */ - + /* we just check the dsp. we assume the mixer always works. * we don't need a mixer anyway (says OSS)... If we are a * mixer element, we use the mixer anyway. */ if ((fd = open (mixer ? mixer : - dsp, openmode | O_NONBLOCK)) > 0 || errno == EBUSY) { + dsp, openmode | O_NONBLOCK)) > 0 || errno == EBUSY) { GstOssDeviceCombination *combi; - + if (fd > 0) close (fd); - + /* yay! \o/ */ combi = g_new0 (GstOssDeviceCombination, 1); - combi->dsp = dsp; + combi->dsp = dsp; combi->mixer = mixer; device_combinations = device_combination_append (device_combinations, - combi); + combi); } else { g_free (dsp); g_free (mixer); } } } - + init = TRUE; } @@ -324,7 +318,7 @@ gst_osselement_class_probe_devices (GstOssElementClass *klass, } static GValueArray * -gst_osselement_class_list_devices (GstOssElementClass *klass) +gst_osselement_class_list_devices (GstOssElementClass * klass) { GValueArray *array; GValue value = { 0 }; @@ -350,9 +344,8 @@ gst_osselement_class_list_devices (GstOssElementClass *klass) } static void -gst_ossprobe_probe_property (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_ossprobe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); @@ -367,9 +360,8 @@ gst_ossprobe_probe_property (GstPropertyProbe *probe, } static gboolean -gst_ossprobe_needs_probe (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_ossprobe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); gboolean ret = FALSE; @@ -387,9 +379,8 @@ gst_ossprobe_needs_probe (GstPropertyProbe *probe, } static GValueArray * -gst_ossprobe_get_values (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_ossprobe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { GstOssElementClass *klass = GST_OSSELEMENT_GET_CLASS (probe); GValueArray *array = NULL; @@ -407,16 +398,16 @@ gst_ossprobe_get_values (GstPropertyProbe *probe, } static void -gst_ossprobe_interface_init (GstPropertyProbeInterface *iface) +gst_ossprobe_interface_init (GstPropertyProbeInterface * iface) { iface->get_properties = gst_ossprobe_get_properties; iface->probe_property = gst_ossprobe_probe_property; - iface->needs_probe = gst_ossprobe_needs_probe; - iface->get_values = gst_ossprobe_get_values; + iface->needs_probe = gst_ossprobe_needs_probe; + iface->get_values = gst_ossprobe_get_values; } -static void -gst_osselement_init (GstOssElement *oss) +static void +gst_osselement_init (GstOssElement * oss) { oss->device = g_strdup ("/dev/dsp"); oss->mixer_dev = g_strdup ("/dev/mixer"); @@ -429,7 +420,7 @@ gst_osselement_init (GstOssElement *oss) } static void -gst_osselement_dispose (GObject *object) +gst_osselement_dispose (GObject * object) { GstOssElement *oss = (GstOssElement *) object; @@ -439,8 +430,8 @@ gst_osselement_dispose (GObject *object) G_OBJECT_CLASS (parent_class)->dispose (object); } -void -gst_osselement_reset (GstOssElement *oss) +void +gst_osselement_reset (GstOssElement * oss) { oss->law = 0; oss->endianness = G_BYTE_ORDER; @@ -457,14 +448,14 @@ gst_osselement_reset (GstOssElement *oss) oss->format = AFMT_S16_BE; #else oss->format = AFMT_S16_LE; -#endif /* WORDS_BIGENDIAN */ +#endif /* WORDS_BIGENDIAN */ } -static gboolean -gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint depth, - gint *format, gint *bps) +static gboolean +gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, + gint depth, gint * format, gint * bps) { - if (width != depth) + if (width != depth) return FALSE; *bps = 1; @@ -472,52 +463,39 @@ gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint de if (law == 0) { if (width == 16) { if (sign == TRUE) { - if (endianness == G_LITTLE_ENDIAN) { + if (endianness == G_LITTLE_ENDIAN) { *format = AFMT_S16_LE; - GST_DEBUG ( - "16 bit signed LE, no law (%d)", *format); - } - else if (endianness == G_BIG_ENDIAN) { + GST_DEBUG ("16 bit signed LE, no law (%d)", *format); + } else if (endianness == G_BIG_ENDIAN) { *format = AFMT_S16_BE; - GST_DEBUG ( - "16 bit signed BE, no law (%d)", *format); + GST_DEBUG ("16 bit signed BE, no law (%d)", *format); } - } - else { - if (endianness == G_LITTLE_ENDIAN) { + } else { + if (endianness == G_LITTLE_ENDIAN) { *format = AFMT_U16_LE; - GST_DEBUG ( - "16 bit unsigned LE, no law (%d)", *format); - } - else if (endianness == G_BIG_ENDIAN) { + GST_DEBUG ("16 bit unsigned LE, no law (%d)", *format); + } else if (endianness == G_BIG_ENDIAN) { *format = AFMT_U16_BE; - GST_DEBUG ( - "16 bit unsigned BE, no law (%d)", *format); + GST_DEBUG ("16 bit unsigned BE, no law (%d)", *format); } } *bps = 2; - } - else if (width == 8) { + } else if (width == 8) { if (sign == TRUE) { *format = AFMT_S8; - GST_DEBUG ( - "8 bit signed, no law (%d)", *format); - } - else { - *format = AFMT_U8; - GST_DEBUG ( - "8 bit unsigned, no law (%d)", *format); + GST_DEBUG ("8 bit signed, no law (%d)", *format); + } else { + *format = AFMT_U8; + GST_DEBUG ("8 bit unsigned, no law (%d)", *format); } *bps = 1; } } else if (law == 1) { *format = AFMT_MU_LAW; - GST_DEBUG ( - "mu law (%d)", *format); + GST_DEBUG ("mu law (%d)", *format); } else if (law == 2) { *format = AFMT_A_LAW; - GST_DEBUG ( - "a law (%d)", *format); + GST_DEBUG ("a law (%d)", *format); } else { g_critical ("unknown law"); return FALSE; @@ -526,34 +504,33 @@ gst_ossformat_get (gint law, gint endianness, gboolean sign, gint width, gint de return TRUE; } -gboolean -gst_osselement_parse_caps (GstOssElement *oss, const GstCaps *caps) +gboolean +gst_osselement_parse_caps (GstOssElement * oss, const GstCaps * caps) { gint bps, format; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", &oss->width); - gst_structure_get_int (structure, "depth", &oss->depth); - - if (oss->width != oss->depth) + gst_structure_get_int (structure, "width", &oss->width); + gst_structure_get_int (structure, "depth", &oss->depth); + + if (oss->width != oss->depth) + return FALSE; + + gst_structure_get_int (structure, "law", &oss->law); + gst_structure_get_int (structure, "endianness", &oss->endianness); + gst_structure_get_boolean (structure, "signed", &oss->sign); + + if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, + oss->width, oss->depth, &format, &bps)) { + GST_DEBUG ("could not get format"); return FALSE; - - gst_structure_get_int (structure, "law", &oss->law); - gst_structure_get_int (structure, "endianness", &oss->endianness); - gst_structure_get_boolean (structure, "signed", &oss->sign); - - if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, - oss->width, oss->depth, &format, &bps)) - { - GST_DEBUG ("could not get format"); - return FALSE; } - gst_structure_get_int (structure, "channels", &oss->channels); - gst_structure_get_int (structure, "rate", &oss->rate); - + gst_structure_get_int (structure, "channels", &oss->channels); + gst_structure_get_int (structure, "rate", &oss->rate); + oss->bps = bps * oss->channels * oss->rate; oss->format = format; @@ -571,38 +548,37 @@ G_STMT_START { \ gst_structure_get_boolean (structure, name, dest); \ } G_STMT_END -gboolean -gst_osselement_merge_fixed_caps (GstOssElement *oss, GstCaps *caps) +gboolean +gst_osselement_merge_fixed_caps (GstOssElement * oss, GstCaps * caps) { gint bps, format; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); - + /* peel off fixed stuff from the caps */ - gst_structure_get_int (structure, "law", &oss->law); + gst_structure_get_int (structure, "law", &oss->law); gst_structure_get_int (structure, "endianness", &oss->endianness); - gst_structure_get_boolean (structure, "signed", &oss->sign); - gst_structure_get_int (structure, "width", &oss->width); - gst_structure_get_int (structure, "depth", &oss->depth); - - if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, - oss->width, oss->depth, &format, &bps)) - { - return FALSE; + gst_structure_get_boolean (structure, "signed", &oss->sign); + gst_structure_get_int (structure, "width", &oss->width); + gst_structure_get_int (structure, "depth", &oss->depth); + + if (!gst_ossformat_get (oss->law, oss->endianness, oss->sign, + oss->width, oss->depth, &format, &bps)) { + return FALSE; } - gst_structure_get_int (structure, "rate", &oss->rate); - gst_structure_get_int (structure, "channels", &oss->channels); - + gst_structure_get_int (structure, "rate", &oss->rate); + gst_structure_get_int (structure, "channels", &oss->channels); + oss->bps = bps * oss->channels * oss->rate; oss->format = format; - + return TRUE; } -gboolean -gst_osselement_sync_parms (GstOssElement *oss) +gboolean +gst_osselement_sync_parms (GstOssElement * oss) { audio_buf_info space; int frag; @@ -613,33 +589,32 @@ gst_osselement_sync_parms (GstOssElement *oss) if (oss->fd == -1) return FALSE; - + if (oss->fragment >> 16) frag = oss->fragment; else frag = 0x7FFF0000 | oss->fragment; - - GST_INFO ("osselement: setting sound card to %dHz %d format %s (%08x fragment)", - oss->rate, oss->format, - (oss->channels == 2) ? "stereo" : "mono", frag); + + GST_INFO + ("osselement: setting sound card to %dHz %d format %s (%08x fragment)", + oss->rate, oss->format, (oss->channels == 2) ? "stereo" : "mono", frag); ioctl (oss->fd, SNDCTL_DSP_SETFRAGMENT, &frag); ioctl (oss->fd, SNDCTL_DSP_RESET, 0); - target_format = oss->format; + target_format = oss->format; target_channels = oss->channels; - target_rate = oss->rate; + target_rate = oss->rate; - ioctl (oss->fd, SNDCTL_DSP_SETFMT, &oss->format); + ioctl (oss->fd, SNDCTL_DSP_SETFMT, &oss->format); ioctl (oss->fd, SNDCTL_DSP_CHANNELS, &oss->channels); - ioctl (oss->fd, SNDCTL_DSP_SPEED, &oss->rate); + ioctl (oss->fd, SNDCTL_DSP_SPEED, &oss->rate); ioctl (oss->fd, SNDCTL_DSP_GETBLKSIZE, &oss->fragment_size); if (oss->mode == GST_OSSELEMENT_WRITE) { ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &space); - } - else { + } else { ioctl (oss->fd, SNDCTL_DSP_GETISPACE, &space); } @@ -651,25 +626,26 @@ gst_osselement_sync_parms (GstOssElement *oss) frag_ln++; } oss->fragment = space.fragstotal << 16 | frag_ln; - + GST_INFO ("osselement: set sound card to %dHz, %d format, %s " - "(%d bytes buffer, %08x fragment)", - oss->rate, oss->format, - (oss->channels == 2) ? "stereo" : "mono", - space.bytes, oss->fragment); + "(%d bytes buffer, %08x fragment)", + oss->rate, oss->format, + (oss->channels == 2) ? "stereo" : "mono", space.bytes, oss->fragment); oss->fragment_time = (GST_SECOND * oss->fragment_size) / oss->bps; - GST_INFO ("fragment time %u %" G_GUINT64_FORMAT "\n", - oss->bps, oss->fragment_time); + GST_INFO ("fragment time %u %" G_GUINT64_FORMAT "\n", + oss->bps, oss->fragment_time); - if (target_format != oss->format || - target_channels != oss->channels || - target_rate != oss->rate) - { + if (target_format != oss->format || + target_channels != oss->channels || target_rate != oss->rate) { if (target_channels != oss->channels) - g_warning ("couldn't set the right number of channels (wanted %d, got %d), enjoy the tone difference", target_channels, oss->channels); + g_warning + ("couldn't set the right number of channels (wanted %d, got %d), enjoy the tone difference", + target_channels, oss->channels); if (target_rate != oss->rate) - g_warning ("couldn't set the right sample rate (wanted %d, got %d), enjoy the speed difference", target_rate, oss->rate); + g_warning + ("couldn't set the right sample rate (wanted %d, got %d), enjoy the speed difference", + target_rate, oss->rate); if (target_format != oss->format) g_warning ("couldn't set requested OSS format, enjoy the noise :)"); /* we could eventually return FALSE here, or just do some additional tests @@ -679,7 +655,7 @@ gst_osselement_sync_parms (GstOssElement *oss) } static gboolean -gst_osselement_open_audio (GstOssElement *oss) +gst_osselement_open_audio (GstOssElement * oss) { gint caps; GstOssOpenMode mode = GST_OSSELEMENT_READ; @@ -693,6 +669,7 @@ gst_osselement_open_audio (GstOssElement *oss) padlist = gst_element_get_pad_list (GST_ELEMENT (oss)); if (padlist != NULL) { GstPad *firstpad = padlist->data; + if (GST_PAD_IS_SINK (firstpad)) { mode = GST_OSSELEMENT_WRITE; } @@ -708,12 +685,11 @@ gst_osselement_open_audio (GstOssElement *oss) if (oss->fd >= 0) { close (oss->fd); - + /* re-open the sound device in blocking mode */ oss->fd = open (oss->device, O_WRONLY); } - } - else { + } else { oss->fd = open (oss->device, O_RDONLY); } @@ -721,37 +697,37 @@ gst_osselement_open_audio (GstOssElement *oss) switch (errno) { case EBUSY: GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, - (_("OSS device \"%s\" is already in use by another program."), oss->device), - (NULL)); + (_("OSS device \"%s\" is already in use by another program."), + oss->device), (NULL)); break; case EACCES: case ETXTBSY: - if (mode == GST_OSSELEMENT_WRITE) + if (mode == GST_OSSELEMENT_WRITE) GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, - (_("Could not access device \"%s\", check its permissions."), oss->device), - GST_ERROR_SYSTEM); - else + (_("Could not access device \"%s\", check its permissions."), + oss->device), GST_ERROR_SYSTEM); + else GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, - (_("Could not access device \"%s\", check its permissions."), oss->device), - GST_ERROR_SYSTEM); + (_("Could not access device \"%s\", check its permissions."), + oss->device), GST_ERROR_SYSTEM); break; case ENXIO: case ENODEV: case ENOENT: GST_ELEMENT_ERROR (oss, RESOURCE, NOT_FOUND, - (_("Device \"%s\" does not exist."), oss->device), - GST_ERROR_SYSTEM); + (_("Device \"%s\" does not exist."), oss->device), + GST_ERROR_SYSTEM); break; default: /* FIXME: strerror is not threadsafe */ - if (mode == GST_OSSELEMENT_WRITE) + if (mode == GST_OSSELEMENT_WRITE) GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, - (_("Could not open device \"%s\" for writing."), oss->device), - GST_ERROR_SYSTEM); - else + (_("Could not open device \"%s\" for writing."), oss->device), + GST_ERROR_SYSTEM); + else GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, - (_("Could not open device \"%s\" for reading."), oss->device), - GST_ERROR_SYSTEM); + (_("Could not open device \"%s\" for reading."), oss->device), + GST_ERROR_SYSTEM); break; } return FALSE; @@ -765,40 +741,58 @@ gst_osselement_open_audio (GstOssElement *oss) GST_INFO ("osselement: Capabilities %08x", caps); - if (caps & DSP_CAP_DUPLEX) GST_INFO ( "osselement: Full duplex"); - if (caps & DSP_CAP_REALTIME) GST_INFO ( "osselement: Realtime"); - if (caps & DSP_CAP_BATCH) GST_INFO ( "osselement: Batch"); - if (caps & DSP_CAP_COPROC) GST_INFO ( "osselement: Has coprocessor"); - if (caps & DSP_CAP_TRIGGER) GST_INFO ( "osselement: Trigger"); - if (caps & DSP_CAP_MMAP) GST_INFO ( "osselement: Direct access"); + if (caps & DSP_CAP_DUPLEX) + GST_INFO ("osselement: Full duplex"); + if (caps & DSP_CAP_REALTIME) + GST_INFO ("osselement: Realtime"); + if (caps & DSP_CAP_BATCH) + GST_INFO ("osselement: Batch"); + if (caps & DSP_CAP_COPROC) + GST_INFO ("osselement: Has coprocessor"); + if (caps & DSP_CAP_TRIGGER) + GST_INFO ("osselement: Trigger"); + if (caps & DSP_CAP_MMAP) + GST_INFO ("osselement: Direct access"); #ifdef DSP_CAP_MULTI - if (caps & DSP_CAP_MULTI) GST_INFO ( "osselement: Multiple open"); + if (caps & DSP_CAP_MULTI) + GST_INFO ("osselement: Multiple open"); #endif /* DSP_CAP_MULTI */ #ifdef DSP_CAP_BIND - if (caps & DSP_CAP_BIND) GST_INFO ( "osselement: Channel binding"); + if (caps & DSP_CAP_BIND) + GST_INFO ("osselement: Channel binding"); #endif /* DSP_CAP_BIND */ - ioctl(oss->fd, SNDCTL_DSP_GETFMTS, &caps); - - GST_INFO ( "osselement: Formats %08x", caps); - if (caps & AFMT_MU_LAW) GST_INFO ( "osselement: MU_LAW"); - if (caps & AFMT_A_LAW) GST_INFO ( "osselement: A_LAW"); - if (caps & AFMT_IMA_ADPCM) GST_INFO ( "osselement: IMA_ADPCM"); - if (caps & AFMT_U8) GST_INFO ( "osselement: U8"); - if (caps & AFMT_S16_LE) GST_INFO ( "osselement: S16_LE"); - if (caps & AFMT_S16_BE) GST_INFO ( "osselement: S16_BE"); - if (caps & AFMT_S8) GST_INFO ( "osselement: S8"); - if (caps & AFMT_U16_LE) GST_INFO ( "osselement: U16_LE"); - if (caps & AFMT_U16_BE) GST_INFO ( "osselement: U16_BE"); - if (caps & AFMT_MPEG) GST_INFO ( "osselement: MPEG"); + ioctl (oss->fd, SNDCTL_DSP_GETFMTS, &caps); + + GST_INFO ("osselement: Formats %08x", caps); + if (caps & AFMT_MU_LAW) + GST_INFO ("osselement: MU_LAW"); + if (caps & AFMT_A_LAW) + GST_INFO ("osselement: A_LAW"); + if (caps & AFMT_IMA_ADPCM) + GST_INFO ("osselement: IMA_ADPCM"); + if (caps & AFMT_U8) + GST_INFO ("osselement: U8"); + if (caps & AFMT_S16_LE) + GST_INFO ("osselement: S16_LE"); + if (caps & AFMT_S16_BE) + GST_INFO ("osselement: S16_BE"); + if (caps & AFMT_S8) + GST_INFO ("osselement: S8"); + if (caps & AFMT_U16_LE) + GST_INFO ("osselement: U16_LE"); + if (caps & AFMT_U16_BE) + GST_INFO ("osselement: U16_BE"); + if (caps & AFMT_MPEG) + GST_INFO ("osselement: MPEG"); #ifdef AFMT_AC3 - if (caps & AFMT_AC3) GST_INFO ( "osselement: AC3"); + if (caps & AFMT_AC3) + GST_INFO ("osselement: AC3"); #endif - GST_INFO ("osselement: opened audio (%s) with fd=%d", - oss->device, oss->fd); + GST_INFO ("osselement: opened audio (%s) with fd=%d", oss->device, oss->fd); oss->caps = caps; @@ -809,23 +803,21 @@ do_mixer: } static void -gst_osselement_close_audio (GstOssElement *oss) +gst_osselement_close_audio (GstOssElement * oss) { gst_ossmixer_free_list (oss); - if (oss->fd < 0) + if (oss->fd < 0) return; - close(oss->fd); + close (oss->fd); oss->fd = -1; } gboolean -gst_osselement_convert (GstOssElement *oss, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value) +gst_osselement_convert (GstOssElement * oss, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; @@ -840,38 +832,38 @@ gst_osselement_convert (GstOssElement *oss, switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_TIME: + case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / oss->bps; - break; - case GST_FORMAT_DEFAULT: + break; + case GST_FORMAT_DEFAULT: *dest_value = src_value / (oss->width * oss->channels / 8); - break; - default: - res = FALSE; + break; + default: + res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_BYTES: + case GST_FORMAT_BYTES: *dest_value = src_value * oss->bps / GST_SECOND; - break; - case GST_FORMAT_DEFAULT: + break; + case GST_FORMAT_DEFAULT: *dest_value = src_value * oss->rate / GST_SECOND; - break; - default: - res = FALSE; + break; + default: + res = FALSE; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_TIME: + case GST_FORMAT_TIME: *dest_value = src_value * GST_SECOND / oss->rate; - break; - case GST_FORMAT_BYTES: + break; + case GST_FORMAT_BYTES: *dest_value = src_value * oss->width * oss->channels / 8; - break; - default: - res = FALSE; + break; + default: + res = FALSE; } break; default: @@ -881,11 +873,9 @@ gst_osselement_convert (GstOssElement *oss, return res; } -static void -gst_osselement_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +static void +gst_osselement_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstOssElement *oss = GST_OSSELEMENT (object); @@ -894,34 +884,34 @@ gst_osselement_set_property (GObject *object, /* disallow changing the device while it is opened get_property("device") should return the right one */ if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) { - g_free (oss->device); - oss->device = g_strdup (g_value_get_string (value)); + g_free (oss->device); + oss->device = g_strdup (g_value_get_string (value)); - /* let's assume that if we have a device map for the mixer, + /* let's assume that if we have a device map for the mixer, * we're allowed to do all that automagically here */ - if (GST_OSSELEMENT_GET_CLASS (oss)->device_combinations != NULL) { - GList *list = GST_OSSELEMENT_GET_CLASS (oss)->device_combinations; + if (GST_OSSELEMENT_GET_CLASS (oss)->device_combinations != NULL) { + GList *list = GST_OSSELEMENT_GET_CLASS (oss)->device_combinations; - while (list) { - GstOssDeviceCombination *combi = list->data; + while (list) { + GstOssDeviceCombination *combi = list->data; - if (!strcmp (combi->dsp, oss->device)) { - g_free (oss->mixer_dev); - oss->mixer_dev = g_strdup (combi->mixer); - break; - } + if (!strcmp (combi->dsp, oss->device)) { + g_free (oss->mixer_dev); + oss->mixer_dev = g_strdup (combi->mixer); + break; + } - list = list->next; - } - } + list = list->next; + } + } } break; case ARG_MIXERDEV: /* disallow changing the device while it is opened get_property("mixerdev") should return the right one */ if (gst_element_get_state (GST_ELEMENT (oss)) == GST_STATE_NULL) { - g_free (oss->mixer_dev); - oss->mixer_dev = g_strdup (g_value_get_string (value)); + g_free (oss->mixer_dev); + oss->mixer_dev = g_strdup (g_value_get_string (value)); } break; default: @@ -929,11 +919,9 @@ gst_osselement_set_property (GObject *object, } } -static void -gst_osselement_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +static void +gst_osselement_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstOssElement *oss = GST_OSSELEMENT (object); @@ -953,15 +941,15 @@ gst_osselement_get_property (GObject *object, } } -static GstElementStateReturn -gst_osselement_change_state (GstElement *element) +static GstElementStateReturn +gst_osselement_change_state (GstElement * element) { GstOssElement *oss = GST_OSSELEMENT (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: if (!gst_osselement_open_audio (oss)) { - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } GST_INFO ("osselement: opened sound device"); break; @@ -973,7 +961,7 @@ gst_osselement_change_state (GstElement *element) default: break; } - + if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); diff --git a/sys/oss/gstosselement.h b/sys/oss/gstosselement.h index 3ce84a2c..1b73ec49 100644 --- a/sys/oss/gstosselement.h +++ b/sys/oss/gstosselement.h @@ -30,7 +30,6 @@ GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug G_BEGIN_DECLS - #define GST_TYPE_OSSELEMENT \ (gst_osselement_get_type()) #define GST_OSSELEMENT(obj) \ @@ -43,16 +42,17 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSELEMENT)) #define GST_OSSELEMENT_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OSSELEMENT, GstOssElementClass)) - typedef struct _GstOssElement GstOssElement; typedef struct _GstOssElementClass GstOssElementClass; -typedef enum { +typedef enum +{ GST_OSSELEMENT_READ, GST_OSSELEMENT_WRITE, } GstOssOpenMode; -typedef struct _GstOssDeviceCombination { +typedef struct _GstOssDeviceCombination +{ gchar *dsp, *mixer; dev_t dev; } GstOssDeviceCombination; @@ -60,65 +60,57 @@ typedef struct _GstOssDeviceCombination { struct _GstOssElement { /* yes, we're a gstelement too */ - GstElement parent; + GstElement parent; - gchar *device, - *mixer_dev; + gchar *device, *mixer_dev; /* device state */ - int fd; - int caps; /* the capabilities */ - gint format; - gint fragment; - guint64 fragment_time; - gint fragment_size; + int fd; + int caps; /* the capabilities */ + gint format; + gint fragment; + guint64 fragment_time; + gint fragment_size; GstOssOpenMode mode; /* stats bytes per *second* */ - guint bps; + guint bps; /* parameters */ - gint law; - gint endianness; - gboolean sign; - gint width; - gint depth; - gint channels; - gint rate; + gint law; + gint endianness; + gboolean sign; + gint width; + gint depth; + gint channels; + gint rate; /* mixer stuff */ - GList *tracklist; - guint32 stereomask, - recdevs, - recmask, - mixcaps; - gint mixer_fd; - gchar *device_name; + GList *tracklist; + guint32 stereomask, recdevs, recmask, mixcaps; + gint mixer_fd; + gchar *device_name; }; -struct _GstOssElementClass { +struct _GstOssElementClass +{ GstElementClass klass; - GList *device_combinations; + GList *device_combinations; }; -GType gst_osselement_get_type (void); +GType gst_osselement_get_type (void); /* some useful functions */ -gboolean gst_osselement_parse_caps (GstOssElement *oss, - const GstCaps *caps); -gboolean gst_osselement_merge_fixed_caps (GstOssElement *oss, - GstCaps *caps); - -gboolean gst_osselement_sync_parms (GstOssElement *oss); -void gst_osselement_reset (GstOssElement *oss); - -gboolean gst_osselement_convert (GstOssElement *oss, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); +gboolean gst_osselement_parse_caps (GstOssElement * oss, const GstCaps * caps); +gboolean gst_osselement_merge_fixed_caps (GstOssElement * oss, GstCaps * caps); -G_END_DECLS +gboolean gst_osselement_sync_parms (GstOssElement * oss); +void gst_osselement_reset (GstOssElement * oss); +gboolean gst_osselement_convert (GstOssElement * oss, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); + +G_END_DECLS #endif /* __GST_OSS_ELEMENT_H__ */ diff --git a/sys/oss/gstossmixer.c b/sys/oss/gstossmixer.c index 6bc89ccd..a9e7222c 100644 --- a/sys/oss/gstossmixer.c +++ b/sys/oss/gstossmixer.c @@ -37,27 +37,22 @@ #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) -static void gst_ossmixer_track_class_init (GstOssMixerTrackClass *klass); -static void gst_ossmixer_track_init (GstOssMixerTrack *track); +static void gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass); +static void gst_ossmixer_track_init (GstOssMixerTrack * track); -static gboolean gst_ossmixer_supported (GstImplementsInterface *iface, - GType iface_type); -static const GList * - gst_ossmixer_list_tracks (GstMixer *ossmixer); - -static void gst_ossmixer_set_volume (GstMixer *ossmixer, - GstMixerTrack *track, - gint *volumes); -static void gst_ossmixer_get_volume (GstMixer *ossmixer, - GstMixerTrack *track, - gint *volumes); - -static void gst_ossmixer_set_record (GstMixer *ossmixer, - GstMixerTrack *track, - gboolean record); -static void gst_ossmixer_set_mute (GstMixer *ossmixer, - GstMixerTrack *track, - gboolean mute); +static gboolean gst_ossmixer_supported (GstImplementsInterface * iface, + GType iface_type); +static const GList *gst_ossmixer_list_tracks (GstMixer * ossmixer); + +static void gst_ossmixer_set_volume (GstMixer * ossmixer, + GstMixerTrack * track, gint * volumes); +static void gst_ossmixer_get_volume (GstMixer * ossmixer, + GstMixerTrack * track, gint * volumes); + +static void gst_ossmixer_set_record (GstMixer * ossmixer, + GstMixerTrack * track, gboolean record); +static void gst_ossmixer_set_mute (GstMixer * ossmixer, + GstMixerTrack * track, gboolean mute); static const gchar **labels = NULL; static GstMixerTrackClass *parent_class = NULL; @@ -76,39 +71,41 @@ fill_labels (void) { gint i, pos; gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; - struct { + struct + { gchar *given, *wanted; } cases[] = { /* Note: this list is simply ripped from soundcard.h. For * some people, some values might be missing (3D surround, * etc.) - feel free to add them. That's the reason why * I'm doing this in such a horribly complicated way. */ - { "Vol ", _("Volume") }, - { "Bass ", _("Bass") }, - { "Trebl", _("Treble") }, - { "Synth", _("Synth") }, - { "Pcm ", _("PCM") }, - { "Spkr ", _("Speaker") }, - { "Line ", _("Line-in") }, - { "Mic ", _("Microphone") }, - { "CD ", _("CD") }, - { "Mix ", _("Mixer") }, - { "Pcm2 ", _("PCM-2") }, - { "Rec ", _("Record") }, - { "IGain", _("In-gain") }, - { "OGain", _("Out-gain") }, - { "Line1", _("Line-1") }, - { "Line2", _("Line-2") }, - { "Line3", _("Line-3") }, - { "Digital1", _("Digital-1") }, - { "Digital2", _("Digital-2") }, - { "Digital3", _("Digital-3") }, - { "PhoneIn", _("Phone-in") }, - { "PhoneOut", _("Phone-out") }, - { "Video", _("Video") }, - { "Radio", _("Radio") }, - { "Monitor", _("Monitor") }, - { NULL, NULL } + { + "Vol ", _("Volume")}, { + "Bass ", _("Bass")}, { + "Trebl", _("Treble")}, { + "Synth", _("Synth")}, { + "Pcm ", _("PCM")}, { + "Spkr ", _("Speaker")}, { + "Line ", _("Line-in")}, { + "Mic ", _("Microphone")}, { + "CD ", _("CD")}, { + "Mix ", _("Mixer")}, { + "Pcm2 ", _("PCM-2")}, { + "Rec ", _("Record")}, { + "IGain", _("In-gain")}, { + "OGain", _("Out-gain")}, { + "Line1", _("Line-1")}, { + "Line2", _("Line-2")}, { + "Line3", _("Line-3")}, { + "Digital1", _("Digital-1")}, { + "Digital2", _("Digital-2")}, { + "Digital3", _("Digital-3")}, { + "PhoneIn", _("Phone-in")}, { + "PhoneOut", _("Phone-out")}, { + "Video", _("Video")}, { + "Radio", _("Radio")}, { + "Monitor", _("Monitor")}, { + NULL, NULL} }; labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); @@ -116,8 +113,8 @@ fill_labels (void) for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { for (pos = 0; cases[pos].given != NULL; pos++) { if (!strcmp (cases[pos].given, origs[i])) { - labels[i] = g_strdup (cases[pos].wanted); - break; + labels[i] = g_strdup (cases[pos].wanted); + break; } } if (cases[pos].given == NULL) @@ -146,31 +143,28 @@ gst_ossmixer_track_get_type (void) gst_ossmixer_track_type = g_type_register_static (GST_TYPE_MIXER_TRACK, - "GstOssMixerTrack", - &ossmixer_track_info, 0); + "GstOssMixerTrack", &ossmixer_track_info, 0); } return gst_ossmixer_track_type; } static void -gst_ossmixer_track_class_init (GstOssMixerTrackClass *klass) +gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) { parent_class = g_type_class_ref (GST_TYPE_MIXER_TRACK); } static void -gst_ossmixer_track_init (GstOssMixerTrack *track) +gst_ossmixer_track_init (GstOssMixerTrack * track) { track->lvol = track->rvol = 0; track->track_num = 0; } GstMixerTrack * -gst_ossmixer_track_new (GstOssElement *oss, - gint track_num, - gint max_chans, - gint flags) +gst_ossmixer_track_new (GstOssElement * oss, + gint track_num, gint max_chans, gint flags) { GstOssMixerTrack *osstrack; GstMixerTrack *track; @@ -189,9 +183,9 @@ gst_ossmixer_track_new (GstOssElement *oss, osstrack->track_num = track_num; /* volume */ - if (ioctl(oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning("Error getting device (%d) volume: %s", - osstrack->track_num, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting device (%d) volume: %s", + osstrack->track_num, strerror (errno)); volume = 0; } osstrack->lvol = (volume & 0xff); @@ -203,17 +197,17 @@ gst_ossmixer_track_new (GstOssElement *oss, } void -gst_oss_interface_init (GstImplementsInterfaceClass *klass) +gst_oss_interface_init (GstImplementsInterfaceClass * klass) { /* default virtual functions */ klass->supported = gst_ossmixer_supported; } void -gst_ossmixer_interface_init (GstMixerClass *klass) +gst_ossmixer_interface_init (GstMixerClass * klass) { GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; - + /* default virtual functions */ klass->list_tracks = gst_ossmixer_list_tracks; klass->set_volume = gst_ossmixer_set_volume; @@ -223,8 +217,7 @@ gst_ossmixer_interface_init (GstMixerClass *klass) } static gboolean -gst_ossmixer_supported (GstImplementsInterface *iface, - GType iface_type) +gst_ossmixer_supported (GstImplementsInterface * iface, GType iface_type) { g_assert (iface_type == GST_TYPE_MIXER); @@ -232,8 +225,7 @@ gst_ossmixer_supported (GstImplementsInterface *iface, } static gboolean -gst_ossmixer_contains_track (GstOssElement *oss, - GstOssMixerTrack *osstrack) +gst_ossmixer_contains_track (GstOssElement * oss, GstOssMixerTrack * osstrack) { const GList *item; @@ -245,15 +237,14 @@ gst_ossmixer_contains_track (GstOssElement *oss, } static const GList * -gst_ossmixer_list_tracks (GstMixer *mixer) +gst_ossmixer_list_tracks (GstMixer * mixer) { return (const GList *) GST_OSSELEMENT (mixer)->tracklist; } static void -gst_ossmixer_get_volume (GstMixer *mixer, - GstMixerTrack *track, - gint *volumes) +gst_ossmixer_get_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -270,9 +261,9 @@ gst_ossmixer_get_volume (GstMixer *mixer, } } else { /* get */ - if (ioctl(oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { - g_warning("Error getting recording device (%d) volume: %s", - osstrack->track_num, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting recording device (%d) volume: %s", + osstrack->track_num, strerror (errno)); volume = 0; } @@ -284,9 +275,8 @@ gst_ossmixer_get_volume (GstMixer *mixer, } static void -gst_ossmixer_set_volume (GstMixer *mixer, - GstMixerTrack *track, - gint *volumes) +gst_ossmixer_set_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) { gint volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -304,9 +294,9 @@ gst_ossmixer_set_volume (GstMixer *mixer, } /* set */ - if (ioctl(oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { - g_warning("Error setting recording device (%d) volume (0x%x): %s", - osstrack->track_num, volume, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting recording device (%d) volume (0x%x): %s", + osstrack->track_num, volume, strerror (errno)); return; } } @@ -318,9 +308,7 @@ gst_ossmixer_set_volume (GstMixer *mixer, } static void -gst_ossmixer_set_mute (GstMixer *mixer, - GstMixerTrack *track, - gboolean mute) +gst_ossmixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) { int volume; GstOssElement *oss = GST_OSSELEMENT (mixer); @@ -339,9 +327,9 @@ gst_ossmixer_set_mute (GstMixer *mixer, } } - if (ioctl(oss->mixer_fd, MIXER_WRITE(osstrack->track_num), &volume) < 0) { - g_warning("Error setting mixer recording device volume (0x%x): %s", - volume, strerror(errno)); + if (ioctl (oss->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting mixer recording device volume (0x%x): %s", + volume, strerror (errno)); return; } @@ -353,9 +341,8 @@ gst_ossmixer_set_mute (GstMixer *mixer, } static void -gst_ossmixer_set_record (GstMixer *mixer, - GstMixerTrack *track, - gboolean record) +gst_ossmixer_set_record (GstMixer * mixer, + GstMixerTrack * track, gboolean record) { GstOssElement *oss = GST_OSSELEMENT (mixer); GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); @@ -372,8 +359,10 @@ gst_ossmixer_set_record (GstMixer *mixer, /* if we're exclusive, then we need to unset the current one(s) */ if (oss->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *track; + for (track = oss->tracklist; track != NULL; track = track->next) { GstMixerTrack *turn = (GstMixerTrack *) track->data; + turn->flags &= ~GST_MIXER_TRACK_RECORD; } oss->recdevs = 0; @@ -387,9 +376,9 @@ gst_ossmixer_set_record (GstMixer *mixer, } /* set it to the device */ - if (ioctl(oss->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &oss->recdevs) < 0) { - g_warning("Error setting mixer recording devices (0x%x): %s", - oss->recdevs, strerror(errno)); + if (ioctl (oss->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &oss->recdevs) < 0) { + g_warning ("Error setting mixer recording devices (0x%x): %s", + oss->recdevs, strerror (errno)); return; } @@ -401,11 +390,12 @@ gst_ossmixer_set_record (GstMixer *mixer, } void -gst_ossmixer_build_list (GstOssElement *oss) +gst_ossmixer_build_list (GstOssElement * oss) { gint i, devmask, master = -1; const GList *pads = gst_element_get_pad_list (GST_ELEMENT (oss)); GstPadDirection dir = GST_PAD_UNKNOWN; + #ifdef SOUND_MIXER_INFO struct mixer_info minfo; #endif @@ -416,7 +406,7 @@ gst_ossmixer_build_list (GstOssElement *oss) if (oss->mixer_fd == -1) { /* this is valid. OSS devices don't need to expose a mixer */ GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s", - oss->mixer_dev, strerror (errno)); + oss->mixer_dev, strerror (errno)); return; } @@ -427,9 +417,9 @@ gst_ossmixer_build_list (GstOssElement *oss) /* get masks */ if (ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECMASK, &oss->recmask) < 0 || ioctl (oss->mixer_fd, SOUND_MIXER_READ_RECSRC, &oss->recdevs) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0 || - ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps) < 0) { + ioctl (oss->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &oss->stereomask) < 0 + || ioctl (oss->mixer_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0 + || ioctl (oss->mixer_fd, SOUND_MIXER_READ_CAPS, &oss->mixcaps) < 0) { GST_DEBUG ("Failed to get device masks - disabling mixer"); close (oss->mixer_fd); oss->mixer_fd = -1; @@ -451,7 +441,7 @@ gst_ossmixer_build_list (GstOssElement *oss) else if (devmask & SOUND_MASK_PCM) master = SOUND_MIXER_PCM; else if (devmask & SOUND_MASK_SPEAKER) - master = SOUND_MIXER_SPEAKER; /* doubtful... */ + master = SOUND_MIXER_SPEAKER; /* doubtful... */ /* else: no master, so we won't set any */ /* build track list */ @@ -462,31 +452,30 @@ gst_ossmixer_build_list (GstOssElement *oss) /* track exists, make up capabilities */ if (MASK_BIT_IS_SET (oss->stereomask, i)) - stereo = TRUE; + stereo = TRUE; if (MASK_BIT_IS_SET (oss->recmask, i)) - input = TRUE; + input = TRUE; if (MASK_BIT_IS_SET (oss->recdevs, i)) - record = TRUE; + record = TRUE; /* do we want this in our list? */ if ((dir == GST_PAD_SRC && input == FALSE) || - (dir == GST_PAD_SINK && i != SOUND_MIXER_PCM)) - continue; + (dir == GST_PAD_SINK && i != SOUND_MIXER_PCM)) + continue; /* add track to list */ track = gst_ossmixer_track_new (oss, i, stereo ? 2 : 1, - (record ? GST_MIXER_TRACK_RECORD : 0) | - (input ? GST_MIXER_TRACK_INPUT : - GST_MIXER_TRACK_OUTPUT) | - ((master != i) ? 0 : - GST_MIXER_TRACK_MASTER)); + (record ? GST_MIXER_TRACK_RECORD : 0) | + (input ? GST_MIXER_TRACK_INPUT : + GST_MIXER_TRACK_OUTPUT) | + ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); oss->tracklist = g_list_append (oss->tracklist, track); } } } void -gst_ossmixer_free_list (GstOssElement *oss) +gst_ossmixer_free_list (GstOssElement * oss) { if (oss->mixer_fd == -1) return; diff --git a/sys/oss/gstossmixer.h b/sys/oss/gstossmixer.h index dd2fb4fc..100d6afd 100644 --- a/sys/oss/gstossmixer.h +++ b/sys/oss/gstossmixer.h @@ -27,7 +27,6 @@ #include "gstosselement.h" G_BEGIN_DECLS - #define GST_TYPE_OSSMIXER_TRACK \ (gst_ossmixer_track_get_type ()) #define GST_OSSMIXER_TRACK(obj) \ @@ -40,25 +39,25 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) #define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) - -typedef struct _GstOssMixerTrack { + typedef struct _GstOssMixerTrack +{ GstMixerTrack parent; - gint lvol, rvol; - gint track_num; + gint lvol, rvol; + gint track_num; } GstOssMixerTrack; -typedef struct _GstOssMixerTrackClass { +typedef struct _GstOssMixerTrackClass +{ GstMixerTrackClass parent; } GstOssMixerTrackClass; -GType gst_ossmixer_track_get_type (void); +GType gst_ossmixer_track_get_type (void); -void gst_ossmixer_interface_init (GstMixerClass *klass); -void gst_oss_interface_init (GstImplementsInterfaceClass *klass); -void gst_ossmixer_build_list (GstOssElement *oss); -void gst_ossmixer_free_list (GstOssElement *oss); +void gst_ossmixer_interface_init (GstMixerClass * klass); +void gst_oss_interface_init (GstImplementsInterfaceClass * klass); +void gst_ossmixer_build_list (GstOssElement * oss); +void gst_ossmixer_free_list (GstOssElement * oss); G_END_DECLS - #endif /* __GST_OSS_MIXER_H__ */ diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index ab56274a..053eba46 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -32,50 +32,52 @@ #include "gstosssink.h" /* elementfactory information */ -static GstElementDetails gst_osssink_details = GST_ELEMENT_DETAILS ( - "Audio Sink (OSS)", - "Sink/Audio", - "Output to a sound card via OSS", - "Erik Walthinsen , " - "Wim Taymans " -); - -static void gst_osssink_base_init (gpointer g_class); -static void gst_osssink_class_init (GstOssSinkClass *klass); -static void gst_osssink_init (GstOssSink *osssink); -static void gst_osssink_dispose (GObject *object); - -static GstElementStateReturn gst_osssink_change_state (GstElement *element); -static void gst_osssink_set_clock (GstElement *element, GstClock *clock); -static GstClock* gst_osssink_get_clock (GstElement *element); -static GstClockTime gst_osssink_get_time (GstClock *clock, gpointer data); - -static const GstFormat* gst_osssink_get_formats (GstPad *pad); -static gboolean gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); -static const GstQueryType* gst_osssink_get_query_types (GstPad *pad); -static gboolean gst_osssink_query (GstElement *element, GstQueryType type, - GstFormat *format, gint64 *value); -static gboolean gst_osssink_sink_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); - -static GstCaps * gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps); -static GstPadLinkReturn gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps); - -static void gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, - GParamSpec *pspec); -static void gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, - GParamSpec *pspec); - -static void gst_osssink_chain (GstPad *pad,GstData *_data); +static GstElementDetails gst_osssink_details = +GST_ELEMENT_DETAILS ("Audio Sink (OSS)", + "Sink/Audio", + "Output to a sound card via OSS", + "Erik Walthinsen , " + "Wim Taymans "); + +static void gst_osssink_base_init (gpointer g_class); +static void gst_osssink_class_init (GstOssSinkClass * klass); +static void gst_osssink_init (GstOssSink * osssink); +static void gst_osssink_dispose (GObject * object); + +static GstElementStateReturn gst_osssink_change_state (GstElement * element); +static void gst_osssink_set_clock (GstElement * element, GstClock * clock); +static GstClock *gst_osssink_get_clock (GstElement * element); +static GstClockTime gst_osssink_get_time (GstClock * clock, gpointer data); + +static const GstFormat *gst_osssink_get_formats (GstPad * pad); +static gboolean gst_osssink_convert (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static const GstQueryType *gst_osssink_get_query_types (GstPad * pad); +static gboolean gst_osssink_query (GstElement * element, GstQueryType type, + GstFormat * format, gint64 * value); +static gboolean gst_osssink_sink_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); + +static GstCaps *gst_osssink_sink_fixate (GstPad * pad, const GstCaps * caps); +static GstPadLinkReturn gst_osssink_sinkconnect (GstPad * pad, + const GstCaps * caps); + +static void gst_osssink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osssink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_osssink_chain (GstPad * pad, GstData * _data); /* OssSink signals and args */ -enum { +enum +{ SIGNAL_HANDOFF, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_MUTE, ARG_FRAGMENT, @@ -86,19 +88,16 @@ enum { }; static GstStaticPadTemplate osssink_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, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); +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, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); static GstElementClass *parent_class = NULL; static guint gst_osssink_signals[LAST_SIGNAL] = { 0 }; @@ -110,24 +109,26 @@ gst_osssink_get_type (void) if (!osssink_type) { static const GTypeInfo osssink_info = { - sizeof(GstOssSinkClass), + sizeof (GstOssSinkClass), gst_osssink_base_init, NULL, - (GClassInitFunc)gst_osssink_class_init, + (GClassInitFunc) gst_osssink_class_init, NULL, NULL, - sizeof(GstOssSink), + sizeof (GstOssSink), 0, - (GInstanceInitFunc)gst_osssink_init, + (GInstanceInitFunc) gst_osssink_init, }; - osssink_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSink", &osssink_info, 0); + osssink_type = + g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSink", + &osssink_info, 0); } return osssink_type; } static void -gst_osssink_dispose (GObject *object) +gst_osssink_dispose (GObject * object) { GstOssSink *osssink = (GstOssSink *) object; @@ -140,65 +141,71 @@ static void gst_osssink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_osssink_details); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssink_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&osssink_sink_factory)); } static void -gst_osssink_class_init (GstOssSinkClass *klass) +gst_osssink_class_init (GstOssSinkClass * 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_OSSELEMENT); + parent_class = g_type_class_ref (GST_TYPE_OSSELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MUTE, - g_param_spec_boolean ("mute", "Mute", "Mute the audio", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("mute", "Mute", "Mute the audio", + FALSE, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC, - g_param_spec_boolean ("sync", "Sync", "If syncing on timestamps should be enabled", - TRUE, G_PARAM_READWRITE)); + g_param_spec_boolean ("sync", "Sync", + "If syncing on timestamps should be enabled", TRUE, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, - g_param_spec_int ("fragment", "Fragment", - "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", - 0, G_MAXINT, 6, G_PARAM_READWRITE)); + g_param_spec_int ("fragment", "Fragment", + "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_SIZE, - g_param_spec_uint ("buffer_size", "Buffer size", "Size of buffers in osssink's bufferpool (bytes)", - 0, G_MAXINT, 4096, G_PARAM_READWRITE)); + g_param_spec_uint ("buffer_size", "Buffer size", + "Size of buffers in osssink's bufferpool (bytes)", 0, G_MAXINT, 4096, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHUNK_SIZE, - g_param_spec_uint ("chunk_size", "Chunk size", "Write data in chunk sized buffers", - 0, G_MAXUINT, 4096, G_PARAM_READWRITE)); + g_param_spec_uint ("chunk_size", "Chunk size", + "Write data in chunk sized buffers", 0, G_MAXUINT, 4096, + G_PARAM_READWRITE)); gst_osssink_signals[SIGNAL_HANDOFF] = - g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GstOssSinkClass, handoff), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - + g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstOssSinkClass, handoff), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + gobject_class->set_property = gst_osssink_set_property; gobject_class->get_property = gst_osssink_get_property; - gobject_class->dispose = gst_osssink_dispose; - + gobject_class->dispose = gst_osssink_dispose; + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_osssink_change_state); - gstelement_class->query = GST_DEBUG_FUNCPTR (gst_osssink_query); - gstelement_class->set_clock = gst_osssink_set_clock; - gstelement_class->get_clock = gst_osssink_get_clock; - + gstelement_class->query = GST_DEBUG_FUNCPTR (gst_osssink_query); + gstelement_class->set_clock = gst_osssink_set_clock; + gstelement_class->get_clock = gst_osssink_get_clock; + } -static void -gst_osssink_init (GstOssSink *osssink) +static void +gst_osssink_init (GstOssSink * osssink) { - osssink->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&osssink_sink_factory), "sink"); + osssink->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&osssink_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (osssink), osssink->sinkpad); gst_pad_set_link_function (osssink->sinkpad, gst_osssink_sinkconnect); gst_pad_set_fixate_function (osssink->sinkpad, gst_osssink_sink_fixate); gst_pad_set_convert_function (osssink->sinkpad, gst_osssink_convert); gst_pad_set_query_function (osssink->sinkpad, gst_osssink_sink_query); - gst_pad_set_query_type_function (osssink->sinkpad, gst_osssink_get_query_types); + gst_pad_set_query_type_function (osssink->sinkpad, + gst_osssink_get_query_types); gst_pad_set_formats_function (osssink->sinkpad, gst_osssink_get_formats); gst_pad_set_chain_function (osssink->sinkpad, gst_osssink_chain); @@ -209,8 +216,10 @@ gst_osssink_init (GstOssSink *osssink) osssink->mute = FALSE; osssink->sync = TRUE; osssink->resync = TRUE; - osssink->provided_clock = gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); - gst_object_set_parent (GST_OBJECT (osssink->provided_clock), GST_OBJECT (osssink)); + osssink->provided_clock = + gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); + gst_object_set_parent (GST_OBJECT (osssink->provided_clock), + GST_OBJECT (osssink)); osssink->handled = 0; GST_FLAG_SET (osssink, GST_ELEMENT_THREAD_SUGGESTED); @@ -218,12 +227,14 @@ gst_osssink_init (GstOssSink *osssink) } static GstCaps * -gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps) +gst_osssink_sink_fixate (GstPad * pad, const GstCaps * caps) { GstCaps *newcaps; GstStructure *structure; - newcaps = gst_caps_new_full (gst_structure_copy(gst_caps_get_structure (caps, 0)), NULL); + newcaps = + gst_caps_new_full (gst_structure_copy (gst_caps_get_structure (caps, 0)), + NULL); structure = gst_caps_get_structure (newcaps, 0); if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", 44100)) { @@ -244,8 +255,8 @@ gst_osssink_sink_fixate (GstPad *pad, const GstCaps *caps) return NULL; } -static GstPadLinkReturn -gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps) +static GstPadLinkReturn +gst_osssink_sinkconnect (GstPad * pad, const GstCaps * caps) { GstOssSink *osssink = GST_OSSSINK (gst_pad_get_parent (pad)); @@ -260,7 +271,7 @@ gst_osssink_sinkconnect (GstPad *pad, const GstCaps *caps) } static inline gint -gst_osssink_get_delay (GstOssSink *osssink) +gst_osssink_get_delay (GstOssSink * osssink) { gint delay = 0; gint ret; @@ -275,19 +286,19 @@ gst_osssink_get_delay (GstOssSink *osssink) #endif if (ret < 0) { audio_buf_info info; + if (ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { delay = 0; - } - else { - delay = (info.fragstotal * info.fragsize) - info.bytes; + } else { + delay = (info.fragstotal * info.fragsize) - info.bytes; } } return delay; } -static GstClockTime -gst_osssink_get_time (GstClock *clock, gpointer data) +static GstClockTime +gst_osssink_get_time (GstClock * clock, gpointer data) { GstOssSink *osssink = GST_OSSSINK (data); gint delay; @@ -305,39 +316,41 @@ gst_osssink_get_time (GstClock *clock, gpointer data) * happen anymore, so remove the second code path after april 2004 */ if (delay > (gint64) osssink->handled) { /*g_warning ("Delay %d > osssink->handled %" G_GUINT64_FORMAT - ", setting to osssink->handled", - delay, osssink->handled);*/ + ", setting to osssink->handled", + delay, osssink->handled); */ delay = osssink->handled; } - res = ((gint64) osssink->handled - delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; + res = + ((gint64) osssink->handled - + delay) * GST_SECOND / GST_OSSELEMENT (osssink)->bps; if (res < 0) res = 0; return res; } -static GstClock* -gst_osssink_get_clock (GstElement *element) +static GstClock * +gst_osssink_get_clock (GstElement * element) { GstOssSink *osssink; - + osssink = GST_OSSSINK (element); return GST_CLOCK (osssink->provided_clock); } static void -gst_osssink_set_clock (GstElement *element, GstClock *clock) +gst_osssink_set_clock (GstElement * element, GstClock * clock) { GstOssSink *osssink; - + osssink = GST_OSSSINK (element); - osssink->clock = clock; + osssink->clock = clock; } -static void -gst_osssink_chain (GstPad *pad, GstData *_data) +static void +gst_osssink_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstOssSink *osssink; @@ -354,23 +367,25 @@ gst_osssink_chain (GstPad *pad, GstData *_data) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_SYNC, 0); - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_SYNC, 0); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + FALSE); gst_pad_event_default (pad, event); - return; + return; case GST_EVENT_DISCONTINUOUS: - osssink->resync = TRUE; - /* pass-through */ + osssink->resync = TRUE; + /* pass-through */ default: gst_pad_event_default (pad, event); - return; + return; } g_assert_not_reached (); } if (!GST_OSSELEMENT (osssink)->bps) { gst_buffer_unref (buf); - GST_ELEMENT_ERROR (osssink, CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before chain function")); + GST_ELEMENT_ERROR (osssink, CORE, NEGOTIATION, (NULL), + ("format wasn't negotiated before chain function")); return; } @@ -388,11 +403,13 @@ gst_osssink_chain (GstPad *pad, GstData *_data) } else { buftime = soundtime; } - GST_LOG_OBJECT (osssink, "time: real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, - soundtime, buftime); + GST_LOG_OBJECT (osssink, + "time: real %" G_GUINT64_FORMAT ", buffer: %" G_GUINT64_FORMAT, soundtime, + buftime); if (MAX (buftime, soundtime) - MIN (buftime, soundtime) > (GST_SECOND / 10)) { /* we need to adjust to the buffers here */ - GST_INFO_OBJECT (osssink, "need sync: real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, + GST_INFO_OBJECT (osssink, + "need sync: real %" G_GUINT64_FORMAT ", buffer: %" G_GUINT64_FORMAT, soundtime, buftime); if (soundtime > buftime) { /* do *not* throw frames out. It's useless. The next frame will come in @@ -400,29 +417,35 @@ gst_osssink_chain (GstPad *pad, GstData *_data) * This is a placeholder for what - some day - should become QoS, i.e. * sending events upstream to drop buffers. */ } else { - guint64 to_handle = (((buftime - soundtime) * GST_OSSELEMENT(osssink)->bps / GST_SECOND) / - ((GST_OSSELEMENT (osssink)->width / 8) * GST_OSSELEMENT (osssink)->channels)) * - (GST_OSSELEMENT (osssink)->width / 8) * GST_OSSELEMENT (osssink)->channels; + guint64 to_handle = + (((buftime - + soundtime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND) / + ((GST_OSSELEMENT (osssink)->width / 8) * + GST_OSSELEMENT (osssink)->channels)) * + (GST_OSSELEMENT (osssink)->width / 8) * + GST_OSSELEMENT (osssink)->channels; if (!osssink->resync) { - guint8 *buf = g_new (guint8, to_handle); - - memset (buf, (GST_OSSELEMENT (osssink)->width == 8) ? 0 : 128, to_handle); - while (to_handle > 0) { - gint done = write (GST_OSSELEMENT (osssink)->fd, buf, - MIN (to_handle, osssink->chunk_size)); - if (done == -1 && errno != EINTR) { - break; - } else { - to_handle -= done; - osssink->handled += done; - } - } - g_free(buf); + guint8 *buf = g_new (guint8, to_handle); + + memset (buf, (GST_OSSELEMENT (osssink)->width == 8) ? 0 : 128, + to_handle); + while (to_handle > 0) { + gint done = write (GST_OSSELEMENT (osssink)->fd, buf, + MIN (to_handle, osssink->chunk_size)); + + if (done == -1 && errno != EINTR) { + break; + } else { + to_handle -= done; + osssink->handled += done; + } + } + g_free (buf); } else { - /* Timestamps at start-of-stream (MPEG) or after seek (hey, - * again MPEG!) can be borken, therefore this hacklet. */ - osssink->handled += to_handle; + /* Timestamps at start-of-stream (MPEG) or after seek (hey, + * again MPEG!) can be borken, therefore this hacklet. */ + osssink->handled += to_handle; } } } @@ -431,13 +454,13 @@ gst_osssink_chain (GstPad *pad, GstData *_data) if (!osssink->mute) { while (to_write > 0) { - gint done = write (GST_OSSELEMENT (osssink)->fd, data, - MIN (to_write, osssink->chunk_size)); - if (done == -1) { - if (errno != EINTR) + gint done = write (GST_OSSELEMENT (osssink)->fd, data, + MIN (to_write, osssink->chunk_size)); + + if (done == -1) { + if (errno != EINTR) break; - } - else { + } else { to_write -= done; data += done; osssink->handled += done; @@ -448,13 +471,14 @@ gst_osssink_chain (GstPad *pad, GstData *_data) } } - gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, gst_osssink_get_time (osssink->provided_clock, osssink)); + gst_audio_clock_update_time ((GstAudioClock *) osssink->provided_clock, + gst_osssink_get_time (osssink->provided_clock, osssink)); gst_buffer_unref (buf); } -static const GstFormat* -gst_osssink_get_formats (GstPad *pad) +static const GstFormat * +gst_osssink_get_formats (GstPad * pad) { static const GstFormat formats[] = { GST_FORMAT_TIME, @@ -466,20 +490,19 @@ gst_osssink_get_formats (GstPad *pad) } static gboolean -gst_osssink_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_osssink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { GstOssSink *osssink; osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - + return gst_osselement_convert (GST_OSSELEMENT (osssink), - src_format, src_value, - dest_format, dest_value); + src_format, src_value, dest_format, dest_value); } -static const GstQueryType* -gst_osssink_get_query_types (GstPad *pad) +static const GstQueryType * +gst_osssink_get_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_LATENCY, @@ -490,32 +513,33 @@ gst_osssink_get_query_types (GstPad *pad) } static gboolean -gst_osssink_sink_query (GstPad *pad, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssink_sink_query (GstPad * pad, GstQueryType type, GstFormat * format, + gint64 * value) { gboolean res = TRUE; GstOssSink *osssink; osssink = GST_OSSSINK (gst_pad_get_parent (pad)); - + switch (type) { case GST_QUERY_LATENCY: - if (!gst_osssink_convert (pad, - GST_FORMAT_BYTES, gst_osssink_get_delay (osssink), - format, value)) - { - res = FALSE; + if (!gst_osssink_convert (pad, + GST_FORMAT_BYTES, gst_osssink_get_delay (osssink), + format, value)) { + res = FALSE; } break; case GST_QUERY_POSITION: - if (!gst_osssink_convert (pad, - GST_FORMAT_TIME, gst_element_get_time (GST_ELEMENT (osssink)), - format, value)) - { - res = FALSE; + if (!gst_osssink_convert (pad, + GST_FORMAT_TIME, gst_element_get_time (GST_ELEMENT (osssink)), + format, value)) { + res = FALSE; } break; default: - res = gst_pad_query (gst_pad_get_peer (osssink->sinkpad), type, format, value); + res = + gst_pad_query (gst_pad_get_peer (osssink->sinkpad), type, format, + value); break; } @@ -523,15 +547,17 @@ gst_osssink_sink_query (GstPad *pad, GstQueryType type, GstFormat *format, gint6 } static gboolean -gst_osssink_query (GstElement *element, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssink_query (GstElement * element, GstQueryType type, GstFormat * format, + gint64 * value) { GstOssSink *osssink = GST_OSSSINK (element); return gst_osssink_sink_query (osssink->sinkpad, type, format, value); } -static void -gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_osssink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstOssSink *osssink; @@ -563,8 +589,9 @@ gst_osssink_set_property (GObject *object, guint prop_id, const GValue *value, G } } -static void -gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_osssink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstOssSink *osssink; @@ -592,8 +619,8 @@ gst_osssink_get_property (GObject *object, guint prop_id, GValue *value, GParamS } } -static GstElementStateReturn -gst_osssink_change_state (GstElement *element) +static GstElementStateReturn +gst_osssink_change_state (GstElement * element) { GstOssSink *osssink; @@ -603,16 +630,18 @@ gst_osssink_change_state (GstElement *element) case GST_STATE_READY_TO_PAUSED: break; case GST_STATE_PAUSED_TO_PLAYING: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), TRUE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + TRUE); break; case GST_STATE_PLAYING_TO_PAUSED: - if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); + if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), + FALSE); break; case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSINK_OPEN)) - ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); gst_osselement_reset (GST_OSSELEMENT (osssink)); osssink->handled = 0; osssink->resync = TRUE; @@ -620,7 +649,7 @@ gst_osssink_change_state (GstElement *element) default: break; } - + if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); diff --git a/sys/oss/gstosssink.h b/sys/oss/gstosssink.h index f484007b..e633ac52 100644 --- a/sys/oss/gstosssink.h +++ b/sys/oss/gstosssink.h @@ -31,7 +31,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_OSSSINK \ (gst_osssink_get_type()) #define GST_OSSSINK(obj) \ @@ -42,41 +41,42 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSINK)) #define GST_IS_OSSSINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSINK)) + typedef enum +{ + GST_OSSSINK_OPEN = GST_ELEMENT_FLAG_LAST, -typedef enum { - GST_OSSSINK_OPEN = GST_ELEMENT_FLAG_LAST, - - GST_OSSSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, + GST_OSSSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, } GstOssSinkFlags; typedef struct _GstOssSink GstOssSink; typedef struct _GstOssSinkClass GstOssSinkClass; -struct _GstOssSink { - GstOssElement element; +struct _GstOssSink +{ + GstOssElement element; - GstPad *sinkpad; + GstPad *sinkpad; - GstClock *provided_clock; - GstClock *clock; - gboolean resync; - gboolean sync; - guint64 handled; + GstClock *provided_clock; + GstClock *clock; + gboolean resync; + gboolean sync; + guint64 handled; - gboolean mute; - guint bufsize; - guint chunk_size; + gboolean mute; + guint bufsize; + guint chunk_size; }; -struct _GstOssSinkClass { +struct _GstOssSinkClass +{ GstOssElementClass parent_class; /* signals */ - void (*handoff) (GstElement *element,GstPad *pad); + void (*handoff) (GstElement * element, GstPad * pad); }; -GType gst_osssink_get_type(void); +GType gst_osssink_get_type (void); G_END_DECLS - #endif /* __GST_OSSSINK_H__ */ diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c index 4bdcb0d2..5803865e 100644 --- a/sys/oss/gstosssrc.c +++ b/sys/oss/gstosssrc.c @@ -37,92 +37,93 @@ #include /* elementfactory information */ -static GstElementDetails gst_osssrc_details = GST_ELEMENT_DETAILS ( - "Audio Source (OSS)", - "Source/Audio", - "Read from the sound card", - "Erik Walthinsen " -); +static GstElementDetails gst_osssrc_details = +GST_ELEMENT_DETAILS ("Audio Source (OSS)", + "Source/Audio", + "Read from the sound card", + "Erik Walthinsen "); /* OssSrc signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BUFFERSIZE, ARG_FRAGMENT, }; -static GstStaticPadTemplate osssrc_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 48000 ], " - "channels = (int) [ 1, 2 ]" - ) -); - -static void gst_osssrc_base_init (gpointer g_class); -static void gst_osssrc_class_init (GstOssSrcClass *klass); -static void gst_osssrc_init (GstOssSrc *osssrc); -static void gst_osssrc_dispose (GObject *object); - -static GstPadLinkReturn gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps); -static const GstFormat* gst_osssrc_get_formats (GstPad *pad); -static gboolean gst_osssrc_convert (GstPad *pad, - GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); - -static void gst_osssrc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_osssrc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -static GstElementStateReturn gst_osssrc_change_state (GstElement *element); - -static void gst_osssrc_set_clock (GstElement *element, GstClock *clock); -static GstClock* gst_osssrc_get_clock (GstElement *element); -static GstClockTime gst_osssrc_get_time (GstClock *clock, gpointer data); - -static const GstEventMask* gst_osssrc_get_event_masks (GstPad *pad); -static gboolean gst_osssrc_src_event (GstPad *pad, GstEvent *event); -static gboolean gst_osssrc_send_event (GstElement *element, GstEvent *event); -static const GstQueryType* gst_osssrc_get_query_types (GstPad *pad); -static gboolean gst_osssrc_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); - -static GstData * gst_osssrc_get (GstPad *pad); +static GstStaticPadTemplate osssrc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + ); + +static void gst_osssrc_base_init (gpointer g_class); +static void gst_osssrc_class_init (GstOssSrcClass * klass); +static void gst_osssrc_init (GstOssSrc * osssrc); +static void gst_osssrc_dispose (GObject * object); + +static GstPadLinkReturn gst_osssrc_srcconnect (GstPad * pad, + const GstCaps * caps); +static const GstFormat *gst_osssrc_get_formats (GstPad * pad); +static gboolean gst_osssrc_convert (GstPad * pad, + GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value); + +static void gst_osssrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osssrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_osssrc_change_state (GstElement * element); + +static void gst_osssrc_set_clock (GstElement * element, GstClock * clock); +static GstClock *gst_osssrc_get_clock (GstElement * element); +static GstClockTime gst_osssrc_get_time (GstClock * clock, gpointer data); + +static const GstEventMask *gst_osssrc_get_event_masks (GstPad * pad); +static gboolean gst_osssrc_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_osssrc_send_event (GstElement * element, GstEvent * event); +static const GstQueryType *gst_osssrc_get_query_types (GstPad * pad); +static gboolean gst_osssrc_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); + +static GstData *gst_osssrc_get (GstPad * pad); static GstElementClass *parent_class = NULL; + /*static guint gst_osssrc_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_osssrc_get_type (void) +gst_osssrc_get_type (void) { static GType osssrc_type = 0; if (!osssrc_type) { static const GTypeInfo osssrc_info = { - sizeof(GstOssSrcClass), + sizeof (GstOssSrcClass), gst_osssrc_base_init, NULL, - (GClassInitFunc)gst_osssrc_class_init, + (GClassInitFunc) gst_osssrc_class_init, NULL, NULL, - sizeof(GstOssSrc), + sizeof (GstOssSrc), 0, - (GInstanceInitFunc)gst_osssrc_init, + (GInstanceInitFunc) gst_osssrc_init, }; - osssrc_type = g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, 0); + osssrc_type = + g_type_register_static (GST_TYPE_OSSELEMENT, "GstOssSrc", &osssrc_info, + 0); } return osssrc_type; } @@ -131,32 +132,34 @@ static void gst_osssrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_osssrc_details); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&osssrc_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&osssrc_src_factory)); } static void -gst_osssrc_class_init (GstOssSrcClass *klass) +gst_osssrc_class_init (GstOssSrcClass * 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_OSSELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFERSIZE, - g_param_spec_ulong ("buffersize","Buffer Size","The size of the buffers with samples", - 0, G_MAXULONG, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFERSIZE, + g_param_spec_ulong ("buffersize", "Buffer Size", + "The size of the buffers with samples", 0, G_MAXULONG, 0, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAGMENT, - g_param_spec_int ("fragment", "Fragment", - "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", - 0, G_MAXINT, 6, G_PARAM_READWRITE)); - + g_param_spec_int ("fragment", "Fragment", + "The fragment as 0xMMMMSSSS (MMMM = total fragments, 2^SSSS = fragment size)", + 0, G_MAXINT, 6, G_PARAM_READWRITE)); + gobject_class->set_property = gst_osssrc_set_property; gobject_class->get_property = gst_osssrc_get_property; - gobject_class->dispose = gst_osssrc_dispose; + gobject_class->dispose = gst_osssrc_dispose; gstelement_class->change_state = gst_osssrc_change_state; gstelement_class->send_event = gst_osssrc_send_event; @@ -165,11 +168,12 @@ gst_osssrc_class_init (GstOssSrcClass *klass) gstelement_class->get_clock = gst_osssrc_get_clock; } -static void -gst_osssrc_init (GstOssSrc *osssrc) +static void +gst_osssrc_init (GstOssSrc * osssrc) { - osssrc->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&osssrc_src_factory), "src"); + osssrc->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&osssrc_src_factory), "src"); gst_pad_set_get_function (osssrc->srcpad, gst_osssrc_get); gst_pad_set_link_function (osssrc->srcpad, gst_osssrc_srcconnect); gst_pad_set_convert_function (osssrc->srcpad, gst_osssrc_convert); @@ -185,14 +189,16 @@ gst_osssrc_init (GstOssSrc *osssrc) osssrc->buffersize = 4096; osssrc->curoffset = 0; - osssrc->provided_clock = gst_audio_clock_new ("ossclock", gst_osssrc_get_time, osssrc); - gst_object_set_parent (GST_OBJECT (osssrc->provided_clock), GST_OBJECT (osssrc)); - + osssrc->provided_clock = + gst_audio_clock_new ("ossclock", gst_osssrc_get_time, osssrc); + gst_object_set_parent (GST_OBJECT (osssrc->provided_clock), + GST_OBJECT (osssrc)); + osssrc->clock = NULL; } static void -gst_osssrc_dispose (GObject *object) +gst_osssrc_dispose (GObject * object) { GstOssSrc *osssrc = (GstOssSrc *) object; @@ -201,12 +207,12 @@ gst_osssrc_dispose (GObject *object) G_OBJECT_CLASS (parent_class)->dispose (object); } -static GstPadLinkReturn -gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps) +static GstPadLinkReturn +gst_osssrc_srcconnect (GstPad * pad, const GstCaps * caps) { GstOssSrc *src; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); if (!gst_osselement_parse_caps (GST_OSSELEMENT (src), caps)) return GST_PAD_LINK_REFUSED; @@ -218,12 +224,12 @@ gst_osssrc_srcconnect (GstPad *pad, const GstCaps *caps) } static gboolean -gst_osssrc_negotiate (GstPad *pad) +gst_osssrc_negotiate (GstPad * pad) { GstOssSrc *src; GstCaps *allowed; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); allowed = gst_pad_get_allowed_caps (pad); @@ -232,24 +238,24 @@ gst_osssrc_negotiate (GstPad *pad) if (!gst_osselement_sync_parms (GST_OSSELEMENT (src))) return FALSE; - + /* set caps on src pad */ - if (gst_pad_try_set_caps (src->srcpad, - gst_caps_new_simple("audio/x-raw-int", - "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, - "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, - "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, - "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, - "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, - "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, - NULL)) <= 0) { + if (gst_pad_try_set_caps (src->srcpad, + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, GST_OSSELEMENT (src)->endianness, + "signed", G_TYPE_BOOLEAN, GST_OSSELEMENT (src)->sign, + "width", G_TYPE_INT, GST_OSSELEMENT (src)->width, + "depth", G_TYPE_INT, GST_OSSELEMENT (src)->depth, + "rate", G_TYPE_INT, GST_OSSELEMENT (src)->rate, + "channels", G_TYPE_INT, GST_OSSELEMENT (src)->channels, + NULL)) <= 0) { return FALSE; } return TRUE; } -static GstClockTime -gst_osssrc_get_time (GstClock *clock, gpointer data) +static GstClockTime +gst_osssrc_get_time (GstClock * clock, gpointer data) { GstOssSrc *osssrc = GST_OSSSRC (data); audio_buf_info info; @@ -257,40 +263,41 @@ gst_osssrc_get_time (GstClock *clock, gpointer data) if (!GST_OSSELEMENT (osssrc)->bps) return 0; - if (ioctl(GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_GETISPACE, &info) < 0) + if (ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_GETISPACE, &info) < 0) return 0; - return (osssrc->curoffset + info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; + return (osssrc->curoffset + + info.bytes) * GST_SECOND / GST_OSSELEMENT (osssrc)->bps; } -static GstClock* -gst_osssrc_get_clock (GstElement *element) +static GstClock * +gst_osssrc_get_clock (GstElement * element) { GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (element); return GST_CLOCK (osssrc->provided_clock); } static void -gst_osssrc_set_clock (GstElement *element, GstClock *clock) +gst_osssrc_set_clock (GstElement * element, GstClock * clock) { GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (element); osssrc->clock = clock; } - + static GstData * -gst_osssrc_get (GstPad *pad) +gst_osssrc_get (GstPad * pad) { GstOssSrc *src; GstBuffer *buf; glong readbytes; - src = GST_OSSSRC(gst_pad_get_parent (pad)); + src = GST_OSSSRC (gst_pad_get_parent (pad)); GST_DEBUG ("attempting to read something from the soundcard"); @@ -298,9 +305,9 @@ gst_osssrc_get (GstPad *pad) src->need_eos = FALSE; return GST_DATA (gst_event_new (GST_EVENT_EOS)); } - + buf = gst_buffer_new_and_alloc (src->buffersize); - + if (!GST_PAD_CAPS (pad)) { /* nothing was negotiated, we can decide on a format */ if (!gst_osssrc_negotiate (pad)) { @@ -312,12 +319,12 @@ gst_osssrc_get (GstPad *pad) if (GST_OSSELEMENT (src)->bps == 0) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + ("format wasn't negotiated before chain function")); return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT)); } - readbytes = read (GST_OSSELEMENT (src)->fd,GST_BUFFER_DATA (buf), - src->buffersize); + readbytes = read (GST_OSSELEMENT (src)->fd, GST_BUFFER_DATA (buf), + src->buffersize); if (readbytes < 0) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); @@ -334,20 +341,23 @@ gst_osssrc_get (GstPad *pad) GST_BUFFER_OFFSET (buf) = src->curoffset; /* FIXME: we are falsely assuming that we are the master clock here */ - GST_BUFFER_TIMESTAMP (buf) = src->curoffset * GST_SECOND / GST_OSSELEMENT (src)->bps; - GST_BUFFER_DURATION (buf) = (GST_SECOND * GST_BUFFER_SIZE (buf)) / - (GST_OSSELEMENT (src)->bps * GST_OSSELEMENT (src)->rate); + GST_BUFFER_TIMESTAMP (buf) = + src->curoffset * GST_SECOND / GST_OSSELEMENT (src)->bps; + GST_BUFFER_DURATION (buf) = + (GST_SECOND * GST_BUFFER_SIZE (buf)) / (GST_OSSELEMENT (src)->bps * + GST_OSSELEMENT (src)->rate); src->curoffset += readbytes; - GST_DEBUG ("pushed buffer from soundcard of %ld bytes, timestamp %" G_GINT64_FORMAT, - readbytes, GST_BUFFER_TIMESTAMP (buf)); + GST_DEBUG ("pushed buffer from soundcard of %ld bytes, timestamp %" + G_GINT64_FORMAT, readbytes, GST_BUFFER_TIMESTAMP (buf)); return GST_DATA (buf); } -static void -gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_osssrc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstOssSrc *src; @@ -360,14 +370,15 @@ gst_osssrc_set_property (GObject *object, guint prop_id, const GValue *value, GP case ARG_FRAGMENT: GST_OSSELEMENT (src)->fragment = g_value_get_int (value); gst_osselement_sync_parms (GST_OSSELEMENT (src)); - break; + break; default: break; } } -static void -gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_osssrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstOssSrc *src; @@ -386,11 +397,11 @@ gst_osssrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } } -static GstElementStateReturn -gst_osssrc_change_state (GstElement *element) +static GstElementStateReturn +gst_osssrc_change_state (GstElement * element) { GstOssSrc *osssrc = GST_OSSSRC (element); - + GST_DEBUG ("osssrc: state change"); switch (GST_STATE_TRANSITION (element)) { @@ -398,14 +409,16 @@ gst_osssrc_change_state (GstElement *element) osssrc->curoffset = 0; break; case GST_STATE_PAUSED_TO_PLAYING: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), TRUE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), + TRUE); break; case GST_STATE_PLAYING_TO_PAUSED: - gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), FALSE); + gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssrc->provided_clock), + FALSE); break; case GST_STATE_PAUSED_TO_READY: if (GST_FLAG_IS_SET (element, GST_OSSSRC_OPEN)) - ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); + ioctl (GST_OSSELEMENT (osssrc)->fd, SNDCTL_DSP_RESET, 0); break; default: break; @@ -413,12 +426,12 @@ gst_osssrc_change_state (GstElement *element) if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); - + return GST_STATE_SUCCESS; } -static const GstFormat* -gst_osssrc_get_formats (GstPad *pad) +static const GstFormat * +gst_osssrc_get_formats (GstPad * pad) { static const GstFormat formats[] = { GST_FORMAT_TIME, @@ -430,30 +443,30 @@ gst_osssrc_get_formats (GstPad *pad) } static gboolean -gst_osssrc_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_osssrc_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { GstOssSrc *osssrc; osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); return gst_osselement_convert (GST_OSSELEMENT (osssrc), src_format, src_value, - dest_format, dest_value); + dest_format, dest_value); } -static const GstEventMask* -gst_osssrc_get_event_masks (GstPad *pad) +static const GstEventMask * +gst_osssrc_get_event_masks (GstPad * pad) { static const GstEventMask gst_osssrc_src_event_masks[] = { - { GST_EVENT_EOS, 0 }, - { GST_EVENT_SIZE, 0 }, - { 0, } + {GST_EVENT_EOS, 0}, + {GST_EVENT_SIZE, 0}, + {0,} }; return gst_osssrc_src_event_masks; -} +} static gboolean -gst_osssrc_src_event (GstPad *pad, GstEvent *event) +gst_osssrc_src_event (GstPad * pad, GstEvent * event) { GstOssSrc *osssrc; gboolean retval = FALSE; @@ -471,16 +484,14 @@ gst_osssrc_src_event (GstPad *pad, GstEvent *event) gint64 value; format = GST_FORMAT_BYTES; - + /* convert to bytes */ - if (gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_EVENT_SIZE_FORMAT (event), - GST_EVENT_SIZE_VALUE (event), - &format, &value)) - { - osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); - g_object_notify (G_OBJECT (osssrc), "buffersize"); - retval = TRUE; + if (gst_osselement_convert (GST_OSSELEMENT (osssrc), + GST_EVENT_SIZE_FORMAT (event), + GST_EVENT_SIZE_VALUE (event), &format, &value)) { + osssrc->buffersize = GST_EVENT_SIZE_VALUE (event); + g_object_notify (G_OBJECT (osssrc), "buffersize"); + retval = TRUE; } } default: @@ -491,40 +502,39 @@ gst_osssrc_src_event (GstPad *pad, GstEvent *event) } static gboolean -gst_osssrc_send_event (GstElement *element, - GstEvent *event) +gst_osssrc_send_event (GstElement * element, GstEvent * event) { GstOssSrc *osssrc = GST_OSSSRC (element); return gst_osssrc_src_event (osssrc->srcpad, event); } -static const GstQueryType* -gst_osssrc_get_query_types (GstPad *pad) +static const GstQueryType * +gst_osssrc_get_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_POSITION, 0, }; return query_types; -} +} static gboolean -gst_osssrc_src_query (GstPad *pad, GstQueryType type, GstFormat *format, gint64 *value) +gst_osssrc_src_query (GstPad * pad, GstQueryType type, GstFormat * format, + gint64 * value) { gboolean res = FALSE; GstOssSrc *osssrc; - + osssrc = GST_OSSSRC (gst_pad_get_parent (pad)); - + switch (type) { case GST_QUERY_POSITION: - res = gst_osselement_convert (GST_OSSELEMENT (osssrc), - GST_FORMAT_BYTES, osssrc->curoffset, - format, value); + res = gst_osselement_convert (GST_OSSELEMENT (osssrc), + GST_FORMAT_BYTES, osssrc->curoffset, format, value); break; default: break; } return res; -} +} diff --git a/sys/oss/gstosssrc.h b/sys/oss/gstosssrc.h index 2bc6204f..e74db748 100644 --- a/sys/oss/gstosssrc.h +++ b/sys/oss/gstosssrc.h @@ -29,7 +29,6 @@ #include "gstosselement.h" G_BEGIN_DECLS - #define GST_TYPE_OSSSRC \ (gst_osssrc_get_type()) #define GST_OSSSRC(obj) \ @@ -40,38 +39,39 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSRC)) #define GST_IS_OSSSRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSRC)) + typedef enum +{ + GST_OSSSRC_OPEN = GST_ELEMENT_FLAG_LAST, -typedef enum { - GST_OSSSRC_OPEN = GST_ELEMENT_FLAG_LAST, - - GST_OSSSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2, + GST_OSSSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, } GstOssSrcFlags; typedef struct _GstOssSrc GstOssSrc; typedef struct _GstOssSrcClass GstOssSrcClass; -struct _GstOssSrc { - GstOssElement element; +struct _GstOssSrc +{ + GstOssElement element; /* pads */ - GstPad *srcpad; + GstPad *srcpad; + + gboolean need_eos; /* Do we need to emit an EOS? */ - gboolean need_eos; /* Do we need to emit an EOS? */ - /* blocking */ - gulong curoffset; - gulong buffersize; + gulong curoffset; + gulong buffersize; /* clocks */ GstClock *provided_clock, *clock; }; -struct _GstOssSrcClass { +struct _GstOssSrcClass +{ GstOssElementClass parent_class; }; -GType gst_osssrc_get_type(void); +GType gst_osssrc_get_type (void); G_END_DECLS - #endif /* __GST_OSSSRC_H__ */ diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c index dffb3f07..633ce52e 100644 --- a/sys/v4l2/gstv4l2.c +++ b/sys/v4l2/gstv4l2.c @@ -29,7 +29,7 @@ #include "gstv4l2src.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { /* actually, we can survive without it, but I'll create * that handling later on. */ @@ -37,9 +37,9 @@ plugin_init (GstPlugin *plugin) return FALSE; if (!gst_element_register (plugin, "v4l2element", - GST_RANK_NONE, GST_TYPE_V4L2ELEMENT) || + GST_RANK_NONE, GST_TYPE_V4L2ELEMENT) || !gst_element_register (plugin, "v4l2src", - GST_RANK_NONE, GST_TYPE_V4L2SRC)) + GST_RANK_NONE, GST_TYPE_V4L2SRC)) return FALSE; #ifdef ENABLE_NLS @@ -50,14 +50,8 @@ plugin_init (GstPlugin *plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "video4linux2", - "elements for Video 4 Linux 2", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "video4linux2", + "elements for Video 4 Linux 2", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/sys/v4l2/gstv4l2colorbalance.c b/sys/v4l2/gstv4l2colorbalance.c index 0fd18677..274043d8 100644 --- a/sys/v4l2/gstv4l2colorbalance.c +++ b/sys/v4l2/gstv4l2colorbalance.c @@ -28,19 +28,17 @@ #include "gstv4l2element.h" static void -gst_v4l2_color_balance_channel_class_init(GstV4l2ColorBalanceChannelClass *klass); -static void -gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel *channel); - -static const GList * -gst_v4l2_color_balance_list_channels (GstColorBalance *balance); -static void -gst_v4l2_color_balance_set_value (GstColorBalance *balance, - GstColorBalanceChannel *channel, - gint value); -static gint -gst_v4l2_color_balance_get_value (GstColorBalance *balance, - GstColorBalanceChannel *channel); +gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass * + klass); +static void gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel * + channel); + +static const GList *gst_v4l2_color_balance_list_channels (GstColorBalance * + balance); +static void gst_v4l2_color_balance_set_value (GstColorBalance * balance, + GstColorBalanceChannel * channel, gint value); +static gint gst_v4l2_color_balance_get_value (GstColorBalance * balance, + GstColorBalanceChannel * channel); static GstColorBalanceChannelClass *parent_class = NULL; @@ -65,30 +63,30 @@ gst_v4l2_color_balance_channel_get_type (void) gst_v4l2_color_balance_channel_type = g_type_register_static (GST_TYPE_COLOR_BALANCE_CHANNEL, - "GstV4l2ColorBalanceChannel", - &v4l2_tuner_channel_info, 0); + "GstV4l2ColorBalanceChannel", &v4l2_tuner_channel_info, 0); } return gst_v4l2_color_balance_channel_type; } static void -gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass *klass) +gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass * + klass) { parent_class = g_type_class_ref (GST_TYPE_COLOR_BALANCE_CHANNEL); } static void -gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel *channel) +gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel * channel) { channel->index = 0; } void -gst_v4l2_color_balance_interface_init (GstColorBalanceClass *klass) +gst_v4l2_color_balance_interface_init (GstColorBalanceClass * klass) { GST_COLOR_BALANCE_TYPE (klass) = GST_COLOR_BALANCE_HARDWARE; - + /* default virtual functions */ klass->list_channels = gst_v4l2_color_balance_list_channels; klass->set_value = gst_v4l2_color_balance_set_value; @@ -96,8 +94,8 @@ gst_v4l2_color_balance_interface_init (GstColorBalanceClass *klass) } static gboolean -gst_v4l2_color_balance_contains_channel (GstV4l2Element *v4l2element, - GstV4l2ColorBalanceChannel *v4l2channel) +gst_v4l2_color_balance_contains_channel (GstV4l2Element * v4l2element, + GstV4l2ColorBalanceChannel * v4l2channel) { const GList *item; @@ -109,42 +107,40 @@ gst_v4l2_color_balance_contains_channel (GstV4l2Element *v4l2element } static const GList * -gst_v4l2_color_balance_list_channels (GstColorBalance *balance) +gst_v4l2_color_balance_list_channels (GstColorBalance * balance) { return GST_V4L2ELEMENT (balance)->colors; } static void -gst_v4l2_color_balance_set_value (GstColorBalance *balance, - GstColorBalanceChannel *channel, - gint value) +gst_v4l2_color_balance_set_value (GstColorBalance * balance, + GstColorBalanceChannel * channel, gint value) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (balance); GstV4l2ColorBalanceChannel *v4l2channel = - GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); /* assert that we're opened and that we're using a known item */ g_return_if_fail (GST_V4L2_IS_OPEN (v4l2element)); g_return_if_fail (gst_v4l2_color_balance_contains_channel (v4l2element, - v4l2channel)); + v4l2channel)); gst_v4l2_set_attribute (v4l2element, v4l2channel->index, value); } static gint -gst_v4l2_color_balance_get_value (GstColorBalance *balance, - GstColorBalanceChannel *channel) +gst_v4l2_color_balance_get_value (GstColorBalance * balance, + GstColorBalanceChannel * channel) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (balance); GstV4l2ColorBalanceChannel *v4l2channel = - GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); gint value; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0); g_return_val_if_fail (gst_v4l2_color_balance_contains_channel (v4l2element, - v4l2channel), - 0); + v4l2channel), 0); if (!gst_v4l2_get_attribute (v4l2element, v4l2channel->index, &value)) return 0; diff --git a/sys/v4l2/gstv4l2colorbalance.h b/sys/v4l2/gstv4l2colorbalance.h index 4003203b..f0de44ce 100644 --- a/sys/v4l2/gstv4l2colorbalance.h +++ b/sys/v4l2/gstv4l2colorbalance.h @@ -27,7 +27,6 @@ #include "v4l2_calls.h" G_BEGIN_DECLS - #define GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL \ (gst_v4l2_color_balance_channel_get_type ()) #define GST_V4L2_COLOR_BALANCE_CHANNEL(obj) \ @@ -40,19 +39,20 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) #define GST_IS_V4L2_COLOR_BALANCE_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) - -typedef struct _GstV4l2ColorBalanceChannel { + typedef struct _GstV4l2ColorBalanceChannel +{ GstColorBalanceChannel parent; guint32 index; } GstV4l2ColorBalanceChannel; -typedef struct _GstV4l2ColorBalanceChannelClass { +typedef struct _GstV4l2ColorBalanceChannelClass +{ GstColorBalanceChannelClass parent; } GstV4l2ColorBalanceChannelClass; -GType gst_v4l2_color_balance_channel_get_type (void); +GType gst_v4l2_color_balance_channel_get_type (void); -void gst_v4l2_color_balance_interface_init (GstColorBalanceClass *klass); +void gst_v4l2_color_balance_interface_init (GstColorBalanceClass * klass); #endif /* __GST_V4L2_COLOR_BALANCE_H__ */ diff --git a/sys/v4l2/gstv4l2element.c b/sys/v4l2/gstv4l2element.c index eb12501d..246d4949 100644 --- a/sys/v4l2/gstv4l2element.c +++ b/sys/v4l2/gstv4l2element.c @@ -35,21 +35,23 @@ /* elementfactory details */ static GstElementDetails gst_v4l2element_details = { - "Generic video4linux2 Element", - "Generic/Video", - "Generic plugin for handling common video4linux2 calls", - "Ronald Bultje " + "Generic video4linux2 Element", + "Generic/Video", + "Generic plugin for handling common video4linux2 calls", + "Ronald Bultje " }; /* V4l2Element signals and args */ -enum { +enum +{ /* FILL ME */ SIGNAL_OPEN, SIGNAL_CLOSE, LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_DEVICE, ARG_DEVICE_NAME, @@ -60,20 +62,16 @@ enum { }; -static void gst_v4l2element_class_init (GstV4l2ElementClass *klass); -static void gst_v4l2element_base_init (GstV4l2ElementClass *klass); -static void gst_v4l2element_init (GstV4l2Element *v4lelement); -static void gst_v4l2element_dispose (GObject *object); -static void gst_v4l2element_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_v4l2element_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_v4l2element_class_init (GstV4l2ElementClass * klass); +static void gst_v4l2element_base_init (GstV4l2ElementClass * klass); +static void gst_v4l2element_init (GstV4l2Element * v4lelement); +static void gst_v4l2element_dispose (GObject * object); +static void gst_v4l2element_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_v4l2element_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); static GstElementStateReturn - gst_v4l2element_change_state (GstElement *element); +gst_v4l2element_change_state (GstElement * element); static GstElementClass *parent_class = NULL; @@ -81,260 +79,244 @@ static guint gst_v4l2element_signals[LAST_SIGNAL] = { 0 }; static gboolean -gst_v4l2_iface_supported (GstImplementsInterface *iface, - GType iface_type) +gst_v4l2_iface_supported (GstImplementsInterface * iface, GType iface_type) { - GstV4l2Element *v4l2element = GST_V4L2ELEMENT (iface); + GstV4l2Element *v4l2element = GST_V4L2ELEMENT (iface); - g_assert (iface_type == GST_TYPE_TUNER || - iface_type == GST_TYPE_X_OVERLAY || - iface_type == GST_TYPE_COLOR_BALANCE); + g_assert (iface_type == GST_TYPE_TUNER || + iface_type == GST_TYPE_X_OVERLAY || iface_type == GST_TYPE_COLOR_BALANCE); - if (v4l2element->video_fd == -1) - return FALSE; + if (v4l2element->video_fd == -1) + return FALSE; - if (iface_type == GST_TYPE_X_OVERLAY && - !GST_V4L2_IS_OVERLAY(v4l2element)) - return FALSE; + if (iface_type == GST_TYPE_X_OVERLAY && !GST_V4L2_IS_OVERLAY (v4l2element)) + return FALSE; - return TRUE; + return TRUE; } static void -gst_v4l2_interface_init (GstImplementsInterfaceClass *klass) +gst_v4l2_interface_init (GstImplementsInterfaceClass * klass) { - /* default virtual functions */ - klass->supported = gst_v4l2_iface_supported; + /* default virtual functions */ + klass->supported = gst_v4l2_iface_supported; } static const GList * -gst_v4l2_probe_get_properties (GstPropertyProbe *probe) +gst_v4l2_probe_get_properties (GstPropertyProbe * probe) { - GObjectClass *klass = G_OBJECT_GET_CLASS (probe); - static GList *list = NULL; + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; - if (!list) { - list = g_list_append (NULL, - g_object_class_find_property (klass, "device")); - } + if (!list) { + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); + } - return list; + return list; } static gboolean -gst_v4l2_class_probe_devices (GstV4l2ElementClass *klass, - gboolean check) +gst_v4l2_class_probe_devices (GstV4l2ElementClass * klass, gboolean check) { - static gboolean init = FALSE; - static GList *devices = NULL; - - if (!init && !check) { - gchar *dev_base[] = { "/dev/video", "/dev/v4l/video", NULL }; - gint base, n, fd; - - while (devices) { - GList *item = devices; - gchar *device = item->data; - - devices = g_list_remove (devices, item); - g_free (device); - } - - /* detect /dev entries */ - for (n = 0; n < 64; n++) { - for (base = 0; dev_base[base] != NULL; base++) { - struct stat s; - gchar *device = g_strdup_printf ("%s%d", - dev_base[base], n); - - /* does the /dev/ entry exist at all? */ - if (stat (device, &s) == 0) { - /* yes: is a device attached? */ - if ((fd = open (device, O_RDONLY)) > 0 || - errno == EBUSY) { - if (fd > 0) - close (fd); - - devices = - g_list_append (devices, - device); - break; - } - } - g_free (device); - } - } - - init = TRUE; + static gboolean init = FALSE; + static GList *devices = NULL; + + if (!init && !check) { + gchar *dev_base[] = { "/dev/video", "/dev/v4l/video", NULL }; + gint base, n, fd; + + while (devices) { + GList *item = devices; + gchar *device = item->data; + + devices = g_list_remove (devices, item); + g_free (device); + } + + /* detect /dev entries */ + for (n = 0; n < 64; n++) { + for (base = 0; dev_base[base] != NULL; base++) { + struct stat s; + gchar *device = g_strdup_printf ("%s%d", + dev_base[base], n); + + /* does the /dev/ entry exist at all? */ + if (stat (device, &s) == 0) { + /* yes: is a device attached? */ + if ((fd = open (device, O_RDONLY)) > 0 || errno == EBUSY) { + if (fd > 0) + close (fd); + + devices = g_list_append (devices, device); + break; + } } + g_free (device); + } + } - klass->devices = devices; + init = TRUE; + } - return init; + klass->devices = devices; + + return init; } static void -gst_v4l2_probe_probe_property (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_v4l2_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { - GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); - - switch (prop_id) { - case ARG_DEVICE: - gst_v4l2_class_probe_devices (klass, FALSE); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); - break; - } + GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); + + switch (prop_id) { + case ARG_DEVICE: + gst_v4l2_class_probe_devices (klass, FALSE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } } static gboolean -gst_v4l2_probe_needs_probe (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { - GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); - gboolean ret = FALSE; - - switch (prop_id) { - case ARG_DEVICE: - ret = !gst_v4l2_class_probe_devices (klass, TRUE); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); - break; - } + GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); + gboolean ret = FALSE; - return ret; + switch (prop_id) { + case ARG_DEVICE: + ret = !gst_v4l2_class_probe_devices (klass, TRUE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return ret; } static GValueArray * -gst_v4l2_class_list_devices (GstV4l2ElementClass *klass) +gst_v4l2_class_list_devices (GstV4l2ElementClass * klass) { - GValueArray *array; - GValue value = { 0 }; - GList *item; + GValueArray *array; + GValue value = { 0 }; + GList *item; - if (!klass->devices) - return NULL; + if (!klass->devices) + return NULL; - array = g_value_array_new (g_list_length (klass->devices)); - item = klass->devices; - g_value_init (&value, G_TYPE_STRING); - while (item) { - gchar *device = item->data; + array = g_value_array_new (g_list_length (klass->devices)); + item = klass->devices; + g_value_init (&value, G_TYPE_STRING); + while (item) { + gchar *device = item->data; - g_value_set_string (&value, device); - g_value_array_append (array, &value); + g_value_set_string (&value, device); + g_value_array_append (array, &value); - item = item->next; - } - g_value_unset (&value); + item = item->next; + } + g_value_unset (&value); - return array; + return array; } static GValueArray * -gst_v4l2_probe_get_values (GstPropertyProbe *probe, - guint prop_id, - const GParamSpec *pspec) +gst_v4l2_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) { - GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); - GValueArray *array = NULL; - - switch (prop_id) { - case ARG_DEVICE: - array = gst_v4l2_class_list_devices (klass); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); - break; - } + GstV4l2ElementClass *klass = GST_V4L2ELEMENT_GET_CLASS (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case ARG_DEVICE: + array = gst_v4l2_class_list_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } - return array; + return array; } static void -gst_v4l2_property_probe_interface_init (GstPropertyProbeInterface *iface) +gst_v4l2_property_probe_interface_init (GstPropertyProbeInterface * iface) { - iface->get_properties = gst_v4l2_probe_get_properties; - iface->probe_property = gst_v4l2_probe_probe_property; - iface->needs_probe = gst_v4l2_probe_needs_probe; - iface->get_values = gst_v4l2_probe_get_values; + iface->get_properties = gst_v4l2_probe_get_properties; + iface->probe_property = gst_v4l2_probe_probe_property; + iface->needs_probe = gst_v4l2_probe_needs_probe; + iface->get_values = gst_v4l2_probe_get_values; } GType gst_v4l2element_get_type (void) { - static GType v4l2element_type = 0; - - if (!v4l2element_type) { - static const GTypeInfo v4l2element_info = { - sizeof(GstV4l2ElementClass), - (GBaseInitFunc) gst_v4l2element_base_init, - NULL, - (GClassInitFunc) gst_v4l2element_class_init, - NULL, - NULL, - sizeof(GstV4l2Element), - 0, - (GInstanceInitFunc) gst_v4l2element_init, - NULL - }; - static const GInterfaceInfo v4l2iface_info = { - (GInterfaceInitFunc) gst_v4l2_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo v4l2_tuner_info = { - (GInterfaceInitFunc) gst_v4l2_tuner_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo v4l2_xoverlay_info = { - (GInterfaceInitFunc) gst_v4l2_xoverlay_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo v4l2_colorbalance_info = { - (GInterfaceInitFunc) gst_v4l2_color_balance_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo v4l2_propertyprobe_info = { - (GInterfaceInitFunc) gst_v4l2_property_probe_interface_init, - NULL, - NULL, - }; - - v4l2element_type = - g_type_register_static(GST_TYPE_ELEMENT, - "GstV4l2Element", &v4l2element_info, 0); - - g_type_add_interface_static (v4l2element_type, - GST_TYPE_IMPLEMENTS_INTERFACE, - &v4l2iface_info); - g_type_add_interface_static (v4l2element_type, - GST_TYPE_TUNER, - &v4l2_tuner_info); - g_type_add_interface_static (v4l2element_type, - GST_TYPE_X_OVERLAY, - &v4l2_xoverlay_info); - g_type_add_interface_static (v4l2element_type, - GST_TYPE_COLOR_BALANCE, - &v4l2_colorbalance_info); - g_type_add_interface_static (v4l2element_type, - GST_TYPE_PROPERTY_PROBE, - &v4l2_propertyprobe_info); - } + static GType v4l2element_type = 0; + + if (!v4l2element_type) { + static const GTypeInfo v4l2element_info = { + sizeof (GstV4l2ElementClass), + (GBaseInitFunc) gst_v4l2element_base_init, + NULL, + (GClassInitFunc) gst_v4l2element_class_init, + NULL, + NULL, + sizeof (GstV4l2Element), + 0, + (GInstanceInitFunc) gst_v4l2element_init, + NULL + }; + static const GInterfaceInfo v4l2iface_info = { + (GInterfaceInitFunc) gst_v4l2_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_tuner_info = { + (GInterfaceInitFunc) gst_v4l2_tuner_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_xoverlay_info = { + (GInterfaceInitFunc) gst_v4l2_xoverlay_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_colorbalance_info = { + (GInterfaceInitFunc) gst_v4l2_color_balance_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_propertyprobe_info = { + (GInterfaceInitFunc) gst_v4l2_property_probe_interface_init, + NULL, + NULL, + }; + + v4l2element_type = + g_type_register_static (GST_TYPE_ELEMENT, + "GstV4l2Element", &v4l2element_info, 0); + + g_type_add_interface_static (v4l2element_type, + GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info); + g_type_add_interface_static (v4l2element_type, + GST_TYPE_TUNER, &v4l2_tuner_info); + g_type_add_interface_static (v4l2element_type, + GST_TYPE_X_OVERLAY, &v4l2_xoverlay_info); + g_type_add_interface_static (v4l2element_type, + GST_TYPE_COLOR_BALANCE, &v4l2_colorbalance_info); + g_type_add_interface_static (v4l2element_type, + GST_TYPE_PROPERTY_PROBE, &v4l2_propertyprobe_info); + } - return v4l2element_type; + return v4l2element_type; } @@ -342,80 +324,78 @@ gst_v4l2element_get_type (void) GType gst_v4l2_device_get_type (void) { - static GType v4l2_device_type = 0; - - if (v4l2_device_type == 0) { - static const GFlagsValue values[] = { - { V4L2_CAP_VIDEO_CAPTURE, "CAPTURE", - "Device can capture" }, - { V4L2_CAP_VIDEO_OUTPUT, "PLAYBACK", - "Device can playback" }, - { V4L2_CAP_VIDEO_OVERLAY, "OVERLAY", - "Device can do overlay" }, - { V4L2_CAP_TUNER, "TUNER", - "Device has a tuner" }, - { V4L2_CAP_AUDIO, "AUDIO", - "Device handles audio" }, - { 0, NULL, NULL } - }; - - v4l2_device_type = - g_flags_register_static ("GstV4l2DeviceTypeFlags", - values); - } + static GType v4l2_device_type = 0; + + if (v4l2_device_type == 0) { + static const GFlagsValue values[] = { + {V4L2_CAP_VIDEO_CAPTURE, "CAPTURE", + "Device can capture"}, + {V4L2_CAP_VIDEO_OUTPUT, "PLAYBACK", + "Device can playback"}, + {V4L2_CAP_VIDEO_OVERLAY, "OVERLAY", + "Device can do overlay"}, + {V4L2_CAP_TUNER, "TUNER", + "Device has a tuner"}, + {V4L2_CAP_AUDIO, "AUDIO", + "Device handles audio"}, + {0, NULL, NULL} + }; + + v4l2_device_type = + g_flags_register_static ("GstV4l2DeviceTypeFlags", values); + } - return v4l2_device_type; + return v4l2_device_type; } static void -gst_v4l2element_base_init (GstV4l2ElementClass *klass) +gst_v4l2element_base_init (GstV4l2ElementClass * klass) { - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - klass->devices = NULL; + klass->devices = NULL; - gst_element_class_set_details (gstelement_class, - &gst_v4l2element_details); + gst_element_class_set_details (gstelement_class, &gst_v4l2element_details); } static void -gst_v4l2element_class_init (GstV4l2ElementClass *klass) +gst_v4l2element_class_init (GstV4l2ElementClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); - g_object_class_install_property(gobject_class, ARG_DEVICE, - g_param_spec_string("device", "Device", "Device location", - NULL, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_DEVICE_NAME, - g_param_spec_string("device_name", "Device name", - "Name of the device", NULL, G_PARAM_READABLE)); - g_object_class_install_property(gobject_class, ARG_FLAGS, - g_param_spec_flags("flags", "Flags", "Device type flags", - GST_TYPE_V4L2_DEVICE_FLAGS, 0, G_PARAM_READABLE)); - g_object_class_install_property(gobject_class, ARG_NORM, - g_param_spec_string("norm", "norm", - "Norm to use", NULL, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_CHANNEL, - g_param_spec_string("channel", "channel", - "input/output to switch to", NULL, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_FREQUENCY, + g_object_class_install_property (gobject_class, ARG_DEVICE, + g_param_spec_string ("device", "Device", "Device location", + NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_DEVICE_NAME, + g_param_spec_string ("device_name", "Device name", + "Name of the device", NULL, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, ARG_FLAGS, + g_param_spec_flags ("flags", "Flags", "Device type flags", + GST_TYPE_V4L2_DEVICE_FLAGS, 0, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, ARG_NORM, + g_param_spec_string ("norm", "norm", + "Norm to use", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_CHANNEL, + g_param_spec_string ("channel", "channel", + "input/output to switch to", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_FREQUENCY, g_param_spec_ulong ("frequency", "frequency", "frequency to tune to", 0, G_MAXULONG, 0, G_PARAM_READWRITE)); /* signals */ gst_v4l2element_signals[SIGNAL_OPEN] = - g_signal_new("open", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2ElementClass, open), - NULL, NULL, g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); + g_signal_new ("open", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstV4l2ElementClass, open), + NULL, NULL, g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); gst_v4l2element_signals[SIGNAL_CLOSE] = - g_signal_new("close", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2ElementClass, close), - NULL, NULL, g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); + g_signal_new ("close", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstV4l2ElementClass, close), + NULL, NULL, g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); gobject_class->set_property = gst_v4l2element_set_property; gobject_class->get_property = gst_v4l2element_get_property; @@ -426,29 +406,29 @@ gst_v4l2element_class_init (GstV4l2ElementClass *klass) static void -gst_v4l2element_init (GstV4l2Element *v4l2element) +gst_v4l2element_init (GstV4l2Element * v4l2element) { - /* some default values */ - v4l2element->video_fd = -1; - v4l2element->buffer = NULL; - v4l2element->device = g_strdup("/dev/video"); - v4l2element->display = g_strdup(g_getenv("DISPLAY")); + /* some default values */ + v4l2element->video_fd = -1; + v4l2element->buffer = NULL; + v4l2element->device = g_strdup ("/dev/video"); + v4l2element->display = g_strdup (g_getenv ("DISPLAY")); - v4l2element->channels = NULL; - v4l2element->norms = NULL; - v4l2element->colors = NULL; + v4l2element->channels = NULL; + v4l2element->norms = NULL; + v4l2element->colors = NULL; - v4l2element->overlay = gst_v4l2_xoverlay_new(v4l2element); + v4l2element->overlay = gst_v4l2_xoverlay_new (v4l2element); } static void -gst_v4l2element_dispose (GObject *object) +gst_v4l2element_dispose (GObject * object) { - GstV4l2Element *v4l2element = GST_V4L2ELEMENT(object); + GstV4l2Element *v4l2element = GST_V4L2ELEMENT (object); if (v4l2element->overlay) { - gst_v4l2_xoverlay_free(v4l2element); + gst_v4l2_xoverlay_free (v4l2element); } if (v4l2element->display) { @@ -461,37 +441,36 @@ gst_v4l2element_dispose (GObject *object) v4l2element->norm = NULL; g_free (v4l2element->channel); v4l2element->channel = NULL; - + if (((GObjectClass *) parent_class)->dispose) - ((GObjectClass *) parent_class)->dispose(object); + ((GObjectClass *) parent_class)->dispose (object); } static void -gst_v4l2element_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_v4l2element_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstV4l2Element *v4l2element; GstTuner *tuner; - + /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_V4L2ELEMENT (object)); v4l2element = GST_V4L2ELEMENT (object); /* stupid GstInterface */ tuner = (GstTuner *) object; - + switch (prop_id) { case ARG_DEVICE: - if (!GST_V4L2_IS_OPEN(v4l2element)) { + if (!GST_V4L2_IS_OPEN (v4l2element)) { if (v4l2element->device) - g_free(v4l2element->device); - v4l2element->device = g_value_dup_string(value); + g_free (v4l2element->device); + v4l2element->device = g_value_dup_string (value); } break; case ARG_NORM: - if (GST_V4L2_IS_OPEN(v4l2element)) { + if (GST_V4L2_IS_OPEN (v4l2element)) { GstTunerNorm *norm = gst_tuner_get_norm (tuner); + if (norm) { gst_tuner_set_norm (tuner, norm); } @@ -502,8 +481,9 @@ gst_v4l2element_set_property (GObject *object, } break; case ARG_CHANNEL: - if (GST_V4L2_IS_OPEN(v4l2element)) { + if (GST_V4L2_IS_OPEN (v4l2element)) { GstTunerChannel *channel = gst_tuner_get_channel (tuner); + if (channel) { gst_tuner_set_channel (tuner, channel); } @@ -514,9 +494,11 @@ gst_v4l2element_set_property (GObject *object, } break; case ARG_FREQUENCY: - if (GST_V4L2_IS_OPEN(v4l2element)) { + if (GST_V4L2_IS_OPEN (v4l2element)) { GstTunerChannel *channel; - if (!v4l2element->channel) return; + + if (!v4l2element->channel) + return; channel = gst_tuner_get_channel (tuner); g_assert (channel); gst_tuner_set_frequency (tuner, channel, g_value_get_ulong (value)); @@ -533,94 +515,91 @@ gst_v4l2element_set_property (GObject *object, static void -gst_v4l2element_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_v4l2element_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { - GstV4l2Element *v4l2element; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_V4L2ELEMENT(object)); - v4l2element = GST_V4L2ELEMENT(object); - - switch (prop_id) { - case ARG_DEVICE: - g_value_set_string(value, v4l2element->device); - break; - case ARG_DEVICE_NAME: { - gchar *new = NULL; - if (GST_V4L2_IS_OPEN(v4l2element)) - new = v4l2element->vcap.card; - g_value_set_string(value, new); - break; - } - case ARG_FLAGS: { - guint flags = 0; - if (GST_V4L2_IS_OPEN(v4l2element)) { - flags |= v4l2element->vcap.capabilities & - 30007; - } - g_value_set_flags(value, flags); - break; - } - case ARG_NORM: - g_value_set_string (value, v4l2element->norm); - break; - case ARG_CHANNEL: - g_value_set_string (value, v4l2element->channel); - break; - case ARG_FREQUENCY: - g_value_set_ulong (value, v4l2element->frequency); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; - } + GstV4l2Element *v4l2element; + + /* it's not null if we got it, but it might not be ours */ + g_return_if_fail (GST_IS_V4L2ELEMENT (object)); + v4l2element = GST_V4L2ELEMENT (object); + + switch (prop_id) { + case ARG_DEVICE: + g_value_set_string (value, v4l2element->device); + break; + case ARG_DEVICE_NAME:{ + gchar *new = NULL; + + if (GST_V4L2_IS_OPEN (v4l2element)) + new = v4l2element->vcap.card; + g_value_set_string (value, new); + break; + } + case ARG_FLAGS:{ + guint flags = 0; + + if (GST_V4L2_IS_OPEN (v4l2element)) { + flags |= v4l2element->vcap.capabilities & 30007; + } + g_value_set_flags (value, flags); + break; + } + case ARG_NORM: + g_value_set_string (value, v4l2element->norm); + break; + case ARG_CHANNEL: + g_value_set_string (value, v4l2element->channel); + break; + case ARG_FREQUENCY: + g_value_set_ulong (value, v4l2element->frequency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static GstElementStateReturn -gst_v4l2element_change_state (GstElement *element) +gst_v4l2element_change_state (GstElement * element) { - GstV4l2Element *v4l2element; - - g_return_val_if_fail(GST_IS_V4L2ELEMENT(element), GST_STATE_FAILURE); - - v4l2element = GST_V4L2ELEMENT(element); - - /* if going down into NULL state, close the device if it's open - * if going to READY, open the device (and set some options) - */ - switch (GST_STATE_TRANSITION(element)) { - case GST_STATE_NULL_TO_READY: - gst_v4l2_set_display(v4l2element); - - if (!gst_v4l2_open(v4l2element)) - return GST_STATE_FAILURE; - - gst_v4l2_xoverlay_open(v4l2element); - - /* emit a signal! whoopie! */ - g_signal_emit(G_OBJECT(v4l2element), - gst_v4l2element_signals[SIGNAL_OPEN], 0, - v4l2element->device); - break; - case GST_STATE_READY_TO_NULL: - gst_v4l2_xoverlay_close(v4l2element); - - if (!gst_v4l2_close(v4l2element)) - return GST_STATE_FAILURE; - - /* emit yet another signal! wheehee! */ - g_signal_emit(G_OBJECT(v4l2element), - gst_v4l2element_signals[SIGNAL_CLOSE], 0, - v4l2element->device); - break; - } + GstV4l2Element *v4l2element; + + g_return_val_if_fail (GST_IS_V4L2ELEMENT (element), GST_STATE_FAILURE); + + v4l2element = GST_V4L2ELEMENT (element); + + /* if going down into NULL state, close the device if it's open + * if going to READY, open the device (and set some options) + */ + switch (GST_STATE_TRANSITION (element)) { + case GST_STATE_NULL_TO_READY: + gst_v4l2_set_display (v4l2element); + + if (!gst_v4l2_open (v4l2element)) + return GST_STATE_FAILURE; + + gst_v4l2_xoverlay_open (v4l2element); + + /* emit a signal! whoopie! */ + g_signal_emit (G_OBJECT (v4l2element), + gst_v4l2element_signals[SIGNAL_OPEN], 0, v4l2element->device); + break; + case GST_STATE_READY_TO_NULL: + gst_v4l2_xoverlay_close (v4l2element); + + if (!gst_v4l2_close (v4l2element)) + return GST_STATE_FAILURE; + + /* emit yet another signal! wheehee! */ + g_signal_emit (G_OBJECT (v4l2element), + gst_v4l2element_signals[SIGNAL_CLOSE], 0, v4l2element->device); + break; + } - if (GST_ELEMENT_CLASS(parent_class)->change_state) - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + if (GST_ELEMENT_CLASS (parent_class)->change_state) + return GST_ELEMENT_CLASS (parent_class)->change_state (element); - return GST_STATE_SUCCESS; + return GST_STATE_SUCCESS; } diff --git a/sys/v4l2/gstv4l2element.h b/sys/v4l2/gstv4l2element.h index e46b2440..7dcd6846 100644 --- a/sys/v4l2/gstv4l2element.h +++ b/sys/v4l2/gstv4l2element.h @@ -55,53 +55,53 @@ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_V4L2ELEMENT, GstV4l2ElementClass)) -typedef struct _GstV4l2Element GstV4l2Element; -typedef struct _GstV4l2ElementClass GstV4l2ElementClass; +typedef struct _GstV4l2Element GstV4l2Element; +typedef struct _GstV4l2ElementClass GstV4l2ElementClass; -struct _GstV4l2Element { - GstElement element; +struct _GstV4l2Element +{ + GstElement element; - /* the video device */ - char *device; + /* the video device */ + char *device; - /* the video-device's file descriptor */ - gint video_fd; + /* the video-device's file descriptor */ + gint video_fd; - /* the video buffer (mmap()'ed) */ - guint8 **buffer; + /* the video buffer (mmap()'ed) */ + guint8 **buffer; - /* the video-device's capabilities */ - struct v4l2_capability vcap; + /* the video-device's capabilities */ + struct v4l2_capability vcap; - /* the toys available to us */ - GList *channels; - GList *norms; - GList *colors; + /* the toys available to us */ + GList *channels; + GList *norms; + GList *colors; - /* X-overlay */ - GstXWindowListener *overlay; - XID xwindow_id; + /* X-overlay */ + GstXWindowListener *overlay; + XID xwindow_id; - /* properties */ - gchar *norm; - gchar *channel; - gulong frequency; + /* properties */ + gchar *norm; + gchar *channel; + gulong frequency; - /* caching values */ - gchar *display; + /* caching values */ + gchar *display; }; -struct _GstV4l2ElementClass { - GstElementClass parent_class; +struct _GstV4l2ElementClass +{ + GstElementClass parent_class; - /* probed devices */ - GList *devices; + /* probed devices */ + GList *devices; - /* signals */ - void (*open) (GstElement *element, - const gchar *device); - void (*close) (GstElement *element, - const gchar *device); + /* signals */ + void (*open) (GstElement * element, const gchar * device); + void (*close) (GstElement * element, const gchar * device); }; diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index 8b0abe1a..5e5cdddc 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -31,115 +31,102 @@ GST_DEBUG_CATEGORY (v4l2src_debug); /* elementfactory details */ static GstElementDetails gst_v4l2src_details = { - "Video (video4linux2) Source", - "Source/Video", - "Reads frames (compressed or uncompressed) from a video4linux2 device", - "Ronald Bultje " + "Video (video4linux2) Source", + "Source/Video", + "Reads frames (compressed or uncompressed) from a video4linux2 device", + "Ronald Bultje " }; /* V4l2Src signals and args */ -enum { - SIGNAL_FRAME_CAPTURE, - SIGNAL_FRAME_DROP, - SIGNAL_FRAME_INSERT, - SIGNAL_FRAME_LOST, - LAST_SIGNAL +enum +{ + SIGNAL_FRAME_CAPTURE, + SIGNAL_FRAME_DROP, + SIGNAL_FRAME_INSERT, + SIGNAL_FRAME_LOST, + LAST_SIGNAL }; /* arguments */ -enum { - ARG_0, - ARG_NUMBUFS, - ARG_BUFSIZE, - ARG_USE_FIXED_FPS +enum +{ + ARG_0, + ARG_NUMBUFS, + ARG_BUFSIZE, + ARG_USE_FIXED_FPS }; guint32 gst_v4l2_formats[] = { /* from Linux 2.6.0 videodev2.h */ - V4L2_PIX_FMT_RGB332, /* 8 RGB-3-3-2 */ - V4L2_PIX_FMT_RGB555, /* 16 RGB-5-5-5 */ - V4L2_PIX_FMT_RGB565, /* 16 RGB-5-6-5 */ - V4L2_PIX_FMT_RGB555X, /* 16 RGB-5-5-5 BE */ - V4L2_PIX_FMT_RGB565X, /* 16 RGB-5-6-5 BE */ - V4L2_PIX_FMT_BGR24, /* 24 BGR-8-8-8 */ - V4L2_PIX_FMT_RGB24, /* 24 RGB-8-8-8 */ - V4L2_PIX_FMT_BGR32, /* 32 BGR-8-8-8-8 */ - V4L2_PIX_FMT_RGB32, /* 32 RGB-8-8-8-8 */ - V4L2_PIX_FMT_GREY, /* 8 Greyscale */ - V4L2_PIX_FMT_YVU410, /* 9 YVU 4:1:0 */ - V4L2_PIX_FMT_YVU420, /* 12 YVU 4:2:0 */ - V4L2_PIX_FMT_YUYV, /* 16 YUV 4:2:2 */ - V4L2_PIX_FMT_UYVY, /* 16 YUV 4:2:2 */ - V4L2_PIX_FMT_YUV422P, /* 16 YVU422 planar */ - V4L2_PIX_FMT_YUV411P, /* 16 YVU411 planar */ - V4L2_PIX_FMT_Y41P, /* 12 YUV 4:1:1 */ - V4L2_PIX_FMT_NV12, /* 12 Y/CbCr 4:2:0 */ - V4L2_PIX_FMT_NV21, /* 12 Y/CrCb 4:2:0 */ - V4L2_PIX_FMT_YUV410, /* 9 YUV 4:1:0 */ - V4L2_PIX_FMT_YUV420, /* 12 YUV 4:2:0 */ - V4L2_PIX_FMT_YYUV, /* 16 YUV 4:2:2 */ - V4L2_PIX_FMT_HI240, /* 8 8-bit color */ - V4L2_PIX_FMT_MJPEG, /* Motion-JPEG */ - V4L2_PIX_FMT_JPEG, /* JFIF JPEG */ - V4L2_PIX_FMT_DV, /* 1394 */ - V4L2_PIX_FMT_MPEG, /* MPEG */ - V4L2_PIX_FMT_WNVA /* Winnov hw compres */ + V4L2_PIX_FMT_RGB332, /* 8 RGB-3-3-2 */ + V4L2_PIX_FMT_RGB555, /* 16 RGB-5-5-5 */ + V4L2_PIX_FMT_RGB565, /* 16 RGB-5-6-5 */ + V4L2_PIX_FMT_RGB555X, /* 16 RGB-5-5-5 BE */ + V4L2_PIX_FMT_RGB565X, /* 16 RGB-5-6-5 BE */ + V4L2_PIX_FMT_BGR24, /* 24 BGR-8-8-8 */ + V4L2_PIX_FMT_RGB24, /* 24 RGB-8-8-8 */ + V4L2_PIX_FMT_BGR32, /* 32 BGR-8-8-8-8 */ + V4L2_PIX_FMT_RGB32, /* 32 RGB-8-8-8-8 */ + V4L2_PIX_FMT_GREY, /* 8 Greyscale */ + V4L2_PIX_FMT_YVU410, /* 9 YVU 4:1:0 */ + V4L2_PIX_FMT_YVU420, /* 12 YVU 4:2:0 */ + V4L2_PIX_FMT_YUYV, /* 16 YUV 4:2:2 */ + V4L2_PIX_FMT_UYVY, /* 16 YUV 4:2:2 */ + V4L2_PIX_FMT_YUV422P, /* 16 YVU422 planar */ + V4L2_PIX_FMT_YUV411P, /* 16 YVU411 planar */ + V4L2_PIX_FMT_Y41P, /* 12 YUV 4:1:1 */ + V4L2_PIX_FMT_NV12, /* 12 Y/CbCr 4:2:0 */ + V4L2_PIX_FMT_NV21, /* 12 Y/CrCb 4:2:0 */ + V4L2_PIX_FMT_YUV410, /* 9 YUV 4:1:0 */ + V4L2_PIX_FMT_YUV420, /* 12 YUV 4:2:0 */ + V4L2_PIX_FMT_YYUV, /* 16 YUV 4:2:2 */ + V4L2_PIX_FMT_HI240, /* 8 8-bit color */ + V4L2_PIX_FMT_MJPEG, /* Motion-JPEG */ + V4L2_PIX_FMT_JPEG, /* JFIF JPEG */ + V4L2_PIX_FMT_DV, /* 1394 */ + V4L2_PIX_FMT_MPEG, /* MPEG */ + V4L2_PIX_FMT_WNVA /* Winnov hw compres */ }; + #define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats)) GST_FORMATS_FUNCTION (GstPad *, gst_v4l2src_get_formats, - GST_FORMAT_TIME, GST_FORMAT_DEFAULT); + GST_FORMAT_TIME, GST_FORMAT_DEFAULT); GST_QUERY_TYPE_FUNCTION (GstPad *, gst_v4l2src_get_query_types, - GST_QUERY_POSITION); + GST_QUERY_POSITION); /* init functions */ -static void gst_v4l2src_class_init (gpointer g_class, - gpointer class_data); -static void gst_v4l2src_base_init (gpointer g_class); -static void gst_v4l2src_init (GTypeInstance * instance, - gpointer g_class); +static void gst_v4l2src_class_init (gpointer g_class, gpointer class_data); +static void gst_v4l2src_base_init (gpointer g_class); +static void gst_v4l2src_init (GTypeInstance * instance, gpointer g_class); /* signal functions */ -static void gst_v4l2src_open (GstElement *element, - const gchar *device); -static void gst_v4l2src_close (GstElement *element, - const gchar *device); +static void gst_v4l2src_open (GstElement * element, const gchar * device); +static void gst_v4l2src_close (GstElement * element, const gchar * device); /* pad/buffer functions */ -static const GstCaps * gst_v4l2src_get_all_caps (void); -static GstPadLinkReturn gst_v4l2src_link (GstPad *pad, - const GstCaps *caps); -static GstCaps * gst_v4l2src_getcaps (GstPad *pad); -static GstCaps * gst_v4l2src_fixate (GstPad * pad, - const GstCaps * caps); -static GstData * gst_v4l2src_get (GstPad *pad); -static gboolean gst_v4l2src_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); -static gboolean gst_v4l2src_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); +static const GstCaps *gst_v4l2src_get_all_caps (void); +static GstPadLinkReturn gst_v4l2src_link (GstPad * pad, const GstCaps * caps); +static GstCaps *gst_v4l2src_getcaps (GstPad * pad); +static GstCaps *gst_v4l2src_fixate (GstPad * pad, const GstCaps * caps); +static GstData *gst_v4l2src_get (GstPad * pad); +static gboolean gst_v4l2src_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static gboolean gst_v4l2src_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); /* get/set params */ -static void gst_v4l2src_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_v4l2src_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_v4l2src_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_v4l2src_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); /* state handling */ -static GstElementStateReturn - gst_v4l2src_change_state (GstElement *element); +static GstElementStateReturn gst_v4l2src_change_state (GstElement * element); /* set_clock function for A/V sync */ -static void gst_v4l2src_set_clock (GstElement *element, - GstClock *clock); +static void gst_v4l2src_set_clock (GstElement * element, GstClock * clock); static GstElementClass *parent_class = NULL; static guint gst_v4l2src_signals[LAST_SIGNAL] = { 0 }; @@ -163,7 +150,7 @@ gst_v4l2src_get_type (void) gst_v4l2src_init, NULL }; - v4l2src_type = g_type_register_static(GST_TYPE_V4L2ELEMENT, + v4l2src_type = g_type_register_static (GST_TYPE_V4L2ELEMENT, "GstV4l2Src", &v4l2src_info, 0); GST_DEBUG_CATEGORY_INIT (v4l2src_debug, "v4l2src", 0, "v4l2src element"); } @@ -175,7 +162,7 @@ gst_v4l2src_base_init (gpointer g_class) { GstPadTemplate *template; GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (gstelement_class, &gst_v4l2src_details); template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, @@ -196,40 +183,36 @@ gst_v4l2src_class_init (gpointer g_class, gpointer class_data) gobject_class->set_property = gst_v4l2src_set_property; gobject_class->get_property = gst_v4l2src_get_property; - g_object_class_install_property(gobject_class, ARG_NUMBUFS, - g_param_spec_int("num_buffers","num_buffers","num_buffers", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, ARG_BUFSIZE, - g_param_spec_int("buffer_size","buffer_size","buffer_size", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, ARG_NUMBUFS, + g_param_spec_int ("num_buffers", "num_buffers", "num_buffers", + G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_BUFSIZE, + g_param_spec_int ("buffer_size", "buffer_size", "buffer_size", + G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); - g_object_class_install_property(gobject_class, ARG_USE_FIXED_FPS, - g_param_spec_boolean("use_fixed_fps", "Use Fixed FPS", - "Drop/Insert frames to reach a certain FPS (TRUE) " - "or adapt FPS to suit the number of frabbed frames", - TRUE, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_USE_FIXED_FPS, + g_param_spec_boolean ("use_fixed_fps", "Use Fixed FPS", + "Drop/Insert frames to reach a certain FPS (TRUE) " + "or adapt FPS to suit the number of frabbed frames", + TRUE, G_PARAM_READWRITE)); /* signals */ gst_v4l2src_signals[SIGNAL_FRAME_CAPTURE] = - g_signal_new("frame-capture", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2SrcClass, frame_capture), - NULL, NULL, g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_signal_new ("frame-capture", G_TYPE_FROM_CLASS (g_class), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstV4l2SrcClass, frame_capture), NULL, + NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_v4l2src_signals[SIGNAL_FRAME_DROP] = - g_signal_new("frame-drop", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2SrcClass, frame_drop), - NULL, NULL, g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_signal_new ("frame-drop", G_TYPE_FROM_CLASS (g_class), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstV4l2SrcClass, frame_drop), NULL, + NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_v4l2src_signals[SIGNAL_FRAME_INSERT] = - g_signal_new("frame_insert", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2SrcClass, frame_insert), - NULL, NULL, g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_signal_new ("frame_insert", G_TYPE_FROM_CLASS (g_class), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstV4l2SrcClass, frame_insert), NULL, + NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_v4l2src_signals[SIGNAL_FRAME_LOST] = - g_signal_new("frame-lost", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstV4l2SrcClass, frame_lost), - NULL, NULL, g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); + g_signal_new ("frame-lost", G_TYPE_FROM_CLASS (g_class), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstV4l2SrcClass, frame_lost), NULL, + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); gstelement_class->change_state = gst_v4l2src_change_state; @@ -241,24 +224,26 @@ gst_v4l2src_class_init (gpointer g_class, gpointer class_data) static void -gst_v4l2src_init (GTypeInstance *instance, gpointer g_class) +gst_v4l2src_init (GTypeInstance * instance, gpointer g_class) { GstV4l2Src *v4l2src = GST_V4L2SRC (instance); - - GST_FLAG_SET(GST_ELEMENT(v4l2src), GST_ELEMENT_THREAD_SUGGESTED); - v4l2src->srcpad = gst_pad_new_from_template( - gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (v4l2src), "src"), "src"); - gst_element_add_pad(GST_ELEMENT(v4l2src), v4l2src->srcpad); + GST_FLAG_SET (GST_ELEMENT (v4l2src), GST_ELEMENT_THREAD_SUGGESTED); + + v4l2src->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (v4l2src), "src"), "src"); + gst_element_add_pad (GST_ELEMENT (v4l2src), v4l2src->srcpad); - gst_pad_set_get_function(v4l2src->srcpad, gst_v4l2src_get); - gst_pad_set_link_function(v4l2src->srcpad, gst_v4l2src_link); + gst_pad_set_get_function (v4l2src->srcpad, gst_v4l2src_get); + gst_pad_set_link_function (v4l2src->srcpad, gst_v4l2src_link); gst_pad_set_getcaps_function (v4l2src->srcpad, gst_v4l2src_getcaps); gst_pad_set_fixate_function (v4l2src->srcpad, gst_v4l2src_fixate); gst_pad_set_convert_function (v4l2src->srcpad, gst_v4l2src_src_convert); gst_pad_set_formats_function (v4l2src->srcpad, gst_v4l2src_get_formats); gst_pad_set_query_function (v4l2src->srcpad, gst_v4l2src_src_query); - gst_pad_set_query_type_function (v4l2src->srcpad, gst_v4l2src_get_query_types); + gst_pad_set_query_type_function (v4l2src->srcpad, + gst_v4l2src_get_query_types); v4l2src->breq.count = 0; @@ -273,121 +258,113 @@ gst_v4l2src_init (GTypeInstance *instance, gpointer g_class) static void -gst_v4l2src_open (GstElement *element, - const gchar *device) +gst_v4l2src_open (GstElement * element, const gchar * device) { gst_v4l2src_fill_format_list (GST_V4L2SRC (element)); } static void -gst_v4l2src_close (GstElement *element, - const gchar *device) +gst_v4l2src_close (GstElement * element, const gchar * device) { gst_v4l2src_clear_format_list (GST_V4L2SRC (element)); } static gfloat -gst_v4l2src_get_fps (GstV4l2Src *v4l2src) +gst_v4l2src_get_fps (GstV4l2Src * v4l2src) { - v4l2_std_id norm; - const GList *item; - - if (!v4l2src->use_fixed_fps && - v4l2src->clock != NULL && - v4l2src->handled > 0) { - /* try to get time from clock master and calculate fps */ - GstClockTime time = gst_clock_get_time(v4l2src->clock) - - v4l2src->substract_time; - return v4l2src->handled * GST_SECOND / time; - } + v4l2_std_id norm; + const GList *item; + + if (!v4l2src->use_fixed_fps && v4l2src->clock != NULL && v4l2src->handled > 0) { + /* try to get time from clock master and calculate fps */ + GstClockTime time = gst_clock_get_time (v4l2src->clock) - + v4l2src->substract_time; + return v4l2src->handled * GST_SECOND / time; + } - /* if that failed ... */ - - if (!GST_V4L2_IS_OPEN(GST_V4L2ELEMENT(v4l2src))) - return 0.; - - if (!gst_v4l2_get_norm(GST_V4L2ELEMENT(v4l2src), &norm)) - return 0.; - for (item = GST_V4L2ELEMENT(v4l2src)->norms; - item != NULL; item = item->next) { - GstV4l2TunerNorm *v4l2norm = item->data; - if (v4l2norm->index == norm) - return GST_TUNER_NORM(v4l2norm)->fps; - } + /* if that failed ... */ - return 0.; + if (!GST_V4L2_IS_OPEN (GST_V4L2ELEMENT (v4l2src))) + return 0.; + + if (!gst_v4l2_get_norm (GST_V4L2ELEMENT (v4l2src), &norm)) + return 0.; + for (item = GST_V4L2ELEMENT (v4l2src)->norms; item != NULL; item = item->next) { + GstV4l2TunerNorm *v4l2norm = item->data; + + if (v4l2norm->index == norm) + return GST_TUNER_NORM (v4l2norm)->fps; + } + + return 0.; } static gboolean -gst_v4l2src_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value) +gst_v4l2src_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { - GstV4l2Src *v4l2src; - gdouble fps; - - v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); - - if ((fps = gst_v4l2src_get_fps(v4l2src)) == 0) - return FALSE; - - switch (src_format) { - case GST_FORMAT_TIME: - switch (*dest_format) { - case GST_FORMAT_DEFAULT: - *dest_value = src_value * fps / GST_SECOND; - break; - default: - return FALSE; - } - break; - - case GST_FORMAT_DEFAULT: - switch (*dest_format) { - case GST_FORMAT_TIME: - *dest_value = src_value * GST_SECOND / fps; - break; - default: - return FALSE; - } - break; - - default: - return FALSE; - } + GstV4l2Src *v4l2src; + gdouble fps; + + v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); - return TRUE; + if ((fps = gst_v4l2src_get_fps (v4l2src)) == 0) + return FALSE; + + switch (src_format) { + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_value = src_value * fps / GST_SECOND; + break; + default: + return FALSE; + } + break; + + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_TIME: + *dest_value = src_value * GST_SECOND / fps; + break; + default: + return FALSE; + } + break; + + default: + return FALSE; + } + + return TRUE; } static gboolean -gst_v4l2src_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value) +gst_v4l2src_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value) { GstV4l2Src *v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); gboolean res = TRUE; gdouble fps; - if ((fps = gst_v4l2src_get_fps(v4l2src)) == 0) + if ((fps = gst_v4l2src_get_fps (v4l2src)) == 0) return FALSE; switch (type) { case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_TIME: - *value = v4l2src->handled * GST_SECOND / fps; - break; - case GST_FORMAT_DEFAULT: - *value = v4l2src->handled; - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *value = v4l2src->handled * GST_SECOND / fps; + break; + case GST_FORMAT_DEFAULT: + *value = v4l2src->handled; + break; + default: + res = FALSE; + break; } break; default: @@ -404,8 +381,8 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc) GstStructure *structure = NULL; switch (fourcc) { - case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ - case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ + case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ + case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ structure = gst_structure_new ("video/x-jpeg", NULL); break; case V4L2_PIX_FMT_RGB332: @@ -416,21 +393,25 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc) case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB32: - case V4L2_PIX_FMT_BGR32: { - guint depth=0, bpp=0; + case V4L2_PIX_FMT_BGR32:{ + guint depth = 0, bpp = 0; gint endianness = 0; guint32 r_mask = 0, b_mask = 0, g_mask = 0; switch (fourcc) { case V4L2_PIX_FMT_RGB332: bpp = depth = 8; - endianness = G_BYTE_ORDER; /* 'like, whatever' */ - r_mask = 0xe0; g_mask = 0x1c; b_mask = 0x03; + endianness = G_BYTE_ORDER; /* 'like, whatever' */ + r_mask = 0xe0; + g_mask = 0x1c; + b_mask = 0x03; break; case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555X: - bpp = 16; depth = 15; - endianness = fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; + bpp = 16; + depth = 15; + endianness = + fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; r_mask = 0x7c00; g_mask = 0x03e0; b_mask = 0x001f; @@ -438,7 +419,8 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc) case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565X: bpp = depth = 16; - endianness = fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; + endianness = + fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; r_mask = 0xf800; g_mask = 0x07e0; b_mask = 0x001f; @@ -471,108 +453,107 @@ gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc) b_mask = 0x00ff0000; break; default: - g_assert_not_reached(); + g_assert_not_reached (); break; } structure = gst_structure_new ("video/x-raw-rgb", - "bpp", G_TYPE_INT, bpp, - "depth", G_TYPE_INT, depth, - "red_mask", G_TYPE_INT, r_mask, + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, depth, + "red_mask", G_TYPE_INT, r_mask, "green_mask", G_TYPE_INT, g_mask, - "blue_mask", G_TYPE_INT, b_mask, - "endianness", G_TYPE_INT, endianness, - NULL); + "blue_mask", G_TYPE_INT, b_mask, + "endianness", G_TYPE_INT, endianness, NULL); break; } - case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ - case V4L2_PIX_FMT_YUV422P: /* 16 YVU422 planar */ - case V4L2_PIX_FMT_YUV411P: /* 16 YVU411 planar */ - case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ - case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ - case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ - case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ + case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ + case V4L2_PIX_FMT_YUV422P: /* 16 YVU422 planar */ + case V4L2_PIX_FMT_YUV411P: /* 16 YVU411 planar */ + case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ + case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ + case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ + case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ /* FIXME: get correct fourccs here */ break; case V4L2_PIX_FMT_YVU410: case V4L2_PIX_FMT_YUV410: - case V4L2_PIX_FMT_YUV420: /* I420/IYUV */ + case V4L2_PIX_FMT_YUV420: /* I420/IYUV */ case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YVU420: case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_Y41P: { + case V4L2_PIX_FMT_Y41P:{ guint32 fcc = 0; switch (fourcc) { case V4L2_PIX_FMT_YVU410: - fcc = GST_MAKE_FOURCC('Y','V','U','9'); + fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9'); break; case V4L2_PIX_FMT_YUV410: - fcc = GST_MAKE_FOURCC('Y','U','V','9'); + fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9'); break; case V4L2_PIX_FMT_YUV420: - fcc = GST_MAKE_FOURCC('I','4','2','0'); + fcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); break; case V4L2_PIX_FMT_YUYV: - fcc = GST_MAKE_FOURCC('Y','U','Y','2'); + fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); break; case V4L2_PIX_FMT_YVU420: - fcc = GST_MAKE_FOURCC('Y','V','1','2'); + fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); break; case V4L2_PIX_FMT_UYVY: - fcc = GST_MAKE_FOURCC('U','Y','V','Y'); + fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); break; case V4L2_PIX_FMT_Y41P: - fcc = GST_MAKE_FOURCC('Y','4','1','B'); + fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); break; default: - g_assert_not_reached(); + g_assert_not_reached (); break; } structure = gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, fcc, - NULL); + "format", GST_TYPE_FOURCC, fcc, NULL); break; } case V4L2_PIX_FMT_DV: - structure = gst_structure_new ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + structure = + gst_structure_new ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, + NULL); break; - case V4L2_PIX_FMT_MPEG: /* MPEG */ + case V4L2_PIX_FMT_MPEG: /* MPEG */ /* someone figure out the MPEG format used... */ break; - case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ + case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ break; default: GST_DEBUG ("Unknown fourcc 0x%08x " GST_FOURCC_FORMAT, - fourcc, GST_FOURCC_ARGS(fourcc)); + fourcc, GST_FOURCC_ARGS (fourcc)); break; } #if 0 - gst_caps_set_simple (caps, - "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, - "framerate", G_TYPE_DOUBLE, fps, - NULL); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, "framerate", G_TYPE_DOUBLE, fps, NULL); #endif return structure; } static struct v4l2_fmtdesc * -gst_v4l2src_get_format_from_fourcc (GstV4l2Src *v4l2src, guint32 fourcc) -{ +gst_v4l2src_get_format_from_fourcc (GstV4l2Src * v4l2src, guint32 fourcc) +{ struct v4l2_fmtdesc *fmt; GSList *walk; - + if (fourcc == 0) return NULL; - + walk = v4l2src->formats; while (walk) { fmt = (struct v4l2_fmtdesc *) walk->data; if (fmt->pixelformat == fourcc) return fmt; /* special case for jpeg */ - if ((fmt->pixelformat == V4L2_PIX_FMT_MJPEG && fourcc == V4L2_PIX_FMT_JPEG) || - (fmt->pixelformat == V4L2_PIX_FMT_JPEG && fourcc == V4L2_PIX_FMT_MJPEG)) { + if ((fmt->pixelformat == V4L2_PIX_FMT_MJPEG && fourcc == V4L2_PIX_FMT_JPEG) + || (fmt->pixelformat == V4L2_PIX_FMT_JPEG + && fourcc == V4L2_PIX_FMT_MJPEG)) { return fmt; } walk = g_slist_next (walk); @@ -582,36 +563,36 @@ gst_v4l2src_get_format_from_fourcc (GstV4l2Src *v4l2src, guint32 fourcc) } static guint32 -gst_v4l2_fourcc_from_structure (GstStructure *structure) +gst_v4l2_fourcc_from_structure (GstStructure * structure) { guint32 fourcc = 0; const gchar *mimetype = gst_structure_get_name (structure); - if (!strcmp(mimetype, "video/x-raw-yuv") || - !strcmp(mimetype, "video/x-raw-rgb")) { - if (!strcmp(mimetype, "video/x-raw-rgb")) - fourcc = GST_MAKE_FOURCC('R','G','B',' '); + if (!strcmp (mimetype, "video/x-raw-yuv") || + !strcmp (mimetype, "video/x-raw-rgb")) { + if (!strcmp (mimetype, "video/x-raw-rgb")) + fourcc = GST_MAKE_FOURCC ('R', 'G', 'B', ' '); else gst_structure_get_fourcc (structure, "format", &fourcc); switch (fourcc) { - case GST_MAKE_FOURCC('I','4','2','0'): - case GST_MAKE_FOURCC('I','Y','U','V'): + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): fourcc = V4L2_PIX_FMT_YUV420; break; - case GST_MAKE_FOURCC('Y','U','Y','2'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): fourcc = V4L2_PIX_FMT_YUYV; break; - case GST_MAKE_FOURCC('Y','4','1','P'): + case GST_MAKE_FOURCC ('Y', '4', '1', 'P'): fourcc = V4L2_PIX_FMT_Y41P; break; - case GST_MAKE_FOURCC('U','Y','V','Y'): + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): fourcc = V4L2_PIX_FMT_UYVY; break; - case GST_MAKE_FOURCC('Y','V','1','2'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): fourcc = V4L2_PIX_FMT_YVU420; break; - case GST_MAKE_FOURCC('R','G','B',' '): { + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '):{ gint depth, endianness, r_mask; gst_structure_get_int (structure, "depth", &depth); @@ -624,29 +605,23 @@ gst_v4l2_fourcc_from_structure (GstStructure *structure) break; case 15: fourcc = (endianness == G_LITTLE_ENDIAN) ? - V4L2_PIX_FMT_RGB555 : - V4L2_PIX_FMT_RGB555X; + V4L2_PIX_FMT_RGB555 : V4L2_PIX_FMT_RGB555X; break; case 16: fourcc = (endianness == G_LITTLE_ENDIAN) ? - V4L2_PIX_FMT_RGB565 : - V4L2_PIX_FMT_RGB565X; + V4L2_PIX_FMT_RGB565 : V4L2_PIX_FMT_RGB565X; break; case 24: - fourcc = (r_mask == 0xFF) ? - V4L2_PIX_FMT_BGR24 : - V4L2_PIX_FMT_RGB24; + fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR24 : V4L2_PIX_FMT_RGB24; break; case 32: - fourcc = (r_mask == 0xFF) ? - V4L2_PIX_FMT_BGR32 : - V4L2_PIX_FMT_RGB32; + fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR32 : V4L2_PIX_FMT_RGB32; break; } - default: - break; + default: + break; } - } + } } else if (strcmp (mimetype, "video/x-dv") == 0) { fourcc = V4L2_PIX_FMT_DV; } else if (strcmp (mimetype, "video/x-jpeg") == 0) { @@ -657,7 +632,7 @@ gst_v4l2_fourcc_from_structure (GstStructure *structure) } static struct v4l2_fmtdesc * -gst_v4l2_caps_to_v4l2fourcc (GstV4l2Src *v4l2src, GstStructure *structure) +gst_v4l2_caps_to_v4l2fourcc (GstV4l2Src * v4l2src, GstStructure * structure) { return gst_v4l2src_get_format_from_fourcc (v4l2src, gst_v4l2_fourcc_from_structure (structure)); @@ -679,8 +654,7 @@ gst_v4l2src_get_all_caps (void) gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 1, 4096, "height", GST_TYPE_INT_RANGE, 1, 4096, - "framerate", GST_TYPE_DOUBLE_RANGE, (double) 0, G_MAXDOUBLE, - NULL); + "framerate", GST_TYPE_DOUBLE_RANGE, (double) 0, G_MAXDOUBLE, NULL); gst_caps_append_structure (caps, structure); } @@ -691,7 +665,7 @@ gst_v4l2src_get_all_caps (void) } static GstCaps * -gst_v4l2src_fixate (GstPad *pad, const GstCaps *const_caps) +gst_v4l2src_fixate (GstPad * pad, const GstCaps * const_caps) { gint i; GstStructure *structure; @@ -702,25 +676,31 @@ gst_v4l2src_fixate (GstPad *pad, const GstCaps *const_caps) caps_str = gst_caps_to_string (caps); GST_DEBUG_OBJECT (gst_pad_get_parent (pad), "fixating caps %s", caps_str); g_free (caps_str); - + for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); - changed |= gst_caps_structure_fixate_field_nearest_int (structure, "width", G_MAXINT); + changed |= + gst_caps_structure_fixate_field_nearest_int (structure, "width", + G_MAXINT); } - if (changed) return caps; + if (changed) + return caps; for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); - changed |= gst_caps_structure_fixate_field_nearest_int (structure, "height", G_MAXINT); + changed |= + gst_caps_structure_fixate_field_nearest_int (structure, "height", + G_MAXINT); } - if (changed) return caps; + if (changed) + return caps; gst_caps_free (caps); return NULL; } static GstPadLinkReturn -gst_v4l2src_link (GstPad *pad, const GstCaps *caps) +gst_v4l2src_link (GstPad * pad, const GstCaps * caps) { GstV4l2Src *v4l2src; GstV4l2Element *v4l2element; @@ -728,33 +708,33 @@ gst_v4l2src_link (GstPad *pad, const GstCaps *caps) int w, h; GstStructure *structure; - v4l2src = GST_V4L2SRC(gst_pad_get_parent (pad)); - v4l2element = GST_V4L2ELEMENT(v4l2src); + v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); + v4l2element = GST_V4L2ELEMENT (v4l2src); structure = gst_caps_get_structure (caps, 0); /* clean up if we still haven't cleaned up our previous * capture session */ - if (GST_V4L2_IS_ACTIVE(v4l2element)) { - if (!gst_v4l2src_capture_deinit(v4l2src)) - return GST_PAD_LINK_REFUSED; - } else if (!GST_V4L2_IS_OPEN(v4l2element)) { - return GST_PAD_LINK_DELAYED; + if (GST_V4L2_IS_ACTIVE (v4l2element)) { + if (!gst_v4l2src_capture_deinit (v4l2src)) + return GST_PAD_LINK_REFUSED; + } else if (!GST_V4L2_IS_OPEN (v4l2element)) { + return GST_PAD_LINK_DELAYED; } /* we want our own v4l2 type of fourcc codes */ - if (!(format = gst_v4l2_caps_to_v4l2fourcc(v4l2src, structure))) { - return GST_PAD_LINK_REFUSED; + if (!(format = gst_v4l2_caps_to_v4l2fourcc (v4l2src, structure))) { + return GST_PAD_LINK_REFUSED; } gst_structure_get_int (structure, "width", &w); gst_structure_get_int (structure, "height", &h); /* we found the pixelformat! - try it out */ - if (gst_v4l2src_set_capture(v4l2src, format, w, h)) { - if (gst_v4l2src_capture_init(v4l2src)) { - return GST_PAD_LINK_OK; - } + if (gst_v4l2src_set_capture (v4l2src, format, w, h)) { + if (gst_v4l2src_capture_init (v4l2src)) { + return GST_PAD_LINK_OK; + } } return GST_PAD_LINK_REFUSED; @@ -762,29 +742,29 @@ gst_v4l2src_link (GstPad *pad, const GstCaps *caps) static GstCaps * -gst_v4l2src_getcaps (GstPad *pad) +gst_v4l2src_getcaps (GstPad * pad) { - GstV4l2Src *v4l2src = GST_V4L2SRC(gst_pad_get_parent (pad)); + GstV4l2Src *v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); GstCaps *caps; struct v4l2_fmtdesc *format; int min_w, max_w, min_h, max_h; GSList *walk; GstStructure *structure; - if (!GST_V4L2_IS_OPEN(GST_V4L2ELEMENT(v4l2src))) { - return gst_caps_new_any (); + if (!GST_V4L2_IS_OPEN (GST_V4L2ELEMENT (v4l2src))) { + return gst_caps_new_any (); } /* build our own capslist */ - caps = gst_caps_new_empty(); + caps = gst_caps_new_empty (); walk = v4l2src->formats; while (walk) { format = (struct v4l2_fmtdesc *) walk->data; walk = g_slist_next (walk); /* get size delimiters */ - if (!gst_v4l2src_get_size_limits(v4l2src, format, - &min_w, &max_w, &min_h, &max_h)) { + if (!gst_v4l2src_get_size_limits (v4l2src, format, + &min_w, &max_w, &min_h, &max_h)) { continue; } @@ -795,8 +775,7 @@ gst_v4l2src_getcaps (GstPad *pad) gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, min_w, max_w, "height", GST_TYPE_INT_RANGE, min_h, max_h, - "framerate", GST_TYPE_DOUBLE_RANGE, (double) 0, G_MAXDOUBLE, - NULL); + "framerate", GST_TYPE_DOUBLE_RANGE, (double) 0, G_MAXDOUBLE, NULL); gst_caps_append_structure (caps, structure); } @@ -805,8 +784,8 @@ gst_v4l2src_getcaps (GstPad *pad) return caps; } -static GstData* -gst_v4l2src_get (GstPad *pad) +static GstData * +gst_v4l2src_get (GstPad * pad) { GstV4l2Src *v4l2src; GstBuffer *buf; @@ -815,9 +794,9 @@ gst_v4l2src_get (GstPad *pad) v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); - if (v4l2src->use_fixed_fps && - (fps = gst_v4l2src_get_fps(v4l2src)) == 0) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), ("could not get frame rate for element")); + if (v4l2src->use_fixed_fps && (fps = gst_v4l2src_get_fps (v4l2src)) == 0) { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), + ("could not get frame rate for element")); return NULL; } @@ -827,13 +806,14 @@ gst_v4l2src_get (GstPad *pad) v4l2src->need_writes--; } else { GstClockTime time; + /* grab a frame from the device */ - num = gst_v4l2src_grab_frame(v4l2src); + num = gst_v4l2src_grab_frame (v4l2src); if (num == -1) return NULL; /* to check if v4l2 sets the correct time */ - time = GST_TIMEVAL_TO_TIME(v4l2src->pool->buffers[num].buffer.timestamp); + time = GST_TIMEVAL_TO_TIME (v4l2src->pool->buffers[num].buffer.timestamp); if (v4l2src->clock && v4l2src->use_fixed_fps && time != 0) { gboolean have_frame = FALSE; @@ -847,9 +827,12 @@ gst_v4l2src_get (GstPad *pad) /* first check whether we lost any frames according to the device */ if (v4l2src->last_seq != 0) { - if (v4l2src->pool->buffers[num].buffer.sequence - v4l2src->last_seq > 1) { - v4l2src->need_writes = v4l2src->pool->buffers[num].buffer.sequence - v4l2src->last_seq; - g_signal_emit(G_OBJECT(v4l2src), gst_v4l2src_signals[SIGNAL_FRAME_LOST], 0, + if (v4l2src->pool->buffers[num].buffer.sequence - v4l2src->last_seq > + 1) { + v4l2src->need_writes = + v4l2src->pool->buffers[num].buffer.sequence - v4l2src->last_seq; + g_signal_emit (G_OBJECT (v4l2src), + gst_v4l2src_signals[SIGNAL_FRAME_LOST], 0, v4l2src->need_writes - 1); } } @@ -865,23 +848,27 @@ gst_v4l2src_get (GstPad *pad) * timeframe. This means that if time - begin_time = X sec, * we want to have written X*fps frames. If we've written * more - drop, if we've written less - dup... */ - if (v4l2src->handled * (GST_SECOND/fps) - time > 1.5 * (GST_SECOND/fps)) { + if (v4l2src->handled * (GST_SECOND / fps) - time > + 1.5 * (GST_SECOND / fps)) { /* yo dude, we've got too many frames here! Drop! DROP! */ - v4l2src->need_writes--; /* -= (v4l2src->handled - (time / fps)); */ - g_signal_emit(G_OBJECT(v4l2src), gst_v4l2src_signals[SIGNAL_FRAME_DROP], 0); - } else if (v4l2src->handled * (GST_SECOND/fps) - time < -1.5 * (GST_SECOND/fps)) { + v4l2src->need_writes--; /* -= (v4l2src->handled - (time / fps)); */ + g_signal_emit (G_OBJECT (v4l2src), + gst_v4l2src_signals[SIGNAL_FRAME_DROP], 0); + } else if (v4l2src->handled * (GST_SECOND / fps) - time < + -1.5 * (GST_SECOND / fps)) { /* this means we're lagging far behind */ - v4l2src->need_writes++; /* += ((time / fps) - v4l2src->handled); */ - g_signal_emit(G_OBJECT(v4l2src), gst_v4l2src_signals[SIGNAL_FRAME_INSERT], 0); + v4l2src->need_writes++; /* += ((time / fps) - v4l2src->handled); */ + g_signal_emit (G_OBJECT (v4l2src), + gst_v4l2src_signals[SIGNAL_FRAME_INSERT], 0); } if (v4l2src->need_writes > 0) { have_frame = TRUE; v4l2src->need_writes--; } else { - if (!gst_v4l2src_queue_frame(v4l2src, num)) + if (!gst_v4l2src_queue_frame (v4l2src, num)) return NULL; - num = gst_v4l2src_grab_frame(v4l2src); + num = gst_v4l2src_grab_frame (v4l2src); if (num == -1) return NULL; } @@ -889,17 +876,18 @@ gst_v4l2src_get (GstPad *pad) } g_assert (num != -1); - GST_LOG_OBJECT (v4l2src, "buffer %d needs %d writes", num, v4l2src->need_writes + 1); - i = v4l2src->pool->buffers[num].buffer.bytesused > 0 ? - v4l2src->pool->buffers[num].buffer.bytesused : - v4l2src->pool->buffers[num].length; + GST_LOG_OBJECT (v4l2src, "buffer %d needs %d writes", num, + v4l2src->need_writes + 1); + i = v4l2src->pool->buffers[num].buffer.bytesused > + 0 ? v4l2src->pool->buffers[num].buffer.bytesused : v4l2src->pool-> + buffers[num].length; /* check if this is the last buffer in the queue. If so do a memcpy to put it back asap to avoid framedrops and deadlocks because of stupid elements */ if (gst_atomic_int_read (&v4l2src->pool->refcount) == v4l2src->breq.count) { GST_LOG_OBJECT (v4l2src, "using memcpy'd buffer"); buf = gst_buffer_new_and_alloc (i); memcpy (GST_BUFFER_DATA (buf), v4l2src->pool->buffers[num].start, i); - if (!gst_v4l2src_queue_frame(v4l2src, num)) { + if (!gst_v4l2src_queue_frame (v4l2src, num)) { gst_data_unref (GST_DATA (buf)); return NULL; } @@ -920,7 +908,8 @@ gst_v4l2src_get (GstPad *pad) GST_BUFFER_DURATION (buf) = GST_SECOND / fps; } else { /* calculate time based on our own clock */ - GST_BUFFER_TIMESTAMP(buf) = GST_TIMEVAL_TO_TIME(v4l2src->pool->buffers[num].buffer.timestamp) - + GST_BUFFER_TIMESTAMP (buf) = + GST_TIMEVAL_TO_TIME (v4l2src->pool->buffers[num].buffer.timestamp) - v4l2src->substract_time; } if (v4l2src->need_writes > 0) { @@ -932,135 +921,130 @@ gst_v4l2src_get (GstPad *pad) } v4l2src->handled++; - g_signal_emit(G_OBJECT(v4l2src), gst_v4l2src_signals[SIGNAL_FRAME_CAPTURE], 0); + g_signal_emit (G_OBJECT (v4l2src), gst_v4l2src_signals[SIGNAL_FRAME_CAPTURE], + 0); return GST_DATA (buf); } static void -gst_v4l2src_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_v4l2src_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { - GstV4l2Src *v4l2src; - - g_return_if_fail(GST_IS_V4L2SRC(object)); - v4l2src = GST_V4L2SRC(object); - - switch (prop_id) { - case ARG_NUMBUFS: - if (!GST_V4L2_IS_ACTIVE(GST_V4L2ELEMENT(v4l2src))) { - v4l2src->breq.count = g_value_get_int(value); - } - break; - - case ARG_USE_FIXED_FPS: - if (!GST_V4L2_IS_ACTIVE(GST_V4L2ELEMENT(v4l2src))) { - v4l2src->use_fixed_fps = g_value_get_boolean(value); - } - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + GstV4l2Src *v4l2src; + + g_return_if_fail (GST_IS_V4L2SRC (object)); + v4l2src = GST_V4L2SRC (object); + + switch (prop_id) { + case ARG_NUMBUFS: + if (!GST_V4L2_IS_ACTIVE (GST_V4L2ELEMENT (v4l2src))) { + v4l2src->breq.count = g_value_get_int (value); + } + break; + + case ARG_USE_FIXED_FPS: + if (!GST_V4L2_IS_ACTIVE (GST_V4L2ELEMENT (v4l2src))) { + v4l2src->use_fixed_fps = g_value_get_boolean (value); + } + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static void -gst_v4l2src_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_v4l2src_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { - GstV4l2Src *v4l2src; + GstV4l2Src *v4l2src; - g_return_if_fail(GST_IS_V4L2SRC(object)); - v4l2src = GST_V4L2SRC(object); + g_return_if_fail (GST_IS_V4L2SRC (object)); + v4l2src = GST_V4L2SRC (object); - switch (prop_id) { - case ARG_NUMBUFS: - g_value_set_int(value, v4l2src->breq.count); - break; + switch (prop_id) { + case ARG_NUMBUFS: + g_value_set_int (value, v4l2src->breq.count); + break; - case ARG_BUFSIZE: - g_value_set_int(value, v4l2src->format.fmt.pix.sizeimage); - break; + case ARG_BUFSIZE: + g_value_set_int (value, v4l2src->format.fmt.pix.sizeimage); + break; - case ARG_USE_FIXED_FPS: - g_value_set_boolean(value, v4l2src->use_fixed_fps); - break; + case ARG_USE_FIXED_FPS: + g_value_set_boolean (value, v4l2src->use_fixed_fps); + break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static GstElementStateReturn -gst_v4l2src_change_state (GstElement *element) +gst_v4l2src_change_state (GstElement * element) { - GstV4l2Src *v4l2src; - gint transition = GST_STATE_TRANSITION (element); - GstElementStateReturn parent_return; - GTimeVal time; - - g_return_val_if_fail(GST_IS_V4L2SRC(element), GST_STATE_FAILURE); - v4l2src = GST_V4L2SRC(element); - - if (GST_ELEMENT_CLASS (parent_class)->change_state) { - parent_return = GST_ELEMENT_CLASS (parent_class)->change_state (element); - if (parent_return != GST_STATE_SUCCESS) - return parent_return; - } + GstV4l2Src *v4l2src; + gint transition = GST_STATE_TRANSITION (element); + GstElementStateReturn parent_return; + GTimeVal time; - switch (transition) { - case GST_STATE_NULL_TO_READY: - if (!gst_v4l2src_get_capture(v4l2src)) - return GST_STATE_FAILURE; - break; - case GST_STATE_READY_TO_PAUSED: - v4l2src->handled = 0; - v4l2src->need_writes = 0; - v4l2src->substract_time = 0; - /* buffer setup moved to capsnego */ - break; - case GST_STATE_PAUSED_TO_PLAYING: - /* queue all buffer, start streaming capture */ - if (!gst_v4l2src_capture_start(v4l2src)) - return GST_STATE_FAILURE; - g_get_current_time(&time); - v4l2src->substract_time = GST_TIMEVAL_TO_TIME(time) - - v4l2src->substract_time; - v4l2src->last_seq = 0; - break; - case GST_STATE_PLAYING_TO_PAUSED: - g_get_current_time(&time); - v4l2src->substract_time = GST_TIMEVAL_TO_TIME(time) - - v4l2src->substract_time; - /* de-queue all queued buffers */ - if (!gst_v4l2src_capture_stop(v4l2src)) - return GST_STATE_FAILURE; - break; - case GST_STATE_PAUSED_TO_READY: - /* stop capturing, unmap all buffers */ - if (!gst_v4l2src_capture_deinit(v4l2src)) - return GST_STATE_FAILURE; - break; - case GST_STATE_READY_TO_NULL: - break; - } + g_return_val_if_fail (GST_IS_V4L2SRC (element), GST_STATE_FAILURE); + v4l2src = GST_V4L2SRC (element); + + if (GST_ELEMENT_CLASS (parent_class)->change_state) { + parent_return = GST_ELEMENT_CLASS (parent_class)->change_state (element); + if (parent_return != GST_STATE_SUCCESS) + return parent_return; + } - return GST_STATE_SUCCESS; + switch (transition) { + case GST_STATE_NULL_TO_READY: + if (!gst_v4l2src_get_capture (v4l2src)) + return GST_STATE_FAILURE; + break; + case GST_STATE_READY_TO_PAUSED: + v4l2src->handled = 0; + v4l2src->need_writes = 0; + v4l2src->substract_time = 0; + /* buffer setup moved to capsnego */ + break; + case GST_STATE_PAUSED_TO_PLAYING: + /* queue all buffer, start streaming capture */ + if (!gst_v4l2src_capture_start (v4l2src)) + return GST_STATE_FAILURE; + g_get_current_time (&time); + v4l2src->substract_time = GST_TIMEVAL_TO_TIME (time) - + v4l2src->substract_time; + v4l2src->last_seq = 0; + break; + case GST_STATE_PLAYING_TO_PAUSED: + g_get_current_time (&time); + v4l2src->substract_time = GST_TIMEVAL_TO_TIME (time) - + v4l2src->substract_time; + /* de-queue all queued buffers */ + if (!gst_v4l2src_capture_stop (v4l2src)) + return GST_STATE_FAILURE; + break; + case GST_STATE_PAUSED_TO_READY: + /* stop capturing, unmap all buffers */ + if (!gst_v4l2src_capture_deinit (v4l2src)) + return GST_STATE_FAILURE; + break; + case GST_STATE_READY_TO_NULL: + break; + } + + return GST_STATE_SUCCESS; } static void -gst_v4l2src_set_clock (GstElement *element, - GstClock *clock) +gst_v4l2src_set_clock (GstElement * element, GstClock * clock) { - GST_V4L2SRC(element)->clock = clock; + GST_V4L2SRC (element)->clock = clock; } - diff --git a/sys/v4l2/gstv4l2src.h b/sys/v4l2/gstv4l2src.h index ca528d1e..d68f9cf8 100644 --- a/sys/v4l2/gstv4l2src.h +++ b/sys/v4l2/gstv4l2src.h @@ -38,72 +38,75 @@ GST_DEBUG_CATEGORY_EXTERN (v4l2src_debug); #define GST_IS_V4L2SRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2SRC)) -typedef struct _GstV4l2BufferPool GstV4l2BufferPool; -typedef struct _GstV4l2Buffer GstV4l2Buffer; -typedef struct _GstV4l2Src GstV4l2Src; -typedef struct _GstV4l2SrcClass GstV4l2SrcClass; +typedef struct _GstV4l2BufferPool GstV4l2BufferPool; +typedef struct _GstV4l2Buffer GstV4l2Buffer; +typedef struct _GstV4l2Src GstV4l2Src; +typedef struct _GstV4l2SrcClass GstV4l2SrcClass; /* global info */ -struct _GstV4l2BufferPool { - GstAtomicInt refcount; /* number of users: 1 for every buffer, 1 for element */ - gint video_fd; - guint buffer_count; - GstV4l2Buffer * buffers; +struct _GstV4l2BufferPool +{ + GstAtomicInt refcount; /* number of users: 1 for every buffer, 1 for element */ + gint video_fd; + guint buffer_count; + GstV4l2Buffer *buffers; }; -struct _GstV4l2Buffer { - struct v4l2_buffer buffer; - guint8 * start; - guint length; - GstAtomicInt refcount; /* add 1 if in use by element, add 1 if in use by GstBuffer */ - GstV4l2BufferPool * pool; +struct _GstV4l2Buffer +{ + struct v4l2_buffer buffer; + guint8 *start; + guint length; + GstAtomicInt refcount; /* add 1 if in use by element, add 1 if in use by GstBuffer */ + GstV4l2BufferPool *pool; }; -struct _GstV4l2Src { - GstV4l2Element v4l2element; +struct _GstV4l2Src +{ + GstV4l2Element v4l2element; - /* pads */ - GstPad *srcpad; + /* pads */ + GstPad *srcpad; - /* internal lists */ - GSList *formats; /* list of available capture formats */ + /* internal lists */ + GSList *formats; /* list of available capture formats */ - /* buffers */ - GstV4l2BufferPool *pool; + /* buffers */ + GstV4l2BufferPool *pool; - struct v4l2_requestbuffers breq; - struct v4l2_format format; + struct v4l2_requestbuffers breq; + struct v4l2_format format; - /* True if we want to stop */ - gboolean quit; + /* True if we want to stop */ + gboolean quit; - /* A/V sync... frame counter and internal cache */ - gulong handled; - gint need_writes; - GstBuffer *cached_buffer; - gulong last_seq; + /* A/V sync... frame counter and internal cache */ + gulong handled; + gint need_writes; + GstBuffer *cached_buffer; + gulong last_seq; - /* clock */ - GstClock *clock; - - /* time to substract from clock time to get back to timestamp */ - GstClockTime substract_time; + /* clock */ + GstClock *clock; - /* how are we going to push buffers? */ - gboolean use_fixed_fps; + /* time to substract from clock time to get back to timestamp */ + GstClockTime substract_time; + + /* how are we going to push buffers? */ + gboolean use_fixed_fps; }; -struct _GstV4l2SrcClass { - GstV4l2ElementClass parent_class; +struct _GstV4l2SrcClass +{ + GstV4l2ElementClass parent_class; - void (*frame_capture) (GObject *object); - void (*frame_drop) (GObject *object); - void (*frame_insert) (GObject *object); - void (*frame_lost) (GObject *object, - gint num_lost); + void (*frame_capture) (GObject * object); + void (*frame_drop) (GObject * object); + void (*frame_insert) (GObject * object); + void (*frame_lost) (GObject * object, gint num_lost); }; -GType gst_v4l2src_get_type(void); +GType gst_v4l2src_get_type (void); #endif /* __GST_V4L2SRC_H__ */ diff --git a/sys/v4l2/gstv4l2tuner.c b/sys/v4l2/gstv4l2tuner.c index f4f2cd64..5d5626f2 100644 --- a/sys/v4l2/gstv4l2tuner.c +++ b/sys/v4l2/gstv4l2tuner.c @@ -30,33 +30,28 @@ #include "gstv4l2element.h" #include "v4l2_calls.h" -static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass *klass); -static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel *channel); +static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * + klass); +static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel); -static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass *klass); -static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm *norm); +static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass); +static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm); -static const GList * - gst_v4l2_tuner_list_channels (GstTuner *mixer); -static void gst_v4l2_tuner_set_channel (GstTuner *mixer, - GstTunerChannel *channel); -static GstTunerChannel * - gst_v4l2_tuner_get_channel (GstTuner *mixer); +static const GList *gst_v4l2_tuner_list_channels (GstTuner * mixer); +static void gst_v4l2_tuner_set_channel (GstTuner * mixer, + GstTunerChannel * channel); +static GstTunerChannel *gst_v4l2_tuner_get_channel (GstTuner * mixer); -static const GList * - gst_v4l2_tuner_list_norms (GstTuner *mixer); -static void gst_v4l2_tuner_set_norm (GstTuner *mixer, - GstTunerNorm *norm); -static GstTunerNorm * - gst_v4l2_tuner_get_norm (GstTuner *mixer); +static const GList *gst_v4l2_tuner_list_norms (GstTuner * mixer); +static void gst_v4l2_tuner_set_norm (GstTuner * mixer, GstTunerNorm * norm); +static GstTunerNorm *gst_v4l2_tuner_get_norm (GstTuner * mixer); -static void gst_v4l2_tuner_set_frequency (GstTuner *mixer, - GstTunerChannel *channel, - gulong frequency); -static gulong gst_v4l2_tuner_get_frequency (GstTuner *mixer, - GstTunerChannel *channel); -static gint gst_v4l2_tuner_signal_strength (GstTuner *mixer, - GstTunerChannel *channel); +static void gst_v4l2_tuner_set_frequency (GstTuner * mixer, + GstTunerChannel * channel, gulong frequency); +static gulong gst_v4l2_tuner_get_frequency (GstTuner * mixer, + GstTunerChannel * channel); +static gint gst_v4l2_tuner_signal_strength (GstTuner * mixer, + GstTunerChannel * channel); static GstTunerNormClass *norm_parent_class = NULL; static GstTunerChannelClass *channel_parent_class = NULL; @@ -82,21 +77,20 @@ gst_v4l2_tuner_channel_get_type (void) gst_v4l2_tuner_channel_type = g_type_register_static (GST_TYPE_TUNER_CHANNEL, - "GstV4l2TunerChannel", - &v4l2_tuner_channel_info, 0); + "GstV4l2TunerChannel", &v4l2_tuner_channel_info, 0); } return gst_v4l2_tuner_channel_type; } static void -gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass *klass) +gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * klass) { channel_parent_class = g_type_class_ref (GST_TYPE_TUNER_CHANNEL); } static void -gst_v4l2_tuner_channel_init (GstV4l2TunerChannel *channel) +gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel) { channel->index = 0; channel->tuner = 0; @@ -124,27 +118,26 @@ gst_v4l2_tuner_norm_get_type (void) gst_v4l2_tuner_norm_type = g_type_register_static (GST_TYPE_TUNER_NORM, - "GstV4l2TunerNorm", - &v4l2_tuner_norm_info, 0); + "GstV4l2TunerNorm", &v4l2_tuner_norm_info, 0); } return gst_v4l2_tuner_norm_type; } static void -gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass *klass) +gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass) { norm_parent_class = g_type_class_ref (GST_TYPE_TUNER_NORM); } static void -gst_v4l2_tuner_norm_init (GstV4l2TunerNorm *norm) +gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm) { norm->index = 0; } void -gst_v4l2_tuner_interface_init (GstTunerClass *klass) +gst_v4l2_tuner_interface_init (GstTunerClass * klass) { /* default virtual functions */ klass->list_channels = gst_v4l2_tuner_list_channels; @@ -161,7 +154,7 @@ gst_v4l2_tuner_interface_init (GstTunerClass *klass) } static gboolean -gst_v4l2_tuner_is_sink (GstV4l2Element *v4l2element) +gst_v4l2_tuner_is_sink (GstV4l2Element * v4l2element) { const GList *pads = gst_element_get_pad_list (GST_ELEMENT (v4l2element)); GstPadDirection dir = GST_PAD_UNKNOWN; @@ -174,8 +167,8 @@ gst_v4l2_tuner_is_sink (GstV4l2Element *v4l2element) } static gboolean -gst_v4l2_tuner_contains_channel (GstV4l2Element *v4l2element, - GstV4l2TunerChannel *v4l2channel) +gst_v4l2_tuner_contains_channel (GstV4l2Element * v4l2element, + GstV4l2TunerChannel * v4l2channel) { const GList *item; @@ -187,15 +180,14 @@ gst_v4l2_tuner_contains_channel (GstV4l2Element *v4l2element, } static const GList * -gst_v4l2_tuner_list_channels (GstTuner *mixer) +gst_v4l2_tuner_list_channels (GstTuner * mixer) { /* ... or output, if we're a sink... */ return GST_V4L2ELEMENT (mixer)->channels; } static void -gst_v4l2_tuner_set_channel (GstTuner *mixer, - GstTunerChannel *channel) +gst_v4l2_tuner_set_channel (GstTuner * mixer, GstTunerChannel * channel) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); @@ -205,7 +197,7 @@ gst_v4l2_tuner_set_channel (GstTuner *mixer, g_return_if_fail (gst_v4l2_tuner_contains_channel (v4l2element, v4l2channel)); /* ... or output, if we're a sink... */ - if (gst_v4l2_tuner_is_sink (v4l2element) ? + if (gst_v4l2_tuner_is_sink (v4l2element) ? gst_v4l2_set_output (v4l2element, v4l2channel->index) : gst_v4l2_set_input (v4l2element, v4l2channel->index)) { gst_tuner_channel_changed (mixer, channel); @@ -214,7 +206,7 @@ gst_v4l2_tuner_set_channel (GstTuner *mixer, } static GstTunerChannel * -gst_v4l2_tuner_get_channel (GstTuner *mixer) +gst_v4l2_tuner_get_channel (GstTuner * mixer) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GList *item; @@ -238,8 +230,8 @@ gst_v4l2_tuner_get_channel (GstTuner *mixer) } static gboolean -gst_v4l2_tuner_contains_norm (GstV4l2Element *v4l2element, - GstV4l2TunerNorm *v4l2norm) +gst_v4l2_tuner_contains_norm (GstV4l2Element * v4l2element, + GstV4l2TunerNorm * v4l2norm) { const GList *item; @@ -251,14 +243,13 @@ gst_v4l2_tuner_contains_norm (GstV4l2Element *v4l2element, } static const GList * -gst_v4l2_tuner_list_norms (GstTuner *mixer) +gst_v4l2_tuner_list_norms (GstTuner * mixer) { return GST_V4L2ELEMENT (mixer)->norms; } static void -gst_v4l2_tuner_set_norm (GstTuner *mixer, - GstTunerNorm *norm) +gst_v4l2_tuner_set_norm (GstTuner * mixer, GstTunerNorm * norm) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GstV4l2TunerNorm *v4l2norm = GST_V4L2_TUNER_NORM (norm); @@ -269,12 +260,12 @@ gst_v4l2_tuner_set_norm (GstTuner *mixer, if (gst_v4l2_set_norm (v4l2element, v4l2norm->index)) { gst_tuner_norm_changed (mixer, norm); - g_object_notify (G_OBJECT (v4l2element), "norm"); + g_object_notify (G_OBJECT (v4l2element), "norm"); } } static GstTunerNorm * -gst_v4l2_tuner_get_norm (GstTuner *mixer) +gst_v4l2_tuner_get_norm (GstTuner * mixer) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GList *item; @@ -294,9 +285,8 @@ gst_v4l2_tuner_get_norm (GstTuner *mixer) } static void -gst_v4l2_tuner_set_frequency (GstTuner *mixer, - GstTunerChannel *channel, - gulong frequency) +gst_v4l2_tuner_set_frequency (GstTuner * mixer, + GstTunerChannel * channel, gulong frequency) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); @@ -305,7 +295,7 @@ gst_v4l2_tuner_set_frequency (GstTuner *mixer, /* assert that we're opened and that we're using a known item */ g_return_if_fail (GST_V4L2_IS_OPEN (v4l2element)); g_return_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, - GST_TUNER_CHANNEL_FREQUENCY)); + GST_TUNER_CHANNEL_FREQUENCY)); g_return_if_fail (gst_v4l2_tuner_contains_channel (v4l2element, v4l2channel)); gst_v4l2_get_input (v4l2element, &chan); @@ -313,14 +303,13 @@ gst_v4l2_tuner_set_frequency (GstTuner *mixer, GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { if (gst_v4l2_set_frequency (v4l2element, v4l2channel->tuner, frequency)) { gst_tuner_frequency_changed (mixer, channel, frequency); - g_object_notify (G_OBJECT (v4l2element), "frequency"); + g_object_notify (G_OBJECT (v4l2element), "frequency"); } } } static gulong -gst_v4l2_tuner_get_frequency (GstTuner *mixer, - GstTunerChannel *channel) +gst_v4l2_tuner_get_frequency (GstTuner * mixer, GstTunerChannel * channel) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); @@ -330,9 +319,9 @@ gst_v4l2_tuner_get_frequency (GstTuner *mixer, /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0); g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, - GST_TUNER_CHANNEL_FREQUENCY), 0); + GST_TUNER_CHANNEL_FREQUENCY), 0); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2element, - v4l2channel), 0); + v4l2channel), 0); gst_v4l2_get_input (v4l2element, &chan); if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && @@ -344,8 +333,7 @@ gst_v4l2_tuner_get_frequency (GstTuner *mixer, } static gint -gst_v4l2_tuner_signal_strength (GstTuner *mixer, - GstTunerChannel *channel) +gst_v4l2_tuner_signal_strength (GstTuner * mixer, GstTunerChannel * channel) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer); GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); @@ -355,9 +343,9 @@ gst_v4l2_tuner_signal_strength (GstTuner *mixer, /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0); g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, - GST_TUNER_CHANNEL_FREQUENCY), 0); + GST_TUNER_CHANNEL_FREQUENCY), 0); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2element, - v4l2channel), 0); + v4l2channel), 0); gst_v4l2_get_input (v4l2element, &chan); if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && diff --git a/sys/v4l2/gstv4l2tuner.h b/sys/v4l2/gstv4l2tuner.h index a768ea2f..729fe221 100644 --- a/sys/v4l2/gstv4l2tuner.h +++ b/sys/v4l2/gstv4l2tuner.h @@ -28,7 +28,6 @@ #include "gstv4l2element.h" G_BEGIN_DECLS - #define GST_TYPE_V4L2_TUNER_CHANNEL \ (gst_v4l2_tuner_channel_get_type ()) #define GST_V4L2_TUNER_CHANNEL(obj) \ @@ -41,16 +40,17 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_TUNER_CHANNEL)) #define GST_IS_V4L2_TUNER_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_CHANNEL)) - -typedef struct _GstV4l2TunerChannel { + typedef struct _GstV4l2TunerChannel +{ GstTunerChannel parent; - guint32 index; - guint32 tuner; - guint32 audio; + guint32 index; + guint32 tuner; + guint32 audio; } GstV4l2TunerChannel; -typedef struct _GstV4l2TunerChannelClass { +typedef struct _GstV4l2TunerChannelClass +{ GstTunerChannelClass parent; } GstV4l2TunerChannelClass; @@ -67,19 +67,21 @@ typedef struct _GstV4l2TunerChannelClass { #define GST_IS_V4L2_TUNER_NORM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_NORM)) -typedef struct _GstV4l2TunerNorm { +typedef struct _GstV4l2TunerNorm +{ GstTunerNorm parent; - v4l2_std_id index; + v4l2_std_id index; } GstV4l2TunerNorm; -typedef struct _GstV4l2TunerNormClass { +typedef struct _GstV4l2TunerNormClass +{ GstTunerNormClass parent; } GstV4l2TunerNormClass; -GType gst_v4l2_tuner_channel_get_type (void); -GType gst_v4l2_tuner_norm_get_type (void); +GType gst_v4l2_tuner_channel_get_type (void); +GType gst_v4l2_tuner_norm_get_type (void); -void gst_v4l2_tuner_interface_init (GstTunerClass *klass); +void gst_v4l2_tuner_interface_init (GstTunerClass * klass); #endif /* __GST_V4L2_TUNER_H__ */ diff --git a/sys/v4l2/gstv4l2xoverlay.c b/sys/v4l2/gstv4l2xoverlay.c index 10c5f77b..1af62cc1 100644 --- a/sys/v4l2/gstv4l2xoverlay.c +++ b/sys/v4l2/gstv4l2xoverlay.c @@ -31,24 +31,23 @@ #include "gstv4l2element.h" #include "v4l2_calls.h" -static void gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay *overlay, - XID xwindow_id); +static void gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay * overlay, + XID xwindow_id); void -gst_v4l2_xoverlay_interface_init (GstXOverlayClass *klass) +gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass) { /* default virtual functions */ klass->set_xwindow_id = gst_v4l2_xoverlay_set_xwindow_id; } GstXWindowListener * -gst_v4l2_xoverlay_new (GstV4l2Element *v4l2element) +gst_v4l2_xoverlay_new (GstV4l2Element * v4l2element) { - GstXWindowListener *xwin = - gst_x_window_listener_new (NULL, - (MapWindowFunc) gst_v4l2_enable_overlay, - (SetWindowFunc) gst_v4l2_set_window, - (gpointer) v4l2element); + GstXWindowListener *xwin = gst_x_window_listener_new (NULL, + (MapWindowFunc) gst_v4l2_enable_overlay, + (SetWindowFunc) gst_v4l2_set_window, + (gpointer) v4l2element); v4l2element->overlay = xwin; v4l2element->xwindow_id = 0; @@ -57,7 +56,7 @@ gst_v4l2_xoverlay_new (GstV4l2Element *v4l2element) } void -gst_v4l2_xoverlay_free (GstV4l2Element *v4l2element) +gst_v4l2_xoverlay_free (GstV4l2Element * v4l2element) { gst_v4l2_xoverlay_close (v4l2element); g_object_unref (G_OBJECT (v4l2element->overlay)); @@ -65,7 +64,7 @@ gst_v4l2_xoverlay_free (GstV4l2Element *v4l2element) } void -gst_v4l2_xoverlay_open (GstV4l2Element *v4l2element) +gst_v4l2_xoverlay_open (GstV4l2Element * v4l2element) { GstXWindowListener *xwin = v4l2element->overlay; @@ -73,22 +72,20 @@ gst_v4l2_xoverlay_open (GstV4l2Element *v4l2element) xwin->display_name = g_strdup (v4l2element->display); if (v4l2element->xwindow_id != 0 && - xwin->display_name && - xwin->display_name[0] == ':') { + xwin->display_name && xwin->display_name[0] == ':') { gst_x_window_listener_set_xid (xwin, v4l2element->xwindow_id); } } } void -gst_v4l2_xoverlay_close (GstV4l2Element *v4l2element) +gst_v4l2_xoverlay_close (GstV4l2Element * v4l2element) { GstXWindowListener *xwin = v4l2element->overlay; if (xwin != NULL) { if (v4l2element->xwindow_id != 0 && - xwin->display_name && - xwin->display_name[0] == ':') { + xwin->display_name && xwin->display_name[0] == ':') { gst_x_window_listener_set_xid (xwin, 0); } @@ -98,8 +95,7 @@ gst_v4l2_xoverlay_close (GstV4l2Element *v4l2element) } static void -gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay *overlay, - XID xwindow_id) +gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) { GstV4l2Element *v4l2element = GST_V4L2ELEMENT (overlay); GstXWindowListener *xwin = v4l2element->overlay; @@ -110,9 +106,7 @@ gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay *overlay, if (gst_element_get_state (GST_ELEMENT (v4l2element)) != GST_STATE_NULL && v4l2element->xwindow_id != 0 && - xwin != NULL && - xwin->display_name && - xwin->display_name[0] == ':') { + xwin != NULL && xwin->display_name && xwin->display_name[0] == ':') { gst_x_window_listener_set_xid (xwin, 0); } @@ -120,9 +114,7 @@ gst_v4l2_xoverlay_set_xwindow_id (GstXOverlay *overlay, if (gst_element_get_state (GST_ELEMENT (v4l2element)) != GST_STATE_NULL && v4l2element->xwindow_id != 0 && - xwin != NULL && - xwin->display_name && - xwin->display_name[0] == ':') { + xwin != NULL && xwin->display_name && xwin->display_name[0] == ':') { gst_x_window_listener_set_xid (xwin, v4l2element->xwindow_id); } } diff --git a/sys/v4l2/gstv4l2xoverlay.h b/sys/v4l2/gstv4l2xoverlay.h index cfcdfd35..d5cb7796 100644 --- a/sys/v4l2/gstv4l2xoverlay.h +++ b/sys/v4l2/gstv4l2xoverlay.h @@ -27,16 +27,13 @@ #include "gstv4l2element.h" -G_BEGIN_DECLS +G_BEGIN_DECLS void gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass); -void gst_v4l2_xoverlay_interface_init (GstXOverlayClass *klass); - -GstXWindowListener * - gst_v4l2_xoverlay_new (GstV4l2Element *v4l2element); -void gst_v4l2_xoverlay_free (GstV4l2Element *v4l2element); +GstXWindowListener *gst_v4l2_xoverlay_new (GstV4l2Element * v4l2element); +void gst_v4l2_xoverlay_free (GstV4l2Element * v4l2element); /* signal handlers */ -void gst_v4l2_xoverlay_open (GstV4l2Element *v4l2element); -void gst_v4l2_xoverlay_close (GstV4l2Element *v4l2element); +void gst_v4l2_xoverlay_open (GstV4l2Element * v4l2element); +void gst_v4l2_xoverlay_close (GstV4l2Element * v4l2element); #endif /* __GST_V4L2_X_OVERLAY_H__ */ diff --git a/sys/v4l2/v4l2-overlay_calls.c b/sys/v4l2/v4l2-overlay_calls.c index 4d948d0b..d4a10ab7 100644 --- a/sys/v4l2/v4l2-overlay_calls.c +++ b/sys/v4l2/v4l2-overlay_calls.c @@ -43,39 +43,37 @@ ******************************************************/ gboolean -gst_v4l2_set_display (GstV4l2Element *v4l2element) +gst_v4l2_set_display (GstV4l2Element * v4l2element) { - gchar *buff; - - if (v4l2element->display) - g_free(v4l2element->display); - v4l2element->display = g_strdup(g_getenv("DISPLAY")); - - DEBUG("trying to set overlay to '%s'", v4l2element->display); - - /* start v4l-conf */ - buff = g_strdup_printf("v4l-conf -q -c %s -d %s", - v4l2element->device, v4l2element->display); - - switch (system(buff)) { - case -1: - GST_ELEMENT_ERROR (v4l2element, RESOURCE, FAILED, - (_("Could not start v4l-conf.")), - GST_ERROR_SYSTEM); - g_free(buff); - return FALSE; - case 0: - break; - default: - GST_ELEMENT_ERROR (v4l2element, RESOURCE, FAILED, - (_("Executing v4l-conf failed.")), - GST_ERROR_SYSTEM); - g_free(buff); - return FALSE; - } - - g_free(buff); - return TRUE; + gchar *buff; + + if (v4l2element->display) + g_free (v4l2element->display); + v4l2element->display = g_strdup (g_getenv ("DISPLAY")); + + DEBUG ("trying to set overlay to '%s'", v4l2element->display); + + /* start v4l-conf */ + buff = g_strdup_printf ("v4l-conf -q -c %s -d %s", + v4l2element->device, v4l2element->display); + + switch (system (buff)) { + case -1: + GST_ELEMENT_ERROR (v4l2element, RESOURCE, FAILED, + (_("Could not start v4l-conf.")), GST_ERROR_SYSTEM); + g_free (buff); + return FALSE; + case 0: + break; + default: + GST_ELEMENT_ERROR (v4l2element, RESOURCE, FAILED, + (_("Executing v4l-conf failed.")), GST_ERROR_SYSTEM); + g_free (buff); + return FALSE; + } + + g_free (buff); + return TRUE; } @@ -86,38 +84,33 @@ gst_v4l2_set_display (GstV4l2Element *v4l2element) ******************************************************/ gboolean -gst_v4l2_set_window (GstElement *element, - gint x, - gint y, - gint w, - gint h, - struct v4l2_clip *clips, - gint num_clips) +gst_v4l2_set_window (GstElement * element, + gint x, gint y, gint w, gint h, struct v4l2_clip * clips, gint num_clips) { - struct v4l2_format fmt; - GstV4l2Element *v4l2element = GST_V4L2ELEMENT(element); - - DEBUG("trying to set video window to %dx%d,%d,%d", x,y,w,h); - GST_V4L2_CHECK_OVERLAY(v4l2element); - GST_V4L2_CHECK_OPEN(v4l2element); - - fmt.type = V4L2_CAP_VIDEO_OVERLAY; - fmt.fmt.win.clipcount = 0; - fmt.fmt.win.w.left = x; - fmt.fmt.win.w.top = y; - fmt.fmt.win.w.width = w; - fmt.fmt.win.w.height = h; - fmt.fmt.win.clips = clips; - fmt.fmt.win.clipcount = num_clips; - fmt.fmt.win.bitmap = NULL; - - if (ioctl(v4l2element->video_fd, VIDIOC_S_FMT, &fmt) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, TOO_LAZY, (NULL), - ("Failed to set the video window: %s", g_strerror (errno))); - return FALSE; - } - - return TRUE; + struct v4l2_format fmt; + GstV4l2Element *v4l2element = GST_V4L2ELEMENT (element); + + DEBUG ("trying to set video window to %dx%d,%d,%d", x, y, w, h); + GST_V4L2_CHECK_OVERLAY (v4l2element); + GST_V4L2_CHECK_OPEN (v4l2element); + + fmt.type = V4L2_CAP_VIDEO_OVERLAY; + fmt.fmt.win.clipcount = 0; + fmt.fmt.win.w.left = x; + fmt.fmt.win.w.top = y; + fmt.fmt.win.w.width = w; + fmt.fmt.win.w.height = h; + fmt.fmt.win.clips = clips; + fmt.fmt.win.clipcount = num_clips; + fmt.fmt.win.bitmap = NULL; + + if (ioctl (v4l2element->video_fd, VIDIOC_S_FMT, &fmt) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, TOO_LAZY, (NULL), + ("Failed to set the video window: %s", g_strerror (errno))); + return FALSE; + } + + return TRUE; } @@ -128,21 +121,20 @@ gst_v4l2_set_window (GstElement *element, ******************************************************/ gboolean -gst_v4l2_enable_overlay (GstV4l2Element *v4l2element, - gboolean enable) +gst_v4l2_enable_overlay (GstV4l2Element * v4l2element, gboolean enable) { - gint doit = enable?1:0; + gint doit = enable ? 1 : 0; - DEBUG("trying to %s overlay display", enable?"enable":"disable"); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_OVERLAY(v4l2element); + DEBUG ("trying to %s overlay display", enable ? "enable" : "disable"); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_OVERLAY (v4l2element); - if (ioctl(v4l2element->video_fd, VIDIOC_OVERLAY, &doit) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, TOO_LAZY, (NULL), - ("Failed to %s overlay display: %s", - enable?"enable":"disable", g_strerror (errno))); - return FALSE; - } + if (ioctl (v4l2element->video_fd, VIDIOC_OVERLAY, &doit) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, TOO_LAZY, (NULL), + ("Failed to %s overlay display: %s", + enable ? "enable" : "disable", g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c index f7c3d3a0..f75ea550 100644 --- a/sys/v4l2/v4l2_calls.c +++ b/sys/v4l2/v4l2_calls.c @@ -49,19 +49,19 @@ ******************************************************/ static gboolean -gst_v4l2_get_capabilities (GstV4l2Element *v4l2element) +gst_v4l2_get_capabilities (GstV4l2Element * v4l2element) { - DEBUG("getting capabilities"); - GST_V4L2_CHECK_OPEN(v4l2element); - - if (ioctl(v4l2element->video_fd, VIDIOC_QUERYCAP, &(v4l2element->vcap)) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Error getting %s capabilities: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + DEBUG ("getting capabilities"); + GST_V4L2_CHECK_OPEN (v4l2element); + + if (ioctl (v4l2element->video_fd, VIDIOC_QUERYCAP, &(v4l2element->vcap)) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Error getting %s capabilities: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -72,288 +72,269 @@ gst_v4l2_get_capabilities (GstV4l2Element *v4l2element) ******************************************************/ static gboolean -gst_v4l2_fill_lists (GstV4l2Element *v4l2element) +gst_v4l2_fill_lists (GstV4l2Element * v4l2element) { - gint n; - const GList *pads = - gst_element_get_pad_list (GST_ELEMENT (v4l2element)); - GstPadDirection dir = GST_PAD_UNKNOWN; - - DEBUG("getting enumerations"); - GST_V4L2_CHECK_OPEN(v4l2element); - - /* sinks have outputs, all others have inputs */ - if (pads && g_list_length ((GList *) pads) == 1) - dir = GST_PAD_DIRECTION (GST_PAD (pads->data)); - - if (dir != GST_PAD_SINK) { - /* and now, the inputs */ - for (n=0;;n++) { - struct v4l2_input input; - GstV4l2TunerChannel *v4l2channel; - GstTunerChannel *channel; - - input.index = n; - if (ioctl(v4l2element->video_fd, VIDIOC_ENUMINPUT, - &input) < 0) { - if (errno == EINVAL) - break; /* end of enumeration */ - else { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get %d in input enumeration for %s: %s", - n, v4l2element->device, - g_strerror (errno))); - return FALSE; - } - } - - v4l2channel = - g_object_new(GST_TYPE_V4L2_TUNER_CHANNEL, NULL); - channel = GST_TUNER_CHANNEL(v4l2channel); - channel->label = g_strdup(input.name); - channel->flags = GST_TUNER_CHANNEL_INPUT; - v4l2channel->index = n; - if (input.type == V4L2_INPUT_TYPE_TUNER) { - struct v4l2_tuner vtun; - - v4l2channel->tuner = input.tuner; - channel->flags |= GST_TUNER_CHANNEL_FREQUENCY; - - vtun.index = input.tuner; - if (ioctl(v4l2element->video_fd, VIDIOC_G_TUNER, - &vtun) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get tuner %d settings on %s: %s", - input.tuner, - v4l2element->device, - g_strerror (errno))); - g_object_unref(G_OBJECT(channel)); - return FALSE; - } - channel->min_frequency = vtun.rangelow; - channel->max_frequency = vtun.rangehigh; - channel->min_signal = 0; - channel->max_signal = 0xffff; - } - if (input.audioset) { - /* we take the first. We don't care for - * the others for now */ - while (!(input.audioset & - (1<audio))) - v4l2channel->audio++; - channel->flags |= GST_TUNER_CHANNEL_AUDIO; - } - - v4l2element->channels = - g_list_append(v4l2element->channels, - (gpointer) channel); - } - } else { - /* outputs */ - for (n=0;;n++) { - struct v4l2_output output; - GstV4l2TunerChannel *v4l2channel; - GstTunerChannel *channel; - - output.index = n; - if (ioctl(v4l2element->video_fd, VIDIOC_ENUMOUTPUT, - &output) < 0) { - if (errno == EINVAL) - break; /* end of enumeration */ - else { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get %d in output enumeration for %s: %s", - n, v4l2element->device, - g_strerror (errno))); - return FALSE; - } - } - - v4l2channel = g_object_new(GST_TYPE_V4L2_TUNER_CHANNEL, NULL); - channel = GST_TUNER_CHANNEL(v4l2channel); - channel->label = g_strdup(output.name); - channel->flags = GST_TUNER_CHANNEL_OUTPUT; - v4l2channel->index = n; - if (output.audioset) { - /* we take the first. We don't care for - * the others for now */ - while (!(output.audioset & - (1<audio))) - v4l2channel->audio++; - channel->flags |= GST_TUNER_CHANNEL_AUDIO; - } - - v4l2element->channels = - g_list_append(v4l2element->channels, - (gpointer) channel); - } + gint n; + const GList *pads = gst_element_get_pad_list (GST_ELEMENT (v4l2element)); + GstPadDirection dir = GST_PAD_UNKNOWN; + + DEBUG ("getting enumerations"); + GST_V4L2_CHECK_OPEN (v4l2element); + + /* sinks have outputs, all others have inputs */ + if (pads && g_list_length ((GList *) pads) == 1) + dir = GST_PAD_DIRECTION (GST_PAD (pads->data)); + + if (dir != GST_PAD_SINK) { + /* and now, the inputs */ + for (n = 0;; n++) { + struct v4l2_input input; + GstV4l2TunerChannel *v4l2channel; + GstTunerChannel *channel; + + input.index = n; + if (ioctl (v4l2element->video_fd, VIDIOC_ENUMINPUT, &input) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get %d in input enumeration for %s: %s", + n, v4l2element->device, g_strerror (errno))); + return FALSE; } - - /* norms... */ - for (n=0;;n++) { - struct v4l2_standard standard; - GstV4l2TunerNorm *v4l2norm; - GstTunerNorm *norm; - - standard.index = n; - if (ioctl(v4l2element->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { - if (errno == EINVAL) - break; /* end of enumeration */ - else { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get %d in norm enumeration for %s: %s", - n, v4l2element->device, - g_strerror (errno))); - return FALSE; - } - } - - v4l2norm = g_object_new(GST_TYPE_V4L2_TUNER_NORM, NULL); - norm = GST_TUNER_NORM (v4l2norm); - norm->label = g_strdup(standard.name); - norm->fps = (gfloat) standard.frameperiod.denominator / - standard.frameperiod.numerator; - v4l2norm->index = standard.id; - - v4l2element->norms = g_list_append(v4l2element->norms, - (gpointer) norm); + } + + v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); + channel = GST_TUNER_CHANNEL (v4l2channel); + channel->label = g_strdup (input.name); + channel->flags = GST_TUNER_CHANNEL_INPUT; + v4l2channel->index = n; + if (input.type == V4L2_INPUT_TYPE_TUNER) { + struct v4l2_tuner vtun; + + v4l2channel->tuner = input.tuner; + channel->flags |= GST_TUNER_CHANNEL_FREQUENCY; + + vtun.index = input.tuner; + if (ioctl (v4l2element->video_fd, VIDIOC_G_TUNER, &vtun) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get tuner %d settings on %s: %s", + input.tuner, v4l2element->device, g_strerror (errno))); + g_object_unref (G_OBJECT (channel)); + return FALSE; + } + channel->min_frequency = vtun.rangelow; + channel->max_frequency = vtun.rangehigh; + channel->min_signal = 0; + channel->max_signal = 0xffff; + } + if (input.audioset) { + /* we take the first. We don't care for + * the others for now */ + while (!(input.audioset & (1 << v4l2channel->audio))) + v4l2channel->audio++; + channel->flags |= GST_TUNER_CHANNEL_AUDIO; + } + + v4l2element->channels = + g_list_append (v4l2element->channels, (gpointer) channel); + } + } else { + /* outputs */ + for (n = 0;; n++) { + struct v4l2_output output; + GstV4l2TunerChannel *v4l2channel; + GstTunerChannel *channel; + + output.index = n; + if (ioctl (v4l2element->video_fd, VIDIOC_ENUMOUTPUT, &output) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get %d in output enumeration for %s: %s", + n, v4l2element->device, g_strerror (errno))); + return FALSE; } + } + + v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); + channel = GST_TUNER_CHANNEL (v4l2channel); + channel->label = g_strdup (output.name); + channel->flags = GST_TUNER_CHANNEL_OUTPUT; + v4l2channel->index = n; + if (output.audioset) { + /* we take the first. We don't care for + * the others for now */ + while (!(output.audioset & (1 << v4l2channel->audio))) + v4l2channel->audio++; + channel->flags |= GST_TUNER_CHANNEL_AUDIO; + } + + v4l2element->channels = + g_list_append (v4l2element->channels, (gpointer) channel); + } + } - /* and lastly, controls+menus (if appropriate) */ - for (n=V4L2_CID_BASE;;n++) { - struct v4l2_queryctrl control; - GstV4l2ColorBalanceChannel *v4l2channel; - GstColorBalanceChannel *channel; - - /* hacky... */ - if (n == V4L2_CID_LASTP1) - n = V4L2_CID_PRIVATE_BASE; - - control.id = n; - if (ioctl(v4l2element->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { - if (errno == EINVAL) { - if (n < V4L2_CID_PRIVATE_BASE) - continue; - else - break; - } else { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get %d in control enumeration for %s: %s", - n, v4l2element->device, - g_strerror (errno))); - return FALSE; - } - } - if (control.flags & V4L2_CTRL_FLAG_DISABLED) - continue; - - switch (n) { - case V4L2_CID_BRIGHTNESS: - case V4L2_CID_CONTRAST: - case V4L2_CID_SATURATION: - case V4L2_CID_HUE: - case V4L2_CID_BLACK_LEVEL: - case V4L2_CID_AUTO_WHITE_BALANCE: - case V4L2_CID_DO_WHITE_BALANCE: - case V4L2_CID_RED_BALANCE: - case V4L2_CID_BLUE_BALANCE: - case V4L2_CID_GAMMA: - case V4L2_CID_EXPOSURE: - case V4L2_CID_AUTOGAIN: - case V4L2_CID_GAIN: - /* we only handle these for now */ - break; - default: - DEBUG("ControlID %s (%d) unhandled, FIXME", - control.name, n); - control.id++; - break; - } - if (n != control.id) - continue; - - v4l2channel = g_object_new(GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, - NULL); - channel = GST_COLOR_BALANCE_CHANNEL(v4l2channel); - channel->label = g_strdup(control.name); - v4l2channel->index = n; + /* norms... */ + for (n = 0;; n++) { + struct v4l2_standard standard; + GstV4l2TunerNorm *v4l2norm; + GstTunerNorm *norm; + + standard.index = n; + if (ioctl (v4l2element->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get %d in norm enumeration for %s: %s", + n, v4l2element->device, g_strerror (errno))); + return FALSE; + } + } + + v4l2norm = g_object_new (GST_TYPE_V4L2_TUNER_NORM, NULL); + norm = GST_TUNER_NORM (v4l2norm); + norm->label = g_strdup (standard.name); + norm->fps = (gfloat) standard.frameperiod.denominator / + standard.frameperiod.numerator; + v4l2norm->index = standard.id; + + v4l2element->norms = g_list_append (v4l2element->norms, (gpointer) norm); + } + + /* and lastly, controls+menus (if appropriate) */ + for (n = V4L2_CID_BASE;; n++) { + struct v4l2_queryctrl control; + GstV4l2ColorBalanceChannel *v4l2channel; + GstColorBalanceChannel *channel; + + /* hacky... */ + if (n == V4L2_CID_LASTP1) + n = V4L2_CID_PRIVATE_BASE; + + control.id = n; + if (ioctl (v4l2element->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { + if (errno == EINVAL) { + if (n < V4L2_CID_PRIVATE_BASE) + continue; + else + break; + } else { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get %d in control enumeration for %s: %s", + n, v4l2element->device, g_strerror (errno))); + return FALSE; + } + } + if (control.flags & V4L2_CTRL_FLAG_DISABLED) + continue; + + switch (n) { + case V4L2_CID_BRIGHTNESS: + case V4L2_CID_CONTRAST: + case V4L2_CID_SATURATION: + case V4L2_CID_HUE: + case V4L2_CID_BLACK_LEVEL: + case V4L2_CID_AUTO_WHITE_BALANCE: + case V4L2_CID_DO_WHITE_BALANCE: + case V4L2_CID_RED_BALANCE: + case V4L2_CID_BLUE_BALANCE: + case V4L2_CID_GAMMA: + case V4L2_CID_EXPOSURE: + case V4L2_CID_AUTOGAIN: + case V4L2_CID_GAIN: + /* we only handle these for now */ + break; + default: + DEBUG ("ControlID %s (%d) unhandled, FIXME", control.name, n); + control.id++; + break; + } + if (n != control.id) + continue; + + v4l2channel = g_object_new (GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, NULL); + channel = GST_COLOR_BALANCE_CHANNEL (v4l2channel); + channel->label = g_strdup (control.name); + v4l2channel->index = n; #if 0 - if (control.type == V4L2_CTRL_TYPE_MENU) { - struct v4l2_querymenu menu, *mptr; - int i; - menu.id = n; - for (i=0;;i++) { - menu.index = i; - if (ioctl(v4l2element->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { - if (errno == EINVAL) - break; /* end of enumeration */ - else { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get %d in menu enumeration for %s: %s", - n, v4l2element->device, - g_strerror (errno))); - return FALSE; - } - } - mptr = g_malloc(sizeof(menu)); - memcpy(mptr, &menu, sizeof(menu)); - menus = g_list_append(menus, mptr); - } - } - v4l2element->menus = g_list_append(v4l2element->menus, menus); + if (control.type == V4L2_CTRL_TYPE_MENU) { + struct v4l2_querymenu menu, *mptr; + int i; + + menu.id = n; + for (i = 0;; i++) { + menu.index = i; + if (ioctl (v4l2element->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get %d in menu enumeration for %s: %s", + n, v4l2element->device, g_strerror (errno))); + return FALSE; + } + } + mptr = g_malloc (sizeof (menu)); + memcpy (mptr, &menu, sizeof (menu)); + menus = g_list_append (menus, mptr); + } + } + v4l2element->menus = g_list_append (v4l2element->menus, menus); #endif - switch (control.type) { - case V4L2_CTRL_TYPE_INTEGER: - channel->min_value = control.minimum; - channel->max_value = control.maximum; - break; - case V4L2_CTRL_TYPE_BOOLEAN: - channel->min_value = FALSE; - channel->max_value = TRUE; - break; - default: - channel->min_value = - channel->max_value = 0; - break; - } - - v4l2element->colors = g_list_append(v4l2element->colors, - (gpointer) channel); - } + switch (control.type) { + case V4L2_CTRL_TYPE_INTEGER: + channel->min_value = control.minimum; + channel->max_value = control.maximum; + break; + case V4L2_CTRL_TYPE_BOOLEAN: + channel->min_value = FALSE; + channel->max_value = TRUE; + break; + default: + channel->min_value = channel->max_value = 0; + break; + } - return TRUE; + v4l2element->colors = g_list_append (v4l2element->colors, + (gpointer) channel); + } + + return TRUE; } static void -gst_v4l2_empty_lists (GstV4l2Element *v4l2element) +gst_v4l2_empty_lists (GstV4l2Element * v4l2element) { - DEBUG("deleting enumerations"); + DEBUG ("deleting enumerations"); - g_list_foreach (v4l2element->channels, (GFunc) g_object_unref, NULL); - g_list_free (v4l2element->channels); - v4l2element->channels = NULL; + g_list_foreach (v4l2element->channels, (GFunc) g_object_unref, NULL); + g_list_free (v4l2element->channels); + v4l2element->channels = NULL; - g_list_foreach (v4l2element->norms, (GFunc) g_object_unref, NULL); - g_list_free (v4l2element->norms); - v4l2element->norms = NULL; + g_list_foreach (v4l2element->norms, (GFunc) g_object_unref, NULL); + g_list_free (v4l2element->norms); + v4l2element->norms = NULL; - g_list_foreach (v4l2element->colors, (GFunc) g_object_unref, NULL); - g_list_free (v4l2element->colors); - v4l2element->colors = NULL; + g_list_foreach (v4l2element->colors, (GFunc) g_object_unref, NULL); + g_list_free (v4l2element->colors); + v4l2element->colors = NULL; } /* FIXME: move this stuff to gstv4l2tuner.c? */ static void -gst_v4l2_set_defaults (GstV4l2Element *v4l2element) +gst_v4l2_set_defaults (GstV4l2Element * v4l2element) { GstTunerNorm *norm = NULL; GstTunerChannel *channel = NULL; GstTuner *tuner = GST_TUNER (v4l2element); - + if (v4l2element->norm) norm = gst_tuner_find_norm_by_name (tuner, v4l2element->norm); if (norm) { @@ -362,18 +343,19 @@ gst_v4l2_set_defaults (GstV4l2Element *v4l2element) norm = GST_TUNER_NORM (gst_tuner_get_norm (GST_TUNER (v4l2element))); v4l2element->norm = g_strdup (norm->label); gst_tuner_norm_changed (tuner, norm); - g_object_notify (G_OBJECT (v4l2element), "norm"); + g_object_notify (G_OBJECT (v4l2element), "norm"); } - - if (v4l2element->channel) + + if (v4l2element->channel) channel = gst_tuner_find_channel_by_name (tuner, v4l2element->channel); if (channel) { gst_tuner_set_channel (tuner, channel); } else { - channel = GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER (v4l2element))); + channel = + GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER (v4l2element))); v4l2element->channel = g_strdup (channel->label); gst_tuner_channel_changed (tuner, channel); - g_object_notify (G_OBJECT (v4l2element), "channel"); + g_object_notify (G_OBJECT (v4l2element), "channel"); } if (v4l2element->frequency != 0) { gst_tuner_set_frequency (tuner, channel, v4l2element->frequency); @@ -396,61 +378,61 @@ gst_v4l2_set_defaults (GstV4l2Element *v4l2element) ******************************************************/ gboolean -gst_v4l2_open (GstV4l2Element *v4l2element) +gst_v4l2_open (GstV4l2Element * v4l2element) { - DEBUG("Trying to open device %s", v4l2element->device); - GST_V4L2_CHECK_NOT_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); - - /* be sure we have a device */ - if (!v4l2element->device) - v4l2element->device = g_strdup("/dev/video"); - - /* open the device */ - v4l2element->video_fd = open(v4l2element->device, O_RDWR); - if (!GST_V4L2_IS_OPEN(v4l2element)) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, OPEN_READ_WRITE, - (_("Could not open device \"%s\" for reading and writing."), v4l2element->device), - GST_ERROR_SYSTEM); - goto error; - } + DEBUG ("Trying to open device %s", v4l2element->device); + GST_V4L2_CHECK_NOT_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); + + /* be sure we have a device */ + if (!v4l2element->device) + v4l2element->device = g_strdup ("/dev/video"); + + /* open the device */ + v4l2element->video_fd = open (v4l2element->device, O_RDWR); + if (!GST_V4L2_IS_OPEN (v4l2element)) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, OPEN_READ_WRITE, + (_("Could not open device \"%s\" for reading and writing."), + v4l2element->device), GST_ERROR_SYSTEM); + goto error; + } - /* get capabilities */ - if (!gst_v4l2_get_capabilities(v4l2element)) { - goto error; - } + /* get capabilities */ + if (!gst_v4l2_get_capabilities (v4l2element)) { + goto error; + } - /* do we need to be a capture device? */ - if (GST_IS_V4L2SRC(v4l2element) && - !(v4l2element->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, NOT_FOUND, - (_("Device \"%s\" is not a capture device."), v4l2element->device), - ("Capabilities: 0x%x", v4l2element->vcap.capabilities)); - goto error; - } + /* do we need to be a capture device? */ + if (GST_IS_V4L2SRC (v4l2element) && + !(v4l2element->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, NOT_FOUND, + (_("Device \"%s\" is not a capture device."), v4l2element->device), + ("Capabilities: 0x%x", v4l2element->vcap.capabilities)); + goto error; + } - /* create enumerations */ - if (!gst_v4l2_fill_lists(v4l2element)) - goto error; + /* create enumerations */ + if (!gst_v4l2_fill_lists (v4l2element)) + goto error; - /* set defaults */ - gst_v4l2_set_defaults (v4l2element); + /* set defaults */ + gst_v4l2_set_defaults (v4l2element); - GST_INFO_OBJECT (v4l2element, "Opened device '%s' (%s) successfully\n", - v4l2element->vcap.card, v4l2element->device); + GST_INFO_OBJECT (v4l2element, "Opened device '%s' (%s) successfully\n", + v4l2element->vcap.card, v4l2element->device); - return TRUE; + return TRUE; error: - if (GST_V4L2_IS_OPEN(v4l2element)) { - /* close device */ - close(v4l2element->video_fd); - v4l2element->video_fd = -1; - } - /* empty lists */ - gst_v4l2_empty_lists(v4l2element); + if (GST_V4L2_IS_OPEN (v4l2element)) { + /* close device */ + close (v4l2element->video_fd); + v4l2element->video_fd = -1; + } + /* empty lists */ + gst_v4l2_empty_lists (v4l2element); - return FALSE; + return FALSE; } @@ -461,20 +443,20 @@ error: ******************************************************/ gboolean -gst_v4l2_close (GstV4l2Element *v4l2element) +gst_v4l2_close (GstV4l2Element * v4l2element) { - DEBUG("Trying to close %s", v4l2element->device); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); + DEBUG ("Trying to close %s", v4l2element->device); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); - /* close device */ - close(v4l2element->video_fd); - v4l2element->video_fd = -1; + /* close device */ + close (v4l2element->video_fd); + v4l2element->video_fd = -1; - /* empty lists */ - gst_v4l2_empty_lists(v4l2element); + /* empty lists */ + gst_v4l2_empty_lists (v4l2element); - return TRUE; + return TRUE; } @@ -485,20 +467,19 @@ gst_v4l2_close (GstV4l2Element *v4l2element) ******************************************************/ gboolean -gst_v4l2_get_norm (GstV4l2Element *v4l2element, - v4l2_std_id *norm) +gst_v4l2_get_norm (GstV4l2Element * v4l2element, v4l2_std_id * norm) { - DEBUG("getting norm"); - GST_V4L2_CHECK_OPEN(v4l2element); - - if (ioctl(v4l2element->video_fd, VIDIOC_G_STD, norm) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get the current norm for device %s: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + DEBUG ("getting norm"); + GST_V4L2_CHECK_OPEN (v4l2element); + + if (ioctl (v4l2element->video_fd, VIDIOC_G_STD, norm) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get the current norm for device %s: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -509,21 +490,20 @@ gst_v4l2_get_norm (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_set_norm (GstV4l2Element *v4l2element, - v4l2_std_id norm) +gst_v4l2_set_norm (GstV4l2Element * v4l2element, v4l2_std_id norm) { - DEBUG("trying to set norm to %llx", norm); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); - - if (ioctl(v4l2element->video_fd, VIDIOC_S_STD, &norm) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to set norm 0x%llx for device %s: %s", - norm, v4l2element->device, g_strerror(errno))); - return FALSE; - } + DEBUG ("trying to set norm to %llx", norm); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); + + if (ioctl (v4l2element->video_fd, VIDIOC_S_STD, &norm) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to set norm 0x%llx for device %s: %s", + norm, v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -534,24 +514,23 @@ gst_v4l2_set_norm (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_get_input (GstV4l2Element *v4l2element, - gint *input) +gst_v4l2_get_input (GstV4l2Element * v4l2element, gint * input) { - gint n; + gint n; - DEBUG("trying to get input"); - GST_V4L2_CHECK_OPEN(v4l2element); + DEBUG ("trying to get input"); + GST_V4L2_CHECK_OPEN (v4l2element); - if (ioctl(v4l2element->video_fd, VIDIOC_G_INPUT, &n) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get current input on device %s: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + if (ioctl (v4l2element->video_fd, VIDIOC_G_INPUT, &n) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get current input on device %s: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - *input = n; + *input = n; - return TRUE; + return TRUE; } @@ -562,21 +541,20 @@ gst_v4l2_get_input (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_set_input (GstV4l2Element *v4l2element, - gint input) +gst_v4l2_set_input (GstV4l2Element * v4l2element, gint input) { - DEBUG("trying to set input to %d", input); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); - - if (ioctl(v4l2element->video_fd, VIDIOC_S_INPUT, &input) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to set input %d on device %s: %s", - input, v4l2element->device, g_strerror(errno))); - return FALSE; - } + DEBUG ("trying to set input to %d", input); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); + + if (ioctl (v4l2element->video_fd, VIDIOC_S_INPUT, &input) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to set input %d on device %s: %s", + input, v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -587,24 +565,23 @@ gst_v4l2_set_input (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_get_output (GstV4l2Element *v4l2element, - gint *output) +gst_v4l2_get_output (GstV4l2Element * v4l2element, gint * output) { - gint n; + gint n; - DEBUG("trying to get output"); - GST_V4L2_CHECK_OPEN(v4l2element); + DEBUG ("trying to get output"); + GST_V4L2_CHECK_OPEN (v4l2element); - if (ioctl(v4l2element->video_fd, VIDIOC_G_OUTPUT, &n) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get current output on device %s: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + if (ioctl (v4l2element->video_fd, VIDIOC_G_OUTPUT, &n) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get current output on device %s: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - *output = n; + *output = n; - return TRUE; + return TRUE; } @@ -615,21 +592,20 @@ gst_v4l2_get_output (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_set_output (GstV4l2Element *v4l2element, - gint output) +gst_v4l2_set_output (GstV4l2Element * v4l2element, gint output) { - DEBUG("trying to set output to %d", output); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); - - if (ioctl(v4l2element->video_fd, VIDIOC_S_OUTPUT, &output) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to set output %d on device %s: %s", - output, v4l2element->device, g_strerror(errno))); - return FALSE; - } + DEBUG ("trying to set output to %d", output); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); + + if (ioctl (v4l2element->video_fd, VIDIOC_S_OUTPUT, &output) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to set output %d on device %s: %s", + output, v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -640,26 +616,25 @@ gst_v4l2_set_output (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_get_frequency (GstV4l2Element *v4l2element, - gint tunernum, - gulong *frequency) +gst_v4l2_get_frequency (GstV4l2Element * v4l2element, + gint tunernum, gulong * frequency) { - struct v4l2_frequency freq; + struct v4l2_frequency freq; - DEBUG("getting current tuner frequency"); - GST_V4L2_CHECK_OPEN(v4l2element); + DEBUG ("getting current tuner frequency"); + GST_V4L2_CHECK_OPEN (v4l2element); - freq.tuner = tunernum; - if (ioctl(v4l2element->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get current tuner frequency for device %s: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + freq.tuner = tunernum; + if (ioctl (v4l2element->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get current tuner frequency for device %s: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - *frequency = freq.frequency; + *frequency = freq.frequency; - return TRUE; + return TRUE; } @@ -670,29 +645,28 @@ gst_v4l2_get_frequency (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_set_frequency (GstV4l2Element *v4l2element, - gint tunernum, - gulong frequency) +gst_v4l2_set_frequency (GstV4l2Element * v4l2element, + gint tunernum, gulong frequency) { - struct v4l2_frequency freq; - - DEBUG("setting current tuner frequency to %lu", frequency); - GST_V4L2_CHECK_OPEN(v4l2element); - GST_V4L2_CHECK_NOT_ACTIVE(v4l2element); - - freq.tuner = tunernum; - /* fill in type - ignore error */ - ioctl(v4l2element->video_fd, VIDIOC_G_FREQUENCY, &freq); - freq.frequency = frequency; - - if (ioctl(v4l2element->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to set tuner frequency to %lu for device %s: %s", - frequency, v4l2element->device, g_strerror(errno))); - return FALSE; - } + struct v4l2_frequency freq; + + DEBUG ("setting current tuner frequency to %lu", frequency); + GST_V4L2_CHECK_OPEN (v4l2element); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2element); + + freq.tuner = tunernum; + /* fill in type - ignore error */ + ioctl (v4l2element->video_fd, VIDIOC_G_FREQUENCY, &freq); + freq.frequency = frequency; + + if (ioctl (v4l2element->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to set tuner frequency to %lu for device %s: %s", + frequency, v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -703,26 +677,25 @@ gst_v4l2_set_frequency (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_signal_strength (GstV4l2Element *v4l2element, - gint tunernum, - gulong *signal_strength) +gst_v4l2_signal_strength (GstV4l2Element * v4l2element, + gint tunernum, gulong * signal_strength) { - struct v4l2_tuner tuner; + struct v4l2_tuner tuner; - DEBUG("trying to get signal strength"); - GST_V4L2_CHECK_OPEN(v4l2element); + DEBUG ("trying to get signal strength"); + GST_V4L2_CHECK_OPEN (v4l2element); - tuner.index = tunernum; - if (ioctl(v4l2element->video_fd, VIDIOC_G_TUNER, &tuner) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get signal strength for device %s: %s", - v4l2element->device, g_strerror(errno))); - return FALSE; - } + tuner.index = tunernum; + if (ioctl (v4l2element->video_fd, VIDIOC_G_TUNER, &tuner) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get signal strength for device %s: %s", + v4l2element->device, g_strerror (errno))); + return FALSE; + } - *signal_strength = tuner.signal; + *signal_strength = tuner.signal; - return TRUE; + return TRUE; } @@ -733,28 +706,27 @@ gst_v4l2_signal_strength (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_get_attribute (GstV4l2Element *v4l2element, - int attribute_num, - int *value) +gst_v4l2_get_attribute (GstV4l2Element * v4l2element, + int attribute_num, int *value) { - struct v4l2_control control; + struct v4l2_control control; - GST_V4L2_CHECK_OPEN(v4l2element); + GST_V4L2_CHECK_OPEN (v4l2element); - DEBUG("getting value of attribute %d", attribute_num); + DEBUG ("getting value of attribute %d", attribute_num); - control.id = attribute_num; + control.id = attribute_num; - if (ioctl(v4l2element->video_fd, VIDIOC_G_CTRL, &control) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to get value for control %d on device %s: %s", - attribute_num, v4l2element->device, g_strerror(errno))); - return FALSE; - } + if (ioctl (v4l2element->video_fd, VIDIOC_G_CTRL, &control) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to get value for control %d on device %s: %s", + attribute_num, v4l2element->device, g_strerror (errno))); + return FALSE; + } - *value = control.value; + *value = control.value; - return TRUE; + return TRUE; } @@ -765,26 +737,24 @@ gst_v4l2_get_attribute (GstV4l2Element *v4l2element, ******************************************************/ gboolean -gst_v4l2_set_attribute (GstV4l2Element *v4l2element, - int attribute_num, - const int value) +gst_v4l2_set_attribute (GstV4l2Element * v4l2element, + int attribute_num, const int value) { - struct v4l2_control control; + struct v4l2_control control; - GST_V4L2_CHECK_OPEN(v4l2element); + GST_V4L2_CHECK_OPEN (v4l2element); - DEBUG("setting value of attribute %d to %d", attribute_num, value); + DEBUG ("setting value of attribute %d to %d", attribute_num, value); - control.id = attribute_num; - control.value = value; + control.id = attribute_num; + control.value = value; - if (ioctl(v4l2element->video_fd, VIDIOC_S_CTRL, &control) < 0) { - GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), - ("Failed to set value %d for control %d on device %s: %s", - value, attribute_num, v4l2element->device, g_strerror(errno))); - return FALSE; - } + if (ioctl (v4l2element->video_fd, VIDIOC_S_CTRL, &control) < 0) { + GST_ELEMENT_ERROR (v4l2element, RESOURCE, SETTINGS, (NULL), + ("Failed to set value %d for control %d on device %s: %s", + value, attribute_num, v4l2element->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } - diff --git a/sys/v4l2/v4l2_calls.h b/sys/v4l2/v4l2_calls.h index 428c57aa..488e7bca 100644 --- a/sys/v4l2/v4l2_calls.h +++ b/sys/v4l2/v4l2_calls.h @@ -82,50 +82,36 @@ /* open/close the device */ -gboolean gst_v4l2_open (GstV4l2Element *v4l2element); -gboolean gst_v4l2_close (GstV4l2Element *v4l2element); +gboolean gst_v4l2_open (GstV4l2Element * v4l2element); +gboolean gst_v4l2_close (GstV4l2Element * v4l2element); /* norm/input/output */ -gboolean gst_v4l2_get_norm (GstV4l2Element *v4l2element, - v4l2_std_id *norm); -gboolean gst_v4l2_set_norm (GstV4l2Element *v4l2element, - v4l2_std_id norm); -gboolean gst_v4l2_get_input (GstV4l2Element *v4l2element, - gint *input); -gboolean gst_v4l2_set_input (GstV4l2Element *v4l2element, - gint input); -gboolean gst_v4l2_get_output (GstV4l2Element *v4l2element, - gint *output); -gboolean gst_v4l2_set_output (GstV4l2Element *v4l2element, - gint output); +gboolean gst_v4l2_get_norm (GstV4l2Element * v4l2element, v4l2_std_id * norm); +gboolean gst_v4l2_set_norm (GstV4l2Element * v4l2element, v4l2_std_id norm); +gboolean gst_v4l2_get_input (GstV4l2Element * v4l2element, gint * input); +gboolean gst_v4l2_set_input (GstV4l2Element * v4l2element, gint input); +gboolean gst_v4l2_get_output (GstV4l2Element * v4l2element, gint * output); +gboolean gst_v4l2_set_output (GstV4l2Element * v4l2element, gint output); /* frequency control */ -gboolean gst_v4l2_get_frequency (GstV4l2Element *v4l2element, - gint tunernum, - gulong *frequency); -gboolean gst_v4l2_set_frequency (GstV4l2Element *v4l2element, - gint tunernum, - gulong frequency); -gboolean gst_v4l2_signal_strength (GstV4l2Element *v4l2element, - gint tunernum, - gulong *signal); +gboolean gst_v4l2_get_frequency (GstV4l2Element * v4l2element, + gint tunernum, gulong * frequency); +gboolean gst_v4l2_set_frequency (GstV4l2Element * v4l2element, + gint tunernum, gulong frequency); +gboolean gst_v4l2_signal_strength (GstV4l2Element * v4l2element, + gint tunernum, gulong * signal); /* attribute control */ -gboolean gst_v4l2_get_attribute (GstV4l2Element *v4l2element, - int attribute, - int *value); -gboolean gst_v4l2_set_attribute (GstV4l2Element *v4l2element, - int attribute, - const int value); +gboolean gst_v4l2_get_attribute (GstV4l2Element * v4l2element, + int attribute, int *value); +gboolean gst_v4l2_set_attribute (GstV4l2Element * v4l2element, + int attribute, const int value); /* overlay */ -gboolean gst_v4l2_set_display (GstV4l2Element *v4l2element); -gboolean gst_v4l2_set_window (GstElement *element, - gint x, gint y, - gint w, gint h, - struct v4l2_clip *clips, - gint num_clips); -gboolean gst_v4l2_enable_overlay (GstV4l2Element *v4l2element, - gboolean enable); +gboolean gst_v4l2_set_display (GstV4l2Element * v4l2element); +gboolean gst_v4l2_set_window (GstElement * element, + gint x, gint y, gint w, gint h, struct v4l2_clip *clips, gint num_clips); +gboolean gst_v4l2_enable_overlay (GstV4l2Element * v4l2element, + gboolean enable); #endif /* __V4L2_CALLS_H__ */ diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c index 8b3276a6..00d710eb 100644 --- a/sys/v4l2/v4l2src_calls.c +++ b/sys/v4l2/v4l2src_calls.c @@ -56,7 +56,7 @@ ******************************************************/ gboolean -gst_v4l2src_fill_format_list (GstV4l2Src *v4l2src) +gst_v4l2src_fill_format_list (GstV4l2Src * v4l2src) { gint n; struct v4l2_fmtdesc *format; @@ -64,22 +64,24 @@ gst_v4l2src_fill_format_list (GstV4l2Src *v4l2src) GST_DEBUG_OBJECT (v4l2src, "getting src format enumerations"); /* format enumeration */ - for (n=0;;n++) { + for (n = 0;; n++) { format = g_new (struct v4l2_fmtdesc, 1); + format->index = n; format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_ENUM_FMT, format) < 0) { + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_ENUM_FMT, + format) < 0) { if (errno == EINVAL) { - break; /* end of enumeration */ + break; /* end of enumeration */ } else { GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), ("failed to get number %d in pixelformat enumeration for %s: %s", - n, GST_V4L2ELEMENT(v4l2src)->device, g_strerror (errno))); + n, GST_V4L2ELEMENT (v4l2src)->device, g_strerror (errno))); g_free (format); return FALSE; } } - GST_LOG_OBJECT (v4l2src, "got format"GST_FOURCC_FORMAT, + GST_LOG_OBJECT (v4l2src, "got format" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format->pixelformat)); v4l2src->formats = g_slist_prepend (v4l2src->formats, format); } @@ -95,7 +97,7 @@ gst_v4l2src_fill_format_list (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_clear_format_list (GstV4l2Src *v4l2src) +gst_v4l2src_clear_format_list (GstV4l2Src * v4l2src) { g_slist_foreach (v4l2src->formats, (GFunc) g_free, NULL); g_slist_free (v4l2src->formats); @@ -111,15 +113,16 @@ gst_v4l2src_clear_format_list (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_queue_frame (GstV4l2Src *v4l2src, - guint i) +gst_v4l2src_queue_frame (GstV4l2Src * v4l2src, guint i) { GST_LOG_OBJECT (v4l2src, "queueing frame %u", i); - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_QBUF, &v4l2src->pool->buffers[i].buffer) < 0) { + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_QBUF, + &v4l2src->pool->buffers[i].buffer) < 0) { GST_ELEMENT_ERROR (v4l2src, RESOURCE, WRITE, - (_("Could not write to device \"%s\"."), GST_V4L2ELEMENT(v4l2src)->device), - ("Error queueing buffer %u on device %s", i, g_strerror(errno))); + (_("Could not write to device \"%s\"."), + GST_V4L2ELEMENT (v4l2src)->device), + ("Error queueing buffer %u on device %s", i, g_strerror (errno))); return FALSE; } @@ -134,16 +137,17 @@ gst_v4l2src_queue_frame (GstV4l2Src *v4l2src, ******************************************************/ gint -gst_v4l2src_grab_frame (GstV4l2Src *v4l2src) +gst_v4l2src_grab_frame (GstV4l2Src * v4l2src) { struct v4l2_buffer buffer; - + buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - while (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_DQBUF, &buffer) < 0) { + while (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_DQBUF, &buffer) < 0) { /* if the sync() got interrupted, we can retry */ if (errno != EINTR) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, SYNC, (NULL), ("could not sync on a buffer on device %s: %s", - GST_V4L2ELEMENT(v4l2src)->device, g_strerror (errno))); + GST_ELEMENT_ERROR (v4l2src, RESOURCE, SYNC, (NULL), + ("could not sync on a buffer on device %s: %s", + GST_V4L2ELEMENT (v4l2src)->device, g_strerror (errno))); return -1; } GST_DEBUG_OBJECT (v4l2src, "grab got interrupted"); @@ -162,21 +166,22 @@ gst_v4l2src_grab_frame (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_get_capture (GstV4l2Src *v4l2src) +gst_v4l2src_get_capture (GstV4l2Src * v4l2src) { - DEBUG("Getting capture format"); + DEBUG ("Getting capture format"); - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); - v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_G_FMT, &v4l2src->format) < 0) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), - ("failed to get pixelformat for device %s: %s", - GST_V4L2ELEMENT(v4l2src)->device, g_strerror (errno))); - return FALSE; - } + v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_G_FMT, + &v4l2src->format) < 0) { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), + ("failed to get pixelformat for device %s: %s", + GST_V4L2ELEMENT (v4l2src)->device, g_strerror (errno))); + return FALSE; + } - return TRUE; + return TRUE; } @@ -187,33 +192,33 @@ gst_v4l2src_get_capture (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_set_capture (GstV4l2Src *v4l2src, - struct v4l2_fmtdesc *fmt, - gint width, - gint height) +gst_v4l2src_set_capture (GstV4l2Src * v4l2src, + struct v4l2_fmtdesc * fmt, gint width, gint height) { - DEBUG("Setting capture format to %dx%d, format %s", - width, height, fmt->description); - - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); - GST_V4L2_CHECK_NOT_ACTIVE(GST_V4L2ELEMENT(v4l2src)); - - memset(&v4l2src->format, 0, sizeof(struct v4l2_format)); - v4l2src->format.fmt.pix.width = width; - v4l2src->format.fmt.pix.height = height; - v4l2src->format.fmt.pix.pixelformat = fmt->pixelformat; - v4l2src->format.fmt.pix.field = V4L2_FIELD_INTERLACED; - v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_S_FMT, &v4l2src->format) < 0) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), - ("failed to set pixelformat to %s @ %dx%d for device %s: %s", - fmt->description, width, height, GST_V4L2ELEMENT(v4l2src)->device, g_strerror (errno))); - return FALSE; - } - - /* update internal info */ - return gst_v4l2src_get_capture(v4l2src); + DEBUG ("Setting capture format to %dx%d, format %s", + width, height, fmt->description); + + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); + GST_V4L2_CHECK_NOT_ACTIVE (GST_V4L2ELEMENT (v4l2src)); + + memset (&v4l2src->format, 0, sizeof (struct v4l2_format)); + v4l2src->format.fmt.pix.width = width; + v4l2src->format.fmt.pix.height = height; + v4l2src->format.fmt.pix.pixelformat = fmt->pixelformat; + v4l2src->format.fmt.pix.field = V4L2_FIELD_INTERLACED; + v4l2src->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_S_FMT, + &v4l2src->format) < 0) { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, SETTINGS, (NULL), + ("failed to set pixelformat to %s @ %dx%d for device %s: %s", + fmt->description, width, height, GST_V4L2ELEMENT (v4l2src)->device, + g_strerror (errno))); + return FALSE; + } + + /* update internal info */ + return gst_v4l2src_get_capture (v4l2src); } @@ -224,15 +229,15 @@ gst_v4l2src_set_capture (GstV4l2Src *v4l2src, ******************************************************/ gboolean -gst_v4l2src_capture_init (GstV4l2Src *v4l2src) +gst_v4l2src_capture_init (GstV4l2Src * v4l2src) { gint n; guint buffers; GST_DEBUG_OBJECT (v4l2src, "initting the capture system"); - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); - GST_V4L2_CHECK_NOT_ACTIVE(GST_V4L2ELEMENT(v4l2src)); + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); + GST_V4L2_CHECK_NOT_ACTIVE (GST_V4L2ELEMENT (v4l2src)); /* request buffer info */ buffers = v4l2src->breq.count; @@ -244,25 +249,32 @@ gst_v4l2src_capture_init (GstV4l2Src *v4l2src) } v4l2src->breq.type = v4l2src->format.type; v4l2src->breq.memory = V4L2_MEMORY_MMAP; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_REQBUFS, &v4l2src->breq) < 0) { + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_REQBUFS, + &v4l2src->breq) < 0) { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, - (_("Could not get buffers from device \"%s\"."), GST_V4L2ELEMENT(v4l2src)->device), - ("error requesting %d buffers: %s", v4l2src->breq.count, g_strerror (errno))); + (_("Could not get buffers from device \"%s\"."), + GST_V4L2ELEMENT (v4l2src)->device), + ("error requesting %d buffers: %s", v4l2src->breq.count, + g_strerror (errno))); return FALSE; } if (v4l2src->breq.count < GST_V4L2_MIN_BUFFERS) { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, - (_("Could not get enough buffers from device \"%s\"."), GST_V4L2ELEMENT(v4l2src)->device), - ("we received %d, we want at least %d", v4l2src->breq.count, GST_V4L2_MIN_BUFFERS)); + (_("Could not get enough buffers from device \"%s\"."), + GST_V4L2ELEMENT (v4l2src)->device), + ("we received %d, we want at least %d", v4l2src->breq.count, + GST_V4L2_MIN_BUFFERS)); v4l2src->breq.count = buffers; return FALSE; } if (v4l2src->breq.count != buffers) g_object_notify (G_OBJECT (v4l2src), "num_buffers"); - GST_INFO_OBJECT (v4l2src, "Got %d buffers ("GST_FOURCC_FORMAT") of size %d KB\n", - v4l2src->breq.count, GST_FOURCC_ARGS (v4l2src->format.fmt.pix.pixelformat), + GST_INFO_OBJECT (v4l2src, + "Got %d buffers (" GST_FOURCC_FORMAT ") of size %d KB\n", + v4l2src->breq.count, + GST_FOURCC_ARGS (v4l2src->format.fmt.pix.pixelformat), v4l2src->format.fmt.pix.sizeimage / 1024); /* Map the buffers */ @@ -279,29 +291,32 @@ gst_v4l2src_capture_init (GstV4l2Src *v4l2src) buffer->pool = v4l2src->pool; buffer->buffer.index = n; buffer->buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_QUERYBUF, &buffer->buffer) < 0) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), - ("Could not get buffer properties of buffer %d: %s", n, g_strerror (errno))); - gst_v4l2src_capture_deinit(v4l2src); + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_QUERYBUF, + &buffer->buffer) < 0) { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), + ("Could not get buffer properties of buffer %d: %s", n, + g_strerror (errno))); + gst_v4l2src_capture_deinit (v4l2src); return FALSE; } - buffer->start = mmap (0, buffer->buffer.length, PROT_READ|PROT_WRITE, MAP_SHARED, - GST_V4L2ELEMENT(v4l2src)->video_fd, buffer->buffer.m.offset); + buffer->start = + mmap (0, buffer->buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED, + GST_V4L2ELEMENT (v4l2src)->video_fd, buffer->buffer.m.offset); if (buffer->start == MAP_FAILED) { - GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), - ("Could not mmap video buffer %d: %s", n, g_strerror (errno))); + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), + ("Could not mmap video buffer %d: %s", n, g_strerror (errno))); buffer->start = 0; gst_v4l2src_capture_deinit (v4l2src); return FALSE; } buffer->length = buffer->buffer.length; - if (!gst_v4l2src_queue_frame(v4l2src, n)) { + if (!gst_v4l2src_queue_frame (v4l2src, n)) { gst_v4l2src_capture_deinit (v4l2src); return FALSE; } } - GST_V4L2_SET_ACTIVE(GST_V4L2ELEMENT (v4l2src)); + GST_V4L2_SET_ACTIVE (GST_V4L2ELEMENT (v4l2src)); return TRUE; } @@ -313,24 +328,24 @@ gst_v4l2src_capture_init (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_capture_start (GstV4l2Src *v4l2src) +gst_v4l2src_capture_start (GstV4l2Src * v4l2src) { gint type = V4L2_BUF_TYPE_VIDEO_CAPTURE; GST_DEBUG_OBJECT (v4l2src, "starting the capturing"); - - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); - if (!GST_V4L2_IS_ACTIVE (GST_V4L2ELEMENT(v4l2src))) { + + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); + if (!GST_V4L2_IS_ACTIVE (GST_V4L2ELEMENT (v4l2src))) { gst_pad_renegotiate (v4l2src->srcpad); } - GST_V4L2_CHECK_ACTIVE(GST_V4L2ELEMENT(v4l2src)); + GST_V4L2_CHECK_ACTIVE (GST_V4L2ELEMENT (v4l2src)); v4l2src->quit = FALSE; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_STREAMON, &type) < 0) { + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_STREAMON, &type) < 0) { GST_ELEMENT_ERROR (v4l2src, RESOURCE, OPEN_READ, (NULL), - ("Error starting streaming capture from device %s: %s", - GST_V4L2ELEMENT(v4l2src)->device, g_strerror(errno))); + ("Error starting streaming capture from device %s: %s", + GST_V4L2ELEMENT (v4l2src)->device, g_strerror (errno))); return FALSE; } @@ -345,31 +360,31 @@ gst_v4l2src_capture_start (GstV4l2Src *v4l2src) ******************************************************/ gboolean -gst_v4l2src_capture_stop (GstV4l2Src *v4l2src) +gst_v4l2src_capture_stop (GstV4l2Src * v4l2src) { gint type = V4L2_BUF_TYPE_VIDEO_CAPTURE; GST_DEBUG_OBJECT (v4l2src, "stopping capturing"); - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); - GST_V4L2_CHECK_ACTIVE(GST_V4L2ELEMENT(v4l2src)); + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); + GST_V4L2_CHECK_ACTIVE (GST_V4L2ELEMENT (v4l2src)); /* we actually need to sync on all queued buffers but not * on the non-queued ones */ - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_STREAMOFF, &type) < 0) { + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_STREAMOFF, &type) < 0) { GST_ELEMENT_ERROR (v4l2src, RESOURCE, CLOSE, (NULL), - ("Error stopping streaming capture from device %s: %s", - GST_V4L2ELEMENT(v4l2src)->device, g_strerror (errno))); + ("Error stopping streaming capture from device %s: %s", + GST_V4L2ELEMENT (v4l2src)->device, g_strerror (errno))); return FALSE; } /* make an optional pending wait stop */ v4l2src->quit = TRUE; - + return TRUE; } static void -gst_v4l2src_buffer_pool_free (GstV4l2BufferPool *pool, gboolean do_close) +gst_v4l2src_buffer_pool_free (GstV4l2BufferPool * pool, gboolean do_close) { guint i; @@ -385,16 +400,16 @@ gst_v4l2src_buffer_pool_free (GstV4l2BufferPool *pool, gboolean do_close) } void -gst_v4l2src_free_buffer (GstBuffer *buffer) +gst_v4l2src_free_buffer (GstBuffer * buffer) { GstV4l2Buffer *buf = (GstV4l2Buffer *) GST_BUFFER_PRIVATE (buffer); - + GST_LOG ("freeing buffer %p (nr. %d)", buffer, buf->buffer.index); - + if (!gst_atomic_int_dec_and_test (&buf->refcount)) { /* we're still in use, add to queue again note: this might fail because the device is already stopped (race) */ - if (ioctl(buf->pool->video_fd, VIDIOC_QBUF, &buf->buffer) < 0) + if (ioctl (buf->pool->video_fd, VIDIOC_QBUF, &buf->buffer) < 0) GST_INFO ("readding to queue failed, assuming video device is stopped"); } if (gst_atomic_int_dec_and_test (&buf->pool->refcount)) { @@ -410,14 +425,14 @@ gst_v4l2src_free_buffer (GstBuffer *buffer) ******************************************************/ gboolean -gst_v4l2src_capture_deinit (GstV4l2Src *v4l2src) +gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src) { gint i, dequeue = 0; - + GST_DEBUG_OBJECT (v4l2src, "deinitting capture system"); - - GST_V4L2_CHECK_OPEN(GST_V4L2ELEMENT(v4l2src)); - GST_V4L2_CHECK_ACTIVE(GST_V4L2ELEMENT(v4l2src)); + + GST_V4L2_CHECK_OPEN (GST_V4L2ELEMENT (v4l2src)); + GST_V4L2_CHECK_ACTIVE (GST_V4L2ELEMENT (v4l2src)); /* free the buffers */ for (i = 0; i < v4l2src->breq.count; i++) { @@ -426,16 +441,18 @@ gst_v4l2src_capture_deinit (GstV4l2Src *v4l2src) } for (i = 0; i < dequeue; i++) { struct v4l2_buffer buffer; - buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, VIDIOC_DQBUF, &buffer) < 0) - GST_WARNING_OBJECT (v4l2src, "Could not dequeue buffer on uninitialization"); + + buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_DQBUF, &buffer) < 0) + GST_WARNING_OBJECT (v4l2src, + "Could not dequeue buffer on uninitialization"); } if (gst_atomic_int_dec_and_test (&v4l2src->pool->refcount)) { /* we're last thing that used all this */ gst_v4l2src_buffer_pool_free (v4l2src->pool, FALSE); } v4l2src->pool = NULL; - + GST_V4L2_SET_INACTIVE (GST_V4L2ELEMENT (v4l2src)); return TRUE; } @@ -446,46 +463,45 @@ gst_v4l2src_capture_deinit (GstV4l2Src *v4l2src) */ gboolean -gst_v4l2src_get_size_limits (GstV4l2Src *v4l2src, - struct v4l2_fmtdesc *format, - gint *min_w, gint *max_w, - gint *min_h, gint *max_h) +gst_v4l2src_get_size_limits (GstV4l2Src * v4l2src, + struct v4l2_fmtdesc * format, + gint * min_w, gint * max_w, gint * min_h, gint * max_h) { - struct v4l2_format fmt; - - GST_LOG_OBJECT (v4l2src, "getting size limits with format " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (format->pixelformat)); - - /* get size delimiters */ - memset(&fmt, 0, sizeof(fmt)); - fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - fmt.fmt.pix.width = 0; - fmt.fmt.pix.height = 0; - fmt.fmt.pix.pixelformat = format->pixelformat; - fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, - VIDIOC_TRY_FMT, &fmt) < 0) { - return FALSE; - } - - if (min_w) - *min_w = fmt.fmt.pix.width; - if (min_h) - *min_h = fmt.fmt.pix.height; - GST_LOG_OBJECT (v4l2src, "got min size %dx%d", fmt.fmt.pix.width, fmt.fmt.pix.height); - - fmt.fmt.pix.width = G_MAXINT; - fmt.fmt.pix.height = 576; - if (ioctl(GST_V4L2ELEMENT(v4l2src)->video_fd, - VIDIOC_TRY_FMT, &fmt) < 0) { - return FALSE; - } - - if (max_w) - *max_w = fmt.fmt.pix.width; - if (max_h) - *max_h = fmt.fmt.pix.height; - GST_LOG_OBJECT (v4l2src, "got max size %dx%d", fmt.fmt.pix.width, fmt.fmt.pix.height); - - return TRUE; + struct v4l2_format fmt; + + GST_LOG_OBJECT (v4l2src, "getting size limits with format " GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (format->pixelformat)); + + /* get size delimiters */ + memset (&fmt, 0, sizeof (fmt)); + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + fmt.fmt.pix.width = 0; + fmt.fmt.pix.height = 0; + fmt.fmt.pix.pixelformat = format->pixelformat; + fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_TRY_FMT, &fmt) < 0) { + return FALSE; + } + + if (min_w) + *min_w = fmt.fmt.pix.width; + if (min_h) + *min_h = fmt.fmt.pix.height; + GST_LOG_OBJECT (v4l2src, "got min size %dx%d", fmt.fmt.pix.width, + fmt.fmt.pix.height); + + fmt.fmt.pix.width = G_MAXINT; + fmt.fmt.pix.height = 576; + if (ioctl (GST_V4L2ELEMENT (v4l2src)->video_fd, VIDIOC_TRY_FMT, &fmt) < 0) { + return FALSE; + } + + if (max_w) + *max_w = fmt.fmt.pix.width; + if (max_h) + *max_h = fmt.fmt.pix.height; + GST_LOG_OBJECT (v4l2src, "got max size %dx%d", fmt.fmt.pix.width, + fmt.fmt.pix.height); + + return TRUE; } diff --git a/sys/v4l2/v4l2src_calls.h b/sys/v4l2/v4l2src_calls.h index dc5fca0c..043dddf0 100644 --- a/sys/v4l2/v4l2src_calls.h +++ b/sys/v4l2/v4l2src_calls.h @@ -24,30 +24,25 @@ #include "v4l2_calls.h" -gboolean gst_v4l2src_get_capture (GstV4l2Src *v4l2src); -gboolean gst_v4l2src_set_capture (GstV4l2Src *v4l2src, - struct v4l2_fmtdesc *fmt, - gint width, - gint height); -gboolean gst_v4l2src_capture_init (GstV4l2Src *v4l2src); -gboolean gst_v4l2src_capture_start (GstV4l2Src *v4l2src); -gint gst_v4l2src_grab_frame (GstV4l2Src *v4l2src); -guint8 * gst_v4l2src_get_buffer (GstV4l2Src *v4l2src, - gint num); -gboolean gst_v4l2src_queue_frame (GstV4l2Src *v4l2src, - guint i); -gboolean gst_v4l2src_capture_stop (GstV4l2Src *v4l2src); -gboolean gst_v4l2src_capture_deinit (GstV4l2Src *v4l2src); - -gboolean gst_v4l2src_fill_format_list (GstV4l2Src *v4l2src); -gboolean gst_v4l2src_clear_format_list (GstV4l2Src *v4l2src); +gboolean gst_v4l2src_get_capture (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_set_capture (GstV4l2Src * v4l2src, + struct v4l2_fmtdesc *fmt, gint width, gint height); +gboolean gst_v4l2src_capture_init (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_capture_start (GstV4l2Src * v4l2src); +gint gst_v4l2src_grab_frame (GstV4l2Src * v4l2src); +guint8 *gst_v4l2src_get_buffer (GstV4l2Src * v4l2src, gint num); +gboolean gst_v4l2src_queue_frame (GstV4l2Src * v4l2src, guint i); +gboolean gst_v4l2src_capture_stop (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src); + +gboolean gst_v4l2src_fill_format_list (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_clear_format_list (GstV4l2Src * v4l2src); /* hacky */ -gboolean gst_v4l2src_get_size_limits (GstV4l2Src *v4l2src, - struct v4l2_fmtdesc *fmt, - gint *min_w, gint *max_w, - gint *min_h, gint *max_h); +gboolean gst_v4l2src_get_size_limits (GstV4l2Src * v4l2src, + struct v4l2_fmtdesc *fmt, + gint * min_w, gint * max_w, gint * min_h, gint * max_h); + +void gst_v4l2src_free_buffer (GstBuffer * buffer); -void gst_v4l2src_free_buffer (GstBuffer *buffer); - #endif /* __V4L2SRC_CALLS_H__ */ diff --git a/tests/examples/spectrum/demo-osssrc.c b/tests/examples/spectrum/demo-osssrc.c index 3431ec91..462fcf90 100644 --- a/tests/examples/spectrum/demo-osssrc.c +++ b/tests/examples/spectrum/demo-osssrc.c @@ -3,12 +3,14 @@ extern gboolean _gst_plugin_spew; -void spectrum_chain(GstPad *pad,GstData *_data); -gboolean idle_func(gpointer data); +void spectrum_chain (GstPad * pad, GstData * _data); +gboolean idle_func (gpointer data); GtkWidget *drawingarea; -int main(int argc,char *argv[]) { +int +main (int argc, char *argv[]) +{ GstElement *bin; GstElementFactory *srcfactory; GstElement *src; @@ -20,63 +22,67 @@ int main(int argc,char *argv[]) { _gst_plugin_spew = TRUE; - gst_init(&argc,&argv); - gnome_init("Spectrum","0.0.1",argc,argv); + gst_init (&argc, &argv); + gnome_init ("Spectrum", "0.0.1", argc, argv); - bin = gst_bin_new("bin"); + bin = gst_bin_new ("bin"); - srcfactory = gst_element_factory_find("osssrc"); - spectrumfactory = gst_element_factory_find("gstspectrum"); + srcfactory = gst_element_factory_find ("osssrc"); + spectrumfactory = gst_element_factory_find ("gstspectrum"); - src = gst_element_factory_create(srcfactory,"src"); - gtk_object_set(GTK_OBJECT(src),"bytes_per_read",(gulong)1024,NULL); - spectrum = gst_element_factory_create(spectrumfactory,"spectrum"); - gtk_object_set(GTK_OBJECT(spectrum),"width",256,NULL); + src = gst_element_factory_create (srcfactory, "src"); + gtk_object_set (GTK_OBJECT (src), "bytes_per_read", (gulong) 1024, NULL); + spectrum = gst_element_factory_create (spectrumfactory, "spectrum"); + gtk_object_set (GTK_OBJECT (spectrum), "width", 256, NULL); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(src)); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(spectrum)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (src)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (spectrum)); - gst_pad_link(gst_element_get_pad(src,"src"), - gst_element_get_pad(spectrum,"sink")); + gst_pad_link (gst_element_get_pad (src, "src"), + gst_element_get_pad (spectrum, "sink")); - spectrumpad = gst_pad_new("sink",GST_PAD_SINK); - gst_pad_set_chain_function(spectrumpad,spectrum_chain); + spectrumpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_pad_set_chain_function (spectrumpad, spectrum_chain); - gst_pad_link(gst_element_get_pad(spectrum,"src"),spectrumpad); + gst_pad_link (gst_element_get_pad (spectrum, "src"), spectrumpad); - appwindow = gnome_app_new("spectrum","Spectrum"); - drawingarea = gtk_drawing_area_new(); - gtk_drawing_area_size(GTK_DRAWING_AREA(drawingarea),256,32); - gnome_app_set_contents(GNOME_APP(appwindow),drawingarea); - gtk_widget_show_all(appwindow); + appwindow = gnome_app_new ("spectrum", "Spectrum"); + drawingarea = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), 256, 32); + gnome_app_set_contents (GNOME_APP (appwindow), drawingarea); + gtk_widget_show_all (appwindow); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_READY); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_PLAYING); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING); - g_idle_add(idle_func,src); + g_idle_add (idle_func, src); - gtk_main(); + gtk_main (); return 0; } -void spectrum_chain(GstPad *pad,GstData *_data) { +void +spectrum_chain (GstPad * pad, GstData * _data) +{ GstBuffer *buf = GST_BUFFER (_data); gint i; guchar *data = buf->data; - gdk_draw_rectangle(drawingarea->window,drawingarea->style->black_gc, - TRUE,0,0,GST_BUFFER_SIZE(buf),25); - for (i=0;iwindow,drawingarea->style->white_gc, - TRUE,i,32-data[i],1,data[i]); + gdk_draw_rectangle (drawingarea->window, drawingarea->style->black_gc, + TRUE, 0, 0, GST_BUFFER_SIZE (buf), 25); + for (i = 0; i < GST_BUFFER_SIZE (buf); i++) { + gdk_draw_rectangle (drawingarea->window, drawingarea->style->white_gc, + TRUE, i, 32 - data[i], 1, data[i]); } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } -gboolean idle_func(gpointer data) { +gboolean +idle_func (gpointer data) +{ /*gst_src_push(GST_SRC(data)); */ return TRUE; } diff --git a/tests/old/examples/switch/switcher.c b/tests/old/examples/switch/switcher.c index d0bc4a67..6296f6ad 100644 --- a/tests/old/examples/switch/switcher.c +++ b/tests/old/examples/switch/switcher.c @@ -16,7 +16,7 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -28,38 +28,36 @@ static GMainLoop *loop = NULL; static void -got_eos (GstElement *pipeline) +got_eos (GstElement * pipeline) { g_main_loop_quit (loop); } static gboolean -idle_iterate (GstElement *pipeline) +idle_iterate (GstElement * pipeline) { gst_bin_iterate (GST_BIN (pipeline)); return (GST_STATE (GST_ELEMENT (pipeline)) == GST_STATE_PLAYING); } static gboolean -switch_timer (GstElement *video_switch) +switch_timer (GstElement * video_switch) { gint nb_sources, active_source; - + g_object_get (G_OBJECT (video_switch), "nb_sources", &nb_sources, NULL); - g_object_get (G_OBJECT (video_switch), "active_source", - &active_source, NULL); - - active_source ++; - + g_object_get (G_OBJECT (video_switch), "active_source", &active_source, NULL); + + active_source++; + if (active_source > nb_sources - 1) active_source = 0; - - g_object_set (G_OBJECT (video_switch), "active_source", - active_source, NULL); - + + g_object_set (G_OBJECT (video_switch), "active_source", active_source, NULL); + g_message ("current number of sources : %d, active source %d", - nb_sources, active_source); - + nb_sources, active_source); + return (GST_STATE (GST_ELEMENT (video_switch)) == GST_STATE_PLAYING); } @@ -72,7 +70,7 @@ main (int argc, char *argv[]) gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); - + pipeline = gst_pipeline_new ("pipeline"); src1 = gst_element_factory_make ("videotestsrc", "src1"); g_object_set (G_OBJECT (src1), "pattern", 0, NULL); @@ -80,26 +78,25 @@ main (int argc, char *argv[]) g_object_set (G_OBJECT (src2), "pattern", 1, NULL); video_switch = gst_element_factory_make ("switch", "video_switch"); video_sink = gst_element_factory_make ("ximagesink", "video_sink"); - + gst_bin_add_many (GST_BIN (pipeline), src1, src2, video_switch, - video_sink, NULL); - + video_sink, NULL); + gst_element_link (src1, video_switch); gst_element_link (src2, video_switch); gst_element_link (video_switch, video_sink); - - g_signal_connect (G_OBJECT (pipeline), "eos", - G_CALLBACK (got_eos), NULL); + + g_signal_connect (G_OBJECT (pipeline), "eos", G_CALLBACK (got_eos), NULL); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); - + g_idle_add ((GSourceFunc) idle_iterate, pipeline); g_timeout_add (2000, (GSourceFunc) switch_timer, video_switch); - + g_main_loop_run (loop); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY); - + /* unref */ gst_object_unref (GST_OBJECT (pipeline)); -- cgit