2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 * 2000,2005 Wim Taymans <wim@fluendo.com>
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.
25 * @short_description: Base class for getrange based source elements
26 * @see_also: #GstBaseTransformc, #GstBaseSink
28 * This class is mostly useful for elements that do byte based
29 * access to a random access resource, like files.
30 * If random access is not possible, the live-mode should be set
34 * <listitem><para>one sinkpad</para></listitem>
35 * <listitem><para>handles state changes</para></listitem>
36 * <listitem><para>does flushing</para></listitem>
37 * <listitem><para>preroll with optional preview</para></listitem>
38 * <listitem><para>pull/push mode</para></listitem>
39 * <listitem><para>EOS handling</para></listitem>
50 #include "gstbasesrc.h"
51 #include "gsttypefindhelper.h"
52 #include <gst/gstmarshal.h>
54 #define DEFAULT_BLOCKSIZE 4096
55 #define DEFAULT_NUM_BUFFERS -1
57 GST_DEBUG_CATEGORY_STATIC (gst_base_src_debug);
58 #define GST_CAT_DEFAULT gst_base_src_debug
60 /* BaseSrc signals and args */
74 static GstElementClass *parent_class = NULL;
76 static void gst_base_src_base_init (gpointer g_class);
77 static void gst_base_src_class_init (GstBaseSrcClass * klass);
78 static void gst_base_src_init (GstBaseSrc * src, gpointer g_class);
79 static void gst_base_src_finalize (GObject * object);
83 gst_base_src_get_type (void)
85 static GType base_src_type = 0;
88 static const GTypeInfo base_src_info = {
89 sizeof (GstBaseSrcClass),
90 (GBaseInitFunc) gst_base_src_base_init,
92 (GClassInitFunc) gst_base_src_class_init,
97 (GInstanceInitFunc) gst_base_src_init,
100 base_src_type = g_type_register_static (GST_TYPE_ELEMENT,
101 "GstBaseSrc", &base_src_info, G_TYPE_FLAG_ABSTRACT);
103 return base_src_type;
105 static GstCaps *gst_base_src_getcaps (GstPad * pad);
106 static gboolean gst_base_src_setcaps (GstPad * pad, GstCaps * caps);
108 static gboolean gst_base_src_activate_push (GstPad * pad, gboolean active);
109 static gboolean gst_base_src_activate_pull (GstPad * pad, gboolean active);
110 static void gst_base_src_set_property (GObject * object, guint prop_id,
111 const GValue * value, GParamSpec * pspec);
112 static void gst_base_src_get_property (GObject * object, guint prop_id,
113 GValue * value, GParamSpec * pspec);
114 static gboolean gst_base_src_event_handler (GstPad * pad, GstEvent * event);
116 static gboolean gst_base_src_query (GstPad * pad, GstQuery * query);
119 static const GstEventMask *gst_base_src_get_event_mask (GstPad * pad);
121 static gboolean gst_base_src_default_negotiate (GstBaseSrc * basesrc);
123 static gboolean gst_base_src_unlock (GstBaseSrc * basesrc);
124 static gboolean gst_base_src_get_size (GstBaseSrc * basesrc, guint64 * size);
125 static gboolean gst_base_src_start (GstBaseSrc * basesrc);
126 static gboolean gst_base_src_stop (GstBaseSrc * basesrc);
128 static GstStateChangeReturn gst_base_src_change_state (GstElement * element,
129 GstStateChange transition);
131 static void gst_base_src_loop (GstPad * pad);
132 static gboolean gst_base_src_check_get_range (GstPad * pad);
133 static GstFlowReturn gst_base_src_get_range (GstPad * pad, guint64 offset,
134 guint length, GstBuffer ** buf);
137 gst_base_src_base_init (gpointer g_class)
139 GST_DEBUG_CATEGORY_INIT (gst_base_src_debug, "basesrc", 0, "basesrc element");
143 gst_base_src_class_init (GstBaseSrcClass * klass)
145 GObjectClass *gobject_class;
146 GstElementClass *gstelement_class;
148 gobject_class = (GObjectClass *) klass;
149 gstelement_class = (GstElementClass *) klass;
151 parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
153 gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_base_src_finalize);
154 gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_base_src_set_property);
155 gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_base_src_get_property);
157 g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BLOCKSIZE,
158 g_param_spec_ulong ("blocksize", "Block size",
159 "Size in bytes to read per buffer", 1, G_MAXULONG, DEFAULT_BLOCKSIZE,
162 g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NUM_BUFFERS,
163 g_param_spec_int ("num-buffers", "num-buffers",
164 "Number of buffers to output before sending EOS", -1, G_MAXINT,
165 DEFAULT_NUM_BUFFERS, G_PARAM_READWRITE));
167 gstelement_class->change_state =
168 GST_DEBUG_FUNCPTR (gst_base_src_change_state);
170 klass->negotiate = gst_base_src_default_negotiate;
174 gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
177 GstPadTemplate *pad_template;
179 basesrc->is_live = FALSE;
180 basesrc->live_lock = g_mutex_new ();
181 basesrc->live_cond = g_cond_new ();
182 basesrc->num_buffers = DEFAULT_NUM_BUFFERS;
183 basesrc->num_buffers_left = -1;
185 basesrc->can_activate_push = TRUE;
186 basesrc->pad_mode = GST_ACTIVATE_NONE;
189 gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
190 g_return_if_fail (pad_template != NULL);
192 GST_DEBUG_OBJECT (basesrc, "creating src pad");
193 pad = gst_pad_new_from_template (pad_template, "src");
195 GST_DEBUG_OBJECT (basesrc, "setting functions on src pad");
196 gst_pad_set_activatepush_function (pad, gst_base_src_activate_push);
197 gst_pad_set_activatepull_function (pad, gst_base_src_activate_pull);
198 gst_pad_set_event_function (pad, gst_base_src_event_handler);
199 gst_pad_set_query_function (pad, gst_base_src_query);
200 gst_pad_set_checkgetrange_function (pad, gst_base_src_check_get_range);
201 gst_pad_set_getrange_function (pad, gst_base_src_get_range);
202 gst_pad_set_getcaps_function (pad, gst_base_src_getcaps);
203 gst_pad_set_setcaps_function (pad, gst_base_src_setcaps);
205 /* hold pointer to pad */
206 basesrc->srcpad = pad;
207 GST_DEBUG_OBJECT (basesrc, "adding src pad");
208 gst_element_add_pad (GST_ELEMENT (basesrc), pad);
210 basesrc->segment_start = -1;
211 basesrc->segment_end = -1;
212 basesrc->need_discont = TRUE;
213 basesrc->blocksize = DEFAULT_BLOCKSIZE;
214 basesrc->clock_id = NULL;
216 GST_FLAG_UNSET (basesrc, GST_BASE_SRC_STARTED);
218 GST_DEBUG_OBJECT (basesrc, "init done");
222 gst_base_src_finalize (GObject * object)
226 basesrc = GST_BASE_SRC (object);
228 g_mutex_free (basesrc->live_lock);
229 g_cond_free (basesrc->live_cond);
231 G_OBJECT_CLASS (parent_class)->finalize (object);
235 * gst_base_src_set_live:
236 * @src: base source instance
237 * @live: new live-mode
239 * If the element listens to a live source, the @livemode should
240 * be set to %TRUE. This declares that this source can't seek.
243 gst_base_src_set_live (GstBaseSrc * src, gboolean live)
247 GST_LIVE_UNLOCK (src);
251 * gst_base_src_is_live:
252 * @src: base source instance
254 * Check if an element is in live mode.
256 * Returns: %TRUE if element is in live mode.
259 gst_base_src_is_live (GstBaseSrc * src)
264 result = src->is_live;
265 GST_LIVE_UNLOCK (src);
271 gst_base_src_setcaps (GstPad * pad, GstCaps * caps)
273 GstBaseSrcClass *bclass;
277 bsrc = GST_BASE_SRC (GST_PAD_PARENT (pad));
278 bclass = GST_BASE_SRC_GET_CLASS (bsrc);
280 if (bclass->set_caps)
281 res = bclass->set_caps (bsrc, caps);
287 gst_base_src_getcaps (GstPad * pad)
289 GstBaseSrcClass *bclass;
291 GstCaps *caps = NULL;
293 bsrc = GST_BASE_SRC (GST_PAD_PARENT (pad));
294 bclass = GST_BASE_SRC_GET_CLASS (bsrc);
295 if (bclass->get_caps)
296 caps = bclass->get_caps (bsrc);
299 GstPadTemplate *pad_template;
302 gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
303 if (pad_template != NULL) {
304 caps = gst_caps_ref (gst_pad_template_get_caps (pad_template));
311 gst_base_src_query (GstPad * pad, GstQuery * query)
318 src = GST_BASE_SRC (GST_PAD_PARENT (pad));
320 switch (GST_QUERY_TYPE (query)) {
321 case GST_QUERY_POSITION:
325 gst_query_parse_position (query, &format, NULL, NULL);
327 case GST_FORMAT_DEFAULT:
328 case GST_FORMAT_BYTES:
329 b = gst_base_src_get_size (src, &ui64);
330 /* better to make get_size take an int64 */
331 i64 = b ? (gint64) ui64 : -1;
332 gst_query_set_position (query, GST_FORMAT_BYTES, src->offset, i64);
334 case GST_FORMAT_PERCENT:
335 b = gst_base_src_get_size (src, &ui64);
336 i64 = GST_FORMAT_PERCENT_MAX;
337 i64 *= b ? (src->offset / (gdouble) ui64) : 1.0;
338 gst_query_set_position (query, GST_FORMAT_PERCENT,
339 i64, GST_FORMAT_PERCENT_MAX);
346 case GST_QUERY_SEEKING:
347 gst_query_set_seeking (query, GST_FORMAT_BYTES,
348 src->seekable, src->segment_start, src->segment_end);
351 case GST_QUERY_FORMATS:
352 gst_query_set_formats (query, 3, GST_FORMAT_DEFAULT,
353 GST_FORMAT_BYTES, GST_FORMAT_PERCENT);
356 case GST_QUERY_LATENCY:
357 case GST_QUERY_JITTER:
359 case GST_QUERY_CONVERT:
361 return gst_pad_query_default (pad, query);
366 gst_base_src_send_discont (GstBaseSrc * src)
370 GST_DEBUG_OBJECT (src, "Sending newsegment from %" G_GINT64_FORMAT
371 " to %" G_GINT64_FORMAT, (gint64) src->segment_start,
372 (gint64) src->segment_end);
373 event = gst_event_new_newsegment (1.0,
375 (gint64) src->segment_start, (gint64) src->segment_end, (gint64) 0);
377 return gst_pad_push_event (src->srcpad, event);
381 gst_base_src_do_seek (GstBaseSrc * src, GstEvent * event)
386 GstSeekType cur_type, stop_type;
389 gst_event_parse_seek (event, &rate, &format, &flags,
390 &cur_type, &cur, &stop_type, &stop);
392 /* get seek format */
393 if (format == GST_FORMAT_DEFAULT)
394 format = GST_FORMAT_BYTES;
395 /* we can only seek bytes */
396 if (format != GST_FORMAT_BYTES)
399 /* get seek positions */
400 src->segment_loop = flags & GST_SEEK_FLAG_SEGMENT;
402 /* send flush start */
403 gst_pad_push_event (src->srcpad, gst_event_new_flush_start ());
405 /* unblock streaming thread */
406 gst_base_src_unlock (src);
408 /* grab streaming lock */
409 GST_STREAM_LOCK (src->srcpad);
411 /* send flush stop */
412 gst_pad_push_event (src->srcpad, gst_event_new_flush_stop ());
414 /* perform the seek */
416 case GST_SEEK_TYPE_NONE:
418 case GST_SEEK_TYPE_SET:
421 src->offset = MIN (cur, src->size);
422 src->segment_start = src->offset;
424 case GST_SEEK_TYPE_CUR:
425 src->offset = CLAMP (src->offset + cur, 0, src->size);
426 src->segment_start = src->offset;
428 case GST_SEEK_TYPE_END:
431 src->offset = MAX (0, src->size + cur);
432 src->segment_start = src->offset;
439 case GST_SEEK_TYPE_NONE:
441 case GST_SEEK_TYPE_SET:
444 src->segment_end = MIN (stop, src->size);
446 case GST_SEEK_TYPE_CUR:
447 src->segment_end = CLAMP (src->segment_end + stop, 0, src->size);
449 case GST_SEEK_TYPE_END:
452 src->segment_end = src->size + stop;
458 GST_DEBUG_OBJECT (src, "seek pending for segment from %" G_GINT64_FORMAT
459 " to %" G_GINT64_FORMAT, src->segment_start, src->segment_end);
461 /* now make sure the discont will be send */
462 src->need_discont = TRUE;
464 /* and restart the task */
465 gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop,
467 GST_STREAM_UNLOCK (src->srcpad);
469 gst_event_unref (event);
476 GST_DEBUG_OBJECT (src, "seek error");
477 GST_STREAM_UNLOCK (src->srcpad);
478 gst_event_unref (event);
484 gst_base_src_event_handler (GstPad * pad, GstEvent * event)
487 GstBaseSrcClass *bclass;
490 src = GST_BASE_SRC (GST_PAD_PARENT (pad));
491 bclass = GST_BASE_SRC_GET_CLASS (src);
494 result = bclass->event (src, event);
496 switch (GST_EVENT_TYPE (event)) {
498 if (!src->seekable) {
499 gst_event_unref (event);
502 return gst_base_src_do_seek (src, event);
503 case GST_EVENT_FLUSH_START:
504 /* cancel any blocking getrange */
505 gst_base_src_unlock (src);
507 case GST_EVENT_FLUSH_STOP:
512 gst_event_unref (event);
518 gst_base_src_set_property (GObject * object, guint prop_id,
519 const GValue * value, GParamSpec * pspec)
523 src = GST_BASE_SRC (object);
527 src->blocksize = g_value_get_ulong (value);
529 case PROP_NUM_BUFFERS:
530 src->num_buffers = g_value_get_int (value);
533 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
539 gst_base_src_get_property (GObject * object, guint prop_id, GValue * value,
544 src = GST_BASE_SRC (object);
548 g_value_set_ulong (value, src->blocksize);
550 case PROP_NUM_BUFFERS:
551 g_value_set_int (value, src->num_buffers);
554 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
560 gst_base_src_get_range (GstPad * pad, guint64 offset, guint length,
565 GstBaseSrcClass *bclass;
567 src = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
568 bclass = GST_BASE_SRC_GET_CLASS (src);
572 while (!src->live_running) {
573 GST_DEBUG ("live source signal waiting");
574 GST_LIVE_SIGNAL (src);
575 GST_DEBUG ("live source waiting for running state");
577 GST_DEBUG ("live source unlocked");
580 GST_LIVE_UNLOCK (src);
583 if (GST_PAD_IS_FLUSHING (pad))
587 if (!GST_FLAG_IS_SET (src, GST_BASE_SRC_STARTED))
593 GST_DEBUG_OBJECT (src,
594 "reading offset %" G_GUINT64_FORMAT ", length %u, size %"
595 G_GUINT64_FORMAT, offset, length, src->size);
598 if (src->size != -1) {
599 if (offset > src->size)
600 goto unexpected_length;
602 if (offset + length > src->size) {
603 if (bclass->get_size)
604 bclass->get_size (src, &src->size);
606 if (offset + length > src->size) {
607 length = src->size - offset;
612 goto unexpected_length;
614 if (src->num_buffers_left == 0) {
615 goto reached_num_buffers;
617 if (src->num_buffers_left > 0)
618 src->num_buffers_left--;
621 ret = bclass->create (src, offset, length, buf);
628 GST_DEBUG_OBJECT (src, "pad is flushing");
630 return GST_FLOW_WRONG_STATE;
634 GST_DEBUG_OBJECT (src, "getrange but not started");
635 return GST_FLOW_WRONG_STATE;
639 GST_DEBUG_OBJECT (src, "no create function");
640 return GST_FLOW_ERROR;
644 GST_DEBUG_OBJECT (src, "unexpected length %u", length);
645 return GST_FLOW_UNEXPECTED;
649 GST_DEBUG_OBJECT (src, "sent all buffers");
650 return GST_FLOW_UNEXPECTED;
655 gst_base_src_check_get_range (GstPad * pad)
659 src = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
661 if (!GST_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) {
662 gst_base_src_start (src);
663 gst_base_src_stop (src);
666 return src->seekable;
670 gst_base_src_loop (GstPad * pad)
673 GstBuffer *buf = NULL;
676 src = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
678 if (src->need_discont) {
679 /* now send discont */
680 gst_base_src_send_discont (src);
681 src->need_discont = FALSE;
684 ret = gst_base_src_get_range (pad, src->offset, src->blocksize, &buf);
685 if (ret != GST_FLOW_OK)
691 src->offset += GST_BUFFER_SIZE (buf);
693 ret = gst_pad_push (pad, buf);
694 if (ret != GST_FLOW_OK)
701 GST_DEBUG_OBJECT (src, "going to EOS");
702 gst_pad_pause_task (pad);
703 gst_pad_push_event (pad, gst_event_new_eos ());
708 GST_DEBUG_OBJECT (src, "pausing task");
709 gst_pad_pause_task (pad);
710 if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) {
711 /* for fatal errors we post an error message */
712 GST_ELEMENT_ERROR (src, STREAM, STOPPED,
713 ("streaming stopped, reason %s", gst_flow_get_name (ret)),
714 ("streaming stopped, reason %s", gst_flow_get_name (ret)));
715 gst_pad_push_event (pad, gst_event_new_eos ());
721 GST_ELEMENT_ERROR (src, STREAM, STOPPED,
722 ("internal: element returned NULL buffer"),
723 ("internal: element returned NULL buffer"));
724 gst_pad_pause_task (pad);
725 gst_pad_push_event (pad, gst_event_new_eos ());
730 /* this will always be called between start() and stop(). So you can rely on
731 resources allocated by start() and freed from stop(). This needs to be added
732 to the docs at some point. */
734 gst_base_src_unlock (GstBaseSrc * basesrc)
736 GstBaseSrcClass *bclass;
737 gboolean result = FALSE;
739 GST_DEBUG ("unlock");
740 /* unblock whatever the subclass is doing */
741 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
743 result = bclass->unlock (basesrc);
745 GST_DEBUG ("unschedule clock");
746 /* and unblock the clock as well, if any */
748 if (basesrc->clock_id) {
749 gst_clock_id_unschedule (basesrc->clock_id);
751 GST_UNLOCK (basesrc);
753 GST_DEBUG ("unlock done");
759 gst_base_src_get_size (GstBaseSrc * basesrc, guint64 * size)
761 GstBaseSrcClass *bclass;
762 gboolean result = FALSE;
764 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
765 if (bclass->get_size)
766 result = bclass->get_size (basesrc, size);
769 basesrc->size = *size;
775 gst_base_src_is_seekable (GstBaseSrc * basesrc)
777 GstBaseSrcClass *bclass;
779 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
781 /* check if we can seek */
782 if (bclass->is_seekable)
783 basesrc->seekable = bclass->is_seekable (basesrc);
785 basesrc->seekable = FALSE;
787 GST_DEBUG_OBJECT (basesrc, "is seekable: %d", basesrc->seekable);
789 return basesrc->seekable;
793 gst_base_src_default_negotiate (GstBaseSrc * basesrc)
796 GstCaps *caps = NULL;
797 GstCaps *peercaps = NULL;
798 gboolean result = FALSE;
800 thiscaps = gst_pad_get_caps (GST_BASE_SRC_PAD (basesrc));
801 GST_DEBUG ("caps of src: %" GST_PTR_FORMAT, thiscaps);
802 if (thiscaps == NULL || gst_caps_is_any (thiscaps))
805 peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc));
806 GST_DEBUG ("caps of peer: %" GST_PTR_FORMAT, peercaps);
810 icaps = gst_caps_intersect (thiscaps, peercaps);
811 GST_DEBUG ("intersect: %" GST_PTR_FORMAT, icaps);
812 gst_caps_unref (thiscaps);
813 gst_caps_unref (peercaps);
815 caps = gst_caps_copy_nth (icaps, 0);
816 gst_caps_unref (icaps);
822 caps = gst_caps_make_writable (caps);
823 gst_caps_truncate (caps);
825 gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps);
826 GST_DEBUG ("fixated to: %" GST_PTR_FORMAT, caps);
828 if (gst_caps_is_any (caps)) {
829 gst_caps_unref (caps);
831 } else if (gst_caps_is_fixed (caps)) {
832 gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps);
833 gst_caps_unref (caps);
841 GST_DEBUG ("no negotiation needed");
843 gst_caps_unref (thiscaps);
849 gst_base_src_negotiate (GstBaseSrc * basesrc)
851 GstBaseSrcClass *bclass;
852 gboolean result = TRUE;
854 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
856 if (bclass->negotiate)
857 result = bclass->negotiate (basesrc);
863 gst_base_src_start (GstBaseSrc * basesrc)
865 GstBaseSrcClass *bclass;
868 if (GST_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED))
871 GST_DEBUG_OBJECT (basesrc, "starting source");
873 basesrc->num_buffers_left = basesrc->num_buffers;
875 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
877 result = bclass->start (basesrc);
882 goto could_not_start;
884 GST_FLAG_SET (basesrc, GST_BASE_SRC_STARTED);
886 /* start in the beginning */
889 /* figure out the size */
890 if (bclass->get_size) {
891 result = bclass->get_size (basesrc, &basesrc->size);
899 GST_DEBUG ("size %d %lld", result, basesrc->size);
901 /* we always run to the end */
902 basesrc->segment_start = 0;
903 basesrc->segment_end = basesrc->size;
904 basesrc->need_discont = TRUE;
906 /* check if we can seek, updates ->seekable */
907 gst_base_src_is_seekable (basesrc);
911 if (basesrc->seekable) {
914 caps = gst_type_find_helper (basesrc->srcpad, basesrc->size);
915 gst_pad_set_caps (basesrc->srcpad, caps);
916 gst_caps_unref (caps);
920 if (!gst_base_src_negotiate (basesrc))
921 goto could_not_negotiate;
928 GST_DEBUG_OBJECT (basesrc, "could not start");
933 GST_DEBUG_OBJECT (basesrc, "could not negotiate, stopping");
934 GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT,
935 ("Could not connect source to pipeline"),
936 ("Check your filtered caps, if any"));
937 gst_base_src_stop (basesrc);
943 gst_base_src_stop (GstBaseSrc * basesrc)
945 GstBaseSrcClass *bclass;
946 gboolean result = TRUE;
948 if (!GST_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED))
951 GST_DEBUG_OBJECT (basesrc, "stopping source");
953 bclass = GST_BASE_SRC_GET_CLASS (basesrc);
955 result = bclass->stop (basesrc);
958 GST_FLAG_UNSET (basesrc, GST_BASE_SRC_STARTED);
964 gst_base_src_deactivate (GstBaseSrc * basesrc, GstPad * pad)
968 GST_LIVE_LOCK (basesrc);
969 basesrc->live_running = TRUE;
970 GST_LIVE_SIGNAL (basesrc);
971 GST_LIVE_UNLOCK (basesrc);
973 /* step 1, unblock clock sync (if any) */
974 gst_base_src_unlock (basesrc);
976 /* step 2, make sure streaming finishes */
977 result = gst_pad_stop_task (pad);
983 gst_base_src_activate_push (GstPad * pad, gboolean active)
987 basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
989 /* prepare subclass first */
991 GST_DEBUG_OBJECT (basesrc, "Activating in push mode");
993 if (!basesrc->can_activate_push)
994 goto no_push_activation;
996 if (!gst_base_src_start (basesrc))
999 return gst_pad_start_task (pad, (GstTaskFunction) gst_base_src_loop, pad);
1001 GST_DEBUG_OBJECT (basesrc, "Deactivating in push mode");
1002 return gst_base_src_deactivate (basesrc, pad);
1007 GST_DEBUG_OBJECT (basesrc, "Subclass disabled push-mode activation");
1012 gst_base_src_stop (basesrc);
1013 GST_DEBUG_OBJECT (basesrc, "Failed to start in push mode");
1019 gst_base_src_activate_pull (GstPad * pad, gboolean active)
1021 GstBaseSrc *basesrc;
1023 basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
1025 /* prepare subclass first */
1027 GST_DEBUG_OBJECT (basesrc, "Activating in pull mode");
1028 if (!gst_base_src_start (basesrc))
1031 if (!basesrc->seekable) {
1032 gst_base_src_stop (basesrc);
1038 GST_DEBUG_OBJECT (basesrc, "Deactivating in pull mode");
1040 if (!gst_base_src_stop (basesrc))
1043 return gst_base_src_deactivate (basesrc, pad);
1048 gst_base_src_stop (basesrc);
1049 GST_DEBUG_OBJECT (basesrc, "Failed to start in pull mode");
1054 GST_DEBUG_OBJECT (basesrc, "Failed to stop in pull mode");
1059 static GstStateChangeReturn
1060 gst_base_src_change_state (GstElement * element, GstStateChange transition)
1062 GstBaseSrc *basesrc;
1063 GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
1064 GstStateChangeReturn presult;
1066 basesrc = GST_BASE_SRC (element);
1069 switch (transition) {
1070 case GST_STATE_CHANGE_NULL_TO_READY:
1072 case GST_STATE_CHANGE_READY_TO_PAUSED:
1073 GST_LIVE_LOCK (element);
1074 if (basesrc->is_live) {
1075 result = GST_STATE_CHANGE_NO_PREROLL;
1076 basesrc->live_running = FALSE;
1078 GST_LIVE_UNLOCK (element);
1080 case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
1081 GST_LIVE_LOCK (element);
1082 if (basesrc->is_live) {
1083 basesrc->live_running = TRUE;
1084 GST_LIVE_SIGNAL (element);
1086 GST_LIVE_UNLOCK (element);
1093 GST_ELEMENT_CLASS (parent_class)->change_state (element,
1094 transition)) == GST_STATE_CHANGE_FAILURE)
1097 switch (transition) {
1098 case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
1099 GST_LIVE_LOCK (element);
1100 if (basesrc->is_live) {
1101 result = GST_STATE_CHANGE_NO_PREROLL;
1102 basesrc->live_running = FALSE;
1104 GST_LIVE_UNLOCK (element);
1106 case GST_STATE_CHANGE_PAUSED_TO_READY:
1107 if (!gst_base_src_stop (basesrc))
1108 result = GST_STATE_CHANGE_FAILURE;
1110 case GST_STATE_CHANGE_READY_TO_NULL:
1121 gst_base_src_stop (basesrc);