forked from Pissandshittium/pissandshittium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathssrc_info_manager.js
161 lines (143 loc) · 4.59 KB
/
ssrc_info_manager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* Get the ssrc if |report| is an ssrc report.
*
* @param {!Object} report The object contains id, type, and stats, where stats
* is the object containing timestamp and values, which is an array of
* strings, whose even index entry is the name of the stat, and the odd
* index entry is the value.
* @return {?string} The ssrc.
*/
export function GetSsrcFromReport(report) {
if (report.type !== 'ssrc') {
console.warn('Trying to get ssrc from non-ssrc report.');
return null;
}
// If the 'ssrc' name-value pair exists, return the value; otherwise, return
// the report id.
// The 'ssrc' name-value pair only exists in an upcoming Libjingle change. Old
// versions use id to refer to the ssrc.
//
// TODO(jiayl): remove the fallback to id once the Libjingle change is rolled
// to Chrome.
if (report.stats && report.stats.values) {
for (let i = 0; i < report.stats.values.length - 1; i += 2) {
if (report.stats.values[i] === 'ssrc') {
return report.stats.values[i + 1];
}
}
}
return report.id;
}
/**
* SsrcInfoManager stores the ssrc stream info extracted from SDP.
*/
export class SsrcInfoManager {
constructor() {
/**
* Map from ssrc id to an object containing all the stream properties.
* @type {!Object<!Object<string>>}
* @private
*/
this.streamInfoContainer_ = {};
/**
* The string separating attributes in an SDP.
* @type {string}
* @const
* @private
*/
this.ATTRIBUTE_SEPARATOR_ = /[\r,\n]/;
/**
* The regex separating fields within an ssrc description.
* @type {RegExp}
* @const
* @private
*/
this.FIELD_SEPARATOR_REGEX_ = / .*:/;
/**
* The prefix string of an ssrc description.
* @type {string}
* @const
* @private
*/
this.SSRC_ATTRIBUTE_PREFIX_ = 'a=ssrc:';
/**
* The className of the ssrc info parent element.
* @type {string}
* @const
*/
this.SSRC_INFO_BLOCK_CLASS = 'ssrc-info-block';
}
/**
* Extracts the stream information from |sdp| and saves it.
* For example:
* a=ssrc:1234 msid:abcd
* a=ssrc:1234 label:hello
*
* @param {string} sdp The SDP string.
*/
addSsrcStreamInfo(sdp) {
const attributes = sdp.split(this.ATTRIBUTE_SEPARATOR_);
for (let i = 0; i < attributes.length; ++i) {
// Check if this is a ssrc attribute.
if (attributes[i].indexOf(this.SSRC_ATTRIBUTE_PREFIX_) !== 0) {
continue;
}
let nextFieldIndex = attributes[i].search(this.FIELD_SEPARATOR_REGEX_);
if (nextFieldIndex === -1) {
continue;
}
const ssrc = attributes[i].substring(
this.SSRC_ATTRIBUTE_PREFIX_.length, nextFieldIndex);
if (!this.streamInfoContainer_[ssrc]) {
this.streamInfoContainer_[ssrc] = {};
}
// Make |rest| starting at the next field.
let rest = attributes[i].substring(nextFieldIndex + 1);
let name;
let value;
while (rest.length > 0) {
nextFieldIndex = rest.search(this.FIELD_SEPARATOR_REGEX_);
if (nextFieldIndex === -1) {
nextFieldIndex = rest.length;
}
// The field name is the string before the colon.
name = rest.substring(0, rest.indexOf(':'));
// The field value is from after the colon to the next field.
value = rest.substring(rest.indexOf(':') + 1, nextFieldIndex);
this.streamInfoContainer_[ssrc][name] = value;
// Move |rest| to the start of the next field.
rest = rest.substring(nextFieldIndex + 1);
}
}
}
/**
* @param {string} sdp The ssrc id.
* @return {!Object<string>} The object containing the ssrc information.
*/
getStreamInfo(ssrc) {
return this.streamInfoContainer_[ssrc];
}
/**
* Populate the ssrc information into |parentElement|, each field as a
* DIV element.
*
* @param {!Element} parentElement The parent element for the ssrc info.
* @param {string} ssrc The ssrc id.
*/
populateSsrcInfo(parentElement, ssrc) {
if (!this.streamInfoContainer_[ssrc]) {
return;
}
parentElement.className = this.SSRC_INFO_BLOCK_CLASS;
let fieldElement;
for (const property in this.streamInfoContainer_[ssrc]) {
fieldElement = document.createElement('div');
parentElement.appendChild(fieldElement);
fieldElement.textContent =
property + ':' + this.streamInfoContainer_[ssrc][property];
}
}
}