mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 16:21:17 +00:00
element-maker: Update templates for 1.0
This are (almost) completely autogenerated from the documentation.
This commit is contained in:
parent
6005ab322d
commit
b45a1df5de
27 changed files with 1501 additions and 1074 deletions
191
tools/element-templates/audiodecoder
Normal file
191
tools/element-templates/audiodecoder
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
|
% ClassName
|
||||||
|
GstAudioDecoder
|
||||||
|
% TYPE_CLASS_NAME
|
||||||
|
GST_TYPE_AUDIO_DECODER
|
||||||
|
% pads
|
||||||
|
srcpad-audio
|
||||||
|
sinkpad-simple
|
||||||
|
% pkg-config
|
||||||
|
gstreamer-audio-1.0
|
||||||
|
% includes
|
||||||
|
#include <gst/audio/gstaudiodecoder.h>
|
||||||
|
% prototypes
|
||||||
|
static gboolean gst_replace_start (GstAudioDecoder * decoder);
|
||||||
|
static gboolean gst_replace_stop (GstAudioDecoder * decoder);
|
||||||
|
static gboolean gst_replace_set_format (GstAudioDecoder * decoder, GstCaps * caps);
|
||||||
|
static GstFlowReturn gst_replace_parse (GstAudioDecoder * decoder,
|
||||||
|
GstAdapter * adapter, gint * offset, gint * length);
|
||||||
|
static GstFlowReturn gst_replace_handle_frame (GstAudioDecoder * decoder,
|
||||||
|
GstBuffer * buffer);
|
||||||
|
static void gst_replace_flush (GstAudioDecoder * decoder, gboolean hard);
|
||||||
|
static GstFlowReturn gst_replace_pre_push (GstAudioDecoder * decoder,
|
||||||
|
GstBuffer ** buffer);
|
||||||
|
static gboolean gst_replace_sink_event (GstAudioDecoder * decoder,
|
||||||
|
GstEvent * event);
|
||||||
|
static gboolean gst_replace_src_event (GstAudioDecoder * decoder, GstEvent * event);
|
||||||
|
static gboolean gst_replace_open (GstAudioDecoder * decoder);
|
||||||
|
static gboolean gst_replace_close (GstAudioDecoder * decoder);
|
||||||
|
static gboolean gst_replace_negotiate (GstAudioDecoder * decoder);
|
||||||
|
static gboolean gst_replace_decide_allocation (GstAudioDecoder * decoder,
|
||||||
|
GstQuery * query);
|
||||||
|
static gboolean gst_replace_propose_allocation (GstAudioDecoder * decoder,
|
||||||
|
GstQuery * query);
|
||||||
|
% declare-class
|
||||||
|
GstAudioDecoderClass *audio_decoder_class = GST_AUDIO_DECODER_CLASS (klass);
|
||||||
|
% set-methods
|
||||||
|
audio_decoder_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
||||||
|
audio_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
||||||
|
audio_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_replace_set_format);
|
||||||
|
audio_decoder_class->parse = GST_DEBUG_FUNCPTR (gst_replace_parse);
|
||||||
|
audio_decoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
|
||||||
|
audio_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_replace_flush);
|
||||||
|
audio_decoder_class->pre_push = GST_DEBUG_FUNCPTR (gst_replace_pre_push);
|
||||||
|
audio_decoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
|
||||||
|
audio_decoder_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
|
||||||
|
audio_decoder_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
|
||||||
|
audio_decoder_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
|
||||||
|
audio_decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
||||||
|
audio_decoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
|
||||||
|
audio_decoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
|
||||||
|
% methods
|
||||||
|
static gboolean
|
||||||
|
gst_replace_start (GstAudioDecoder * decoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "start");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_stop (GstAudioDecoder * decoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "stop");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_set_format (GstAudioDecoder * decoder, GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "set_format");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_parse (GstAudioDecoder * decoder, GstAdapter * adapter, gint * offset,
|
||||||
|
gint * length)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "parse");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "handle_frame");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_replace_flush (GstAudioDecoder * decoder, gboolean hard)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "flush");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_pre_push (GstAudioDecoder * decoder, GstBuffer ** buffer)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "pre_push");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_sink_event (GstAudioDecoder * decoder, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "sink_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_src_event (GstAudioDecoder * decoder, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "src_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_open (GstAudioDecoder * decoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "open");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_close (GstAudioDecoder * decoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "close");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_negotiate (GstAudioDecoder * decoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "negotiate");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_decide_allocation (GstAudioDecoder * decoder, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "decide_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_propose_allocation (GstAudioDecoder * decoder, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (decoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "propose_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
% end
|
190
tools/element-templates/audioencoder
Normal file
190
tools/element-templates/audioencoder
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
|
% ClassName
|
||||||
|
GstAudioEncoder
|
||||||
|
% TYPE_CLASS_NAME
|
||||||
|
GST_TYPE_AUDIO_ENCODER
|
||||||
|
% pads
|
||||||
|
srcpad-simple
|
||||||
|
sinkpad-audio
|
||||||
|
% pkg-config
|
||||||
|
gstreamer-audio-1.0
|
||||||
|
% includes
|
||||||
|
#include <gst/audio/gstaudioencoder.h>
|
||||||
|
% prototypes
|
||||||
|
static gboolean gst_replace_start (GstAudioEncoder * encoder);
|
||||||
|
static gboolean gst_replace_stop (GstAudioEncoder * encoder);
|
||||||
|
static gboolean gst_replace_set_format (GstAudioEncoder * encoder,
|
||||||
|
GstAudioInfo * info);
|
||||||
|
static GstFlowReturn gst_replace_handle_frame (GstAudioEncoder * encoder,
|
||||||
|
GstBuffer * buffer);
|
||||||
|
static void gst_replace_flush (GstAudioEncoder * encoder);
|
||||||
|
static GstFlowReturn gst_replace_pre_push (GstAudioEncoder * encoder,
|
||||||
|
GstBuffer ** buffer);
|
||||||
|
static gboolean gst_replace_sink_event (GstAudioEncoder * encoder,
|
||||||
|
GstEvent * event);
|
||||||
|
static gboolean gst_replace_src_event (GstAudioEncoder * encoder, GstEvent * event);
|
||||||
|
static GstCaps *gst_replace_getcaps (GstAudioEncoder * encoder, GstCaps * filter);
|
||||||
|
static gboolean gst_replace_open (GstAudioEncoder * encoder);
|
||||||
|
static gboolean gst_replace_close (GstAudioEncoder * encoder);
|
||||||
|
static gboolean gst_replace_negotiate (GstAudioEncoder * encoder);
|
||||||
|
static gboolean gst_replace_decide_allocation (GstAudioEncoder * encoder,
|
||||||
|
GstQuery * query);
|
||||||
|
static gboolean gst_replace_propose_allocation (GstAudioEncoder * encoder,
|
||||||
|
GstQuery * query);
|
||||||
|
% declare-class
|
||||||
|
GstAudioEncoderClass *audio_encoder_class = GST_AUDIO_ENCODER_CLASS (klass);
|
||||||
|
% set-methods
|
||||||
|
audio_encoder_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
||||||
|
audio_encoder_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
||||||
|
audio_encoder_class->set_format = GST_DEBUG_FUNCPTR (gst_replace_set_format);
|
||||||
|
audio_encoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
|
||||||
|
audio_encoder_class->flush = GST_DEBUG_FUNCPTR (gst_replace_flush);
|
||||||
|
audio_encoder_class->pre_push = GST_DEBUG_FUNCPTR (gst_replace_pre_push);
|
||||||
|
audio_encoder_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
|
||||||
|
audio_encoder_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
|
||||||
|
audio_encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_replace_getcaps);
|
||||||
|
audio_encoder_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
|
||||||
|
audio_encoder_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
|
||||||
|
audio_encoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
||||||
|
audio_encoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
|
||||||
|
audio_encoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
|
||||||
|
% methods
|
||||||
|
static gboolean
|
||||||
|
gst_replace_start (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "start");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_stop (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "stop");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_set_format (GstAudioEncoder * encoder, GstAudioInfo * info)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "set_format");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_handle_frame (GstAudioEncoder * encoder, GstBuffer * buffer)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "handle_frame");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_replace_flush (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "flush");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_pre_push (GstAudioEncoder * encoder, GstBuffer ** buffer)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "pre_push");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_sink_event (GstAudioEncoder * encoder, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "sink_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_src_event (GstAudioEncoder * encoder, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "src_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstCaps *
|
||||||
|
gst_replace_getcaps (GstAudioEncoder * encoder, GstCaps * filter)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "getcaps");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_open (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "open");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_close (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "close");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_negotiate (GstAudioEncoder * encoder)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "negotiate");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_decide_allocation (GstAudioEncoder * encoder, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "decide_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_propose_allocation (GstAudioEncoder * encoder, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (encoder);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "propose_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
% end
|
|
@ -4,64 +4,27 @@ GstAudioFilter
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_AUDIO_FILTER
|
GST_TYPE_AUDIO_FILTER
|
||||||
% pads
|
% pads
|
||||||
sinkpad-simple srcpad-simple
|
srcpad-audio
|
||||||
|
sinkpad-audio
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-audio-0.10
|
gstreamer-audio-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/audio/gstaudiofilter.h>
|
#include <gst/audio/gstaudiofilter.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static gboolean
|
static gboolean gst_replace_setup (GstAudioFilter * filter,
|
||||||
gst_replace_setup (GstAudioFilter * filter, GstRingBufferSpec * format);
|
const GstAudioInfo * info);
|
||||||
static gboolean
|
|
||||||
gst_replace_start (GstBaseTransform * trans);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseTransform * trans);
|
|
||||||
% declare-class
|
% declare-class
|
||||||
GstAudioFilterClass *audio_filter_class = GST_AUDIO_FILTER_CLASS (klass);
|
GstAudioFilterClass *audio_filter_class = GST_AUDIO_FILTER_CLASS (klass);
|
||||||
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
|
|
||||||
% set-methods
|
% set-methods
|
||||||
audio_filter_class->setup = GST_DEBUG_FUNCPTR (gst_replace_setup);
|
audio_filter_class->setup = GST_DEBUG_FUNCPTR (gst_replace_setup);
|
||||||
base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
|
||||||
base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
|
|
||||||
base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_setup (GstAudioFilter * filter, GstRingBufferSpec * format)
|
gst_replace_setup (GstAudioFilter * filter, const GstAudioInfo * info)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (filter); */
|
GstReplace *replace = GST_REPLACE (filter);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "setup");
|
||||||
|
|
||||||
/* handle audio format changes */
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_start (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
|
||||||
|
|
||||||
/* initialize processing */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
|
|
||||||
{
|
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
|
||||||
|
|
||||||
/* process the audio data in the buffer in-place */
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
|
||||||
|
|
||||||
/* finalize processing */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -4,18 +4,19 @@ GstAudioSink
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_AUDIO_SINK
|
GST_TYPE_AUDIO_SINK
|
||||||
% pads
|
% pads
|
||||||
sinkpad-simple
|
sinkpad-audio
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-audio-0.10
|
gstreamer-audio-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/audio/gstaudiosink.h>
|
#include <gst/audio/gstaudiosink.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static gboolean gst_replace_open (GstAudioSink * sink);
|
static gboolean gst_replace_open (GstAudioSink * sink);
|
||||||
static gboolean
|
static gboolean gst_replace_prepare (GstAudioSink * sink,
|
||||||
gst_replace_prepare (GstAudioSink * sink, GstRingBufferSpec * spec);
|
GstAudioRingBufferSpec * spec);
|
||||||
static gboolean gst_replace_unprepare (GstAudioSink * sink);
|
static gboolean gst_replace_unprepare (GstAudioSink * sink);
|
||||||
static gboolean gst_replace_close (GstAudioSink * sink);
|
static gboolean gst_replace_close (GstAudioSink * sink);
|
||||||
static guint gst_replace_write (GstAudioSink * sink, gpointer data, guint length);
|
static gint gst_replace_write (GstAudioSink * sink, gpointer data,
|
||||||
|
guint length);
|
||||||
static guint gst_replace_delay (GstAudioSink * sink);
|
static guint gst_replace_delay (GstAudioSink * sink);
|
||||||
static void gst_replace_reset (GstAudioSink * sink);
|
static void gst_replace_reset (GstAudioSink * sink);
|
||||||
% declare-class
|
% declare-class
|
||||||
|
@ -29,45 +30,79 @@ static void gst_replace_reset (GstAudioSink * sink);
|
||||||
audio_sink_class->delay = GST_DEBUG_FUNCPTR (gst_replace_delay);
|
audio_sink_class->delay = GST_DEBUG_FUNCPTR (gst_replace_delay);
|
||||||
audio_sink_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
|
audio_sink_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
|
||||||
% methods
|
% methods
|
||||||
|
/* open the device with given specs */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_open (GstAudioSink * sink)
|
gst_replace_open (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "open");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prepare resources and state to operate with the given specs */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_prepare (GstAudioSink * sink, GstRingBufferSpec * spec)
|
gst_replace_prepare (GstAudioSink * sink, GstAudioRingBufferSpec * spec)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "prepare");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* undo anything that was done in prepare() */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_unprepare (GstAudioSink * sink)
|
gst_replace_unprepare (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "unprepare");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* close the device */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_close (GstAudioSink * sink)
|
gst_replace_close (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "close");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
/* write samples to the device */
|
||||||
|
static gint
|
||||||
gst_replace_write (GstAudioSink * sink, gpointer data, guint length)
|
gst_replace_write (GstAudioSink * sink, gpointer data, guint length)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "write");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get number of samples queued in the device */
|
||||||
static guint
|
static guint
|
||||||
gst_replace_delay (GstAudioSink * sink)
|
gst_replace_delay (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "delay");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reset the audio device, unblock from a write */
|
||||||
static void
|
static void
|
||||||
gst_replace_reset (GstAudioSink * sink)
|
gst_replace_reset (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "reset");
|
||||||
|
|
||||||
}
|
}
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -4,19 +4,19 @@ GstAudioSrc
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_AUDIO_SRC
|
GST_TYPE_AUDIO_SRC
|
||||||
% pads
|
% pads
|
||||||
srcpad-simple
|
srcpad-audio
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-audio-0.10
|
gstreamer-audio-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/audio/gstaudiosrc.h>
|
#include <gst/audio/gstaudiosrc.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static gboolean gst_replace_open (GstAudioSrc * src);
|
static gboolean gst_replace_open (GstAudioSrc * src);
|
||||||
static gboolean
|
static gboolean gst_replace_prepare (GstAudioSrc * src,
|
||||||
gst_replace_prepare (GstAudioSrc * src, GstRingBufferSpec * spec);
|
GstAudioRingBufferSpec * spec);
|
||||||
static gboolean gst_replace_unprepare (GstAudioSrc * src);
|
static gboolean gst_replace_unprepare (GstAudioSrc * src);
|
||||||
static gboolean gst_replace_close (GstAudioSrc * src);
|
static gboolean gst_replace_close (GstAudioSrc * src);
|
||||||
static guint
|
static guint gst_replace_read (GstAudioSrc * src, gpointer data, guint length,
|
||||||
gst_replace_read (GstAudioSrc * src, gpointer data, guint length);
|
GstClockTime * timestamp);
|
||||||
static guint gst_replace_delay (GstAudioSrc * src);
|
static guint gst_replace_delay (GstAudioSrc * src);
|
||||||
static void gst_replace_reset (GstAudioSrc * src);
|
static void gst_replace_reset (GstAudioSrc * src);
|
||||||
% declare-class
|
% declare-class
|
||||||
|
@ -30,45 +30,80 @@ static void gst_replace_reset (GstAudioSrc * src);
|
||||||
audio_src_class->delay = GST_DEBUG_FUNCPTR (gst_replace_delay);
|
audio_src_class->delay = GST_DEBUG_FUNCPTR (gst_replace_delay);
|
||||||
audio_src_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
|
audio_src_class->reset = GST_DEBUG_FUNCPTR (gst_replace_reset);
|
||||||
% methods
|
% methods
|
||||||
|
/* open the device with given specs */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_open (GstAudioSrc * src)
|
gst_replace_open (GstAudioSrc * src)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "open");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prepare resources and state to operate with the given specs */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_prepare (GstAudioSrc * src, GstRingBufferSpec * spec)
|
gst_replace_prepare (GstAudioSrc * src, GstAudioRingBufferSpec * spec)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "prepare");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* undo anything that was done in prepare() */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_unprepare (GstAudioSrc * src)
|
gst_replace_unprepare (GstAudioSrc * src)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "unprepare");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* close the device */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_close (GstAudioSrc * src)
|
gst_replace_close (GstAudioSrc * src)
|
||||||
{
|
{
|
||||||
return FALSE;
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "close");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* read samples from the device */
|
||||||
static guint
|
static guint
|
||||||
gst_replace_read (GstAudioSrc * src, gpointer data, guint length)
|
gst_replace_read (GstAudioSrc * src, gpointer data, guint length,
|
||||||
|
GstClockTime * timestamp)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "read");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get number of samples queued in the device */
|
||||||
static guint
|
static guint
|
||||||
gst_replace_delay (GstAudioSrc * src)
|
gst_replace_delay (GstAudioSrc * src)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "delay");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reset the audio device, unblock from a write */
|
||||||
static void
|
static void
|
||||||
gst_replace_reset (GstAudioSrc * src)
|
gst_replace_reset (GstAudioSrc * src)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "reset");
|
||||||
|
|
||||||
}
|
}
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
|
|
||||||
% copyright
|
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 2010 REAL_NAME <EMAIL_ADDRESS>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
% includes
|
|
||||||
#include <gst/gst.h>
|
|
||||||
% part2
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ARG_0
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
% end
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstBaseAudioSink
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_BASE_AUDIO_SINK
|
|
||||||
% pads
|
|
||||||
sinkpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-audio-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/audio/gstbaseaudiosink.h>
|
|
||||||
% prototypes
|
|
||||||
static GstRingBuffer *gst_replace_create_ringbuffer (GstBaseAudioSink * sink);
|
|
||||||
% declare-class
|
|
||||||
GstBaseAudioSinkClass *base_audio_sink_class = GST_BASE_AUDIO_SINK_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_audio_sink_class->create_ringbuffer = GST_DEBUG_FUNCPTR (gst_replace_create_ringbuffer);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static GstRingBuffer *
|
|
||||||
gst_replace_create_ringbuffer (GstBaseAudioSink * sink)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
% end
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstBaseAudioSrc
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_BASE_AUDIO_SRC
|
|
||||||
% pads
|
|
||||||
srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-audio-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/audio/gstbaseaudiosrc.h>
|
|
||||||
% prototypes
|
|
||||||
static GstRingBuffer *gst_replace_create_ringbuffer (GstBaseAudioSrc * src);
|
|
||||||
% declare-class
|
|
||||||
GstBaseAudioSrcClass *base_audio_src_class = GST_BASE_AUDIO_SRC_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_audio_src_class->create_ringbuffer = GST_DEBUG_FUNCPTR (gst_replace_create_ringbuffer);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static GstRingBuffer *
|
|
||||||
gst_replace_create_ringbuffer (GstBaseAudioSrc * src)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
% end
|
|
|
@ -1,76 +1,94 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
% ClassName
|
% ClassName
|
||||||
GstBaseParse
|
GstBaseParse
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_BASE_PARSE
|
GST_TYPE_BASE_PARSE
|
||||||
|
% pads
|
||||||
|
srcpad-simple
|
||||||
|
sinkpad-simple
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-base-0.10
|
gstreamer-base-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/base/gstbaseparse.h>
|
#include <gst/base/gstbaseparse.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static gboolean gst_replace_start (GstBaseParse * parse);
|
static gboolean gst_replace_start (GstBaseParse * parse);
|
||||||
static gboolean gst_replace_stop (GstBaseParse * parse);
|
static gboolean gst_replace_stop (GstBaseParse * parse);
|
||||||
static gboolean gst_replace_set_sink_caps (GstBaseParse *parse, GstCaps *caps);
|
static gboolean gst_replace_set_sink_caps (GstBaseParse * parse,
|
||||||
static gboolean gst_replace_check_valid_frame (GstBaseParse *parse,
|
GstCaps * caps);
|
||||||
GstBaseParseFrame *frame, guint *framesize, gint *skipsize);
|
static GstFlowReturn gst_replace_handle_frame (GstBaseParse * parse,
|
||||||
static GstFlowReturn gst_replace_parse_frame (GstBaseParse *parse,
|
GstBaseParseFrame * frame, gint * skipsize);
|
||||||
GstBaseParseFrame *frame);
|
|
||||||
static gboolean gst_replace_convert (GstBaseParse * parse,
|
|
||||||
GstFormat src_format, gint64 src_value, GstFormat dest_format,
|
|
||||||
gint64 * dest_value);
|
|
||||||
static gboolean gst_replace_event (GstBaseParse *parse, GstEvent *event);
|
|
||||||
static gboolean gst_replace_src_event (GstBaseParse *parse, GstEvent *event);
|
|
||||||
static GstFlowReturn gst_replace_pre_push_frame (GstBaseParse * parse,
|
static GstFlowReturn gst_replace_pre_push_frame (GstBaseParse * parse,
|
||||||
GstBaseParseFrame * frame);
|
GstBaseParseFrame * frame);
|
||||||
|
static gboolean gst_replace_convert (GstBaseParse * parse, GstFormat src_format,
|
||||||
|
gint64 src_value, GstFormat dest_format, gint64 * dest_value);
|
||||||
|
static gboolean gst_replace_sink_event (GstBaseParse * parse, GstEvent * event);
|
||||||
|
static gboolean gst_replace_src_event (GstBaseParse * parse, GstEvent * event);
|
||||||
|
static GstCaps *gst_replace_get_sink_caps (GstBaseParse * parse,
|
||||||
|
GstCaps * filter);
|
||||||
|
static GstFlowReturn gst_replace_detect (GstBaseParse * parse,
|
||||||
|
GstBuffer * buffer);
|
||||||
% declare-class
|
% declare-class
|
||||||
GstBaseParseClass *base_parse_class = GST_BASE_PARSE_CLASS (klass);
|
GstBaseParseClass *base_parse_class = GST_BASE_PARSE_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
base_parse_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
base_parse_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
||||||
base_parse_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
base_parse_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
||||||
base_parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_replace_set_sink_caps);
|
base_parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_replace_set_sink_caps);
|
||||||
base_parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_replace_check_valid_frame);
|
base_parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_replace_handle_frame);
|
||||||
base_parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_replace_parse_frame);
|
|
||||||
base_parse_class->pre_push_frame = GST_DEBUG_FUNCPTR (gst_replace_pre_push_frame);
|
base_parse_class->pre_push_frame = GST_DEBUG_FUNCPTR (gst_replace_pre_push_frame);
|
||||||
base_parse_class->convert = GST_DEBUG_FUNCPTR (gst_replace_convert);
|
base_parse_class->convert = GST_DEBUG_FUNCPTR (gst_replace_convert);
|
||||||
base_parse_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
base_parse_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event);
|
||||||
base_parse_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
|
base_parse_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event);
|
||||||
|
base_parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_replace_get_sink_caps);
|
||||||
|
base_parse_class->detect = GST_DEBUG_FUNCPTR (gst_replace_detect);
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_start (GstBaseParse * parse)
|
gst_replace_start (GstBaseParse * parse)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "start");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_stop (GstBaseParse * parse)
|
gst_replace_stop (GstBaseParse * parse)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "stop");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
|
gst_replace_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
|
||||||
{
|
{
|
||||||
/* Called when sink caps are set */
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
return TRUE;
|
|
||||||
}
|
GST_DEBUG_OBJECT (replace, "set_sink_caps");
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_check_valid_frame (GstBaseParse *parse,
|
|
||||||
GstBaseParseFrame *frame, guint *framesize, gint *skipsize)
|
|
||||||
{
|
|
||||||
/* Called when processing incoming buffers. Function should check
|
|
||||||
whether the buffer contains a valid frame */
|
|
||||||
/* MUST implement */
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_parse_frame (GstBaseParse *parse,
|
gst_replace_handle_frame (GstBaseParse * parse, GstBaseParseFrame * frame,
|
||||||
GstBaseParseFrame *frame)
|
gint * skipsize)
|
||||||
{
|
{
|
||||||
/* Called when processing incoming buffers. Function should parse
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
a checked frame. */
|
|
||||||
/* MUST implement */
|
GST_DEBUG_OBJECT (replace, "handle_frame");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "pre_push_frame");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,32 +96,50 @@ static gboolean
|
||||||
gst_replace_convert (GstBaseParse * parse, GstFormat src_format,
|
gst_replace_convert (GstBaseParse * parse, GstFormat src_format,
|
||||||
gint64 src_value, GstFormat dest_format, gint64 * dest_value)
|
gint64 src_value, GstFormat dest_format, gint64 * dest_value)
|
||||||
{
|
{
|
||||||
/* Convert between formats */
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "convert");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_event (GstBaseParse *parse, GstEvent *event)
|
gst_replace_sink_event (GstBaseParse * parse, GstEvent * event)
|
||||||
{
|
{
|
||||||
/* Sink pad event handler */
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "sink_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_src_event (GstBaseParse * parse, GstEvent * event)
|
gst_replace_src_event (GstBaseParse * parse, GstEvent * event)
|
||||||
{
|
{
|
||||||
/* Src pad event handler */
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "src_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstCaps *
|
||||||
|
gst_replace_get_sink_caps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "get_sink_caps");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_pre_push_frame (GstBaseParse *parse, GstBaseParseFrame *frame)
|
gst_replace_detect (GstBaseParse * parse, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (parse);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "detect");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstBaseRTPDepayload
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_BASE_RTP_DEPAYLOAD
|
|
||||||
% pads
|
|
||||||
sinkpad-simple srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-rtp-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/rtp/gstbasertpdepayload.h>
|
|
||||||
% prototypes
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseRTPDepayload * filter, GstCaps * caps);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_add_to_queue (GstBaseRTPDepayload * filter, GstBuffer * in);
|
|
||||||
static GstBuffer *gst_replace_process (GstBaseRTPDepayload * base,
|
|
||||||
GstBuffer * in);
|
|
||||||
static void
|
|
||||||
gst_replace_set_gst_timestamp (GstBaseRTPDepayload * filter, guint32 timestamp,
|
|
||||||
GstBuffer * buf);
|
|
||||||
static gboolean
|
|
||||||
gst_replace_packet_lost (GstBaseRTPDepayload * filter, GstEvent * event);
|
|
||||||
% declare-class
|
|
||||||
GstBaseRTPDepayloadClass *base_rtpdepayload_class = GST_BASE_RTP_DEPAYLOAD_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_rtpdepayload_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
|
||||||
base_rtpdepayload_class->add_to_queue = GST_DEBUG_FUNCPTR (gst_replace_add_to_queue);
|
|
||||||
base_rtpdepayload_class->process = GST_DEBUG_FUNCPTR (gst_replace_process);
|
|
||||||
base_rtpdepayload_class->set_gst_timestamp = GST_DEBUG_FUNCPTR (gst_replace_set_gst_timestamp);
|
|
||||||
base_rtpdepayload_class->packet_lost = GST_DEBUG_FUNCPTR (gst_replace_packet_lost);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseRTPDepayload * filter, GstCaps * caps)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_add_to_queue (GstBaseRTPDepayload * filter, GstBuffer * in)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstBuffer *
|
|
||||||
gst_replace_process (GstBaseRTPDepayload * base, GstBuffer * in)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_set_gst_timestamp (GstBaseRTPDepayload * filter, guint32 timestamp,
|
|
||||||
GstBuffer * buf)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_packet_lost (GstBaseRTPDepayload * filter, GstEvent * event)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
% end
|
|
|
@ -1,56 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstBaseRTPPayload
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_BASE_RTP_PAYLOAD
|
|
||||||
% pads
|
|
||||||
sinkpad-simple srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-rtp-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/rtp/gstbasertppayload.h>
|
|
||||||
% prototypes
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseRTPPayload * payload, GstCaps * caps);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer);
|
|
||||||
static gboolean gst_replace_handle_event (GstPad * pad, GstEvent * event);
|
|
||||||
static GstCaps *gst_replace_get_caps (GstBaseRTPPayload * payload,
|
|
||||||
GstPad * pad);
|
|
||||||
% declare-class
|
|
||||||
GstBaseRTPPayloadClass *base_rtppayload_class = GST_BASE_RTP_PAYLOAD_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_rtppayload_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
|
||||||
base_rtppayload_class->handle_buffer = GST_DEBUG_FUNCPTR (gst_replace_handle_buffer);
|
|
||||||
base_rtppayload_class->handle_event = GST_DEBUG_FUNCPTR (gst_replace_handle_event);
|
|
||||||
base_rtppayload_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseRTPPayload * payload, GstCaps * caps)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_handle_event (GstPad * pad, GstEvent * event)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstCaps *
|
|
||||||
gst_replace_get_caps (GstBaseRTPPayload * payload, GstPad * pad)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
% end
|
|
|
@ -6,85 +6,130 @@ GST_TYPE_BASE_SINK
|
||||||
% pads
|
% pads
|
||||||
sinkpad-simple
|
sinkpad-simple
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-base-0.10
|
gstreamer-base-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/base/gstbasesink.h>
|
#include <gst/base/gstbasesink.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static GstCaps *gst_replace_get_caps (GstBaseSink * sink);
|
static GstCaps *gst_replace_get_caps (GstBaseSink * sink, GstCaps * filter);
|
||||||
static gboolean gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps);
|
static gboolean gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps);
|
||||||
static GstFlowReturn
|
static GstCaps *gst_replace_fixate (GstBaseSink * sink, GstCaps * caps);
|
||||||
gst_replace_buffer_alloc (GstBaseSink * sink, guint64 offset, guint size,
|
static gboolean gst_replace_activate_pull (GstBaseSink * sink, gboolean active);
|
||||||
GstCaps * caps, GstBuffer ** buf);
|
static void gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer,
|
||||||
static void
|
|
||||||
gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer,
|
|
||||||
GstClockTime * start, GstClockTime * end);
|
GstClockTime * start, GstClockTime * end);
|
||||||
|
static gboolean gst_replace_propose_allocation (GstBaseSink * sink,
|
||||||
|
GstQuery * query);
|
||||||
static gboolean gst_replace_start (GstBaseSink * sink);
|
static gboolean gst_replace_start (GstBaseSink * sink);
|
||||||
static gboolean gst_replace_stop (GstBaseSink * sink);
|
static gboolean gst_replace_stop (GstBaseSink * sink);
|
||||||
static gboolean gst_replace_unlock (GstBaseSink * sink);
|
static gboolean gst_replace_unlock (GstBaseSink * sink);
|
||||||
static gboolean gst_replace_event (GstBaseSink * sink, GstEvent * event);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_preroll (GstBaseSink * sink, GstBuffer * buffer);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_render (GstBaseSink * sink, GstBuffer * buffer);
|
|
||||||
static GstStateChangeReturn gst_replace_async_play (GstBaseSink * sink);
|
|
||||||
static gboolean gst_replace_activate_pull (GstBaseSink * sink, gboolean active);
|
|
||||||
static void gst_replace_fixate (GstBaseSink * sink, GstCaps * caps);
|
|
||||||
static gboolean gst_replace_unlock_stop (GstBaseSink * sink);
|
static gboolean gst_replace_unlock_stop (GstBaseSink * sink);
|
||||||
static GstFlowReturn
|
static gboolean gst_replace_query (GstBaseSink * sink, GstQuery * query);
|
||||||
gst_replace_render_list (GstBaseSink * sink, GstBufferList * buffer_list);
|
static gboolean gst_replace_event (GstBaseSink * sink, GstEvent * event);
|
||||||
|
static GstFlowReturn gst_replace_wait_event (GstBaseSink * sink,
|
||||||
|
GstEvent * event);
|
||||||
|
static GstFlowReturn gst_replace_prepare (GstBaseSink * sink,
|
||||||
|
GstBuffer * buffer);
|
||||||
|
static GstFlowReturn gst_replace_prepare_list (GstBaseSink * sink,
|
||||||
|
GstBufferList * buffer_list);
|
||||||
|
static GstFlowReturn gst_replace_preroll (GstBaseSink * sink,
|
||||||
|
GstBuffer * buffer);
|
||||||
|
static GstFlowReturn gst_replace_render (GstBaseSink * sink,
|
||||||
|
GstBuffer * buffer);
|
||||||
|
static GstFlowReturn gst_replace_render_list (GstBaseSink * sink,
|
||||||
|
GstBufferList * buffer_list);
|
||||||
% declare-class
|
% declare-class
|
||||||
GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass);
|
GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
base_sink_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
base_sink_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
||||||
base_sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
base_sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
||||||
base_sink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_replace_buffer_alloc);
|
base_sink_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
||||||
|
base_sink_class->activate_pull = GST_DEBUG_FUNCPTR (gst_replace_activate_pull);
|
||||||
base_sink_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
base_sink_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
||||||
|
base_sink_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation);
|
||||||
base_sink_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
base_sink_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
||||||
base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
||||||
base_sink_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
base_sink_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
||||||
|
base_sink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
||||||
|
base_sink_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
|
||||||
base_sink_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
base_sink_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
||||||
|
base_sink_class->wait_event = GST_DEBUG_FUNCPTR (gst_replace_wait_event);
|
||||||
|
base_sink_class->prepare = GST_DEBUG_FUNCPTR (gst_replace_prepare);
|
||||||
|
base_sink_class->prepare_list = GST_DEBUG_FUNCPTR (gst_replace_prepare_list);
|
||||||
base_sink_class->preroll = GST_DEBUG_FUNCPTR (gst_replace_preroll);
|
base_sink_class->preroll = GST_DEBUG_FUNCPTR (gst_replace_preroll);
|
||||||
base_sink_class->render = GST_DEBUG_FUNCPTR (gst_replace_render);
|
base_sink_class->render = GST_DEBUG_FUNCPTR (gst_replace_render);
|
||||||
base_sink_class->async_play = GST_DEBUG_FUNCPTR (gst_replace_async_play);
|
|
||||||
base_sink_class->activate_pull = GST_DEBUG_FUNCPTR (gst_replace_activate_pull);
|
|
||||||
base_sink_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
|
||||||
base_sink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
|
||||||
base_sink_class->render_list = GST_DEBUG_FUNCPTR (gst_replace_render_list);
|
base_sink_class->render_list = GST_DEBUG_FUNCPTR (gst_replace_render_list);
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_replace_get_caps (GstBaseSink * sink)
|
gst_replace_get_caps (GstBaseSink * sink, GstCaps * filter)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "get_caps");
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* notify subclass of new caps */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps)
|
gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "set_caps");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
/* fixate sink caps during pull-mode negotiation */
|
||||||
gst_replace_buffer_alloc (GstBaseSink * sink, guint64 offset, guint size,
|
static GstCaps *
|
||||||
GstCaps * caps, GstBuffer ** buf)
|
gst_replace_fixate (GstBaseSink * sink, GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
GST_DEBUG_OBJECT (replace, "fixate");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* start or stop a pulling thread */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_activate_pull (GstBaseSink * sink, gboolean active)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "activate_pull");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the start and end times for syncing on this buffer */
|
||||||
static void
|
static void
|
||||||
gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer,
|
gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer,
|
||||||
GstClockTime * start, GstClockTime * end)
|
GstClockTime * start, GstClockTime * end)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "get_times");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* propose allocation parameters for upstream */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_propose_allocation (GstBaseSink * sink, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "propose_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start and stop processing, ideal for opening/closing the resource */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_start (GstBaseSink * sink)
|
gst_replace_start (GstBaseSink * sink)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "start");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -92,27 +137,99 @@ gst_replace_start (GstBaseSink * sink)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_stop (GstBaseSink * sink)
|
gst_replace_stop (GstBaseSink * sink)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "stop");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* unlock any pending access to the resource. subclasses should unlock
|
||||||
|
* any function ASAP. */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_unlock (GstBaseSink * sink)
|
gst_replace_unlock (GstBaseSink * sink)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "unlock");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear a previously indicated unlock request not that unlocking is
|
||||||
|
* complete. Sub-classes should clear any command queue or indicator they
|
||||||
|
* set during unlock */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_unlock_stop (GstBaseSink * sink)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "unlock_stop");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclass of query */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_query (GstBaseSink * sink, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "query");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclass of event */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_event (GstBaseSink * sink, GstEvent * event)
|
gst_replace_event (GstBaseSink * sink, GstEvent * event)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "event");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* wait for eos or gap, subclasses should chain up to parent first */
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_wait_event (GstBaseSink * sink, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "wait_event");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclass of buffer or list before doing sync */
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_prepare (GstBaseSink * sink, GstBuffer * buffer)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "prepare");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_prepare_list (GstBaseSink * sink, GstBufferList * buffer_list)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "prepare_list");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclass of preroll buffer or real buffer */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_preroll (GstBaseSink * sink, GstBuffer * buffer)
|
gst_replace_preroll (GstBaseSink * sink, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "preroll");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
@ -120,44 +237,21 @@ gst_replace_preroll (GstBaseSink * sink, GstBuffer * buffer)
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_render (GstBaseSink * sink, GstBuffer * buffer)
|
gst_replace_render (GstBaseSink * sink, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "render");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
/* Render a BufferList */
|
||||||
gst_replace_async_play (GstBaseSink * sink)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_STATE_CHANGE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_activate_pull (GstBaseSink * sink, gboolean active)
|
|
||||||
{
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_fixate (GstBaseSink * sink, GstCaps * caps)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_unlock_stop (GstBaseSink * sink)
|
|
||||||
{
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_render_list (GstBaseSink * sink, GstBufferList * buffer_list)
|
gst_replace_render_list (GstBaseSink * sink, GstBufferList * buffer_list)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "render_list");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
% end
|
% end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,60 +6,61 @@ GST_TYPE_BASE_SRC
|
||||||
% pads
|
% pads
|
||||||
srcpad-simple
|
srcpad-simple
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-base-0.10
|
gstreamer-base-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/base/gstbasesrc.h>
|
#include <gst/base/gstbasesrc.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static GstCaps *gst_replace_get_caps (GstBaseSrc * src);
|
static GstCaps *gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter);
|
||||||
static gboolean gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps);
|
|
||||||
static gboolean gst_replace_negotiate (GstBaseSrc * src);
|
static gboolean gst_replace_negotiate (GstBaseSrc * src);
|
||||||
static gboolean gst_replace_newsegment (GstBaseSrc * src);
|
static GstCaps *gst_replace_fixate (GstBaseSrc * src, GstCaps * caps);
|
||||||
|
static gboolean gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps);
|
||||||
|
static gboolean gst_replace_decide_allocation (GstBaseSrc * src,
|
||||||
|
GstQuery * query);
|
||||||
static gboolean gst_replace_start (GstBaseSrc * src);
|
static gboolean gst_replace_start (GstBaseSrc * src);
|
||||||
static gboolean gst_replace_stop (GstBaseSrc * src);
|
static gboolean gst_replace_stop (GstBaseSrc * src);
|
||||||
static void
|
static void gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
||||||
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
|
||||||
GstClockTime * start, GstClockTime * end);
|
GstClockTime * start, GstClockTime * end);
|
||||||
static gboolean gst_replace_get_size (GstBaseSrc * src, guint64 * size);
|
static gboolean gst_replace_get_size (GstBaseSrc * src, guint64 * size);
|
||||||
static gboolean gst_replace_is_seekable (GstBaseSrc * src);
|
static gboolean gst_replace_is_seekable (GstBaseSrc * src);
|
||||||
static gboolean gst_replace_unlock (GstBaseSrc * src);
|
static gboolean gst_replace_prepare_seek_segment (GstBaseSrc * src,
|
||||||
static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event);
|
GstEvent * seek, GstSegment * segment);
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_create (GstBaseSrc * src, guint64 offset, guint size,
|
|
||||||
GstBuffer ** buf);
|
|
||||||
static gboolean gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment);
|
static gboolean gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment);
|
||||||
static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query);
|
static gboolean gst_replace_unlock (GstBaseSrc * src);
|
||||||
static gboolean gst_replace_check_get_range (GstBaseSrc * src);
|
|
||||||
static void gst_replace_fixate (GstBaseSrc * src, GstCaps * caps);
|
|
||||||
static gboolean gst_replace_unlock_stop (GstBaseSrc * src);
|
static gboolean gst_replace_unlock_stop (GstBaseSrc * src);
|
||||||
static gboolean
|
static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query);
|
||||||
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event);
|
||||||
GstSegment * segment);
|
static GstFlowReturn gst_replace_create (GstBaseSrc * src, guint64 offset,
|
||||||
|
guint size, GstBuffer ** buf);
|
||||||
|
static GstFlowReturn gst_replace_alloc (GstBaseSrc * src, guint64 offset,
|
||||||
|
guint size, GstBuffer ** buf);
|
||||||
|
static GstFlowReturn gst_replace_fill (GstBaseSrc * src, guint64 offset,
|
||||||
|
guint size, GstBuffer * buf);
|
||||||
% declare-class
|
% declare-class
|
||||||
GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
|
GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
||||||
base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
|
||||||
base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
||||||
base_src_class->newsegment = GST_DEBUG_FUNCPTR (gst_replace_newsegment);
|
base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
||||||
|
base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
||||||
|
base_src_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation);
|
||||||
base_src_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
base_src_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
||||||
base_src_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
base_src_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
||||||
base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
||||||
base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_replace_get_size);
|
base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_replace_get_size);
|
||||||
base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_replace_is_seekable);
|
base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_replace_is_seekable);
|
||||||
|
base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_replace_prepare_seek_segment);
|
||||||
|
base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_replace_do_seek);
|
||||||
base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
||||||
|
base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
||||||
|
base_src_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
|
||||||
base_src_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
base_src_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
||||||
base_src_class->create = GST_DEBUG_FUNCPTR (gst_replace_create);
|
base_src_class->create = GST_DEBUG_FUNCPTR (gst_replace_create);
|
||||||
base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_replace_do_seek);
|
base_src_class->alloc = GST_DEBUG_FUNCPTR (gst_replace_alloc);
|
||||||
base_src_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
|
base_src_class->fill = GST_DEBUG_FUNCPTR (gst_replace_fill);
|
||||||
base_src_class->check_get_range = GST_DEBUG_FUNCPTR (gst_replace_check_get_range);
|
|
||||||
base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
|
||||||
base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
|
||||||
base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_replace_prepare_seek_segment);
|
|
||||||
|
|
||||||
% methods
|
% methods
|
||||||
|
/* get caps from subclass */
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_replace_get_caps (GstBaseSrc * src)
|
gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter)
|
||||||
{
|
{
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
@ -68,16 +69,7 @@ gst_replace_get_caps (GstBaseSrc * src)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/* decide on caps */
|
||||||
gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "set_caps");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_negotiate (GstBaseSrc * src)
|
gst_replace_negotiate (GstBaseSrc * src)
|
||||||
{
|
{
|
||||||
|
@ -88,16 +80,40 @@ gst_replace_negotiate (GstBaseSrc * src)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/* called if, in negotiation, caps need fixating */
|
||||||
gst_replace_newsegment (GstBaseSrc * src)
|
static GstCaps *
|
||||||
|
gst_replace_fixate (GstBaseSrc * src, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "newsegment");
|
GST_DEBUG_OBJECT (replace, "fixate");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify the subclass of new caps */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "set_caps");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* setup allocation query */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_decide_allocation (GstBaseSrc * src, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "decide_allocation");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start and stop processing, ideal for opening/closing the resource */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_start (GstBaseSrc * src)
|
gst_replace_start (GstBaseSrc * src)
|
||||||
{
|
{
|
||||||
|
@ -118,6 +134,8 @@ gst_replace_stop (GstBaseSrc * src)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* given a buffer, return start and stop time when it should be pushed
|
||||||
|
* out. The base class will sync on the clock using these times. */
|
||||||
static void
|
static void
|
||||||
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
||||||
GstClockTime * start, GstClockTime * end)
|
GstClockTime * start, GstClockTime * end)
|
||||||
|
@ -125,8 +143,10 @@ gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_times");
|
GST_DEBUG_OBJECT (replace, "get_times");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get the total size of the resource in bytes */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_get_size (GstBaseSrc * src, guint64 * size)
|
gst_replace_get_size (GstBaseSrc * src, guint64 * size)
|
||||||
{
|
{
|
||||||
|
@ -137,6 +157,7 @@ gst_replace_get_size (GstBaseSrc * src, guint64 * size)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if the resource is seekable */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_is_seekable (GstBaseSrc * src)
|
gst_replace_is_seekable (GstBaseSrc * src)
|
||||||
{
|
{
|
||||||
|
@ -144,9 +165,35 @@ gst_replace_is_seekable (GstBaseSrc * src)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "is_seekable");
|
GST_DEBUG_OBJECT (replace, "is_seekable");
|
||||||
|
|
||||||
return FALSE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Prepare the segment on which to perform do_seek(), converting to the
|
||||||
|
* current basesrc format. */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
||||||
|
GstSegment * segment)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "prepare_seek_segment");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclasses of a seek */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "do_seek");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* unlock any pending access to the resource. subclasses should unlock
|
||||||
|
* any function ASAP. */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_unlock (GstBaseSrc * src)
|
gst_replace_unlock (GstBaseSrc * src)
|
||||||
{
|
{
|
||||||
|
@ -157,22 +204,41 @@ gst_replace_unlock (GstBaseSrc * src)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear any pending unlock request, as we succeeded in unlocking */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_unlock_stop (GstBaseSrc * src)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "unlock_stop");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclasses of a query */
|
||||||
|
static gboolean
|
||||||
|
gst_replace_query (GstBaseSrc * src, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "query");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notify subclasses of an event */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_event (GstBaseSrc * src, GstEvent * event)
|
gst_replace_event (GstBaseSrc * src, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
gboolean ret;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "event");
|
GST_DEBUG_OBJECT (replace, "event");
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
return TRUE;
|
||||||
default:
|
|
||||||
ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ask the subclass to create a buffer with offset and size, the default
|
||||||
|
* implementation will call alloc and fill. */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_create (GstBaseSrc * src, guint64 offset, guint size,
|
gst_replace_create (GstBaseSrc * src, guint64 offset, guint size,
|
||||||
GstBuffer ** buf)
|
GstBuffer ** buf)
|
||||||
|
@ -184,68 +250,27 @@ gst_replace_create (GstBaseSrc * src, guint64 offset, guint size,
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/* ask the subclass to allocate an output buffer. The default implementation
|
||||||
gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment)
|
* will use the negotiated allocator. */
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_alloc (GstBaseSrc * src, guint64 offset, guint size,
|
||||||
|
GstBuffer ** buf)
|
||||||
{
|
{
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "do_seek");
|
GST_DEBUG_OBJECT (replace, "alloc");
|
||||||
|
|
||||||
return FALSE;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/* ask the subclass to fill the buffer with data from offset and size */
|
||||||
gst_replace_query (GstBaseSrc * src, GstQuery * query)
|
static GstFlowReturn
|
||||||
{
|
gst_replace_fill (GstBaseSrc * src, guint64 offset, guint size, GstBuffer * buf)
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
gboolean ret;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "query");
|
|
||||||
|
|
||||||
switch (GST_QUERY_TYPE (query)) {
|
|
||||||
default:
|
|
||||||
ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_check_get_range (GstBaseSrc * src)
|
|
||||||
{
|
{
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
GstReplace *replace = GST_REPLACE (src);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_range");
|
GST_DEBUG_OBJECT (replace, "fill");
|
||||||
|
|
||||||
return FALSE;
|
return GST_FLOW_OK;
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_fixate (GstBaseSrc * src, GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "fixate");
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_unlock_stop (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "stop");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
|
||||||
GstSegment * segment)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "seek_segment");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -4,34 +4,32 @@ GstBaseTransform
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_BASE_TRANSFORM
|
GST_TYPE_BASE_TRANSFORM
|
||||||
% pads
|
% pads
|
||||||
sinkpad-simple srcpad-simple
|
srcpad-simple
|
||||||
|
sinkpad-simple
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-base-1.0
|
gstreamer-base-1.0
|
||||||
% pads
|
|
||||||
sinkpad-simple srcpad-simple
|
|
||||||
% includes
|
% includes
|
||||||
#include <gst/base/gstbasetransform.h>
|
#include <gst/base/gstbasetransform.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static GstCaps *gst_replace_transform_caps (GstBaseTransform * trans,
|
static GstCaps *gst_replace_transform_caps (GstBaseTransform * trans,
|
||||||
GstPadDirection direction, GstCaps * caps, GstCaps * filter);
|
GstPadDirection direction, GstCaps * caps, GstCaps * filter);
|
||||||
static GstCaps *
|
static GstCaps *gst_replace_fixate_caps (GstBaseTransform * trans,
|
||||||
gst_replace_fixate_caps (GstBaseTransform * trans,
|
|
||||||
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
|
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
|
||||||
static gboolean gst_replace_accept_caps (GstBaseTransform * trans,
|
static gboolean gst_replace_accept_caps (GstBaseTransform * trans,
|
||||||
GstPadDirection direction, GstCaps * caps);
|
GstPadDirection direction, GstCaps * caps);
|
||||||
static gboolean gst_replace_set_caps (GstBaseTransform *trans, GstCaps *incaps,
|
static gboolean gst_replace_set_caps (GstBaseTransform * trans,
|
||||||
GstCaps *outcaps);
|
GstCaps * incaps, GstCaps * outcaps);
|
||||||
static gboolean gst_replace_query (GstBaseTransform *trans, GstPadDirection direction,
|
static gboolean gst_replace_query (GstBaseTransform * trans,
|
||||||
GstQuery *query);
|
GstPadDirection direction, GstQuery * query);
|
||||||
static gboolean gst_replace_decide_allocation (GstBaseTransform * trans,
|
static gboolean gst_replace_decide_allocation (GstBaseTransform * trans,
|
||||||
GstQuery * query);
|
GstQuery * query);
|
||||||
static gboolean gst_replace_filter_meta (GstBaseTransform *trans, GstQuery *query,
|
static gboolean gst_replace_filter_meta (GstBaseTransform * trans,
|
||||||
GType api, const GstStructure *params);
|
GstQuery * query, GType api, const GstStructure * params);
|
||||||
static gboolean gst_replace_propose_allocation (GstBaseTransform * trans,
|
static gboolean gst_replace_propose_allocation (GstBaseTransform * trans,
|
||||||
GstQuery * decide_query, GstQuery * query);
|
GstQuery * decide_query, GstQuery * query);
|
||||||
static gboolean gst_replace_transform_size (GstBaseTransform * trans,
|
static gboolean gst_replace_transform_size (GstBaseTransform * trans,
|
||||||
GstPadDirection direction,
|
GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps,
|
||||||
GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize);
|
gsize * othersize);
|
||||||
static gboolean gst_replace_get_unit_size (GstBaseTransform * trans,
|
static gboolean gst_replace_get_unit_size (GstBaseTransform * trans,
|
||||||
GstCaps * caps, gsize * size);
|
GstCaps * caps, gsize * size);
|
||||||
static gboolean gst_replace_start (GstBaseTransform * trans);
|
static gboolean gst_replace_start (GstBaseTransform * trans);
|
||||||
|
@ -40,19 +38,18 @@ static gboolean gst_replace_sink_event (GstBaseTransform * trans,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
static gboolean gst_replace_src_event (GstBaseTransform * trans,
|
static gboolean gst_replace_src_event (GstBaseTransform * trans,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
static GstFlowReturn gst_replace_prepare_output_buffer (
|
static GstFlowReturn gst_replace_prepare_output_buffer (GstBaseTransform *
|
||||||
GstBaseTransform * trans, GstBuffer *input, GstBuffer **outbuf);
|
trans, GstBuffer * input, GstBuffer ** outbuf);
|
||||||
static gboolean gst_replace_copy_metadata (GstBaseTransform * trans,
|
static gboolean gst_replace_copy_metadata (GstBaseTransform * trans,
|
||||||
GstBuffer * input, GstBuffer * outbuf);
|
GstBuffer * input, GstBuffer * outbuf);
|
||||||
static gboolean gst_replace_transform_meta (GstBaseTransform * trans,
|
static gboolean gst_replace_transform_meta (GstBaseTransform * trans,
|
||||||
GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf);
|
GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf);
|
||||||
static void
|
static void gst_replace_before_transform (GstBaseTransform * trans,
|
||||||
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer);
|
GstBuffer * buffer);
|
||||||
static GstFlowReturn
|
static GstFlowReturn gst_replace_transform (GstBaseTransform * trans,
|
||||||
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
|
GstBuffer * inbuf, GstBuffer * outbuf);
|
||||||
GstBuffer * outbuf);
|
static GstFlowReturn gst_replace_transform_ip (GstBaseTransform * trans,
|
||||||
static GstFlowReturn
|
GstBuffer * buf);
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
|
|
||||||
% declare-class
|
% declare-class
|
||||||
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
|
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
|
@ -77,27 +74,36 @@ gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
|
||||||
base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_replace_transform);
|
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->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_replace_transform_caps (GstBaseTransform *trans,
|
gst_replace_transform_caps (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstPadDirection direction, GstCaps *caps, GstCaps *filter)
|
GstCaps * caps, GstCaps * filter)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "transform_caps");
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_replace_fixate_caps (GstBaseTransform * trans,
|
gst_replace_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
|
GstCaps * caps, GstCaps * othercaps)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "fixate_caps");
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_accept_caps (GstBaseTransform *trans,
|
gst_replace_accept_caps (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstPadDirection direction, GstCaps *caps)
|
GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "accept_caps");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,106 +111,153 @@ static gboolean
|
||||||
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
|
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
|
||||||
GstCaps * outcaps)
|
GstCaps * outcaps)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "set_caps");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_query (GstBaseTransform * trans, GstPadDirection direction,
|
gst_replace_query (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstQuery * query)
|
GstQuery * query)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "query");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* decide allocation query for output buffers */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
gst_replace_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "decide_allocation");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_filter_meta (GstBaseTransform *trans, GstQuery *query,
|
gst_replace_filter_meta (GstBaseTransform * trans, GstQuery * query, GType api,
|
||||||
GType api, const GstStructure *params)
|
const GstStructure * params)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "filter_meta");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* propose allocation query parameters for input buffers */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_propose_allocation (GstBaseTransform * trans,
|
gst_replace_propose_allocation (GstBaseTransform * trans,
|
||||||
GstQuery * decide_query, GstQuery * query)
|
GstQuery * decide_query, GstQuery * query)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "propose_allocation");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* transform size */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_transform_size (GstBaseTransform * trans,
|
gst_replace_transform_size (GstBaseTransform * trans, GstPadDirection direction,
|
||||||
GstPadDirection direction,
|
|
||||||
GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
|
GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "transform_size");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
|
gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
|
||||||
gsize * size)
|
gsize * size)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "get_unit_size");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* states */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_start (GstBaseTransform * trans)
|
gst_replace_start (GstBaseTransform * trans)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return FALSE;
|
GST_DEBUG_OBJECT (replace, "start");
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_sink_event (GstBaseTransform * trans, GstEvent * event)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_src_event (GstBaseTransform * trans, GstEvent * event)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_prepare_output_buffer (GstBaseTransform * trans,
|
|
||||||
GstBuffer * input, GstBuffer ** buf)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_copy_metadata (GstBaseTransform *trans,
|
|
||||||
GstBuffer *input, GstBuffer *outbuf)
|
|
||||||
{
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_transform_meta (GstBaseTransform *trans,
|
gst_replace_stop (GstBaseTransform * trans)
|
||||||
GstBuffer *outbuf, GstMeta *meta, GstBuffer *inbuf)
|
|
||||||
{
|
{
|
||||||
|
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 TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_replace_src_event (GstBaseTransform * trans, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "src_event");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -212,22 +265,31 @@ gst_replace_transform_meta (GstBaseTransform *trans,
|
||||||
static void
|
static void
|
||||||
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer)
|
gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "before_transform");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* transform */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
|
gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
|
||||||
GstBuffer * outbuf)
|
GstBuffer * outbuf)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
GST_DEBUG_OBJECT (replace, "transform");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
|
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (trans);
|
||||||
|
|
||||||
return GST_FLOW_ERROR;
|
GST_DEBUG_OBJECT (replace, "transform_ip");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstCddaBaseSrc
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_CDDA_BASE_SRC
|
|
||||||
% pads
|
|
||||||
srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-cdda-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/cdda/gstcddabasesrc.h>
|
|
||||||
% prototypes
|
|
||||||
static gboolean gst_replace_open (GstCddaBaseSrc * src, const gchar * device);
|
|
||||||
static void gst_replace_close (GstCddaBaseSrc * src);
|
|
||||||
static GstBuffer *gst_replace_read_sector (GstCddaBaseSrc * src, gint sector);
|
|
||||||
static gchar *gst_replace_get_default_device (GstCddaBaseSrc * src);
|
|
||||||
static gchar **gst_replace_probe_devices (GstCddaBaseSrc * src);
|
|
||||||
% declare-class
|
|
||||||
GstCddaBaseSrcClass *cddabase_src_class = GST_CDDA_BASE_SRC_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
cddabase_src_class->open = GST_DEBUG_FUNCPTR (gst_replace_open);
|
|
||||||
cddabase_src_class->close = GST_DEBUG_FUNCPTR (gst_replace_close);
|
|
||||||
cddabase_src_class->read_sector = GST_DEBUG_FUNCPTR (gst_replace_read_sector);
|
|
||||||
cddabase_src_class->get_default_device = GST_DEBUG_FUNCPTR (gst_replace_get_default_device);
|
|
||||||
cddabase_src_class->probe_devices = GST_DEBUG_FUNCPTR (gst_replace_probe_devices);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_open (GstCddaBaseSrc * src, const gchar * device)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_close (GstCddaBaseSrc * src)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstBuffer *
|
|
||||||
gst_replace_read_sector (GstCddaBaseSrc * src, gint sector)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gchar *
|
|
||||||
gst_replace_get_default_device (GstCddaBaseSrc * src)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gchar **
|
|
||||||
gst_replace_probe_devices (GstCddaBaseSrc * src)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
% end
|
|
|
@ -6,7 +6,7 @@ GST_TYPE_ELEMENT
|
||||||
% pads
|
% pads
|
||||||
sinkpad srcpad
|
sinkpad srcpad
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-0.10
|
gstreamer-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
|
|
|
@ -26,7 +26,9 @@ void
|
||||||
gst_replace_set_property (GObject * object, guint property_id,
|
gst_replace_set_property (GObject * object, guint property_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (object); */
|
GstReplace *replace = GST_REPLACE (object);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "set_property");
|
||||||
|
|
||||||
switch (property_id) {
|
switch (property_id) {
|
||||||
default:
|
default:
|
||||||
|
@ -39,7 +41,9 @@ void
|
||||||
gst_replace_get_property (GObject * object, guint property_id,
|
gst_replace_get_property (GObject * object, guint property_id,
|
||||||
GValue * value, GParamSpec * pspec)
|
GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (object); */
|
GstReplace *replace = GST_REPLACE (object);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "get_property");
|
||||||
|
|
||||||
switch (property_id) {
|
switch (property_id) {
|
||||||
default:
|
default:
|
||||||
|
@ -51,7 +55,9 @@ gst_replace_get_property (GObject * object, guint property_id,
|
||||||
void
|
void
|
||||||
gst_replace_dispose (GObject * object)
|
gst_replace_dispose (GObject * object)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (object); */
|
GstReplace *replace = GST_REPLACE (object);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "dispose");
|
||||||
|
|
||||||
/* clean up as possible. may be called multiple times */
|
/* clean up as possible. may be called multiple times */
|
||||||
|
|
||||||
|
@ -61,7 +67,9 @@ gst_replace_dispose (GObject * object)
|
||||||
void
|
void
|
||||||
gst_replace_finalize (GObject * object)
|
gst_replace_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (object); */
|
GstReplace *replace = GST_REPLACE (object);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "finalize");
|
||||||
|
|
||||||
/* clean up object here */
|
/* clean up object here */
|
||||||
|
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstPushSrc
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_PUSH_SRC
|
|
||||||
% pads
|
|
||||||
srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-base-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/base/gstpushsrc.h>
|
|
||||||
% prototypes
|
|
||||||
static GstCaps *gst_replace_get_caps (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps);
|
|
||||||
static gboolean gst_replace_negotiate (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_newsegment (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_start (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_stop (GstBaseSrc * src);
|
|
||||||
static void
|
|
||||||
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
|
||||||
GstClockTime * start, GstClockTime * end);
|
|
||||||
static gboolean gst_replace_get_size (GstBaseSrc * src, guint64 * size);
|
|
||||||
static gboolean gst_replace_is_seekable (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_unlock (GstBaseSrc * src);
|
|
||||||
static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event);
|
|
||||||
static gboolean gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment);
|
|
||||||
static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query);
|
|
||||||
static gboolean gst_replace_check_get_range (GstBaseSrc * src);
|
|
||||||
static void gst_replace_fixate (GstBaseSrc * src, GstCaps * caps);
|
|
||||||
static gboolean gst_replace_unlock_stop (GstBaseSrc * src);
|
|
||||||
static gboolean
|
|
||||||
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
|
||||||
GstSegment * segment);
|
|
||||||
static GstFlowReturn gst_replace_create (GstPushSrc * src, GstBuffer ** buf);
|
|
||||||
% declare-class
|
|
||||||
GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
|
|
||||||
GstPushSrcClass *push_src_class = GST_PUSH_SRC_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps);
|
|
||||||
base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
|
||||||
base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate);
|
|
||||||
base_src_class->newsegment = GST_DEBUG_FUNCPTR (gst_replace_newsegment);
|
|
||||||
base_src_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
|
||||||
base_src_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
|
||||||
base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times);
|
|
||||||
base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_replace_get_size);
|
|
||||||
base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_replace_is_seekable);
|
|
||||||
base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock);
|
|
||||||
base_src_class->event = GST_DEBUG_FUNCPTR (gst_replace_event);
|
|
||||||
base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_replace_do_seek);
|
|
||||||
base_src_class->query = GST_DEBUG_FUNCPTR (gst_replace_query);
|
|
||||||
base_src_class->check_get_range = GST_DEBUG_FUNCPTR (gst_replace_check_get_range);
|
|
||||||
base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate);
|
|
||||||
base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop);
|
|
||||||
base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_replace_prepare_seek_segment);
|
|
||||||
|
|
||||||
push_src_class->create = GST_DEBUG_FUNCPTR (gst_replace_create);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static GstCaps *
|
|
||||||
gst_replace_get_caps (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_caps");
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "set_caps");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_negotiate (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "negotiate");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_newsegment (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "newsegment");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_start (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "start");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "stop");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer,
|
|
||||||
GstClockTime * start, GstClockTime * end)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_times");
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_get_size (GstBaseSrc * src, guint64 * size)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_size");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_is_seekable (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "is_seekable");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_unlock (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "unlock");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_event (GstBaseSrc * src, GstEvent * event)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "event");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "do_seek");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_query (GstBaseSrc * src, GstQuery * query)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "query");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_check_get_range (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "get_range");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_replace_fixate (GstBaseSrc * src, GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "fixate");
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_unlock_stop (GstBaseSrc * src)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "stop");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
|
|
||||||
GstSegment * segment)
|
|
||||||
{
|
|
||||||
GstReplace *replace = GST_REPLACE (src);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (replace, "seek_segment");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_create (GstPushSrc * src, GstBuffer ** buf)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
% end
|
|
||||||
|
|
26
tools/element-templates/sinkpad-audio
Normal file
26
tools/element-templates/sinkpad-audio
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
|
|
||||||
|
% instance-members
|
||||||
|
GstPad *sinkpad;
|
||||||
|
% prototypes
|
||||||
|
% pad-template
|
||||||
|
/* FIXME add/remove the formats that you want to support */
|
||||||
|
static GstStaticPadTemplate gst_replace_sink_template =
|
||||||
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
|
GST_PAD_SINK,
|
||||||
|
GST_PAD_ALWAYS,
|
||||||
|
GST_STATIC_CAPS ("audio/x-raw,format=S16LE,rate=[1,max],"
|
||||||
|
"channels=[1,max],layout=interleaved")
|
||||||
|
);
|
||||||
|
|
||||||
|
% base-init
|
||||||
|
gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
|
||||||
|
gst_static_pad_template_get (&gst_replace_sink_template));
|
||||||
|
% instance-init
|
||||||
|
|
||||||
|
replace->sinkpad = gst_pad_new_from_static_template (&gst_replace_sink_template
|
||||||
|
,
|
||||||
|
"sink");
|
||||||
|
% methods
|
||||||
|
% end
|
||||||
|
|
26
tools/element-templates/srcpad-audio
Normal file
26
tools/element-templates/srcpad-audio
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
|
|
||||||
|
% instance-members
|
||||||
|
GstPad *srcpad;
|
||||||
|
% prototypes
|
||||||
|
% pad-template
|
||||||
|
/* FIXME add/remove the formats that you want to support */
|
||||||
|
static GstStaticPadTemplate gst_replace_src_template =
|
||||||
|
GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
|
GST_PAD_SRC,
|
||||||
|
GST_PAD_ALWAYS,
|
||||||
|
GST_STATIC_CAPS ("audio/x-raw,format=S16LE,rate=[1,max],"
|
||||||
|
"channels=[1,max],layout=interleaved")
|
||||||
|
);
|
||||||
|
|
||||||
|
% base-init
|
||||||
|
gst_element_class_add_pad_template (GST_ELEMENT_CLASS(klass),
|
||||||
|
gst_static_pad_template_get (&gst_replace_src_template));
|
||||||
|
% instance-init
|
||||||
|
|
||||||
|
replace->srcpad = gst_pad_new_from_static_template (&gst_replace_src_template
|
||||||
|
,
|
||||||
|
"src");
|
||||||
|
% methods
|
||||||
|
% end
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstTagDemux
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_TAG_DEMUX
|
|
||||||
% pads
|
|
||||||
sinkpad-simple srcpad-simple
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-tag-0.10
|
|
||||||
% includes
|
|
||||||
#include <gst/tag/gsttagdemux.h>
|
|
||||||
% prototypes
|
|
||||||
static gboolean
|
|
||||||
gst_replace_identify_tag (GstTagDemux * demux,
|
|
||||||
GstBuffer * buffer, gboolean start_tag, guint * tag_size);
|
|
||||||
static GstTagDemuxResult
|
|
||||||
gst_replace_parse_tag (GstTagDemux * demux,
|
|
||||||
GstBuffer * buffer,
|
|
||||||
gboolean start_tag, guint * tag_size, GstTagList ** tags);
|
|
||||||
static GstTagList *gst_replace_merge_tags (GstTagDemux * demux,
|
|
||||||
const GstTagList * start_tags, const GstTagList * end_tags);
|
|
||||||
% declare-class
|
|
||||||
GstTagDemuxClass *tagdemux_class = GST_TAG_DEMUX_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
tagdemux_class->identify_tag = GST_DEBUG_FUNCPTR (gst_replace_identify_tag);
|
|
||||||
tagdemux_class->parse_tag = GST_DEBUG_FUNCPTR (gst_replace_parse_tag);
|
|
||||||
tagdemux_class->merge_tags = GST_DEBUG_FUNCPTR (gst_replace_merge_tags);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_identify_tag (GstTagDemux * demux,
|
|
||||||
GstBuffer * buffer, gboolean start_tag, guint * tag_size)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstTagDemuxResult
|
|
||||||
gst_replace_parse_tag (GstTagDemux * demux,
|
|
||||||
GstBuffer * buffer,
|
|
||||||
gboolean start_tag, guint * tag_size, GstTagList ** tags)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_TAG_DEMUX_RESULT_BROKEN_TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstTagList *
|
|
||||||
gst_replace_merge_tags (GstTagDemux * demux,
|
|
||||||
const GstTagList * start_tags, const GstTagList * end_tags)
|
|
||||||
{
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
% end
|
|
194
tools/element-templates/videodecoder
Normal file
194
tools/element-templates/videodecoder
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
/* 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
|
184
tools/element-templates/videoencoder
Normal file
184
tools/element-templates/videoencoder
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
/* vim: set filetype=c: */
|
||||||
|
% ClassName
|
||||||
|
GstVideoEncoder
|
||||||
|
% TYPE_CLASS_NAME
|
||||||
|
GST_TYPE_VIDEO_ENCODER
|
||||||
|
% pads
|
||||||
|
srcpad-template-video
|
||||||
|
sinkpad-simple
|
||||||
|
% 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 TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
|
@ -4,75 +4,57 @@ GstVideoFilter
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_VIDEO_FILTER
|
GST_TYPE_VIDEO_FILTER
|
||||||
% pads
|
% pads
|
||||||
sinkpad-template-video srcpad-template-video
|
srcpad-template-video
|
||||||
|
sinkpad-template-video
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-video-0.10
|
gstreamer-video-1.0
|
||||||
% includes
|
% includes
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
#include <gst/video/gstvideofilter.h>
|
#include <gst/video/gstvideofilter.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
static gboolean
|
static gboolean gst_replace_set_info (GstVideoFilter * filter, GstCaps * incaps,
|
||||||
gst_replace_start (GstBaseTransform * trans);
|
GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info);
|
||||||
static gboolean
|
static GstFlowReturn gst_replace_transform_frame (GstVideoFilter * filter,
|
||||||
gst_replace_stop (GstBaseTransform * trans);
|
GstVideoFrame * inframe, GstVideoFrame * outframe);
|
||||||
static GstFlowReturn
|
static GstFlowReturn gst_replace_transform_frame_ip (GstVideoFilter * filter,
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf);
|
GstVideoFrame * frame);
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
|
|
||||||
GstCaps * outcaps);
|
|
||||||
% declare-class
|
% declare-class
|
||||||
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
|
GstVideoFilterClass *video_filter_class = GST_VIDEO_FILTER_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
video_filter_class->set_info = GST_DEBUG_FUNCPTR (gst_replace_set_info);
|
||||||
base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
video_filter_class->transform_frame = GST_DEBUG_FUNCPTR (gst_replace_transform_frame);
|
||||||
base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps);
|
video_filter_class->transform_frame_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_frame_ip);
|
||||||
base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip);
|
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_replace_start (GstBaseTransform * trans)
|
gst_replace_set_info (GstVideoFilter * filter, GstCaps * incaps,
|
||||||
|
GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
GstReplace *replace = GST_REPLACE (filter);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "set_info");
|
||||||
|
|
||||||
/* initialize processing */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
|
||||||
|
|
||||||
/* finalize processing */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps,
|
|
||||||
GstCaps * outcaps)
|
|
||||||
{
|
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
|
||||||
GstVideoFormat video_format;
|
|
||||||
int w, h;
|
|
||||||
|
|
||||||
/* parse input caps, output caps are the same so we ignore them */
|
|
||||||
if (!gst_video_format_parse_caps (incaps, &video_format, &w, &h))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* You'll need to add those fields to the instance struct first */
|
|
||||||
/* replace->video_format = video_format; */
|
|
||||||
/* replace->width = w; */
|
|
||||||
/* replace->height = h; */
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* transform */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
|
gst_replace_transform_frame (GstVideoFilter * filter, GstVideoFrame * inframe,
|
||||||
|
GstVideoFrame * outframe)
|
||||||
{
|
{
|
||||||
/* GstReplace *replace = GST_REPLACE (trans); */
|
GstReplace *replace = GST_REPLACE (filter);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "transform_frame");
|
||||||
|
|
||||||
/* process the video data in the buffer in-place */
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_replace_transform_frame_ip (GstVideoFilter * filter, GstVideoFrame * frame)
|
||||||
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (filter);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "transform_frame_ip");
|
||||||
|
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
}
|
||||||
% end
|
% end
|
||||||
|
|
|
@ -1,67 +0,0 @@
|
||||||
/* vim: set filetype=c: */
|
|
||||||
% ClassName
|
|
||||||
GstVideoFilter2
|
|
||||||
% TYPE_CLASS_NAME
|
|
||||||
GST_TYPE_VIDEO_FILTER2
|
|
||||||
% pads
|
|
||||||
% pkg-config
|
|
||||||
gstreamer-base-0.10
|
|
||||||
% pads
|
|
||||||
% includes
|
|
||||||
#include <gst/base/gstbasetransform.h>
|
|
||||||
#include <gst/video/video.h>
|
|
||||||
#include "../gst/videofilters/gstvideofilter2.h"
|
|
||||||
% prototypes
|
|
||||||
static gboolean gst_replace_start (GstBaseTransform * trans);
|
|
||||||
static gboolean gst_replace_stop (GstBaseTransform * trans);
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_prefilter (GstVideoFilter2 *videofilter2, GstBuffer * buf);
|
|
||||||
|
|
||||||
static GstVideoFilter2Functions gst_replace_filter_functions[];
|
|
||||||
% declare-class
|
|
||||||
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
|
|
||||||
GstVideoFilter2Class *video_filter2_class = GST_VIDEO_FILTER2_CLASS (klass);
|
|
||||||
% set-methods
|
|
||||||
base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start);
|
|
||||||
base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop);
|
|
||||||
video_filter2_class->prefilter = GST_DEBUG_FUNCPTR (gst_replace_prefilter);
|
|
||||||
|
|
||||||
gst_video_filter2_class_add_functions (video_filter2_class,
|
|
||||||
gst_replace_filter_functions);
|
|
||||||
% methods
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_start (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_replace_stop (GstBaseTransform * trans)
|
|
||||||
{
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_prefilter (GstVideoFilter2 *video_filter2, GstBuffer * buf)
|
|
||||||
{
|
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
|
||||||
gst_replace_filter_ip_I420 (GstVideoFilter2 * videofilter2,
|
|
||||||
GstBuffer * buf, int start, int end)
|
|
||||||
{
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstVideoFilter2Functions gst_replace_filter_functions[] = {
|
|
||||||
{GST_VIDEO_FORMAT_I420, NULL, gst_replace_filter_ip_I420},
|
|
||||||
{GST_VIDEO_FORMAT_UNKNOWN}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
% end
|
|
|
@ -4,29 +4,27 @@ GstVideoSink
|
||||||
% TYPE_CLASS_NAME
|
% TYPE_CLASS_NAME
|
||||||
GST_TYPE_VIDEO_SINK
|
GST_TYPE_VIDEO_SINK
|
||||||
% pads
|
% pads
|
||||||
sinkpad-simple
|
sinkpad-template-video
|
||||||
% pkg-config
|
% pkg-config
|
||||||
gstreamer-video-0.10
|
gstreamer-video-1.0
|
||||||
% includes
|
% includes
|
||||||
|
#include <gst/video/video.h>
|
||||||
#include <gst/video/gstvideosink.h>
|
#include <gst/video/gstvideosink.h>
|
||||||
% prototypes
|
% prototypes
|
||||||
|
static GstFlowReturn gst_replace_show_frame (GstVideoSink * video_sink,
|
||||||
static GstFlowReturn
|
GstBuffer * buf);
|
||||||
gst_replace_show_frame (GstVideoSink * video_sink, GstBuffer * buf);
|
|
||||||
|
|
||||||
|
|
||||||
% declare-class
|
% declare-class
|
||||||
GstVideoSinkClass *video_sink_class = GST_VIDEO_SINK_CLASS (klass);
|
GstVideoSinkClass *video_sink_class = GST_VIDEO_SINK_CLASS (klass);
|
||||||
% set-methods
|
% set-methods
|
||||||
video_sink_class->show_frame = GST_DEBUG_FUNCPTR (gst_replace_show_frame);
|
video_sink_class->show_frame = GST_DEBUG_FUNCPTR (gst_replace_show_frame);
|
||||||
% methods
|
% methods
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_replace_show_frame (GstVideoSink * video_sink, GstBuffer * buf)
|
gst_replace_show_frame (GstVideoSink * sink, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
|
GstReplace *replace = GST_REPLACE (sink);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (replace, "show_frame");
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
% end
|
% end
|
||||||
|
|
||||||
|
|
|
@ -233,10 +233,16 @@ static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* FIXME Remember to set the rank if it's an element that is meant
|
||||||
|
to be autoplugged by decodebin. */
|
||||||
return gst_element_register (plugin, "replace", GST_RANK_NONE,
|
return gst_element_register (plugin, "replace", GST_RANK_NONE,
|
||||||
GST_TYPE_REPLACE);
|
GST_TYPE_REPLACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: these are normally defined by the GStreamer build system.
|
||||||
|
If you are creating an element to be included in gst-plugins-*,
|
||||||
|
remove these, as they're always defined. Otherwise, edit as
|
||||||
|
appropriate for your external plugin package. */
|
||||||
#ifndef VERSION
|
#ifndef VERSION
|
||||||
#define VERSION "0.0.FIXME"
|
#define VERSION "0.0.FIXME"
|
||||||
#endif
|
#endif
|
||||||
|
@ -371,7 +377,7 @@ gst-indent $gstreplace.c
|
||||||
|
|
||||||
echo pkg is $pkg
|
echo pkg is $pkg
|
||||||
|
|
||||||
gcc -Wall -fPIC $CPPFLAGS $(pkg-config --cflags gstreamer-1.0 $pkg) -c -o $gstreplace.o $gstreplace.c
|
gcc -Wall -Werror -fPIC $CPPFLAGS $(pkg-config --cflags gstreamer-1.0 $pkg) -c -o $gstreplace.o $gstreplace.c
|
||||||
if test $? -ne 0; then
|
if test $? -ne 0; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in a new issue