webrtc: stats: Increase spec compliance for ICE candidate stats
We now fill the foundation, related-address, related-port, username-fragment and tcp-type fields. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8698>
This commit is contained in:
parent
ac465ebfe1
commit
4718fc9be7
@ -190,6 +190,97 @@ and/or use gtk-doc annotations. -->
|
|||||||
</parameter>
|
</parameter>
|
||||||
</parameters>
|
</parameters>
|
||||||
</function-macro>
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_ADDRESS" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_ADDRESS" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_FOUNDATION" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_FOUNDATION" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_PORT" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_PORT" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_PRIORITY" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_PRIORITY" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_PROTOCOL" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_PROTOCOL" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_RELATED_ADDRESS" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_ADDRESS" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_RELATED_PORT" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_PORT" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_RELAY_PROTOCOL" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_RELAY_PROTOCOL" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_STREAM_ID" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_STREAM_ID" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_TYPE" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_TYPE" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_URL" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_URL" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
|
<function-macro name="WEBRTC_ICE_CANDIDATE_STATS_USERNAME_FRAGMENT" c:identifier="GST_WEBRTC_ICE_CANDIDATE_STATS_USERNAME_FRAGMENT" version="1.28" introspectable="0">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="c">
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function-macro>
|
||||||
<function-macro name="WEBRTC_ICE_CLASS" c:identifier="GST_WEBRTC_ICE_CLASS" introspectable="0">
|
<function-macro name="WEBRTC_ICE_CLASS" c:identifier="GST_WEBRTC_ICE_CLASS" introspectable="0">
|
||||||
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
<parameters>
|
<parameters>
|
||||||
@ -1482,37 +1573,67 @@ stops automatic ICE gathering.</doc>
|
|||||||
</parameters>
|
</parameters>
|
||||||
</glib:signal>
|
</glib:signal>
|
||||||
</class>
|
</class>
|
||||||
<record name="WebRTCICECandidateStats" c:type="GstWebRTCICECandidateStats" version="1.22" glib:type-name="GstWebRTCICECandidateStats" glib:get-type="gst_webrtc_ice_candidate_stats_get_type" c:symbol-prefix="webrtc_ice_candidate_stats">
|
<record name="WebRTCICECandidateStats" c:type="GstWebRTCICECandidateStats" glib:type-name="GstWebRTCICECandidateStats" glib:get-type="gst_webrtc_ice_candidate_stats_get_type" c:symbol-prefix="webrtc_ice_candidate_stats">
|
||||||
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
<field name="ipaddr" writable="1">
|
<field name="ipaddr" writable="1">
|
||||||
<type name="utf8" c:type="gchar*"/>
|
<type name="utf8" c:type="gchar*"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="port" writable="1">
|
<field name="port" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">The network port number used by the candidate (Since: 1.22)</doc>
|
||||||
<type name="guint" c:type="guint"/>
|
<type name="guint" c:type="guint"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="stream_id" writable="1">
|
<field name="stream_id" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">A string that uniquely identifies the object that is being
|
||||||
|
monitored to produce this set of statistics (Since: 1.22)</doc>
|
||||||
<type name="guint" c:type="guint"/>
|
<type name="guint" c:type="guint"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="type" writable="1">
|
<field name="type" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">The candidate type (Since: 1.22)</doc>
|
||||||
<type name="utf8" c:type="const gchar*"/>
|
<type name="utf8" c:type="const gchar*"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="proto" writable="1">
|
<field name="proto" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">A string specifying the protocol (tcp or udp) used to transmit data
|
||||||
|
on the @port (Since: 1.22)</doc>
|
||||||
<type name="utf8" c:type="const gchar*"/>
|
<type name="utf8" c:type="const gchar*"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="relay_proto" writable="1">
|
<field name="relay_proto" writable="1">
|
||||||
<type name="utf8" c:type="const gchar*"/>
|
<type name="utf8" c:type="const gchar*"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="prio" writable="1">
|
<field name="prio" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">The candidate's priority, corresponding to RTCIceCandidate.priority (Since: 1.22)</doc>
|
||||||
<type name="guint" c:type="guint"/>
|
<type name="guint" c:type="guint"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="url" writable="1">
|
<field name="url" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h">For local candidates, the url property is the URL of the ICE server
|
||||||
|
from which the candidate was received (Since: 1.22)</doc>
|
||||||
<type name="utf8" c:type="gchar*"/>
|
<type name="utf8" c:type="gchar*"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="_gst_reserved" writable="1">
|
<union name="ABI" c:type="ABI">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<record name="abi" c:type="abi">
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
|
<field name="foundation" writable="1">
|
||||||
|
<type name="utf8" c:type="gchar*"/>
|
||||||
|
</field>
|
||||||
|
<field name="related_address" writable="1">
|
||||||
|
<type name="utf8" c:type="gchar*"/>
|
||||||
|
</field>
|
||||||
|
<field name="related_port" writable="1">
|
||||||
|
<type name="guint" c:type="guint"/>
|
||||||
|
</field>
|
||||||
|
<field name="username_fragment" writable="1">
|
||||||
|
<type name="utf8" c:type="gchar*"/>
|
||||||
|
</field>
|
||||||
|
<field name="tcp_type" writable="1">
|
||||||
|
<type name="utf8" c:type="const gchar*"/>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<field name="_gst_reserved" readable="0" private="1">
|
||||||
<array zero-terminated="0" fixed-size="20">
|
<array zero-terminated="0" fixed-size="20">
|
||||||
<type name="gpointer" c:type="gpointer"/>
|
<type name="gpointer" c:type="gpointer"/>
|
||||||
</array>
|
</array>
|
||||||
</field>
|
</field>
|
||||||
|
</union>
|
||||||
<method name="copy" c:identifier="gst_webrtc_ice_candidate_stats_copy" version="1.22">
|
<method name="copy" c:identifier="gst_webrtc_ice_candidate_stats_copy" version="1.22">
|
||||||
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/webrtc/ice.h"/>
|
||||||
<return-value transfer-ownership="full">
|
<return-value transfer-ownership="full">
|
||||||
|
@ -9256,6 +9256,11 @@ gst_webrtc_bin_class_init (GstWebRTCBinClass * klass)
|
|||||||
* "protocol" G_TYPE_STRING Either "udp" or "tcp". Based on the "transport" defined in RFC 5245
|
* "protocol" G_TYPE_STRING Either "udp" or "tcp". Based on the "transport" defined in RFC 5245
|
||||||
* "relay-protocol" G_TYPE_STRING protocol used by the endpoint to communicate with the TURN server. Only present for local candidates. Either "udp", "tcp" or "tls"
|
* "relay-protocol" G_TYPE_STRING protocol used by the endpoint to communicate with the TURN server. Only present for local candidates. Either "udp", "tcp" or "tls"
|
||||||
* "url" G_TYPE_STRING URL of the ICE server from which the candidate was obtained. Only present for local candidates
|
* "url" G_TYPE_STRING URL of the ICE server from which the candidate was obtained. Only present for local candidates
|
||||||
|
* "foundation" G_TYPE_STRING ICE foundation as defined in RFC 5245 section 15.1 (Since: 1.28)
|
||||||
|
* "related-address" G_TYPE_STRING ICE rel-addr as defined in RFC 5245 section 15.1. Only set for server-reflexive, peer-reflexive and relay candidates (Since: 1.28)
|
||||||
|
* "related-port" G_TYPE_UINT ICE rel-port as defined in RFC 5245 section 15.1. Only set for serverreflexive, peer-reflexive and relay candidates (Since: 1.28)
|
||||||
|
* "username-fragment" G_TYPE_STRING ICE username fragment as defined in RFC 5245 section 7.1.2.3 (Since: 1.28)
|
||||||
|
* "tcp-type" G_TYPE_STRING ICE candidate TCP type as defined in RTCIceTcpCandidateType (Since: 1.28)
|
||||||
*
|
*
|
||||||
* RTCIceCandidatePairStats supported fields (https://www.w3.org/TR/webrtc-stats/#candidatepair-dict*) (Since: 1.22)
|
* RTCIceCandidatePairStats supported fields (https://www.w3.org/TR/webrtc-stats/#candidatepair-dict*) (Since: 1.22)
|
||||||
*
|
*
|
||||||
|
@ -615,6 +615,11 @@ _get_stats_from_ice_candidates (GstWebRTCBin * webrtc,
|
|||||||
long priority;
|
long priority;
|
||||||
DOMString url;
|
DOMString url;
|
||||||
DOMString relayProtocol;
|
DOMString relayProtocol;
|
||||||
|
DOMString foundation;
|
||||||
|
DOMString relatedAddress;
|
||||||
|
long relatedPort;
|
||||||
|
DOMString usernameFragment;
|
||||||
|
RTCIceTcpCandidateType tcpType;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (transport_id)
|
if (transport_id)
|
||||||
@ -630,6 +635,21 @@ _get_stats_from_ice_candidates (GstWebRTCBin * webrtc,
|
|||||||
NULL);
|
NULL);
|
||||||
if (can->url)
|
if (can->url)
|
||||||
gst_structure_set (stats, "url", G_TYPE_STRING, can->url, NULL);
|
gst_structure_set (stats, "url", G_TYPE_STRING, can->url, NULL);
|
||||||
|
if (can->ABI.abi.foundation)
|
||||||
|
gst_structure_set (stats, "foundation", G_TYPE_STRING,
|
||||||
|
can->ABI.abi.foundation, NULL);
|
||||||
|
if (can->ABI.abi.related_address)
|
||||||
|
gst_structure_set (stats, "related-address", G_TYPE_STRING,
|
||||||
|
can->ABI.abi.related_address, NULL);
|
||||||
|
if (can->ABI.abi.related_port)
|
||||||
|
gst_structure_set (stats, "related-port", G_TYPE_UINT,
|
||||||
|
can->ABI.abi.related_port, NULL);
|
||||||
|
if (can->ABI.abi.username_fragment)
|
||||||
|
gst_structure_set (stats, "username-fragment", G_TYPE_STRING,
|
||||||
|
can->ABI.abi.username_fragment, NULL);
|
||||||
|
if (can->ABI.abi.tcp_type)
|
||||||
|
gst_structure_set (stats, "tcp-type", G_TYPE_STRING, can->ABI.abi.tcp_type,
|
||||||
|
NULL);
|
||||||
|
|
||||||
gst_structure_set (s, id, GST_TYPE_STRUCTURE, stats, NULL);
|
gst_structure_set (s, id, GST_TYPE_STRUCTURE, stats, NULL);
|
||||||
gst_structure_free (stats);
|
gst_structure_free (stats);
|
||||||
|
@ -341,6 +341,9 @@ gst_webrtc_ice_candidate_stats_free (GstWebRTCICECandidateStats * stats)
|
|||||||
if (stats) {
|
if (stats) {
|
||||||
g_free (stats->ipaddr);
|
g_free (stats->ipaddr);
|
||||||
g_free (stats->url);
|
g_free (stats->url);
|
||||||
|
g_free (stats->ABI.abi.foundation);
|
||||||
|
g_free (stats->ABI.abi.related_address);
|
||||||
|
g_free (stats->ABI.abi.username_fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (stats);
|
g_free (stats);
|
||||||
@ -364,6 +367,9 @@ gst_webrtc_ice_candidate_stats_copy (GstWebRTCICECandidateStats * stats)
|
|||||||
|
|
||||||
copy->ipaddr = g_strdup (stats->ipaddr);
|
copy->ipaddr = g_strdup (stats->ipaddr);
|
||||||
copy->url = g_strdup (stats->url);
|
copy->url = g_strdup (stats->url);
|
||||||
|
copy->ABI.abi.foundation = g_strdup (stats->ABI.abi.foundation);
|
||||||
|
copy->ABI.abi.related_address = g_strdup (stats->ABI.abi.related_address);
|
||||||
|
copy->ABI.abi.username_fragment = g_strdup (stats->ABI.abi.username_fragment);
|
||||||
|
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,30 @@ struct _GstWebRTCICE
|
|||||||
gpointer _gst_reserved[GST_PADDING];
|
gpointer _gst_reserved[GST_PADDING];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstWebRTCICECandidateStats:
|
||||||
|
* @ipadd: A string containing the address of the candidate. This value may be
|
||||||
|
* an IPv4 address, an IPv6 address, or a fully-qualified domain name (Since: 1.22)
|
||||||
|
* @port: The network port number used by the candidate (Since: 1.22)
|
||||||
|
* @stream_id: A string that uniquely identifies the object that is being
|
||||||
|
* monitored to produce this set of statistics (Since: 1.22)
|
||||||
|
* @type: The candidate type (Since: 1.22)
|
||||||
|
* @proto: A string specifying the protocol (tcp or udp) used to transmit data
|
||||||
|
* on the @port (Since: 1.22)
|
||||||
|
* @replay_proto: A string identifying the protocol used by the endpoint for
|
||||||
|
* communicating with the TURN server; valid values are tcp, udp, and tls (Since: 1.22)
|
||||||
|
* @prio: The candidate's priority, corresponding to RTCIceCandidate.priority (Since: 1.22)
|
||||||
|
* @url: For local candidates, the url property is the URL of the ICE server
|
||||||
|
* from which the candidate was received (Since: 1.22)
|
||||||
|
* @foundation: The ICE foundation as defined in RFC5245 section 15.1 (Since: 1.28)
|
||||||
|
* @related_address: The ICE rel-addr defined in RFC5245 section 15.1 Only
|
||||||
|
* set for serverreflexive, peerreflexive and relay candidates. (Since: 1.28)
|
||||||
|
* @related_port: The ICE rel-addr defined in RFC5245 section 15.1. Only set
|
||||||
|
* for serverreflexive, peerreflexive and relay candidates. (Since: 1.28)
|
||||||
|
* @username_fragment: The ICE username fragment as defined in RFC5245 section 7.1.2.3 (Since: 1.28)
|
||||||
|
* @tcp_type: The ICE candidate TCP type, (Since: 1.28)
|
||||||
|
*
|
||||||
|
*/
|
||||||
struct _GstWebRTCICECandidateStats
|
struct _GstWebRTCICECandidateStats
|
||||||
{
|
{
|
||||||
gchar *ipaddr;
|
gchar *ipaddr;
|
||||||
@ -58,9 +82,99 @@ struct _GstWebRTCICECandidateStats
|
|||||||
guint prio;
|
guint prio;
|
||||||
gchar *url;
|
gchar *url;
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
gchar *foundation;
|
||||||
|
gchar *related_address;
|
||||||
|
guint related_port;
|
||||||
|
gchar *username_fragment;
|
||||||
|
const gchar *tcp_type;
|
||||||
|
} abi;
|
||||||
|
/*< private >*/
|
||||||
gpointer _gst_reserved[GST_PADDING_LARGE];
|
gpointer _gst_reserved[GST_PADDING_LARGE];
|
||||||
|
} ABI;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_ADDRESS:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_ADDRESS(c) ((c)->ipaddr)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_PORT:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_PORT(c) ((c)->port)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_STREAM_ID:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_STREAM_ID(c) ((c)->stream_id)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_TYPE:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_TYPE(c) ((c)->type)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_PROTOCOL:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_PROTOCOL(c) ((c)->proto)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_RELAY_PROTOCOL:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_RELAY_PROTOCOL(c) ((c)->relay_proto)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_PRIORITY:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_PRIORITY(c) ((c)->prio)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_URL:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_URL(c) ((c)->url)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_FOUNDATION:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_FOUNDATION(c) ((c)->ABI.abi.foundation)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_ADDRESS:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_ADDRESS(c) ((c)->ABI.abi.related_address)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_PORT:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_PORT(c) ((c)->ABI.abi.related_port)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_USERNAME_FRAGMENT:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_USERNAME_FRAGMENT(c) ((c)->ABI.abi.username_fragment)
|
||||||
|
/**
|
||||||
|
* GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE:
|
||||||
|
*
|
||||||
|
* Since: 1.28
|
||||||
|
*/
|
||||||
|
#define GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE(c) ((c)->ABI.abi.tcp_type)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstWebRTCICEOnCandidateFunc:
|
* GstWebRTCICEOnCandidateFunc:
|
||||||
* @ice: The #GstWebRTCICE
|
* @ice: The #GstWebRTCICE
|
||||||
|
@ -551,6 +551,31 @@ gst_webrtc_nice_add_stream (GstWebRTCICE * ice, guint session_id)
|
|||||||
return item->stream;
|
return item->stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_fill_candidate_credentials (NiceAgent * agent, NiceCandidate * candidate)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!candidate->username || !candidate->password) {
|
||||||
|
gboolean got_credentials;
|
||||||
|
gchar *ufrag, *password;
|
||||||
|
|
||||||
|
got_credentials =
|
||||||
|
nice_agent_get_local_credentials (agent, candidate->stream_id, &ufrag,
|
||||||
|
&password);
|
||||||
|
g_warn_if_fail (got_credentials);
|
||||||
|
|
||||||
|
if (!candidate->username)
|
||||||
|
candidate->username = ufrag;
|
||||||
|
else
|
||||||
|
g_free (ufrag);
|
||||||
|
|
||||||
|
if (!candidate->password)
|
||||||
|
candidate->password = password;
|
||||||
|
else
|
||||||
|
g_free (password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_on_new_candidate (NiceAgent * agent, NiceCandidate * candidate,
|
_on_new_candidate (NiceAgent * agent, NiceCandidate * candidate,
|
||||||
GstWebRTCNice * ice)
|
GstWebRTCNice * ice)
|
||||||
@ -565,24 +590,7 @@ _on_new_candidate (NiceAgent * agent, NiceCandidate * candidate,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!candidate->username || !candidate->password) {
|
_fill_candidate_credentials (agent, candidate);
|
||||||
gboolean got_credentials;
|
|
||||||
gchar *ufrag, *password;
|
|
||||||
|
|
||||||
got_credentials = nice_agent_get_local_credentials (ice->priv->nice_agent,
|
|
||||||
candidate->stream_id, &ufrag, &password);
|
|
||||||
g_warn_if_fail (got_credentials);
|
|
||||||
|
|
||||||
if (!candidate->username)
|
|
||||||
candidate->username = ufrag;
|
|
||||||
else
|
|
||||||
g_free (ufrag);
|
|
||||||
|
|
||||||
if (!candidate->password)
|
|
||||||
candidate->password = password;
|
|
||||||
else
|
|
||||||
g_free (password);
|
|
||||||
}
|
|
||||||
|
|
||||||
attr = nice_agent_generate_local_candidate_sdp (agent, candidate);
|
attr = nice_agent_generate_local_candidate_sdp (agent, candidate);
|
||||||
|
|
||||||
@ -1084,18 +1092,52 @@ _populate_candidate_stats (GstWebRTCNice * ice, NiceCandidate * cand,
|
|||||||
g_assert (cand != NULL);
|
g_assert (cand != NULL);
|
||||||
|
|
||||||
nice_address_to_string (&cand->addr, ipaddr);
|
nice_address_to_string (&cand->addr, ipaddr);
|
||||||
stats->port = nice_address_get_port (&cand->addr);
|
GST_WEBRTC_ICE_CANDIDATE_STATS_PORT (stats) =
|
||||||
stats->ipaddr = g_strdup (ipaddr);
|
nice_address_get_port (&cand->addr);
|
||||||
stats->stream_id = stream->stream_id;
|
GST_WEBRTC_ICE_CANDIDATE_STATS_ADDRESS (stats) = g_strdup (ipaddr);
|
||||||
stats->type = nice_candidate_type_to_string (cand->type);
|
GST_WEBRTC_ICE_CANDIDATE_STATS_STREAM_ID (stats) = stream->stream_id;
|
||||||
stats->prio = cand->priority;
|
GST_WEBRTC_ICE_CANDIDATE_STATS_TYPE (stats) =
|
||||||
stats->proto =
|
nice_candidate_type_to_string (cand->type);
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_PRIORITY (stats) = cand->priority;
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_PROTOCOL (stats) =
|
||||||
cand->transport == NICE_CANDIDATE_TRANSPORT_UDP ? "udp" : "tcp";
|
cand->transport == NICE_CANDIDATE_TRANSPORT_UDP ? "udp" : "tcp";
|
||||||
if (is_local) {
|
if (is_local) {
|
||||||
if (cand->type == NICE_CANDIDATE_TYPE_RELAYED)
|
if (cand->type == NICE_CANDIDATE_TYPE_RELAYED) {
|
||||||
stats->relay_proto = gst_webrtc_nice_get_candidate_relay_protocol (ice->priv->turn_server);
|
NiceAddress relay_address;
|
||||||
stats->url = gst_webrtc_nice_get_candidate_server_url (ice, cand);
|
nice_candidate_relay_address (cand, &relay_address);
|
||||||
|
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_ADDRESS (stats) =
|
||||||
|
nice_address_dup_string (&relay_address);
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_RELATED_PORT (stats) =
|
||||||
|
nice_address_get_port (&relay_address);
|
||||||
|
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_RELAY_PROTOCOL (stats) =
|
||||||
|
gst_webrtc_nice_get_candidate_relay_protocol (ice->priv->turn_server);
|
||||||
}
|
}
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_URL (stats) =
|
||||||
|
gst_webrtc_nice_get_candidate_server_url (ice, cand);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_FOUNDATION (stats) =
|
||||||
|
g_strdup (cand->foundation);
|
||||||
|
|
||||||
|
switch (cand->transport) {
|
||||||
|
case NICE_CANDIDATE_TRANSPORT_UDP:
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE (stats) = NULL;
|
||||||
|
break;
|
||||||
|
case NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE:
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE (stats) = "active";
|
||||||
|
break;
|
||||||
|
case NICE_CANDIDATE_TRANSPORT_TCP_PASSIVE:
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE (stats) = "passive";
|
||||||
|
break;
|
||||||
|
case NICE_CANDIDATE_TRANSPORT_TCP_SO:
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_TCP_TYPE (stats) = "so";
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
GST_WEBRTC_ICE_CANDIDATE_STATS_USERNAME_FRAGMENT (stats) =
|
||||||
|
g_strdup (cand->username);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1166,6 +1208,9 @@ gst_webrtc_nice_get_selected_pair (GstWebRTCICE * ice,
|
|||||||
if (stream) {
|
if (stream) {
|
||||||
if (nice_agent_get_selected_pair (nice->priv->nice_agent, stream->stream_id,
|
if (nice_agent_get_selected_pair (nice->priv->nice_agent, stream->stream_id,
|
||||||
NICE_COMPONENT_TYPE_RTP, &local_cand, &remote_cand)) {
|
NICE_COMPONENT_TYPE_RTP, &local_cand, &remote_cand)) {
|
||||||
|
_fill_candidate_credentials (nice->priv->nice_agent, local_cand);
|
||||||
|
_fill_candidate_credentials (nice->priv->nice_agent, remote_cand);
|
||||||
|
|
||||||
*local_stats = g_new0 (GstWebRTCICECandidateStats, 1);
|
*local_stats = g_new0 (GstWebRTCICECandidateStats, 1);
|
||||||
_populate_candidate_stats (nice, local_cand, stream, *local_stats, TRUE);
|
_populate_candidate_stats (nice, local_cand, stream, *local_stats, TRUE);
|
||||||
|
|
||||||
|
@ -70,11 +70,6 @@ typedef struct _GstWebRTCDTLSTransportClass GstWebRTCDTLSTransportClass;
|
|||||||
typedef struct _GstWebRTCICE GstWebRTCICE;
|
typedef struct _GstWebRTCICE GstWebRTCICE;
|
||||||
typedef struct _GstWebRTCICEClass GstWebRTCICEClass;
|
typedef struct _GstWebRTCICEClass GstWebRTCICEClass;
|
||||||
|
|
||||||
/**
|
|
||||||
* GstWebRTCICECandidateStats:
|
|
||||||
*
|
|
||||||
* Since: 1.22
|
|
||||||
*/
|
|
||||||
typedef struct _GstWebRTCICECandidateStats GstWebRTCICECandidateStats;
|
typedef struct _GstWebRTCICECandidateStats GstWebRTCICECandidateStats;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1748,6 +1748,7 @@ validate_candidate_stats (const GstStructure * s, const GstStructure * stats)
|
|||||||
guint port;
|
guint port;
|
||||||
guint64 priority;
|
guint64 priority;
|
||||||
gchar *address, *candidateType, *protocol;
|
gchar *address, *candidateType, *protocol;
|
||||||
|
gchar *foundation, *username_fragment;
|
||||||
|
|
||||||
fail_unless (gst_structure_get (s, "address", G_TYPE_STRING, &address, NULL));
|
fail_unless (gst_structure_get (s, "address", G_TYPE_STRING, &address, NULL));
|
||||||
fail_unless (gst_structure_get (s, "port", G_TYPE_UINT, &port, NULL));
|
fail_unless (gst_structure_get (s, "port", G_TYPE_UINT, &port, NULL));
|
||||||
@ -1759,9 +1760,39 @@ validate_candidate_stats (const GstStructure * s, const GstStructure * stats)
|
|||||||
|
|
||||||
fail_unless (strcmp (protocol, "udp") || strcmp (protocol, "tcp"));
|
fail_unless (strcmp (protocol, "udp") || strcmp (protocol, "tcp"));
|
||||||
|
|
||||||
|
fail_unless (gst_structure_get (s, "foundation", G_TYPE_STRING, &foundation,
|
||||||
|
NULL));
|
||||||
|
fail_unless (gst_structure_get (s, "username-fragment", G_TYPE_STRING,
|
||||||
|
&username_fragment, NULL));
|
||||||
|
|
||||||
|
if (strcmp (candidateType, "host")) {
|
||||||
|
guint related_port;
|
||||||
|
gchar *related_address;
|
||||||
|
fail_unless (gst_structure_get (s, "related-address", G_TYPE_STRING,
|
||||||
|
&related_address, NULL));
|
||||||
|
fail_unless (gst_structure_get (s, "related-port", G_TYPE_UINT,
|
||||||
|
&related_port, NULL));
|
||||||
|
g_free (related_address);
|
||||||
|
} else {
|
||||||
|
fail_if (gst_structure_has_field (s, "related-address"));
|
||||||
|
fail_if (gst_structure_has_field (s, "related-port"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp (protocol, "tcp")) {
|
||||||
|
gchar *tcp_type;
|
||||||
|
fail_unless (gst_structure_get (s, "tcp-type", G_TYPE_STRING, &tcp_type,
|
||||||
|
NULL));
|
||||||
|
fail_unless (strcmp (tcp_type, "so") || strcmp (tcp_type, "active")
|
||||||
|
|| strcmp (tcp_type, "passive"));
|
||||||
|
g_free (tcp_type);
|
||||||
|
} else {
|
||||||
|
fail_if (gst_structure_has_field (s, "tcp-type"));
|
||||||
|
}
|
||||||
g_free (address);
|
g_free (address);
|
||||||
g_free (candidateType);
|
g_free (candidateType);
|
||||||
g_free (protocol);
|
g_free (protocol);
|
||||||
|
g_free (foundation);
|
||||||
|
g_free (username_fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user