From f6d5e3c3c57c52b89ed731af98903758a984b230 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Mon, 12 Sep 2005 13:45:04 +0000 Subject: [PATCH] gst/: Remove the requirement for sub-classes to call the parent implementation of prepare_output_buffer with a wrappe... Original commit message from CVS: * gst/base/gstbasetransform.c: (gst_base_transform_class_init), (gst_base_transform_prepare_output_buf), (gst_base_transform_handle_buffer): * gst/elements/gstcapsfilter.c: (gst_capsfilter_transform_ip), (gst_capsfilter_prepare_buf): Remove the requirement for sub-classes to call the parent implementation of prepare_output_buffer with a wrapper function. * gst/gsttaglist.h: * gst/gsttagsetter.h: Fix #define wrapper --- ChangeLog | 14 ++++++++++++ gst/base/gstbasetransform.c | 37 ++++++++++++++++---------------- gst/elements/gstcapsfilter.c | 3 +-- gst/gsttaglist.h | 6 +++--- gst/gsttagsetter.h | 6 +++--- libs/gst/base/gstbasetransform.c | 37 ++++++++++++++++---------------- plugins/elements/gstcapsfilter.c | 3 +-- 7 files changed, 60 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6c629fc78a..bb76ffac9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2005-09-12 Jan Schmidt + + * gst/base/gstbasetransform.c: (gst_base_transform_class_init), + (gst_base_transform_prepare_output_buf), + (gst_base_transform_handle_buffer): + * gst/elements/gstcapsfilter.c: (gst_capsfilter_transform_ip), + (gst_capsfilter_prepare_buf): + Remove the requirement for sub-classes to call the parent + implementation of prepare_output_buffer with a wrapper function. + + * gst/gsttaglist.h: + * gst/gsttagsetter.h: + Fix #define wrapper + 2005-09-11 Stefan Kost * docs/gst/gstreamer-sections.txt: diff --git a/gst/base/gstbasetransform.c b/gst/base/gstbasetransform.c index 819948b21d..0558e99452 100644 --- a/gst/base/gstbasetransform.c +++ b/gst/base/gstbasetransform.c @@ -179,14 +179,6 @@ * * * - * Retrictions on sub-class behaviour - * - * Sub-classes which override the prepare_output_buffer function need to call - * the parent implementation if they allocate a new buffer, which will copy - * buffer flags onto the new buffer. - * - * - * */ #ifdef HAVE_CONFIG_H @@ -222,7 +214,7 @@ static void gst_base_transform_base_init (gpointer g_class); static void gst_base_transform_class_init (GstBaseTransformClass * klass); static void gst_base_transform_init (GstBaseTransform * trans, GstBaseTransformClass * klass); -static GstFlowReturn gst_base_transform_default_prepare_buf (GstBaseTransform * +static GstFlowReturn gst_base_transform_prepare_output_buf (GstBaseTransform * trans, GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf); GType @@ -310,8 +302,6 @@ gst_base_transform_class_init (GstBaseTransformClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_base_transform_change_state); - klass->prepare_output_buffer = - GST_DEBUG_FUNCPTR (gst_base_transform_default_prepare_buf); klass->passthrough_on_same_caps = FALSE; } @@ -787,7 +777,7 @@ failed_configure: /* Allocate a buffer using gst_pad_alloc_buffer */ static GstFlowReturn -gst_base_transform_default_prepare_buf (GstBaseTransform * trans, +gst_base_transform_prepare_output_buf (GstBaseTransform * trans, GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf) { GstBaseTransformClass *bclass; @@ -796,13 +786,24 @@ gst_base_transform_default_prepare_buf (GstBaseTransform * trans, bclass = GST_BASE_TRANSFORM_GET_CLASS (trans); + if (bclass->prepare_output_buffer) { + ret = bclass->prepare_output_buffer (trans, input, size, caps, buf); + if (ret != GST_FLOW_OK) + return ret; + } + /* See if we want to prepare the buffer for in place output */ if (*buf == NULL && GST_BUFFER_SIZE (input) == size && bclass->transform_ip) { if (gst_buffer_is_writable (input)) { - /* Input buffer is already writable, just ref and return it */ - *buf = input; - gst_buffer_ref (input); - gst_caps_replace (&GST_BUFFER_CAPS (*buf), caps); + if (trans->have_same_caps) { + /* Input buffer is already writable and caps are the same, just ref and return it */ + *buf = input; + gst_buffer_ref (input); + } else { + /* Writable buffer, but need to change caps => subbuffer */ + *buf = gst_buffer_create_sub (input, 0, GST_BUFFER_SIZE (input)); + gst_caps_replace (&GST_BUFFER_CAPS (*buf), caps); + } return GST_FLOW_OK; } else { @@ -1104,7 +1105,7 @@ gst_base_transform_handle_buffer (GstBaseTransform * trans, GstBuffer * inbuf, * the old buffer. We will therefore delay the reconfiguration of the * element until we have processed this last buffer. */ trans->delay_configure = TRUE; - ret = bclass->prepare_output_buffer (trans, inbuf, + ret = gst_base_transform_prepare_output_buf (trans, inbuf, GST_BUFFER_SIZE (inbuf), GST_PAD_CAPS (trans->srcpad), outbuf); trans->delay_configure = FALSE; if (G_UNLIKELY (ret != GST_FLOW_OK)) @@ -1133,7 +1134,7 @@ gst_base_transform_handle_buffer (GstBaseTransform * trans, GstBuffer * inbuf, * element until we have processed this last buffer. */ trans->delay_configure = TRUE; /* no in place transform, get buffer, this might renegotiate. */ - ret = bclass->prepare_output_buffer (trans, inbuf, out_size, + ret = gst_base_transform_prepare_output_buf (trans, inbuf, out_size, GST_PAD_CAPS (trans->srcpad), outbuf); trans->delay_configure = FALSE; diff --git a/gst/elements/gstcapsfilter.c b/gst/elements/gstcapsfilter.c index 9a6b16846a..7b6c4ece6b 100644 --- a/gst/elements/gstcapsfilter.c +++ b/gst/elements/gstcapsfilter.c @@ -272,6 +272,5 @@ gst_capsfilter_prepare_buf (GstBaseTransform * trans, GstBuffer * input, } } - return GST_BASE_TRANSFORM_CLASS (parent_class)-> - prepare_output_buffer (trans, input, size, caps, buf); + return GST_FLOW_OK; } diff --git a/gst/gsttaglist.h b/gst/gsttaglist.h index a1b9a4fd57..eac94f2de4 100644 --- a/gst/gsttaglist.h +++ b/gst/gsttaglist.h @@ -20,8 +20,8 @@ */ -#ifndef __GST_TAG_H__ -#define __GST_TAG_H__ +#ifndef __GST_TAGLIST_H__ +#define __GST_TAGLIST_H__ #include @@ -435,4 +435,4 @@ gboolean gst_tag_list_get_pointer_index (const GstTagList * list, G_END_DECLS -#endif /* __GST_EVENT_H__ */ +#endif /* __GST_TAGLIST_H__ */ diff --git a/gst/gsttagsetter.h b/gst/gsttagsetter.h index 5daef14442..01e73b5c9f 100644 --- a/gst/gsttagsetter.h +++ b/gst/gsttagsetter.h @@ -19,8 +19,8 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __GST_TAG_INTERFACE_H__ -#define __GST_TAG_INTERFACE_H__ +#ifndef __GST_TAG_SETTER_H__ +#define __GST_TAG_SETTER_H__ #include @@ -80,4 +80,4 @@ GstTagMergeMode gst_tag_setter_get_merge_mode (GstTagSetter * setter); G_END_DECLS -#endif /* __GST_TAG_INTERFACE_H__ */ +#endif /* __GST_TAG_SETTER_H__ */ diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index 819948b21d..0558e99452 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -179,14 +179,6 @@ * * * - * Retrictions on sub-class behaviour - * - * Sub-classes which override the prepare_output_buffer function need to call - * the parent implementation if they allocate a new buffer, which will copy - * buffer flags onto the new buffer. - * - * - * */ #ifdef HAVE_CONFIG_H @@ -222,7 +214,7 @@ static void gst_base_transform_base_init (gpointer g_class); static void gst_base_transform_class_init (GstBaseTransformClass * klass); static void gst_base_transform_init (GstBaseTransform * trans, GstBaseTransformClass * klass); -static GstFlowReturn gst_base_transform_default_prepare_buf (GstBaseTransform * +static GstFlowReturn gst_base_transform_prepare_output_buf (GstBaseTransform * trans, GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf); GType @@ -310,8 +302,6 @@ gst_base_transform_class_init (GstBaseTransformClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_base_transform_change_state); - klass->prepare_output_buffer = - GST_DEBUG_FUNCPTR (gst_base_transform_default_prepare_buf); klass->passthrough_on_same_caps = FALSE; } @@ -787,7 +777,7 @@ failed_configure: /* Allocate a buffer using gst_pad_alloc_buffer */ static GstFlowReturn -gst_base_transform_default_prepare_buf (GstBaseTransform * trans, +gst_base_transform_prepare_output_buf (GstBaseTransform * trans, GstBuffer * input, gint size, GstCaps * caps, GstBuffer ** buf) { GstBaseTransformClass *bclass; @@ -796,13 +786,24 @@ gst_base_transform_default_prepare_buf (GstBaseTransform * trans, bclass = GST_BASE_TRANSFORM_GET_CLASS (trans); + if (bclass->prepare_output_buffer) { + ret = bclass->prepare_output_buffer (trans, input, size, caps, buf); + if (ret != GST_FLOW_OK) + return ret; + } + /* See if we want to prepare the buffer for in place output */ if (*buf == NULL && GST_BUFFER_SIZE (input) == size && bclass->transform_ip) { if (gst_buffer_is_writable (input)) { - /* Input buffer is already writable, just ref and return it */ - *buf = input; - gst_buffer_ref (input); - gst_caps_replace (&GST_BUFFER_CAPS (*buf), caps); + if (trans->have_same_caps) { + /* Input buffer is already writable and caps are the same, just ref and return it */ + *buf = input; + gst_buffer_ref (input); + } else { + /* Writable buffer, but need to change caps => subbuffer */ + *buf = gst_buffer_create_sub (input, 0, GST_BUFFER_SIZE (input)); + gst_caps_replace (&GST_BUFFER_CAPS (*buf), caps); + } return GST_FLOW_OK; } else { @@ -1104,7 +1105,7 @@ gst_base_transform_handle_buffer (GstBaseTransform * trans, GstBuffer * inbuf, * the old buffer. We will therefore delay the reconfiguration of the * element until we have processed this last buffer. */ trans->delay_configure = TRUE; - ret = bclass->prepare_output_buffer (trans, inbuf, + ret = gst_base_transform_prepare_output_buf (trans, inbuf, GST_BUFFER_SIZE (inbuf), GST_PAD_CAPS (trans->srcpad), outbuf); trans->delay_configure = FALSE; if (G_UNLIKELY (ret != GST_FLOW_OK)) @@ -1133,7 +1134,7 @@ gst_base_transform_handle_buffer (GstBaseTransform * trans, GstBuffer * inbuf, * element until we have processed this last buffer. */ trans->delay_configure = TRUE; /* no in place transform, get buffer, this might renegotiate. */ - ret = bclass->prepare_output_buffer (trans, inbuf, out_size, + ret = gst_base_transform_prepare_output_buf (trans, inbuf, out_size, GST_PAD_CAPS (trans->srcpad), outbuf); trans->delay_configure = FALSE; diff --git a/plugins/elements/gstcapsfilter.c b/plugins/elements/gstcapsfilter.c index 9a6b16846a..7b6c4ece6b 100644 --- a/plugins/elements/gstcapsfilter.c +++ b/plugins/elements/gstcapsfilter.c @@ -272,6 +272,5 @@ gst_capsfilter_prepare_buf (GstBaseTransform * trans, GstBuffer * input, } } - return GST_BASE_TRANSFORM_CLASS (parent_class)-> - prepare_output_buffer (trans, input, size, caps, buf); + return GST_FLOW_OK; }