aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala')
-rw-r--r--xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala49
1 files changed, 48 insertions, 1 deletions
diff --git a/xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala b/xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala
index 452f1d65..faba38c9 100644
--- a/xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala
+++ b/xmpp-vala/src/module/xep/0167_jingle_rtp/payload_type.vala
@@ -3,6 +3,8 @@ using Xmpp;
using Xmpp.Xep;
public class Xmpp.Xep.JingleRtp.PayloadType {
+ public const string NAME = "payload-type";
+
public uint8 id { get; set; }
public string? name { get; set; }
public uint8 channels { get; set; default = 1; }
@@ -10,6 +12,7 @@ public class Xmpp.Xep.JingleRtp.PayloadType {
public uint32 maxptime { get; set; }
public uint32 ptime { get; set; }
public Map<string, string> parameters = new HashMap<string, string>();
+ public Gee.List<RtcpFeedback> rtcp_fbs = new ArrayList<RtcpFeedback>();
public static PayloadType parse(StanzaNode node) {
PayloadType payloadType = new PayloadType();
@@ -22,11 +25,14 @@ public class Xmpp.Xep.JingleRtp.PayloadType {
foreach (StanzaNode parameter in node.get_subnodes("parameter")) {
payloadType.parameters[parameter.get_attribute("name")] = parameter.get_attribute("value");
}
+ foreach (StanzaNode subnode in node.get_subnodes(RtcpFeedback.NAME, RtcpFeedback.NS_URI)) {
+ payloadType.rtcp_fbs.add(RtcpFeedback.parse(subnode));
+ }
return payloadType;
}
public StanzaNode to_xml() {
- StanzaNode node = new StanzaNode.build("payload-type", NS_URI)
+ StanzaNode node = new StanzaNode.build(NAME, NS_URI)
.put_attribute("id", id.to_string());
if (channels != 1) node.put_attribute("channels", channels.to_string());
if (clockrate != 0) node.put_attribute("clockrate", clockrate.to_string());
@@ -38,9 +44,25 @@ public class Xmpp.Xep.JingleRtp.PayloadType {
.put_attribute("name", parameter)
.put_attribute("value", parameters[parameter]));
}
+ foreach (RtcpFeedback rtcp_fb in rtcp_fbs) {
+ node.put_node(rtcp_fb.to_xml());
+ }
return node;
}
+ public PayloadType clone() {
+ PayloadType clone = new PayloadType();
+ clone.id = id;
+ clone.name = name;
+ clone.channels = channels;
+ clone.clockrate = clockrate;
+ clone.maxptime = maxptime;
+ clone.ptime = ptime;
+ clone.parameters.set_all(parameters);
+ clone.rtcp_fbs.add_all(rtcp_fbs);
+ return clone;
+ }
+
public static bool equals_func(PayloadType a, PayloadType b) {
return a.id == b.id &&
a.name == b.name &&
@@ -49,4 +71,29 @@ public class Xmpp.Xep.JingleRtp.PayloadType {
a.maxptime == b.maxptime &&
a.ptime == b.ptime;
}
+}
+
+public class Xmpp.Xep.JingleRtp.RtcpFeedback {
+ public const string NS_URI = "urn:xmpp:jingle:apps:rtp:rtcp-fb:0";
+ public const string NAME = "rtcp-fb";
+
+ public string type_ { get; private set; }
+ public string? subtype { get; private set; }
+
+ public RtcpFeedback(string type, string? subtype = null) {
+ this.type_ = type;
+ this.subtype = subtype;
+ }
+
+ public static RtcpFeedback parse(StanzaNode node) {
+ return new RtcpFeedback(node.get_attribute("type"), node.get_attribute("subtype"));
+ }
+
+ public StanzaNode to_xml() {
+ StanzaNode node = new StanzaNode.build(NAME, NS_URI)
+ .add_self_xmlns()
+ .put_attribute("type", type_);
+ if (subtype != null) node.put_attribute("subtype", subtype);
+ return node;
+ }
} \ No newline at end of file