Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / libs / gst / base / gstpushsrc.c
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *               2000,2005 Wim Taymans <wim@fluendo.com>
4  *
5  * gstpushsrc.c:
6  *
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.
11  *
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.
16  *
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.
21  */
22
23 /**
24  * SECTION:gstpushsrc
25  * @short_description: Base class for push based source elements
26  * @see_also: #GstBaseSrc
27  *
28  * This class is mostly useful for elements that cannot do
29  * random access, or at least very slowly. The source usually
30  * prefers to push out a fixed size buffer.
31  *
32  * Subclasses usually operate in a format that is different from the
33  * default GST_FORMAT_BYTES format of #GstBaseSrc.
34  *
35  * Classes extending this base class will usually be scheduled
36  * in a push based mode. If the peer accepts to operate without
37  * offsets and within the limits of the allowed block size, this
38  * class can operate in getrange based mode automatically. To make
39  * this possible, the subclass should implement and override the
40  * SCHEDULING query.
41  *
42  * The subclass should extend the methods from the baseclass in
43  * addition to the ::create method.
44  *
45  * Seeking, flushing, scheduling and sync is all handled by this
46  * base class.
47  *
48  * Last reviewed on 2006-07-04 (0.10.9)
49  */
50
51 #ifdef HAVE_CONFIG_H
52 #  include "config.h"
53 #endif
54
55 #include <stdlib.h>
56 #include <string.h>
57
58 #include "gstpushsrc.h"
59 #include "gsttypefindhelper.h"
60 #include <gst/gstmarshal.h>
61
62 GST_DEBUG_CATEGORY_STATIC (gst_push_src_debug);
63 #define GST_CAT_DEFAULT gst_push_src_debug
64
65 #define _do_init \
66     GST_DEBUG_CATEGORY_INIT (gst_push_src_debug, "pushsrc", 0, \
67         "pushsrc element");
68
69 #define gst_push_src_parent_class parent_class
70 G_DEFINE_TYPE_WITH_CODE (GstPushSrc, gst_push_src, GST_TYPE_BASE_SRC, _do_init);
71
72 static gboolean gst_push_src_query (GstBaseSrc * src, GstQuery * query);
73 static GstFlowReturn gst_push_src_create (GstBaseSrc * bsrc, guint64 offset,
74     guint length, GstBuffer ** ret);
75 static GstFlowReturn gst_push_src_fill (GstBaseSrc * bsrc, guint64 offset,
76     guint length, GstBuffer * ret);
77
78 static void
79 gst_push_src_class_init (GstPushSrcClass * klass)
80 {
81   GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
82
83   gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_push_src_create);
84   gstbasesrc_class->fill = GST_DEBUG_FUNCPTR (gst_push_src_fill);
85   gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_push_src_query);
86 }
87
88 static void
89 gst_push_src_init (GstPushSrc * pushsrc)
90 {
91   /* nop */
92 }
93
94 static gboolean
95 gst_push_src_query (GstBaseSrc * src, GstQuery * query)
96 {
97   gboolean ret;
98
99   switch (GST_QUERY_TYPE (query)) {
100     case GST_QUERY_SCHEDULING:
101     {
102       /* a pushsrc can by default never operate in pull mode override
103        * if you want something different. */
104       gst_query_set_scheduling (query, FALSE, FALSE, TRUE, 1, -1, 1);
105       ret = TRUE;
106       break;
107     }
108     default:
109       ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
110       break;
111   }
112   return ret;
113 }
114
115
116 static GstFlowReturn
117 gst_push_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
118     GstBuffer ** ret)
119 {
120   GstFlowReturn fret;
121   GstPushSrc *src;
122   GstPushSrcClass *pclass;
123
124   src = GST_PUSH_SRC (bsrc);
125   pclass = GST_PUSH_SRC_GET_CLASS (src);
126   if (pclass->create)
127     fret = pclass->create (src, ret);
128   else
129     fret =
130         GST_BASE_SRC_CLASS (parent_class)->create (bsrc, offset, length, ret);
131
132   return fret;
133 }
134
135 static GstFlowReturn
136 gst_push_src_fill (GstBaseSrc * bsrc, guint64 offset, guint length,
137     GstBuffer * ret)
138 {
139   GstFlowReturn fret;
140   GstPushSrc *src;
141   GstPushSrcClass *pclass;
142
143   src = GST_PUSH_SRC (bsrc);
144   pclass = GST_PUSH_SRC_GET_CLASS (src);
145   if (pclass->fill)
146     fret = pclass->fill (src, ret);
147   else
148     fret = GST_BASE_SRC_CLASS (parent_class)->fill (bsrc, offset, length, ret);
149
150   return fret;
151 }