Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_xep_0293.py @ 4309:b56b1eae7994
component email gateway: add multicasting:
XEP-0033 multicasting is now supported both for incoming and outgoing messages. XEP-0033
metadata are converted to suitable Email headers and vice versa.
Email address and JID are both supported, and delivery is done by the gateway when
suitable on incoming messages.
rel 450
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 26 Sep 2024 16:12:01 +0200 |
parents | 4b842c1fb686 |
children |
rev | line source |
---|---|
4060
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia plugin |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import List |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from twisted.words.xish import domish |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from wokkel import disco, iwokkel |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from zope.interface import implementer |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4060
diff
changeset
|
26 from libervia.backend.core.constants import Const as C |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4060
diff
changeset
|
27 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4060
diff
changeset
|
28 from libervia.backend.core.log import getLogger |
4060
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 log = getLogger(__name__) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 NS_JINGLE_RTP_RTCP_FB = "urn:xmpp:jingle:apps:rtp:rtcp-fb:0" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 PLUGIN_INFO = { |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 C.PI_NAME: "Jingle RTP Feedback Negotiation", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 C.PI_IMPORT_NAME: "XEP-0293", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 C.PI_TYPE: "XEP", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_MODES: C.PLUG_MODE_BOTH, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 C.PI_PROTOCOLS: ["XEP-0293"], |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_DEPENDENCIES: ["XEP-0092", "XEP-0166", "XEP-0167"], |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_RECOMMENDATIONS: [], |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_MAIN: "XEP_0293", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_HANDLER: "yes", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_DESCRIPTION: _("""Jingle RTP Feedback Negotiation"""), |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 } |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 RTCP_FB_KEY = "rtcp-fb" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 class XEP_0293: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 def __init__(self, host): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 host.trigger.add("XEP-0167_parse_sdp_a", self._parse_sdp_a_trigger) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 host.trigger.add( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 "XEP-0167_generate_sdp_content", self._generate_sdp_content_trigger |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 host.trigger.add("XEP-0167_parse_description", self._parse_description_trigger) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 host.trigger.add( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 "XEP-0167_parse_description_payload_type", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 self._parse_description_payload_type_trigger, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 host.trigger.add("XEP-0167_build_description", self._build_description_trigger) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 host.trigger.add( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 "XEP-0167_build_description_payload_type", |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 self._build_description_payload_type_trigger, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 def get_handler(self, client): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 return XEP_0293_handler() |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 ## SDP |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 def _parse_sdp_a_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 self, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 attribute: str, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 parts: List[str], |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 call_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 metadata: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 media_type: str, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 application_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 transport_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 """Parse "rtcp-fb" and "rtcp-fb-trr-int" attributes |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 @param attribute: The attribute being parsed. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 @param parts: The list of parts in the attribute. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 @param call_data: The call data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 @param metadata: The metadata dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 @param media_type: The media type (e.g., audio, video). |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 @param application_data: The application data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 @param transport_data: The transport data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 @param payload_map: The payload map dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 """ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 if attribute == "rtcp-fb": |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 pt_id = parts[0] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 feedback_type = parts[1] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 feedback_subtype = None |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 parameters = {} |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 # Check if there are extra parameters |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 if len(parts) > 2: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 feedback_subtype = parts[2] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 if len(parts) > 3: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 for parameter in parts[3:]: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 name, _, value = parameter.partition("=") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 parameters[name] = value or None |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 # Check if this feedback is linked to a payload type |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 if pt_id == "*": |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 # Not linked to a payload type, add to application data |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 application_data.setdefault(RTCP_FB_KEY, []).append( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 (feedback_type, feedback_subtype, parameters) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 else: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 payload_types = application_data.get("payload_types", {}) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 try: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 payload_type = payload_types[int(pt_id)] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 except KeyError: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 log.warning( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 f"Got reference to unknown payload type {pt_id}: " |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 f"{' '.join(parts)}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 else: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 # Linked to a payload type, add to payload data |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 payload_type.setdefault(RTCP_FB_KEY, []).append( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 (feedback_type, feedback_subtype, parameters) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 elif attribute == "rtcp-fb-trr-int": |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 pt_id = parts[0] # Payload type ID |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 interval = int(parts[1]) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 # Check if this interval is linked to a payload type |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 if pt_id == "*": |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 # Not linked to a payload type, add to application data |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 application_data["rtcp-fb-trr-int"] = interval |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 else: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 payload_types = application_data.get("payload_types", {}) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 try: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 payload_type = payload_types[int(pt_id)] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 except KeyError: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 log.warning( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 f"Got reference to unknown payload type {pt_id}: " |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 f"{' '.join(parts)}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 else: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 # Linked to a payload type, add to payload data |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 payload_type["rtcp-fb-trr-int"] = interval |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 def _generate_rtcp_fb_lines( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 self, data: dict, pt_id: str, sdp_lines: List[str] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 for type_, subtype, parameters in data.get(RTCP_FB_KEY, []): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 parameters_strs = [ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 f"{k}={v}" if v is not None else k for k, v in parameters.items() |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 ] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 parameters_str = " ".join(parameters_strs) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 sdp_line = f"a=rtcp-fb:{pt_id} {type_}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 if subtype: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 sdp_line += f" {subtype}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 if parameters_str: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 sdp_line += f" {parameters_str}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 sdp_lines.append(sdp_line) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 def _generate_rtcp_fb_trr_int_lines( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 self, data: dict, pt_id: str, sdp_lines: List[str] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 if "rtcp-fb-trr-int" not in data: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 return |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 sdp_lines.append(f"a=rtcp-fb:{pt_id} trr-int {data['rtcp-fb-trr-int']}") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 def _generate_sdp_content_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 self, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 session: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 local: bool, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 content_name: str, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 content_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 sdp_lines: List[str], |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 application_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 app_data_key: str, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 media_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 media: str, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 """Generate SDP attributes "rtcp-fb" and "rtcp-fb-trr-int" from application data. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 @param session: The session data. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 @param local: Whether this is local or remote content. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 @param content_name: The name of the content. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 @param content_data: The data of the content. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 @param sdp_lines: The list of SDP lines to append to. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 @param application_data: The application data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 @param app_data_key: The key for the application data. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 @param media_data: The media data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 @param media: The media type (e.g., audio, video). |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 """ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 # Generate lines for application data |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 self._generate_rtcp_fb_lines(application_data, "*", sdp_lines) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 self._generate_rtcp_fb_trr_int_lines(application_data, "*", sdp_lines) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 # Generate lines for each payload type |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 for pt_id, payload_data in media_data.get("payload_types", {}).items(): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 self._generate_rtcp_fb_lines(payload_data, pt_id, sdp_lines) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 self._generate_rtcp_fb_trr_int_lines(payload_data, pt_id, sdp_lines) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 ## XML |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 def _parse_rtcp_fb_elements(self, parent_elt: domish.Element, data: dict) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
211 """Parse the <rtcp-fb> and <rtcp-fb-trr-int> elements. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 @param parent_elt: The parent domish.Element. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 @param data: The data dict to populate. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 """ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 for rtcp_fb_elt in parent_elt.elements(NS_JINGLE_RTP_RTCP_FB, "rtcp-fb"): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 try: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 type_ = rtcp_fb_elt["type"] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 subtype = rtcp_fb_elt.getAttribute("subtype") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 parameters = {} |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 for parameter_elt in rtcp_fb_elt.elements( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 NS_JINGLE_RTP_RTCP_FB, "parameter" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 ): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 parameters[parameter_elt["name"]] = parameter_elt.getAttribute( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 "value" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 data.setdefault(RTCP_FB_KEY, []).append((type_, subtype, parameters)) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 except (KeyError, ValueError) as e: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
231 log.warning(f"Error while parsing <rtcp-fb>: {e}\n{rtcp_fb_elt.toXml()}") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
232 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 for rtcp_fb_trr_int_elt in parent_elt.elements( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
234 NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
235 ): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
236 try: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
237 interval_value = int(rtcp_fb_trr_int_elt["value"]) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
238 data.setdefault("rtcp_fb_trr_int", []).append(interval_value) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
239 except (KeyError, ValueError) as e: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
240 log.warning( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
241 f"Error while parsing <rtcp-fb-trr-int>: {e}\n" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
242 f"{rtcp_fb_trr_int_elt.toXml()}" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
243 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
245 def _parse_description_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
246 self, desc_elt: domish.Element, media_data: dict |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 """Parse the <rtcp-fb> and <rtcp-fb-trr-int> elements from a description. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
249 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 @param desc_elt: The <description> domish.Element. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
251 @param media_data: The media data dict to populate. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
252 """ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
253 self._parse_rtcp_fb_elements(desc_elt, media_data) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
254 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 def _parse_description_payload_type_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
256 self, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
257 desc_elt: domish.Element, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
258 media_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
259 payload_type_elt: domish.Element, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 payload_type_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
261 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 """Parse the <rtcp-fb> and <rtcp-fb-trr-int> elements from a payload type. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
263 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
264 @param desc_elt: The <description> domish.Element. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
265 @param media_data: The media data dict. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
266 @param payload_type_elt: The <payload-type> domish.Element. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 @param payload_type_data: The payload type data dict to populate. |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
268 """ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
269 self._parse_rtcp_fb_elements(payload_type_elt, payload_type_data) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 def build_rtcp_fb_elements(self, parent_elt: domish.Element, data: dict) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
272 """Helper method to build the <rtcp-fb> and <rtcp-fb-trr-int> elements""" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
273 for type_, subtype, parameters in data.get(RTCP_FB_KEY, []): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
274 rtcp_fb_elt = parent_elt.addElement((NS_JINGLE_RTP_RTCP_FB, "rtcp-fb")) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
275 rtcp_fb_elt["type"] = type_ |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
276 if subtype: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
277 rtcp_fb_elt["subtype"] = subtype |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
278 for name, value in parameters.items(): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
279 param_elt = rtcp_fb_elt.addElement(name) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 if value is not None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
281 param_elt.addContent(str(value)) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
283 if "rtcp-fb-trr-int" in data: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
284 rtcp_fb_trr_int_elt = parent_elt.addElement( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 (NS_JINGLE_RTP_RTCP_FB, "rtcp-fb-trr-int") |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
286 ) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
287 rtcp_fb_trr_int_elt["value"] = str(data["rtcp-fb-trr-int"]) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
288 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
289 def _build_description_payload_type_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
290 self, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
291 desc_elt: domish.Element, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
292 media_data: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
293 payload_type: dict, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
294 payload_type_elt: domish.Element, |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
295 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
296 """Build the <rtcp-fb> and <rtcp-fb-trr-int> elements for a payload type""" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
297 self.build_rtcp_fb_elements(payload_type_elt, payload_type) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
298 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
299 def _build_description_trigger( |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
300 self, desc_elt: domish.Element, media_data: dict, session: dict |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
301 ) -> None: |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 """Build the <rtcp-fb> and <rtcp-fb-trr-int> elements for a media description""" |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
303 self.build_rtcp_fb_elements(desc_elt, media_data) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
305 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
306 @implementer(iwokkel.IDisco) |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
307 class XEP_0293_handler(XMPPHandler): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
308 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
309 return [disco.DiscoFeature(NS_JINGLE_RTP_RTCP_FB)] |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
310 |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
311 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
fce92ba311f4
plugin XEP-0293: "Jingle RTP Feedback Negotiation" implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
312 return [] |