Files
mediabunny/packages/ac3/src/decoder.ts
T

81 lines
1.9 KiB
TypeScript

/*!
* Copyright (c) 2026-present, Vanilagy and contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import {
CustomAudioDecoder,
AudioCodec,
AudioSample,
EncodedPacket,
registerDecoder,
} from 'mediabunny';
import { sendCommand, refWorker, unrefWorker } from './worker-client';
class Ac3Decoder extends CustomAudioDecoder {
private ctx = 0;
static override supports(codec: AudioCodec): boolean {
return codec === 'ac3' || codec === 'eac3';
}
async init() {
await refWorker();
const result = await sendCommand({
type: 'init-decoder',
data: { codec: this.codec },
});
this.ctx = result.ctx;
}
async decode(packet: EncodedPacket) {
const encodedData = packet.data.slice().buffer;
const timestamp = Math.round(packet.timestamp * this.config.sampleRate);
const result = await sendCommand({
type: 'decode',
data: { ctx: this.ctx, encodedData, timestamp },
}, [encodedData]);
const sample = new AudioSample({
data: result.pcmData,
format: result.format,
numberOfChannels: result.channels,
sampleRate: result.sampleRate,
timestamp: result.pts / result.sampleRate,
});
this.onSample(sample);
}
async flush() {
await sendCommand({ type: 'flush-decoder', data: { ctx: this.ctx } });
}
async close() {
void sendCommand({ type: 'close-decoder', data: { ctx: this.ctx } });
await unrefWorker();
}
}
let registered = false;
/**
* Registers AC-3 and E-AC-3 decoders, which Mediabunny will then use automatically when applicable. Make sure to call
* this function before starting any decoding task.
*
* @group \@mediabunny/ac3
* @public
*/
export const registerAc3Decoder = () => {
if (registered) {
return;
}
registered = true;
registerDecoder(Ac3Decoder);
};