/* vim: set filetype=c: */
% ClassName
GstVideoEncoder
% TYPE_CLASS_NAME
GST_TYPE_VIDEO_ENCODER
% pads
srcpad-simple
sinkpad-template-video
% pkg-config
gstreamer-video-1.0
% includes
#include <gst/video/video.h>
#include <gst/video/gstvideoencoder.h>
% prototypes
static gboolean gst_replace_open (GstVideoEncoder *encoder);
static gboolean gst_replace_close (GstVideoEncoder *encoder);
static gboolean gst_replace_start (GstVideoEncoder *encoder);
static gboolean gst_replace_stop (GstVideoEncoder *encoder);
static gboolean gst_replace_set_format (GstVideoEncoder *encoder, GstVideoCodecState *state);
static GstFlowReturn gst_replace_handle_frame (GstVideoEncoder *encoder, GstVideoCodecFrame *frame);
static gboolean gst_replace_reset (GstVideoEncoder *encoder, gboolean hard);
static GstFlowReturn gst_replace_finish (GstVideoEncoder *encoder);
static GstFlowReturn gst_replace_pre_push (GstVideoEncoder *encoder, GstVideoCodecFrame *frame);
static GstCaps * gst_replace_getcaps (GstVideoEncoder *encoder, GstCaps *filter);
static gboolean gst_replace_sink_event (GstVideoEncoder *encoder, GstEvent *event);
static gboolean gst_replace_src_event (GstVideoEncoder *encoder, GstEvent *event);
static gboolean gst_replace_negotiate (GstVideoEncoder *encoder);
static gboolean gst_replace_decide_allocation (GstVideoEncoder *encoder, GstQuery *query);
static gboolean gst_replace_propose_allocation (GstVideoEncoder * encoder, GstQuery * query);
% declare-class
  GstVideoEncoderClass *video_encoder_class = GST_VIDEO_ENCODER_CLASS (klass);
% set-methods
  video_encoder_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
  video_encoder_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
  video_encoder_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
  video_encoder_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
  video_encoder_class->set_format = GST_DEBUG_FUNCPTR (gst_replace_set_format);
  video_encoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
  video_encoder_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
  video_encoder_class->finish = GST_DEBUG_FUNCPTR (gst_replace_finish);
  video_encoder_class->pre_push = GST_DEBUG_FUNCPTR (gst_replace_pre_push);
  video_encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_replace_getcaps);
  video_encoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
  video_encoder_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
  video_encoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
  video_encoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
  video_encoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
% methods
static gboolean gst_replace_open (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "open");

  return TRUE;
}

static gboolean gst_replace_close (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "close");

  return TRUE;
}

static gboolean gst_replace_start (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "start");

  return TRUE;
}

static gboolean gst_replace_stop (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "stop");

  return TRUE;
}

static gboolean gst_replace_set_format (GstVideoEncoder *encoder, GstVideoCodecState *state)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "set_format");

  return TRUE;
}

static GstFlowReturn gst_replace_handle_frame (GstVideoEncoder *encoder, GstVideoCodecFrame *frame)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "handle_frame");

  return GST_FLOW_OK;
}

static gboolean gst_replace_reset (GstVideoEncoder *encoder, gboolean hard)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "reset");

  return TRUE;
}

static GstFlowReturn gst_replace_finish (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "finish");

  return GST_FLOW_OK;
}

static GstFlowReturn gst_replace_pre_push (GstVideoEncoder *encoder, GstVideoCodecFrame *frame)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "pre_push");

  return GST_FLOW_OK;
}

static GstCaps * gst_replace_getcaps (GstVideoEncoder *encoder, GstCaps *filter)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "getcaps");

  return NULL;
}

static gboolean gst_replace_sink_event (GstVideoEncoder *encoder, GstEvent *event)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "sink_event");

  return TRUE;
}

static gboolean gst_replace_src_event (GstVideoEncoder *encoder, GstEvent *event)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "src_event");

  return TRUE;
}

static gboolean gst_replace_negotiate (GstVideoEncoder *encoder)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "negotiate");

  return TRUE;
}

static gboolean gst_replace_decide_allocation (GstVideoEncoder *encoder, GstQuery *query)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "decide_allocation");

  return TRUE;
}

static gboolean gst_replace_propose_allocation (GstVideoEncoder * encoder, GstQuery * query)
{
  GstReplace *replace = GST_REPLACE (encoder);

  GST_DEBUG_OBJECT(replace, "propose_allocation");

  return TRUE;
}

% end
