/* vim: set filetype=c: */ % ClassName GstBaseTransform % TYPE_CLASS_NAME GST_TYPE_BASE_TRANSFORM % pads srcpad-simple sinkpad-simple % pkg-config gstreamer-base-1.0 % includes #include % prototypes static GstCaps *gst_replace_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static GstCaps *gst_replace_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); static gboolean gst_replace_accept_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps); static gboolean gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps); static gboolean gst_replace_query (GstBaseTransform * trans, GstPadDirection direction, GstQuery * query); static gboolean gst_replace_decide_allocation (GstBaseTransform * trans, GstQuery * query); static gboolean gst_replace_filter_meta (GstBaseTransform * trans, GstQuery * query, GType api, const GstStructure * params); static gboolean gst_replace_propose_allocation (GstBaseTransform * trans, GstQuery * decide_query, GstQuery * query); static gboolean gst_replace_transform_size (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize); static gboolean gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps, gsize * size); static gboolean gst_replace_start (GstBaseTransform * trans); static gboolean gst_replace_stop (GstBaseTransform * trans); static gboolean gst_replace_sink_event (GstBaseTransform * trans, GstEvent * event); static gboolean gst_replace_src_event (GstBaseTransform * trans, GstEvent * event); static GstFlowReturn gst_replace_prepare_output_buffer (GstBaseTransform * trans, GstBuffer * input, GstBuffer ** outbuf); static gboolean gst_replace_copy_metadata (GstBaseTransform * trans, GstBuffer * input, GstBuffer * outbuf); static gboolean gst_replace_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf); static void gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer); static GstFlowReturn gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); static GstFlowReturn gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf); % declare-class GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass); % set-methods base_transform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_replace_transform_caps); base_transform_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_replace_fixate_caps); base_transform_class->accept_caps = GST_DEBUG_FUNCPTR (gst_replace_accept_caps); base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps); base_transform_class->query = GST_DEBUG_FUNCPTR (gst_replace_query); base_transform_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation); base_transform_class->filter_meta = GST_DEBUG_FUNCPTR (gst_replace_filter_meta); base_transform_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_replace_propose_allocation); base_transform_class->transform_size = GST_DEBUG_FUNCPTR (gst_replace_transform_size); base_transform_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_replace_get_unit_size); base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start); base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop); base_transform_class->sink_event = GST_DEBUG_FUNCPTR (gst_replace_sink_event); base_transform_class->src_event = GST_DEBUG_FUNCPTR (gst_replace_src_event); base_transform_class->prepare_output_buffer = GST_DEBUG_FUNCPTR (gst_replace_prepare_output_buffer); base_transform_class->copy_metadata = GST_DEBUG_FUNCPTR (gst_replace_copy_metadata); base_transform_class->transform_meta = GST_DEBUG_FUNCPTR (gst_replace_transform_meta); base_transform_class->before_transform = GST_DEBUG_FUNCPTR (gst_replace_before_transform); base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_replace_transform); base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip); % methods static GstCaps * gst_replace_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) { GstReplace *replace = GST_REPLACE (trans); GstCaps *othercaps; GST_DEBUG_OBJECT (replace, "transform_caps"); othercaps = gst_caps_copy (caps); /* Copy other caps and modify as appropriate */ /* This works for the simplest cases, where the transform modifies one * or more fields in the caps structure. It does not work correctly * if passthrough caps are preferred. */ if (direction == GST_PAD_SRC) { /* transform caps going upstream */ } else { /* transform caps going downstream */ } if (filter) { GstCaps *intersect; intersect = gst_caps_intersect (othercaps, filter); gst_caps_unref (othercaps); return intersect; } else { return othercaps; } } static GstCaps * gst_replace_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "fixate_caps"); return NULL; } static gboolean gst_replace_accept_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "accept_caps"); return TRUE; } static gboolean gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "set_caps"); return TRUE; } static gboolean gst_replace_query (GstBaseTransform * trans, GstPadDirection direction, GstQuery * query) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "query"); return TRUE; } /* decide allocation query for output buffers */ static gboolean gst_replace_decide_allocation (GstBaseTransform * trans, GstQuery * query) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "decide_allocation"); return TRUE; } static gboolean gst_replace_filter_meta (GstBaseTransform * trans, GstQuery * query, GType api, const GstStructure * params) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "filter_meta"); return TRUE; } /* propose allocation query parameters for input buffers */ static gboolean gst_replace_propose_allocation (GstBaseTransform * trans, GstQuery * decide_query, GstQuery * query) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "propose_allocation"); return TRUE; } /* transform size */ static gboolean gst_replace_transform_size (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "transform_size"); return TRUE; } static gboolean gst_replace_get_unit_size (GstBaseTransform * trans, GstCaps * caps, gsize * size) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "get_unit_size"); return TRUE; } /* states */ static gboolean gst_replace_start (GstBaseTransform * trans) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "start"); return TRUE; } static gboolean gst_replace_stop (GstBaseTransform * trans) { 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 GST_BASE_TRANSFORM_CLASS (gst_replace_parent_class)->sink_event ( trans, event); } static gboolean gst_replace_src_event (GstBaseTransform * trans, GstEvent * event) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "src_event"); return GST_BASE_TRANSFORM_CLASS (gst_replace_parent_class)->src_event ( trans, event); } 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; } static void gst_replace_before_transform (GstBaseTransform * trans, GstBuffer * buffer) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "before_transform"); } /* transform */ static GstFlowReturn gst_replace_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "transform"); return GST_FLOW_OK; } static GstFlowReturn gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstReplace *replace = GST_REPLACE (trans); GST_DEBUG_OBJECT (replace, "transform_ip"); return GST_FLOW_OK; } % end