diff options
author | Luis de Bethencourt <luis@debethencourt.com> | 2015-08-12 17:22:42 +0100 |
---|---|---|
committer | Luis de Bethencourt <luis@debethencourt.com> | 2015-08-12 17:22:44 +0100 |
commit | ef9b7ef60a388dd0ff76b9543e7165ab299504cc (patch) | |
tree | 5d8ef5d3a3b35b29d16a5a6802a8ce04bbbca35c /gst/rtp | |
parent | 4edf2ac1c51011cce4a52306e7c16bae489b436a (diff) | |
download | gstreamer-plugins-bad-ef9b7ef60a388dd0ff76b9543e7165ab299504cc.tar.gz |
rtph265depay: only update the srcpad caps if something else than the codec_data changed
h264parse and gstrtph264depay do the same, let's keep the behaviour
consistent. As we now include the codec_data inside the stream, this causes
less caps renegotiation.
https://bugzilla.gnome.org/show_bug.cgi?id=753228
Diffstat (limited to 'gst/rtp')
-rw-r--r-- | gst/rtp/gstrtph265depay.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/gst/rtp/gstrtph265depay.c b/gst/rtp/gstrtph265depay.c index 5ee4a74e7..99755d7d2 100644 --- a/gst/rtp/gstrtph265depay.c +++ b/gst/rtp/gstrtph265depay.c @@ -530,8 +530,47 @@ gst_rtp_h265_set_src_caps (GstRtpH265Depay * rtph265depay) gst_buffer_unref (codec_data); } - res = gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay), - srccaps); + if (gst_pad_has_current_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay))) { + GstCaps *old_caps = + gst_pad_get_current_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay)); + + /* Only update the caps if they are not equal. For + * AVC we don't update caps if only the codec_data + * changes. This is the same behaviour as in h264parse + * and gstrtph264depay + */ + if (rtph265depay->byte_stream) { + if (!gst_caps_is_equal (srccaps, old_caps)) + res = + gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay), + srccaps); + else + res = TRUE; + } else { + GstCaps *tmp_caps = gst_caps_copy (srccaps); + GstStructure *old_s, *tmp_s; + + old_s = gst_caps_get_structure (old_caps, 0); + tmp_s = gst_caps_get_structure (tmp_caps, 0); + if (gst_structure_has_field (old_s, "codec_data")) + gst_structure_set_value (tmp_s, "codec_data", + gst_structure_get_value (old_s, "codec_data")); + + if (!gst_caps_is_equal (old_caps, tmp_caps)) + res = + gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay), + srccaps); + else + res = TRUE; + + gst_caps_unref (tmp_caps); + } + } else { + res = + gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay), + srccaps); + } + gst_caps_unref (srccaps); /* Insert SPS and PPS into the stream on next opportunity */ |