diff options
author | Julien Moutte <julien@moutte.net> | 2005-11-24 15:07:06 +0000 |
---|---|---|
committer | Julien Moutte <julien@moutte.net> | 2005-11-24 15:07:06 +0000 |
commit | b47757e510da1646658888895d3a8d5854c161cc (patch) | |
tree | b196638afd2f78389fd3c16b334b182a8509da56 /gst/effectv/gstquark.c | |
parent | 20c7083ccdb9f873c5635b0f5444d8f7c88085d2 (diff) |
gst/effectv/gstquark.c: Flush the planes list on reverse caps negotiation. This was crashing because of differently s...
Original commit message from CVS:
2005-11-24 Julien MOUTTE <julien@moutte.net>
* gst/effectv/gstquark.c: (gst_quarktv_set_caps),
(gst_quarktv_get_unit_size), (gst_quarktv_transform),
(gst_quarktv_planetable_clear), (gst_quarktv_change_state),
(gst_quarktv_base_init), (gst_quarktv_class_init),
(gst_quarktv_init): Flush the planes list on reverse caps
negotiation. This was crashing because of differently sized
buffers.
Diffstat (limited to 'gst/effectv/gstquark.c')
-rw-r--r-- | gst/effectv/gstquark.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/gst/effectv/gstquark.c b/gst/effectv/gstquark.c index d0cc1971..e8ef93e7 100644 --- a/gst/effectv/gstquark.c +++ b/gst/effectv/gstquark.c @@ -74,6 +74,8 @@ enum GType gst_quarktv_get_type (void); +static void gst_quarktv_planetable_clear (GstQuarkTV * filter); + static GstElementDetails quarktv_details = GST_ELEMENT_DETAILS ("QuarkTV", "Filter/Effect/Video", "Motion dissolver", @@ -107,6 +109,7 @@ gst_quarktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { + gst_quarktv_planetable_clear (filter); filter->area = filter->width * filter->height; ret = TRUE; } @@ -188,6 +191,19 @@ gst_quarktv_transform (GstBaseTransform * trans, GstBuffer * in, return ret; } +static void +gst_quarktv_planetable_clear (GstQuarkTV * filter) +{ + gint i; + + for (i = 0; i < filter->planes; i++) { + if (GST_IS_BUFFER (filter->planetable[i])) { + gst_buffer_unref (filter->planetable[i]); + } + filter->planetable[i] = NULL; + } +} + static GstStateChangeReturn gst_quarktv_change_state (GstElement * element, GstStateChange transition) { @@ -198,8 +214,7 @@ gst_quarktv_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_READY_TO_PAUSED: { filter->planetable = - (GstBuffer **) g_malloc (filter->planes * sizeof (GstBuffer *)); - memset (filter->planetable, 0, filter->planes * sizeof (GstBuffer *)); + (GstBuffer **) g_malloc0 (filter->planes * sizeof (GstBuffer *)); break; } default: @@ -212,13 +227,7 @@ gst_quarktv_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { - gint i; - - for (i = 0; i < filter->planes; i++) { - if (filter->planetable[i]) - gst_buffer_unref (filter->planetable[i]); - filter->planetable[i] = NULL; - } + gst_quarktv_planetable_clear (filter); g_free (filter->planetable); filter->planetable = NULL; break; |