2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 * 2000 Wim Taymans <wtay@chello.be>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
27 #include "gstfdsink.h"
32 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
37 GST_DEBUG_CATEGORY_STATIC (gst_fdsink_debug);
38 #define GST_CAT_DEFAULT gst_fdsink_debug
40 GstElementDetails gst_fdsink_details =
41 GST_ELEMENT_DETAILS ("Filedescriptor Sink",
43 "Write data to a file descriptor",
44 "Erik Walthinsen <omega@cse.ogi.edu>");
47 /* FdSink signals and args */
61 #define _do_init(bla) \
62 GST_DEBUG_CATEGORY_INIT (gst_fdsink_debug, "fdsink", 0, "fdsink element");
64 GST_BOILERPLATE_FULL (GstFdSink, gst_fdsink, GstElement, GST_TYPE_ELEMENT,
67 static void gst_fdsink_set_property (GObject * object, guint prop_id,
68 const GValue * value, GParamSpec * pspec);
69 static void gst_fdsink_get_property (GObject * object, guint prop_id,
70 GValue * value, GParamSpec * pspec);
72 static void gst_fdsink_chain (GstPad * pad, GstData * _data);
76 gst_fdsink_base_init (gpointer g_class)
78 GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
80 gst_element_class_add_pad_template (gstelement_class,
81 gst_static_pad_template_get (&sinktemplate));
82 gst_element_class_set_details (gstelement_class, &gst_fdsink_details);
85 gst_fdsink_class_init (GstFdSinkClass * klass)
87 GObjectClass *gobject_class;
89 gobject_class = G_OBJECT_CLASS (klass);
91 gobject_class->set_property = gst_fdsink_set_property;
92 gobject_class->get_property = gst_fdsink_get_property;
94 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FD,
95 g_param_spec_int ("fd", "fd", "An open file descriptor to write to",
96 0, G_MAXINT, 1, G_PARAM_READWRITE));
100 gst_fdsink_init (GstFdSink * fdsink)
103 gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
105 gst_element_add_pad (GST_ELEMENT (fdsink), fdsink->sinkpad);
106 gst_pad_set_chain_function (fdsink->sinkpad, gst_fdsink_chain);
112 gst_fdsink_chain (GstPad * pad, GstData * _data)
114 GstBuffer *buf = GST_BUFFER (_data);
117 g_return_if_fail (pad != NULL);
118 g_return_if_fail (GST_IS_PAD (pad));
119 g_return_if_fail (buf != NULL);
121 fdsink = GST_FDSINK (gst_pad_get_parent (pad));
123 g_return_if_fail (fdsink->fd >= 0);
125 if (GST_BUFFER_DATA (buf)) {
126 GST_DEBUG ("writing %d bytes to file descriptor %d", GST_BUFFER_SIZE (buf),
128 write (fdsink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
131 gst_buffer_unref (buf);
135 gst_fdsink_set_property (GObject * object, guint prop_id, const GValue * value,
140 g_return_if_fail (GST_IS_FDSINK (object));
142 fdsink = GST_FDSINK (object);
146 fdsink->fd = g_value_get_int (value);
154 gst_fdsink_get_property (GObject * object, guint prop_id, GValue * value,
159 g_return_if_fail (GST_IS_FDSINK (object));
161 fdsink = GST_FDSINK (object);
165 g_value_set_int (value, fdsink->fd);