Skip to content

Commit 503b963

Browse files
authored
Added support for supplemental codec with streams that has audio and … (#7120)
* Added support for supplemental codec with streams that has audio and video in same file. --------- Authored-by: Timi Tuohenmaa <[email protected]>
1 parent 862e874 commit 503b963

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

src/controller/buffer-controller.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
areCodecsMediaSourceSupported,
1010
getCodecCompatibleName,
1111
pickMostCompleteCodecName,
12+
replaceVideoCodec,
1213
} from '../utils/codecs';
1314
import { Logger } from '../utils/logger';
1415
import {
@@ -1436,14 +1437,15 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => (key === 'initSe
14361437
private getTrackCodec(track: BaseTrack, trackName: SourceBufferName): string {
14371438
// Use supplemental video codec when supported when adding SourceBuffer (#5558)
14381439
const supplementalCodec = track.supplemental;
1440+
let trackCodec = track.codec;
14391441
if (
14401442
supplementalCodec &&
1441-
trackName === 'video' &&
1442-
areCodecsMediaSourceSupported(supplementalCodec, trackName)
1443+
(trackName === 'video' || trackName === 'audiovideo') &&
1444+
areCodecsMediaSourceSupported(supplementalCodec, 'video')
14431445
) {
1444-
return supplementalCodec;
1446+
trackCodec = replaceVideoCodec(trackCodec, supplementalCodec);
14451447
}
1446-
const codec = pickMostCompleteCodecName(track.codec, track.levelCodec);
1448+
const codec = pickMostCompleteCodecName(trackCodec, track.levelCodec);
14471449
if (codec) {
14481450
if (trackName.slice(0, 5) === 'audio') {
14491451
return getCodecCompatibleName(codec, this.appendSource);

src/remux/passthrough-remuxer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class PassThroughRemuxer implements Remuxer {
103103
tracks.audiovideo = {
104104
container: 'video/mp4',
105105
codec: audioCodec + ',' + videoCodec,
106+
supplemental: initData.video.supplemental,
106107
initSegment,
107108
id: 'main',
108109
};

src/utils/codecs.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,25 @@ export function getCodecCompatibleName(
202202
);
203203
}
204204

205+
export function replaceVideoCodec(
206+
originalCodecs: string | undefined,
207+
newVideoCodec: string | undefined,
208+
): string | undefined {
209+
const codecs: string[] = [];
210+
if (originalCodecs) {
211+
const allCodecs = originalCodecs.split(',');
212+
for (let i = 0; i < allCodecs.length; i++) {
213+
if (!isCodecType(allCodecs[i], 'video')) {
214+
codecs.push(allCodecs[i]);
215+
}
216+
}
217+
}
218+
if (newVideoCodec) {
219+
codecs.push(newVideoCodec);
220+
}
221+
return codecs.join(',');
222+
}
223+
205224
export function pickMostCompleteCodecName(
206225
parsedCodec: string | undefined,
207226
levelCodec: string | undefined,

0 commit comments

Comments
 (0)