From 81e72d14b456dd613f73f68fb3ccf4c0502a3811 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 1 Mar 2006 16:24:37 +0000 Subject: [PATCH] Updated/added documentation. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-base-plugins-docs.sgml: * docs/plugins/gst-plugins-base-plugins-sections.txt: * ext/pango/gstclockoverlay.h: * ext/pango/gsttextoverlay.h: * ext/pango/gsttextrender.h: * ext/pango/gsttimeoverlay.h: * ext/theora/gsttheoradec.h: * ext/theora/gsttheoraenc.h: * ext/theora/theoradec.c: * ext/theora/theoraenc.c: * gst/audioconvert/gstaudioconvert.h: * gst/audiotestsrc/gstaudiotestsrc.h: * gst/ffmpegcolorspace/gstffmpegcolorspace.h: * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init): * gst/tcp/gstmultifdsink.h: Updated/added documentation. * ext/pango/gsttextoverlay.c: (gst_text_overlay_valign_get_type), (gst_text_overlay_halign_get_type), (gst_text_overlay_wrap_mode_get_type), (gst_text_overlay_base_init), (gst_text_overlay_class_init), (gst_text_overlay_init), (gst_text_overlay_set_property), (gst_text_overlay_get_property): Fix up properties to be enums instead of string to make bindings, introspection and automatic GUI creation possible. Add getters for the properties. --- ChangeLog | 30 ++ docs/plugins/Makefile.am | 1 + .../gst-plugins-base-plugins-docs.sgml | 1 + .../gst-plugins-base-plugins-sections.txt | 185 +++++++--- ext/pango/gstclockoverlay.h | 5 + ext/pango/gsttextoverlay.c | 318 +++++++++++------- ext/pango/gsttextoverlay.h | 48 ++- ext/pango/gsttextrender.h | 5 + ext/pango/gsttimeoverlay.h | 5 + ext/theora/gsttheoradec.h | 90 +++++ ext/theora/gsttheoraenc.h | 13 + ext/theora/theoradec.c | 78 ++--- ext/theora/theoraenc.c | 43 ++- gst/audioconvert/gstaudioconvert.h | 5 + gst/audiotestsrc/gstaudiotestsrc.h | 24 +- gst/ffmpegcolorspace/gstffmpegcolorspace.h | 5 + gst/tcp/gstmultifdsink.c | 96 +++++- gst/tcp/gstmultifdsink.h | 47 ++- 18 files changed, 738 insertions(+), 261 deletions(-) create mode 100644 ext/theora/gsttheoradec.h diff --git a/ChangeLog b/ChangeLog index 85229a76fb..443b1015f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2006-03-01 Wim Taymans + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-base-plugins-docs.sgml: + * docs/plugins/gst-plugins-base-plugins-sections.txt: + * ext/pango/gstclockoverlay.h: + * ext/pango/gsttextoverlay.h: + * ext/pango/gsttextrender.h: + * ext/pango/gsttimeoverlay.h: + * ext/theora/gsttheoradec.h: + * ext/theora/gsttheoraenc.h: + * ext/theora/theoradec.c: + * ext/theora/theoraenc.c: + * gst/audioconvert/gstaudioconvert.h: + * gst/audiotestsrc/gstaudiotestsrc.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.h: + * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init): + * gst/tcp/gstmultifdsink.h: + Updated/added documentation. + + * ext/pango/gsttextoverlay.c: (gst_text_overlay_valign_get_type), + (gst_text_overlay_halign_get_type), + (gst_text_overlay_wrap_mode_get_type), + (gst_text_overlay_base_init), (gst_text_overlay_class_init), + (gst_text_overlay_init), (gst_text_overlay_set_property), + (gst_text_overlay_get_property): + Fix up properties to be enums instead of string to make bindings, + introspection and automatic GUI creation possible. + Add getters for the properties. + 2006-02-28 Sebastien Moutte * gst/audiotestsrc/gstaudiotestsrc.c: diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am index 95d9c51fe6..a502a24dd0 100644 --- a/docs/plugins/Makefile.am +++ b/docs/plugins/Makefile.am @@ -80,6 +80,7 @@ EXTRA_HFILES = \ $(top_srcdir)/ext/pango/gsttextoverlay.h \ $(top_srcdir)/ext/pango/gsttextrender.h \ $(top_srcdir)/ext/pango/gsttimeoverlay.h \ + $(top_srcdir)/ext/theora/gsttheoradec.h \ $(top_srcdir)/ext/theora/gsttheoraenc.h \ $(top_srcdir)/ext/vorbis/vorbisenc.h \ $(top_srcdir)/gst/audioconvert/gstaudioconvert.h \ diff --git a/docs/plugins/gst-plugins-base-plugins-docs.sgml b/docs/plugins/gst-plugins-base-plugins-docs.sgml index f0ace7a0d5..159256355b 100644 --- a/docs/plugins/gst-plugins-base-plugins-docs.sgml +++ b/docs/plugins/gst-plugins-base-plugins-docs.sgml @@ -20,6 +20,7 @@ + diff --git a/docs/plugins/gst-plugins-base-plugins-sections.txt b/docs/plugins/gst-plugins-base-plugins-sections.txt index efcf1b4e28..3c5cbcff6e 100644 --- a/docs/plugins/gst-plugins-base-plugins-sections.txt +++ b/docs/plugins/gst-plugins-base-plugins-sections.txt @@ -1,9 +1,13 @@ -
element-audioconvert audioconvert GstAudioConvert +GST_AUDIO_CONVERT +GST_AUDIO_CONVERT_CLASS +GST_IS_AUDIO_CONVERT +GST_IS_AUDIO_CONVERT_CLASS +GST_TYPE_AUDIO_CONVERT GstAudioConvertClass
@@ -11,8 +15,20 @@ GstAudioConvertClass element-audiotestsrc audiotestsrc GstAudioTestSrc +GstAudioTestSrcWave +GST_AUDIO_TEST_SRC +GST_AUDIO_TEST_SRC_CLASS +GST_IS_AUDIO_TEST_SRC +GST_IS_AUDIO_TEST_SRC_CLASS +GST_TYPE_AUDIO_TEST_SRC GstAudioTestSrcClass +gst_audio_test_src_factory_init +gst_audio_test_src_get_type +GstPinkNoise +PINK_MAX_RANDOM_ROWS +PINK_RANDOM_BITS +PINK_RANDOM_SHIFT
@@ -20,7 +36,13 @@ GstAudioTestSrcClass clockoverlay GstClockOverlay +GST_CLOCK_OVERLAY +GST_CLOCK_OVERLAY_CLASS +GST_IS_CLOCK_OVERLAY +GST_IS_CLOCK_OVERLAY_CLASS +GST_TYPE_CLOCK_OVERLAY GstClockOverlayClass +gst_clock_overlay_get_type
@@ -28,6 +50,11 @@ GstClockOverlayClass ffmpegcolorspace GstFFMpegCsp +GST_FFMPEGCSP +GST_FFMPEGCSP_CLASS +GST_IS_FFMPEGCSP +GST_IS_FFMPEGCSP_CLASS +GST_TYPE_FFMPEGCSP GstFFMpegCspClass
@@ -35,14 +62,29 @@ GstFFMpegCspClass element-multifdsink multifdsink GstMultiFdSink - -GstMultiFdSinkFlags GstRecoverPolicy GstSyncMethod -GstUnitType GstClientStatus +CLIENTS_LOCK +CLIENTS_LOCK_FREE +CLIENTS_LOCK_INIT +CLIENTS_UNLOCK +GST_TYPE_MULTI_FD_SINK +GST_IS_MULTI_FD_SINK +GST_IS_MULTI_FD_SINK_CLASS +GST_MULTI_FD_SINK +GST_MULTI_FD_SINK_CLASS +GST_MULTI_FD_SINK_GET_CLASS +GstTCPClient +GstUnitType +GstMultiFdSinkFlags GstMultiFdSinkClass +gst_multi_fd_sink_add +gst_multi_fd_sink_clear +gst_multi_fd_sink_get_stats +gst_multi_fd_sink_get_type +gst_multi_fd_sink_remove
@@ -51,6 +93,12 @@ GstMultiFdSinkClass GstGnomeVFSSink GstGnomeVFSSinkClass +GST_GNOME_VFS_SINK_CLASS +GST_TYPE_GNOME_VFS_SINK +GST_IS_GNOME_VFS_SINK +gst_gnome_vfs_sink_get_type +GST_IS_GNOME_VFS_SINK_CLASS +GST_GNOME_VFS_SINK
@@ -58,7 +106,13 @@ GstGnomeVFSSinkClass gnomevfssrc GstGnomeVFSSrc +GST_GNOME_VFS_SRC +GST_GNOME_VFS_SRC_CLASS +GST_IS_GNOME_VFS_SRC +GST_IS_GNOME_VFS_SRC_CLASS +GST_TYPE_GNOME_VFS_SRC GstGnomeVFSSrcClass +gst_gnome_vfs_src_get_type
@@ -67,14 +121,30 @@ GstGnomeVFSSrcClass GstTCPServerSink GstTCPServerSinkClass +GST_TCP_SERVER_SINK +GstTCPServerSinkFlags +GST_TYPE_TCP_SERVER_SINK +gst_tcp_server_sink_get_type +GST_IS_TCP_SERVER_SINK_CLASS +GST_IS_TCP_SERVER_SINK
element-textoverlay textoverlay GstTextOverlay +GstTextOverlayVAlign +GstTextOverlayHAlign +GstTextOverlayWrapMode +GST_TEXT_OVERLAY +GST_TEXT_OVERLAY_CLASS +GST_TEXT_OVERLAY_GET_CLASS +GST_IS_TEXT_OVERLAY +GST_IS_TEXT_OVERLAY_CLASS +GST_TYPE_TEXT_OVERLAY GstTextOverlayClass +gst_text_overlay_get_type
@@ -82,7 +152,27 @@ GstTextOverlayClass textrender GstTextRender +GST_TEXT_RENDER +GST_TEXT_RENDER_CLASS +GST_TEXT_RENDER_GET_CLASS +GST_IS_TEXT_RENDER +GST_IS_TEXT_RENDER_CLASS +GST_TYPE_TEXT_RENDER GstTextRenderClass +gst_text_render_get_type +
+ +
+element-theoradec +theoradec +GstTheoraDec + +GST_THEORA_DEC +GST_IS_THEORA_DEC +GST_TYPE_THEORA_DEC +GST_THEORA_DEC_CLASS +GST_IS_THEORA_DEC_CLASS +GstTheoraDecClass
@@ -91,6 +181,11 @@ GstTextRenderClass GstTheoraEnc GstTheoraEncBorderMode +GST_THEORA_ENC +GST_THEORA_ENC_CLASS +GST_IS_THEORA_ENC +GST_IS_THEORA_ENC_CLASS +GST_TYPE_THEORA_ENC GstTheoraEncClass
@@ -99,7 +194,13 @@ GstTheoraEncClass timeoverlay GstTimeOverlay +GST_TIME_OVERLAY +GST_TIME_OVERLAY_CLASS +GST_IS_TIME_OVERLAY +GST_IS_TIME_OVERLAY_CLASS +GST_TYPE_TIME_OVERLAY GstTimeOverlayClass +gst_time_overlay_get_type
@@ -108,7 +209,13 @@ GstTimeOverlayClass GstVideoTestSrc GstVideoTestSrcPattern +GST_VIDEO_TEST_SRC +GST_VIDEO_TEST_SRC_CLASS +GST_IS_VIDEO_TEST_SRC +GST_IS_VIDEO_TEST_SRC_CLASS +GST_TYPE_VIDEO_TEST_SRC GstVideoTestSrcClass +gst_video_test_src_get_type
@@ -116,7 +223,13 @@ GstVideoTestSrcClass volume GstVolume +GST_VOLUME +GST_VOLUME_CLASS +GST_IS_VOLUME +GST_IS_VOLUME_CLASS +GST_TYPE_VOLUME GstVolumeClass +gst_volume_get_type
@@ -125,6 +238,13 @@ GstVolumeClass GstVorbisEnc GstVorbisEncClass +vorbisenc_get_type +GST_IS_VORBISENC +GST_VORBISENC_CLASS +GST_VORBISENC +GST_TCP_SERVER_SINK_CLASS +GST_TYPE_VORBISENC +GST_IS_VORBISENC_CLASS
@@ -132,7 +252,13 @@ GstVorbisEncClass ximagesink GstXImageSink +GST_XIMAGESINK +GST_XIMAGESINK_CLASS +GST_IS_XIMAGESINK +GST_IS_XIMAGESINK_CLASS +GST_TYPE_XIMAGESINK GstXImagesSinkClass +gst_ximagesink_get_type
@@ -140,50 +266,11 @@ GstXImagesSinkClass xvimagesink GstXvImageSink +GST_XVIMAGESINK +GST_XVIMAGESINK_CLASS +GST_IS_XVIMAGESINK +GST_IS_XVIMAGESINK_CLASS +GST_TYPE_XVIMAGESINK GstXvImagesSinkClass -
- -
-private - -CLIENTS_UNLOCK -CLIENTS_LOCK_INIT -GST_MULTI_FD_SINK_GET_CLASS -CLIENTS_LOCK_FREE -GST_IS_MULTI_FD_SINK_CLASS -gst_multi_fd_sink_get_type -gst_multi_fd_sink_remove -GST_IS_MULTI_FD_SINK -CLIENTS_LOCK -GST_TYPE_MULTI_FD_SINK -gst_multi_fd_sink_clear -GstTCPClient -GST_MULTI_FD_SINK_CLASS -gst_multi_fd_sink_get_stats -GST_MULTI_FD_SINK -gst_multi_fd_sink_add - -GST_TCP_SERVER_SINK -GstTCPServerSinkFlags -GST_TYPE_TCP_SERVER_SINK -gst_tcp_server_sink_get_type -GST_IS_TCP_SERVER_SINK_CLASS -GST_IS_TCP_SERVER_SINK - -GST_GNOME_VFS_SINK_CLASS -GST_TYPE_GNOME_VFS_SINK -GST_IS_GNOME_VFS_SINK -gst_gnome_vfs_sink_get_type -GST_IS_GNOME_VFS_SINK_CLASS -GST_ELEMENT_CLASS -GST_GNOME_VFS_SINK - -GST_IS_VORBISENC -GST_VORBISENC_CLASS -GST_VORBISENC -GST_TCP_SERVER_SINK_CLASS -GST_TYPE_VORBISENC -GST_IS_VORBISENC_CLASS -vorbisenc_get_type - +gst_xvimagesink_get_type
diff --git a/ext/pango/gstclockoverlay.h b/ext/pango/gstclockoverlay.h index 686250765b..09b9bc49c1 100644 --- a/ext/pango/gstclockoverlay.h +++ b/ext/pango/gstclockoverlay.h @@ -40,6 +40,11 @@ G_BEGIN_DECLS typedef struct _GstClockOverlay GstClockOverlay; typedef struct _GstClockOverlayClass GstClockOverlayClass; +/** + * GstClockOverlay: + * + * Opaque clockoverlay data structure. + */ struct _GstClockOverlay { GstTextOverlay textoverlay; }; diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c index fcc523577a..19079fd6e8 100644 --- a/ext/pango/gsttextoverlay.c +++ b/ext/pango/gsttextoverlay.c @@ -100,19 +100,34 @@ static GstElementDetails text_overlay_details = { "David Schleef " }; + +#define DEFAULT_PROP_TEXT "" +#define DEFAULT_PROP_SHADING FALSE +#define DEFAULT_PROP_VALIGN GST_TEXT_OVERLAY_VALIGN_BASELINE +#define DEFAULT_PROP_HALIGN GST_TEXT_OVERLAY_HALIGN_CENTER +#define DEFAULT_PROP_XPAD 25 +#define DEFAULT_PROP_YPAD 25 +#define DEFAULT_PROP_DELTAX 0 +#define DEFAULT_PROP_DELTAY 0 +#define DEFAULT_PROP_WRAP_MODE GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR +#define DEFAULT_PROP_FONT_DESC "" + +/* make a property of me */ +#define DEFAULT_SHADING_VALUE -80 + enum { - ARG_0, - ARG_TEXT, - ARG_SHADING, - ARG_VALIGN, - ARG_HALIGN, - ARG_XPAD, - ARG_YPAD, - ARG_DELTAX, - ARG_DELTAY, - ARG_WRAP_MODE, - ARG_FONT_DESC + PROP_0, + PROP_TEXT, + PROP_SHADING, + PROP_VALIGN, + PROP_HALIGN, + PROP_XPAD, + PROP_YPAD, + PROP_DELTAX, + PROP_DELTAY, + PROP_WRAP_MODE, + PROP_FONT_DESC }; @@ -137,6 +152,67 @@ static GstStaticPadTemplate text_sink_template_factory = GST_STATIC_CAPS ("text/x-pango-markup; text/plain") ); + +#define GST_TYPE_TEXT_OVERLAY_VALIGN (gst_text_overlay_valign_get_type()) +static GType +gst_text_overlay_valign_get_type (void) +{ + static GType text_overlay_valign_type = 0; + static GEnumValue text_overlay_valign[] = { + {GST_TEXT_OVERLAY_VALIGN_BASELINE, "baseline", "baseline"}, + {GST_TEXT_OVERLAY_VALIGN_BOTTOM, "bottom", "bottom"}, + {GST_TEXT_OVERLAY_VALIGN_TOP, "top", "top"}, + {0, NULL, NULL}, + }; + + if (!text_overlay_valign_type) { + text_overlay_valign_type = + g_enum_register_static ("GstTextOverlayVAlign", text_overlay_valign); + } + return text_overlay_valign_type; +} + +#define GST_TYPE_TEXT_OVERLAY_HALIGN (gst_text_overlay_halign_get_type()) +static GType +gst_text_overlay_halign_get_type (void) +{ + static GType text_overlay_halign_type = 0; + static GEnumValue text_overlay_halign[] = { + {GST_TEXT_OVERLAY_HALIGN_LEFT, "left", "left"}, + {GST_TEXT_OVERLAY_HALIGN_CENTER, "center", "center"}, + {GST_TEXT_OVERLAY_HALIGN_RIGHT, "right", "right"}, + {0, NULL, NULL}, + }; + + if (!text_overlay_halign_type) { + text_overlay_halign_type = + g_enum_register_static ("GstTextOverlayHAlign", text_overlay_halign); + } + return text_overlay_halign_type; +} + + +#define GST_TYPE_TEXT_OVERLAY_WRAP_MODE (gst_text_overlay_wrap_mode_get_type()) +static GType +gst_text_overlay_wrap_mode_get_type (void) +{ + static GType text_overlay_wrap_mode_type = 0; + static GEnumValue text_overlay_wrap_mode[] = { + {GST_TEXT_OVERLAY_WRAP_MODE_NONE, "none", "none"}, + {GST_TEXT_OVERLAY_WRAP_MODE_WORD, "word", "word"}, + {GST_TEXT_OVERLAY_WRAP_MODE_CHAR, "char", "char"}, + {GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR, "wordchar", "wordchar"}, + {0, NULL, NULL}, + }; + + if (!text_overlay_wrap_mode_type) { + text_overlay_wrap_mode_type = + g_enum_register_static ("GstTextOverlayWrapMode", + text_overlay_wrap_mode); + } + return text_overlay_wrap_mode_type; +} + /* These macros are adapted from videotestsrc.c */ #define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) @@ -175,16 +251,11 @@ static void gst_text_overlay_pop_text (GstTextOverlay * overlay); static void gst_text_overlay_finalize (GObject * object); static void gst_text_overlay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); - +static void gst_text_overlay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstTextOverlay, gst_text_overlay, GstElement, GST_TYPE_ELEMENT) -#define DEFAULT_YPAD 25 -#define DEFAULT_XPAD 25 -#define DEFAULT_DELTAX 0 -#define DEFAULT_DELTAY 0 -/* keep wrap enum in sync with string in class_init */ -#define DEFAULT_WRAP_MODE GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR -#define DEFAULT_SHADING_VALUE -80 + static void gst_text_overlay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); @@ -221,6 +292,7 @@ gst_text_overlay_class_init (GstTextOverlayClass * klass) gobject_class->finalize = gst_text_overlay_finalize; gobject_class->set_property = gst_text_overlay_set_property; + gobject_class->get_property = gst_text_overlay_get_property; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_text_overlay_change_state); @@ -228,51 +300,48 @@ gst_text_overlay_class_init (GstTextOverlayClass * klass) klass->get_text = gst_text_overlay_get_text; klass->pango_context = pango_ft2_get_context (72, 72); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEXT, + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TEXT, g_param_spec_string ("text", "text", - "Text to be display.", "", G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SHADING, + "Text to be display.", DEFAULT_PROP_TEXT, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SHADING, g_param_spec_boolean ("shaded-background", "shaded background", - "Whether to shade the background under the text area", FALSE, - 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_XPAD, + "Whether to shade the background under the text area", + DEFAULT_PROP_SHADING, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VALIGN, + g_param_spec_enum ("valign", "vertical alignment", + "Vertical alignment of the text. ", + GST_TYPE_TEXT_OVERLAY_VALIGN, DEFAULT_PROP_VALIGN, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HALIGN, + g_param_spec_enum ("halign", "horizontal alignment", + "Horizontal alignment of the text. ", GST_TYPE_TEXT_OVERLAY_HALIGN, + DEFAULT_PROP_HALIGN, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_XPAD, g_param_spec_int ("xpad", "horizontal paddding", - "Horizontal paddding when using left/right alignment", - 0, G_MAXINT, DEFAULT_XPAD, G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_YPAD, + "Horizontal paddding when using left/right alignment", 0, G_MAXINT, + DEFAULT_PROP_XPAD, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_YPAD, g_param_spec_int ("ypad", "vertical padding", - "Vertical padding when using top/bottom alignment", - 0, G_MAXINT, DEFAULT_YPAD, G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAX, + "Vertical padding when using top/bottom alignment", 0, G_MAXINT, + DEFAULT_PROP_YPAD, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELTAX, g_param_spec_int ("deltax", "X position modifier", "Shift X position to the left or to the right. Unit is pixels.", - G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAY, + G_MININT, G_MAXINT, DEFAULT_PROP_DELTAX, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELTAY, g_param_spec_int ("deltay", "Y position modifier", - "Shift Y position up or down. Unit is pixels.", - G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WRAP_MODE, - g_param_spec_string ("wrap-mode", "wrap mode", - "Whether to wrap the text and if so how." - "Can be either 'none', 'word', 'char' or 'wordchar'", - "wordchar", G_PARAM_WRITABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FONT_DESC, + "Shift Y position up or down. Unit is pixels.", G_MININT, G_MAXINT, + DEFAULT_PROP_DELTAY, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_WRAP_MODE, + g_param_spec_enum ("wrap-mode", "wrap mode", + "Whether to wrap the text and if so how.", + GST_TYPE_TEXT_OVERLAY_WRAP_MODE, DEFAULT_PROP_WRAP_MODE, + G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_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)); + "Pango font description of font to be used for rendering. " + "See documentation of pango_font_description_from_string " + "for syntax.", DEFAULT_PROP_FONT_DESC, G_PARAM_WRITABLE)); } static void @@ -353,19 +422,19 @@ gst_text_overlay_init (GstTextOverlay * overlay, GstTextOverlayClass * klass) pango_layout_new (GST_TEXT_OVERLAY_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->xpad = DEFAULT_XPAD; - overlay->ypad = DEFAULT_YPAD; - overlay->deltax = 0; - overlay->deltay = 0; + overlay->halign = DEFAULT_PROP_HALIGN; + overlay->valign = DEFAULT_PROP_VALIGN; + overlay->xpad = DEFAULT_PROP_XPAD; + overlay->ypad = DEFAULT_PROP_YPAD; + overlay->deltax = DEFAULT_PROP_DELTAX; + overlay->deltay = DEFAULT_PROP_DELTAY; - overlay->wrap_mode = DEFAULT_WRAP_MODE; + overlay->wrap_mode = DEFAULT_PROP_WRAP_MODE; - overlay->want_shading = FALSE; + overlay->want_shading = DEFAULT_PROP_SHADING; overlay->shading_value = DEFAULT_SHADING_VALUE; - overlay->default_text = g_strdup (""); + overlay->default_text = g_strdup (DEFAULT_PROP_TEXT); overlay->need_render = TRUE; overlay->fps_n = 0; @@ -448,82 +517,38 @@ gst_text_overlay_set_property (GObject * object, guint prop_id, GstTextOverlay *overlay = GST_TEXT_OVERLAY (object); GST_OBJECT_LOCK (overlay); - switch (prop_id) { - case ARG_TEXT: + case PROP_TEXT: g_free (overlay->default_text); overlay->default_text = g_value_dup_string (value); overlay->need_render = TRUE; break; - - case ARG_SHADING:{ + case PROP_SHADING: overlay->want_shading = g_value_get_boolean (value); break; - } - case ARG_XPAD:{ + case PROP_XPAD: overlay->xpad = g_value_get_int (value); break; - } - case ARG_YPAD:{ + case PROP_YPAD: overlay->ypad = g_value_get_int (value); break; - } - case ARG_DELTAX:{ + case PROP_DELTAX: overlay->deltax = g_value_get_int (value); break; - } - case ARG_DELTAY:{ + case PROP_DELTAY: overlay->deltay = g_value_get_int (value); break; - } - - case ARG_VALIGN:{ - const gchar *s = g_value_get_string (value); - - if (g_ascii_strcasecmp (s, "baseline") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; - else if (g_ascii_strcasecmp (s, "bottom") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_BOTTOM; - else if (g_ascii_strcasecmp (s, "top") == 0) - overlay->valign = GST_TEXT_OVERLAY_VALIGN_TOP; - else - g_warning ("Invalid 'valign' property value: %s", s); + case PROP_VALIGN: + overlay->valign = g_value_get_enum (value); break; - } - - case ARG_HALIGN:{ - const gchar *s = g_value_get_string (value); - - if (g_ascii_strcasecmp (s, "left") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_LEFT; - else if (g_ascii_strcasecmp (s, "right") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_RIGHT; - else if (g_ascii_strcasecmp (s, "center") == 0) - overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; - else - g_warning ("Invalid 'halign' property value: %s", s); + case PROP_HALIGN: + overlay->halign = g_value_get_enum (value); break; - } - - case ARG_WRAP_MODE:{ - const gchar *s = g_value_get_string (value); - - if (g_ascii_strcasecmp (s, "none") == 0) - overlay->wrap_mode = GST_TEXT_OVERLAY_WRAP_MODE_NONE; - else if (g_ascii_strcasecmp (s, "char") == 0) - overlay->wrap_mode = GST_TEXT_OVERLAY_WRAP_MODE_CHAR; - else if (g_ascii_strcasecmp (s, "word") == 0) - overlay->wrap_mode = GST_TEXT_OVERLAY_WRAP_MODE_WORD; - else if (g_ascii_strcasecmp (s, "wordchar") == 0) - overlay->wrap_mode = GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR; - else - g_warning ("Invalid 'wrap-mode' property value: %s", s); - + case PROP_WRAP_MODE: + overlay->wrap_mode = g_value_get_enum (value); gst_text_overlay_update_wrap_mode (overlay); break; - } - - case ARG_FONT_DESC: + case PROP_FONT_DESC: { PangoFontDescription *desc; const gchar *fontdesc_str; @@ -531,22 +556,65 @@ gst_text_overlay_set_property (GObject * object, guint prop_id, fontdesc_str = g_value_get_string (value); desc = pango_font_description_from_string (fontdesc_str); if (desc) { - GST_LOG ("font description set: %s", fontdesc_str); + GST_LOG_OBJECT (overlay, "font description set: %s", fontdesc_str); pango_layout_set_font_description (overlay->layout, desc); pango_font_description_free (desc); } else { - GST_WARNING ("font description parse failed: %s", fontdesc_str); + GST_WARNING_OBJECT (overlay, "font description parse failed: %s", + fontdesc_str); } break; } - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } overlay->need_render = TRUE; + GST_OBJECT_UNLOCK (overlay); +} +static void +gst_text_overlay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstTextOverlay *overlay = GST_TEXT_OVERLAY (object); + + GST_OBJECT_LOCK (overlay); + switch (prop_id) { + case PROP_TEXT: + g_value_set_string (value, overlay->default_text); + break; + case PROP_SHADING: + g_value_set_boolean (value, overlay->want_shading); + break; + case PROP_XPAD: + g_value_set_int (value, overlay->xpad); + break; + case PROP_YPAD: + g_value_set_int (value, overlay->ypad); + break; + case PROP_DELTAX: + g_value_set_int (value, overlay->deltax); + break; + case PROP_DELTAY: + g_value_set_int (value, overlay->deltay); + break; + case PROP_VALIGN: + g_value_set_enum (value, overlay->valign); + break; + case PROP_HALIGN: + g_value_set_enum (value, overlay->halign); + break; + case PROP_WRAP_MODE: + g_value_set_enum (value, overlay->wrap_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + overlay->need_render = TRUE; GST_OBJECT_UNLOCK (overlay); } diff --git a/ext/pango/gsttextoverlay.h b/ext/pango/gsttextoverlay.h index e47dcca926..16f01eb280 100644 --- a/ext/pango/gsttextoverlay.h +++ b/ext/pango/gsttextoverlay.h @@ -21,30 +21,55 @@ G_BEGIN_DECLS typedef struct _GstTextOverlay GstTextOverlay; typedef struct _GstTextOverlayClass GstTextOverlayClass; -typedef enum _GstTextOverlayVAlign GstTextOverlayVAlign; -typedef enum _GstTextOverlayHAlign GstTextOverlayHAlign; -typedef enum _GstTextOverlayWrapMode GstTextOverlayWrapMode; - -enum _GstTextOverlayVAlign { +/** + * GstTextOverlayVAlign: + * @GST_TEXT_OVERLAY_VALIGN_BASELINE: draw text on the baseline + * @GST_TEXT_OVERLAY_VALIGN_BOTTOM: draw text on the bottom + * @GST_TEXT_OVERLAY_VALIGN_TOP: draw test on top + * + * Vertical alignment of the text. + */ +typedef enum { GST_TEXT_OVERLAY_VALIGN_BASELINE, GST_TEXT_OVERLAY_VALIGN_BOTTOM, GST_TEXT_OVERLAY_VALIGN_TOP -}; +} GstTextOverlayVAlign; -enum _GstTextOverlayHAlign { +/** + * GstTextOverlayHAlign: + * @GST_TEXT_OVERLAY_HALIGN_LEFT: align text left + * @GST_TEXT_OVERLAY_HALIGN_CENTER: align text center + * @GST_TEXT_OVERLAY_HALIGN_RIGHT: align text right + * + * Horizontal alignment of the text. + */ +typedef enum { GST_TEXT_OVERLAY_HALIGN_LEFT, GST_TEXT_OVERLAY_HALIGN_CENTER, GST_TEXT_OVERLAY_HALIGN_RIGHT -}; +} GstTextOverlayHAlign; -enum _GstTextOverlayWrapMode { +/** + * GstTextOverlayWrapMode: + * @GST_TEXT_OVERLAY_WRAP_MODE_NONE: no wrapping + * @GST_TEXT_OVERLAY_WRAP_MODE_WORD: do word wrapping + * @GST_TEXT_OVERLAY_WRAP_MODE_CHAR: do char wrapping + * @GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR: do word and char wrapping + * + * Whether to wrap the text and if so how. + */ +typedef enum { GST_TEXT_OVERLAY_WRAP_MODE_NONE = -1, GST_TEXT_OVERLAY_WRAP_MODE_WORD = PANGO_WRAP_WORD, GST_TEXT_OVERLAY_WRAP_MODE_CHAR = PANGO_WRAP_CHAR, GST_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR = PANGO_WRAP_WORD_CHAR -}; - +} GstTextOverlayWrapMode; +/** + * GstTextOverlay: + * + * Opaque textoverlay object structure + */ struct _GstTextOverlay { GstElement element; @@ -92,7 +117,6 @@ struct _GstTextOverlayClass { PangoContext *pango_context; gchar * (*get_text) (GstTextOverlay *overlay, GstBuffer *video_frame); - }; GType gst_text_overlay_get_type(void) G_GNUC_CONST; diff --git a/ext/pango/gsttextrender.h b/ext/pango/gsttextrender.h index 6b928f528a..9c07d1bd51 100644 --- a/ext/pango/gsttextrender.h +++ b/ext/pango/gsttextrender.h @@ -21,6 +21,11 @@ G_BEGIN_DECLS typedef struct _GstTextRender GstTextRender; typedef struct _GstTextRenderClass GstTextRenderClass; +/** + * GstTextRender: + * + * Opaque textrender data structure. + */ struct _GstTextRender { GstElement element; diff --git a/ext/pango/gsttimeoverlay.h b/ext/pango/gsttimeoverlay.h index 7fe90477e6..5fbfba9712 100644 --- a/ext/pango/gsttimeoverlay.h +++ b/ext/pango/gsttimeoverlay.h @@ -40,6 +40,11 @@ G_BEGIN_DECLS typedef struct _GstTimeOverlay GstTimeOverlay; typedef struct _GstTimeOverlayClass GstTimeOverlayClass; +/** + * GstTimeOverlay: + * + * Opaque timeoverlay data structure. + */ struct _GstTimeOverlay { GstTextOverlay textoverlay; }; diff --git a/ext/theora/gsttheoradec.h b/ext/theora/gsttheoradec.h new file mode 100644 index 0000000000..5fecad7c12 --- /dev/null +++ b/ext/theora/gsttheoradec.h @@ -0,0 +1,90 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_THEORADEC_H__ +#define __GST_THEORADEC_H__ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_THEORA_DEC \ + (gst_theora_dec_get_type()) +#define GST_THEORA_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_THEORA_DEC,GstTheoraDec)) +#define GST_THEORA_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_THEORA_DEC,GstTheoraDec)) +#define GST_IS_THEORA_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_THEORA_DEC)) +#define GST_IS_THEORA_DEC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_THEORA_DEC)) + +typedef struct _GstTheoraDec GstTheoraDec; +typedef struct _GstTheoraDecClass GstTheoraDecClass; + +/** + * GstTheoraDec: + * + * Opaque object data structure. + */ +struct _GstTheoraDec +{ + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + theora_state state; + theora_info info; + theora_comment comment; + + gboolean have_header; + guint64 granulepos; + guint64 granule_shift; + + GstClockTime last_timestamp; + guint64 frame_nr; + gboolean need_keyframe; + gint width, height; + gint offset_x, offset_y; + + gboolean crop; + + GList *queued; + + gdouble segment_rate; + gint64 segment_start; + gint64 segment_stop; + gint64 segment_time; +}; + +struct _GstTheoraDecClass +{ + GstElementClass parent_class; +}; + +G_END_DECLS + +#endif /* __GST_THEORADEC_H__ */ diff --git a/ext/theora/gsttheoraenc.h b/ext/theora/gsttheoraenc.h index 6483723553..29d07dae4e 100644 --- a/ext/theora/gsttheoraenc.h +++ b/ext/theora/gsttheoraenc.h @@ -39,6 +39,14 @@ G_BEGIN_DECLS typedef struct _GstTheoraEnc GstTheoraEnc; typedef struct _GstTheoraEncClass GstTheoraEncClass; +/** + * GstTheoraEncBorderMode: + * @BORDER_NONE: no border + * @BORDER_BLACK: black border + * @BORDER_MIRROR: Mirror image in border + * + * Border color to add when sizes not multiple of 16. + */ typedef enum { BORDER_NONE, @@ -47,6 +55,11 @@ typedef enum } GstTheoraEncBorderMode; +/** + * GstTheoraEnc: + * + * Opaque data structure. + */ struct _GstTheoraEnc { GstElement element; diff --git a/ext/theora/theoradec.c b/ext/theora/theoradec.c index 8b6de08efc..9ded81d428 100644 --- a/ext/theora/theoradec.c +++ b/ext/theora/theoradec.c @@ -17,68 +17,40 @@ * Boston, MA 02111-1307, USA. */ +/** + * SECTION:element-theoradec + * @see_also: theoraenc, oggdemux + * + * + * + * This element decodes theora streams into raw video + * Theora is a royalty-free + * video codec maintained by the Xiph.org + * Foundation, based on the VP3 codec. + * + * + * + * Example pipeline + * + * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! xvimagesink + * + * This example pipeline will decode an ogg stream and decodes the theora video. Refer to + * the theoraenc example to create the ogg file. + * + * + * Last reviewed on 2006-03-01 (0.10.4) + */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include -#include -#include +#include "gsttheoradec.h" #include GST_DEBUG_CATEGORY (theoradec_debug); #define GST_CAT_DEFAULT theoradec_debug -#define GST_TYPE_THEORA_DEC \ - (gst_theora_dec_get_type()) -#define GST_THEORA_DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_THEORA_DEC,GstTheoraDec)) -#define GST_THEORA_DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_THEORA_DEC,GstTheoraDec)) -#define GST_IS_THEORA_DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_THEORA_DEC)) -#define GST_IS_THEORA_DEC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_THEORA_DEC)) - -typedef struct _GstTheoraDec GstTheoraDec; -typedef struct _GstTheoraDecClass GstTheoraDecClass; - -struct _GstTheoraDec -{ - GstElement element; - - GstPad *sinkpad; - GstPad *srcpad; - - theora_state state; - theora_info info; - theora_comment comment; - - gboolean have_header; - guint64 granulepos; - guint64 granule_shift; - - GstClockTime last_timestamp; - guint64 frame_nr; - gboolean need_keyframe; - gint width, height; - gint offset_x, offset_y; - - gboolean crop; - - GList *queued; - - gdouble segment_rate; - gint64 segment_start; - gint64 segment_stop; - gint64 segment_time; -}; - -struct _GstTheoraDecClass -{ - GstElementClass parent_class; -}; - #define THEORA_DEF_CROP TRUE enum { diff --git a/ext/theora/theoraenc.c b/ext/theora/theoraenc.c index cb22dde7d3..c06725baf4 100644 --- a/ext/theora/theoraenc.c +++ b/ext/theora/theoraenc.c @@ -28,11 +28,29 @@ * video codec maintained by the Xiph.org * Foundation, based on the VP3 codec. * + * + * The theora codec internally only supports encoding of images that are a + * multiple of 16 pixls in both X and Y direction. It is however perfectly possible + * to encode images with other dimensions because an arbitrary rectangular cropping + * region can be set up. This element will automatically set up a correct cropping + * region if the dimensions are not multiples of 16 pixels. The "border" and "center" + * properties control how this cropping region will be set up. + * + * + * To control the quality of the encoding, the "bitrate" and "quality" properties can + * be used. These two properties are mutualy exclusive. Setting the bitrate property + * will produce a constant bitrate (CBR) stream while setting the quality property + * will produce a variable bitrate (VBR) stream. + * * Example pipeline * * gst-launch -v videotestsrc num-buffers=1000 ! theoraenc ! oggmux ! filesink location=videotestsrc.ogg * + * This example pipeline will encode a test video source to theora muxed in an + * ogg container. Refer to the theoradec documentation to decode the create stream. * + * + * Last reviewed on 2006-03-01 (0.10.4) */ #ifdef HAVE_CONFIG_H @@ -69,19 +87,6 @@ gst_border_mode_get_type (void) #define ROUND_UP_4(x) (((x) + 3) & ~3) #define ROUND_UP_8(x) (((x) + 7) & ~7) -#define THEORA_DEF_CENTER TRUE -#define THEORA_DEF_BORDER BORDER_BLACK -#define THEORA_DEF_BITRATE 0 -#define THEORA_DEF_QUALITY 16 -#define THEORA_DEF_QUICK TRUE -#define THEORA_DEF_KEYFRAME_AUTO TRUE -#define THEORA_DEF_KEYFRAME_FREQ 64 -#define THEORA_DEF_KEYFRAME_FREQ_FORCE 64 -#define THEORA_DEF_KEYFRAME_THRESHOLD 80 -#define THEORA_DEF_KEYFRAME_MINDISTANCE 8 -#define THEORA_DEF_NOISE_SENSITIVITY 1 -#define THEORA_DEF_SHARPNESS 0 - /* taken from theora/lib/toplevel.c */ static int _ilog (unsigned int v) @@ -95,6 +100,18 @@ _ilog (unsigned int v) return (ret); } +#define THEORA_DEF_CENTER TRUE +#define THEORA_DEF_BORDER BORDER_BLACK +#define THEORA_DEF_BITRATE 0 +#define THEORA_DEF_QUALITY 16 +#define THEORA_DEF_QUICK TRUE +#define THEORA_DEF_KEYFRAME_AUTO TRUE +#define THEORA_DEF_KEYFRAME_FREQ 64 +#define THEORA_DEF_KEYFRAME_FREQ_FORCE 64 +#define THEORA_DEF_KEYFRAME_THRESHOLD 80 +#define THEORA_DEF_KEYFRAME_MINDISTANCE 8 +#define THEORA_DEF_NOISE_SENSITIVITY 1 +#define THEORA_DEF_SHARPNESS 0 enum { ARG_0, diff --git a/gst/audioconvert/gstaudioconvert.h b/gst/audioconvert/gstaudioconvert.h index 44b73657fc..a833891ef3 100644 --- a/gst/audioconvert/gstaudioconvert.h +++ b/gst/audioconvert/gstaudioconvert.h @@ -37,6 +37,11 @@ typedef struct _GstAudioConvert GstAudioConvert; typedef struct _GstAudioConvertClass GstAudioConvertClass; +/** + * GstAudioConvert + * + * The audioconvert object structure. + */ struct _GstAudioConvert { GstBaseTransform element; diff --git a/gst/audiotestsrc/gstaudiotestsrc.h b/gst/audiotestsrc/gstaudiotestsrc.h index 7ead553fd1..1e4811fe42 100644 --- a/gst/audiotestsrc/gstaudiotestsrc.h +++ b/gst/audiotestsrc/gstaudiotestsrc.h @@ -42,6 +42,19 @@ G_BEGIN_DECLS #define GST_IS_AUDIO_TEST_SRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_TEST_SRC)) +/** + * GstAudioTestSrcWave: + * @GST_AUDIO_TEST_SRC_WAVE_SINE: a sine wave + * @GST_AUDIO_TEST_SRC_WAVE_SQUARE: a square wave + * @GST_AUDIO_TEST_SRC_WAVE_SAW: a saw wave + * @GST_AUDIO_TEST_SRC_WAVE_TRIANGLE: a tringle wave + * @GST_AUDIO_TEST_SRC_WAVE_SILENCE: silence + * @GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE: white noise + * @GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE: pink noise + * @GST_AUDIO_TEST_SRC_WAVE_SINE_TAB: sine wave using a table + * + * Different types of supported sound waves. + */ typedef enum { GST_AUDIO_TEST_SRC_WAVE_SINE, GST_AUDIO_TEST_SRC_WAVE_SQUARE, @@ -51,7 +64,7 @@ typedef enum { GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE, GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE, GST_AUDIO_TEST_SRC_WAVE_SINE_TAB -} GstAudioTestSrcWaves; +} GstAudioTestSrcWave; #define PINK_MAX_RANDOM_ROWS (30) #define PINK_RANDOM_BITS (16) @@ -68,13 +81,18 @@ typedef struct { typedef struct _GstAudioTestSrc GstAudioTestSrc; typedef struct _GstAudioTestSrcClass GstAudioTestSrcClass; +/** + * GstAudioTestSrc: + * + * audiotestsrc object structure. + */ struct _GstAudioTestSrc { GstBaseSrc parent; void (*process)(GstAudioTestSrc*, gint16 *); /* parameters */ - GstAudioTestSrcWaves wave; + GstAudioTestSrcWave wave; gdouble volume; gdouble freq; @@ -82,7 +100,7 @@ struct _GstAudioTestSrc { gint samplerate; gint samples_per_buffer; - /* < private > */ + /*< private >*/ gboolean tags_pushed; /* send tags just once ? */ GstClockTimeDiff timestamp_offset; /* base offset */ GstClockTime running_time; /* total running time */ diff --git a/gst/ffmpegcolorspace/gstffmpegcolorspace.h b/gst/ffmpegcolorspace/gstffmpegcolorspace.h index 021e2d9044..33982b71a8 100644 --- a/gst/ffmpegcolorspace/gstffmpegcolorspace.h +++ b/gst/ffmpegcolorspace/gstffmpegcolorspace.h @@ -42,6 +42,11 @@ G_BEGIN_DECLS typedef struct _GstFFMpegCsp GstFFMpegCsp; typedef struct _GstFFMpegCspClass GstFFMpegCspClass; +/** + * GstFFMpegCsp: + * + * Opaque object data structure. + */ struct _GstFFMpegCsp { GstBaseTransform element; diff --git a/gst/tcp/gstmultifdsink.c b/gst/tcp/gstmultifdsink.c index 6856509644..23a2b76769 100644 --- a/gst/tcp/gstmultifdsink.c +++ b/gst/tcp/gstmultifdsink.c @@ -20,7 +20,66 @@ /** * SECTION:element-multifdsink + * @short_description: Send data to multiple file descriptors * @see_also: tcpserversink + * + * + * + * This plugin writes incoming data to a set of filedescriptors. The filedescriptors + * can be added to multifdsink by emiting the "add" signal. For each descriptor added + * the "client-added" signal will be called. + * + * + * Clients can be removed from multifdsink by emiting the "remove" signal. For each + * descriptor removed the "client-removed" signal will be called. The "client-removed" + * signal can also be fired when multifdsink decides that a client is not active anymore + * or, depending on the value of the "recover-policy" if the client is reading to slow. + * In all cases, multifdsink will never close a filedescriptor itself, the application + * has to do that itself, for example, in the "client-removed" signal callback. + * + * + * Multifdsink internally keeps a queue of the incomming buffers and uses a separate + * thread to send the buffers to the clients. This ensures that no client write can + * block the pipeline and that clients can read with different speeds. + * + * + * When adding a client to multifdsink, the "sync-method" property will define which + * buffer will be sent first to the client. Clients can be sent respectively the most + * recent buffer (which might not be decodable by the client when it is not a keyframe), + * the next keyframe received in multifdsink (which can take some time depending on the + * keyframe rate, or the last received keyframe (which will cause a burst-on-connect). + * + * + * When streaming data, clients are allowed to read at a different rate than the rate + * at which multifdsink receives data. If the client is reading too fast, no data will + * be send to the client until multifdsink receives more data. If the client however + * reads too slow, data for that client will bunch up in multifdsink. Two properties + * control the amount of data (buffers) that is queued in multifdsink: "buffers-max" + * and "buffers-soft-max". A client with a lag of "buffers-max" is removed from + * multifdsink forcibly. + * + * + * A client with a lag of at least "buffers-soft-max" enters the recovery procedure + * which is controled with the "recover-policy" property. A recover policy of NONE will + * do nothing, RESYNC_LATEST will send the most recently received buffer as the next + * buffer for the client, RESYNC_SOFT_LIMIT positions the client to the soft limit + * in the buffer queue and RESYNC_KEYFRAME positions the client to the most recent + * keyframe in the buffer queue. + * + * + * multifdsink will synchronize on the clock before serving the buffers to the clients. + * + * + * Example pipeline: + * + * gst-launch -v videotestsrc ! multifdsink + * + * This pipeline will not do a lot since it is not possible from a gst-launch line + * to add filedescriptors to multifdsink. + * + * + * + * Last reviewed on 2006-03-01 (0.10.4) */ #ifdef HAVE_CONFIG_H @@ -369,6 +428,21 @@ gst_multi_fd_sink_class_init (GstMultiFdSinkClass * klass) g_signal_new ("clear", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiFdSinkClass, clear), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * GstMultiFdSink::get-stats: + * @gstmultifdsink: the multifdsink element to emit this signal on + * @fd: the file descriptor to get stats of from multifdsink + * + * Get statistics about @fd. This function returns a GValueArray to ease + * automatic wrapping for bindings. + * + * Returns: a GValueArray with the statistics. The array contains 5 guint64 + * values that represent respectively total number of bytes sent, time + * when the client was added, time when the client was disconnected/removed, + * time the client is/was active, last activity time. All times are + * expressed in nanoseconds (GstClockTime). + */ gst_multi_fd_sink_signals[SIGNAL_GET_STATS] = g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiFdSinkClass, get_stats), @@ -378,9 +452,11 @@ gst_multi_fd_sink_class_init (GstMultiFdSinkClass * klass) /** * GstMultiFdSink::client-added: * @gstmultifdsink: the multifdsink element that emitted this signal - * @arg1: the file descriptor that was added to multifdsink + * @fd: the file descriptor that was added to multifdsink * - * The given file descriptor was added to multifdsink. + * The given file descriptor was added to multifdsink. This signal will + * be emited from the streaming thread so application should be prepared + * for that. */ gst_multi_fd_sink_signals[SIGNAL_CLIENT_ADDED] = g_signal_new ("client-added", G_TYPE_FROM_CLASS (klass), @@ -389,9 +465,12 @@ gst_multi_fd_sink_class_init (GstMultiFdSinkClass * klass) /** * GstMultiFdSink::client-removed: * @gstmultifdsink: the multifdsink element that emitted this signal - * @arg1: the file descriptor that was removed from multifdsink + * @fd: the file descriptor that was removed from multifdsink + * @status: the reason why the client was removed * - * The given file descriptor was removed from multifdsink. + * The given file descriptor was removed from multifdsink. This signal will + * be emited from the streaming thread so applications should be prepared + * for that. */ gst_multi_fd_sink_signals[SIGNAL_CLIENT_REMOVED] = g_signal_new ("client-removed", G_TYPE_FROM_CLASS (klass), @@ -563,6 +642,14 @@ gst_multi_fd_sink_clear (GstMultiFdSink * sink) CLIENTS_UNLOCK (sink); } +/* the array returned contains: + * + * guint64 : bytes_sent + * guint64 : connect time (in nanoseconds) + * guint64 : disconnect time (in nanoseconds) + * guint64 : time the client is/was connected (in nanoseconds) + * guint64 : last activity time (in nanoseconds) + */ GValueArray * gst_multi_fd_sink_get_stats (GstMultiFdSink * sink, int fd) { @@ -1204,7 +1291,6 @@ gst_multi_fd_sink_recover_client (GstMultiFdSink * sink, GstTCPClient * client) * had a position of -1) because they can proceed after adding this new buffer. * This is done by adding the client back into the write fd_set and signalling * the select thread that the fd_set changed. - * */ static void gst_multi_fd_sink_queue_buffer (GstMultiFdSink * sink, GstBuffer * buf) diff --git a/gst/tcp/gstmultifdsink.h b/gst/tcp/gstmultifdsink.h index 03ae23478b..3d109fd25f 100644 --- a/gst/tcp/gstmultifdsink.h +++ b/gst/tcp/gstmultifdsink.h @@ -53,6 +53,16 @@ typedef enum { GST_MULTI_FD_SINK_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2), } GstMultiFdSinkFlags; +/** + * GstRecoverPolicy: + * @GST_RECOVER_POLICY_NONE : no recovering is done + * @GST_RECOVER_POLICY_RESYNC_LATEST : client is moved to last buffer + * @GST_RECOVER_POLICY_RESYNC_SOFT_LIMIT: client is moved to the soft limit + * @GST_RECOVER_POLICY_RESYNC_KEYFRAME : client is moved to latest keyframe + * + * Possible values for the recovery procedure to use when a client consumes + * data too slow and has a backlag of more that soft-limit buffers. + */ typedef enum { GST_RECOVER_POLICY_NONE, @@ -61,6 +71,15 @@ typedef enum GST_RECOVER_POLICY_RESYNC_KEYFRAME, } GstRecoverPolicy; +/** + * GstSyncMethod: + * @GST_SYNC_METHOD_LATEST : client receives most recent buffer + * @GST_SYNC_METHOD_NEXT_KEYFRAME : client receives next keyframe + * @GST_SYNC_METHOD_LATEST_KEYFRAME: client receives latest keyframe (burst) + * + * This enum defines the selection of the first buffer that is sent + * to a new client. + */ typedef enum { GST_SYNC_METHOD_LATEST, @@ -68,6 +87,14 @@ typedef enum GST_SYNC_METHOD_LATEST_KEYFRAME, } GstSyncMethod; +/** + * GstUnitType: + * @GST_UNIT_TYPE_BUFFERS: a buffer + * @GST_UNIT_TYPE_TIME : timeunits (in nanoseconds) + * @GST_UNIT_TYPE_BYTES : bytes + * + * The units used to specify limits. + */ typedef enum { GST_UNIT_TYPE_BUFFERS, @@ -75,6 +102,18 @@ typedef enum GST_UNIT_TYPE_BYTES, } GstUnitType; +/** + * GstClientStatus: + * @GST_CLIENT_STATUS_OK : client is ok + * @GST_CLIENT_STATUS_CLOSED : client closed the socket + * @GST_CLIENT_STATUS_REMOVED : client is removed + * @GST_CLIENT_STATUS_SLOW : client is too slow + * @GST_CLIENT_STATUS_ERROR : client is in error + * @GST_CLIENT_STATUS_DUPLICATE: same client added twice + * + * This specifies the reason why a client was removed from + * multifdsink and is received in the "client-removed" signal. + */ typedef enum { GST_CLIENT_STATUS_OK = 0, @@ -86,7 +125,7 @@ typedef enum } GstClientStatus; /* structure for a client - * */ + */ typedef struct { GstFD fd; @@ -121,9 +160,15 @@ typedef struct { #define CLIENTS_LOCK(fdsink) (g_static_rec_mutex_lock(&fdsink->clientslock)) #define CLIENTS_UNLOCK(fdsink) (g_static_rec_mutex_unlock(&fdsink->clientslock)) +/** + * GstMultiFdSink: + * + * The multifdsink object structure. + */ struct _GstMultiFdSink { GstBaseSink element; + /*< private >*/ guint64 bytes_to_serve; /* how much bytes we must serve */ guint64 bytes_served; /* how much bytes have we served */