|
|
@@ -222,15 +222,13 @@ export default class RtxModifier {
|
|
222
|
222
|
}
|
|
223
|
223
|
|
|
224
|
224
|
/**
|
|
225
|
|
- * Remove all reference to any rtx ssrcs that
|
|
226
|
|
- * don't correspond to the primary stream.
|
|
227
|
|
- * Must be called *after* any simulcast streams
|
|
228
|
|
- * have been imploded
|
|
|
225
|
+ * Strip all rtx streams from the given sdp
|
|
229
|
226
|
* @param {string} sdpStr sdp in raw string format
|
|
|
227
|
+ * @returns {string} sdp string with all rtx streams stripped
|
|
230
|
228
|
*/
|
|
231
|
|
- implodeRemoteRtxSsrcs (sdpStr) {
|
|
232
|
|
- let parsedSdp = transform.parse(sdpStr);
|
|
233
|
|
- let videoMLine =
|
|
|
229
|
+ stripRtx (sdpStr) {
|
|
|
230
|
+ const parsedSdp = transform.parse(sdpStr);
|
|
|
231
|
+ const videoMLine =
|
|
234
|
232
|
parsedSdp.media.find(mLine => mLine.type === "video");
|
|
235
|
233
|
if (videoMLine.direction === "inactive" ||
|
|
236
|
234
|
videoMLine.direction === "recvonly") {
|
|
|
@@ -238,39 +236,25 @@ export default class RtxModifier {
|
|
238
|
236
|
"m line is inactive or recvonly");
|
|
239
|
237
|
return sdpStr;
|
|
240
|
238
|
}
|
|
241
|
|
- if (!videoMLine.ssrcGroups) {
|
|
242
|
|
- // Nothing to do
|
|
243
|
|
- return sdpStr;
|
|
|
239
|
+ if (!videoMLine.ssrcs) {
|
|
|
240
|
+ logger.info("RtxModifier doing nothing, no video ssrcs present");
|
|
|
241
|
+ return sdpStr;
|
|
244
|
242
|
}
|
|
245
|
|
-
|
|
246
|
|
- // Returns true if the given ssrc is present
|
|
247
|
|
- // in the mLine's ssrc list
|
|
248
|
|
- let ssrcExists = (ssrcToFind) => {
|
|
249
|
|
- return videoMLine.ssrcs.
|
|
250
|
|
- find((ssrc) => ssrc.id + "" === ssrcToFind);
|
|
251
|
|
- };
|
|
252
|
|
- let ssrcsToRemove = [];
|
|
253
|
|
- videoMLine.ssrcGroups.forEach(group => {
|
|
254
|
|
- if (group.semantics === "FID") {
|
|
255
|
|
- let primarySsrc = group.ssrcs.split(" ")[0];
|
|
256
|
|
- let rtxSsrc = group.ssrcs.split(" ")[1];
|
|
257
|
|
- if (!ssrcExists(primarySsrc)) {
|
|
258
|
|
- ssrcsToRemove.push(rtxSsrc);
|
|
259
|
|
- }
|
|
260
|
|
- }
|
|
|
243
|
+ const fidGroups = videoMLine.ssrcGroups
|
|
|
244
|
+ .filter(group => group.semantics === "FID");
|
|
|
245
|
+ // Remove the fid groups from the mline
|
|
|
246
|
+ videoMLine.ssrcGroups = videoMLine.ssrcGroups
|
|
|
247
|
+ .filter(group => group.semantics !== "FID");
|
|
|
248
|
+ // Get the rtx ssrcs and remove them from the mline
|
|
|
249
|
+ const ssrcsToRemove = [];
|
|
|
250
|
+ fidGroups.forEach(fidGroup => {
|
|
|
251
|
+ const groupSsrcs = SDPUtil.parseGroupSsrcs(fidGroup);
|
|
|
252
|
+ const rtxSsrc = groupSsrcs[1];
|
|
|
253
|
+ ssrcsToRemove.push(rtxSsrc);
|
|
261
|
254
|
});
|
|
262
|
255
|
videoMLine.ssrcs = videoMLine.ssrcs
|
|
263
|
|
- .filter(ssrc => ssrcsToRemove.indexOf(ssrc.id + "") === -1);
|
|
264
|
|
- videoMLine.ssrcGroups = videoMLine.ssrcGroups
|
|
265
|
|
- .filter(group => {
|
|
266
|
|
- let ssrcs = group.ssrcs.split(" ");
|
|
267
|
|
- for (let i = 0; i < ssrcs.length; ++i) {
|
|
268
|
|
- if (ssrcsToRemove.indexOf(ssrcs[i]) !== -1) {
|
|
269
|
|
- return false;
|
|
270
|
|
- }
|
|
271
|
|
- }
|
|
272
|
|
- return true;
|
|
273
|
|
- });
|
|
|
256
|
+ .filter(line => ssrcsToRemove.indexOf(line.id) === -1);
|
|
|
257
|
+
|
|
274
|
258
|
return transform.write(parsedSdp);
|
|
275
|
259
|
}
|
|
276
|
260
|
}
|