@browser-mc/webcodecs-avif 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +132 -23
- package/dist/index.js.map +1 -1
- package/package.json +14 -8
package/README.md
CHANGED
|
@@ -17,6 +17,8 @@ await fetch('/upload', {
|
|
|
17
17
|
});
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
`encodeImageToAvif` defaults to AV1 4:4:4 chroma (`chromaSubsampling: '444'`). Pass `chromaSubsampling: '420'` when smaller 4:2:0 output or broader baseline-style compatibility is preferred.
|
|
21
|
+
|
|
20
22
|
## Mux An Existing AV1 Still Frame
|
|
21
23
|
|
|
22
24
|
```ts
|
|
@@ -62,7 +64,7 @@ node packages/webcodecs-avif/test/encode-jpeg-to-avif.mjs
|
|
|
62
64
|
## Notes
|
|
63
65
|
|
|
64
66
|
- Requires WebCodecs for encoding/decoding.
|
|
65
|
-
- Alpha
|
|
67
|
+
- Alpha can be kept with `alpha: 'keep'`, which writes an auxiliary alpha AVIF item.
|
|
66
68
|
- The muxer writes a minimal still-image AVIF and does not preserve arbitrary source AVIF boxes.
|
|
67
|
-
- `av1C
|
|
69
|
+
- `av1C` and `pixi` are derived from the AV1 Sequence Header OBU. `colr` uses source `VideoFrame.colorSpace` metadata when available, then falls back to the AV1 Sequence Header. Profile compatibility brands are emitted only when the encoded image meets the matching AVIF profile constraints.
|
|
68
70
|
- Container-specific mux helpers live in `@browser-mc/media-container`; this package re-exports the AVIF helpers for convenience.
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC5B,CAAC;AAMF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAIxI;AAyKD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpI;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBlF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAE3E"}
|
package/dist/index.js
CHANGED
|
@@ -4,12 +4,29 @@ export { findSequenceHeaderObu, makeAv1Config, muxStillAvif, } from '@browser-mc
|
|
|
4
4
|
export async function encodeImageToAv1(source, options = {}) {
|
|
5
5
|
assertWebCodecs();
|
|
6
6
|
if (options.alpha === 'keep')
|
|
7
|
-
|
|
7
|
+
return encodeImageToAv1WithAlpha(source, options);
|
|
8
|
+
return encodeImageToAv1Color(source, options);
|
|
9
|
+
}
|
|
10
|
+
async function encodeImageToAv1WithAlpha(source, options) {
|
|
11
|
+
const alphaSource = extractAlphaCanvas(source, options);
|
|
12
|
+
const [color, alpha] = await Promise.all([
|
|
13
|
+
encodeImageToAv1Color(source, { ...options, alpha: 'discard' }),
|
|
14
|
+
encodeImageToAv1Color(alphaSource, {
|
|
15
|
+
...options,
|
|
16
|
+
alpha: 'discard',
|
|
17
|
+
codec: options.codec ?? codecForSubsampling(options.chromaSubsampling ?? '444', 8),
|
|
18
|
+
bitrate: options.bitrate ?? alphaBitrate(source, options),
|
|
19
|
+
}),
|
|
20
|
+
]);
|
|
21
|
+
return { ...color, alpha };
|
|
22
|
+
}
|
|
23
|
+
async function encodeImageToAv1Color(source, options = {}) {
|
|
8
24
|
const width = options.width ?? sourceWidth(source);
|
|
9
25
|
const height = options.height ?? sourceHeight(source);
|
|
10
|
-
const codec = options.codec ??
|
|
26
|
+
const codec = options.codec ?? preferredCodecForSource(source, options.chromaSubsampling);
|
|
11
27
|
const bitrate = options.bitrate ?? Math.max(80_000, Math.round(width * height * (options.quality ?? 0.8) * 0.7));
|
|
12
|
-
const
|
|
28
|
+
const colorSpace = source instanceof VideoFrame ? source.colorSpace.toJSON() : undefined;
|
|
29
|
+
const encoderConfig = {
|
|
13
30
|
codec,
|
|
14
31
|
width,
|
|
15
32
|
height,
|
|
@@ -17,12 +34,68 @@ export async function encodeImageToAv1(source, options = {}) {
|
|
|
17
34
|
framerate: 1,
|
|
18
35
|
alpha: options.alpha ?? 'discard',
|
|
19
36
|
latencyMode: 'quality',
|
|
20
|
-
}
|
|
37
|
+
};
|
|
38
|
+
const support = await supportedEncoderConfig(encoderConfig, options.codec === undefined && codec.endsWith('.10'));
|
|
21
39
|
if (!support.supported)
|
|
22
40
|
throw new Error(`VideoEncoder does not support ${codec}`);
|
|
23
41
|
const config = support.config;
|
|
24
42
|
if (!config)
|
|
25
43
|
throw new Error(`VideoEncoder did not return a normalized config for ${codec}`);
|
|
44
|
+
let shouldCloseFrame = false;
|
|
45
|
+
const frame = source instanceof VideoFrame ? source : makeOwnedFrameFromCanvasSource(source);
|
|
46
|
+
let metadataConfig;
|
|
47
|
+
let chunks = [];
|
|
48
|
+
try {
|
|
49
|
+
try {
|
|
50
|
+
({ chunks, metadataConfig } = await encodeFrame(frame, config));
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (!(source instanceof VideoFrame) || !config.codec.endsWith('.08') || !isHighBitdepthOrHdrFrame(source))
|
|
54
|
+
throw error;
|
|
55
|
+
const fallbackFrame = makeCanvasSdrFrame(source, width, height);
|
|
56
|
+
try {
|
|
57
|
+
({ chunks, metadataConfig } = await encodeFrame(fallbackFrame, config));
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
fallbackFrame.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
if (shouldCloseFrame)
|
|
66
|
+
frame.close();
|
|
67
|
+
}
|
|
68
|
+
function makeOwnedFrameFromCanvasSource(canvasSource) {
|
|
69
|
+
shouldCloseFrame = true;
|
|
70
|
+
return makeFrameFromCanvasSource(canvasSource);
|
|
71
|
+
}
|
|
72
|
+
const chunk = concat(chunks);
|
|
73
|
+
const decoderConfig = {
|
|
74
|
+
...(metadataConfig ?? { codec, codedWidth: width, codedHeight: height, description: options.av1Config }),
|
|
75
|
+
colorSpace,
|
|
76
|
+
};
|
|
77
|
+
const sequenceHeaderObu = findSequenceHeaderObu(chunk);
|
|
78
|
+
if (!sequenceHeaderObu)
|
|
79
|
+
throw new Error('Encoded AV1 chunk does not contain a Sequence Header OBU');
|
|
80
|
+
const generatedAv1Config = makeAv1Config(config.codec, sequenceHeaderObu);
|
|
81
|
+
if (options.av1Config && !bytesEqual(options.av1Config, generatedAv1Config)) {
|
|
82
|
+
throw new Error('Provided av1Config does not match the encoded AV1 Sequence Header OBU');
|
|
83
|
+
}
|
|
84
|
+
const av1Config = generatedAv1Config;
|
|
85
|
+
return { chunk, decoderConfig, av1Config, width, height };
|
|
86
|
+
}
|
|
87
|
+
function makeFrameFromCanvasSource(canvasSource) {
|
|
88
|
+
return new VideoFrame(canvasSource, { timestamp: 0, duration: 1_000_000 });
|
|
89
|
+
}
|
|
90
|
+
function makeCanvasSdrFrame(source, width, height) {
|
|
91
|
+
const canvas = new OffscreenCanvas(width, height);
|
|
92
|
+
const context = canvas.getContext('2d', { colorSpace: 'srgb' });
|
|
93
|
+
if (!context)
|
|
94
|
+
throw new Error('Could not create 2D canvas context');
|
|
95
|
+
context.drawImage(source, 0, 0, width, height);
|
|
96
|
+
return makeFrameFromCanvasSource(canvas);
|
|
97
|
+
}
|
|
98
|
+
async function encodeFrame(frame, config) {
|
|
26
99
|
let metadataConfig;
|
|
27
100
|
const chunks = [];
|
|
28
101
|
let rejectEncoderError = () => { };
|
|
@@ -37,33 +110,69 @@ export async function encodeImageToAv1(source, options = {}) {
|
|
|
37
110
|
metadataConfig = metadata.decoderConfig;
|
|
38
111
|
},
|
|
39
112
|
});
|
|
40
|
-
let shouldCloseFrame = false;
|
|
41
|
-
const frame = source instanceof VideoFrame ? source : makeFrameFromCanvasSource(source);
|
|
42
113
|
try {
|
|
43
114
|
encoder.configure(config);
|
|
44
115
|
encoder.encode(frame, { keyFrame: true });
|
|
45
116
|
await Promise.race([encoder.flush(), encoderError]);
|
|
46
117
|
}
|
|
47
118
|
finally {
|
|
48
|
-
encoder.
|
|
49
|
-
|
|
50
|
-
frame.close();
|
|
119
|
+
if (encoder.state !== 'closed')
|
|
120
|
+
encoder.close();
|
|
51
121
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
60
|
-
throw new Error('
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
122
|
+
return { chunks, metadataConfig };
|
|
123
|
+
}
|
|
124
|
+
function extractAlphaCanvas(source, options) {
|
|
125
|
+
const width = options.width ?? sourceWidth(source);
|
|
126
|
+
const height = options.height ?? sourceHeight(source);
|
|
127
|
+
const canvas = new OffscreenCanvas(width, height);
|
|
128
|
+
const context = canvas.getContext('2d');
|
|
129
|
+
if (!context)
|
|
130
|
+
throw new Error('Could not create 2D canvas context');
|
|
131
|
+
context.drawImage(source, 0, 0, width, height);
|
|
132
|
+
const image = context.getImageData(0, 0, width, height);
|
|
133
|
+
for (let offset = 0; offset < image.data.length; offset += 4) {
|
|
134
|
+
const alpha = image.data[offset + 3];
|
|
135
|
+
image.data[offset] = alpha;
|
|
136
|
+
image.data[offset + 1] = alpha;
|
|
137
|
+
image.data[offset + 2] = alpha;
|
|
138
|
+
image.data[offset + 3] = 255;
|
|
64
139
|
}
|
|
65
|
-
|
|
66
|
-
return
|
|
140
|
+
context.putImageData(image, 0, 0);
|
|
141
|
+
return canvas;
|
|
142
|
+
}
|
|
143
|
+
function alphaBitrate(source, options) {
|
|
144
|
+
const width = options.width ?? sourceWidth(source);
|
|
145
|
+
const height = options.height ?? sourceHeight(source);
|
|
146
|
+
return Math.max(40_000, Math.round(width * height * (options.quality ?? 0.8) * 0.35));
|
|
147
|
+
}
|
|
148
|
+
async function supportedEncoderConfig(config, allowEightBitFallback) {
|
|
149
|
+
const support = await VideoEncoder.isConfigSupported(config);
|
|
150
|
+
if (support.supported || !allowEightBitFallback)
|
|
151
|
+
return support;
|
|
152
|
+
return VideoEncoder.isConfigSupported({
|
|
153
|
+
...config,
|
|
154
|
+
codec: config.codec.replace(/\.10(?=$|[.])/u, '.08'),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function preferredCodecForSource(source, chromaSubsampling) {
|
|
158
|
+
const subsampling = chromaSubsampling ?? '444';
|
|
159
|
+
if (!(source instanceof VideoFrame))
|
|
160
|
+
return codecForSubsampling(subsampling, 8);
|
|
161
|
+
return codecForSubsampling(subsampling, isHighBitdepthOrHdrFrame(source) ? 10 : 8);
|
|
162
|
+
}
|
|
163
|
+
function codecForSubsampling(chromaSubsampling, bitDepth) {
|
|
164
|
+
const profile = chromaSubsampling === '444' ? 1 : 0;
|
|
165
|
+
return `av01.${profile}.08M.${String(bitDepth).padStart(2, '0')}`;
|
|
166
|
+
}
|
|
167
|
+
function isHighBitdepthOrHdrFrame(source) {
|
|
168
|
+
const colorSpace = source.colorSpace;
|
|
169
|
+
const format = source.format ?? '';
|
|
170
|
+
const transfer = String(colorSpace.transfer ?? '');
|
|
171
|
+
const primaries = String(colorSpace.primaries ?? '');
|
|
172
|
+
const usesHdrTransfer = transfer === 'pq' || transfer === 'hlg' || transfer === 'smpte2084' || transfer === 'arib-std-b67';
|
|
173
|
+
const usesHdrPrimaries = primaries === 'bt2020';
|
|
174
|
+
const usesHighBitdepthFormat = /(?:P010|P012|P016|I\d+P1[026]|10|12|16)/.test(format);
|
|
175
|
+
return usesHdrTransfer || usesHdrPrimaries || usesHighBitdepthFormat;
|
|
67
176
|
}
|
|
68
177
|
export async function encodeImageToAvif(source, options = {}) {
|
|
69
178
|
return muxStillAvif(await encodeImageToAv1(source, options));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GAEb,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GAEb,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,6BAA6B,CAAC;AAiBrC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAsC,EAAE,UAA6B,EAAE;IAC5G,eAAe,EAAE,CAAC;IAClB,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChF,OAAO,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,MAAsC,EAAE,OAA0B;IACzG,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvC,qBAAqB,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC/D,qBAAqB,CAAC,WAAW,EAAE;YACjC,GAAG,OAAO;YACV,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,iBAAiB,IAAI,KAAK,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;SAC1D,CAAC;KACH,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAsC,EAAE,UAA6B,EAAE;IAC1G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACjH,MAAM,UAAU,GAAG,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzF,MAAM,aAAa,GAAuB;QACxC,KAAK;QACL,KAAK;QACL,MAAM;QACN,OAAO;QACP,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;QACjC,WAAW,EAAE,SAAS;KACvB,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAClH,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,KAAK,EAAE,CAAC,CAAC;IAE7F,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAC7F,IAAI,cAA8C,CAAC;IACnD,IAAI,MAAM,GAAiB,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,CAAC;YACH,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;gBAAE,MAAM,KAAK,CAAC;YACvH,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC;gBACH,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1E,CAAC;oBAAS,CAAC;gBACT,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,gBAAgB;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,SAAS,8BAA8B,CAAC,YAA+B;QACrE,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,aAAa,GAAmC;QACpD,GAAG,CAAC,cAAc,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;QACxG,UAAU;KACX,CAAC;IACF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACpG,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,SAAS,GAAG,kBAAkB,CAAC;IACrC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,yBAAyB,CAAC,YAA+B;IAChE,OAAO,IAAI,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAyB,EAAE,KAAa,EAAE,MAAc;IAClF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAiB,EAAE,MAA0B;IACtE,IAAI,cAA8C,CAAC;IACnD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,kBAAkB,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAC/B,KAAK,EAAE,kBAAkB;QACzB,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,QAAQ,EAAE,aAAa;gBAAE,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC;QACvE,CAAC;KACF,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAsC,EAAE,OAA0B;IAC5F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACxD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,MAAsC,EAAE,OAA0B;IACtF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,MAA0B,EAAE,qBAA8B;IAC9F,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,qBAAqB;QAAE,OAAO,OAAO,CAAC;IAChE,OAAO,YAAY,CAAC,iBAAiB,CAAC;QACpC,GAAG,MAAM;QACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;KACrD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAsC,EAAE,iBAAyD;IAChI,MAAM,WAAW,GAAG,iBAAiB,IAAI,KAAK,CAAC;IAC/C,IAAI,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC;QAAE,OAAO,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,OAAO,mBAAmB,CAAC,WAAW,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,mBAAmB,CAAC,iBAAsE,EAAE,QAAgB;IACnH,MAAM,OAAO,GAAG,iBAAiB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAkB;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,cAAc,CAAC;IAC3H,MAAM,gBAAgB,GAAG,SAAS,KAAK,QAAQ,CAAC;IAChD,MAAM,sBAAsB,GAAG,yCAAyC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtF,OAAO,eAAe,IAAI,gBAAgB,IAAI,sBAAsB,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAsC,EAAE,UAA6B,EAAE;IAC7G,OAAO,YAAY,CAAC,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,eAAe,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC;YACnC,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,OAAO,CAAC,KAAK;SACpB,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAU;IACnD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACpH,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAsC;IACzD,IAAI,MAAM,YAAY,UAAU;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7D,IAAI,YAAY,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IACrD,IAAI,cAAc,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACzD,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,MAAsC;IAC1D,IAAI,MAAM,YAAY,UAAU;QAAE,OAAO,MAAM,CAAC,aAAa,CAAC;IAC9D,IAAI,aAAa,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC;IACvD,IAAI,eAAe,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,aAAa,CAAC;IAC3D,IAAI,QAAQ,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@browser-mc/webcodecs-avif",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/tamaina/browser-media-converter",
|
|
10
|
+
"directory": "packages/webcodecs-avif"
|
|
11
|
+
},
|
|
7
12
|
"exports": {
|
|
8
13
|
".": {
|
|
9
14
|
"types": "./dist/index.d.ts",
|
|
@@ -11,8 +16,8 @@
|
|
|
11
16
|
}
|
|
12
17
|
},
|
|
13
18
|
"dependencies": {
|
|
14
|
-
"@browser-mc/
|
|
15
|
-
"@browser-mc/
|
|
19
|
+
"@browser-mc/media-container": "^0.2.0",
|
|
20
|
+
"@browser-mc/binary": "^0.0.1"
|
|
16
21
|
},
|
|
17
22
|
"files": [
|
|
18
23
|
"dist",
|
|
@@ -22,10 +27,11 @@
|
|
|
22
27
|
"access": "public"
|
|
23
28
|
},
|
|
24
29
|
"scripts": {
|
|
25
|
-
"
|
|
26
|
-
"build": "tsc -p tsconfig.json",
|
|
27
|
-
"
|
|
28
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
29
|
-
"test": "pnpm build"
|
|
30
|
+
"build": "pnpm --filter @browser-mc/webcodecs-avif... build:package",
|
|
31
|
+
"build:package": "tsc -p tsconfig.json",
|
|
32
|
+
"typecheck": "pnpm --filter @browser-mc/webcodecs-avif... typecheck:package",
|
|
33
|
+
"typecheck:package": "tsc -p tsconfig.json --noEmit",
|
|
34
|
+
"test": "pnpm build && pnpm test:package",
|
|
35
|
+
"test:package": "node test/encode-jpeg-to-avif.mjs"
|
|
30
36
|
}
|
|
31
37
|
}
|