webcodecs-node 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/__tests__/AudioData.test.js +2 -1
  2. package/dist/__tests__/AudioData.test.js.map +1 -1
  3. package/dist/__tests__/AudioDecoder.test.js +5 -5
  4. package/dist/__tests__/AudioDecoder.test.js.map +1 -1
  5. package/dist/__tests__/AudioEncoder.test.js +3 -3
  6. package/dist/__tests__/AudioEncoder.test.js.map +1 -1
  7. package/dist/__tests__/EncodedChunks.test.js +3 -2
  8. package/dist/__tests__/EncodedChunks.test.js.map +1 -1
  9. package/dist/__tests__/HardwareAcceleration.test.js +2 -1
  10. package/dist/__tests__/HardwareAcceleration.test.js.map +1 -1
  11. package/dist/__tests__/ImageDecoder.test.js +16 -45
  12. package/dist/__tests__/ImageDecoder.test.js.map +1 -1
  13. package/dist/__tests__/NodeAvDecoder.test.js +12 -5
  14. package/dist/__tests__/NodeAvDecoder.test.js.map +1 -1
  15. package/dist/__tests__/VideoDecoder.test.js +5 -5
  16. package/dist/__tests__/VideoDecoder.test.js.map +1 -1
  17. package/dist/__tests__/VideoEncoder.test.js +3 -3
  18. package/dist/__tests__/VideoEncoder.test.js.map +1 -1
  19. package/dist/__tests__/VideoFrame.test.js +4 -1
  20. package/dist/__tests__/VideoFrame.test.js.map +1 -1
  21. package/dist/backends/types.d.ts +6 -3
  22. package/dist/backends/types.d.ts.map +1 -1
  23. package/dist/backends/types.js +2 -2
  24. package/dist/backends/types.js.map +1 -1
  25. package/dist/codec-utils/audio-codecs.d.ts +60 -0
  26. package/dist/codec-utils/audio-codecs.d.ts.map +1 -0
  27. package/dist/codec-utils/audio-codecs.js +117 -0
  28. package/dist/codec-utils/audio-codecs.js.map +1 -0
  29. package/dist/codec-utils/formats.d.ts +42 -0
  30. package/dist/codec-utils/formats.d.ts.map +1 -0
  31. package/dist/codec-utils/formats.js +147 -0
  32. package/dist/codec-utils/formats.js.map +1 -0
  33. package/dist/codec-utils/index.d.ts +9 -0
  34. package/dist/codec-utils/index.d.ts.map +1 -0
  35. package/dist/codec-utils/index.js +12 -0
  36. package/dist/codec-utils/index.js.map +1 -0
  37. package/dist/codec-utils/types.d.ts +87 -0
  38. package/dist/codec-utils/types.d.ts.map +1 -0
  39. package/dist/codec-utils/types.js +10 -0
  40. package/dist/codec-utils/types.js.map +1 -0
  41. package/dist/containers/Demuxer.d.ts +114 -0
  42. package/dist/containers/Demuxer.d.ts.map +1 -0
  43. package/dist/containers/Demuxer.js +256 -0
  44. package/dist/containers/Demuxer.js.map +1 -0
  45. package/dist/containers/Muxer.d.ts +142 -0
  46. package/dist/containers/Muxer.d.ts.map +1 -0
  47. package/dist/containers/Muxer.js +295 -0
  48. package/dist/containers/Muxer.js.map +1 -0
  49. package/dist/containers/extract.d.ts +25 -0
  50. package/dist/containers/extract.d.ts.map +1 -0
  51. package/dist/containers/extract.js +64 -0
  52. package/dist/containers/extract.js.map +1 -0
  53. package/dist/containers/index.d.ts +40 -0
  54. package/dist/containers/index.d.ts.map +1 -0
  55. package/dist/containers/index.js +41 -0
  56. package/dist/containers/index.js.map +1 -0
  57. package/dist/containers/transcode.d.ts +138 -0
  58. package/dist/containers/transcode.d.ts.map +1 -0
  59. package/dist/containers/transcode.js +536 -0
  60. package/dist/containers/transcode.js.map +1 -0
  61. package/dist/core/AudioData.d.ts +4 -0
  62. package/dist/core/AudioData.d.ts.map +1 -1
  63. package/dist/core/AudioData.js +56 -4
  64. package/dist/core/AudioData.js.map +1 -1
  65. package/dist/core/EncodedAudioChunk.d.ts +1 -1
  66. package/dist/core/EncodedAudioChunk.d.ts.map +1 -1
  67. package/dist/core/EncodedAudioChunk.js +1 -1
  68. package/dist/core/EncodedAudioChunk.js.map +1 -1
  69. package/dist/core/EncodedVideoChunk.d.ts.map +1 -1
  70. package/dist/core/EncodedVideoChunk.js +3 -19
  71. package/dist/core/EncodedVideoChunk.js.map +1 -1
  72. package/dist/core/VideoFrame.d.ts +6 -1
  73. package/dist/core/VideoFrame.d.ts.map +1 -1
  74. package/dist/core/VideoFrame.js +130 -17
  75. package/dist/core/VideoFrame.js.map +1 -1
  76. package/dist/decoders/AudioDecoder.d.ts +8 -0
  77. package/dist/decoders/AudioDecoder.d.ts.map +1 -1
  78. package/dist/decoders/AudioDecoder.js +62 -32
  79. package/dist/decoders/AudioDecoder.js.map +1 -1
  80. package/dist/decoders/ImageDecoder.d.ts +0 -3
  81. package/dist/decoders/ImageDecoder.d.ts.map +1 -1
  82. package/dist/decoders/ImageDecoder.js +13 -225
  83. package/dist/decoders/ImageDecoder.js.map +1 -1
  84. package/dist/decoders/VideoDecoder.d.ts +8 -0
  85. package/dist/decoders/VideoDecoder.d.ts.map +1 -1
  86. package/dist/decoders/VideoDecoder.js +76 -46
  87. package/dist/decoders/VideoDecoder.js.map +1 -1
  88. package/dist/demos/demo-1080p-transcode.d.ts +8 -0
  89. package/dist/demos/demo-1080p-transcode.d.ts.map +1 -0
  90. package/dist/demos/demo-1080p-transcode.js +188 -0
  91. package/dist/demos/demo-1080p-transcode.js.map +1 -0
  92. package/dist/demos/demo-containers.d.ts +7 -0
  93. package/dist/demos/demo-containers.d.ts.map +1 -0
  94. package/dist/demos/demo-containers.js +140 -0
  95. package/dist/demos/demo-containers.js.map +1 -0
  96. package/dist/demos/demo-four-corners.js +4 -4
  97. package/dist/demos/demo-four-corners.js.map +1 -1
  98. package/dist/demos/demo-hwaccel-conversion.js +1 -1
  99. package/dist/demos/demo-hwaccel-conversion.js.map +1 -1
  100. package/dist/demos/demo-hwaccel.js +1 -1
  101. package/dist/demos/demo-hwaccel.js.map +1 -1
  102. package/dist/demos/demo-samples.js +4 -4
  103. package/dist/demos/demo-samples.js.map +1 -1
  104. package/dist/demos/demo-streaming.js +6 -6
  105. package/dist/demos/demo-streaming.js.map +1 -1
  106. package/dist/encoders/AudioEncoder.d.ts +8 -0
  107. package/dist/encoders/AudioEncoder.d.ts.map +1 -1
  108. package/dist/encoders/AudioEncoder.js +68 -26
  109. package/dist/encoders/AudioEncoder.js.map +1 -1
  110. package/dist/encoders/VideoEncoder.d.ts +8 -0
  111. package/dist/encoders/VideoEncoder.d.ts.map +1 -1
  112. package/dist/encoders/VideoEncoder.js +64 -13
  113. package/dist/encoders/VideoEncoder.js.map +1 -1
  114. package/dist/ffmpeg/index.d.ts +3 -2
  115. package/dist/ffmpeg/index.d.ts.map +1 -1
  116. package/dist/ffmpeg/index.js +3 -3
  117. package/dist/ffmpeg/index.js.map +1 -1
  118. package/dist/formats/conversions/batch-converter.d.ts +61 -0
  119. package/dist/formats/conversions/batch-converter.d.ts.map +1 -0
  120. package/dist/formats/conversions/batch-converter.js +274 -0
  121. package/dist/formats/conversions/batch-converter.js.map +1 -0
  122. package/dist/formats/conversions/frame-converter.d.ts.map +1 -1
  123. package/dist/formats/conversions/frame-converter.js +17 -10
  124. package/dist/formats/conversions/frame-converter.js.map +1 -1
  125. package/dist/formats/conversions/index.d.ts +1 -0
  126. package/dist/formats/conversions/index.d.ts.map +1 -1
  127. package/dist/formats/conversions/index.js +2 -0
  128. package/dist/formats/conversions/index.js.map +1 -1
  129. package/dist/hardware/decoder-args.d.ts +2 -7
  130. package/dist/hardware/decoder-args.d.ts.map +1 -1
  131. package/dist/hardware/decoder-args.js +2 -32
  132. package/dist/hardware/decoder-args.js.map +1 -1
  133. package/dist/hardware/encoder-args.d.ts +2 -11
  134. package/dist/hardware/encoder-args.d.ts.map +1 -1
  135. package/dist/hardware/encoder-args.js +2 -71
  136. package/dist/hardware/encoder-args.js.map +1 -1
  137. package/dist/hardware/index.d.ts +2 -2
  138. package/dist/hardware/index.d.ts.map +1 -1
  139. package/dist/hardware/index.js +2 -2
  140. package/dist/hardware/index.js.map +1 -1
  141. package/dist/index.d.ts +5 -7
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +5 -6
  144. package/dist/index.js.map +1 -1
  145. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +3 -2
  146. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +1 -1
  147. package/dist/mediabunny/FFmpegAudioDecoder.js +5 -8
  148. package/dist/mediabunny/FFmpegAudioDecoder.js.map +1 -1
  149. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +3 -2
  150. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +1 -1
  151. package/dist/mediabunny/FFmpegAudioEncoder.js +3 -2
  152. package/dist/mediabunny/FFmpegAudioEncoder.js.map +1 -1
  153. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +4 -3
  154. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +1 -1
  155. package/dist/mediabunny/FFmpegVideoDecoder.js +6 -9
  156. package/dist/mediabunny/FFmpegVideoDecoder.js.map +1 -1
  157. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +4 -3
  158. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +1 -1
  159. package/dist/mediabunny/FFmpegVideoEncoder.js +4 -3
  160. package/dist/mediabunny/FFmpegVideoEncoder.js.map +1 -1
  161. package/dist/node-av/NodeAvAudioDecoder.d.ts +2 -2
  162. package/dist/node-av/NodeAvAudioDecoder.d.ts.map +1 -1
  163. package/dist/node-av/NodeAvAudioDecoder.js +63 -56
  164. package/dist/node-av/NodeAvAudioDecoder.js.map +1 -1
  165. package/dist/node-av/NodeAvAudioEncoder.d.ts +6 -0
  166. package/dist/node-av/NodeAvAudioEncoder.d.ts.map +1 -1
  167. package/dist/node-av/NodeAvAudioEncoder.js +166 -45
  168. package/dist/node-av/NodeAvAudioEncoder.js.map +1 -1
  169. package/dist/node-av/NodeAvImageDecoder.d.ts +28 -9
  170. package/dist/node-av/NodeAvImageDecoder.d.ts.map +1 -1
  171. package/dist/node-av/NodeAvImageDecoder.js +156 -37
  172. package/dist/node-av/NodeAvImageDecoder.js.map +1 -1
  173. package/dist/node-av/NodeAvVideoDecoder.d.ts +1 -1
  174. package/dist/node-av/NodeAvVideoDecoder.d.ts.map +1 -1
  175. package/dist/node-av/NodeAvVideoDecoder.js +20 -16
  176. package/dist/node-av/NodeAvVideoDecoder.js.map +1 -1
  177. package/dist/node-av/NodeAvVideoEncoder.d.ts +12 -0
  178. package/dist/node-av/NodeAvVideoEncoder.d.ts.map +1 -1
  179. package/dist/node-av/NodeAvVideoEncoder.js +175 -63
  180. package/dist/node-av/NodeAvVideoEncoder.js.map +1 -1
  181. package/dist/polyfill.d.ts.map +1 -1
  182. package/dist/polyfill.js +11 -9
  183. package/dist/polyfill.js.map +1 -1
  184. package/dist/utils/aac.d.ts.map +1 -1
  185. package/dist/utils/aac.js +6 -0
  186. package/dist/utils/aac.js.map +1 -1
  187. package/dist/utils/buffer-pool.d.ts +109 -0
  188. package/dist/utils/buffer-pool.d.ts.map +1 -0
  189. package/dist/utils/buffer-pool.js +278 -0
  190. package/dist/utils/buffer-pool.js.map +1 -0
  191. package/dist/utils/codec-cache.d.ts +65 -0
  192. package/dist/utils/codec-cache.d.ts.map +1 -0
  193. package/dist/utils/codec-cache.js +116 -0
  194. package/dist/utils/codec-cache.js.map +1 -0
  195. package/dist/utils/errors.d.ts +62 -0
  196. package/dist/utils/errors.d.ts.map +1 -0
  197. package/dist/utils/errors.js +84 -0
  198. package/dist/utils/errors.js.map +1 -0
  199. package/dist/utils/hardware-pool.d.ts +88 -0
  200. package/dist/utils/hardware-pool.d.ts.map +1 -0
  201. package/dist/utils/hardware-pool.js +266 -0
  202. package/dist/utils/hardware-pool.js.map +1 -0
  203. package/dist/utils/index.d.ts +5 -0
  204. package/dist/utils/index.d.ts.map +1 -1
  205. package/dist/utils/index.js +10 -0
  206. package/dist/utils/index.js.map +1 -1
  207. package/dist/utils/timeout.d.ts +44 -0
  208. package/dist/utils/timeout.d.ts.map +1 -0
  209. package/dist/utils/timeout.js +73 -0
  210. package/dist/utils/timeout.js.map +1 -0
  211. package/dist/utils/type-guards.d.ts +11 -1
  212. package/dist/utils/type-guards.d.ts.map +1 -1
  213. package/dist/utils/type-guards.js.map +1 -1
  214. package/package.json +13 -35
@@ -7,9 +7,9 @@
7
7
  import { EventEmitter } from 'events';
8
8
  import { Decoder, FilterAPI } from 'node-av/api';
9
9
  import { FormatContext, Packet, Rational } from 'node-av/lib';
10
- import { AVMEDIA_TYPE_AUDIO, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8P, AV_CODEC_ID_AAC, AV_CODEC_ID_OPUS, AV_CODEC_ID_MP3, AV_CODEC_ID_FLAC, AV_CODEC_ID_VORBIS, AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_F32LE, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
11
- import { wrapAacFrameWithAdts } from '../utils/aac.js';
10
+ import { AVMEDIA_TYPE_AUDIO, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8P, AV_CODEC_ID_AAC, AV_CODEC_ID_OPUS, AV_CODEC_ID_MP3, AV_CODEC_ID_FLAC, AV_CODEC_ID_VORBIS, AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S24LE, AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_U8, AV_CODEC_ID_PCM_MULAW, AV_CODEC_ID_PCM_ALAW, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
12
11
  import { createLogger } from '../utils/logger.js';
12
+ import { toUint8Array } from '../utils/buffer.js';
13
13
  const logger = createLogger('NodeAvAudioDecoder');
14
14
  /** Default sample rate for audio decoding */
15
15
  const DEFAULT_SAMPLE_RATE = 48000;
@@ -31,7 +31,6 @@ export class NodeAvAudioDecoder extends EventEmitter {
31
31
  packetTimeBase = new Rational(1, DEFAULT_SAMPLE_RATE);
32
32
  outputSampleFormat = AV_SAMPLE_FMT_FLT;
33
33
  filterDescription = null;
34
- aacConfig = null;
35
34
  outputFormat = 'f32';
36
35
  get isHealthy() {
37
36
  return !this.shuttingDown;
@@ -41,18 +40,13 @@ export class NodeAvAudioDecoder extends EventEmitter {
41
40
  this.packetTimeBase = new Rational(1, config.sampleRate);
42
41
  this.outputFormat = this.parseOutputFormat(config);
43
42
  this.outputSampleFormat = mapSampleFormat(this.outputFormat);
44
- this.aacConfig = this.parseAacDescription(config);
45
43
  }
46
44
  write(data) {
47
45
  if (!this.config || this.shuttingDown) {
48
46
  return false;
49
47
  }
50
- // If we have AAC config, wrap raw AAC frames with ADTS headers
51
- let dataToWrite = Buffer.from(data);
52
- if (this.aacConfig) {
53
- dataToWrite = Buffer.from(wrapAacFrameWithAdts(new Uint8Array(data), this.aacConfig));
54
- }
55
- this.queue.push(dataToWrite);
48
+ // Pass raw data directly - extradata is set on the decoder context
49
+ this.queue.push(Buffer.from(data));
56
50
  void this.processQueue();
57
51
  return true;
58
52
  }
@@ -113,15 +107,8 @@ export class NodeAvAudioDecoder extends EventEmitter {
113
107
  params.channelLayout = this.getChannelLayout(this.config.numberOfChannels);
114
108
  params.channels = this.config.numberOfChannels;
115
109
  // Set extradata if we have description (e.g., AudioSpecificConfig for AAC)
116
- if (this.config.description && !this.aacConfig) {
117
- const desc = this.config.description;
118
- let bytes;
119
- if (desc instanceof ArrayBuffer) {
120
- bytes = new Uint8Array(desc);
121
- }
122
- else {
123
- bytes = new Uint8Array(desc.buffer, desc.byteOffset, desc.byteLength);
124
- }
110
+ if (this.config.description) {
111
+ const bytes = toUint8Array(this.config.description);
125
112
  params.extradata = Buffer.from(bytes);
126
113
  }
127
114
  this.decoder = await Decoder.create(this.stream, {
@@ -130,8 +117,8 @@ export class NodeAvAudioDecoder extends EventEmitter {
130
117
  logger.info(`Created decoder for codec: ${this.config.codec}`);
131
118
  }
132
119
  parseOutputFormat(config) {
133
- // Default to f32 if not specified
134
- return 'f32';
120
+ const defaultFormat = 'f32';
121
+ return config.outputFormat ?? defaultFormat;
135
122
  }
136
123
  async decodeBuffer(buffer) {
137
124
  await this.ensureDecoder();
@@ -158,16 +145,27 @@ export class NodeAvAudioDecoder extends EventEmitter {
158
145
  while (frame) {
159
146
  const nbSamples = frame.nbSamples;
160
147
  if (nbSamples > 0) {
161
- const converted = await this.toOutputBuffer(frame);
162
- frame.unref();
163
- if (converted) {
148
+ const passthrough = this.canPassThrough(frame);
149
+ if (passthrough) {
164
150
  this.emit('frame', {
165
- data: converted,
151
+ nativeFrame: frame,
166
152
  numberOfFrames: nbSamples,
167
153
  timestamp: this.frameIndex,
168
154
  });
169
155
  this.frameIndex += nbSamples;
170
156
  }
157
+ else {
158
+ const converted = await this.toOutputBuffer(frame);
159
+ frame.unref();
160
+ if (converted) {
161
+ this.emit('frame', {
162
+ data: converted,
163
+ numberOfFrames: nbSamples,
164
+ timestamp: this.frameIndex,
165
+ });
166
+ this.frameIndex += nbSamples;
167
+ }
168
+ }
171
169
  }
172
170
  else {
173
171
  frame.unref();
@@ -175,14 +173,24 @@ export class NodeAvAudioDecoder extends EventEmitter {
175
173
  frame = await this.decoder.receive();
176
174
  }
177
175
  }
176
+ canPassThrough(frame) {
177
+ return frame.format === this.outputSampleFormat;
178
+ }
178
179
  async toOutputBuffer(frame) {
179
- const outputFormatName = sampleFormatToFFmpegName(this.outputSampleFormat);
180
180
  const frameFormat = frame.format;
181
+ const frameChannels = frame.channels || this.config?.numberOfChannels || 2;
182
+ const nbSamples = frame.nbSamples;
181
183
  // If frame already matches requested format, just export
182
184
  if (frameFormat === this.outputSampleFormat) {
183
185
  return frame.toBuffer();
184
186
  }
185
- // Need to convert using filter
187
+ // For multi-channel audio (>2 channels), the filter has issues with channel layouts
188
+ // Convert manually from planar float to interleaved float if needed
189
+ if (frameChannels > 2 && frameFormat === AV_SAMPLE_FMT_FLTP && this.outputSampleFormat === AV_SAMPLE_FMT_FLT) {
190
+ return this.convertPlanarToInterleaved(frame, nbSamples, frameChannels);
191
+ }
192
+ // For stereo/mono, use filter for conversion
193
+ const outputFormatName = sampleFormatToFFmpegName(this.outputSampleFormat);
186
194
  const description = `aformat=sample_fmts=${outputFormatName}`;
187
195
  if (!this.filter || this.filterDescription !== description) {
188
196
  this.filter?.close();
@@ -201,36 +209,25 @@ export class NodeAvAudioDecoder extends EventEmitter {
201
209
  filtered.unref();
202
210
  return buffer;
203
211
  }
204
- parseAacDescription(config) {
205
- const codecBase = config.codec.split('.')[0].toLowerCase();
206
- const isAac = codecBase === 'mp4a' || codecBase === 'aac';
207
- if (!isAac || !config.description) {
208
- return null;
209
- }
210
- // Parse AudioSpecificConfig to get profile and sampling frequency index
211
- let bytes;
212
- if (config.description instanceof ArrayBuffer) {
213
- bytes = new Uint8Array(config.description);
214
- }
215
- else {
216
- bytes = new Uint8Array(config.description.buffer, config.description.byteOffset, config.description.byteLength);
217
- }
218
- if (bytes.length < 2) {
219
- return null;
212
+ convertPlanarToInterleaved(frame, nbSamples, numChannels) {
213
+ // Get planar buffer from frame - each channel is stored separately
214
+ const planarBuffer = frame.toBuffer();
215
+ const bytesPerSample = 4; // float32
216
+ const planeSize = nbSamples * bytesPerSample;
217
+ // Create interleaved output
218
+ const outputSize = nbSamples * numChannels * bytesPerSample;
219
+ const output = Buffer.alloc(outputSize);
220
+ // Convert from planar (LLLLLLLL RRRRRRRR ...) to interleaved (LRLRLRLR ...)
221
+ const inputView = new Float32Array(planarBuffer.buffer, planarBuffer.byteOffset, planarBuffer.byteLength / 4);
222
+ const outputView = new Float32Array(output.buffer, output.byteOffset, output.byteLength / 4);
223
+ for (let s = 0; s < nbSamples; s++) {
224
+ for (let ch = 0; ch < numChannels; ch++) {
225
+ const srcIdx = ch * nbSamples + s;
226
+ const dstIdx = s * numChannels + ch;
227
+ outputView[dstIdx] = inputView[srcIdx];
228
+ }
220
229
  }
221
- // Parse AudioSpecificConfig (ISO 14496-3)
222
- // First 5 bits: audioObjectType
223
- // Next 4 bits: samplingFrequencyIndex
224
- // Next 4 bits: channelConfiguration
225
- const audioObjectType = (bytes[0] >> 3) & 0x1f;
226
- const samplingFrequencyIndex = ((bytes[0] & 0x07) << 1) | ((bytes[1] >> 7) & 0x01);
227
- const channelConfiguration = (bytes[1] >> 3) & 0x0f;
228
- return {
229
- audioObjectType,
230
- samplingFrequencyIndex,
231
- samplingRate: config.sampleRate,
232
- channelConfiguration,
233
- };
230
+ return output;
234
231
  }
235
232
  getChannelLayout(numChannels) {
236
233
  // Standard channel layouts as ChannelLayout objects
@@ -291,8 +288,18 @@ function mapCodecId(codec) {
291
288
  return AV_CODEC_ID_VORBIS;
292
289
  case 'pcm-s16':
293
290
  return AV_CODEC_ID_PCM_S16LE;
291
+ case 'pcm-s24':
292
+ return AV_CODEC_ID_PCM_S24LE;
293
+ case 'pcm-s32':
294
+ return AV_CODEC_ID_PCM_S32LE;
294
295
  case 'pcm-f32':
295
296
  return AV_CODEC_ID_PCM_F32LE;
297
+ case 'pcm-u8':
298
+ return AV_CODEC_ID_PCM_U8;
299
+ case 'ulaw':
300
+ return AV_CODEC_ID_PCM_MULAW;
301
+ case 'alaw':
302
+ return AV_CODEC_ID_PCM_ALAW;
296
303
  default:
297
304
  return null;
298
305
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NodeAvAudioDecoder.js","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioDecoder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NodeAvAudioDecoder.js","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioDecoder.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  * using FFmpeg's libav* libraries via node-av.
6
6
  */
7
7
  import { EventEmitter } from 'events';
8
+ import { Frame } from 'node-av/lib';
8
9
  import type { AudioEncoderBackend, AudioEncoderBackendConfig } from '../backends/types.js';
9
10
  /**
10
11
  * NodeAV-backed audio encoder implementing AudioEncoderBackend interface
@@ -25,11 +26,13 @@ export declare class NodeAvAudioEncoder extends EventEmitter implements AudioEnc
25
26
  get isHealthy(): boolean;
26
27
  startEncoder(config: AudioEncoderBackendConfig): void;
27
28
  write(data: Buffer | Uint8Array): boolean;
29
+ writeFrame(frame: Frame, owned?: boolean): boolean;
28
30
  end(): void;
29
31
  kill(): void;
30
32
  shutdown(): Promise<void>;
31
33
  private processQueue;
32
34
  private ensureEncoder;
35
+ private encodeFrame;
33
36
  private extractCodecDescription;
34
37
  private getEncoderCodec;
35
38
  private buildEncoderOptions;
@@ -37,8 +40,11 @@ export declare class NodeAvAudioEncoder extends EventEmitter implements AudioEnc
37
40
  private encodeBuffer;
38
41
  private convertToPlanar;
39
42
  private convertToS16Interleaved;
43
+ private convertToS32Interleaved;
40
44
  private convertToS16Planar;
45
+ private convertToU8Interleaved;
41
46
  private finish;
47
+ private drainPackets;
42
48
  private cleanup;
43
49
  }
44
50
  //# sourceMappingURL=NodeAvAudioEncoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeAvAudioEncoder.d.ts","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioEncoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmBtC,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AAQ9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAAQ;IAE1B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAOrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAUzC,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA2BZ,aAAa;IAmB3B,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,mBAAmB;IA2D3B,OAAO,CAAC,gBAAgB;YAiBV,YAAY;IA8E1B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,kBAAkB;YAqBZ,MAAM;IAsCpB,OAAO,CAAC,OAAO;CAKhB"}
1
+ {"version":3,"file":"NodeAvAudioEncoder.d.ts","sourceRoot":"","sources":["../../src/node-av/NodeAvAudioEncoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAY,MAAM,aAAa,CAAC;AAkB9C,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AAQ9B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB;IACjF,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAkE;IAC/E,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAAQ;IAE1B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,YAAY,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAOrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAUzC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,OAAc,GAAG,OAAO;IAsBxD,GAAG,IAAI,IAAI;IAMX,IAAI,IAAI,IAAI;IAMN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,YAAY;YA+BZ,aAAa;YAmBb,WAAW;IAwCzB,OAAO,CAAC,uBAAuB;IA2C/B,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,mBAAmB;IAiE3B,OAAO,CAAC,gBAAgB;YAiBV,YAAY;IAkE1B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,sBAAsB;YAehB,MAAM;YAmBN,YAAY;IAyB1B,OAAO,CAAC,OAAO;CAKhB"}
@@ -7,7 +7,7 @@
7
7
  import { EventEmitter } from 'events';
8
8
  import { Encoder } from 'node-av/api';
9
9
  import { Frame, Rational } from 'node-av/lib';
10
- import { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, AV_PKT_FLAG_KEY, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
10
+ import { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32, AV_PKT_FLAG_KEY, AV_CHANNEL_ORDER_NATIVE, AV_CH_LAYOUT_MONO, AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT1, AV_CH_LAYOUT_7POINT1, } from 'node-av/constants';
11
11
  import { createLogger } from '../utils/logger.js';
12
12
  const logger = createLogger('NodeAvAudioEncoder');
13
13
  /** Default sample rate for Opus codec */
@@ -41,10 +41,37 @@ export class NodeAvAudioEncoder extends EventEmitter {
41
41
  if (!this.config || this.shuttingDown) {
42
42
  return false;
43
43
  }
44
- this.queue.push(Buffer.from(data));
44
+ this.queue.push({ buffer: Buffer.from(data), owned: true });
45
45
  void this.processQueue();
46
46
  return true;
47
47
  }
48
+ writeFrame(frame, owned = true) {
49
+ if (!this.config || this.shuttingDown) {
50
+ return false;
51
+ }
52
+ try {
53
+ const buf = frame.toBuffer();
54
+ if (owned) {
55
+ try {
56
+ frame.unref();
57
+ }
58
+ catch { /* ignore */ }
59
+ }
60
+ this.queue.push({ buffer: Buffer.from(buf), owned: true });
61
+ void this.processQueue();
62
+ return true;
63
+ }
64
+ catch (err) {
65
+ if (owned) {
66
+ try {
67
+ frame.unref();
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
72
+ return false;
73
+ }
74
+ }
48
75
  end() {
49
76
  if (this.shuttingDown)
50
77
  return;
@@ -69,10 +96,15 @@ export class NodeAvAudioEncoder extends EventEmitter {
69
96
  this.processing = true;
70
97
  try {
71
98
  while (this.queue.length > 0) {
72
- const data = this.queue.shift();
99
+ const item = this.queue.shift();
73
100
  // Emit frameAccepted when frame starts processing (for dequeue event)
74
101
  setImmediate(() => this.emit('frameAccepted'));
75
- await this.encodeBuffer(data);
102
+ if (item.frame) {
103
+ await this.encodeFrame(item.frame, item.owned ?? true);
104
+ }
105
+ else if (item.buffer) {
106
+ await this.encodeBuffer(item.buffer);
107
+ }
76
108
  }
77
109
  }
78
110
  catch (err) {
@@ -98,6 +130,47 @@ export class NodeAvAudioEncoder extends EventEmitter {
98
130
  // Extract codec description (extradata) for codecs that require it
99
131
  this.extractCodecDescription();
100
132
  }
133
+ async encodeFrame(inputFrame, owned) {
134
+ try {
135
+ await this.ensureEncoder();
136
+ if (!this.encoder || !this.config) {
137
+ throw new Error('Encoder not initialized');
138
+ }
139
+ const matchesFormat = inputFrame.format === this.encoderSampleFormat;
140
+ const matchesRate = Number(inputFrame.sampleRate ?? this.config.sampleRate) === this.config.sampleRate;
141
+ if (matchesFormat && matchesRate) {
142
+ inputFrame.pts = BigInt(this.frameIndex);
143
+ const nbSamples = inputFrame.nbSamples ?? 0;
144
+ try {
145
+ await this.encoder.encode(inputFrame);
146
+ if (owned) {
147
+ inputFrame.unref();
148
+ }
149
+ await this.drainPackets();
150
+ this.frameIndex += nbSamples;
151
+ return;
152
+ }
153
+ catch (err) {
154
+ // Fallback to buffer path if direct encode fails
155
+ logger.debug(`Direct frame encode failed, falling back to buffer: ${err instanceof Error ? err.message : err}`);
156
+ }
157
+ }
158
+ const buffer = inputFrame.toBuffer();
159
+ if (owned) {
160
+ inputFrame.unref();
161
+ }
162
+ await this.encodeBuffer(buffer);
163
+ }
164
+ catch (err) {
165
+ if (owned) {
166
+ try {
167
+ inputFrame.unref();
168
+ }
169
+ catch { /* ignore */ }
170
+ }
171
+ throw err;
172
+ }
173
+ }
101
174
  extractCodecDescription() {
102
175
  if (!this.encoder || !this.config)
103
176
  return;
@@ -111,7 +184,19 @@ export class NodeAvAudioEncoder extends EventEmitter {
111
184
  const extraData = ctx.extraData;
112
185
  if (!extraData || extraData.length === 0)
113
186
  return;
114
- if (codecBase === 'flac') {
187
+ if (codecBase === 'mp4a' || codecBase === 'aac') {
188
+ // AAC: extradata contains AudioSpecificConfig (including PCE if needed)
189
+ // This is the proper description for MP4 muxing and decoding
190
+ this.codecDescription = Buffer.from(extraData);
191
+ logger.debug(`AAC description from extradata: ${this.codecDescription.length} bytes`);
192
+ }
193
+ else if (codecBase === 'opus') {
194
+ // Opus: extradata contains OpusHead structure
195
+ // Required for multi-channel Opus decoding
196
+ this.codecDescription = Buffer.from(extraData);
197
+ logger.debug(`Opus description from extradata: ${this.codecDescription.length} bytes`);
198
+ }
199
+ else if (codecBase === 'flac') {
115
200
  // FLAC description: 'fLaC' magic + STREAMINFO block
116
201
  // The extradata from FFmpeg is just the STREAMINFO, we need to prepend magic
117
202
  const magic = Buffer.from('fLaC');
@@ -148,6 +233,16 @@ export class NodeAvAudioEncoder extends EventEmitter {
148
233
  return 'libvorbis';
149
234
  case 'pcm-s16':
150
235
  return 'pcm_s16le';
236
+ case 'pcm-s24':
237
+ return 'pcm_s24le';
238
+ case 'pcm-s32':
239
+ return 'pcm_s32le';
240
+ case 'pcm-u8':
241
+ return 'pcm_u8';
242
+ case 'ulaw':
243
+ return 'pcm_mulaw';
244
+ case 'alaw':
245
+ return 'pcm_alaw';
151
246
  case 'pcm-f32':
152
247
  return 'pcm_f32le';
153
248
  default:
@@ -181,6 +276,15 @@ export class NodeAvAudioEncoder extends EventEmitter {
181
276
  // flac encoder requires interleaved s16 or s32
182
277
  sampleFormat = AV_SAMPLE_FMT_S16;
183
278
  }
279
+ else if (codecBase === 'pcm-s24' || codecBase === 'pcm-s32') {
280
+ sampleFormat = AV_SAMPLE_FMT_S32;
281
+ }
282
+ else if (codecBase === 'pcm-u8') {
283
+ sampleFormat = AV_SAMPLE_FMT_U8;
284
+ }
285
+ else if (codecBase === 'ulaw' || codecBase === 'alaw') {
286
+ sampleFormat = AV_SAMPLE_FMT_S16;
287
+ }
184
288
  else {
185
289
  // Most codecs work with float planar (aac, etc.)
186
290
  sampleFormat = AV_SAMPLE_FMT_FLTP;
@@ -256,6 +360,15 @@ export class NodeAvAudioEncoder extends EventEmitter {
256
360
  audioData = Buffer.from(this.convertToS16Planar(buffer, samplesPerChannel, this.config.numberOfChannels));
257
361
  frameFormat = AV_SAMPLE_FMT_S16P;
258
362
  }
363
+ else if (this.encoderSampleFormat === AV_SAMPLE_FMT_S32) {
364
+ // Encoder needs interleaved s32 - convert from f32 interleaved to s32 interleaved
365
+ audioData = Buffer.from(this.convertToS32Interleaved(buffer, samplesPerChannel, this.config.numberOfChannels));
366
+ frameFormat = AV_SAMPLE_FMT_S32;
367
+ }
368
+ else if (this.encoderSampleFormat === AV_SAMPLE_FMT_U8) {
369
+ audioData = Buffer.from(this.convertToU8Interleaved(buffer, samplesPerChannel, this.config.numberOfChannels));
370
+ frameFormat = AV_SAMPLE_FMT_U8;
371
+ }
259
372
  else {
260
373
  // Default: encoder needs planar float - convert from f32 interleaved to f32 planar
261
374
  audioData = Buffer.from(this.convertToPlanar(buffer, samplesPerChannel, this.config.numberOfChannels));
@@ -274,26 +387,7 @@ export class NodeAvAudioEncoder extends EventEmitter {
274
387
  // Try to extract codec description after first encode (some codecs like FLAC
275
388
  // don't populate extradata until after encoding starts)
276
389
  this.extractCodecDescription();
277
- let packet = await this.encoder.receive();
278
- while (packet) {
279
- if (packet.data) {
280
- const timestamp = packet.pts !== undefined ? Number(packet.pts) : this.frameIndex;
281
- const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
282
- const frameData = {
283
- data: Buffer.from(packet.data),
284
- timestamp,
285
- keyFrame,
286
- };
287
- // Include codec description on the first frame
288
- if (this.firstFrame && this.codecDescription) {
289
- frameData.description = this.codecDescription;
290
- this.firstFrame = false;
291
- }
292
- this.emit('encodedFrame', frameData);
293
- }
294
- packet.unref();
295
- packet = await this.encoder.receive();
296
- }
390
+ await this.drainPackets();
297
391
  this.frameIndex += samplesPerChannel;
298
392
  }
299
393
  convertToPlanar(data, samplesPerChannel, numChannels) {
@@ -323,6 +417,17 @@ export class NodeAvAudioEncoder extends EventEmitter {
323
417
  }
324
418
  return result;
325
419
  }
420
+ convertToS32Interleaved(data, samplesPerChannel, numChannels) {
421
+ const totalSamples = samplesPerChannel * numChannels;
422
+ const result = new Uint8Array(totalSamples * 4); // 4 bytes per s32 sample
423
+ const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
424
+ const output = new Int32Array(result.buffer);
425
+ for (let i = 0; i < totalSamples; i++) {
426
+ const clamped = Math.max(-1.0, Math.min(1.0, input[i]));
427
+ output[i] = Math.round(clamped * 2147483647);
428
+ }
429
+ return result;
430
+ }
326
431
  convertToS16Planar(data, samplesPerChannel, numChannels) {
327
432
  const bytesPerSample = 2; // s16
328
433
  const planeSize = samplesPerChannel * bytesPerSample;
@@ -340,6 +445,17 @@ export class NodeAvAudioEncoder extends EventEmitter {
340
445
  }
341
446
  return result;
342
447
  }
448
+ convertToU8Interleaved(data, samplesPerChannel, numChannels) {
449
+ const totalSamples = samplesPerChannel * numChannels;
450
+ const result = new Uint8Array(totalSamples);
451
+ const input = new Float32Array(data.buffer, data.byteOffset, data.byteLength / 4);
452
+ for (let i = 0; i < totalSamples; i++) {
453
+ const clamped = Math.max(-1.0, Math.min(1.0, input[i]));
454
+ const u8 = Math.round((clamped + 1) * 127.5); // map [-1,1] to [0,255]
455
+ result[i] = u8;
456
+ }
457
+ return result;
458
+ }
343
459
  async finish() {
344
460
  await this.processQueue();
345
461
  if (this.processingPromise) {
@@ -348,26 +464,7 @@ export class NodeAvAudioEncoder extends EventEmitter {
348
464
  if (this.encoder) {
349
465
  try {
350
466
  await this.encoder.flush();
351
- let packet = await this.encoder.receive();
352
- while (packet) {
353
- if (packet.data) {
354
- const timestamp = packet.pts !== undefined ? Number(packet.pts) : this.frameIndex;
355
- const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
356
- const frameData = {
357
- data: Buffer.from(packet.data),
358
- timestamp,
359
- keyFrame,
360
- };
361
- // Include codec description on the first frame
362
- if (this.firstFrame && this.codecDescription) {
363
- frameData.description = this.codecDescription;
364
- this.firstFrame = false;
365
- }
366
- this.emit('encodedFrame', frameData);
367
- }
368
- packet.unref();
369
- packet = await this.encoder.receive();
370
- }
467
+ await this.drainPackets();
371
468
  }
372
469
  catch (err) {
373
470
  this.emit('error', err instanceof Error ? err : new Error(String(err)));
@@ -376,6 +473,30 @@ export class NodeAvAudioEncoder extends EventEmitter {
376
473
  this.emit('close', 0);
377
474
  this.cleanup();
378
475
  }
476
+ async drainPackets() {
477
+ if (!this.encoder)
478
+ return;
479
+ let packet = await this.encoder.receive();
480
+ while (packet) {
481
+ if (packet.data) {
482
+ const timestamp = packet.pts !== undefined ? Number(packet.pts) : this.frameIndex;
483
+ const keyFrame = (packet.flags & AV_PKT_FLAG_KEY) === AV_PKT_FLAG_KEY || packet.isKeyframe;
484
+ const frameData = {
485
+ data: Buffer.from(packet.data),
486
+ timestamp,
487
+ keyFrame,
488
+ };
489
+ // Include codec description on the first frame
490
+ if (this.firstFrame && this.codecDescription) {
491
+ frameData.description = this.codecDescription;
492
+ this.firstFrame = false;
493
+ }
494
+ this.emit('encodedFrame', frameData);
495
+ }
496
+ packet.unref();
497
+ packet = await this.encoder.receive();
498
+ }
499
+ }
379
500
  cleanup() {
380
501
  this.encoder?.close();
381
502
  this.encoder = null;