| /* 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 |