Skip to content

Commit afb1de1

Browse files
authored
feat: provide codec to broadcaster service (#144)
* fix: origin-edge endpoint description payload type from video * feat: provide codec to broadcaster service
1 parent d2f599b commit afb1de1

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

packages/server/src/mediaStreamsInfo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ export interface MediaStreamsInfo {
1818
video: {
1919
ssrcs: MediaStreamsInfoSsrc[];
2020
ssrcGroups: MediaStreamsInfoSsrcGroup[];
21+
codec?: string;
2122
}
2223
}

packages/server/src/whip/sfu/sfuWhipResource.ts

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,16 +248,49 @@ export class SfuWhipResource implements WhipResource {
248248
originEdgeEndpointDesc.audio.ssrcs = [parseInt(audioSsrc)];
249249
}
250250

251-
if (offerVideo && videoMainSsrc && videoRtxSsrc && videoMediaStream) {
252-
let videoStreamId = offerVideo.ssrcs.at
251+
if (offerVideo) {
252+
originEdgeEndpointDesc.video["payload-types"][0].id = offerVideo.rtp[0].payload;
253+
originEdgeEndpointDesc.video["payload-types"][0].name = offerVideo.rtp[0].codec;
254+
if (offerVideo.rtp[1]) {
255+
originEdgeEndpointDesc.video["payload-types"][1].id = offerVideo.rtp[1].payload;
256+
originEdgeEndpointDesc.video["payload-types"][1].parameters = { 'apt': offerVideo.rtp[0].payload.toString() };
257+
} else {
258+
originEdgeEndpointDesc.video["payload-types"] = originEdgeEndpointDesc.video["payload-types"].filter(pt => pt.name !== 'rtx');
259+
}
260+
originEdgeEndpointDesc.video["rtp-hdrexts"] = [];
261+
offerVideo.ext && offerVideo.ext.forEach(ext => originEdgeEndpointDesc.video["rtp-hdrexts"].push({ id: ext.value, uri: ext.uri }));
253262

254-
originEdgeEndpointDesc.video.streams = [
255-
{
256-
sources: [{ main: parseInt(videoMainSsrc), feedback: parseInt(videoRtxSsrc) }],
257-
id: videoMediaStream,
258-
content: 'video'
259-
}
260-
];
263+
originEdgeEndpointDesc.video["payload-types"].forEach(payloadType => {
264+
const rtcpFbs = offerVideo.rtcpFb.filter(element => element.payload === payloadType.id);
265+
payloadType["rtcp-fbs"] = rtcpFbs.map(rtcpFb => {
266+
return {
267+
type: rtcpFb.type,
268+
subtype: rtcpFb.subtype
269+
};
270+
});
271+
});
272+
}
273+
274+
if (offerVideo && videoMainSsrc && videoMediaStream) {
275+
if (videoRtxSsrc) {
276+
let videoStreamId = offerVideo.ssrcs.at
277+
278+
originEdgeEndpointDesc.video.streams = [
279+
{
280+
sources: [{ main: parseInt(videoMainSsrc), feedback: parseInt(videoRtxSsrc) }],
281+
id: videoMediaStream,
282+
content: 'video'
283+
}
284+
];
285+
} else {
286+
originEdgeEndpointDesc.video.streams = [
287+
{
288+
sources: [{ main: parseInt(videoMainSsrc) }],
289+
id: videoMediaStream,
290+
content: 'video'
291+
}
292+
];
293+
}
261294
}
262295

263296
console.log(`Configuring origin edge with\n${JSON.stringify(originEdgeEndpointDesc)}`);
@@ -477,6 +510,11 @@ export class SfuWhipResource implements WhipResource {
477510
if (media.type !== 'audio' && media.type !== 'video') {
478511
continue;
479512
}
513+
if (media.type === 'video') {
514+
if (!media.rtp.some(rtp => rtp.codec === 'VP8')) {
515+
this.mediaStreams.video.codec = 'H264';
516+
}
517+
}
480518

481519
let mediaStreams = media.type === 'audio' ? audioMediaStreams : videoMediaStreams;
482520
media.ssrcs.forEach(ssrc => {

0 commit comments

Comments
 (0)