mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
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:
parent
319171b162
commit
2b11c62571
3 changed files with 47 additions and 29 deletions
|
@ -103,21 +103,28 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps)
|
||||||
gboolean res;
|
gboolean res;
|
||||||
GstCaps *src_caps;
|
GstCaps *src_caps;
|
||||||
GstStructure *s;
|
GstStructure *s;
|
||||||
char *encoding_name;
|
const char *encoding_name = "OPUS";
|
||||||
gint channels, rate;
|
gint channels, rate;
|
||||||
const char *sprop_stereo = NULL;
|
const char *sprop_stereo = NULL;
|
||||||
char *sprop_maxcapturerate = NULL;
|
char *sprop_maxcapturerate = NULL;
|
||||||
|
|
||||||
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
||||||
if (src_caps) {
|
if (src_caps) {
|
||||||
src_caps = gst_caps_make_writable (src_caps);
|
GstStructure *s;
|
||||||
src_caps = gst_caps_truncate (src_caps);
|
const GValue *value;
|
||||||
|
|
||||||
s = gst_caps_get_structure (src_caps, 0);
|
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"));
|
if (gst_structure_has_field (s, "encoding-name")) {
|
||||||
gst_caps_unref (src_caps);
|
GValue default_value = G_VALUE_INIT;
|
||||||
} else {
|
|
||||||
encoding_name = g_strdup ("X-GST-OPUS-DRAFT-SPITTKA-00");
|
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);
|
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,
|
gst_rtp_base_payload_set_options (payload, "audio", FALSE,
|
||||||
encoding_name, 48000);
|
encoding_name, 48000);
|
||||||
g_free (encoding_name);
|
|
||||||
|
|
||||||
if (sprop_maxcapturerate && sprop_stereo) {
|
if (sprop_maxcapturerate && sprop_stereo) {
|
||||||
res =
|
res =
|
||||||
|
|
|
@ -512,24 +512,30 @@ static gboolean
|
||||||
gst_rtp_vp8_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
|
gst_rtp_vp8_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstCaps *src_caps;
|
GstCaps *src_caps;
|
||||||
GstStructure *s;
|
const char *encoding_name = "VP8";
|
||||||
char *encoding_name;
|
|
||||||
|
|
||||||
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
||||||
if (src_caps) {
|
if (src_caps) {
|
||||||
src_caps = gst_caps_make_writable (src_caps);
|
GstStructure *s;
|
||||||
src_caps = gst_caps_truncate (src_caps);
|
const GValue *value;
|
||||||
|
|
||||||
s = gst_caps_get_structure (src_caps, 0);
|
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"));
|
if (gst_structure_has_field (s, "encoding-name")) {
|
||||||
gst_caps_unref (src_caps);
|
GValue default_value = G_VALUE_INIT;
|
||||||
} else {
|
|
||||||
encoding_name = g_strdup ("VP8-DRAFT-IETF-01");
|
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,
|
gst_rtp_base_payload_set_options (payload, "video", TRUE,
|
||||||
encoding_name, 90000);
|
encoding_name, 90000);
|
||||||
g_free (encoding_name);
|
|
||||||
return gst_rtp_base_payload_set_outcaps (payload, NULL);
|
return gst_rtp_base_payload_set_outcaps (payload, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -527,24 +527,30 @@ static gboolean
|
||||||
gst_rtp_vp9_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
|
gst_rtp_vp9_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstCaps *src_caps;
|
GstCaps *src_caps;
|
||||||
GstStructure *s;
|
const char *encoding_name = "VP9";
|
||||||
char *encoding_name;
|
|
||||||
|
|
||||||
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
|
||||||
if (src_caps) {
|
if (src_caps) {
|
||||||
src_caps = gst_caps_make_writable (src_caps);
|
GstStructure *s;
|
||||||
src_caps = gst_caps_truncate (src_caps);
|
const GValue *value;
|
||||||
|
|
||||||
s = gst_caps_get_structure (src_caps, 0);
|
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"));
|
if (gst_structure_has_field (s, "encoding-name")) {
|
||||||
gst_caps_unref (src_caps);
|
GValue default_value = G_VALUE_INIT;
|
||||||
} else {
|
|
||||||
encoding_name = g_strdup ("VP9-DRAFT-IETF-01");
|
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,
|
gst_rtp_base_payload_set_options (payload, "video", TRUE,
|
||||||
encoding_name, 90000);
|
encoding_name, 90000);
|
||||||
g_free (encoding_name);
|
|
||||||
return gst_rtp_base_payload_set_outcaps (payload, NULL);
|
return gst_rtp_base_payload_set_outcaps (payload, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue