Fix workspace structure, fix AAC channel layout, fix incorrect import, enable HW-accelerated video decode by default

This commit is contained in:
Vanilagy
2026-05-12 13:01:42 +02:00
parent 62ec685591
commit c0d28fa086
7 changed files with 52 additions and 42 deletions
+30 -10
View File
@@ -3,7 +3,11 @@ import * as NodeAv from 'node-av';
import { CODEC_TO_CODEC_ID, fromAudioSampleFormat, getChannelLayout } from './misc';
import { assert, toUint8Array } from '../../../src/misc';
import { NodeAvFrameAudioSampleResource } from './audio-sample';
import { AdtsHeaderTemplate, buildAdtsHeaderTemplate, parseAacAudioSpecificConfig } from '../../../shared/aac-misc';
import {
AdtsHeaderTemplate,
buildAdtsHeaderTemplate,
parseAacAudioSpecificConfig,
} from '../../../shared/aac-misc';
const AAC_SAMPLE_RATES
= [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
@@ -261,18 +265,34 @@ export class NodeAvAudioEncoder extends CustomAudioEncoder {
? toUint8Array(this.codecContext.extraData)
: undefined;
if (
description
if (this.codec === 'aac') {
if (!description) {
throw new Error('Extradata expected for AAC.');
}
// eslint-disable-next-line @stylistic/max-len
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
&& this.codec === 'aac' && (this.config as any).aac?.format === 'adts'
) {
const config = parseAacAudioSpecificConfig(description);
this.adtsHeaderTemplate = buildAdtsHeaderTemplate(config);
description = undefined; // Not used with 'adts' format
}
const isAdts = (this.config as any).aac?.format === 'adts';
if (isAdts) {
const parsedConfig = parseAacAudioSpecificConfig(description);
this.adtsHeaderTemplate = buildAdtsHeaderTemplate(parsedConfig);
description = undefined; // Not used with 'adts' format
}
} else if (this.codec === 'opus') {
if (!description) {
// Technically not required by the WebCodecs/Mediabunny Codec Registry, but we strive to be better
throw new Error('Extradata expected for Opus.');
}
} else if (this.codec === 'vorbis') {
if (!description) {
throw new Error('Extradata expected for Vorbis.');
}
} else if (this.codec === 'flac') {
if (!description) {
throw new Error('Extradata expected for FLAC.');
}
if (description && this.codec === 'flac') {
// FFmpeg uses the STREAMINFO block as the extradata, but WebCodecs wants a different format:
// 1. The bytes 0x66 0x4C 0x61 0x43 ("fLaC" in ASCII)
// 2. A metadata block (called the STREAMINFO block) as described in section 7 of [FLAC]
+1 -1
View File
@@ -224,7 +224,7 @@ export const getChannelLayout = (numChannels: number): NodeAv.ChannelLayout => {
case 1: return NodeAv.AV_CHANNEL_LAYOUT_MONO;
case 2: return NodeAv.AV_CHANNEL_LAYOUT_STEREO;
case 4: return NodeAv.AV_CHANNEL_LAYOUT_QUAD;
case 6: return NodeAv.AV_CHANNEL_LAYOUT_5POINT1;
case 6: return NodeAv.AV_CHANNEL_LAYOUT_5POINT1_BACK;
case 8: return NodeAv.AV_CHANNEL_LAYOUT_7POINT1;
default: return { nbChannels: numChannels, order: NodeAv.AV_CHANNEL_ORDER_UNSPEC, mask: 0n };
}
+8 -2
View File
@@ -40,8 +40,14 @@ export class NodeAvVideoDecoder extends CustomVideoDecoder {
let codec: NodeAv.Codec | null;
if (this.codec === 'vp9' && packet.sideData.alpha) {
codec = NodeAv.Codec.findDecoderByName(LIBVPX_VP9) ?? NodeAv.Codec.findDecoder(codecId);
} else if (this.config.hardwareAcceleration !== 'prefer-hardware' || this.codec === 'av1') {
// https://github.com/opencv/opencv/issues/24430
} else if (
// This check used to be "is not prefer-hardware", meaning it would default to using software decode. I
// didn't leave a comment for that back then so I actually don't know what it was for. I'm sure it was to
// work around an issue but, I don't know. Not using hardware decode at all by defaults feels wrong to me,
// so I changed it to what it is right now. If an issue is encountered, I can always change it.
this.config.hardwareAcceleration === 'prefer-software'
|| this.codec === 'av1' // https://github.com/opencv/opencv/issues/24430
) {
codec = NodeAv.Codec.findDecoder(codecId);
} else {
codec = getHardwareDecoderCodec(codecId) ?? NodeAv.Codec.findDecoder(codecId);
+1 -2
View File
@@ -1,4 +1,3 @@
import assert from 'assert';
import {
VideoSamplePixelFormat,
VideoSampleResource,
@@ -10,7 +9,7 @@ import {
VideoSampleTransformationDescription,
} from 'mediabunny';
import * as NodeAv from 'node-av';
import { MaybePromise, toUint8Array } from '../../../src/misc';
import { assert, MaybePromise, toUint8Array } from '../../../src/misc';
import {
toPixelFormat,
unmapColorPrimaries,