summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-06-23 12:42:33 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-06-23 12:42:33 +0200
commit9600c549380d97f79e7a948a3367962405c93f05 (patch)
treefb21063327806f2e6e5a754fc21295787b7cfc1d
parent0b475ba774b512fcacf3e875af635840b1bbf37a (diff)
matroskademux: avoid leaking buffers
Don't leak buffers when resyncing to a keyframe. Avoid leaking buffers when exiting the loop on error conditions. Add some more debug info. Fixes #585911
-rw-r--r--gst/matroska/matroska-demux.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c
index 5c1248246..073717503 100644
--- a/gst/matroska/matroska-demux.c
+++ b/gst/matroska/matroska-demux.c
@@ -873,6 +873,8 @@ gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf)
g_return_val_if_fail (GST_IS_BUFFER (buf), NULL);
+ GST_DEBUG ("decoding buffer %p", buf);
+
data = GST_BUFFER_DATA (buf);
size = GST_BUFFER_SIZE (buf);
@@ -890,6 +892,7 @@ gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf)
return buf;
} else {
+ GST_DEBUG ("decode data failed");
gst_buffer_unref (buf);
return NULL;
}
@@ -4010,6 +4013,10 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
guint64 num;
guint8 *data;
+ if (buf) {
+ gst_buffer_unref (buf);
+ buf = NULL;
+ }
if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK)
break;
@@ -4272,6 +4279,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
sub = gst_buffer_create_sub (buf,
GST_BUFFER_SIZE (buf) - size, lace_size[n]);
+ GST_WARNING_OBJECT (demux, "created subbuffer %p", sub);
if (stream->encodings != NULL && stream->encodings->len > 0)
sub = gst_matroska_decode_buffer (stream, sub);
@@ -4301,7 +4309,6 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
gst_matroska_demux_sync_streams (demux);
-
if (duration) {
GST_BUFFER_DURATION (sub) = duration / laces;
stream->pos += GST_BUFFER_DURATION (sub);
@@ -4326,6 +4333,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
/* When doing seeks or such, we need to restart on key frames or
* decoders might choke. */
GST_DEBUG_OBJECT (demux, "skipping delta unit");
+ gst_buffer_unref (sub);
goto done;
}
@@ -4361,6 +4369,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
/* Postprocess the buffers depending on the codec used */
if (stream->postprocess_frame) {
+ GST_LOG_OBJECT (demux, "running post process");
ret = stream->postprocess_frame (GST_ELEMENT (demux), stream, &sub);
}
@@ -4378,7 +4387,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
}
done:
- if (readblock)
+ if (buf)
gst_buffer_unref (buf);
g_free (lace_size);