rtppayload: Fix VP8/VP9/OPUS dual encoding name handling

All these were copy pasted and would lead to assertion when chained with
rtpmux. This commit rewrite the negotiation with downstream. This also
drop the fallback to ancient names if the pad is unlinked. This was
completly arbitrary decision that made no sense.

https://bugzilla.gnome.org/show_bug.cgi?id=796809
This commit is contained in:
Nicolas Dufresne 2018-07-13 22:31:04 -04:00
parent 319171b162
commit 2b11c62571
3 changed files with 47 additions and 29 deletions

View file

@ -103,21 +103,28 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps)
gboolean res;
GstCaps *src_caps;
GstStructure *s;
char *encoding_name;
const char *encoding_name = "OPUS";
gint channels, rate;
const char *sprop_stereo = NULL;
char *sprop_maxcapturerate = NULL;
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
if (src_caps) {
src_caps = gst_caps_make_writable (src_caps);
src_caps = gst_caps_truncate (src_caps);
GstStructure *s;
const GValue *value;
s = gst_caps_get_structure (src_caps, 0);
gst_structure_fixate_field_string (s, "encoding-name", "OPUS");
encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
gst_caps_unref (src_caps);
} else {
encoding_name = g_strdup ("X-GST-OPUS-DRAFT-SPITTKA-00");
if (gst_structure_has_field (s, "encoding-name")) {
GValue default_value = G_VALUE_INIT;
g_value_init (&default_value, G_TYPE_STRING);
g_value_set_static_string (&default_value, encoding_name);
value = gst_structure_get_value (s, "encoding-name");
if (!gst_value_can_intersect (&default_value, value))
encoding_name = "X-GST-OPUS-DRAFT-SPITTKA-00";
}
}
s = gst_caps_get_structure (caps, 0);
@ -139,7 +146,6 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps)
gst_rtp_base_payload_set_options (payload, "audio", FALSE,
encoding_name, 48000);
g_free (encoding_name);
if (sprop_maxcapturerate && sprop_stereo) {
res =

View file

@ -512,24 +512,30 @@ static gboolean
gst_rtp_vp8_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
{
GstCaps *src_caps;
GstStructure *s;
char *encoding_name;
const char *encoding_name = "VP8";
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
if (src_caps) {
src_caps = gst_caps_make_writable (src_caps);
src_caps = gst_caps_truncate (src_caps);
GstStructure *s;
const GValue *value;
s = gst_caps_get_structure (src_caps, 0);
gst_structure_fixate_field_string (s, "encoding-name", "VP8");
encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
gst_caps_unref (src_caps);
} else {
encoding_name = g_strdup ("VP8-DRAFT-IETF-01");
if (gst_structure_has_field (s, "encoding-name")) {
GValue default_value = G_VALUE_INIT;
g_value_init (&default_value, G_TYPE_STRING);
g_value_set_static_string (&default_value, encoding_name);
value = gst_structure_get_value (s, "encoding-name");
if (!gst_value_can_intersect (&default_value, value))
encoding_name = "VP8-DRAFT-IETF-01";
}
}
gst_rtp_base_payload_set_options (payload, "video", TRUE,
encoding_name, 90000);
g_free (encoding_name);
return gst_rtp_base_payload_set_outcaps (payload, NULL);
}

View file

@ -527,24 +527,30 @@ static gboolean
gst_rtp_vp9_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
{
GstCaps *src_caps;
GstStructure *s;
char *encoding_name;
const char *encoding_name = "VP9";
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
if (src_caps) {
src_caps = gst_caps_make_writable (src_caps);
src_caps = gst_caps_truncate (src_caps);
GstStructure *s;
const GValue *value;
s = gst_caps_get_structure (src_caps, 0);
gst_structure_fixate_field_string (s, "encoding-name", "VP9");
encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
gst_caps_unref (src_caps);
} else {
encoding_name = g_strdup ("VP9-DRAFT-IETF-01");
if (gst_structure_has_field (s, "encoding-name")) {
GValue default_value = G_VALUE_INIT;
g_value_init (&default_value, G_TYPE_STRING);
g_value_set_static_string (&default_value, encoding_name);
value = gst_structure_get_value (s, "encoding-name");
if (!gst_value_can_intersect (&default_value, value))
encoding_name = "VP9-DRAFT-IETF-01";
}
}
gst_rtp_base_payload_set_options (payload, "video", TRUE,
encoding_name, 90000);
g_free (encoding_name);
return gst_rtp_base_payload_set_outcaps (payload, NULL);
}