summaryrefslogtreecommitdiffstats
path: root/ext/resindvd/rsnbasesrc.h
diff options
context:
space:
mode:
authorJan Schmidt <thaytan@mad.scientist.com>2008-06-17 01:08:14 +0000
committerJan Schmidt <thaytan@mad.scientist.com>2008-06-17 01:08:14 +0000
commit0951e00dc05236b54a03e25c2c331bf1be332dc5 (patch)
tree553db40a5b2a59e9615e2db5a10a5927e35bcfab /ext/resindvd/rsnbasesrc.h
parentbcc41766b852bae2a8014c87bc2cb67ff7453f6a (diff)
downloadgst-plugins-bad-0951e00dc05236b54a03e25c2c331bf1be332dc5.tar.gz
gst-plugins-bad-0951e00dc05236b54a03e25c2c331bf1be332dc5.tar.bz2
gst-plugins-bad-0951e00dc05236b54a03e25c2c331bf1be332dc5.zip
configure.ac: Check for libdvdnav to build resindvd.
Original commit message from CVS: * configure.ac: Check for libdvdnav to build resindvd. * ext/Makefile.am: * ext/resindvd/Makefile.am: * ext/resindvd/gstmpegdefs.h: * ext/resindvd/gstmpegdemux.c: * ext/resindvd/gstmpegdemux.h: * ext/resindvd/gstmpegdesc.c: * ext/resindvd/gstmpegdesc.h: * ext/resindvd/gstpesfilter.c: * ext/resindvd/gstpesfilter.h: * ext/resindvd/plugin.c: * ext/resindvd/resin-play: * ext/resindvd/resindvdbin.c: * ext/resindvd/resindvdbin.h: * ext/resindvd/resindvdsrc.c: * ext/resindvd/resindvdsrc.h: * ext/resindvd/rsnaudiomunge.c: * ext/resindvd/rsnaudiomunge.h: * ext/resindvd/rsnbasesrc.c: * ext/resindvd/rsnbasesrc.h: * ext/resindvd/rsnpushsrc.c: * ext/resindvd/rsnpushsrc.h: * ext/resindvd/rsnstreamselector.c: * ext/resindvd/rsnstreamselector.h: First commit of DVD-Video playback component 'rsndvdbin' and helper elements. Use --enable-experimental for now, but feel free to give it a try using the resin-play script. * gst/dvdspu/gstdvdspu.c: Add some extra guards for malformed events.
Diffstat (limited to 'ext/resindvd/rsnbasesrc.h')
-rw-r--r--ext/resindvd/rsnbasesrc.h257
1 files changed, 257 insertions, 0 deletions
diff --git a/ext/resindvd/rsnbasesrc.h b/ext/resindvd/rsnbasesrc.h
new file mode 100644
index 00000000..9365c20b
--- /dev/null
+++ b/ext/resindvd/rsnbasesrc.h
@@ -0,0 +1,257 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbasesrc.h:
+ *
+ * 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.
+ */
+
+/*
+ *
+ * This is a temporary copy of GstBaseSrc/GstPushSrc for the resin
+ * DVD components, to work around a deadlock with source elements that
+ * send seeks to themselves.
+ *
+ */
+
+#ifndef __GST_BASE_SRC_H__
+#define __GST_BASE_SRC_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define RSN_TYPE_BASE_SRC (rsn_base_src_get_type())
+#define GST_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),RSN_TYPE_BASE_SRC,RsnBaseSrc))
+#define GST_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RSN_TYPE_BASE_SRC,RsnBaseSrcClass))
+#define GST_BASE_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RSN_TYPE_BASE_SRC, RsnBaseSrcClass))
+#define GST_IS_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),RSN_TYPE_BASE_SRC))
+#define GST_IS_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RSN_TYPE_BASE_SRC))
+#define GST_BASE_SRC_CAST(obj) ((RsnBaseSrc *)(obj))
+
+/**
+ * RsnBaseSrcFlags:
+ * @GST_BASE_SRC_STARTED: has source been started
+ * @GST_BASE_SRC_FLAG_LAST: offset to define more flags
+ *
+ * The #GstElement flags that a basesrc element may have.
+ */
+typedef enum {
+ GST_BASE_SRC_STARTED = (GST_ELEMENT_FLAG_LAST << 0),
+ /* padding */
+ GST_BASE_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} RsnBaseSrcFlags;
+
+typedef struct _RsnBaseSrc RsnBaseSrc;
+typedef struct _RsnBaseSrcClass RsnBaseSrcClass;
+typedef struct _RsnBaseSrcPrivate RsnBaseSrcPrivate;
+
+/**
+ * GST_BASE_SRC_PAD:
+ * @obj: base source instance
+ *
+ * Gives the pointer to the #GstPad object of the element.
+ */
+#define GST_BASE_SRC_PAD(obj) (GST_BASE_SRC_CAST (obj)->srcpad)
+
+
+/**
+ * RsnBaseSrc:
+ * @element: the parent element.
+ *
+ * The opaque #RsnBaseSrc data structure.
+ */
+struct _RsnBaseSrc {
+ GstElement element;
+
+ /*< protected >*/
+ GstPad *srcpad;
+
+ /* available to subclass implementations */
+ /* MT-protected (with LIVE_LOCK) */
+ GMutex *live_lock;
+ GCond *live_cond;
+ gboolean is_live;
+ gboolean live_running;
+
+ /* MT-protected (with LOCK) */
+ gint blocksize; /* size of buffers when operating push based */
+ gboolean can_activate_push; /* some scheduling properties */
+ GstActivateMode pad_mode;
+ gboolean seekable;
+ gboolean random_access;
+
+ GstClockID clock_id; /* for syncing */
+ GstClockTime end_time;
+
+ /* MT-protected (with STREAM_LOCK) */
+ GstSegment segment;
+ gboolean need_newsegment;
+
+ guint64 offset; /* current offset in the resource, unused */
+ guint64 size; /* total size of the resource, unused */
+
+ gint num_buffers;
+ gint num_buffers_left;
+
+ /*< private >*/
+ union {
+ struct {
+ /* FIXME: those fields should be moved into the private struct */
+ gboolean typefind;
+ gboolean running;
+ GstEvent *pending_seek;
+ } ABI;
+ gpointer _gst_reserved[GST_PADDING_LARGE-1];
+ } data;
+
+ RsnBaseSrcPrivate *priv;
+};
+
+/**
+ * RsnBaseSrcClass:
+ * @parent_class: Element parent class
+ * @get_caps: Called to get the caps to report
+ * @set_caps: Notify subclass of changed output caps
+ * @negotiate: Negotiated the caps with the peer.
+ * @newsegment: Generate and send a new_segment event (UNUSED)
+ * @start: Start processing. Subclasses should open resources and prepare
+ * to produce data.
+ * @stop: Stop processing. Subclasses should use this to close resources.
+ * @get_times: Given a buffer, return the start and stop time when it
+ * should be pushed out. The base class will sync on the clock using
+ * these times.
+ * @get_size: Return the total size of the resource, in the configured format.
+ * @is_seekable: Check if the source can seek
+ * @unlock: Unlock any pending access to the resource. Subclasses should
+ * unblock any blocked function ASAP
+ * @unlock_stop: Clear the previous unlock request. Subclasses should clear
+ * any state they set during unlock(), such as clearing command queues.
+ * @event: Override this to implement custom event handling.
+ * @create: Ask the subclass to create a buffer with offset and size.
+ * @do_seek: Perform seeking on the resource to the indicated segment.
+ * @prepare_seek_segment: Prepare the GstSegment that will be passed to the
+ * do_seek vmethod for executing a seek request. Sub-classes should override
+ * this if they support seeking in formats other than the configured native
+ * format. By default, it tries to convert the seek arguments to the
+ * configured native format and prepare a segment in that format.
+ * Since: 0.10.13
+ * @query: Handle a requested query.
+ * @check_get_range: Check whether the source would support pull-based
+ * operation if it were to be opened now. This vfunc is optional, but
+ * should be implemented if possible to avoid unnecessary start/stop
+ * cycles. The default implementation will open and close the resource
+ * to find out whether get_range is supported, and that is usually
+ * undesirable.
+ * @fixate: Called during negotation if caps need fixating. Implement instead of
+ * setting a fixate function on the source pad.
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At the minimum, the @create method should be overridden to produce
+ * buffers.
+ */
+struct _RsnBaseSrcClass {
+ GstElementClass parent_class;
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ /* get caps from subclass */
+ GstCaps* (*get_caps) (RsnBaseSrc *src);
+ /* notify the subclass of new caps */
+ gboolean (*set_caps) (RsnBaseSrc *src, GstCaps *caps);
+
+ /* decide on caps */
+ gboolean (*negotiate) (RsnBaseSrc *src);
+
+ /* generate and send a newsegment (UNUSED) */
+ gboolean (*newsegment) (RsnBaseSrc *src);
+
+ /* start and stop processing, ideal for opening/closing the resource */
+ gboolean (*start) (RsnBaseSrc *src);
+ gboolean (*stop) (RsnBaseSrc *src);
+
+ /* given a buffer, return start and stop time when it should be pushed
+ * out. The base class will sync on the clock using these times. */
+ void (*get_times) (RsnBaseSrc *src, GstBuffer *buffer,
+ GstClockTime *start, GstClockTime *end);
+
+ /* get the total size of the resource in bytes */
+ gboolean (*get_size) (RsnBaseSrc *src, guint64 *size);
+
+ /* check if the resource is seekable */
+ gboolean (*is_seekable) (RsnBaseSrc *src);
+ /* unlock any pending access to the resource. subclasses should unlock
+ * any function ASAP. */
+ gboolean (*unlock) (RsnBaseSrc *src);
+
+ /* notify subclasses of an event */
+ gboolean (*event) (RsnBaseSrc *src, GstEvent *event);
+
+ /* ask the subclass to create a buffer with offset and size */
+ GstFlowReturn (*create) (RsnBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+
+ /* additions that change padding... */
+ /* notify subclasses of a seek */
+ gboolean (*do_seek) (RsnBaseSrc *src, GstSegment *segment);
+ /* notify subclasses of a query */
+ gboolean (*query) (RsnBaseSrc *src, GstQuery *query);
+
+ /* check whether the source would support pull-based operation if
+ * it were to be opened now. This vfunc is optional, but should be
+ * implemented if possible to avoid unnecessary start/stop cycles.
+ * The default implementation will open and close the resource to
+ * find out whether get_range is supported and that is usually
+ * undesirable. */
+ gboolean (*check_get_range) (RsnBaseSrc *src);
+
+ /* called if, in negotation, caps need fixating */
+ void (*fixate) (RsnBaseSrc *src, GstCaps *caps);
+
+ /* Clear any pending unlock request, as we succeeded in unlocking */
+ gboolean (*unlock_stop) (RsnBaseSrc *src);
+
+ /* Prepare the segment on which to perform do_seek(), converting to the
+ * current basesrc format. */
+ gboolean (*prepare_seek_segment) (RsnBaseSrc *src, GstEvent *seek,
+ GstSegment *segment);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE - 6];
+};
+
+GType rsn_base_src_get_type (void);
+
+GstFlowReturn rsn_base_src_wait_playing (RsnBaseSrc *src);
+
+void rsn_base_src_set_live (RsnBaseSrc *src, gboolean live);
+gboolean rsn_base_src_is_live (RsnBaseSrc *src);
+
+void rsn_base_src_set_format (RsnBaseSrc *src, GstFormat format);
+
+gboolean rsn_base_src_query_latency (RsnBaseSrc *src, gboolean * live,
+ GstClockTime * min_latency,
+ GstClockTime * max_latency);
+
+void rsn_base_src_set_do_timestamp (RsnBaseSrc *src, gboolean live);
+gboolean rsn_base_src_get_do_timestamp (RsnBaseSrc *src);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_SRC_H__ */