webcodecs-node 0.5.0 → 0.5.2

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 (188) hide show
  1. package/README.md +64 -184
  2. package/docs/api.md +1 -1
  3. package/docs/configuration.md +6 -17
  4. package/package.json +2 -2
  5. package/dist/AudioData.d.ts +0 -6
  6. package/dist/AudioData.d.ts.map +0 -1
  7. package/dist/AudioData.js +0 -6
  8. package/dist/AudioData.js.map +0 -1
  9. package/dist/AudioDecoder.d.ts +0 -6
  10. package/dist/AudioDecoder.d.ts.map +0 -1
  11. package/dist/AudioDecoder.js +0 -6
  12. package/dist/AudioDecoder.js.map +0 -1
  13. package/dist/AudioEncoder.d.ts +0 -6
  14. package/dist/AudioEncoder.d.ts.map +0 -1
  15. package/dist/AudioEncoder.js +0 -6
  16. package/dist/AudioEncoder.js.map +0 -1
  17. package/dist/EncodedAudioChunk.d.ts +0 -6
  18. package/dist/EncodedAudioChunk.d.ts.map +0 -1
  19. package/dist/EncodedAudioChunk.js +0 -6
  20. package/dist/EncodedAudioChunk.js.map +0 -1
  21. package/dist/EncodedVideoChunk.d.ts +0 -6
  22. package/dist/EncodedVideoChunk.d.ts.map +0 -1
  23. package/dist/EncodedVideoChunk.js +0 -6
  24. package/dist/EncodedVideoChunk.js.map +0 -1
  25. package/dist/FFmpegProcess.d.ts +0 -6
  26. package/dist/FFmpegProcess.d.ts.map +0 -1
  27. package/dist/FFmpegProcess.js +0 -6
  28. package/dist/FFmpegProcess.js.map +0 -1
  29. package/dist/HardwareAcceleration.d.ts +0 -6
  30. package/dist/HardwareAcceleration.d.ts.map +0 -1
  31. package/dist/HardwareAcceleration.js +0 -6
  32. package/dist/HardwareAcceleration.js.map +0 -1
  33. package/dist/ImageDecoder.d.ts +0 -6
  34. package/dist/ImageDecoder.d.ts.map +0 -1
  35. package/dist/ImageDecoder.js +0 -6
  36. package/dist/ImageDecoder.js.map +0 -1
  37. package/dist/Logger.d.ts +0 -6
  38. package/dist/Logger.d.ts.map +0 -1
  39. package/dist/Logger.js +0 -6
  40. package/dist/Logger.js.map +0 -1
  41. package/dist/MediaCapabilities.d.ts +0 -9
  42. package/dist/MediaCapabilities.d.ts.map +0 -1
  43. package/dist/MediaCapabilities.js +0 -8
  44. package/dist/MediaCapabilities.js.map +0 -1
  45. package/dist/VideoDecoder.d.ts +0 -6
  46. package/dist/VideoDecoder.d.ts.map +0 -1
  47. package/dist/VideoDecoder.js +0 -6
  48. package/dist/VideoDecoder.js.map +0 -1
  49. package/dist/VideoEncoder.d.ts +0 -6
  50. package/dist/VideoEncoder.d.ts.map +0 -1
  51. package/dist/VideoEncoder.js +0 -6
  52. package/dist/VideoEncoder.js.map +0 -1
  53. package/dist/VideoFrame.d.ts +0 -10
  54. package/dist/VideoFrame.d.ts.map +0 -1
  55. package/dist/VideoFrame.js +0 -9
  56. package/dist/VideoFrame.js.map +0 -1
  57. package/dist/__tests__/AudioData.test.d.ts +0 -5
  58. package/dist/__tests__/AudioData.test.d.ts.map +0 -1
  59. package/dist/__tests__/AudioData.test.js +0 -180
  60. package/dist/__tests__/AudioData.test.js.map +0 -1
  61. package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
  62. package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
  63. package/dist/__tests__/AudioDecoder.test.js +0 -733
  64. package/dist/__tests__/AudioDecoder.test.js.map +0 -1
  65. package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
  66. package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
  67. package/dist/__tests__/AudioEncoder.test.js +0 -247
  68. package/dist/__tests__/AudioEncoder.test.js.map +0 -1
  69. package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
  70. package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
  71. package/dist/__tests__/EncodedChunks.test.js +0 -100
  72. package/dist/__tests__/EncodedChunks.test.js.map +0 -1
  73. package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
  74. package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
  75. package/dist/__tests__/HardwareAcceleration.test.js +0 -85
  76. package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
  77. package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
  78. package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
  79. package/dist/__tests__/ImageDecoder.test.js +0 -558
  80. package/dist/__tests__/ImageDecoder.test.js.map +0 -1
  81. package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
  82. package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
  83. package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
  84. package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
  85. package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
  86. package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
  87. package/dist/__tests__/MediaCapabilities.test.js +0 -346
  88. package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
  89. package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
  90. package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
  91. package/dist/__tests__/NodeAvDecoder.test.js +0 -206
  92. package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
  93. package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
  94. package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
  95. package/dist/__tests__/NodeAvEncoder.test.js +0 -176
  96. package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
  97. package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
  98. package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
  99. package/dist/__tests__/VideoDecoder.test.js +0 -675
  100. package/dist/__tests__/VideoDecoder.test.js.map +0 -1
  101. package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
  102. package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
  103. package/dist/__tests__/VideoEncoder.test.js +0 -468
  104. package/dist/__tests__/VideoEncoder.test.js.map +0 -1
  105. package/dist/__tests__/VideoFrame.test.d.ts +0 -5
  106. package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
  107. package/dist/__tests__/VideoFrame.test.js +0 -246
  108. package/dist/__tests__/VideoFrame.test.js.map +0 -1
  109. package/dist/__tests__/aac-utils.test.d.ts +0 -2
  110. package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
  111. package/dist/__tests__/aac-utils.test.js +0 -37
  112. package/dist/__tests__/aac-utils.test.js.map +0 -1
  113. package/dist/__tests__/avc-utils.test.d.ts +0 -2
  114. package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
  115. package/dist/__tests__/avc-utils.test.js +0 -63
  116. package/dist/__tests__/avc-utils.test.js.map +0 -1
  117. package/dist/__tests__/hevc-utils.test.d.ts +0 -2
  118. package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
  119. package/dist/__tests__/hevc-utils.test.js +0 -78
  120. package/dist/__tests__/hevc-utils.test.js.map +0 -1
  121. package/dist/demos/demo-conversion.d.ts +0 -13
  122. package/dist/demos/demo-conversion.d.ts.map +0 -1
  123. package/dist/demos/demo-conversion.js +0 -301
  124. package/dist/demos/demo-conversion.js.map +0 -1
  125. package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
  126. package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
  127. package/dist/demos/demo-hwaccel-conversion.js +0 -161
  128. package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
  129. package/dist/demos/demo-mediabunny.d.ts +0 -7
  130. package/dist/demos/demo-mediabunny.d.ts.map +0 -1
  131. package/dist/demos/demo-mediabunny.js +0 -78
  132. package/dist/demos/demo-mediabunny.js.map +0 -1
  133. package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
  134. package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
  135. package/dist/ffmpeg/FFmpegProcess.js +0 -543
  136. package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
  137. package/dist/ffmpeg/audio-codecs.d.ts +0 -59
  138. package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
  139. package/dist/ffmpeg/audio-codecs.js +0 -99
  140. package/dist/ffmpeg/audio-codecs.js.map +0 -1
  141. package/dist/ffmpeg/formats.d.ts +0 -42
  142. package/dist/ffmpeg/formats.d.ts.map +0 -1
  143. package/dist/ffmpeg/formats.js +0 -147
  144. package/dist/ffmpeg/formats.js.map +0 -1
  145. package/dist/ffmpeg/index.d.ts +0 -10
  146. package/dist/ffmpeg/index.d.ts.map +0 -1
  147. package/dist/ffmpeg/index.js +0 -13
  148. package/dist/ffmpeg/index.js.map +0 -1
  149. package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
  150. package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
  151. package/dist/ffmpeg/parsers/annexb.js +0 -201
  152. package/dist/ffmpeg/parsers/annexb.js.map +0 -1
  153. package/dist/ffmpeg/parsers/index.d.ts +0 -6
  154. package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
  155. package/dist/ffmpeg/parsers/index.js +0 -8
  156. package/dist/ffmpeg/parsers/index.js.map +0 -1
  157. package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
  158. package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
  159. package/dist/ffmpeg/parsers/ivf.js +0 -109
  160. package/dist/ffmpeg/parsers/ivf.js.map +0 -1
  161. package/dist/ffmpeg/types.d.ts +0 -85
  162. package/dist/ffmpeg/types.d.ts.map +0 -1
  163. package/dist/ffmpeg/types.js +0 -8
  164. package/dist/ffmpeg/types.js.map +0 -1
  165. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -24
  166. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
  167. package/dist/mediabunny/FFmpegAudioDecoder.js +0 -126
  168. package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
  169. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -44
  170. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
  171. package/dist/mediabunny/FFmpegAudioEncoder.js +0 -221
  172. package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
  173. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -25
  174. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
  175. package/dist/mediabunny/FFmpegVideoDecoder.js +0 -122
  176. package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
  177. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -49
  178. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
  179. package/dist/mediabunny/FFmpegVideoEncoder.js +0 -264
  180. package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
  181. package/dist/mediabunny/index.d.ts +0 -21
  182. package/dist/mediabunny/index.d.ts.map +0 -1
  183. package/dist/mediabunny/index.js +0 -33
  184. package/dist/mediabunny/index.js.map +0 -1
  185. package/dist/types.d.ts +0 -6
  186. package/dist/types.d.ts.map +0 -1
  187. package/dist/types.js +0 -6
  188. package/dist/types.js.map +0 -1
@@ -1,201 +0,0 @@
1
- /**
2
- * H.264/HEVC Annex B bitstream parser
3
- *
4
- * Parses Annex B format using Access Unit Delimiter (AUD) as frame boundaries.
5
- */
6
- /**
7
- * NAL unit types for H.264
8
- */
9
- export const H264_NAL_TYPES = {
10
- SLICE: 1, // Non-IDR slice
11
- IDR: 5, // IDR slice (keyframe)
12
- SEI: 6, // Supplemental Enhancement Information
13
- SPS: 7, // Sequence Parameter Set
14
- PPS: 8, // Picture Parameter Set
15
- AUD: 9, // Access Unit Delimiter
16
- };
17
- /**
18
- * NAL unit types for HEVC
19
- */
20
- export const HEVC_NAL_TYPES = {
21
- TRAIL_N: 0, // Non-reference trailing picture
22
- TRAIL_R: 1, // Reference trailing picture
23
- IDR_W_RADL: 19, // IDR with RADL
24
- IDR_N_LP: 20, // IDR without leading pictures
25
- CRA: 21, // Clean Random Access
26
- VPS: 32, // Video Parameter Set
27
- SPS: 33, // Sequence Parameter Set
28
- PPS: 34, // Picture Parameter Set
29
- AUD: 35, // Access Unit Delimiter
30
- };
31
- /**
32
- * Create initial Annex B parser state
33
- */
34
- export function createAnnexBParserState(codec) {
35
- return {
36
- buffer: Buffer.alloc(0),
37
- codec,
38
- frameIndex: 0,
39
- };
40
- }
41
- /**
42
- * Get NAL unit type from first byte after start code
43
- */
44
- export function getNalType(firstByte, codec) {
45
- if (codec === 'h264') {
46
- // H.264: NAL type is in bits 0-4
47
- return firstByte & 0x1f;
48
- }
49
- else {
50
- // HEVC: NAL type is in bits 1-6
51
- return (firstByte >> 1) & 0x3f;
52
- }
53
- }
54
- /**
55
- * Check if NAL type is an Access Unit Delimiter
56
- */
57
- export function isAudNal(nalType, codec) {
58
- if (codec === 'h264') {
59
- return nalType === H264_NAL_TYPES.AUD;
60
- }
61
- else {
62
- return nalType === HEVC_NAL_TYPES.AUD;
63
- }
64
- }
65
- /**
66
- * Find start code in buffer starting from offset
67
- * Returns { position, length } or null if not found
68
- */
69
- export function findStartCode(data, offset) {
70
- for (let i = offset; i < data.length - 2; i++) {
71
- if (data[i] === 0 && data[i + 1] === 0) {
72
- if (data[i + 2] === 1) {
73
- return { position: i, length: 3 };
74
- }
75
- else if (data[i + 2] === 0 && i + 3 < data.length && data[i + 3] === 1) {
76
- return { position: i, length: 4 };
77
- }
78
- }
79
- }
80
- return null;
81
- }
82
- /**
83
- * Find all AUD positions in buffer
84
- */
85
- export function findAudPositions(data, codec) {
86
- const positions = [];
87
- let offset = 0;
88
- while (offset < data.length - 4) {
89
- const startCode = findStartCode(data, offset);
90
- if (!startCode)
91
- break;
92
- const nalStart = startCode.position + startCode.length;
93
- if (nalStart < data.length) {
94
- const nalType = getNalType(data[nalStart], codec);
95
- if (isAudNal(nalType, codec)) {
96
- positions.push(startCode.position);
97
- }
98
- }
99
- offset = nalStart;
100
- }
101
- return positions;
102
- }
103
- /**
104
- * Check if H.264 frame is a keyframe
105
- */
106
- export function isH264KeyFrame(data) {
107
- let offset = 0;
108
- while (offset < data.length - 4) {
109
- const startCode = findStartCode(data, offset);
110
- if (!startCode)
111
- break;
112
- const nalStart = startCode.position + startCode.length;
113
- if (nalStart < data.length) {
114
- const nalType = getNalType(data[nalStart], 'h264');
115
- // IDR slice = keyframe
116
- if (nalType === H264_NAL_TYPES.IDR)
117
- return true;
118
- // Non-IDR slice = not keyframe
119
- if (nalType === H264_NAL_TYPES.SLICE)
120
- return false;
121
- }
122
- offset = nalStart;
123
- }
124
- return false;
125
- }
126
- /**
127
- * Check if HEVC frame is a keyframe
128
- */
129
- export function isHEVCKeyFrame(data) {
130
- let offset = 0;
131
- while (offset < data.length - 4) {
132
- const startCode = findStartCode(data, offset);
133
- if (!startCode)
134
- break;
135
- const nalStart = startCode.position + startCode.length;
136
- if (nalStart < data.length) {
137
- const nalType = getNalType(data[nalStart], 'hevc');
138
- // IDR or CRA types are keyframes (16-21)
139
- if (nalType >= 16 && nalType <= 21)
140
- return true;
141
- // Trailing picture types are not keyframes (0-9)
142
- if (nalType >= 0 && nalType <= 9)
143
- return false;
144
- }
145
- offset = nalStart;
146
- }
147
- return false;
148
- }
149
- /**
150
- * Check if frame is a keyframe based on codec
151
- */
152
- export function isKeyFrame(data, codec) {
153
- return codec === 'h264' ? isH264KeyFrame(data) : isHEVCKeyFrame(data);
154
- }
155
- /**
156
- * Parse Annex B frames from accumulated data
157
- *
158
- * @param state - Parser state (mutated)
159
- * @param newData - New data to append
160
- * @returns Array of parsed frames
161
- */
162
- export function parseAnnexBFrames(state, newData) {
163
- const frames = [];
164
- // Append new data
165
- state.buffer = Buffer.concat([state.buffer, newData]);
166
- // Find all AUD positions
167
- const audPositions = findAudPositions(state.buffer, state.codec);
168
- // Need at least 2 AUDs to have a complete frame
169
- if (audPositions.length < 2) {
170
- return frames;
171
- }
172
- // Emit all complete frames
173
- for (let i = 0; i < audPositions.length - 1; i++) {
174
- const frameData = Buffer.from(state.buffer.subarray(audPositions[i], audPositions[i + 1]));
175
- frames.push({
176
- data: frameData,
177
- timestamp: state.frameIndex++,
178
- keyFrame: isKeyFrame(frameData, state.codec),
179
- });
180
- }
181
- // Keep the last incomplete frame
182
- const lastAudPos = audPositions[audPositions.length - 1];
183
- state.buffer = Buffer.from(state.buffer.subarray(lastAudPos));
184
- return frames;
185
- }
186
- /**
187
- * Flush remaining data as final frame
188
- */
189
- export function flushAnnexBParser(state) {
190
- if (state.buffer.length === 0) {
191
- return null;
192
- }
193
- const frameData = Buffer.from(state.buffer);
194
- state.buffer = Buffer.alloc(0);
195
- return {
196
- data: frameData,
197
- timestamp: state.frameIndex++,
198
- keyFrame: isKeyFrame(frameData, state.codec),
199
- };
200
- }
201
- //# sourceMappingURL=annexb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"annexb.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/annexb.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Frame parsers for different container formats
3
- */
4
- export { IVF_HEADER_SIZE, IVF_FRAME_HEADER_SIZE, IVF_SIGNATURE, createIvfParserState, validateIvfSignature, parseIvfFrames, isVP9KeyFrame, isVP8KeyFrame, isAV1KeyFrame, type IvfParserState, } from './ivf.js';
5
- export { H264_NAL_TYPES, HEVC_NAL_TYPES, createAnnexBParserState, getNalType, isAudNal, findStartCode, findAudPositions, isH264KeyFrame, isHEVCKeyFrame, isKeyFrame, parseAnnexBFrames, flushAnnexBParser, type AnnexBParserState, } from './annexb.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Frame parsers for different container formats
3
- */
4
- // IVF parser (VP8, VP9, AV1)
5
- export { IVF_HEADER_SIZE, IVF_FRAME_HEADER_SIZE, IVF_SIGNATURE, createIvfParserState, validateIvfSignature, parseIvfFrames, isVP9KeyFrame, isVP8KeyFrame, isAV1KeyFrame, } from './ivf.js';
6
- // Annex B parser (H.264, HEVC)
7
- export { H264_NAL_TYPES, HEVC_NAL_TYPES, createAnnexBParserState, getNalType, isAudNal, findStartCode, findAudPositions, isH264KeyFrame, isHEVCKeyFrame, isKeyFrame, parseAnnexBFrames, flushAnnexBParser, } from './annexb.js';
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6BAA6B;AAC7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,GAEd,MAAM,UAAU,CAAC;AAElB,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,aAAa,CAAC"}
@@ -1,54 +0,0 @@
1
- /**
2
- * IVF container parser
3
- *
4
- * IVF format (used for VP8, VP9, AV1):
5
- * - 32-byte file header
6
- * - Per frame: 4-byte size (LE) + 8-byte timestamp (LE) + frame data
7
- */
8
- import type { EncodedFrameData } from '../types.js';
9
- /** IVF file header size */
10
- export declare const IVF_HEADER_SIZE = 32;
11
- /** IVF frame header size (size + timestamp) */
12
- export declare const IVF_FRAME_HEADER_SIZE = 12;
13
- /** IVF file signature */
14
- export declare const IVF_SIGNATURE = "DKIF";
15
- /**
16
- * IVF parser state
17
- */
18
- export interface IvfParserState {
19
- headerParsed: boolean;
20
- buffer: Buffer;
21
- }
22
- /**
23
- * Create initial IVF parser state
24
- */
25
- export declare function createIvfParserState(): IvfParserState;
26
- /**
27
- * Validate IVF file signature
28
- */
29
- export declare function validateIvfSignature(data: Buffer): boolean;
30
- /**
31
- * Parse IVF frames from accumulated data
32
- *
33
- * @param state - Parser state (mutated)
34
- * @param newData - New data to append
35
- * @param isKeyFrame - Function to determine if frame is a keyframe
36
- * @returns Array of parsed frames
37
- */
38
- export declare function parseIvfFrames(state: IvfParserState, newData: Buffer, isKeyFrame: (data: Buffer) => boolean): EncodedFrameData[];
39
- /**
40
- * Check if VP9 frame is a keyframe
41
- * VP9: frame_type bit in frame header (0 = keyframe)
42
- */
43
- export declare function isVP9KeyFrame(data: Buffer): boolean;
44
- /**
45
- * Check if VP8 frame is a keyframe
46
- * VP8: keyframe indicated by bit in frame tag
47
- */
48
- export declare function isVP8KeyFrame(data: Buffer): boolean;
49
- /**
50
- * Check if AV1 frame is a keyframe
51
- * Simplified check - real implementation would parse OBU headers
52
- */
53
- export declare function isAV1KeyFrame(data: Buffer): boolean;
54
- //# sourceMappingURL=ivf.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ivf.d.ts","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/ivf.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,2BAA2B;AAC3B,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,yBAAyB;AACzB,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAKrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACpC,gBAAgB,EAAE,CA2CpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD"}
@@ -1,109 +0,0 @@
1
- /**
2
- * IVF container parser
3
- *
4
- * IVF format (used for VP8, VP9, AV1):
5
- * - 32-byte file header
6
- * - Per frame: 4-byte size (LE) + 8-byte timestamp (LE) + frame data
7
- */
8
- /** IVF file header size */
9
- export const IVF_HEADER_SIZE = 32;
10
- /** IVF frame header size (size + timestamp) */
11
- export const IVF_FRAME_HEADER_SIZE = 12;
12
- /** IVF file signature */
13
- export const IVF_SIGNATURE = 'DKIF';
14
- /**
15
- * Create initial IVF parser state
16
- */
17
- export function createIvfParserState() {
18
- return {
19
- headerParsed: false,
20
- buffer: Buffer.alloc(0),
21
- };
22
- }
23
- /**
24
- * Validate IVF file signature
25
- */
26
- export function validateIvfSignature(data) {
27
- if (data.length < 4)
28
- return false;
29
- return data.subarray(0, 4).toString() === IVF_SIGNATURE;
30
- }
31
- /**
32
- * Parse IVF frames from accumulated data
33
- *
34
- * @param state - Parser state (mutated)
35
- * @param newData - New data to append
36
- * @param isKeyFrame - Function to determine if frame is a keyframe
37
- * @returns Array of parsed frames
38
- */
39
- export function parseIvfFrames(state, newData, isKeyFrame) {
40
- const frames = [];
41
- // Append new data
42
- state.buffer = Buffer.concat([state.buffer, newData]);
43
- // Skip 32-byte IVF file header
44
- if (!state.headerParsed) {
45
- if (state.buffer.length < IVF_HEADER_SIZE) {
46
- return frames; // Wait for more data
47
- }
48
- // Verify IVF signature "DKIF"
49
- if (!validateIvfSignature(state.buffer)) {
50
- const signature = state.buffer.subarray(0, 4).toString();
51
- throw new Error(`Invalid IVF signature: ${signature}`);
52
- }
53
- state.buffer = state.buffer.subarray(IVF_HEADER_SIZE);
54
- state.headerParsed = true;
55
- }
56
- // Parse frames: 4-byte size + 8-byte timestamp + data
57
- while (state.buffer.length >= IVF_FRAME_HEADER_SIZE) {
58
- const frameSize = state.buffer.readUInt32LE(0);
59
- const timestamp = Number(state.buffer.readBigUInt64LE(4));
60
- const totalFrameSize = IVF_FRAME_HEADER_SIZE + frameSize;
61
- if (state.buffer.length < totalFrameSize) {
62
- break; // Wait for more data
63
- }
64
- const frameData = state.buffer.subarray(IVF_FRAME_HEADER_SIZE, totalFrameSize);
65
- state.buffer = state.buffer.subarray(totalFrameSize);
66
- frames.push({
67
- data: Buffer.from(frameData), // Copy the data
68
- timestamp,
69
- keyFrame: isKeyFrame(frameData),
70
- });
71
- }
72
- return frames;
73
- }
74
- /**
75
- * Check if VP9 frame is a keyframe
76
- * VP9: frame_type bit in frame header (0 = keyframe)
77
- */
78
- export function isVP9KeyFrame(data) {
79
- if (data.length === 0)
80
- return false;
81
- // VP9: check frame_type bit (bit 1 of first byte)
82
- // frame_type = 0 means keyframe
83
- return (data[0] & 0x02) === 0;
84
- }
85
- /**
86
- * Check if VP8 frame is a keyframe
87
- * VP8: keyframe indicated by bit in frame tag
88
- */
89
- export function isVP8KeyFrame(data) {
90
- if (data.length === 0)
91
- return false;
92
- // VP8: keyframe has specific frame tag
93
- // First bit of first byte indicates frame type (0 = key)
94
- return (data[0] & 0x01) === 0;
95
- }
96
- /**
97
- * Check if AV1 frame is a keyframe
98
- * Simplified check - real implementation would parse OBU headers
99
- */
100
- export function isAV1KeyFrame(data) {
101
- if (data.length < 2)
102
- return false;
103
- // AV1 OBU header parsing - simplified
104
- // This is a basic heuristic; full parsing would check OBU types
105
- const obuType = (data[0] >> 3) & 0x0f;
106
- // OBU_SEQUENCE_HEADER (type 1) usually indicates keyframe area
107
- return obuType === 1;
108
- }
109
- //# sourceMappingURL=ivf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ivf.js","sourceRoot":"","sources":["../../../src/ffmpeg/parsers/ivf.ts"],"names":[],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- /**
2
- * FFmpeg configuration types
3
- */
4
- /**
5
- * FFmpeg process configuration
6
- */
7
- export interface FFmpegConfig {
8
- input: FFmpegInputConfig;
9
- output: FFmpegOutputConfig;
10
- }
11
- /**
12
- * FFmpeg input configuration
13
- */
14
- export interface FFmpegInputConfig {
15
- format: string;
16
- codec?: string;
17
- width?: number;
18
- height?: number;
19
- framerate?: number;
20
- pixelFormat?: string;
21
- }
22
- /**
23
- * FFmpeg output configuration
24
- */
25
- export interface FFmpegOutputConfig {
26
- format: string;
27
- codec?: string;
28
- width?: number;
29
- height?: number;
30
- framerate?: number;
31
- pixelFormat?: string;
32
- bitrate?: number;
33
- }
34
- /**
35
- * Encoded frame data emitted by parsers
36
- */
37
- export interface EncodedFrameData {
38
- data: Buffer;
39
- timestamp: number;
40
- keyFrame: boolean;
41
- }
42
- /**
43
- * Decoder configuration for FFmpegProcess
44
- */
45
- export interface DecoderConfig {
46
- codec: string;
47
- width: number;
48
- height: number;
49
- outputPixelFormat?: string;
50
- hardwareDecoderArgs?: string[];
51
- hardwareDownloadFilter?: string;
52
- }
53
- /**
54
- * Bitrate mode for encoding
55
- * - 'constant': Constant bitrate (CBR) - predictable file size, may vary quality
56
- * - 'variable': Variable bitrate (VBR) - better quality, less predictable size
57
- * - 'quantizer': Fixed quality mode (CRF/CQ) - consistent quality, variable size
58
- */
59
- export type BitrateMode = 'constant' | 'variable' | 'quantizer';
60
- /**
61
- * Alpha channel handling mode
62
- * - 'discard': Drop alpha channel (default, works with all codecs)
63
- * - 'keep': Preserve alpha channel (only VP9 and AV1 support this)
64
- */
65
- export type AlphaOption = 'discard' | 'keep';
66
- /**
67
- * Encoder configuration for FFmpegProcess
68
- */
69
- export interface EncoderConfig {
70
- codec: string;
71
- width: number;
72
- height: number;
73
- inputPixelFormat?: string;
74
- framerate?: number;
75
- bitrate?: number;
76
- bitrateMode?: BitrateMode;
77
- latencyMode?: 'quality' | 'realtime';
78
- alpha?: AlphaOption;
79
- hardwareEncoderArgs?: string[];
80
- }
81
- /** Default timeout for graceful shutdown (ms) */
82
- export declare const DEFAULT_SHUTDOWN_TIMEOUT = 5000;
83
- /** Default timeout for flush operations (ms) */
84
- export declare const DEFAULT_FLUSH_TIMEOUT = 30000;
85
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ffmpeg/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACrC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,iDAAiD;AACjD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,QAAQ,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * FFmpeg configuration types
3
- */
4
- /** Default timeout for graceful shutdown (ms) */
5
- export const DEFAULT_SHUTDOWN_TIMEOUT = 5000;
6
- /** Default timeout for flush operations (ms) */
7
- export const DEFAULT_FLUSH_TIMEOUT = 30000;
8
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ffmpeg/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuFH,iDAAiD;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,gDAAgD;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Mediabunny AudioDecoder adapter using node-av backend
3
- *
4
- * Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
5
- * (which wrap FFmpeg's libav* libraries).
6
- */
7
- import { CustomAudioDecoder, EncodedPacket, AudioCodec } from 'mediabunny';
8
- export declare class FFmpegAudioDecoder extends CustomAudioDecoder {
9
- private backend;
10
- private frameIndex;
11
- private resolveFlush;
12
- private baseTimestamp;
13
- private hasBaseTimestamp;
14
- static supports(codec: AudioCodec, _config: AudioDecoderConfig): boolean;
15
- init(): Promise<void>;
16
- decode(packet: EncodedPacket): Promise<void>;
17
- flush(): Promise<void>;
18
- close(): Promise<void>;
19
- /**
20
- * Emit an AudioSample via Mediabunny callback
21
- */
22
- private emitAudioSample;
23
- }
24
- //# sourceMappingURL=FFmpegAudioDecoder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FFmpegAudioDecoder.d.ts","sourceRoot":"","sources":["../../src/mediabunny/FFmpegAudioDecoder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,gBAAgB,CAAkB;IAE1C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAIlE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCrB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAsBxB"}
@@ -1,126 +0,0 @@
1
- /**
2
- * Mediabunny AudioDecoder adapter using node-av backend
3
- *
4
- * Implements Mediabunny's CustomAudioDecoder interface using node-av native bindings
5
- * (which wrap FFmpeg's libav* libraries).
6
- */
7
- import { CustomAudioDecoder, AudioSample, } from 'mediabunny';
8
- import { NodeAvAudioDecoder } from '../node-av/NodeAvAudioDecoder.js';
9
- import { toUint8Array } from '../utils/buffer.js';
10
- // Map Mediabunny codec to internal codec name
11
- const CODEC_NAME_MAP = {
12
- 'aac': 'aac',
13
- 'opus': 'opus',
14
- 'mp3': 'mp3',
15
- 'flac': 'flac',
16
- 'vorbis': 'vorbis',
17
- 'pcm-s16': 'pcm-s16',
18
- 'pcm-s16be': 'pcm-s16',
19
- 'pcm-s24': 'pcm-s16',
20
- 'pcm-s24be': 'pcm-s16',
21
- 'pcm-s32': 'pcm-s16',
22
- 'pcm-s32be': 'pcm-s16',
23
- 'pcm-f32': 'pcm-f32',
24
- 'pcm-f32be': 'pcm-f32',
25
- 'pcm-f64': 'pcm-f32',
26
- 'pcm-f64be': 'pcm-f32',
27
- 'pcm-u8': 'pcm-s16',
28
- 'pcm-s8': 'pcm-s16',
29
- 'ulaw': 'pcm-s16',
30
- 'alaw': 'pcm-s16',
31
- };
32
- export class FFmpegAudioDecoder extends CustomAudioDecoder {
33
- backend = null;
34
- frameIndex = 0;
35
- resolveFlush = null;
36
- // Track base timestamp from first input packet
37
- baseTimestamp = 0;
38
- hasBaseTimestamp = false;
39
- static supports(codec, _config) {
40
- return codec in CODEC_NAME_MAP;
41
- }
42
- async init() {
43
- const sampleRate = this.config.sampleRate ?? 44100;
44
- const numberOfChannels = this.config.numberOfChannels ?? 2;
45
- // Create node-av backend
46
- this.backend = new NodeAvAudioDecoder();
47
- const codecName = CODEC_NAME_MAP[this.codec] || 'aac';
48
- // Convert description to ArrayBufferView if present
49
- let description;
50
- if (this.config.description) {
51
- description = toUint8Array(this.config.description);
52
- }
53
- this.backend.startDecoder({
54
- codec: codecName,
55
- sampleRate,
56
- numberOfChannels,
57
- description,
58
- outputFormat: 'f32',
59
- });
60
- // Listen for decoded frames
61
- this.backend.on('frame', (frame) => {
62
- this.emitAudioSample(frame.data, frame.numberOfFrames);
63
- });
64
- this.backend.on('error', (err) => {
65
- console.error('[FFmpegAudioDecoder] Backend error:', err.message);
66
- });
67
- this.backend.on('close', () => {
68
- if (this.resolveFlush) {
69
- this.resolveFlush();
70
- this.resolveFlush = null;
71
- }
72
- });
73
- }
74
- async decode(packet) {
75
- if (!this.backend?.isHealthy) {
76
- throw new Error('Decoder not initialized');
77
- }
78
- // Capture the base timestamp from the first packet
79
- if (!this.hasBaseTimestamp) {
80
- this.baseTimestamp = packet.timestamp;
81
- this.hasBaseTimestamp = true;
82
- }
83
- // Write encoded data to backend
84
- this.backend.write(Buffer.from(packet.data));
85
- }
86
- async flush() {
87
- return new Promise((resolve) => {
88
- this.resolveFlush = resolve;
89
- if (this.backend) {
90
- this.backend.end();
91
- }
92
- else {
93
- resolve();
94
- }
95
- });
96
- }
97
- async close() {
98
- if (this.backend) {
99
- this.backend.kill();
100
- this.backend = null;
101
- }
102
- }
103
- /**
104
- * Emit an AudioSample via Mediabunny callback
105
- */
106
- emitAudioSample(data, numberOfFrames) {
107
- if (data.length === 0 || numberOfFrames === 0)
108
- return;
109
- const sampleRate = this.config.sampleRate ?? 44100;
110
- const numberOfChannels = this.config.numberOfChannels ?? 2;
111
- // Calculate timestamp in seconds, preserving base timestamp from input
112
- const offsetSeconds = this.frameIndex / sampleRate;
113
- const timestampSeconds = this.baseTimestamp + offsetSeconds;
114
- // Create AudioSample from raw f32 interleaved data
115
- const sample = new AudioSample({
116
- format: 'f32',
117
- sampleRate,
118
- numberOfChannels,
119
- timestamp: timestampSeconds,
120
- data: new Uint8Array(data),
121
- });
122
- this.frameIndex += numberOfFrames;
123
- this.onSample(sample);
124
- }
125
- }
126
- //# sourceMappingURL=FFmpegAudioDecoder.js.map