Remove sample correlation logic in decoder pipeline

This commit is contained in:
Vanilagy
2025-02-08 15:55:54 +01:00
parent b4d4c71916
commit 1d823805cf
8 changed files with 75 additions and 53 deletions
+9 -6
View File
@@ -8,8 +8,6 @@ import { EncodedAudioSample, PLACEHOLDER_DATA } from '../sample';
import { FrameHeader, getXingOffset, INFO, XING } from './mp3-misc';
import { Mp3Reader } from './mp3-reader';
const AUDIO_SAMPLES_PER_FRAME = 1152;
type Sample = {
timestamp: number;
duration: number;
@@ -46,7 +44,7 @@ export class Mp3Demuxer extends Demuxer {
this.reader.pos += id3Tag.size;
}
let nextTimestamp = 0;
let nextTimestampInSamples = 0;
// Let's read all samples
while (true) {
@@ -71,16 +69,16 @@ export class Mp3Demuxer extends Demuxer {
this.firstFrameHeader = header;
}
const sampleDuration = AUDIO_SAMPLES_PER_FRAME / header.sampleRate;
const sampleDuration = header.audioSamplesInFrame / header.sampleRate;
const sample: Sample = {
timestamp: nextTimestamp,
timestamp: nextTimestampInSamples / header.sampleRate,
duration: sampleDuration,
dataStart: header.startPos,
dataSize: header.totalSize,
};
this.allSamples.push(sample);
nextTimestamp += sampleDuration;
nextTimestampInSamples += header.audioSamplesInFrame;
}
if (!this.firstFrameHeader) {
@@ -121,6 +119,11 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking {
return 0;
}
async getTimeResolution() {
assert(this.demuxer.firstFrameHeader);
return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;
}
computeDuration() {
return this.demuxer.computeDuration();
}
+15
View File
@@ -44,6 +44,7 @@ export type FrameHeader = {
copyright: number;
original: number;
emphasis: number;
audioSamplesInFrame: number;
};
export const computeMp3FrameSize = (layer: number, bitrate: number, sampleRate: number, padding: number) => {
@@ -114,6 +115,19 @@ export const readFrameHeader = (word: number, reader: { pos: number; fileSize: n
return null;
}
let audioSamplesInFrame: number;
if (mpegVersionId === 3) {
audioSamplesInFrame = layer === 3 ? 384 : 1152;
} else {
if (layer === 3) {
audioSamplesInFrame = 384;
} else if (layer === 2) {
audioSamplesInFrame = 1152;
} else {
audioSamplesInFrame = 576;
}
}
return {
startPos: startPos,
totalSize: frameLength,
@@ -127,5 +141,6 @@ export const readFrameHeader = (word: number, reader: { pos: number; fileSize: n
copyright,
original,
emphasis,
audioSamplesInFrame,
};
};