/* vim: set filetype=c: */
% ClassName
GstVideoDecoder
% TYPE_CLASS_NAME
GST_TYPE_VIDEO_DECODER
% pads
sinkpad-simple
srcpad-template-video
% pkg-config
gstreamer-video-1.0
% includes
#include <gst/video/video.h>
#include <gst/video/gstvideodecoder.h>
% prototypes
static gboolean gst_replace_open (GstVideoDecoder * decoder);
static gboolean gst_replace_close (GstVideoDecoder * decoder);
static gboolean gst_replace_start (GstVideoDecoder * decoder);
static gboolean gst_replace_stop (GstVideoDecoder * decoder);
static GstFlowReturn gst_replace_parse (GstVideoDecoder * decoder,
    GstVideoCodecFrame * frame, GstAdapter * adapter, gboolean at_eos);
static gboolean gst_replace_set_format (GstVideoDecoder * decoder,
    GstVideoCodecState * state);
static gboolean gst_replace_reset (GstVideoDecoder * decoder, gboolean hard);
static GstFlowReturn gst_replace_finish (GstVideoDecoder * decoder);
static GstFlowReturn gst_replace_handle_frame (GstVideoDecoder * decoder,
    GstVideoCodecFrame * frame);
static gboolean gst_replace_sink_event (GstVideoDecoder * decoder,
    GstEvent * event);
static gboolean gst_replace_src_event (GstVideoDecoder * decoder,
    GstEvent * event);
static gboolean gst_replace_negotiate (GstVideoDecoder * decoder);
static gboolean gst_replace_decide_allocation (GstVideoDecoder * decoder,
    GstQuery * query);
static gboolean gst_replace_propose_allocation (GstVideoDecoder * decoder,
    GstQuery * query);
% declare-class
  GstVideoDecoderClass *video_decoder_class = GST_VIDEO_DECODER_CLASS (klass);
% set-methods
  video_decoder_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
  video_decoder_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
  video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
  video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
  video_decoder_class->parse = GST_DEBUG_FUNCPTR (gst_replace_parse);
  video_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_replace_set_format);
  video_decoder_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
  video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_replace_finish);
  video_decoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
  video_decoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
  video_decoder_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
  video_decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
  video_decoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
  video_decoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
% methods
static gboolean
gst_replace_open (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "open");

  return TRUE;
}

static gboolean
gst_replace_close (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "close");

  return TRUE;
}

static gboolean
gst_replace_start (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "start");

  return TRUE;
}

static gboolean
gst_replace_stop (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "stop");

  return TRUE;
}

static GstFlowReturn
gst_replace_parse (GstVideoDecoder * decoder, GstVideoCodecFrame * frame,
    GstAdapter * adapter, gboolean at_eos)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "parse");

  return GST_FLOW_OK;
}

static gboolean
gst_replace_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "set_format");

  return TRUE;
}

static gboolean
gst_replace_reset (GstVideoDecoder * decoder, gboolean hard)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "reset");

  return TRUE;
}

static GstFlowReturn
gst_replace_finish (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "finish");

  return GST_FLOW_OK;
}

static GstFlowReturn
gst_replace_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "handle_frame");

  return GST_FLOW_OK;
}

static gboolean
gst_replace_sink_event (GstVideoDecoder * decoder, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "sink_event");

  return TRUE;
}

static gboolean
gst_replace_src_event (GstVideoDecoder * decoder, GstEvent * event)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "src_event");

  return TRUE;
}

static gboolean
gst_replace_negotiate (GstVideoDecoder * decoder)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "negotiate");

  return TRUE;
}

static gboolean
gst_replace_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "decide_allocation");

  return TRUE;
}

static gboolean
gst_replace_propose_allocation (GstVideoDecoder * decoder, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (decoder);

  GST_DEBUG_OBJECT (replace, "propose_allocation");

  return TRUE;
}
% end
