mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
ext/ogg/gstoggmux.c: Fix various leaks. Fixes #343699.
Original commit message from CVS: Patch by: Alessandro Decina <alessandro at nnva dot org> * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_clear), (gst_ogg_mux_release_pad), (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_init_collectpads), (gst_ogg_mux_clear_collectpads), (gst_ogg_mux_change_state): Fix various leaks. Fixes #343699. Add x-smoke mime type.
This commit is contained in:
parent
7c145357ea
commit
cc8455bce2
2 changed files with 52 additions and 23 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2006-06-14 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
Patch by: Alessandro Decina <alessandro at nnva dot org>
|
||||||
|
|
||||||
|
* ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_clear),
|
||||||
|
(gst_ogg_mux_release_pad), (gst_ogg_mux_get_headers),
|
||||||
|
(gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_init_collectpads),
|
||||||
|
(gst_ogg_mux_clear_collectpads), (gst_ogg_mux_change_state):
|
||||||
|
Fix various leaks. Fixes #343699.
|
||||||
|
Add x-smoke mime type.
|
||||||
|
|
||||||
2006-06-14 Tim-Philipp Müller <tim at centricular dot net>
|
2006-06-14 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* gst-libs/gst/riff/riff-ids.h:
|
* gst-libs/gst/riff/riff-ids.h:
|
||||||
|
|
|
@ -173,7 +173,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
|
||||||
GST_PAD_REQUEST,
|
GST_PAD_REQUEST,
|
||||||
GST_STATIC_CAPS ("video/x-theora; "
|
GST_STATIC_CAPS ("video/x-theora; "
|
||||||
"audio/x-vorbis; audio/x-flac; audio/x-speex; "
|
"audio/x-vorbis; audio/x-flac; audio/x-speex; "
|
||||||
"application/x-ogm-video; application/x-ogm-audio; video/x-dirac")
|
"application/x-ogm-video; application/x-ogm-audio; video/x-dirac; "
|
||||||
|
"video/x-smoke")
|
||||||
);
|
);
|
||||||
|
|
||||||
static void gst_ogg_mux_base_init (gpointer g_class);
|
static void gst_ogg_mux_base_init (gpointer g_class);
|
||||||
|
@ -204,7 +205,7 @@ gst_ogg_mux_get_type (void)
|
||||||
{
|
{
|
||||||
static GType ogg_mux_type = 0;
|
static GType ogg_mux_type = 0;
|
||||||
|
|
||||||
if (!ogg_mux_type) {
|
if (G_UNLIKELY (ogg_mux_type == 0)) {
|
||||||
static const GTypeInfo ogg_mux_info = {
|
static const GTypeInfo ogg_mux_info = {
|
||||||
sizeof (GstOggMuxClass),
|
sizeof (GstOggMuxClass),
|
||||||
gst_ogg_mux_base_init,
|
gst_ogg_mux_base_init,
|
||||||
|
@ -290,6 +291,8 @@ gst_ogg_mux_clear (GstOggMux * ogg_mux)
|
||||||
ogg_mux->max_delay = DEFAULT_MAX_DELAY;
|
ogg_mux->max_delay = DEFAULT_MAX_DELAY;
|
||||||
ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY;
|
ogg_mux->max_page_delay = DEFAULT_MAX_PAGE_DELAY;
|
||||||
ogg_mux->delta_pad = NULL;
|
ogg_mux->delta_pad = NULL;
|
||||||
|
ogg_mux->offset = 0;
|
||||||
|
ogg_mux->next_ts = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -440,23 +443,21 @@ gst_ogg_mux_release_pad (GstElement * element, GstPad * pad)
|
||||||
/* Find out GstOggPad in the collect pads info and clean it up */
|
/* Find out GstOggPad in the collect pads info and clean it up */
|
||||||
|
|
||||||
GST_OBJECT_LOCK (ogg_mux->collect);
|
GST_OBJECT_LOCK (ogg_mux->collect);
|
||||||
walk = ogg_mux->collect->data;
|
for (walk = ogg_mux->collect->data; walk; walk = g_slist_next (walk)) {
|
||||||
while (walk) {
|
|
||||||
GstOggPad *oggpad = (GstOggPad *) walk->data;
|
GstOggPad *oggpad = (GstOggPad *) walk->data;
|
||||||
GstCollectData *cdata = (GstCollectData *) walk->data;
|
GstCollectData *cdata = (GstCollectData *) walk->data;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
|
|
||||||
if (cdata->pad == pad) {
|
if (cdata->pad == pad) {
|
||||||
/* FIXME: clear the ogg stream stuff? -
|
ogg_stream_clear (&oggpad->stream);
|
||||||
* ogg_stream_clear (&oggpad->stream); */
|
|
||||||
|
|
||||||
while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
|
while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_queue_free (oggpad->pagebuffers);
|
g_queue_free (oggpad->pagebuffers);
|
||||||
|
oggpad->pagebuffers = NULL;
|
||||||
}
|
}
|
||||||
walk = g_slist_next (walk);
|
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (ogg_mux->collect);
|
GST_OBJECT_UNLOCK (ogg_mux->collect);
|
||||||
|
|
||||||
|
@ -825,7 +826,7 @@ gst_ogg_mux_get_headers (GstOggPad * pad)
|
||||||
GList *res = NULL;
|
GList *res = NULL;
|
||||||
GstOggMux *ogg_mux;
|
GstOggMux *ogg_mux;
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
const GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstPad *thepad;
|
GstPad *thepad;
|
||||||
|
|
||||||
thepad = pad->collect.pad;
|
thepad = pad->collect.pad;
|
||||||
|
@ -867,6 +868,7 @@ gst_ogg_mux_get_headers (GstOggPad * pad)
|
||||||
} else {
|
} else {
|
||||||
GST_LOG_OBJECT (thepad, "caps done have streamheader");
|
GST_LOG_OBJECT (thepad, "caps done have streamheader");
|
||||||
}
|
}
|
||||||
|
gst_caps_unref (caps);
|
||||||
} else {
|
} else {
|
||||||
GST_LOG_OBJECT (thepad, "got empty caps as negotiated format");
|
GST_LOG_OBJECT (thepad, "got empty caps as negotiated format");
|
||||||
}
|
}
|
||||||
|
@ -889,6 +891,7 @@ gst_ogg_mux_set_header_on_caps (GstCaps * caps, GList * buffers)
|
||||||
|
|
||||||
while (walk) {
|
while (walk) {
|
||||||
GstBuffer *buf = GST_BUFFER (walk->data);
|
GstBuffer *buf = GST_BUFFER (walk->data);
|
||||||
|
GstBuffer *copy;
|
||||||
GValue value = { 0 };
|
GValue value = { 0 };
|
||||||
|
|
||||||
walk = walk->next;
|
walk = walk->next;
|
||||||
|
@ -898,7 +901,9 @@ gst_ogg_mux_set_header_on_caps (GstCaps * caps, GList * buffers)
|
||||||
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
|
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
|
||||||
|
|
||||||
g_value_init (&value, GST_TYPE_BUFFER);
|
g_value_init (&value, GST_TYPE_BUFFER);
|
||||||
gst_value_set_buffer (&value, buf);
|
copy = gst_buffer_copy (buf);
|
||||||
|
gst_value_set_buffer (&value, copy);
|
||||||
|
gst_buffer_unref (copy);
|
||||||
gst_value_array_append_value (&array, &value);
|
gst_value_array_append_value (&array, &value);
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
}
|
}
|
||||||
|
@ -1471,22 +1476,15 @@ gst_ogg_mux_set_property (GObject * object,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear all buffers from the collectpads object */
|
/* reset all variables in the ogg pads. */
|
||||||
static void
|
static void
|
||||||
gst_ogg_mux_clear_collectpads (GstCollectPads * collect)
|
gst_ogg_mux_init_collectpads (GstCollectPads * collect)
|
||||||
{
|
{
|
||||||
GSList *walk;
|
GSList *walk;
|
||||||
|
|
||||||
walk = collect->data;
|
walk = collect->data;
|
||||||
while (walk) {
|
while (walk) {
|
||||||
GstOggPad *oggpad = (GstOggPad *) walk->data;
|
GstOggPad *oggpad = (GstOggPad *) walk->data;
|
||||||
GstBuffer *buf;
|
|
||||||
|
|
||||||
ogg_stream_clear (&oggpad->stream);
|
|
||||||
|
|
||||||
while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
ogg_stream_init (&oggpad->stream, oggpad->serial);
|
ogg_stream_init (&oggpad->stream, oggpad->serial);
|
||||||
oggpad->packetno = 0;
|
oggpad->packetno = 0;
|
||||||
|
@ -1503,6 +1501,26 @@ gst_ogg_mux_clear_collectpads (GstCollectPads * collect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear all buffers from the collectpads object */
|
||||||
|
static void
|
||||||
|
gst_ogg_mux_clear_collectpads (GstCollectPads * collect)
|
||||||
|
{
|
||||||
|
GSList *walk;
|
||||||
|
|
||||||
|
for (walk = collect->data; walk; walk = g_slist_next (walk)) {
|
||||||
|
GstOggPad *oggpad = (GstOggPad *) walk->data;
|
||||||
|
GstBuffer *buf;
|
||||||
|
|
||||||
|
ogg_stream_clear (&oggpad->stream);
|
||||||
|
|
||||||
|
while ((buf = g_queue_pop_head (oggpad->pagebuffers)) != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
g_queue_free (oggpad->pagebuffers);
|
||||||
|
oggpad->pagebuffers = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_ogg_mux_change_state (GstElement * element, GstStateChange transition)
|
gst_ogg_mux_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
|
@ -1515,11 +1533,9 @@ gst_ogg_mux_change_state (GstElement * element, GstStateChange transition)
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
ogg_mux->next_ts = 0;
|
|
||||||
ogg_mux->offset = 0;
|
|
||||||
ogg_mux->pulling = NULL;
|
|
||||||
gst_collect_pads_start (ogg_mux->collect);
|
|
||||||
gst_ogg_mux_clear (ogg_mux);
|
gst_ogg_mux_clear (ogg_mux);
|
||||||
|
gst_ogg_mux_init_collectpads (ogg_mux->collect);
|
||||||
|
gst_collect_pads_start (ogg_mux->collect);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
break;
|
break;
|
||||||
|
@ -1535,9 +1551,11 @@ gst_ogg_mux_change_state (GstElement * element, GstStateChange transition)
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
gst_ogg_mux_clear_collectpads (ogg_mux->collect);
|
gst_ogg_mux_clear_collectpads (ogg_mux->collect);
|
||||||
break;
|
break;
|
||||||
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue