/* 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
