/* vim: set filetype=c: */
% ClassName
GstElement
% TYPE_CLASS_NAME
GST_TYPE_ELEMENT
% pads
sinkpad srcpad
% pkg-config
gstreamer-1.0
% includes
#include <gst/gst.h>
% prototypes
static GstPad *gst_replace_request_new_pad (GstElement * element,
    GstPadTemplate * templ, const gchar * name);
static void gst_replace_release_pad (GstElement * element, GstPad * pad);
static GstStateChangeReturn
gst_replace_change_state (GstElement * element, GstStateChange transition);
static GstClock *gst_replace_provide_clock (GstElement * element);
static gboolean gst_replace_set_clock (GstElement * element, GstClock * clock);
static GstIndex *gst_replace_get_index (GstElement * element);
static void gst_replace_set_index (GstElement * element, GstIndex * index);
static gboolean gst_replace_send_event (GstElement * element, GstEvent * event);
static gboolean gst_replace_query (GstElement * element, GstQuery * query);
% declare-class
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
% set-methods
  element_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_replace_request_new_pad);
  element_class->release_pad = GST_DEBUG_FUNCPTR (gst_replace_release_pad);
  element_class->change_state = GST_DEBUG_FUNCPTR (gst_replace_change_state);
  element_class->provide_clock = GST_DEBUG_FUNCPTR (gst_replace_provide_clock);
  element_class->set_clock = GST_DEBUG_FUNCPTR (gst_replace_set_clock);
  element_class->get_index = GST_DEBUG_FUNCPTR (gst_replace_get_index);
  element_class->set_index = GST_DEBUG_FUNCPTR (gst_replace_set_index);
  element_class->send_event = GST_DEBUG_FUNCPTR (gst_replace_send_event);
  element_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
% methods


static GstPad *
gst_replace_request_new_pad (GstElement * element, GstPadTemplate * templ,
    const gchar * name)
{

  return NULL;
}

static void
gst_replace_release_pad (GstElement * element, GstPad * pad)
{

}

static GstStateChangeReturn
gst_replace_change_state (GstElement * element, GstStateChange transition)
{
  GstReplace *replace;
  GstStateChangeReturn ret;

  g_return_val_if_fail (GST_IS_REPLACE (element), GST_STATE_CHANGE_FAILURE);
  replace = GST_REPLACE (element);

  switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
      break;
    case GST_STATE_CHANGE_READY_TO_PAUSED:
      break;
    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
      break;
    default:
      break;
  }

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

  switch (transition) {
    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
      break;
    case GST_STATE_CHANGE_PAUSED_TO_READY:
      break;
    case GST_STATE_CHANGE_READY_TO_NULL:
      break;
    default:
      break;
  }

  return ret;
}

static GstClock *
gst_replace_provide_clock (GstElement * element)
{

  return NULL;
}

static gboolean
gst_replace_set_clock (GstElement * element, GstClock * clock)
{

  return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock);
}

static GstIndex *
gst_replace_get_index (GstElement * element)
{

  return NULL;
}

static void
gst_replace_set_index (GstElement * element, GstIndex * index)
{

}

static gboolean
gst_replace_send_event (GstElement * element, GstEvent * event)
{

  return TRUE;
}

static gboolean
gst_replace_query (GstElement * element, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (element);
  gboolean ret;

  GST_DEBUG_OBJECT (replace, "query");

  switch (GST_QUERY_TYPE (query)) {
    default:
      ret = GST_ELEMENT_CLASS (parent_class)->query (element, query);
      break;
  }

  return ret;
}
% end
