From 84d7f7462ef355d1a5adb1ce1d0c1dfef50f3467 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Mon, 14 Nov 2005 16:11:53 +0000 Subject: [PATCH] ext/: Fix a small memory leak in vorbisenc. Original commit message from CVS: * ext/ogg/gstoggmux.c: (gst_ogg_mux_clear), (gst_ogg_mux_init), (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), (gst_ogg_mux_push_buffer), (gst_ogg_mux_dequeue_page), (gst_ogg_mux_pad_queue_page), (gst_ogg_mux_queue_pads), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_collected), (gst_ogg_mux_clear_collectpads), (gst_ogg_mux_change_state): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_change_state): Fix a small memory leak in vorbisenc. Fix large memory leaks in oggmux, also fix lots of state change bugs in oggmux. --- ChangeLog | 14 +++++++++ common | 2 +- ext/ogg/gstoggmux.c | 81 +++++++++++++++++++++++++++++++++++++++----------- ext/vorbis/vorbisenc.c | 2 ++ 4 files changed, 80 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index f5995ce..499bf0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2005-11-14 Michael Smith + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_clear), (gst_ogg_mux_init), + (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), + (gst_ogg_mux_push_buffer), (gst_ogg_mux_dequeue_page), + (gst_ogg_mux_pad_queue_page), (gst_ogg_mux_queue_pads), + (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_collected), + (gst_ogg_mux_clear_collectpads), (gst_ogg_mux_change_state): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_buffer_from_packet), + (gst_vorbisenc_change_state): + Fix a small memory leak in vorbisenc. + Fix large memory leaks in oggmux, also fix lots of state change + bugs in oggmux. + 2005-11-14 Thomas Vander Stichele * gst/videotestsrc/gstvideotestsrc.c: diff --git a/common b/common index c6e5de7..657b549 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c6e5de72d79afdcad7d7b3cf4a35305f7f3ddebc +Subproject commit 657b549dfb640a76f3d7ab7676e453c801a83dca diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index f469234..b8ce37c 100644 --- a/ext/ogg/gstoggmux.c +++ b/ext/ogg/gstoggmux.c @@ -262,6 +262,20 @@ gst_ogg_mux_get_sink_event_masks (GstPad * pad) #endif static void +gst_ogg_mux_clear (GstOggMux * ogg_mux) +{ + ogg_mux->collect = gst_collectpads_new (); + gst_collectpads_set_function (ogg_mux->collect, + (GstCollectPadsFunction) gst_ogg_mux_collected, ogg_mux); + ogg_mux->pulling = NULL; + ogg_mux->need_headers = TRUE; + ogg_mux->max_delay = DEFAULT_MAX_DELAY; + ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY; + + ogg_mux->delta_pad = NULL; +} + +static void gst_ogg_mux_init (GstOggMux * ogg_mux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (ogg_mux); @@ -277,26 +291,22 @@ gst_ogg_mux_init (GstOggMux * ogg_mux) /* seed random number generator for creation of serial numbers */ srand (time (NULL)); - ogg_mux->collect = gst_collectpads_new (); - gst_collectpads_set_function (ogg_mux->collect, - (GstCollectPadsFunction) gst_ogg_mux_collected, ogg_mux); - ogg_mux->pulling = NULL; - ogg_mux->need_headers = TRUE; - ogg_mux->max_delay = DEFAULT_MAX_DELAY; - ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY; - - ogg_mux->delta_pad = NULL; + gst_ogg_mux_clear (ogg_mux); } static GstPadLinkReturn gst_ogg_mux_sinkconnect (GstPad * pad, GstPad * peer) { GstOggMux *ogg_mux; + gchar *name; ogg_mux = GST_OGG_MUX (gst_pad_get_parent (pad)); - GST_DEBUG_OBJECT (ogg_mux, "sinkconnect triggered on %s", - gst_pad_get_name (pad)); + name = gst_pad_get_name (pad); + + GST_DEBUG_OBJECT (ogg_mux, "sinkconnect triggered on %s", name); + + g_free (name); return GST_PAD_LINK_OK; } @@ -823,6 +833,7 @@ gst_ogg_mux_set_header_on_caps (GstCaps * caps, GList * buffers) walk = walk->next; /* mark buffer */ + GST_LOG ("Setting IN_CAPS on buffer of length %d", GST_BUFFER_SIZE (buf)); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); g_value_init (&value, GST_TYPE_BUFFER); @@ -1096,6 +1107,11 @@ gst_ogg_mux_collected (GstCollectPads * pads, GstOggMux * ogg_mux) } } + if (ogg_mux->need_headers) { + ret = gst_ogg_mux_send_headers (ogg_mux); + ogg_mux->need_headers = FALSE; + } + /* if we don't know which pad to pull on, use the best one */ if (ogg_mux->pulling == NULL) { ogg_mux->pulling = best; @@ -1109,11 +1125,6 @@ gst_ogg_mux_collected (GstCollectPads * pads, GstOggMux * ogg_mux) } } - if (ogg_mux->need_headers) { - ret = gst_ogg_mux_send_headers (ogg_mux); - ogg_mux->need_headers = FALSE; - } - /* we are pulling from a pad, continue to do so until a page * has been filled and queued */ if (ogg_mux->pulling != NULL) { @@ -1326,6 +1337,28 @@ gst_ogg_mux_set_property (GObject * object, } } +static void +gst_ogg_mux_clear_collectpads (GstCollectPads * collect) +{ + GSList *walk; + + walk = collect->data; + while (walk) { + GstOggPad *pad = (GstOggPad *) walk->data; + GstBuffer *buf; + + ogg_stream_clear (&pad->stream); + + while ((buf = g_queue_pop_head (pad->pagebuffers)) != NULL) { + gst_buffer_unref (buf); + } + g_queue_free (pad->pagebuffers); + + gst_collectpads_remove_pad (collect, ((GstCollectData *) pad)->pad); + walk = collect->data; + } +} + static GstStateChangeReturn gst_ogg_mux_change_state (GstElement * element, GstStateChange transition) { @@ -1336,6 +1369,7 @@ gst_ogg_mux_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: + break; case GST_STATE_CHANGE_READY_TO_PAUSED: ogg_mux->next_ts = 0; ogg_mux->offset = 0; @@ -1344,15 +1378,26 @@ gst_ogg_mux_change_state (GstElement * element, GstStateChange transition) break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collectpads_stop (ogg_mux->collect); + gst_ogg_mux_clear_collectpads (ogg_mux->collect); + gst_ogg_mux_clear (ogg_mux); + break; + case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - return ret; } diff --git a/ext/vorbis/vorbisenc.c b/ext/vorbis/vorbisenc.c index 1c56d02..4403b61 100644 --- a/ext/vorbis/vorbisenc.c +++ b/ext/vorbis/vorbisenc.c @@ -1166,6 +1166,8 @@ gst_vorbisenc_change_state (GstElement * element, GstStateChange transition) vorbis_block_clear (&vorbisenc->vb); vorbis_dsp_clear (&vorbisenc->vd); vorbis_info_clear (&vorbisenc->vi); + g_free (vorbisenc->last_message); + vorbisenc->last_message = NULL; break; case GST_STATE_CHANGE_READY_TO_NULL: gst_tag_list_free (vorbisenc->tags); -- 2.7.4