/* vim: set filetype=c: */ % ClassName GstBaseSink % TYPE_CLASS_NAME GST_TYPE_BASE_SINK % pads sinkpad-simple % pkg-config gstreamer-base-1.0 % includes #include <gst/base/gstbasesink.h> % prototypes static GstCaps *gst_replace_get_caps (GstBaseSink * sink, GstCaps * filter); static gboolean gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps); static GstCaps *gst_replace_fixate (GstBaseSink * sink, GstCaps * caps); static gboolean gst_replace_activate_pull (GstBaseSink * sink, gboolean active); static void gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer, 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_stop (GstBaseSink * sink); static gboolean gst_replace_unlock (GstBaseSink * sink); static gboolean gst_replace_unlock_stop (GstBaseSink * sink); static gboolean gst_replace_query (GstBaseSink * sink, GstQuery * query); 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 GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass); % set-methods 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->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->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation); base_sink_class->start = GST_DEBUG_FUNCPTR (gst_replace_start); base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop); 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->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->render = GST_DEBUG_FUNCPTR (gst_replace_render); base_sink_class->render_list = GST_DEBUG_FUNCPTR (gst_replace_render_list); % methods static GstCaps * gst_replace_get_caps (GstBaseSink * sink, GstCaps * filter) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "get_caps"); return NULL; } /* notify subclass of new caps */ static gboolean gst_replace_set_caps (GstBaseSink * sink, GstCaps * caps) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "set_caps"); return TRUE; } /* fixate sink caps during pull-mode negotiation */ static GstCaps * gst_replace_fixate (GstBaseSink * sink, GstCaps * caps) { GstReplace *replace = GST_REPLACE (sink); 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 gst_replace_get_times (GstBaseSink * sink, GstBuffer * buffer, 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 gst_replace_start (GstBaseSink * sink) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "start"); return TRUE; } static gboolean gst_replace_stop (GstBaseSink * sink) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "stop"); return TRUE; } /* unlock any pending access to the resource. subclasses should unlock * any function ASAP. */ static gboolean gst_replace_unlock (GstBaseSink * sink) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "unlock"); 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 gst_replace_event (GstBaseSink * sink, GstEvent * event) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "event"); 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 gst_replace_preroll (GstBaseSink * sink, GstBuffer * buffer) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "preroll"); return GST_FLOW_OK; } static GstFlowReturn gst_replace_render (GstBaseSink * sink, GstBuffer * buffer) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "render"); return GST_FLOW_OK; } /* Render a BufferList */ static GstFlowReturn gst_replace_render_list (GstBaseSink * sink, GstBufferList * buffer_list) { GstReplace *replace = GST_REPLACE (sink); GST_DEBUG_OBJECT (replace, "render_list"); return GST_FLOW_OK; } % end