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() */
|
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);
|
|
|
|
|
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
|
|
|
|
2006-04-28 18:55:17 +00:00
|
|
|
static const GstElementDetails gst_file_sink_details =
|
2005-09-28 12:52:51 +00:00
|
|
|
GST_ELEMENT_DETAILS ("File Sink",
|
2004-03-13 15:27:01 +00:00
|
|
|
"Sink/File",
|
|
|
|
"Write stream to a file",
|
|
|
|
"Thomas <thomas@apestaart.org>");
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
enum
|
|
|
|
{
|
2002-04-28 17:08:59 +00:00
|
|
|
ARG_0,
|
2003-06-01 12:27:39 +00:00
|
|
|
ARG_LOCATION
|
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);
|
|
|
|
|
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
|
|
|
{
|
2003-10-31 19:32:47 +00:00
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
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
|
|
|
gst_element_class_add_pad_template (gstelement_class,
|
|
|
|
gst_static_pad_template_get (&sinktemplate));
|
2005-07-14 09:35:12 +00:00
|
|
|
gst_element_class_set_details (gstelement_class, &gst_file_sink_details);
|
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
|
|
|
|
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
|
|
|
|
2006-05-11 18:10:34 +00:00
|
|
|
g_object_class_install_property (gobject_class, ARG_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
|
|
|
|
2005-07-14 09:35:12 +00:00
|
|
|
gobject_class->dispose = gst_file_sink_dispose;
|
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;
|
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;
|
|
|
|
}
|
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) {
|
|
|
|
case ARG_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;
|
|
|
|
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) {
|
|
|
|
case ARG_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;
|
|
|
|
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
|
|
|
{
|
|
|
|
/* 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;
|
|
|
|
|
|
|
|
sink->data_written = 0;
|
|
|
|
/* 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;
|
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:
|
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_set_position (query, GST_FORMAT_BYTES, self->data_written);
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-10-23 10:29:51 +00:00
|
|
|
#if HAVE_FSEEKO
|
|
|
|
# define __GST_STDIO_SEEK_FUNCTION "fseeko"
|
|
|
|
#elif G_OS_UNIX
|
|
|
|
# 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;
|
|
|
|
|
2005-10-23 10:29:51 +00:00
|
|
|
#if HAVE_FSEEKO
|
|
|
|
if (fseeko (filesink->file, (off_t) new_offset, SEEK_SET) != 0)
|
|
|
|
goto seek_failed;
|
|
|
|
#elif 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
|
|
|
|
|
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) {
|
2006-10-06 13:01:30 +00:00
|
|
|
/* 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))
|
2006-06-16 16:28:37 +00:00
|
|
|
goto seek_failed;
|
2005-07-30 15:00:07 +00:00
|
|
|
} else {
|
2006-06-16 16:28:37 +00:00
|
|
|
GST_DEBUG ("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;
|
|
|
|
|
2005-10-23 10:29:51 +00:00
|
|
|
#if HAVE_FTELLO
|
|
|
|
ret = ftello (filesink->file);
|
|
|
|
#elif G_OS_UNIX
|
|
|
|
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
|
|
|
|
|
|
|
|
*p_pos = (guint64) ret;
|
|
|
|
|
|
|
|
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-07-30 15:00:07 +00:00
|
|
|
guint64 cur_pos;
|
2005-10-13 17:43:36 +00:00
|
|
|
guint size;
|
|
|
|
guint64 back_pending = 0;
|
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
|
|
|
|
2006-06-16 16:28:37 +00:00
|
|
|
if (filesink->seekable) {
|
|
|
|
if (!gst_file_sink_get_current_offset (filesink, &cur_pos))
|
|
|
|
goto handle_error;
|
|
|
|
} else {
|
|
|
|
cur_pos = filesink->data_written;
|
|
|
|
}
|
2002-04-28 17:08:59 +00:00
|
|
|
|
2005-07-30 15:00:07 +00:00
|
|
|
if (cur_pos < filesink->data_written)
|
|
|
|
back_pending = filesink->data_written - cur_pos;
|
|
|
|
|
2005-10-12 14:12:37 +00:00
|
|
|
GST_DEBUG_OBJECT (filesink, "writing %u bytes at %" G_GUINT64_FORMAT,
|
|
|
|
size, cur_pos);
|
|
|
|
|
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
|
|
|
|
2006-04-04 15:45:36 +00:00
|
|
|
filesink->data_written += size - back_pending;
|
|
|
|
}
|
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);
|
|
|
|
} else {
|
|
|
|
location = gst_uri_get_location (uri);
|
2007-02-13 13:40:05 +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
|
|
|
}
|