+2006-04-07 Michael Smith <msmith@fluendo.com>
+
+ * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_set_header_on_caps),
+ (gst_vorbis_enc_chain):
+ Remove leaks from vorbisenc.
+ Mostly minor changes, the only significant one is that now the
+ buffers we set as 'streamheader' on the caps are copies of the
+ original buffers, to avoid circular refcounting problems.
+
2006-04-07 Jan Schmidt <thaytan@mad.scientist.com>
* gst/playback/gstplaybasebin.c: (mute_stream), (setup_substreams):
return gst_vorbis_enc_push_buffer (vorbisenc, outbuf);
}
+/* Set a copy of these buffers as 'streamheader' on the caps.
+ * We need a copy to avoid these buffers ending up with (indirect) refs on
+ * themselves
+ */
static GstCaps *
gst_vorbis_enc_set_header_on_caps (GstCaps * caps, GstBuffer * buf1,
GstBuffer * buf2, GstBuffer * buf3)
{
+ GstBuffer *buf;
GstStructure *structure;
GValue array = { 0 };
GValue value = { 0 };
/* put buffers in a fixed list */
g_value_init (&array, GST_TYPE_ARRAY);
g_value_init (&value, GST_TYPE_BUFFER);
- gst_value_set_buffer (&value, buf1);
+ buf = gst_buffer_copy (buf1);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
gst_value_array_append_value (&array, &value);
g_value_unset (&value);
g_value_init (&value, GST_TYPE_BUFFER);
- gst_value_set_buffer (&value, buf2);
+ buf = gst_buffer_copy (buf2);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
gst_value_array_append_value (&array, &value);
g_value_unset (&value);
g_value_init (&value, GST_TYPE_BUFFER);
- gst_value_set_buffer (&value, buf3);
+ buf = gst_buffer_copy (buf3);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
gst_value_array_append_value (&array, &value);
gst_structure_set_value (structure, "streamheader", &array);
g_value_unset (&value);
gulong size;
gulong i, j;
float **vorbis_buffer;
+ GstBuffer *buf1, *buf2, *buf3;
vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad));
ogg_packet header;
ogg_packet header_comm;
ogg_packet header_code;
- GstBuffer *buf1, *buf2, *buf3;
GstCaps *caps;
/* first, make sure header buffers get timestamp == 0 */
gst_buffer_set_caps (buf2, caps);
gst_buffer_set_caps (buf3, caps);
+ gst_caps_unref (caps);
+
/* push out buffers */
if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf1)) != GST_FLOW_OK)
goto failed_header_push;
+ buf1 = NULL;
if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf2)) != GST_FLOW_OK)
goto failed_header_push;
+ buf2 = NULL;
if ((ret = gst_vorbis_enc_push_buffer (vorbisenc, buf3)) != GST_FLOW_OK)
goto failed_header_push;
+ buf3 = NULL;
/* now adjust starting granulepos accordingly if the buffer's timestamp is
}
failed_header_push:
{
+ GST_WARNING_OBJECT (vorbisenc, "Failed to push headers");
+ if (buf1)
+ gst_buffer_unref (buf1);
+ if (buf2)
+ gst_buffer_unref (buf2);
+ if (buf3)
+ gst_buffer_unref (buf3);
gst_buffer_unref (buffer);
return ret;
}