/* vim: set filetype=c: */
% ClassName
GstBaseTransform
% TYPE_CLASS_NAME
GST_TYPE_BASE_TRANSFORM
% pads
sinkpad-simple srcpad-simple
% pkg-config
gstreamer-base-0.10
% pads
sinkpad-simple srcpad-simple
% includes
#include <gst/base/gstbasetransform.h>
% prototypes
static GstCaps *gst_replace_transform_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps);
static void
gst_replace_fixate_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
static gboolean
gst_replace_transform_size (GstBaseTransform * trans,
    GstPadDirection direction,
    GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize);
static gboolean
gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
    guint * size);
static gboolean
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
    GstCaps * outcaps);
static gboolean gst_replace_start (GstBaseTransform * trans);
static gboolean gst_replace_stop (GstBaseTransform * trans);
static gboolean gst_replace_event (GstBaseTransform * trans, GstEvent * event);
static GstFlowReturn
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
    GstBuffer * outbuf);
static GstFlowReturn
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
static GstFlowReturn
gst_replace_prepare_output_buffer (GstBaseTransform * trans,
    GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf);
static gboolean
gst_replace_src_event (GstBaseTransform * trans, GstEvent * event);
static void
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer);
% 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->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->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
  base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
  base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
  base_transform_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
  base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_replace_transform);
  base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
  base_transform_class->prepare_output_buffer = GST_DEBUG_FUNCPTR (gst_replace_prepare_output_buffer);
  base_transform_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
  base_transform_class->before_transform = GST_DEBUG_FUNCPTR (gst_replace_before_transform);
% methods

static GstCaps *
gst_replace_transform_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps)
{

  return NULL;
}

static void
gst_replace_fixate_caps (GstBaseTransform * trans,
    GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{

}

static gboolean
gst_replace_transform_size (GstBaseTransform * trans,
    GstPadDirection direction,
    GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize)
{

  return FALSE;
}

static gboolean
gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
    guint * size)
{

  return FALSE;
}

static gboolean
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
    GstCaps * outcaps)
{

  return FALSE;
}

static gboolean
gst_replace_start (GstBaseTransform * trans)
{

  return FALSE;
}

static gboolean
gst_replace_stop (GstBaseTransform * trans)
{

  return FALSE;
}

static gboolean
gst_replace_event (GstBaseTransform * trans, GstEvent * event)
{

  return FALSE;
}

static GstFlowReturn
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
    GstBuffer * outbuf)
{

  return GST_FLOW_ERROR;
}

static GstFlowReturn
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
{

  return GST_FLOW_ERROR;
}

static GstFlowReturn
gst_replace_prepare_output_buffer (GstBaseTransform * trans,
    GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf)
{

  return GST_FLOW_ERROR;
}

static gboolean
gst_replace_src_event (GstBaseTransform * trans, GstEvent * event)
{

  return FALSE;
}

static void
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer)
{

}
% end
