webcodecs-node 0.5.0 → 0.5.1
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.
- package/package.json +1 -1
- package/dist/AudioData.d.ts +0 -6
- package/dist/AudioData.d.ts.map +0 -1
- package/dist/AudioData.js +0 -6
- package/dist/AudioData.js.map +0 -1
- package/dist/AudioDecoder.d.ts +0 -6
- package/dist/AudioDecoder.d.ts.map +0 -1
- package/dist/AudioDecoder.js +0 -6
- package/dist/AudioDecoder.js.map +0 -1
- package/dist/AudioEncoder.d.ts +0 -6
- package/dist/AudioEncoder.d.ts.map +0 -1
- package/dist/AudioEncoder.js +0 -6
- package/dist/AudioEncoder.js.map +0 -1
- package/dist/EncodedAudioChunk.d.ts +0 -6
- package/dist/EncodedAudioChunk.d.ts.map +0 -1
- package/dist/EncodedAudioChunk.js +0 -6
- package/dist/EncodedAudioChunk.js.map +0 -1
- package/dist/EncodedVideoChunk.d.ts +0 -6
- package/dist/EncodedVideoChunk.d.ts.map +0 -1
- package/dist/EncodedVideoChunk.js +0 -6
- package/dist/EncodedVideoChunk.js.map +0 -1
- package/dist/FFmpegProcess.d.ts +0 -6
- package/dist/FFmpegProcess.d.ts.map +0 -1
- package/dist/FFmpegProcess.js +0 -6
- package/dist/FFmpegProcess.js.map +0 -1
- package/dist/HardwareAcceleration.d.ts +0 -6
- package/dist/HardwareAcceleration.d.ts.map +0 -1
- package/dist/HardwareAcceleration.js +0 -6
- package/dist/HardwareAcceleration.js.map +0 -1
- package/dist/ImageDecoder.d.ts +0 -6
- package/dist/ImageDecoder.d.ts.map +0 -1
- package/dist/ImageDecoder.js +0 -6
- package/dist/ImageDecoder.js.map +0 -1
- package/dist/Logger.d.ts +0 -6
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -6
- package/dist/Logger.js.map +0 -1
- package/dist/MediaCapabilities.d.ts +0 -9
- package/dist/MediaCapabilities.d.ts.map +0 -1
- package/dist/MediaCapabilities.js +0 -8
- package/dist/MediaCapabilities.js.map +0 -1
- package/dist/VideoDecoder.d.ts +0 -6
- package/dist/VideoDecoder.d.ts.map +0 -1
- package/dist/VideoDecoder.js +0 -6
- package/dist/VideoDecoder.js.map +0 -1
- package/dist/VideoEncoder.d.ts +0 -6
- package/dist/VideoEncoder.d.ts.map +0 -1
- package/dist/VideoEncoder.js +0 -6
- package/dist/VideoEncoder.js.map +0 -1
- package/dist/VideoFrame.d.ts +0 -10
- package/dist/VideoFrame.d.ts.map +0 -1
- package/dist/VideoFrame.js +0 -9
- package/dist/VideoFrame.js.map +0 -1
- package/dist/__tests__/AudioData.test.d.ts +0 -5
- package/dist/__tests__/AudioData.test.d.ts.map +0 -1
- package/dist/__tests__/AudioData.test.js +0 -180
- package/dist/__tests__/AudioData.test.js.map +0 -1
- package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
- package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioDecoder.test.js +0 -733
- package/dist/__tests__/AudioDecoder.test.js.map +0 -1
- package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
- package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/AudioEncoder.test.js +0 -247
- package/dist/__tests__/AudioEncoder.test.js.map +0 -1
- package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
- package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
- package/dist/__tests__/EncodedChunks.test.js +0 -100
- package/dist/__tests__/EncodedChunks.test.js.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
- package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
- package/dist/__tests__/HardwareAcceleration.test.js +0 -85
- package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
- package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.test.js +0 -558
- package/dist/__tests__/ImageDecoder.test.js.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
- package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
- package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
- package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
- package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
- package/dist/__tests__/MediaCapabilities.test.js +0 -346
- package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvDecoder.test.js +0 -206
- package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
- package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/NodeAvEncoder.test.js +0 -176
- package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
- package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoDecoder.test.js +0 -675
- package/dist/__tests__/VideoDecoder.test.js.map +0 -1
- package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
- package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
- package/dist/__tests__/VideoEncoder.test.js +0 -468
- package/dist/__tests__/VideoEncoder.test.js.map +0 -1
- package/dist/__tests__/VideoFrame.test.d.ts +0 -5
- package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
- package/dist/__tests__/VideoFrame.test.js +0 -246
- package/dist/__tests__/VideoFrame.test.js.map +0 -1
- package/dist/__tests__/aac-utils.test.d.ts +0 -2
- package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
- package/dist/__tests__/aac-utils.test.js +0 -37
- package/dist/__tests__/aac-utils.test.js.map +0 -1
- package/dist/__tests__/avc-utils.test.d.ts +0 -2
- package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/avc-utils.test.js +0 -63
- package/dist/__tests__/avc-utils.test.js.map +0 -1
- package/dist/__tests__/hevc-utils.test.d.ts +0 -2
- package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
- package/dist/__tests__/hevc-utils.test.js +0 -78
- package/dist/__tests__/hevc-utils.test.js.map +0 -1
- package/dist/demos/demo-conversion.d.ts +0 -13
- package/dist/demos/demo-conversion.d.ts.map +0 -1
- package/dist/demos/demo-conversion.js +0 -301
- package/dist/demos/demo-conversion.js.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
- package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
- package/dist/demos/demo-hwaccel-conversion.js +0 -161
- package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
- package/dist/demos/demo-mediabunny.d.ts +0 -7
- package/dist/demos/demo-mediabunny.d.ts.map +0 -1
- package/dist/demos/demo-mediabunny.js +0 -78
- package/dist/demos/demo-mediabunny.js.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
- package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
- package/dist/ffmpeg/FFmpegProcess.js +0 -543
- package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
- package/dist/ffmpeg/audio-codecs.d.ts +0 -59
- package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
- package/dist/ffmpeg/audio-codecs.js +0 -99
- package/dist/ffmpeg/audio-codecs.js.map +0 -1
- package/dist/ffmpeg/formats.d.ts +0 -42
- package/dist/ffmpeg/formats.d.ts.map +0 -1
- package/dist/ffmpeg/formats.js +0 -147
- package/dist/ffmpeg/formats.js.map +0 -1
- package/dist/ffmpeg/index.d.ts +0 -10
- package/dist/ffmpeg/index.d.ts.map +0 -1
- package/dist/ffmpeg/index.js +0 -13
- package/dist/ffmpeg/index.js.map +0 -1
- package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
- package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/annexb.js +0 -201
- package/dist/ffmpeg/parsers/annexb.js.map +0 -1
- package/dist/ffmpeg/parsers/index.d.ts +0 -6
- package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/index.js +0 -8
- package/dist/ffmpeg/parsers/index.js.map +0 -1
- package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
- package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
- package/dist/ffmpeg/parsers/ivf.js +0 -109
- package/dist/ffmpeg/parsers/ivf.js.map +0 -1
- package/dist/ffmpeg/types.d.ts +0 -85
- package/dist/ffmpeg/types.d.ts.map +0 -1
- package/dist/ffmpeg/types.js +0 -8
- package/dist/ffmpeg/types.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -24
- package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioDecoder.js +0 -126
- package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -44
- package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegAudioEncoder.js +0 -221
- package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -25
- package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoDecoder.js +0 -122
- package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -49
- package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
- package/dist/mediabunny/FFmpegVideoEncoder.js +0 -264
- package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
- package/dist/mediabunny/index.d.ts +0 -21
- package/dist/mediabunny/index.d.ts.map +0 -1
- package/dist/mediabunny/index.js +0 -33
- package/dist/mediabunny/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageDecoder.wpt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ImageDecoder.wpt.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|