mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-09-28 11:23:45 +02:00
81 lines
1.9 KiB
TypeScript
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);
|
|
};
|