diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-03-24 16:18:53 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-03-24 16:18:53 +0100 |
commit | ac0141b6a0dbb30372d11501b413a61b06da8d38 (patch) | |
tree | ee5066fa02933b1bad9853b05101e977cf3775b0 /gst | |
parent | c9b42951fefaeb4afbad2f84ff845375424f8bcb (diff) |
flvdemux: Only set caps once if they don't change
Previously we were setting new caps with the same content for every H264 or
AAC codec_data we found in the stream, spamming everything and causing
renegotiations.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/flv/gstflvdemux.c | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c index 43ac53dd4..2ca73f53e 100644 --- a/gst/flv/gstflvdemux.c +++ b/gst/flv/gstflvdemux.c @@ -663,7 +663,7 @@ static gboolean gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag, guint32 rate, guint32 channels, guint32 width) { - GstCaps *caps = NULL; + GstCaps *caps = NULL, *old_caps; gchar *codec_name = NULL; gboolean ret = FALSE; guint adjusted_rate = rate; @@ -814,17 +814,25 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag, demux->audio_codec_data, NULL); } - stream_id = - gst_pad_create_stream_id (demux->audio_pad, GST_ELEMENT_CAST (demux), - "audio"); + old_caps = gst_pad_get_current_caps (demux->audio_pad); + if (!old_caps) { + stream_id = + gst_pad_create_stream_id (demux->audio_pad, GST_ELEMENT_CAST (demux), + "audio"); - event = gst_event_new_stream_start (stream_id); - if (have_group_id (demux)) - gst_event_set_group_id (event, demux->group_id); - gst_pad_push_event (demux->audio_pad, event); - g_free (stream_id); + event = gst_event_new_stream_start (stream_id); + if (have_group_id (demux)) + gst_event_set_group_id (event, demux->group_id); + gst_pad_push_event (demux->audio_pad, event); + g_free (stream_id); + } + if (!old_caps || !gst_caps_is_equal (old_caps, caps)) + ret = gst_pad_set_caps (demux->audio_pad, caps); + else + ret = TRUE; - ret = gst_pad_set_caps (demux->audio_pad, caps); + if (old_caps) + gst_caps_unref (old_caps); done: if (G_LIKELY (ret)) { @@ -1234,7 +1242,7 @@ static gboolean gst_flv_demux_video_negotiate (GstFlvDemux * demux, guint32 codec_tag) { gboolean ret = FALSE; - GstCaps *caps = NULL; + GstCaps *caps = NULL, *old_caps; gchar *codec_name = NULL; GstEvent *event; gchar *stream_id; @@ -1301,16 +1309,26 @@ gst_flv_demux_video_negotiate (GstFlvDemux * demux, guint32 codec_tag) demux->video_codec_data, NULL); } - stream_id = - gst_pad_create_stream_id (demux->video_pad, GST_ELEMENT_CAST (demux), - "video"); - event = gst_event_new_stream_start (stream_id); - g_free (stream_id); + old_caps = gst_pad_get_current_caps (demux->video_pad); + if (!old_caps) { + stream_id = + gst_pad_create_stream_id (demux->video_pad, GST_ELEMENT_CAST (demux), + "video"); + event = gst_event_new_stream_start (stream_id); + g_free (stream_id); + + if (have_group_id (demux)) + gst_event_set_group_id (event, demux->group_id); + gst_pad_push_event (demux->video_pad, event); + } + + if (!old_caps || !gst_caps_is_equal (old_caps, caps)) + ret = gst_pad_set_caps (demux->video_pad, caps); + else + ret = TRUE; - if (have_group_id (demux)) - gst_event_set_group_id (event, demux->group_id); - gst_pad_push_event (demux->video_pad, event); - ret = gst_pad_set_caps (demux->video_pad, caps); + if (old_caps) + gst_caps_unref (old_caps); done: if (G_LIKELY (ret)) { |