+2006-03-01 Wim Taymans <wim@fluendo.com>
+
+ * 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 <sebastien@moutte.net>
* gst/audiotestsrc/gstaudiotestsrc.c:
$(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 \
<xi:include href="xml/element-gnomevfssrc.xml" />
<xi:include href="xml/element-multifdsink.xml" />
<xi:include href="xml/element-tcpserversink.xml" />
+ <xi:include href="xml/element-theoradec.xml" />
<xi:include href="xml/element-theoraenc.xml" />
<xi:include href="xml/element-textoverlay.xml" />
<xi:include href="xml/element-textrender.xml" />
-
<SECTION>
<FILE>element-audioconvert</FILE>
<TITLE>audioconvert</TITLE>
GstAudioConvert
<SUBSECTION Standard>
+GST_AUDIO_CONVERT
+GST_AUDIO_CONVERT_CLASS
+GST_IS_AUDIO_CONVERT
+GST_IS_AUDIO_CONVERT_CLASS
+GST_TYPE_AUDIO_CONVERT
GstAudioConvertClass
</SECTION>
<FILE>element-audiotestsrc</FILE>
<TITLE>audiotestsrc</TITLE>
GstAudioTestSrc
+GstAudioTestSrcWave
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
<TITLE>clockoverlay</TITLE>
GstClockOverlay
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
<TITLE>ffmpegcolorspace</TITLE>
GstFFMpegCsp
<SUBSECTION Standard>
+GST_FFMPEGCSP
+GST_FFMPEGCSP_CLASS
+GST_IS_FFMPEGCSP
+GST_IS_FFMPEGCSP_CLASS
+GST_TYPE_FFMPEGCSP
GstFFMpegCspClass
</SECTION>
<FILE>element-multifdsink</FILE>
<TITLE>multifdsink</TITLE>
GstMultiFdSink
-
-GstMultiFdSinkFlags
GstRecoverPolicy
GstSyncMethod
-GstUnitType
GstClientStatus
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
GstGnomeVFSSink
<SUBSECTION Standard>
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
</SECTION>
<SECTION>
<TITLE>gnomevfssrc</TITLE>
GstGnomeVFSSrc
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
GstTCPServerSink
<SUBSECTION Standard>
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
</SECTION>
<SECTION>
<FILE>element-textoverlay</FILE>
<TITLE>textoverlay</TITLE>
GstTextOverlay
+GstTextOverlayVAlign
+GstTextOverlayHAlign
+GstTextOverlayWrapMode
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
<TITLE>textrender</TITLE>
GstTextRender
<SUBSECTION Standard>
+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
+</SECTION>
+
+<SECTION>
+<FILE>element-theoradec</FILE>
+<TITLE>theoradec</TITLE>
+GstTheoraDec
+<SUBSECTION Standard>
+GST_THEORA_DEC
+GST_IS_THEORA_DEC
+GST_TYPE_THEORA_DEC
+GST_THEORA_DEC_CLASS
+GST_IS_THEORA_DEC_CLASS
+GstTheoraDecClass
</SECTION>
<SECTION>
GstTheoraEnc
GstTheoraEncBorderMode
<SUBSECTION Standard>
+GST_THEORA_ENC
+GST_THEORA_ENC_CLASS
+GST_IS_THEORA_ENC
+GST_IS_THEORA_ENC_CLASS
+GST_TYPE_THEORA_ENC
GstTheoraEncClass
</SECTION>
<TITLE>timeoverlay</TITLE>
GstTimeOverlay
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
GstVideoTestSrc
GstVideoTestSrcPattern
<SUBSECTION Standard>
+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
</SECTION>
<SECTION>
<TITLE>volume</TITLE>
GstVolume
<SUBSECTION Standard>
+GST_VOLUME
+GST_VOLUME_CLASS
+GST_IS_VOLUME
+GST_IS_VOLUME_CLASS
+GST_TYPE_VOLUME
GstVolumeClass
+gst_volume_get_type
</SECTION>
<SECTION>
GstVorbisEnc
<SUBSECTION Standard>
GstVorbisEncClass
+vorbisenc_get_type
+GST_IS_VORBISENC
+GST_VORBISENC_CLASS
+GST_VORBISENC
+GST_TCP_SERVER_SINK_CLASS
+GST_TYPE_VORBISENC
+GST_IS_VORBISENC_CLASS
</SECTION>
<SECTION>
<TITLE>ximagesink</TITLE>
GstXImageSink
<SUBSECTION Standard>
+GST_XIMAGESINK
+GST_XIMAGESINK_CLASS
+GST_IS_XIMAGESINK
+GST_IS_XIMAGESINK_CLASS
+GST_TYPE_XIMAGESINK
GstXImagesSinkClass
+gst_ximagesink_get_type
</SECTION>
<SECTION>
<TITLE>xvimagesink</TITLE>
GstXvImageSink
<SUBSECTION Standard>
+GST_XVIMAGESINK
+GST_XVIMAGESINK_CLASS
+GST_IS_XVIMAGESINK
+GST_IS_XVIMAGESINK_CLASS
+GST_TYPE_XVIMAGESINK
GstXvImagesSinkClass
-</SECTION>
-
-<SECTION>
-<FILE>private</FILE>
-
-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
</SECTION>
typedef struct _GstClockOverlay GstClockOverlay;
typedef struct _GstClockOverlayClass GstClockOverlayClass;
+/**
+ * GstClockOverlay:
+ *
+ * Opaque clockoverlay data structure.
+ */
struct _GstClockOverlay {
GstTextOverlay textoverlay;
};
"David Schleef <ds@schleef.org>"
};
+
+#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
};
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)
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);
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);
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
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;
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;
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);
}
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
-};
-
-enum _GstTextOverlayHAlign {
+} GstTextOverlayVAlign;
+
+/**
+ * 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
-};
-
-enum _GstTextOverlayWrapMode {
+} GstTextOverlayHAlign;
+
+/**
+ * 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;
PangoContext *pango_context;
gchar * (*get_text) (GstTextOverlay *overlay, GstBuffer *video_frame);
-
};
GType gst_text_overlay_get_type(void) G_GNUC_CONST;
typedef struct _GstTextRender GstTextRender;
typedef struct _GstTextRenderClass GstTextRenderClass;
+/**
+ * GstTextRender:
+ *
+ * Opaque textrender data structure.
+ */
struct _GstTextRender {
GstElement element;
typedef struct _GstTimeOverlay GstTimeOverlay;
typedef struct _GstTimeOverlayClass GstTimeOverlayClass;
+/**
+ * GstTimeOverlay:
+ *
+ * Opaque timeoverlay data structure.
+ */
struct _GstTimeOverlay {
GstTextOverlay textoverlay;
};
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * 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 <gst/gst.h>
+#include <theora/theora.h>
+#include <string.h>
+
+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__ */
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,
}
GstTheoraEncBorderMode;
+/**
+ * GstTheoraEnc:
+ *
+ * Opaque data structure.
+ */
struct _GstTheoraEnc
{
GstElement element;
* Boston, MA 02111-1307, USA.
*/
+/**
+ * SECTION:element-theoradec
+ * @see_also: theoraenc, oggdemux
+ *
+ * <refsect2>
+ * <para>
+ * This element decodes theora streams into raw video
+ * <ulink url="http://www.theora.org/">Theora</ulink> is a royalty-free
+ * video codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
+ * Foundation</ulink>, based on the VP3 codec.
+ * </para>
+ * <para>
+ * </para>
+ * <title>Example pipeline</title>
+ * <programlisting>
+ * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! theoradec ! xvimagesink
+ * </programlisting>
+ * This example pipeline will decode an ogg stream and decodes the theora video. Refer to
+ * the theoraenc example to create the ogg file.
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
+ */
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <gst/gst.h>
-#include <theora/theora.h>
-#include <string.h>
+#include "gsttheoradec.h"
#include <gst/tag/tag.h>
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
{
* video codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
* Foundation</ulink>, based on the VP3 codec.
* </para>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * 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.
+ * </para>
* <title>Example pipeline</title>
* <programlisting>
* gst-launch -v videotestsrc num-buffers=1000 ! theoraenc ! oggmux ! filesink location=videotestsrc.ogg
* </programlisting>
+ * 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.
* </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
*/
#ifdef HAVE_CONFIG_H
#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)
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,
typedef struct _GstAudioConvert GstAudioConvert;
typedef struct _GstAudioConvertClass GstAudioConvertClass;
+/**
+ * GstAudioConvert
+ *
+ * The audioconvert object structure.
+ */
struct _GstAudioConvert
{
GstBaseTransform element;
#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,
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)
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;
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 */
typedef struct _GstFFMpegCsp GstFFMpegCsp;
typedef struct _GstFFMpegCspClass GstFFMpegCspClass;
+/**
+ * GstFFMpegCsp:
+ *
+ * Opaque object data structure.
+ */
struct _GstFFMpegCsp
{
GstBaseTransform element;
/**
* SECTION:element-multifdsink
+ * @short_description: Send data to multiple file descriptors
* @see_also: tcpserversink
+ *
+ * <refsect2>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * 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).
+ * </para>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * 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.
+ * </para>
+ * <para>
+ * multifdsink will synchronize on the clock before serving the buffers to the clients.
+ * </para>
+ * <para>
+ * Example pipeline:
+ * <programlisting>
+ * gst-launch -v videotestsrc ! multifdsink
+ * </programlisting>
+ * This pipeline will not do a lot since it is not possible from a gst-launch line
+ * to add filedescriptors to multifdsink.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2006-03-01 (0.10.4)
*/
#ifdef HAVE_CONFIG_H
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),
/**
* 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),
/**
* 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),
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)
{
* 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)
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,
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,
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,
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,
} GstClientStatus;
/* structure for a client
- * */
+ */
typedef struct {
GstFD fd;
#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 */