<!entity GstFakeSrc SYSTEM "sgml/gstfakesrc.sgml">
<!entity GstFakeSink SYSTEM "sgml/gstfakesink.sgml">
<!entity GstDiskSrc SYSTEM "sgml/gstdisksrc.sgml">
+<!entity GstDiskSink SYSTEM "sgml/gstdisksink.sgml">
<!entity GstHttpSrc SYSTEM "sgml/gsthttpsrc.sgml">
<!entity GstFdSrc SYSTEM "sgml/gstfdsrc.sgml">
<!entity GstSineSrc SYSTEM "sgml/gstsinesrc.sgml">
&GstFakeSink;
&GstDiskSrc;
+ &GstDiskSink;
+
&GstHttpSrc;
&GstSineSrc;
GST_BUFFER_FLAG_IS_SET
GST_BUFFER_FLAG_SET
GST_BUFFER_FLAG_UNSET
-GST_BUFFER_TYPE
GST_BUFFER_DATA
GST_BUFFER_SIZE
GST_BUFFER_OFFSET
GST_BUFFER_LOCK
GST_BUFFER_TRYLOCK
GST_BUFFER_UNLOCK
+GST_BUFFER_PARENT
+GST_BUFFER_MAXAGE
GstBufferFlags
GstBuffer
gst_buffer_new
gst_buffer_new_from_pool
+gst_buffer_copy
gst_buffer_create_sub
gst_buffer_append
gst_buffer_ref
<FILE>gstplugin</FILE>
<TITLE>GstPlugin</TITLE>
GstPlugin
-GstPluginElement
GstPluginInitFunc
+GstPluginDesc
gst_plugin_new
gst_plugin_set_name
gst_plugin_get_name
<TITLE>GstProps</TITLE>
GstProps
GST_MAKE_FOURCC
+GST_STR_FOURCC
GST_PROPS_LIST
GST_PROPS_INT
GST_PROPS_INT_RANGE
</SECTION>
<SECTION>
+<FILE>gstdisksink</FILE>
+<TITLE>GstDiskSink</TITLE>
+GstDiskSinkFlags
+<SUBSECTION Standard>
+GstDiskSink
+GST_DISKSINK
+GST_IS_DISKSINK
+GST_TYPE_DISKSINK
+gst_disksink_get_type
+GST_DISKSINK_CLASS
+GST_IS_DISKSINK_CLASS
+</SECTION>
+
+<SECTION>
<FILE>gstmultidisksrc</FILE>
<TITLE>GstMultiDiskSrc</TITLE>
GstMultiDiskSrcFlags
GstFakeSrc
GstFakeSink
GstDiskSrc
+ GstDiskSink
GstHttpSrc
GstFdSrc
GstSineSrc
@flag: the flag to clear
-<!-- ##### MACRO GST_BUFFER_TYPE ##### -->
-<para>
-Retrieves the type id of the data in the buffer.
-</para>
-
-@buf: GstBuffer
-
-
<!-- ##### MACRO GST_BUFFER_DATA ##### -->
<para>
Retrieves a pointer to the data element of this buffer
@buf: GstBuffer to unlock.
+<!-- ##### MACRO GST_BUFFER_PARENT ##### -->
+<para>
+Get the parent of this buffer. The parent is set on subbuffers.
+</para>
+
+@buf: GstBuffer to get the parent of.
+
+
+<!-- ##### MACRO GST_BUFFER_MAXAGE ##### -->
+<para>
+Get the maximun age of a buffer.
+</para>
+
+@buf: GstBuffer to get the maxage of.
+
+
<!-- ##### ENUM GstBufferFlags ##### -->
<para>
</para>
@lock:
-@flags:
@data:
@size:
@maxsize:
@Returns:
+<!-- ##### FUNCTION gst_buffer_copy ##### -->
+<para>
+
+</para>
+
+@buffer:
+@Returns:
+
+
<!-- ##### FUNCTION gst_buffer_create_sub ##### -->
<para>
</para>
+<!-- ##### ARG GstIdentity:silent ##### -->
+<para>
+
+</para>
+
@numautopluggers:
@loaded:
-<!-- ##### STRUCT GstPluginElement ##### -->
-<para>
-
-</para>
-
-
<!-- ##### USER_FUNCTION GstPluginInitFunc ##### -->
<para>
A plugin should implement this function called plugin_init. It will be called
</para>
@module: The <classname>GModule</classname> it was loaded from
+@plugin:
@Returns: The plugin or NULL is an error was detected.
+<!-- ##### STRUCT GstPluginDesc ##### -->
+<para>
+
+</para>
+
+@major_version:
+@minor_version:
+@name:
+@plugin_init:
+
<!-- ##### FUNCTION gst_plugin_new ##### -->
<para>
</para>
@name:
+@major:
+@minor:
@Returns:
<para>
Create a FOURCC value that can easily be used to construct
a fourcc property.
+<programlisting>
+ ...
+ "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2')),
+ ...
+</programlisting>
</para>
@a: first fourcc byte
@d: fourth fourcc byte
+<!-- ##### MACRO GST_STR_FOURCC ##### -->
+<para>
+Create a FOURCC value from a string. example:
+<programlisting>
+ ...
+ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2")),
+ ...
+</programlisting>
+</para>
+
+@f: the string describing the fourcc value.
+
+
<!-- ##### MACRO GST_PROPS_LIST ##### -->
<para>
Create a list of properties.
</para>
-<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
+<!-- ##### FUNCTION gst_fdsink_chain ##### -->
<para>
</para>
@pad:
-@parent:
+@buf:
-<!-- ##### FUNCTION gst_fdsink_chain ##### -->
+<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
<para>
</para>
@pad:
-@buf:
+@parent:
<!-- ##### FUNCTION gst_identity_chain ##### -->
<para>
@pad:
@buf:
-<!-- ##### FUNCTION gst_connection_get_type ##### -->
+<!-- ##### FUNCTION gst_audiosink_chain ##### -->
<para>
</para>
-@Returns:
+@pad:
+@buf:
-<!-- ##### FUNCTION gst_audiosink_chain ##### -->
+<!-- ##### FUNCTION gst_connection_get_type ##### -->
<para>
</para>
-@pad:
-@buf:
+@Returns:
<!-- ##### MACRO GST_PIPELINE_CLASS ##### -->
<para>
@gstsrc: the object which received the signal.
@arg1: the object which received the signal
-<!-- ##### TYPEDEF GstCapsFactoryEntry ##### -->
+<!-- ##### FUNCTION gst_disksrc_get_type ##### -->
<para>
</para>
+@Returns:
-<!-- ##### FUNCTION gst_disksrc_get_type ##### -->
+<!-- ##### TYPEDEF GstCapsFactoryEntry ##### -->
<para>
</para>
-@Returns:
<!-- ##### MACRO GST_IS_DISKSRC_CLASS ##### -->
<para>
@audiosink:
@channels:
-<!-- ##### SECTION ./tmpl/gstconnection.sgml:Short_Description ##### -->
-Generic connection between elements.
-
-
<!-- ##### STRUCT GstSinkClass ##### -->
<para>
</para>
+<!-- ##### SECTION ./tmpl/gstconnection.sgml:Short_Description ##### -->
+Generic connection between elements.
+
+
<!-- ##### STRUCT GstFilterClass ##### -->
<para>
@sheight:
@bytes_per_line:
-<!-- ##### SECTION ./tmpl/GstElement.sgml:Long_Description ##### -->
+<!-- ##### ARG GstAudioSink:format ##### -->
<para>
</para>
-<!-- ##### ARG GstAudioSink:format ##### -->
+<!-- ##### SECTION ./tmpl/GstElement.sgml:Long_Description ##### -->
<para>
</para>
@name:
@Returns:
-<!-- ##### STRUCT GstConnection ##### -->
+<!-- ##### STRUCT GstQueueClass ##### -->
<para>
</para>
-<!-- ##### STRUCT GstQueueClass ##### -->
+<!-- ##### STRUCT GstConnection ##### -->
<para>
</para>
-<!-- ##### FUNCTION gst_fakesrc_push ##### -->
+<!-- ##### FUNCTION gst_type_add_sink ##### -->
<para>
</para>
-@src:
+@id:
+@sink:
-<!-- ##### FUNCTION gst_type_add_sink ##### -->
+<!-- ##### FUNCTION gst_fakesrc_push ##### -->
<para>
</para>
-@id:
-@sink:
+@src:
<!-- ##### MACRO GST_IS_IDENTITY_CLASS ##### -->
<para>
@obj:
-<!-- ##### MACRO GST_IS_QUEUE_CLASS ##### -->
+<!-- ##### FUNCTION gst_fdsrc_get_type ##### -->
<para>
</para>
-@obj:
+@Returns:
-<!-- ##### FUNCTION gst_fdsrc_get_type ##### -->
+<!-- ##### MACRO GST_IS_QUEUE_CLASS ##### -->
<para>
</para>
-@Returns:
+@obj:
<!-- ##### FUNCTION gst_pad_get_type_id ##### -->
<para>
@pad:
@Returns:
-<!-- ##### FUNCTION gst_thread_iterate ##### -->
-<para>
-
-</para>
-
-@thread:
-
<!-- ##### STRUCT OverlayClip ##### -->
<para>
@y1:
@y2:
+<!-- ##### FUNCTION gst_thread_iterate ##### -->
+<para>
+
+</para>
+
+@thread:
+
<!-- ##### ENUM GstSrcFlags ##### -->
<para>
Flags for the GstSrc element
@obj:
-<!-- ##### FUNCTION gst_asyncdisksrc_get_type ##### -->
+<!-- ##### MACRO GST_AUDIOSINK_CLASS ##### -->
<para>
</para>
-@Returns:
+@klass:
-<!-- ##### MACRO GST_AUDIOSINK_CLASS ##### -->
+<!-- ##### FUNCTION gst_asyncdisksrc_get_type ##### -->
<para>
</para>
-@klass:
+@Returns:
<!-- ##### MACRO GST_PAD_FACTORY_SINK ##### -->
<para>
@pad:
@Returns:
-<!-- ##### MACRO GST_PROPS_FOURCC_ID ##### -->
+<!-- ##### FUNCTION gst_esdsink_new ##### -->
<para>
</para>
+@name:
+@Returns:
-<!-- ##### FUNCTION gst_esdsink_new ##### -->
+<!-- ##### MACRO GST_PROPS_FOURCC_ID ##### -->
<para>
</para>
-@name:
-@Returns:
<!-- ##### FUNCTION gst_element_request_pad ##### -->
<para>
@flag: Flag to set, can by any number of bits in guint32.
@obj: GstSrc to set flag in.
-<!-- ##### MACRO GST_PROPS_FLOAT_STRING ##### -->
+<!-- ##### MACRO GST_BUFFER_TYPE ##### -->
<para>
-
+Retrieves the type id of the data in the buffer.
</para>
-@a:
+@buf: GstBuffer
<!-- ##### MACRO DEBUG_LEAVE_STRING ##### -->
<para>
</para>
+<!-- ##### MACRO GST_PROPS_FLOAT_STRING ##### -->
+<para>
+
+</para>
+
+@a:
+
<!-- ##### FUNCTION gst_filter_get_type ##### -->
<para>
</para>
-<!-- ##### SECTION ./tmpl/gstsink.sgml:Title ##### -->
-GstSink
-
-
<!-- ##### MACRO GST_CPU_FLAG_MMX ##### -->
<para>
A flag indicating that MMX instructions are supported.
</para>
+<!-- ##### SECTION ./tmpl/gstsink.sgml:Title ##### -->
+GstSink
+
+
<!-- ##### FUNCTION gst_object_get_type ##### -->
<para>
</para>
+<!-- ##### ARG GstDiskSink:closed ##### -->
+<para>
+
+</para>
+
+
<!-- ##### MACRO GST_IS_SINK_CLASS ##### -->
<para>
</para>
-<!-- ##### MACRO GST_IS_BIN_CLASS ##### -->
+<!-- ##### FUNCTION gst_esdsink_get_type ##### -->
<para>
</para>
-@obj:
+@Returns:
-<!-- ##### FUNCTION gst_esdsink_get_type ##### -->
+<!-- ##### MACRO GST_IS_BIN_CLASS ##### -->
<para>
</para>
-@Returns:
+@obj:
<!-- ##### SECTION ./tmpl/GstElement.sgml:See_Also ##### -->
<para>
@obj: Element to query for multiple input pads.
-<!-- ##### SECTION ./tmpl/gstfilter.sgml:See_Also ##### -->
+<!-- ##### MACRO DEBUG_NOPREFIX ##### -->
<para>
</para>
+@format:
+@args...:
-<!-- ##### MACRO DEBUG_NOPREFIX ##### -->
+<!-- ##### SECTION ./tmpl/gstfilter.sgml:See_Also ##### -->
<para>
</para>
-@format:
-@args...:
<!-- ##### ARG GstAudioSink:frequency ##### -->
<para>
@audiosink:
-<!-- ##### MACRO GST_IS_FAKESINK ##### -->
-<para>
-
-</para>
-
-@obj:
-
<!-- ##### MACRO GST_STATE_UNSET ##### -->
<para>
This macro unsets the given state on the element.
@obj: Element to unset state of.
@flag: State to unset, can be any number of bits in guint32.
+<!-- ##### MACRO GST_IS_FAKESINK ##### -->
+<para>
+
+</para>
+
+@obj:
+
<!-- ##### MACRO GST_QUEUE_CLASS ##### -->
<para>
@obj:
-<!-- ##### MACRO ERROR_OBJECT ##### -->
+<!-- ##### FUNCTION gst_sinesrc_get_type ##### -->
<para>
</para>
-@element:
-@object:
-@format:
-@args...:
+@Returns:
-<!-- ##### FUNCTION gst_sinesrc_get_type ##### -->
+<!-- ##### MACRO ERROR_OBJECT ##### -->
<para>
</para>
-@Returns:
+@element:
+@object:
+@format:
+@args...:
<!-- ##### MACRO GST_IS_IDENTITY ##### -->
<para>
@obj:
-<!-- ##### SECTION ./tmpl/videoraw.sgml:Short_Description ##### -->
-Information about video buffers.
+<!-- ##### FUNCTION gst_src_push_region ##### -->
+<para>
+</para>
+
+@src:
+@offset:
+@size:
<!-- ##### FUNCTION gst_fdsink_get_type ##### -->
<para>
@Returns:
-<!-- ##### FUNCTION gst_src_push_region ##### -->
-<para>
-
-</para>
+<!-- ##### SECTION ./tmpl/videoraw.sgml:Short_Description ##### -->
+Information about video buffers.
-@src:
-@offset:
-@size:
<!-- ##### STRUCT GstPipelineClass ##### -->
<para>
</para>
+<!-- ##### STRUCT GstPluginElement ##### -->
+<para>
+
+</para>
+
+
<!-- ##### TYPEDEF GstCapsFactory ##### -->
<para>
@obj:
-<!-- ##### ARG GstAsyncDiskSrc:size ##### -->
+<!-- ##### STRUCT GstDiskSrcClass ##### -->
<para>
</para>
-<!-- ##### STRUCT GstDiskSrcClass ##### -->
+<!-- ##### ARG GstAsyncDiskSrc:size ##### -->
<para>
</para>
</para>
-<!-- ##### FUNCTION plugin_initialize ##### -->
+<!-- ##### FUNCTION gst_caps_register ##### -->
<para>
</para>
+@factory:
+@Returns:
-<!-- ##### FUNCTION gst_caps_register ##### -->
+<!-- ##### FUNCTION plugin_initialize ##### -->
<para>
</para>
-@factory:
-@Returns:
<!-- ##### ARG GstAsyncDiskSrc:location ##### -->
<para>
</para>
-<!-- ##### FUNCTION gst_sinesrc_new ##### -->
+<!-- ##### MACRO GST_IS_ASYNCDISKSRC_CLASS ##### -->
<para>
</para>
-@name:
-@Returns:
+@obj:
-<!-- ##### MACRO GST_IS_ASYNCDISKSRC_CLASS ##### -->
+<!-- ##### FUNCTION gst_sinesrc_new ##### -->
<para>
</para>
-@obj:
+@name:
+@Returns:
<!-- ##### ARG GstAudioSrc:curoffset ##### -->
<para>
@klass:
-<!-- ##### MACRO GST_HTTPSRC_CLASS ##### -->
+<!-- ##### MACRO GST_ASYNCDISKSRC ##### -->
<para>
</para>
-@klass:
+@obj:
-<!-- ##### MACRO GST_ASYNCDISKSRC ##### -->
+<!-- ##### MACRO GST_HTTPSRC_CLASS ##### -->
<para>
</para>
-@obj:
+@klass:
<!-- ##### ARG GstPad:active ##### -->
<para>
all-local: html
clean-local:
- $(RM) -rf *~ *.bak *.signals *-unused.txt *.args tmpl html sgml tmpl/*.bak $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+ $(RM) -rf *~ *.bak *.signals *-unused.txt *.args html sgml tmpl/*.bak $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
install-data-local: html
@$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
enum {
ARG_0,
ARG_LOCATION,
- ARG_CLOSED/*,
- ARG_SILENT,
- ARG_BYTESPERWRITE,
- ARG_NUM_SOURCES,
- */
};
static void gst_disksink_set_arg (GtkObject *object, GtkArg *arg, guint id);
static void gst_disksink_get_arg (GtkObject *object, GtkArg *arg, guint id);
+static gboolean gst_disksink_open_file (GstDiskSink *sink);
+static void gst_disksink_close_file (GstDiskSink *sink);
+
static void gst_disksink_chain (GstPad *pad,GstBuffer *buf);
+static GstElementStateReturn gst_disksink_change_state (GstElement *element);
+
static GstElementClass *parent_class = NULL;
static guint gst_disksink_signals[LAST_SIGNAL] = { 0 };
(GtkObjectInitFunc)gst_disksink_init,
(GtkArgSetFunc)gst_disksink_set_arg,
(GtkArgGetFunc)gst_disksink_get_arg,
- (GtkClassInitFunc)NULL, /* QUESTION : why null ? otherwise coredump */
+ (GtkClassInitFunc)NULL, /* deprecated, do not use ! */
};
disksink_type = gtk_type_unique (GST_TYPE_ELEMENT, &disksink_info);
}
gst_disksink_class_init (GstDiskSinkClass *klass)
{
GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
parent_class = gtk_type_class (GST_TYPE_ELEMENT);
-
gtk_object_add_arg_type ("GstDiskSink::location", GST_TYPE_FILENAME,
GTK_ARG_READWRITE, ARG_LOCATION);
-/*
- gtk_object_add_arg_type ("GstDiskSink::silent", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_SILENT);
-*/
- gtk_object_add_arg_type ("GstDiskSink::closed", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_CLOSED);
-
gst_disksink_signals[SIGNAL_HANDOFF] =
gtk_signal_new ("handoff", GTK_RUN_LAST, gtkobject_class->type,
gtk_object_class_add_signals (gtkobject_class, gst_disksink_signals,
LAST_SIGNAL);
-
gtkobject_class->set_arg = gst_disksink_set_arg;
gtkobject_class->get_arg = gst_disksink_get_arg;
+
+ gstelement_class->change_state = gst_disksink_change_state;
}
static void
pad = gst_pad_new ("sink", GST_PAD_SINK);
gst_element_add_pad (GST_ELEMENT (disksink), pad);
gst_pad_set_chain_function (pad, gst_disksink_chain);
- disksink->opened = FALSE;
+
disksink->filename = NULL;
disksink->file = NULL;
-
-// disksink->silent = FALSE; ? what's this ? it's for output !
}
static void
switch(id) {
case ARG_LOCATION:
- /* the element must be stopped in order to do this */
- g_return_if_fail (GST_STATE (sink) < GST_STATE_PLAYING);
-
- if (sink->filename) g_free (sink->filename);
-
+ if (sink->filename)
+ g_free (sink->filename);
sink->filename = g_strdup (GTK_VALUE_STRING (*arg));
- sink->file = fopen (GTK_VALUE_STRING (*arg), "w");
- if (sink->file == NULL)
- {
- g_error ("Cannot open %s for writing !\n", GTK_VALUE_STRING (*arg));
- //exit (-2);
- }
- else sink->opened = TRUE;
- gst_element_set_state(GST_ELEMENT(sink),GST_STATE_READY);
break;
- /*
- case ARG_SILENT:
- sink->silent = GTK_VALUE_BOOL (*arg);
- break;
- */
- case ARG_CLOSED:
- if (GTK_VALUE_BOOL (*arg) == TRUE)
- {
- /* close the file descriptor */
- sink->opened = FALSE;
- if (! (fclose (sink->file)))
- {
- g_warning ("Cannot close file !\n");
- }
- }
- break;
-
default:
break;
}
sink = GST_DISKSINK (object);
switch (id) {
- /*
- case ARG_SILENT:
- GTK_VALUE_BOOL (*arg) = sink->silent;
- break;
- */
- case ARG_CLOSED:
- GTK_VALUE_BOOL (*arg) = !sink->opened;
- break;
case ARG_LOCATION:
GTK_VALUE_STRING (*arg) = sink->filename;
break;
}
}
+static gboolean
+gst_disksink_open_file (GstDiskSink *sink)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (sink, GST_DISKSINK_OPEN), FALSE);
+
+ /* open the file */
+ sink->file = fopen (sink->filename, "w");
+ if (sink->file == NULL) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (sink), g_strconcat("opening file \"", sink->filename, "\"", NULL));
+ return FALSE;
+ }
+
+ GST_FLAG_SET (sink, GST_DISKSINK_OPEN);
+
+ return TRUE;
+}
+
+static void
+gst_disksink_close_file (GstDiskSink *sink)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (sink, GST_DISKSINK_OPEN));
+
+ if (fclose (sink->file) != 0)
+ {
+ perror ("close");
+ gst_element_error (GST_ELEMENT (sink), g_strconcat("closing file \"", sink->filename, "\"", NULL));
+ }
+ else {
+ GST_FLAG_UNSET (sink, GST_DISKSINK_OPEN);
+ }
+}
+
/**
* gst_disksink_chain:
* @pad: the pad this disksink is connected to
g_return_if_fail (buf != NULL);
disksink = GST_DISKSINK (gst_pad_get_parent (pad));
-/*
- if (!disksink->silent)
- g_print("disksink: ******* (%s:%s)< \n",GST_DEBUG_PAD_NAME(pad));
-*/
- if (disksink->opened)
+
+ if (GST_FLAG_IS_SET (disksink, GST_DISKSINK_OPEN))
{
bytes_written = fwrite (GST_BUFFER_DATA (buf), 1, GST_BUFFER_SIZE (buf), disksink->file);
if (bytes_written < GST_BUFFER_SIZE (buf))
gtk_signal_emit (GTK_OBJECT (disksink), gst_disksink_signals[SIGNAL_HANDOFF],
disksink);
}
+
+static GstElementStateReturn
+gst_disksink_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_DISKSINK (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_DISKSINK_OPEN))
+ gst_disksink_close_file (GST_DISKSINK (element));
+ } else {
+ if (!GST_FLAG_IS_SET (element, GST_DISKSINK_OPEN)) {
+ if (!gst_disksink_open_file (GST_DISKSINK (element)))
+ return GST_STATE_FAILURE;
+ }
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
+
typedef struct _GstDiskSink GstDiskSink;
typedef struct _GstDiskSinkClass GstDiskSinkClass;
+typedef enum {
+ GST_DISKSINK_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_DISKSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstDiskSinkFlags;
+
struct _GstDiskSink {
GstElement element;
gchar *filename;
FILE *file;
-
- gboolean opened;
- gboolean silent;
};
struct _GstDiskSinkClass {
/* open the file and mmap it, necessary to go to READY state */
-static
-gboolean gst_disksrc_open_file (GstDiskSrc *src)
+static gboolean
+gst_disksrc_open_file (GstDiskSrc *src)
{
g_return_val_if_fail (!GST_FLAG_IS_SET (src ,GST_DISKSRC_OPEN), FALSE);
name, \
type, \
gst_props_new ( \
- a, \
+ a, \
NULL))
#define GST_CAPS_FACTORY(factoryname, a...) \
padname, \
dir, \
pres, \
- ##a, \
+ a , \
NULL)
#define GST_PADTEMPLATE_FACTORY(name, padname, dir, pres, a...) \
padname, \
dir, \
pres, \
- ##a); \
+ a ); \
} \
return templ; \
}
*/
#include <stdio.h>
+#include <string.h>
#include "gstextratypes.h"
}
case GTK_TYPE_BOOL: {
gboolean i = FALSE;
- if (!strcmp ("true", value)) i = TRUE;
+ if (!strncmp ("true", value, 4)) i = TRUE;
gtk_object_set (GTK_OBJECT (object), name, i, NULL);
break;
}
enum {
ARG_0,
ARG_LOCATION,
- ARG_CLOSED/*,
- ARG_SILENT,
- ARG_BYTESPERWRITE,
- ARG_NUM_SOURCES,
- */
};
static void gst_disksink_set_arg (GtkObject *object, GtkArg *arg, guint id);
static void gst_disksink_get_arg (GtkObject *object, GtkArg *arg, guint id);
+static gboolean gst_disksink_open_file (GstDiskSink *sink);
+static void gst_disksink_close_file (GstDiskSink *sink);
+
static void gst_disksink_chain (GstPad *pad,GstBuffer *buf);
+static GstElementStateReturn gst_disksink_change_state (GstElement *element);
+
static GstElementClass *parent_class = NULL;
static guint gst_disksink_signals[LAST_SIGNAL] = { 0 };
(GtkObjectInitFunc)gst_disksink_init,
(GtkArgSetFunc)gst_disksink_set_arg,
(GtkArgGetFunc)gst_disksink_get_arg,
- (GtkClassInitFunc)NULL, /* QUESTION : why null ? otherwise coredump */
+ (GtkClassInitFunc)NULL, /* deprecated, do not use ! */
};
disksink_type = gtk_type_unique (GST_TYPE_ELEMENT, &disksink_info);
}
gst_disksink_class_init (GstDiskSinkClass *klass)
{
GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
parent_class = gtk_type_class (GST_TYPE_ELEMENT);
-
gtk_object_add_arg_type ("GstDiskSink::location", GST_TYPE_FILENAME,
GTK_ARG_READWRITE, ARG_LOCATION);
-/*
- gtk_object_add_arg_type ("GstDiskSink::silent", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_SILENT);
-*/
- gtk_object_add_arg_type ("GstDiskSink::closed", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_CLOSED);
-
gst_disksink_signals[SIGNAL_HANDOFF] =
gtk_signal_new ("handoff", GTK_RUN_LAST, gtkobject_class->type,
gtk_object_class_add_signals (gtkobject_class, gst_disksink_signals,
LAST_SIGNAL);
-
gtkobject_class->set_arg = gst_disksink_set_arg;
gtkobject_class->get_arg = gst_disksink_get_arg;
+
+ gstelement_class->change_state = gst_disksink_change_state;
}
static void
pad = gst_pad_new ("sink", GST_PAD_SINK);
gst_element_add_pad (GST_ELEMENT (disksink), pad);
gst_pad_set_chain_function (pad, gst_disksink_chain);
- disksink->opened = FALSE;
+
disksink->filename = NULL;
disksink->file = NULL;
-
-// disksink->silent = FALSE; ? what's this ? it's for output !
}
static void
switch(id) {
case ARG_LOCATION:
- /* the element must be stopped in order to do this */
- g_return_if_fail (GST_STATE (sink) < GST_STATE_PLAYING);
-
- if (sink->filename) g_free (sink->filename);
-
+ if (sink->filename)
+ g_free (sink->filename);
sink->filename = g_strdup (GTK_VALUE_STRING (*arg));
- sink->file = fopen (GTK_VALUE_STRING (*arg), "w");
- if (sink->file == NULL)
- {
- g_error ("Cannot open %s for writing !\n", GTK_VALUE_STRING (*arg));
- //exit (-2);
- }
- else sink->opened = TRUE;
- gst_element_set_state(GST_ELEMENT(sink),GST_STATE_READY);
break;
- /*
- case ARG_SILENT:
- sink->silent = GTK_VALUE_BOOL (*arg);
- break;
- */
- case ARG_CLOSED:
- if (GTK_VALUE_BOOL (*arg) == TRUE)
- {
- /* close the file descriptor */
- sink->opened = FALSE;
- if (! (fclose (sink->file)))
- {
- g_warning ("Cannot close file !\n");
- }
- }
- break;
-
default:
break;
}
sink = GST_DISKSINK (object);
switch (id) {
- /*
- case ARG_SILENT:
- GTK_VALUE_BOOL (*arg) = sink->silent;
- break;
- */
- case ARG_CLOSED:
- GTK_VALUE_BOOL (*arg) = !sink->opened;
- break;
case ARG_LOCATION:
GTK_VALUE_STRING (*arg) = sink->filename;
break;
}
}
+static gboolean
+gst_disksink_open_file (GstDiskSink *sink)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (sink, GST_DISKSINK_OPEN), FALSE);
+
+ /* open the file */
+ sink->file = fopen (sink->filename, "w");
+ if (sink->file == NULL) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (sink), g_strconcat("opening file \"", sink->filename, "\"", NULL));
+ return FALSE;
+ }
+
+ GST_FLAG_SET (sink, GST_DISKSINK_OPEN);
+
+ return TRUE;
+}
+
+static void
+gst_disksink_close_file (GstDiskSink *sink)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (sink, GST_DISKSINK_OPEN));
+
+ if (fclose (sink->file) != 0)
+ {
+ perror ("close");
+ gst_element_error (GST_ELEMENT (sink), g_strconcat("closing file \"", sink->filename, "\"", NULL));
+ }
+ else {
+ GST_FLAG_UNSET (sink, GST_DISKSINK_OPEN);
+ }
+}
+
/**
* gst_disksink_chain:
* @pad: the pad this disksink is connected to
g_return_if_fail (buf != NULL);
disksink = GST_DISKSINK (gst_pad_get_parent (pad));
-/*
- if (!disksink->silent)
- g_print("disksink: ******* (%s:%s)< \n",GST_DEBUG_PAD_NAME(pad));
-*/
- if (disksink->opened)
+
+ if (GST_FLAG_IS_SET (disksink, GST_DISKSINK_OPEN))
{
bytes_written = fwrite (GST_BUFFER_DATA (buf), 1, GST_BUFFER_SIZE (buf), disksink->file);
if (bytes_written < GST_BUFFER_SIZE (buf))
gtk_signal_emit (GTK_OBJECT (disksink), gst_disksink_signals[SIGNAL_HANDOFF],
disksink);
}
+
+static GstElementStateReturn
+gst_disksink_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_DISKSINK (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_DISKSINK_OPEN))
+ gst_disksink_close_file (GST_DISKSINK (element));
+ } else {
+ if (!GST_FLAG_IS_SET (element, GST_DISKSINK_OPEN)) {
+ if (!gst_disksink_open_file (GST_DISKSINK (element)))
+ return GST_STATE_FAILURE;
+ }
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
+
typedef struct _GstDiskSink GstDiskSink;
typedef struct _GstDiskSinkClass GstDiskSinkClass;
+typedef enum {
+ GST_DISKSINK_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_DISKSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstDiskSinkFlags;
+
struct _GstDiskSink {
GstElement element;
gchar *filename;
FILE *file;
-
- gboolean opened;
- gboolean silent;
};
struct _GstDiskSinkClass {
/* open the file and mmap it, necessary to go to READY state */
-static
-gboolean gst_disksrc_open_file (GstDiskSrc *src)
+static gboolean
+gst_disksrc_open_file (GstDiskSrc *src)
{
g_return_val_if_fail (!GST_FLAG_IS_SET (src ,GST_DISKSRC_OPEN), FALSE);
mpeg2parse mp1parse mp3play ac3parse ac3play dvdcat fake cobin videotest \
aviparse vidcapture avi2mpg mp2tomp1 mp1tomp1 pipetest \
vidcapture2 mp2toavi mp3tovorbis mpeg2parse2 xmmstest videotest2 \
- mp3mad video2mp1 dvshow
+ mp3mad video2mp1 dvshow dv2mp1
SUBDIRS = xml bindings
xvlibs=
endif
-LDADD = ${xvlibs} -lXxf86vm
+LDADD = ${xvlibs} -lXxf86vm $(GNOME_LIBS) $(GST_LIBS)
#LDADD = $(GLIB_LIBS) $(GTK_LIBS) $(top_builddir)/gst/libgst.la \
# $(top_builddir)/plugins/videosink/libvideosink.la -L/usr/X11/lib -lXxf86dga
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096)
),
- GST_CAPS_NEW (
+ GST_CAPS_NEW(
"mpeg2dec_src_caps",
"video/raw",
"foo", GST_PROPS_BOOLEAN (TRUE)