/* vim: set filetype=c: */
% ClassName
GstBaseTransform
% TYPE_CLASS_NAME
GST_TYPE_BASE_TRANSFORM
% pads
srcpad-simple
sinkpad-simple
% pkg-config
gstreamer-base-1.0
% includes
#include <gst/base/gstbasetransform.h>
% prototypes
static GstCaps *gst_replace_transform_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_replace_fixate_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
static gboolean gst_replace_accept_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps);
static gboolean gst_replace_set_caps (GstBaseTransform * trans,
    GstCaps * incaps, GstCaps * outcaps);
static gboolean gst_replace_query (GstBaseTransform * trans,
    GstPadDirection direction, GstQuery * query);
static gboolean gst_replace_decide_allocation (GstBaseTransform * trans,
    GstQuery * query);
static gboolean gst_replace_filter_meta (GstBaseTransform * trans,
    GstQuery * query, GType api, const GstStructure * params);
static gboolean gst_replace_propose_allocation (GstBaseTransform * trans,
    GstQuery * decide_query, GstQuery * query);
static gboolean gst_replace_transform_size (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps,
    gsize * othersize);
static gboolean gst_replace_get_unit_size (GstBaseTransform * trans,
    GstCaps * caps, gsize * size);
static gboolean gst_replace_start (GstBaseTransform * trans);
static gboolean gst_replace_stop (GstBaseTransform * trans);
static gboolean gst_replace_sink_event (GstBaseTransform * trans,
    GstEvent * event);
static gboolean gst_replace_src_event (GstBaseTransform * trans,
    GstEvent * event);
static GstFlowReturn gst_replace_prepare_output_buffer (GstBaseTransform *
    trans, GstBuffer * input, GstBuffer ** outbuf);
static gboolean gst_replace_copy_metadata (GstBaseTransform * trans,
    GstBuffer * input, GstBuffer * outbuf);
static gboolean gst_replace_transform_meta (GstBaseTransform * trans,
    GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf);
static void gst_replace_before_transform (GstBaseTransform * trans,
    GstBuffer * buffer);
static GstFlowReturn gst_replace_transform (GstBaseTransform * trans,
    GstBuffer * inbuf, GstBuffer * outbuf);
static GstFlowReturn gst_replace_transform_ip (GstBaseTransform * trans,
    GstBuffer * buf);
% declare-class
  GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
% set-methods
  base_transform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_replace_transform_caps);
  base_transform_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_replace_fixate_caps);
  base_transform_class->accept_caps = GST_DEBUG_FUNCPTR (gst_replace_accept_caps);
  base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
  base_transform_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
  base_transform_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
  base_transform_class->filter_meta = GST_DEBUG_FUNCPTR (gst_replace_filter_meta);
  base_transform_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
  base_transform_class->transform_size = GST_DEBUG_FUNCPTR (gst_replace_transform_size);
  base_transform_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_replace_get_unit_size);
  base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
  base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
  base_transform_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
  base_transform_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
  base_transform_class->prepare_output_buffer = GST_DEBUG_FUNCPTR (gst_replace_prepare_output_buffer);
  base_transform_class->copy_metadata = GST_DEBUG_FUNCPTR (gst_replace_copy_metadata);
  base_transform_class->transform_meta = GST_DEBUG_FUNCPTR (gst_replace_transform_meta);
  base_transform_class->before_transform = GST_DEBUG_FUNCPTR (gst_replace_before_transform);
  base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_replace_transform);
  base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
% methods
static GstCaps *
gst_replace_transform_caps (GstBaseTransform * trans, GstPadDirection direction,
    GstCaps * caps, GstCaps * filter)
{
  GstReplace *replace = GST_REPLACE (trans);
  GstCaps *othercaps;

  GST_DEBUG_OBJECT (replace, "transform_caps");

  othercaps = gst_caps_copy (caps);

  /* Copy other caps and modify as appropriate */
  /* This works for the simplest cases, where the transform modifies one
   * or more fields in the caps structure.  It does not work correctly
   * if passthrough caps are preferred. */
  if (direction == GST_PAD_SRC) {
    /* transform caps going upstream */
  } else {
    /* transform caps going downstream */
  }

  if (filter) {
    GstCaps *intersect;

    intersect = gst_caps_intersect (othercaps, filter);
    gst_caps_unref (othercaps);

    return intersect;
  } else {
    return othercaps;
  }
}

static GstCaps *
gst_replace_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
    GstCaps * caps, GstCaps * othercaps)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "fixate_caps");

  return NULL;
}

static gboolean
gst_replace_accept_caps (GstBaseTransform * trans, GstPadDirection direction,
    GstCaps * caps)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "accept_caps");

  return TRUE;
}

static gboolean
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
    GstCaps * outcaps)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "set_caps");

  return TRUE;
}

static gboolean
gst_replace_query (GstBaseTransform * trans, GstPadDirection direction,
    GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "query");

  return TRUE;
}

/* decide allocation query for output buffers */
static gboolean
gst_replace_decide_allocation (GstBaseTransform * trans, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "decide_allocation");

  return TRUE;
}

static gboolean
gst_replace_filter_meta (GstBaseTransform * trans, GstQuery * query, GType api,
    const GstStructure * params)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "filter_meta");

  return TRUE;
}

/* propose allocation query parameters for input buffers */
static gboolean
gst_replace_propose_allocation (GstBaseTransform * trans,
    GstQuery * decide_query, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "propose_allocation");

  return TRUE;
}

/* transform size */
static gboolean
gst_replace_transform_size (GstBaseTransform * trans, GstPadDirection direction,
    GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "transform_size");

  return TRUE;
}

static gboolean
gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
    gsize * size)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "get_unit_size");

  return TRUE;
}

/* states */
static gboolean
gst_replace_start (GstBaseTransform * trans)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "start");

  return TRUE;
}

static gboolean
gst_replace_stop (GstBaseTransform * trans)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "stop");

  return TRUE;
}

/* sink and src pad event handlers */
static gboolean
gst_replace_sink_event (GstBaseTransform * trans, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "sink_event");

  return GST_BASE_TRANSFORM_CLASS (gst_replace_parent_class)->sink_event (
      trans, event);
}

static gboolean
gst_replace_src_event (GstBaseTransform * trans, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "src_event");

  return GST_BASE_TRANSFORM_CLASS (gst_replace_parent_class)->src_event (
      trans, event);
}

static GstFlowReturn
gst_replace_prepare_output_buffer (GstBaseTransform * trans, GstBuffer * input,
    GstBuffer ** outbuf)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "prepare_output_buffer");

  return GST_FLOW_OK;
}

/* metadata */
static gboolean
gst_replace_copy_metadata (GstBaseTransform * trans, GstBuffer * input,
    GstBuffer * outbuf)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "copy_metadata");

  return TRUE;
}

static gboolean
gst_replace_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf,
    GstMeta * meta, GstBuffer * inbuf)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "transform_meta");

  return TRUE;
}

static void
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "before_transform");

}

/* transform */
static GstFlowReturn
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
    GstBuffer * outbuf)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "transform");

  return GST_FLOW_OK;
}

static GstFlowReturn
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
{
  GstReplace *replace = GST_REPLACE (trans);

  GST_DEBUG_OBJECT (replace, "transform_ip");

  return GST_FLOW_OK;
}
% end
