Переглянути джерело

feat: Add videoType to sources signaled in jingle. (#2058)

* feat: Add videoType to sources signaled in jingle.
dev1
bgrozev 3 роки тому
джерело
коміт
28aab9fcf8
Аккаунт користувача з таким Email не знайдено

+ 7
- 0
modules/RTC/MockClasses.js Переглянути файл

@@ -84,6 +84,13 @@ export class MockPeerConnection {
84 84
     usesUnifiedPlan() {
85 85
         return this._usesUnifiedPlan;
86 86
     }
87
+
88
+    /**
89
+     * {@link TraceablePeerConnection.getLocalVideoTracks}.
90
+     */
91
+    getLocalVideoTracks() {
92
+        return [];
93
+    }
87 94
 }
88 95
 
89 96
 /**

+ 1
- 1
modules/RTC/TraceablePeerConnection.js Переглянути файл

@@ -661,7 +661,7 @@ TraceablePeerConnection.prototype.getLocalTracks = function(mediaType) {
661 661
 /**
662 662
  * Retrieves the local video tracks.
663 663
  *
664
- * @returns {JitsiLocalTrack|undefined} - local video tracks.
664
+ * @returns {Array<JitsiLocalTrack>} - local video tracks.
665 665
  */
666 666
 TraceablePeerConnection.prototype.getLocalVideoTracks = function() {
667 667
     return this.getLocalTracks(MediaType.VIDEO);

+ 17
- 1
modules/sdp/LocalSdpMunger.js Переглянути файл

@@ -399,14 +399,30 @@ export default class LocalSdpMunger {
399 399
                 trackIndex = streamId.split('-')[2];
400 400
             }
401 401
 
402
+            const sourceName = getSourceNameForJitsiTrack(this.localEndpointId, mediaType, trackIndex);
403
+
402 404
             if (!nameExists) {
403 405
                 // Inject source names as a=ssrc:3124985624 name:endpointA-v0
404 406
                 mediaSection.ssrcs.push({
405 407
                     id: source,
406 408
                     attribute: 'name',
407
-                    value: getSourceNameForJitsiTrack(this.localEndpointId, mediaType, trackIndex)
409
+                    value: sourceName
408 410
                 });
409 411
             }
412
+
413
+            if (mediaType === MediaType.VIDEO) {
414
+                const videoType = this.tpc.getLocalVideoTracks().find(track => track.getSourceName() === sourceName)
415
+                    ?.getVideoType();
416
+
417
+                if (videoType) {
418
+                    // Inject videoType as a=ssrc:1234 videoType:desktop.
419
+                    mediaSection.ssrcs.push({
420
+                        id: source,
421
+                        attribute: 'videoType',
422
+                        value: videoType
423
+                    });
424
+                }
425
+            }
410 426
         }
411 427
     }
412 428
 }

+ 2
- 0
modules/sdp/SDP.js Переглянути файл

@@ -242,10 +242,12 @@ SDP.prototype.toJingle = function(elem, thecreator) {
242 242
 
243 243
                 for (const [ availableSsrc, ssrcParameters ] of ssrcMap) {
244 244
                     const sourceName = SDPUtil.parseSourceNameLine(ssrcParameters);
245
+                    const videoType = SDPUtil.parseVideoTypeLine(ssrcParameters);
245 246
 
246 247
                     elem.c('source', {
247 248
                         ssrc: availableSsrc,
248 249
                         name: FeatureFlags.isSourceNameSignalingEnabled() ? sourceName : undefined,
250
+                        videoType,
249 251
                         xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0'
250 252
                     });
251 253
 

+ 2
- 0
modules/sdp/SDPDiffer.js Переглянути файл

@@ -171,10 +171,12 @@ SDPDiffer.prototype.toJingle = function(modify) {
171 171
             const mediaSsrc = media.ssrcs[ssrcNum];
172 172
             const ssrcLines = mediaSsrc.lines;
173 173
             const sourceName = SDPUtil.parseSourceNameLine(ssrcLines);
174
+            const videoType = SDPUtil.parseVideoTypeLine(ssrcLines);
174 175
 
175 176
             modify.c('source', { xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
176 177
             modify.attrs({
177 178
                 name: FeatureFlags.isSourceNameSignalingEnabled() ? sourceName : undefined,
179
+                videoType,
178 180
                 ssrc: mediaSsrc.ssrc
179 181
             });
180 182
 

+ 14
- 0
modules/sdp/SDPUtil.js Переглянути файл

@@ -295,6 +295,20 @@ const SDPUtil = {
295 295
         // Everything past the "name:" part
296 296
         return sourceNameLine?.substring(sourceNameLine.indexOf(' name:') + 6);
297 297
     },
298
+
299
+    /**
300
+     * Parse the "videoType" attribute encoded in a set of SSRC attributes (e.g.
301
+     * "a=ssrc:1234 videoType:desktop")
302
+     *
303
+     * @param {string[]} ssrcLines
304
+     * @returns {string | undefined}
305
+     */
306
+    parseVideoTypeLine(ssrcLines) {
307
+        const s = ' videoType:';
308
+        const videoTypeLine = ssrcLines.find(ssrcSdpLine => ssrcSdpLine.indexOf(s) > 0);
309
+
310
+        return videoTypeLine?.substring(videoTypeLine.indexOf(s) + s.length);
311
+    },
298 312
     parseRTCPFB(line) {
299 313
         const parts = line.substr(10).split(' ');
300 314
         const data = {};

+ 4
- 0
types/auto/modules/RTC/MockClasses.d.ts Переглянути файл

@@ -53,6 +53,10 @@ export class MockPeerConnection {
53 53
      * {@link TraceablePeerConnection.usesUnifiedPlan}.
54 54
      */
55 55
     usesUnifiedPlan(): boolean;
56
+    /**
57
+     * {@link TraceablePeerConnection.getLocalVideoTracks}.
58
+     */
59
+    getLocalVideoTracks(): any[];
56 60
 }
57 61
 /**
58 62
  * Mock {@link RTC} - add things as needed, but only things useful for all tests.

+ 2
- 2
types/auto/modules/RTC/TraceablePeerConnection.d.ts Переглянути файл

@@ -331,9 +331,9 @@ export default class TraceablePeerConnection {
331 331
     /**
332 332
      * Retrieves the local video tracks.
333 333
      *
334
-     * @returns {JitsiLocalTrack|undefined} - local video tracks.
334
+     * @returns {Array<JitsiLocalTrack>} - local video tracks.
335 335
      */
336
-    getLocalVideoTracks(): any | undefined;
336
+    getLocalVideoTracks(): Array<any>;
337 337
     /**
338 338
      * Checks whether or not this {@link TraceablePeerConnection} instance contains any local tracks for given
339 339
      * <tt>mediaType</tt>.

+ 16
- 0
types/auto/modules/sdp/SDPUtil.d.ts Переглянути файл

@@ -152,6 +152,22 @@ declare namespace SDPUtil {
152 152
      * @returns {string | undefined}
153 153
      */
154 154
     function parseSourceNameLine(ssrcLines: string[]): string;
155
+    /**
156
+     * Parse the "videoType" attribute encoded in a set of SSRC attributes (e.g.
157
+     * "a=ssrc:1234 videoType:desktop")
158
+     *
159
+     * @param {string[]} ssrcLines
160
+     * @returns {string | undefined}
161
+     */
162
+    function parseVideoTypeLine(ssrcLines: string[]): string;
163
+    /**
164
+     * Parse the "videoType" attribute encoded in a set of SSRC attributes (e.g.
165
+     * "a=ssrc:1234 videoType:desktop")
166
+     *
167
+     * @param {string[]} ssrcLines
168
+     * @returns {string | undefined}
169
+     */
170
+    function parseVideoTypeLine(ssrcLines: string[]): string;
155 171
     function parseRTCPFB(line: any): {
156 172
         pt: any;
157 173
         type: any;

Завантаження…
Відмінити
Зберегти