gst/mpegstream/: Fix some caps leaks. Fixes bug #564885.

Original commit message from CVS:
Patch by: Yves Lefebvre <ivanohe at abacom dot com>
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_video_stream),
(gst_dvd_demux_get_audio_stream),
(gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_reset):
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init_stream),
(gst_mpeg_demux_get_video_stream),
(gst_mpeg_demux_get_audio_stream), (gst_mpeg_demux_reset):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain):
Fix some caps leaks. Fixes bug #564885.
This commit is contained in:
Yves Lefebvre 2009-01-08 08:19:25 +00:00 committed by Sebastian Dröge
parent 488fb36616
commit f4567b2c7c
4 changed files with 47 additions and 10 deletions

View file

@ -1,3 +1,16 @@
2009-01-08 Sebastian Dröge <sebastian.droege@collabora.co.uk>
Patch by: Yves Lefebvre <ivanohe at abacom dot com>
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_video_stream),
(gst_dvd_demux_get_audio_stream),
(gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_reset):
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_init_stream),
(gst_mpeg_demux_get_video_stream),
(gst_mpeg_demux_get_audio_stream), (gst_mpeg_demux_reset):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_chain):
Fix some caps leaks. Fixes bug #564885.
2009-01-02 Alessandro Decina <alessandro.d@gmail.com> 2009-01-02 Alessandro Decina <alessandro.d@gmail.com>
* ext/cdio/gstcdio.c: * ext/cdio/gstcdio.c:

View file

@ -474,6 +474,8 @@ gst_dvd_demux_get_video_stream (GstMPEGDemux * mpeg_demux,
gint mpeg_version = *((gint *) info); gint mpeg_version = *((gint *) info);
if (dvd_demux->mpeg_version != mpeg_version) { if (dvd_demux->mpeg_version != mpeg_version) {
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("video/mpeg", str->caps = gst_caps_new_simple ("video/mpeg",
"mpegversion", G_TYPE_INT, mpeg_version, "mpegversion", G_TYPE_INT, mpeg_version,
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL); "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
@ -593,6 +595,8 @@ gst_dvd_demux_get_audio_stream (GstMPEGDemux * mpeg_demux,
/* Determine the number of channels. */ /* Determine the number of channels. */
channels = ((sample_info >> 8) & 0x7) + 1; channels = ((sample_info >> 8) & 0x7) + 1;
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("audio/x-lpcm", str->caps = gst_caps_new_simple ("audio/x-lpcm",
"width", G_TYPE_INT, width, "width", G_TYPE_INT, width,
"rate", G_TYPE_INT, rate, "rate", G_TYPE_INT, rate,
@ -612,11 +616,15 @@ gst_dvd_demux_get_audio_stream (GstMPEGDemux * mpeg_demux,
break; break;
case GST_DVD_DEMUX_AUDIO_AC3: case GST_DVD_DEMUX_AUDIO_AC3:
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("audio/x-ac3", NULL); str->caps = gst_caps_new_simple ("audio/x-ac3", NULL);
codec = "AC-3 audio"; codec = "AC-3 audio";
break; break;
case GST_DVD_DEMUX_AUDIO_DTS: case GST_DVD_DEMUX_AUDIO_DTS:
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("audio/x-dts", NULL); str->caps = gst_caps_new_simple ("audio/x-dts", NULL);
codec = "DTS audio"; codec = "DTS audio";
break; break;
@ -650,8 +658,8 @@ gst_dvd_demux_get_audio_stream (GstMPEGDemux * mpeg_demux,
t = g_strdup_printf ("audio-%d-language", stream_nr); t = g_strdup_printf ("audio-%d-language", stream_nr);
lang_code = lang_code =
gst_structure_get_string (gst_event_get_structure (dvd_demux-> gst_structure_get_string (gst_event_get_structure
langcodes), t); (dvd_demux->langcodes), t);
g_free (t); g_free (t);
} }
@ -720,6 +728,8 @@ gst_dvd_demux_get_subpicture_stream (GstMPEGDemux * mpeg_demux,
if (str->type != GST_DVD_DEMUX_SUBP_DVD) { if (str->type != GST_DVD_DEMUX_SUBP_DVD) {
/* We need to set new caps for this pad. */ /* We need to set new caps for this pad. */
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); str->caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL);
if (!gst_pad_set_caps (str->pad, str->caps)) { if (!gst_pad_set_caps (str->pad, str->caps)) {
@ -746,8 +756,8 @@ gst_dvd_demux_get_subpicture_stream (GstMPEGDemux * mpeg_demux,
t = g_strdup_printf ("subtitle-%d-language", stream_nr); t = g_strdup_printf ("subtitle-%d-language", stream_nr);
lang_code = lang_code =
gst_structure_get_string (gst_event_get_structure (dvd_demux-> gst_structure_get_string (gst_event_get_structure
langcodes), t); (dvd_demux->langcodes), t);
g_free (t); g_free (t);
} }
@ -1164,6 +1174,8 @@ gst_dvd_demux_reset (GstDVDDemux * dvd_demux)
gst_element_remove_pad (GST_ELEMENT (dvd_demux), gst_element_remove_pad (GST_ELEMENT (dvd_demux),
dvd_demux->subpicture_stream[i]->pad); dvd_demux->subpicture_stream[i]->pad);
if (dvd_demux->subpicture_stream[i]->caps)
gst_caps_unref (dvd_demux->subpicture_stream[i]->caps);
if (dvd_demux->subpicture_stream[i]->tags) if (dvd_demux->subpicture_stream[i]->tags)
gst_tag_list_free (dvd_demux->subpicture_stream[i]->tags); gst_tag_list_free (dvd_demux->subpicture_stream[i]->tags);
g_free (dvd_demux->subpicture_stream[i]); g_free (dvd_demux->subpicture_stream[i]);

View file

@ -331,6 +331,7 @@ gst_mpeg_demux_init_stream (GstMPEGDemux * mpeg_demux,
str->last_flow = GST_FLOW_OK; str->last_flow = GST_FLOW_OK;
str->buffers_sent = 0; str->buffers_sent = 0;
str->tags = NULL; str->tags = NULL;
str->caps = NULL;
} }
static GstMPEGStream * static GstMPEGStream *
@ -373,6 +374,8 @@ gst_mpeg_demux_get_video_stream (GstMPEGDemux * mpeg_demux,
GstTagList *list; GstTagList *list;
/* We need to set new caps for this pad. */ /* We need to set new caps for this pad. */
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("video/mpeg", str->caps = gst_caps_new_simple ("video/mpeg",
"mpegversion", G_TYPE_INT, mpeg_version, "mpegversion", G_TYPE_INT, mpeg_version,
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL); "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
@ -445,6 +448,8 @@ gst_mpeg_demux_get_audio_stream (GstMPEGDemux * mpeg_demux,
GstTagList *list; GstTagList *list;
/* We need to set new caps for this pad. */ /* We need to set new caps for this pad. */
if (str->caps)
gst_caps_unref (str->caps);
str->caps = gst_caps_new_simple ("audio/mpeg", str->caps = gst_caps_new_simple ("audio/mpeg",
"mpegversion", G_TYPE_INT, 1, NULL); "mpegversion", G_TYPE_INT, 1, NULL);
if (!gst_pad_set_caps (str->pad, str->caps)) { if (!gst_pad_set_caps (str->pad, str->caps)) {
@ -1334,6 +1339,8 @@ gst_mpeg_demux_reset (GstMPEGDemux * mpeg_demux)
gst_event_new_eos ()); gst_event_new_eos ());
gst_element_remove_pad (GST_ELEMENT (mpeg_demux), gst_element_remove_pad (GST_ELEMENT (mpeg_demux),
mpeg_demux->video_stream[i]->pad); mpeg_demux->video_stream[i]->pad);
if (mpeg_demux->video_stream[i]->caps)
gst_caps_unref (mpeg_demux->video_stream[i]->caps);
g_free (mpeg_demux->video_stream[i]); g_free (mpeg_demux->video_stream[i]);
mpeg_demux->video_stream[i] = NULL; mpeg_demux->video_stream[i] = NULL;
} }
@ -1345,6 +1352,8 @@ gst_mpeg_demux_reset (GstMPEGDemux * mpeg_demux)
mpeg_demux->audio_stream[i]->pad); mpeg_demux->audio_stream[i]->pad);
if (mpeg_demux->audio_stream[i]->tags) if (mpeg_demux->audio_stream[i]->tags)
gst_tag_list_free (mpeg_demux->audio_stream[i]->tags); gst_tag_list_free (mpeg_demux->audio_stream[i]->tags);
if (mpeg_demux->audio_stream[i]->caps)
gst_caps_unref (mpeg_demux->audio_stream[i]->caps);
g_free (mpeg_demux->audio_stream[i]); g_free (mpeg_demux->audio_stream[i]);
mpeg_demux->audio_stream[i] = NULL; mpeg_demux->audio_stream[i] = NULL;
} }
@ -1354,6 +1363,8 @@ gst_mpeg_demux_reset (GstMPEGDemux * mpeg_demux)
gst_event_new_eos ()); gst_event_new_eos ());
gst_element_remove_pad (GST_ELEMENT (mpeg_demux), gst_element_remove_pad (GST_ELEMENT (mpeg_demux),
mpeg_demux->private_stream[i]->pad); mpeg_demux->private_stream[i]->pad);
if (mpeg_demux->private_stream[i]->caps)
gst_caps_unref (mpeg_demux->private_stream[i]->caps);
g_free (mpeg_demux->private_stream[i]); g_free (mpeg_demux->private_stream[i]);
mpeg_demux->private_stream[i] = NULL; mpeg_demux->private_stream[i] = NULL;
} }

View file

@ -782,17 +782,18 @@ gst_mpeg_parse_chain (GstPad * pad, GstBuffer * buffer)
/* Make sure the output pad has proper capabilities. */ /* Make sure the output pad has proper capabilities. */
if (!GST_PAD_CAPS (mpeg_parse->sinkpad)) { if (!GST_PAD_CAPS (mpeg_parse->sinkpad)) {
gboolean mpeg2 = GST_MPEG_PACKETIZE_IS_MPEG2 (mpeg_parse->packetize); gboolean mpeg2 = GST_MPEG_PACKETIZE_IS_MPEG2 (mpeg_parse->packetize);
GstCaps *caps = gst_caps_new_simple ("video/mpeg",
if (!gst_pad_set_caps (mpeg_parse->sinkpad, "mpegversion", G_TYPE_INT, (mpeg2 ? 2 : 1),
gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, TRUE,
"mpegversion", G_TYPE_INT, (mpeg2 ? 2 : 1), "parsed", G_TYPE_BOOLEAN, TRUE, NULL);
"systemstream", G_TYPE_BOOLEAN, TRUE, if (!gst_pad_set_caps (mpeg_parse->sinkpad, caps) < 0) {
"parsed", G_TYPE_BOOLEAN, TRUE, NULL)) < 0) {
GST_ELEMENT_ERROR (mpeg_parse, CORE, NEGOTIATION, (NULL), (NULL)); GST_ELEMENT_ERROR (mpeg_parse, CORE, NEGOTIATION, (NULL), (NULL));
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
result = GST_FLOW_ERROR; result = GST_FLOW_ERROR;
gst_caps_unref (caps);
break; break;
} }
gst_caps_unref (caps);
} }
/* Send the buffer. */ /* Send the buffer. */