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,558 +0,0 @@
1
- /**
2
- * Tests for ImageDecoder class - including animated image support
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { ImageDecoder } from '../ImageDecoder.js';
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { fileURLToPath } from 'url';
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
- const TEST_IMAGES_DIR = '/tmp/webcodecs-test-images';
12
- const FIXTURE_IMAGES_DIR = path.join(__dirname, 'fixtures');
13
- /**
14
- * Helper to convert Node.js Buffer to ArrayBuffer properly.
15
- * Node.js Buffer.buffer may be larger than the actual data.
16
- */
17
- function bufferToArrayBuffer(buffer) {
18
- const ab = new ArrayBuffer(buffer.length);
19
- new Uint8Array(ab).set(buffer);
20
- return ab;
21
- }
22
- describe('ImageDecoder', () => {
23
- describe('static images', () => {
24
- it('should decode a static PNG image', async () => {
25
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
26
- if (!fs.existsSync(pngPath)) {
27
- console.log('Skipping test: test.png not found');
28
- return;
29
- }
30
- const data = fs.readFileSync(pngPath);
31
- const decoder = new ImageDecoder({
32
- data: bufferToArrayBuffer(data),
33
- type: 'image/png',
34
- });
35
- await decoder.completed;
36
- expect(decoder.tracks.length).toBeGreaterThan(0);
37
- const track = decoder.tracks.selectedTrack;
38
- expect(track).toBeDefined();
39
- expect(track.frameCount).toBe(1);
40
- expect(track.animated).toBe(false);
41
- const result = await decoder.decode({ frameIndex: 0 });
42
- expect(result.image).toBeDefined();
43
- expect(result.image.codedWidth).toBeGreaterThan(0);
44
- expect(result.image.codedHeight).toBeGreaterThan(0);
45
- result.image.close();
46
- decoder.close();
47
- });
48
- it('should decode a static JPEG image', async () => {
49
- const jpgPath = path.join(TEST_IMAGES_DIR, 'test.jpg');
50
- if (!fs.existsSync(jpgPath)) {
51
- console.log('Skipping test: test.jpg not found');
52
- return;
53
- }
54
- const data = fs.readFileSync(jpgPath);
55
- const decoder = new ImageDecoder({
56
- data: bufferToArrayBuffer(data),
57
- type: 'image/jpeg',
58
- });
59
- await decoder.completed;
60
- const track = decoder.tracks.selectedTrack;
61
- expect(track.animated).toBe(false);
62
- expect(track.frameCount).toBe(1);
63
- decoder.close();
64
- });
65
- it('should decode a static WebP image', async () => {
66
- const webpPath = path.join(TEST_IMAGES_DIR, 'test.webp');
67
- if (!fs.existsSync(webpPath)) {
68
- console.log('Skipping test: test.webp not found');
69
- return;
70
- }
71
- const data = fs.readFileSync(webpPath);
72
- const decoder = new ImageDecoder({
73
- data: bufferToArrayBuffer(data),
74
- type: 'image/webp',
75
- });
76
- await decoder.completed;
77
- const track = decoder.tracks.selectedTrack;
78
- expect(track.animated).toBe(false);
79
- decoder.close();
80
- });
81
- it('should decode an AVIF image', async () => {
82
- const avifPath = path.join(TEST_IMAGES_DIR, 'test.avif');
83
- if (!fs.existsSync(avifPath)) {
84
- console.log('Skipping test: test.avif not found');
85
- return;
86
- }
87
- const data = fs.readFileSync(avifPath);
88
- const decoder = new ImageDecoder({
89
- data: bufferToArrayBuffer(data),
90
- type: 'image/avif',
91
- });
92
- await decoder.completed;
93
- const track = decoder.tracks.selectedTrack;
94
- expect(track).toBeDefined();
95
- expect(track.frameCount).toBeGreaterThanOrEqual(1);
96
- const result = await decoder.decode({ frameIndex: 0 });
97
- expect(result.image).toBeDefined();
98
- expect(result.image.codedWidth).toBeGreaterThan(0);
99
- expect(result.image.codedHeight).toBeGreaterThan(0);
100
- result.image.close();
101
- decoder.close();
102
- });
103
- it('should decode a BMP image', async () => {
104
- const bmpPath = path.join(TEST_IMAGES_DIR, 'test.bmp');
105
- if (!fs.existsSync(bmpPath)) {
106
- console.log('Skipping test: test.bmp not found');
107
- return;
108
- }
109
- const data = fs.readFileSync(bmpPath);
110
- const decoder = new ImageDecoder({
111
- data: bufferToArrayBuffer(data),
112
- type: 'image/bmp',
113
- });
114
- await decoder.completed;
115
- const track = decoder.tracks.selectedTrack;
116
- expect(track).toBeDefined();
117
- expect(track.animated).toBe(false);
118
- const result = await decoder.decode({ frameIndex: 0 });
119
- expect(result.image.codedWidth).toBeGreaterThan(0);
120
- result.image.close();
121
- decoder.close();
122
- });
123
- });
124
- describe('animated images', () => {
125
- it('should decode an animated GIF with multiple frames', async () => {
126
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
127
- if (!fs.existsSync(gifPath)) {
128
- console.log('Skipping test: animated_multi.gif not found');
129
- return;
130
- }
131
- const data = fs.readFileSync(gifPath);
132
- const decoder = new ImageDecoder({
133
- data: bufferToArrayBuffer(data),
134
- type: 'image/gif',
135
- });
136
- await decoder.completed;
137
- const track = decoder.tracks.selectedTrack;
138
- if (!track || !track.animated || track.frameCount <= 1) {
139
- console.log('Skipping test: FFmpeg could not detect GIF animation');
140
- decoder.close();
141
- return;
142
- }
143
- // Decode first frame
144
- const result1 = await decoder.decode({ frameIndex: 0 });
145
- expect(result1.image).toBeDefined();
146
- expect(result1.image.timestamp).toBe(0);
147
- // Decode second frame - should have a later timestamp
148
- const result2 = await decoder.decode({ frameIndex: 1 });
149
- expect(result2.image).toBeDefined();
150
- expect(result2.image.timestamp).toBeGreaterThan(0);
151
- result1.image.close();
152
- result2.image.close();
153
- decoder.close();
154
- });
155
- it('should parse frame durations from animated GIF', async () => {
156
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
157
- if (!fs.existsSync(gifPath)) {
158
- console.log('Skipping test: animated_multi.gif not found');
159
- return;
160
- }
161
- const data = fs.readFileSync(gifPath);
162
- const decoder = new ImageDecoder({
163
- data: bufferToArrayBuffer(data),
164
- type: 'image/gif',
165
- });
166
- await decoder.completed;
167
- const track = decoder.tracks.selectedTrack;
168
- expect(track.frameCount).toBeGreaterThan(1);
169
- // Each frame should have a duration
170
- const frame0 = await decoder.decode({ frameIndex: 0 });
171
- const frame1 = await decoder.decode({ frameIndex: 1 });
172
- // Duration should be in microseconds (40ms = 40000 microseconds)
173
- expect(frame0.image.duration).toBeGreaterThan(0);
174
- expect(frame1.image.duration).toBeGreaterThan(0);
175
- // Timestamp of frame 1 should be >= duration of frame 0
176
- expect(frame1.image.timestamp).toBeGreaterThanOrEqual(frame0.image.duration);
177
- frame0.image.close();
178
- frame1.image.close();
179
- decoder.close();
180
- });
181
- it('should report correct repetitionCount for animated GIF', async () => {
182
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
183
- if (!fs.existsSync(gifPath)) {
184
- console.log('Skipping test: animated_multi.gif not found');
185
- return;
186
- }
187
- const data = fs.readFileSync(gifPath);
188
- const decoder = new ImageDecoder({
189
- data: bufferToArrayBuffer(data),
190
- type: 'image/gif',
191
- });
192
- await decoder.completed;
193
- const track = decoder.tracks.selectedTrack;
194
- // GIF with loop 0 should be Infinity
195
- expect(track.repetitionCount).toBeDefined();
196
- // For a looping GIF, repetitionCount is typically Infinity
197
- expect(track.repetitionCount).toBeGreaterThanOrEqual(0);
198
- decoder.close();
199
- });
200
- it('should decode frames sequentially with correct timestamps', async () => {
201
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
202
- if (!fs.existsSync(gifPath)) {
203
- console.log('Skipping test: animated_multi.gif not found');
204
- return;
205
- }
206
- const data = fs.readFileSync(gifPath);
207
- const decoder = new ImageDecoder({
208
- data: bufferToArrayBuffer(data),
209
- type: 'image/gif',
210
- });
211
- await decoder.completed;
212
- const track = decoder.tracks.selectedTrack;
213
- const frameCount = track.frameCount;
214
- // Decode all frames and verify timestamps are increasing
215
- let lastTimestamp = -1;
216
- const frames = [];
217
- for (let i = 0; i < Math.min(frameCount, 5); i++) {
218
- const result = await decoder.decode({ frameIndex: i });
219
- expect(result.image.timestamp).toBeGreaterThan(lastTimestamp);
220
- lastTimestamp = result.image.timestamp;
221
- frames.push(result.image);
222
- }
223
- // Cleanup
224
- frames.forEach((f) => f.close());
225
- decoder.close();
226
- });
227
- // Animated WebP decoding has known issues due to FFmpeg's webp demuxer
228
- // skipping ANIM/ANMF chunks, resulting in "image data not found" errors.
229
- // This is a fundamental FFmpeg limitation that affects both node-av and CLI.
230
- it.skip('should decode an animated WebP with multiple frames', async () => {
231
- const candidatePath = path.join(TEST_IMAGES_DIR, 'animated_multi.webp');
232
- const fallbackPath = path.join(FIXTURE_IMAGES_DIR, 'animated_multi.webp');
233
- const webpPath = fs.existsSync(fallbackPath) ? fallbackPath : candidatePath;
234
- if (!fs.existsSync(webpPath)) {
235
- console.log('Skipping test: animated_multi.webp not found');
236
- return;
237
- }
238
- const data = fs.readFileSync(webpPath);
239
- const decoder = new ImageDecoder({
240
- data: bufferToArrayBuffer(data),
241
- type: 'image/webp',
242
- });
243
- try {
244
- await decoder.completed;
245
- }
246
- catch {
247
- // FFmpeg's webp demuxer fails with "image data not found" on animated WebP
248
- console.log('Skipping test: FFmpeg cannot decode animated WebP (known limitation)');
249
- decoder.close();
250
- return;
251
- }
252
- const track = decoder.tracks.selectedTrack;
253
- if (!track || !track.animated || track.frameCount <= 1) {
254
- console.log('Skipping test: FFmpeg could not decode animated WebP frames (known limitation)');
255
- decoder.close();
256
- return;
257
- }
258
- // Decode first frame
259
- const result1 = await decoder.decode({ frameIndex: 0 });
260
- expect(result1.image).toBeDefined();
261
- expect(result1.image.codedWidth).toBeGreaterThan(0);
262
- // Decode second frame
263
- const result2 = await decoder.decode({ frameIndex: 1 });
264
- expect(result2.image).toBeDefined();
265
- expect(result2.image.timestamp).toBeGreaterThan(0);
266
- result1.image.close();
267
- result2.image.close();
268
- decoder.close();
269
- });
270
- it('should handle static GIF as non-animated', async () => {
271
- const gifPath = path.join(TEST_IMAGES_DIR, 'test.gif');
272
- if (!fs.existsSync(gifPath)) {
273
- console.log('Skipping test: test.gif not found');
274
- return;
275
- }
276
- const data = fs.readFileSync(gifPath);
277
- const decoder = new ImageDecoder({
278
- data: bufferToArrayBuffer(data),
279
- type: 'image/gif',
280
- });
281
- await decoder.completed;
282
- const track = decoder.tracks.selectedTrack;
283
- // A single-frame GIF should not be marked as animated
284
- if (track.frameCount === 1) {
285
- expect(track.animated).toBe(false);
286
- }
287
- decoder.close();
288
- });
289
- });
290
- describe('isTypeSupported', () => {
291
- it('should support common image formats', async () => {
292
- expect(await ImageDecoder.isTypeSupported('image/png')).toBe(true);
293
- expect(await ImageDecoder.isTypeSupported('image/jpeg')).toBe(true);
294
- expect(await ImageDecoder.isTypeSupported('image/gif')).toBe(true);
295
- expect(await ImageDecoder.isTypeSupported('image/webp')).toBe(true);
296
- expect(await ImageDecoder.isTypeSupported('image/bmp')).toBe(true);
297
- expect(await ImageDecoder.isTypeSupported('image/avif')).toBe(true);
298
- expect(await ImageDecoder.isTypeSupported('image/tiff')).toBe(true);
299
- expect(await ImageDecoder.isTypeSupported('image/apng')).toBe(true);
300
- });
301
- it('should return false for unsupported types', async () => {
302
- expect(await ImageDecoder.isTypeSupported('image/unknownformat')).toBe(false);
303
- expect(await ImageDecoder.isTypeSupported('video/mp4')).toBe(false);
304
- });
305
- });
306
- describe('error handling', () => {
307
- it('should reject for invalid image data', async () => {
308
- const decoder = new ImageDecoder({
309
- data: new ArrayBuffer(100), // Invalid image data
310
- type: 'image/png',
311
- });
312
- await expect(decoder.completed).rejects.toThrow();
313
- });
314
- it('should reject for unsupported image type', async () => {
315
- const decoder = new ImageDecoder({
316
- data: new ArrayBuffer(100),
317
- type: 'image/unknownformat',
318
- });
319
- await expect(decoder.completed).rejects.toThrow();
320
- });
321
- });
322
- describe('decode options', () => {
323
- it('should decode specific frame by index', async () => {
324
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
325
- if (!fs.existsSync(gifPath)) {
326
- console.log('Skipping test: animated_multi.gif not found');
327
- return;
328
- }
329
- const data = fs.readFileSync(gifPath);
330
- const decoder = new ImageDecoder({
331
- data: bufferToArrayBuffer(data),
332
- type: 'image/gif',
333
- });
334
- await decoder.completed;
335
- const track = decoder.tracks.selectedTrack;
336
- if (track.frameCount > 2) {
337
- // Decode frame at index 2 directly
338
- const result = await decoder.decode({ frameIndex: 2 });
339
- expect(result.image).toBeDefined();
340
- // Frame 2 timestamp should be sum of durations of frames 0 and 1
341
- expect(result.image.timestamp).toBeGreaterThan(0);
342
- result.image.close();
343
- }
344
- decoder.close();
345
- });
346
- it('should report completeFramesOnly in decode result', async () => {
347
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
348
- if (!fs.existsSync(pngPath)) {
349
- console.log('Skipping test: test.png not found');
350
- return;
351
- }
352
- const data = fs.readFileSync(pngPath);
353
- const decoder = new ImageDecoder({
354
- data: bufferToArrayBuffer(data),
355
- type: 'image/png',
356
- });
357
- await decoder.completed;
358
- const result = await decoder.decode({ frameIndex: 0 });
359
- expect(result.complete).toBe(true);
360
- result.image.close();
361
- decoder.close();
362
- });
363
- it('should allow decode with completeFramesOnly set to false', async () => {
364
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
365
- if (!fs.existsSync(pngPath)) {
366
- console.log('Skipping test: test.png not found');
367
- return;
368
- }
369
- const data = fs.readFileSync(pngPath);
370
- const decoder = new ImageDecoder({
371
- data: bufferToArrayBuffer(data),
372
- type: 'image/png',
373
- });
374
- await decoder.completed;
375
- const result = await decoder.decode({ frameIndex: 0, completeFramesOnly: false });
376
- expect(result.complete).toBe(true);
377
- result.image.close();
378
- decoder.close();
379
- });
380
- it('should reset and re-decode frames', async () => {
381
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
382
- if (!fs.existsSync(pngPath)) {
383
- console.log('Skipping test: test.png not found');
384
- return;
385
- }
386
- const data = fs.readFileSync(pngPath);
387
- const decoder = new ImageDecoder({
388
- data: bufferToArrayBuffer(data),
389
- type: 'image/png',
390
- });
391
- await decoder.completed;
392
- const first = await decoder.decode({ frameIndex: 0 });
393
- first.image.close();
394
- decoder.reset();
395
- await decoder.completed;
396
- const second = await decoder.decode({ frameIndex: 0 });
397
- expect(second.image.codedWidth).toBeGreaterThan(0);
398
- second.image.close();
399
- decoder.close();
400
- });
401
- });
402
- describe('WebCodecs API compliance', () => {
403
- it('should have type property matching constructor input', async () => {
404
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
405
- if (!fs.existsSync(pngPath)) {
406
- console.log('Skipping test: test.png not found');
407
- return;
408
- }
409
- const data = fs.readFileSync(pngPath);
410
- const decoder = new ImageDecoder({
411
- data: bufferToArrayBuffer(data),
412
- type: 'image/png',
413
- });
414
- expect(decoder.type).toBe('image/png');
415
- decoder.close();
416
- });
417
- it('should have complete property that becomes true after data is loaded', async () => {
418
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
419
- if (!fs.existsSync(pngPath)) {
420
- console.log('Skipping test: test.png not found');
421
- return;
422
- }
423
- const data = fs.readFileSync(pngPath);
424
- const decoder = new ImageDecoder({
425
- data: bufferToArrayBuffer(data),
426
- type: 'image/png',
427
- });
428
- await decoder.completed;
429
- expect(decoder.complete).toBe(true);
430
- decoder.close();
431
- });
432
- it('should have tracks.ready promise that resolves', async () => {
433
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
434
- if (!fs.existsSync(pngPath)) {
435
- console.log('Skipping test: test.png not found');
436
- return;
437
- }
438
- const data = fs.readFileSync(pngPath);
439
- const decoder = new ImageDecoder({
440
- data: bufferToArrayBuffer(data),
441
- type: 'image/png',
442
- });
443
- await decoder.tracks.ready;
444
- expect(decoder.tracks.length).toBeGreaterThan(0);
445
- expect(decoder.tracks.selectedIndex).toBeGreaterThanOrEqual(0);
446
- expect(decoder.tracks.selectedTrack).not.toBeNull();
447
- decoder.close();
448
- });
449
- it('should support transfer parameter for zero-copy', async () => {
450
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
451
- if (!fs.existsSync(pngPath)) {
452
- console.log('Skipping test: test.png not found');
453
- return;
454
- }
455
- const data = fs.readFileSync(pngPath);
456
- const arrayBuffer = bufferToArrayBuffer(data);
457
- // Create decoder with transfer - should take ownership
458
- const decoder = new ImageDecoder({
459
- data: arrayBuffer,
460
- type: 'image/png',
461
- transfer: [arrayBuffer],
462
- });
463
- await decoder.completed;
464
- expect(decoder.complete).toBe(true);
465
- const result = await decoder.decode({ frameIndex: 0 });
466
- expect(result.image.codedWidth).toBeGreaterThan(0);
467
- result.image.close();
468
- decoder.close();
469
- });
470
- it('should throw InvalidStateError when decoding after close', async () => {
471
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
472
- if (!fs.existsSync(pngPath)) {
473
- console.log('Skipping test: test.png not found');
474
- return;
475
- }
476
- const data = fs.readFileSync(pngPath);
477
- const decoder = new ImageDecoder({
478
- data: bufferToArrayBuffer(data),
479
- type: 'image/png',
480
- });
481
- await decoder.completed;
482
- decoder.close();
483
- await expect(decoder.decode({ frameIndex: 0 })).rejects.toThrow('ImageDecoder is closed');
484
- });
485
- it('should throw InvalidStateError for out of range frame index', async () => {
486
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
487
- if (!fs.existsSync(pngPath)) {
488
- console.log('Skipping test: test.png not found');
489
- return;
490
- }
491
- const data = fs.readFileSync(pngPath);
492
- const decoder = new ImageDecoder({
493
- data: bufferToArrayBuffer(data),
494
- type: 'image/png',
495
- });
496
- await decoder.completed;
497
- // PNG has only 1 frame, so index 1 should fail
498
- await expect(decoder.decode({ frameIndex: 1 })).rejects.toThrow();
499
- decoder.close();
500
- });
501
- it('should throw InvalidStateError when reset after close', async () => {
502
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
503
- if (!fs.existsSync(pngPath)) {
504
- console.log('Skipping test: test.png not found');
505
- return;
506
- }
507
- const data = fs.readFileSync(pngPath);
508
- const decoder = new ImageDecoder({
509
- data: bufferToArrayBuffer(data),
510
- type: 'image/png',
511
- });
512
- await decoder.completed;
513
- decoder.close();
514
- expect(() => decoder.reset()).toThrow('ImageDecoder is closed');
515
- });
516
- it('should return ImageTrack with correct properties', async () => {
517
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
518
- if (!fs.existsSync(gifPath)) {
519
- console.log('Skipping test: animated_multi.gif not found');
520
- return;
521
- }
522
- const data = fs.readFileSync(gifPath);
523
- const decoder = new ImageDecoder({
524
- data: bufferToArrayBuffer(data),
525
- type: 'image/gif',
526
- });
527
- await decoder.completed;
528
- const track = decoder.tracks.selectedTrack;
529
- // Check all required ImageTrack properties per spec
530
- expect(typeof track.animated).toBe('boolean');
531
- expect(typeof track.frameCount).toBe('number');
532
- expect(typeof track.repetitionCount).toBe('number');
533
- expect(typeof track.selected).toBe('boolean');
534
- expect(track.animated).toBe(true);
535
- expect(track.frameCount).toBeGreaterThan(1);
536
- expect(track.selected).toBe(true);
537
- decoder.close();
538
- });
539
- it('should iterate over tracks with Symbol.iterator', async () => {
540
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
541
- if (!fs.existsSync(pngPath)) {
542
- console.log('Skipping test: test.png not found');
543
- return;
544
- }
545
- const data = fs.readFileSync(pngPath);
546
- const decoder = new ImageDecoder({
547
- data: bufferToArrayBuffer(data),
548
- type: 'image/png',
549
- });
550
- await decoder.completed;
551
- // Should be iterable
552
- const tracks = [...decoder.tracks];
553
- expect(tracks.length).toBe(decoder.tracks.length);
554
- decoder.close();
555
- });
556
- });
557
- });
558
- //# sourceMappingURL=ImageDecoder.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageDecoder.test.js","sourceRoot":"","sources":["../../src/__tests__/ImageDecoder.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Adapted WebCodecs ImageDecoder tests from WPT assets.
3
- *
4
- * Focuses on verifying JPEG EXIF orientation handling for both RGB and
5
- * 4:2:0 YUV inputs using the four-colors fixtures.
6
- */
7
- export {};
8
- //# sourceMappingURL=ImageDecoder.wpt.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageDecoder.wpt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ImageDecoder.wpt.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}