Skip to content

Commit

Permalink
Prevent ADTS probe false positives when bytes following ID3 are a mat…
Browse files Browse the repository at this point in the history
…ch for MPEG audio

Fixes #5782
  • Loading branch information
robwalch committed Aug 31, 2023
1 parent afd679f commit c7e408d
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
10 changes: 5 additions & 5 deletions src/controller/buffer-controller.ts
Expand Up @@ -337,20 +337,20 @@ export default class BufferController implements ComponentAPI {
if (track && typeof track.buffer.changeType === 'function') {
const { id, codec, levelCodec, container, metadata } =
data[trackName];
const currentCodedFull = pickMostCompleteCodecName(
const currentCodecFull = pickMostCompleteCodecName(
track.codec,
track.levelCodec,
);
const currentCodec = currentCodedFull.replace(
const currentCodec = currentCodecFull?.replace(
VIDEO_CODEC_PROFILE_REPLACE,
'$1',
);
let trackCodec = pickMostCompleteCodecName(codec, levelCodec);
const nextCodec = trackCodec.replace(
const nextCodec = trackCodec?.replace(
VIDEO_CODEC_PROFILE_REPLACE,
'$1',
);
if (currentCodec !== nextCodec) {
if (trackCodec && currentCodec !== nextCodec) {
if (trackName.slice(0, 5) === 'audio') {
trackCodec = getCodecCompatibleName(
trackCodec,
Expand All @@ -359,7 +359,7 @@ export default class BufferController implements ComponentAPI {
}
const mimeType = `${container};codecs=${trackCodec}`;
this.appendChangeType(trackName, mimeType);
this.log(`switching codec ${currentCodedFull} to ${trackCodec}`);
this.log(`switching codec ${currentCodecFull} to ${trackCodec}`);
this.tracks[trackName] = {
buffer: track.buffer,
codec,
Expand Down
9 changes: 7 additions & 2 deletions src/demux/audio/aacdemuxer.ts
Expand Up @@ -3,6 +3,7 @@
*/
import BaseAudioDemuxer from './base-audio-demuxer';
import * as ADTS from './adts';
import * as MpegAudio from './mpegaudio';
import { logger } from '../../utils/logger';
import * as ID3 from '../id3';
import type { HlsEventEmitter } from '../../events';
Expand Down Expand Up @@ -50,8 +51,12 @@ class AACDemuxer extends BaseAudioDemuxer {
// Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1
// Layer bits (position 14 and 15) in header should be always 0 for ADTS
// More info https://wiki.multimedia.cx/index.php?title=ADTS
const id3Data = ID3.getID3Data(data, 0) || [];
let offset = id3Data.length;
const id3Data = ID3.getID3Data(data, 0);
let offset = id3Data?.length || 0;

if (MpegAudio.probe(data, offset)) {
return false;
}

for (let length = data.length; offset < length; offset++) {
if (ADTS.probe(data, offset)) {
Expand Down
4 changes: 2 additions & 2 deletions src/utils/codecs.ts
Expand Up @@ -176,8 +176,8 @@ export function getCodecCompatibleName(

export function pickMostCompleteCodecName(
parsedCodec: string,
levelCodec: string,
): string {
levelCodec: string | undefined,
): string | undefined {
// Parsing of mp4a codecs strings in mp4-tools from media is incomplete as of d8c6c7a
// so use level codec is parsed codec is unavailable or incomplete
if (parsedCodec && parsedCodec !== 'mp4a') {
Expand Down

0 comments on commit c7e408d

Please sign in to comment.