mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
276 lines
7.6 KiB
C
276 lines
7.6 KiB
C
/* vim: set filetype=c: */
|
|
% ClassName
|
|
GstBaseSrc
|
|
% TYPE_CLASS_NAME
|
|
GST_TYPE_BASE_SRC
|
|
% pads
|
|
srcpad-simple
|
|
% pkg-config
|
|
gstreamer-base-1.0
|
|
% includes
|
|
#include <gst/base/gstbasesrc.h>
|
|
% prototypes
|
|
static GstCaps *gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter);
|
|
static gboolean gst_replace_negotiate (GstBaseSrc * src);
|
|
static GstCaps *gst_replace_fixate (GstBaseSrc * src, GstCaps * caps);
|
|
static gboolean gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps);
|
|
static gboolean gst_replace_decide_allocation (GstBaseSrc * src,
|
|
GstQuery * query);
|
|
static gboolean gst_replace_start (GstBaseSrc * src);
|
|
static gboolean gst_replace_stop (GstBaseSrc * src);
|
|
static void gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
|
GstClockTime * start, GstClockTime * end);
|
|
static gboolean gst_replace_get_size (GstBaseSrc * src, guint64 * size);
|
|
static gboolean gst_replace_is_seekable (GstBaseSrc * src);
|
|
static gboolean gst_replace_prepare_seek_segment (GstBaseSrc * src,
|
|
GstEvent * seek, GstSegment * segment);
|
|
static gboolean gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment);
|
|
static gboolean gst_replace_unlock (GstBaseSrc * src);
|
|
static gboolean gst_replace_unlock_stop (GstBaseSrc * src);
|
|
static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query);
|
|
static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event);
|
|
static GstFlowReturn gst_replace_create (GstBaseSrc * src, guint64 offset,
|
|
guint size, GstBuffer ** buf);
|
|
static GstFlowReturn gst_replace_alloc (GstBaseSrc * src, guint64 offset,
|
|
guint size, GstBuffer ** buf);
|
|
static GstFlowReturn gst_replace_fill (GstBaseSrc * src, guint64 offset,
|
|
guint size, GstBuffer * buf);
|
|
% declare-class
|
|
GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
|
|
% set-methods
|
|
base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
|
base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
|
base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
|
base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
|
base_src_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
|
|
base_src_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
|
base_src_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
|
base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
|
base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_replace_get_size);
|
|
base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_replace_is_seekable);
|
|
base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_replace_prepare_seek_segment);
|
|
base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_replace_do_seek);
|
|
base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
|
base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
|
base_src_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
|
|
base_src_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
|
base_src_class->create = GST_DEBUG_FUNCPTR (gst_replace_create);
|
|
base_src_class->alloc = GST_DEBUG_FUNCPTR (gst_replace_alloc);
|
|
base_src_class->fill = GST_DEBUG_FUNCPTR (gst_replace_fill);
|
|
% methods
|
|
/* get caps from subclass */
|
|
static GstCaps *
|
|
gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "get_caps");
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* decide on caps */
|
|
static gboolean
|
|
gst_replace_negotiate (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "negotiate");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* called if, in negotiation, caps need fixating */
|
|
static GstCaps *
|
|
gst_replace_fixate (GstBaseSrc * src, GstCaps * caps)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "fixate");
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* notify the subclass of new caps */
|
|
static gboolean
|
|
gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "set_caps");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* setup allocation query */
|
|
static gboolean
|
|
gst_replace_decide_allocation (GstBaseSrc * src, GstQuery * query)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "decide_allocation");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* start and stop processing, ideal for opening/closing the resource */
|
|
static gboolean
|
|
gst_replace_start (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "start");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
gst_replace_stop (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "stop");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 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. */
|
|
static void
|
|
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
|
GstClockTime * start, GstClockTime * end)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "get_times");
|
|
|
|
}
|
|
|
|
/* get the total size of the resource in bytes */
|
|
static gboolean
|
|
gst_replace_get_size (GstBaseSrc * src, guint64 * size)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "get_size");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* check if the resource is seekable */
|
|
static gboolean
|
|
gst_replace_is_seekable (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "is_seekable");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* Prepare the segment on which to perform do_seek(), converting to the
|
|
* current basesrc format. */
|
|
static gboolean
|
|
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
|
GstSegment * segment)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "prepare_seek_segment");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* notify subclasses of a seek */
|
|
static gboolean
|
|
gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "do_seek");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* unlock any pending access to the resource. subclasses should unlock
|
|
* any function ASAP. */
|
|
static gboolean
|
|
gst_replace_unlock (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "unlock");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* Clear any pending unlock request, as we succeeded in unlocking */
|
|
static gboolean
|
|
gst_replace_unlock_stop (GstBaseSrc * src)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "unlock_stop");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* notify subclasses of a query */
|
|
static gboolean
|
|
gst_replace_query (GstBaseSrc * src, GstQuery * query)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "query");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* notify subclasses of an event */
|
|
static gboolean
|
|
gst_replace_event (GstBaseSrc * src, GstEvent * event)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "event");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* ask the subclass to create a buffer with offset and size, the default
|
|
* implementation will call alloc and fill. */
|
|
static GstFlowReturn
|
|
gst_replace_create (GstBaseSrc * src, guint64 offset, guint size,
|
|
GstBuffer ** buf)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "create");
|
|
|
|
return GST_FLOW_OK;
|
|
}
|
|
|
|
/* ask the subclass to allocate an output buffer. The default implementation
|
|
* will use the negotiated allocator. */
|
|
static GstFlowReturn
|
|
gst_replace_alloc (GstBaseSrc * src, guint64 offset, guint size,
|
|
GstBuffer ** buf)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "alloc");
|
|
|
|
return GST_FLOW_OK;
|
|
}
|
|
|
|
/* ask the subclass to fill the buffer with data from offset and size */
|
|
static GstFlowReturn
|
|
gst_replace_fill (GstBaseSrc * src, guint64 offset, guint size, GstBuffer * buf)
|
|
{
|
|
GstReplace *replace = GST_REPLACE (src);
|
|
|
|
GST_DEBUG_OBJECT (replace, "fill");
|
|
|
|
return GST_FLOW_OK;
|
|
}
|
|
% end
|