Skip to content

Commit 7896944

Browse files
committed
Fix errors in SourceBuffer creation when media parsed codec is unsupported
#7302
1 parent 840f012 commit 7896944

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

src/controller/stream-controller.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,11 +1424,9 @@ export default class StreamController
14241424
// include levelCodec in audio and video tracks
14251425
const { audio, video, audiovideo } = tracks;
14261426
if (audio) {
1427-
let audioCodec = pickMostCompleteCodecName(
1428-
audio.codec,
1429-
currentLevel.audioCodec,
1430-
);
1431-
// Add level and profile to make up for passthrough-remuxer not being able to parse full codec
1427+
const levelCodec = currentLevel.audioCodec;
1428+
let audioCodec = pickMostCompleteCodecName(audio.codec, levelCodec);
1429+
// Add level and profile to make up for remuxer not being able to parse full codec
14321430
// (logger warning "Unhandled audio codec...")
14331431
if (audioCodec === 'mp4a') {
14341432
audioCodec = 'mp4a.40.5';
@@ -1467,9 +1465,9 @@ export default class StreamController
14671465
audioCodec = 'mp4a.40.2';
14681466
this.log(`Android: force audio codec to ${audioCodec}`);
14691467
}
1470-
if (currentLevel.audioCodec && currentLevel.audioCodec !== audioCodec) {
1468+
if (levelCodec && levelCodec !== audioCodec) {
14711469
this.log(
1472-
`Swapping manifest audio codec "${currentLevel.audioCodec}" for "${audioCodec}"`,
1470+
`Swapping manifest audio codec "${levelCodec}" for "${audioCodec}"`,
14731471
);
14741472
}
14751473
audio.levelCodec = audioCodec;
@@ -1478,7 +1476,7 @@ export default class StreamController
14781476
`Init audio buffer, container:${
14791477
audio.container
14801478
}, codecs[selected/level/parsed]=[${audioCodec || ''}/${
1481-
currentLevel.audioCodec || ''
1479+
levelCodec || ''
14821480
}/${audio.codec}]`,
14831481
);
14841482
delete tracks.audiovideo;

src/utils/codecs.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,12 @@ export function pickMostCompleteCodecName(
232232
(parsedCodec.length > 4 ||
233233
['ac-3', 'ec-3', 'alac', 'fLaC', 'Opus'].indexOf(parsedCodec) !== -1)
234234
) {
235-
return parsedCodec;
235+
if (
236+
isCodecSupportedAsType(parsedCodec, 'audio') ||
237+
isCodecSupportedAsType(parsedCodec, 'video')
238+
) {
239+
return parsedCodec;
240+
}
236241
}
237242
if (levelCodec) {
238243
const levelCodecs = levelCodec.split(',');
@@ -250,6 +255,10 @@ export function pickMostCompleteCodecName(
250255
return levelCodec || parsedCodec;
251256
}
252257

258+
function isCodecSupportedAsType(codec: string, type: CodecType): boolean {
259+
return isCodecType(codec, type) && isCodecMediaSourceSupported(codec, type);
260+
}
261+
253262
export function convertAVC1ToAVCOTI(videoCodecs: string): string {
254263
// Convert avc1 codec string from RFC-4281 to RFC-6381 for MediaSource.isTypeSupported
255264
// Examples: avc1.66.30 to avc1.42001e and avc1.77.30,avc1.66.30 to avc1.4d001e,avc1.42001e.

0 commit comments

Comments
 (0)