2002-04-28 17:08:59 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
|
|
* 2000 Wim Taymans <wtay@chello.be>
|
2006-06-16 16:28:37 +00:00
|
|
|
* 2006 Wim Taymans <wim@fluendo.com>
|
2002-04-28 17:08:59 +00:00
|
|
|
*
|
2005-07-14 09:35:12 +00:00
|
|
|
* gstfilesink.c:
|
2002-04-28 17:08:59 +00:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
2005-08-05 13:42:10 +00:00
|
|
|
/**
|
2005-12-01 12:29:34 +00:00
|
|
|
* SECTION:element-filesink
|
2005-08-05 13:42:10 +00:00
|
|
|
* @short_description: write stream to a file
|
|
|
|
* @see_also: #GstFileSrc
|
|
|
|
*
|
2005-11-09 09:47:12 +00:00
|
|
|
* Write incoming data to a file in the local file system.
|
2005-08-05 13:42:10 +00:00
|
|
|
*/
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2003-06-29 14:05:49 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2005-11-29 18:00:15 +00:00
|
|
|
#include "../../gst/gst-i18n-lib.h"
|
2004-01-18 21:36:20 +00:00
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
#include <gst/gst.h>
|
2007-01-10 19:25:09 +00:00
|
|
|
#include <stdio.h> /* for fseeko() */
|
2007-12-24 19:11:29 +00:00
|
|
|
#ifdef HAVE_STDIO_EXT_H
|
|
|
|
#include <stdio_ext.h> /* for __fbufsize, for debugging */
|
|
|
|
#endif
|
2002-04-28 17:08:59 +00:00
|
|
|
#include <errno.h>
|
|
|
|
#include "gstfilesink.h"
|
|
|
|
#include <string.h>
|
2003-09-13 01:06:53 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
2004-05-07 02:36:28 +00:00
|
|
|
#ifdef HAVE_UNISTD_H
|
2003-09-13 01:06:53 +00:00
|
|
|
#include <unistd.h>
|
2004-05-07 02:36:28 +00:00
|
|
|
#endif
|
2002-04-28 17:08:59 +00:00
|
|
|
|
gst/: s/gst_pad_new/&_from_template/ register pad templates in the base_init function add static pad template definit...
Original commit message from CVS:
* gst/autoplug/gstspideridentity.c:
(gst_spider_identity_request_new_pad):
* gst/elements/gstaggregator.c: (gst_aggregator_base_init),
(gst_aggregator_init):
* gst/elements/gstfakesink.c: (gst_fakesink_base_init),
(gst_fakesink_init):
* gst/elements/gstfakesrc.c: (gst_fakesrc_base_init),
(gst_fakesrc_init):
* gst/elements/gstfdsink.c: (gst_fdsink_base_init),
(gst_fdsink_init):
* gst/elements/gstfdsrc.c: (gst_fdsrc_base_init), (gst_fdsrc_init):
* gst/elements/gstfilesink.c: (gst_filesink_base_init),
(gst_filesink_init):
* gst/elements/gstfilesrc.c: (gst_filesrc_base_init),
(gst_filesrc_init):
* gst/elements/gstidentity.c: (gst_identity_base_init),
(gst_identity_init):
* gst/elements/gstmultifilesrc.c: (gst_multifilesrc_base_init),
(gst_multifilesrc_init):
* gst/elements/gstpipefilter.c: (gst_pipefilter_base_init),
(gst_pipefilter_init):
* gst/elements/gststatistics.c: (gst_statistics_base_init),
(gst_statistics_init):
* gst/elements/gsttee.c: (gst_tee_base_init), (gst_tee_init):
* gst/gstqueue.c: (gst_queue_base_init), (gst_queue_init):
s/gst_pad_new/&_from_template/
register pad templates in the base_init function
add static pad template definitions
2004-08-17 14:11:23 +00:00
|
|
|
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS_ANY);
|
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
#define GST_TYPE_BUFFER_MODE (buffer_mode_get_type ())
|
|
|
|
static GType
|
|
|
|
buffer_mode_get_type (void)
|
|
|
|
{
|
|
|
|
static GType buffer_mode_type = 0;
|
|
|
|
static const GEnumValue buffer_mode[] = {
|
|
|
|
{-1, "Default buffering", "default"},
|
|
|
|
{_IOFBF, "Fully buffered", "full"},
|
|
|
|
{_IOLBF, "Line buffered", "line"},
|
|
|
|
{_IONBF, "Unbuffered", "unbuffered"},
|
|
|
|
{0, NULL, NULL},
|
|
|
|
};
|
|
|
|
|
|
|
|
if (!buffer_mode_type) {
|
|
|
|
buffer_mode_type =
|
|
|
|
g_enum_register_static ("GstFileSinkBufferMode", buffer_mode);
|
|
|
|
}
|
|
|
|
return buffer_mode_type;
|
|
|
|
}
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (gst_file_sink_debug);
|
|
|
|
#define GST_CAT_DEFAULT gst_file_sink_debug
|
2003-06-29 14:05:49 +00:00
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
#define DEFAULT_LOCATION NULL
|
|
|
|
#define DEFAULT_BUFFER_MODE -1
|
|
|
|
#define DEFAULT_BUFFER_SIZE 64 * 1024
|
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
enum
|
|
|
|
{
|
2007-12-24 19:11:29 +00:00
|
|
|
PROP_0,
|
|
|
|
PROP_LOCATION,
|
|
|
|
PROP_BUFFER_MODE,
|
|
|
|
PROP_BUFFER_SIZE,
|
|
|
|
PROP_LAST
|
2002-04-28 17:08:59 +00:00
|
|
|
};
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
static void gst_file_sink_dispose (GObject * object);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
static void gst_file_sink_set_property (GObject * object, guint prop_id,
|
2004-03-13 15:27:01 +00:00
|
|
|
const GValue * value, GParamSpec * pspec);
|
2005-07-14 09:35:12 +00:00
|
|
|
static void gst_file_sink_get_property (GObject * object, guint prop_id,
|
2004-03-13 15:27:01 +00:00
|
|
|
GValue * value, GParamSpec * pspec);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
static gboolean gst_file_sink_open_file (GstFileSink * sink);
|
|
|
|
static void gst_file_sink_close_file (GstFileSink * sink);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-11-09 09:47:12 +00:00
|
|
|
static gboolean gst_file_sink_start (GstBaseSink * sink);
|
|
|
|
static gboolean gst_file_sink_stop (GstBaseSink * sink);
|
2005-07-14 09:35:12 +00:00
|
|
|
static gboolean gst_file_sink_event (GstBaseSink * sink, GstEvent * event);
|
|
|
|
static GstFlowReturn gst_file_sink_render (GstBaseSink * sink,
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
GstBuffer * buffer);
|
|
|
|
|
2006-06-16 16:28:37 +00:00
|
|
|
static gboolean gst_file_sink_do_seek (GstFileSink * filesink,
|
|
|
|
guint64 new_offset);
|
2007-05-22 11:43:07 +00:00
|
|
|
static gboolean gst_file_sink_get_current_offset (GstFileSink * filesink,
|
|
|
|
guint64 * p_pos);
|
2006-06-16 16:28:37 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
static gboolean gst_file_sink_query (GstPad * pad, GstQuery * query);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
static void gst_file_sink_uri_handler_init (gpointer g_iface,
|
2004-03-13 15:27:01 +00:00
|
|
|
gpointer iface_data);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
|
|
|
|
2004-01-08 04:10:18 +00:00
|
|
|
static void
|
|
|
|
_do_init (GType filesink_type)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2004-01-08 04:10:18 +00:00
|
|
|
static const GInterfaceInfo urihandler_info = {
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_handler_init,
|
2004-01-08 04:10:18 +00:00
|
|
|
NULL,
|
|
|
|
NULL
|
|
|
|
};
|
2004-03-15 19:27:17 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
g_type_add_interface_static (filesink_type, GST_TYPE_URI_HANDLER,
|
|
|
|
&urihandler_info);
|
2005-07-14 09:35:12 +00:00
|
|
|
GST_DEBUG_CATEGORY_INIT (gst_file_sink_debug, "filesink", 0,
|
2004-03-13 15:27:01 +00:00
|
|
|
"filesink element");
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
GST_BOILERPLATE_FULL (GstFileSink, gst_file_sink, GstBaseSink,
|
2005-07-10 12:03:13 +00:00
|
|
|
GST_TYPE_BASE_SINK, _do_init);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_base_init (gpointer g_class)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
Revert previous changes to the behaviour of GstPadTemplates, etc and the possiblity to call them in class_init as it ...
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_get_type), (gst_bin_base_init),
(gst_bin_class_init):
* gst/gstelement.c: (gst_element_base_class_init),
(gst_element_class_add_pad_template):
* gst/gstpadtemplate.c: (gst_pad_template_init):
* gst/gstpipeline.c: (gst_pipeline_get_type),
(gst_pipeline_base_init), (gst_pipeline_class_init):
* libs/gst/base/gstbasesink.c:
* libs/gst/base/gstbasesrc.c: (gst_base_src_get_type),
(gst_base_src_base_init), (gst_base_src_class_init):
* plugins/elements/gstcapsfilter.c: (gst_capsfilter_base_init),
(gst_capsfilter_class_init):
* plugins/elements/gstfakesink.c: (gst_fake_sink_base_init),
(gst_fake_sink_class_init):
* plugins/elements/gstfakesrc.c: (gst_fake_src_base_init),
(gst_fake_src_class_init):
* plugins/elements/gstfdsink.c: (gst_fd_sink_base_init),
(gst_fd_sink_class_init):
* plugins/elements/gstfdsrc.c: (gst_fd_src_base_init),
(gst_fd_src_class_init):
* plugins/elements/gstfilesink.c: (gst_file_sink_base_init),
(gst_file_sink_class_init):
* plugins/elements/gstfilesrc.c: (gst_file_src_base_init),
(gst_file_src_class_init):
* plugins/elements/gstidentity.c: (gst_identity_base_init),
(gst_identity_class_init):
* plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init),
(gst_multi_queue_class_init):
* plugins/elements/gstqueue.c: (gst_queue_base_init),
(gst_queue_class_init):
* plugins/elements/gsttee.c: (gst_tee_base_init),
(gst_tee_class_init):
* plugins/elements/gsttypefindelement.c:
(gst_type_find_element_base_init),
(gst_type_find_element_class_init):
* tests/check/gst/gstelement.c: (gst_element_suite):
Revert previous changes to the behaviour of GstPadTemplates, etc
and the possiblity to call them in class_init as it breaks too
many elements. Reopens bug #491501.
Should be applied again for 0.11, thus added a few FIXME 0.11 at
several places.
2008-02-05 14:15:15 +00:00
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
|
|
|
|
|
|
|
gst_element_class_set_details_simple (gstelement_class,
|
|
|
|
"File Sink",
|
|
|
|
"Sink/File", "Write stream to a file", "Thomas <thomas@apestaart.org>");
|
|
|
|
gst_element_class_add_pad_template (gstelement_class,
|
|
|
|
gst_static_pad_template_get (&sinktemplate));
|
2003-10-31 19:32:47 +00:00
|
|
|
}
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
|
2003-10-31 19:32:47 +00:00
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_class_init (GstFileSinkClass * klass)
|
2003-10-31 19:32:47 +00:00
|
|
|
{
|
|
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
2005-07-10 12:03:13 +00:00
|
|
|
GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
gobject_class->dispose = gst_file_sink_dispose;
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
gobject_class->set_property = gst_file_sink_set_property;
|
|
|
|
gobject_class->get_property = gst_file_sink_get_property;
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
g_object_class_install_property (gobject_class, PROP_LOCATION,
|
2004-03-13 15:27:01 +00:00
|
|
|
g_param_spec_string ("location", "File Location",
|
2004-03-15 19:27:17 +00:00
|
|
|
"Location of the file to write", NULL, G_PARAM_READWRITE));
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
g_object_class_install_property (gobject_class, PROP_BUFFER_MODE,
|
|
|
|
g_param_spec_enum ("buffer-mode", "Buffering mode",
|
|
|
|
"The buffering mode to use", GST_TYPE_BUFFER_MODE,
|
|
|
|
DEFAULT_BUFFER_MODE, G_PARAM_READWRITE));
|
|
|
|
|
|
|
|
g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE,
|
|
|
|
g_param_spec_uint ("buffer-size", "Buffering size",
|
|
|
|
"Size of buffer in number of bytes for line or full buffer-mode", 0,
|
|
|
|
G_MAXUINT, DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE));
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
|
2005-08-30 17:12:33 +00:00
|
|
|
gstbasesink_class->get_times = NULL;
|
2005-11-09 09:47:12 +00:00
|
|
|
gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_file_sink_start);
|
|
|
|
gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_file_sink_stop);
|
2005-07-14 09:35:12 +00:00
|
|
|
gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_file_sink_render);
|
|
|
|
gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_file_sink_event);
|
2005-07-30 15:00:07 +00:00
|
|
|
|
|
|
|
if (sizeof (off_t) < 8) {
|
2006-11-02 13:00:38 +00:00
|
|
|
GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT "!",
|
|
|
|
sizeof (off_t));
|
2005-07-30 15:00:07 +00:00
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void
|
2005-08-28 17:45:58 +00:00
|
|
|
gst_file_sink_init (GstFileSink * filesink, GstFileSinkClass * g_class)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
|
|
|
GstPad *pad;
|
|
|
|
|
2005-07-10 12:03:13 +00:00
|
|
|
pad = GST_BASE_SINK_PAD (filesink);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-11-09 17:55:13 +00:00
|
|
|
gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_file_sink_query));
|
2003-06-01 12:27:39 +00:00
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
filesink->filename = NULL;
|
|
|
|
filesink->file = NULL;
|
2007-12-24 19:11:29 +00:00
|
|
|
filesink->buffer_mode = DEFAULT_BUFFER_MODE;
|
|
|
|
filesink->buffer_size = DEFAULT_BUFFER_SIZE;
|
|
|
|
filesink->buffer = NULL;
|
2005-09-20 19:16:43 +00:00
|
|
|
|
2006-10-02 09:41:09 +00:00
|
|
|
gst_base_sink_set_sync (GST_BASE_SINK (filesink), FALSE);
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_dispose (GObject * object)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
2005-07-14 09:35:12 +00:00
|
|
|
GstFileSink *sink = GST_FILE_SINK (object);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
g_free (sink->uri);
|
|
|
|
sink->uri = NULL;
|
|
|
|
g_free (sink->filename);
|
|
|
|
sink->filename = NULL;
|
2007-12-24 19:11:29 +00:00
|
|
|
g_free (sink->buffer);
|
|
|
|
sink->buffer = NULL;
|
|
|
|
sink->buffer_size = 0;
|
2003-11-24 03:21:54 +00:00
|
|
|
}
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
static gboolean
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_set_location (GstFileSink * sink, const gchar * location)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
2006-10-02 09:41:09 +00:00
|
|
|
if (sink->file)
|
|
|
|
goto was_open;
|
2003-11-24 03:21:54 +00:00
|
|
|
|
|
|
|
g_free (sink->filename);
|
|
|
|
g_free (sink->uri);
|
2004-01-07 13:13:03 +00:00
|
|
|
if (location != NULL) {
|
|
|
|
sink->filename = g_strdup (location);
|
|
|
|
sink->uri = gst_uri_construct ("file", location);
|
|
|
|
} else {
|
|
|
|
sink->filename = NULL;
|
|
|
|
sink->uri = NULL;
|
|
|
|
}
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
return TRUE;
|
2006-10-02 09:41:09 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
was_open:
|
|
|
|
{
|
|
|
|
g_warning ("Changing the `location' property on filesink when "
|
|
|
|
"a file is open not supported.");
|
|
|
|
return FALSE;
|
|
|
|
}
|
2003-11-24 03:21:54 +00:00
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_set_property (GObject * object, guint prop_id,
|
2004-03-13 15:27:01 +00:00
|
|
|
const GValue * value, GParamSpec * pspec)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2005-11-09 09:47:12 +00:00
|
|
|
GstFileSink *sink = GST_FILE_SINK (object);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
|
|
|
switch (prop_id) {
|
2007-12-24 19:11:29 +00:00
|
|
|
case PROP_LOCATION:
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_set_location (sink, g_value_get_string (value));
|
2002-04-28 17:08:59 +00:00
|
|
|
break;
|
2007-12-24 19:11:29 +00:00
|
|
|
case PROP_BUFFER_MODE:
|
|
|
|
sink->buffer_mode = g_value_get_enum (value);
|
|
|
|
break;
|
|
|
|
case PROP_BUFFER_SIZE:
|
|
|
|
sink->buffer_size = g_value_get_uint (value);
|
|
|
|
break;
|
2002-04-28 17:08:59 +00:00
|
|
|
default:
|
2003-06-01 12:27:39 +00:00
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
2002-04-28 17:08:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_get_property (GObject * object, guint prop_id, GValue * value,
|
2004-03-13 15:27:01 +00:00
|
|
|
GParamSpec * pspec)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2005-11-09 09:47:12 +00:00
|
|
|
GstFileSink *sink = GST_FILE_SINK (object);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
switch (prop_id) {
|
2007-12-24 19:11:29 +00:00
|
|
|
case PROP_LOCATION:
|
2003-06-01 12:27:39 +00:00
|
|
|
g_value_set_string (value, sink->filename);
|
2002-04-28 17:08:59 +00:00
|
|
|
break;
|
2007-12-24 19:11:29 +00:00
|
|
|
case PROP_BUFFER_MODE:
|
|
|
|
g_value_set_enum (value, sink->buffer_mode);
|
|
|
|
break;
|
|
|
|
case PROP_BUFFER_SIZE:
|
|
|
|
g_value_set_uint (value, sink->buffer_size);
|
|
|
|
break;
|
2002-04-28 17:08:59 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_open_file (GstFileSink * sink)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2007-12-24 19:11:29 +00:00
|
|
|
gint mode;
|
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
/* open the file */
|
2006-06-16 16:28:37 +00:00
|
|
|
if (sink->filename == NULL || sink->filename[0] == '\0')
|
|
|
|
goto no_filename;
|
|
|
|
|
|
|
|
sink->file = fopen (sink->filename, "wb");
|
|
|
|
if (sink->file == NULL)
|
|
|
|
goto open_failed;
|
|
|
|
|
2007-12-24 19:11:29 +00:00
|
|
|
/* see if we are asked to perform a specific kind of buffering */
|
|
|
|
if ((mode = sink->buffer_mode) != -1) {
|
|
|
|
size_t buffer_size;
|
|
|
|
|
|
|
|
/* free previous buffer if any */
|
|
|
|
g_free (sink->buffer);
|
|
|
|
|
|
|
|
if (mode == _IONBF) {
|
|
|
|
/* no buffering */
|
|
|
|
sink->buffer = NULL;
|
|
|
|
buffer_size = 0;
|
|
|
|
} else {
|
|
|
|
/* allocate buffer */
|
|
|
|
sink->buffer = g_malloc (sink->buffer_size);
|
|
|
|
buffer_size = sink->buffer_size;
|
|
|
|
}
|
|
|
|
#ifdef HAVE_STDIO_EXT_H
|
|
|
|
GST_DEBUG_OBJECT (sink, "change buffer size %d to %d, mode %d",
|
|
|
|
__fbufsize (sink->file), buffer_size, mode);
|
|
|
|
#else
|
|
|
|
GST_DEBUG_OBJECT (sink, "change buffer size to %d, mode %d",
|
|
|
|
sink->buffer_size, mode);
|
|
|
|
#endif
|
|
|
|
if (setvbuf (sink->file, sink->buffer, mode, buffer_size) != 0) {
|
|
|
|
GST_WARNING_OBJECT (sink, "warning: setvbuf failed: %s",
|
|
|
|
g_strerror (errno));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-22 11:43:07 +00:00
|
|
|
sink->current_pos = 0;
|
2006-06-16 16:28:37 +00:00
|
|
|
/* try to seek in the file to figure out if it is seekable */
|
|
|
|
sink->seekable = gst_file_sink_do_seek (sink, 0);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (sink, "opened file %s, seekable %d",
|
|
|
|
sink->filename, sink->seekable);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
no_filename:
|
|
|
|
{
|
2004-01-29 23:17:58 +00:00
|
|
|
GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
|
2004-03-15 19:27:17 +00:00
|
|
|
(_("No file name specified for writing.")), (NULL));
|
2002-04-28 17:08:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2006-06-16 16:28:37 +00:00
|
|
|
open_failed:
|
|
|
|
{
|
2004-01-29 23:17:58 +00:00
|
|
|
GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE,
|
2004-03-15 19:27:17 +00:00
|
|
|
(_("Could not open file \"%s\" for writing."), sink->filename),
|
|
|
|
GST_ERROR_SYSTEM);
|
2002-04-28 17:08:59 +00:00
|
|
|
return FALSE;
|
2004-01-18 21:36:20 +00:00
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_close_file (GstFileSink * sink)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2005-10-06 13:24:28 +00:00
|
|
|
if (sink->file) {
|
2006-06-16 16:28:37 +00:00
|
|
|
if (fclose (sink->file) != 0)
|
|
|
|
goto close_failed;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (sink, "closed file");
|
2006-10-02 09:41:09 +00:00
|
|
|
sink->file = NULL;
|
2007-12-24 19:11:29 +00:00
|
|
|
|
|
|
|
g_free (sink->buffer);
|
|
|
|
sink->buffer = NULL;
|
2006-06-16 16:28:37 +00:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
close_failed:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
|
|
|
|
(_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
|
|
|
|
return;
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-06-01 12:27:39 +00:00
|
|
|
static gboolean
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_query (GstPad * pad, GstQuery * query)
|
2003-06-01 12:27:39 +00:00
|
|
|
{
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
GstFileSink *self;
|
|
|
|
GstFormat format;
|
2003-06-01 12:27:39 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
self = GST_FILE_SINK (GST_PAD_PARENT (pad));
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
|
|
|
|
switch (GST_QUERY_TYPE (query)) {
|
2003-06-01 12:27:39 +00:00
|
|
|
case GST_QUERY_POSITION:
|
gst/: API change fix.
Original commit message from CVS:
* gst/base/gstbasesink.c: (gst_base_sink_commit_state),
(gst_base_sink_handle_object), (gst_base_sink_query), (do_playing):
* gst/base/gstbasesrc.c: (gst_base_src_query):
* gst/elements/gstfilesink.c: (gst_file_sink_query):
* gst/elements/gsttypefindelement.c:
(gst_type_find_handle_src_query), (find_element_get_length),
(gst_type_find_element_activate):
API change fix.
* gst/gstquery.c: (gst_query_new_position),
(gst_query_set_position), (gst_query_parse_position),
(gst_query_new_duration), (gst_query_set_duration),
(gst_query_parse_duration), (gst_query_set_segment),
(gst_query_parse_segment):
* gst/gstquery.h:
Bundling query position/duration is not a good idea since duration
does not change much and we don't want to recalculate it for every
position query, so they are separated again..
Base value in segment query is not needed.
* gst/gstqueue.c: (gst_queue_handle_src_query):
* gst/gstutils.c: (gst_element_query_position),
(gst_element_query_duration), (gst_pad_query_position),
(gst_pad_query_duration):
* gst/gstutils.h:
Updates for query API change.
Added some docs here and there.
2005-10-19 15:50:10 +00:00
|
|
|
gst_query_parse_position (query, &format, NULL);
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
switch (format) {
|
|
|
|
case GST_FORMAT_DEFAULT:
|
2004-03-15 19:27:17 +00:00
|
|
|
case GST_FORMAT_BYTES:
|
2007-05-22 11:43:07 +00:00
|
|
|
gst_query_set_position (query, GST_FORMAT_BYTES, self->current_pos);
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
return TRUE;
|
2004-03-15 19:27:17 +00:00
|
|
|
default:
|
|
|
|
return FALSE;
|
2003-06-01 12:27:39 +00:00
|
|
|
}
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
|
|
|
|
case GST_QUERY_FORMATS:
|
|
|
|
gst_query_set_formats (query, 2, GST_FORMAT_DEFAULT, GST_FORMAT_BYTES);
|
|
|
|
return TRUE;
|
|
|
|
|
2003-06-01 12:27:39 +00:00
|
|
|
default:
|
2005-05-09 10:53:13 +00:00
|
|
|
return gst_pad_query_default (pad, query);
|
2003-06-01 12:27:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-22 11:55:33 +00:00
|
|
|
#ifdef HAVE_FSEEKO
|
2005-10-23 10:29:51 +00:00
|
|
|
# define __GST_STDIO_SEEK_FUNCTION "fseeko"
|
2007-05-22 11:55:33 +00:00
|
|
|
#elif defined (G_OS_UNIX)
|
2005-10-23 10:29:51 +00:00
|
|
|
# define __GST_STDIO_SEEK_FUNCTION "lseek"
|
|
|
|
#else
|
|
|
|
# define __GST_STDIO_SEEK_FUNCTION "fseek"
|
|
|
|
#endif
|
|
|
|
|
2006-06-16 16:28:37 +00:00
|
|
|
static gboolean
|
2005-07-30 15:00:07 +00:00
|
|
|
gst_file_sink_do_seek (GstFileSink * filesink, guint64 new_offset)
|
|
|
|
{
|
2005-10-23 10:29:51 +00:00
|
|
|
GST_DEBUG_OBJECT (filesink, "Seeking to offset %" G_GUINT64_FORMAT
|
|
|
|
" using " __GST_STDIO_SEEK_FUNCTION, new_offset);
|
2005-07-30 15:00:07 +00:00
|
|
|
|
2005-10-12 16:03:39 +00:00
|
|
|
if (fflush (filesink->file))
|
|
|
|
goto flush_failed;
|
|
|
|
|
2007-05-22 11:55:33 +00:00
|
|
|
#ifdef HAVE_FSEEKO
|
2005-10-23 10:29:51 +00:00
|
|
|
if (fseeko (filesink->file, (off_t) new_offset, SEEK_SET) != 0)
|
|
|
|
goto seek_failed;
|
2007-05-22 11:55:33 +00:00
|
|
|
#elif defined (G_OS_UNIX)
|
2005-07-30 15:00:07 +00:00
|
|
|
if (lseek (fileno (filesink->file), (off_t) new_offset,
|
2005-10-12 16:03:39 +00:00
|
|
|
SEEK_SET) == (off_t) - 1)
|
|
|
|
goto seek_failed;
|
2005-07-30 15:00:07 +00:00
|
|
|
#else
|
2005-10-12 16:03:39 +00:00
|
|
|
if (fseek (filesink->file, (long) new_offset, SEEK_SET) != 0)
|
|
|
|
goto seek_failed;
|
2005-07-30 15:00:07 +00:00
|
|
|
#endif
|
|
|
|
|
2007-05-22 11:43:07 +00:00
|
|
|
/* adjust position reporting after seek;
|
|
|
|
* presumably this should basically yield new_offset */
|
|
|
|
gst_file_sink_get_current_offset (filesink, &filesink->current_pos);
|
|
|
|
|
2006-06-16 16:28:37 +00:00
|
|
|
return TRUE;
|
2005-10-12 16:03:39 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
flush_failed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
|
2006-06-16 16:28:37 +00:00
|
|
|
return FALSE;
|
2005-10-12 16:03:39 +00:00
|
|
|
}
|
|
|
|
seek_failed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (filesink, "Seeking failed: %s", g_strerror (errno));
|
2006-06-16 16:28:37 +00:00
|
|
|
return FALSE;
|
2005-10-12 16:03:39 +00:00
|
|
|
}
|
2005-07-30 15:00:07 +00:00
|
|
|
}
|
|
|
|
|
2002-04-28 17:08:59 +00:00
|
|
|
/* handle events (search) */
|
|
|
|
static gboolean
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
|
|
|
GstEventType type;
|
|
|
|
GstFileSink *filesink;
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
filesink = GST_FILE_SINK (sink);
|
2004-04-29 22:12:35 +00:00
|
|
|
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
type = GST_EVENT_TYPE (event);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
|
|
|
switch (type) {
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
case GST_EVENT_NEWSEGMENT:
|
2002-06-08 15:00:30 +00:00
|
|
|
{
|
2006-10-06 13:01:30 +00:00
|
|
|
gint64 start, stop, pos;
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
GstFormat format;
|
2002-06-08 15:00:30 +00:00
|
|
|
|
2006-10-06 13:01:30 +00:00
|
|
|
gst_event_parse_new_segment (event, NULL, NULL, &format, &start,
|
|
|
|
&stop, &pos);
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
|
|
|
|
if (format == GST_FORMAT_BYTES) {
|
2007-11-27 18:45:38 +00:00
|
|
|
/* only try to seek and fail when we are going to a different
|
|
|
|
* position */
|
|
|
|
if (filesink->current_pos != start) {
|
|
|
|
/* FIXME, the seek should be performed on the pos field, start/stop are
|
|
|
|
* just boundaries for valid bytes offsets. We should also fill the file
|
|
|
|
* with zeroes if the new position extends the current EOF (sparse streams
|
|
|
|
* and segment accumulation). */
|
|
|
|
if (!gst_file_sink_do_seek (filesink, (guint64) start))
|
|
|
|
goto seek_failed;
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (filesink, "Ignored NEWSEGMENT, no seek needed");
|
|
|
|
}
|
2005-07-30 15:00:07 +00:00
|
|
|
} else {
|
2007-11-27 18:45:38 +00:00
|
|
|
GST_DEBUG_OBJECT (filesink,
|
|
|
|
"Ignored NEWSEGMENT event of format %u (%s)", (guint) format,
|
|
|
|
gst_format_get_name (format));
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
}
|
2002-06-08 15:00:30 +00:00
|
|
|
break;
|
|
|
|
}
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
case GST_EVENT_EOS:
|
2006-06-16 16:28:37 +00:00
|
|
|
if (fflush (filesink->file))
|
|
|
|
goto flush_failed;
|
2002-04-28 17:08:59 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
2006-06-16 16:28:37 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
seek_failed:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (filesink, RESOURCE, SEEK,
|
|
|
|
(_("Error while seeking in file \"%s\"."), filesink->filename),
|
|
|
|
GST_ERROR_SYSTEM);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
flush_failed:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
|
|
|
|
(_("Error while writing to file \"%s\"."), filesink->filename),
|
|
|
|
GST_ERROR_SYSTEM);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
|
|
|
|
2005-07-30 15:00:07 +00:00
|
|
|
static gboolean
|
|
|
|
gst_file_sink_get_current_offset (GstFileSink * filesink, guint64 * p_pos)
|
|
|
|
{
|
|
|
|
off_t ret;
|
|
|
|
|
2007-05-22 11:55:33 +00:00
|
|
|
#ifdef HAVE_FTELLO
|
2005-10-23 10:29:51 +00:00
|
|
|
ret = ftello (filesink->file);
|
2007-05-22 11:55:33 +00:00
|
|
|
#elif defined (G_OS_UNIX)
|
2005-10-23 10:29:51 +00:00
|
|
|
if (fflush (filesink->file)) {
|
|
|
|
GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
|
|
|
|
/* ignore and continue */
|
|
|
|
}
|
2005-07-30 15:00:07 +00:00
|
|
|
ret = lseek (fileno (filesink->file), 0, SEEK_CUR);
|
|
|
|
#else
|
|
|
|
ret = (off_t) ftell (filesink->file);
|
|
|
|
#endif
|
|
|
|
|
2007-05-22 11:43:07 +00:00
|
|
|
if (ret != (off_t) - 1)
|
|
|
|
*p_pos = (guint64) ret;
|
2005-07-30 15:00:07 +00:00
|
|
|
|
|
|
|
return (ret != (off_t) - 1);
|
|
|
|
}
|
|
|
|
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
static GstFlowReturn
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_render (GstBaseSink * sink, GstBuffer * buffer)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
|
|
|
GstFileSink *filesink;
|
2005-10-13 17:43:36 +00:00
|
|
|
guint size;
|
2002-04-28 17:08:59 +00:00
|
|
|
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
size = GST_BUFFER_SIZE (buffer);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
filesink = GST_FILE_SINK (sink);
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-10-12 14:12:37 +00:00
|
|
|
GST_DEBUG_OBJECT (filesink, "writing %u bytes at %" G_GUINT64_FORMAT,
|
2007-05-22 11:43:07 +00:00
|
|
|
size, filesink->current_pos);
|
2005-10-12 14:12:37 +00:00
|
|
|
|
2006-04-04 15:45:36 +00:00
|
|
|
if (size > 0 && GST_BUFFER_DATA (buffer) != NULL) {
|
|
|
|
if (fwrite (GST_BUFFER_DATA (buffer), size, 1, filesink->file) != 1)
|
|
|
|
goto handle_error;
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2007-05-22 11:43:07 +00:00
|
|
|
filesink->current_pos += size;
|
2006-04-04 15:45:36 +00:00
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
return GST_FLOW_OK;
|
2005-07-30 15:00:07 +00:00
|
|
|
|
|
|
|
handle_error:
|
2006-03-11 13:02:28 +00:00
|
|
|
{
|
|
|
|
switch (errno) {
|
|
|
|
case ENOSPC:{
|
|
|
|
GST_ELEMENT_ERROR (filesink, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:{
|
|
|
|
GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
|
|
|
|
(_("Error while writing to file \"%s\"."), filesink->filename),
|
|
|
|
("%s", g_strerror (errno)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
|
|
|
|
2005-11-09 09:47:12 +00:00
|
|
|
static gboolean
|
|
|
|
gst_file_sink_start (GstBaseSink * basesink)
|
2002-04-28 17:08:59 +00:00
|
|
|
{
|
2005-11-09 09:47:12 +00:00
|
|
|
return gst_file_sink_open_file (GST_FILE_SINK (basesink));
|
|
|
|
}
|
gst/: Added object to help in making collect pad based elements.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/gstbasesink.h:
* gst/base/gstbasesrc.c: (gst_basesrc_init),
(gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
* gst/base/gstcollectpads.c: (gst_collectpads_get_type),
(gst_collectpads_class_init), (gst_collectpads_init),
(gst_collectpads_finalize), (gst_collectpads_new),
(gst_collectpads_set_function), (gst_collectpads_add_pad),
(find_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush),
(gst_collectpads_chain):
* gst/base/gstcollectpads.h:
* gst/elements/Makefile.am:
* gst/elements/gstelements.c:
* gst/elements/gstfakesink.c: (gst_fakesink_class_init),
(gst_fakesink_get_times), (gst_fakesink_event),
(gst_fakesink_preroll), (gst_fakesink_render):
* gst/elements/gstfilesink.c: (gst_filesink_class_init),
(gst_filesink_init), (gst_filesink_set_location),
(gst_filesink_open_file), (gst_filesink_close_file),
(gst_filesink_pad_query), (gst_filesink_event),
(gst_filesink_render), (gst_filesink_change_state):
* gst/elements/gstfilesink.h:
Added object to help in making collect pad based elements.
Ported filesink.
Make event function in sink baseclass return gboolean.
2005-05-05 09:31:59 +00:00
|
|
|
|
2005-11-09 09:47:12 +00:00
|
|
|
static gboolean
|
|
|
|
gst_file_sink_stop (GstBaseSink * basesink)
|
|
|
|
{
|
|
|
|
gst_file_sink_close_file (GST_FILE_SINK (basesink));
|
|
|
|
return TRUE;
|
2002-04-28 17:08:59 +00:00
|
|
|
}
|
2003-11-24 03:21:54 +00:00
|
|
|
|
|
|
|
/*** GSTURIHANDLER INTERFACE *************************************************/
|
|
|
|
|
2006-10-09 09:32:29 +00:00
|
|
|
static GstURIType
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_get_type (void)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
|
|
|
return GST_URI_SINK;
|
|
|
|
}
|
|
|
|
static gchar **
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_get_protocols (void)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
2004-03-13 15:27:01 +00:00
|
|
|
static gchar *protocols[] = { "file", NULL };
|
2004-03-15 19:27:17 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
return protocols;
|
|
|
|
}
|
|
|
|
static const gchar *
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_get_uri (GstURIHandler * handler)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
2005-07-14 09:35:12 +00:00
|
|
|
GstFileSink *sink = GST_FILE_SINK (handler);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
return sink->uri;
|
|
|
|
}
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2003-11-24 03:21:54 +00:00
|
|
|
static gboolean
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
|
|
|
gchar *protocol, *location;
|
|
|
|
gboolean ret;
|
2005-07-14 09:35:12 +00:00
|
|
|
GstFileSink *sink = GST_FILE_SINK (handler);
|
2003-11-24 03:21:54 +00:00
|
|
|
|
|
|
|
protocol = gst_uri_get_protocol (uri);
|
|
|
|
if (strcmp (protocol, "file") != 0) {
|
|
|
|
g_free (protocol);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
g_free (protocol);
|
2007-02-02 10:41:29 +00:00
|
|
|
|
|
|
|
/* allow file://localhost/foo/bar by stripping localhost but fail
|
|
|
|
* for every other hostname */
|
|
|
|
if (g_str_has_prefix (uri, "file://localhost/")) {
|
|
|
|
char *tmp;
|
|
|
|
|
|
|
|
/* 16 == strlen ("file://localhost") */
|
|
|
|
tmp = g_strconcat ("file://", uri + 16, NULL);
|
|
|
|
/* we use gst_uri_get_location() although we already have the
|
|
|
|
* "location" with uri + 16 because it provides unescaping */
|
|
|
|
location = gst_uri_get_location (tmp);
|
|
|
|
g_free (tmp);
|
2007-04-27 07:27:36 +00:00
|
|
|
} else if (strcmp (uri, "file://") == 0) {
|
|
|
|
/* Special case for "file://" as this is used by some applications
|
|
|
|
* to test with gst_element_make_from_uri if there's an element
|
|
|
|
* that supports the URI protocol. */
|
2007-04-27 07:34:10 +00:00
|
|
|
gst_file_sink_set_location (sink, NULL);
|
2007-04-27 07:27:36 +00:00
|
|
|
return TRUE;
|
2007-02-02 10:41:29 +00:00
|
|
|
} else {
|
|
|
|
location = gst_uri_get_location (uri);
|
2007-04-27 07:27:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!location)
|
|
|
|
return FALSE;
|
|
|
|
if (!g_path_is_absolute (location)) {
|
|
|
|
g_free (location);
|
|
|
|
return FALSE;
|
2007-02-02 10:41:29 +00:00
|
|
|
}
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
ret = gst_file_sink_set_location (sink, location);
|
2003-11-24 03:21:54 +00:00
|
|
|
g_free (location);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_file_sink_uri_handler_init (gpointer g_iface, gpointer iface_data)
|
2003-11-24 03:21:54 +00:00
|
|
|
{
|
|
|
|
GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
|
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
iface->get_type = gst_file_sink_uri_get_type;
|
|
|
|
iface->get_protocols = gst_file_sink_uri_get_protocols;
|
|
|
|
iface->get_uri = gst_file_sink_uri_get_uri;
|
|
|
|
iface->set_uri = gst_file_sink_uri_set_uri;
|
2003-11-24 03:21:54 +00:00
|
|
|
}
|