summaryrefslogtreecommitdiff
authorWim Taymans <wim.taymans@collabora.co.uk>2009-12-24 18:25:52 (GMT)
committer Wim Taymans <wim@metal.(none)>2009-12-24 18:25:52 (GMT)
commitd7ecbc6ac300feccb17e88a4b3bc7723bb88eb53 (patch) (side-by-side diff)
tree0c052080dddf03ec4e7fd599e347d1169b066f00
parentbb780fdf73546ec5604eb95326682bd9d6192807 (diff)
downloadgstreamer-d7ecbc6ac300feccb17e88a4b3bc7723bb88eb53.zip
gstreamer-d7ecbc6ac300feccb17e88a4b3bc7723bb88eb53.tar.gz
collectpads: don't keep buffers reffed longer than needed
Make sure we take ownership of the buffer early without increasing its refcount when we go in the collect function. This reduces the amount of copies needed in order to make the buffer writable in most cases.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libs/gst/base/gstcollectpads.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index 411fb66..f9aa116 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -1307,7 +1307,6 @@ gst_collect_pads_chain (GstPad * pad, GstBuffer * buffer)
GstCollectPads *pads;
GstCollectPadsPrivate *priv;
GstFlowReturn ret;
- GstBuffer **buffer_p;
GST_DEBUG ("Got buffer for pad %s:%s", GST_DEBUG_PAD_NAME (pad));
@@ -1346,12 +1345,15 @@ gst_collect_pads_chain (GstPad * pad, GstBuffer * buffer)
/* One more pad has data queued */
pads->queuedpads++;
- buffer_p = &data->buffer;
- gst_buffer_replace (buffer_p, buffer);
+ /* take ownership of the buffer */
+ if (data->buffer)
+ gst_buffer_unref (data->buffer);
+ data->buffer = buffer;
+ buffer = NULL;
/* update segment last position if in TIME */
if (G_LIKELY (data->segment.format == GST_FORMAT_TIME)) {
- GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (data->buffer);
if (GST_CLOCK_TIME_IS_VALID (timestamp))
gst_segment_set_last_stop (&data->segment, GST_FORMAT_TIME, timestamp);
@@ -1405,7 +1407,8 @@ unlock_done:
GST_DEBUG ("Pad %s:%s done", GST_DEBUG_PAD_NAME (pad));
GST_OBJECT_UNLOCK (pads);
unref_data (data);
- gst_buffer_unref (buffer);
+ if (buffer)
+ gst_buffer_unref (buffer);
return ret;
pad_removed:
@@ -1448,9 +1451,8 @@ unexpected:
clipped:
{
GST_DEBUG ("clipped buffer on pad %s:%s", GST_DEBUG_PAD_NAME (pad));
- GST_OBJECT_UNLOCK (pads);
- unref_data (data);
- return GST_FLOW_OK;
+ ret = GST_FLOW_OK;
+ goto unlock_done;
}
error:
{