@editframe/assets 0.49.5 → 0.49.7
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/dist/Probe.cjs +114 -18
- package/dist/Probe.cjs.map +1 -1
- package/dist/Probe.d.cts +34 -1
- package/dist/Probe.d.ts +34 -1
- package/dist/Probe.js +114 -18
- package/dist/Probe.js.map +1 -1
- package/dist/generateFragmentIndex.cjs +1 -1
- package/dist/generateFragmentIndex.js +1 -1
- package/dist/generateWebmSegmentIndex.cjs +100 -20
- package/dist/generateWebmSegmentIndex.cjs.map +1 -1
- package/dist/generateWebmSegmentIndex.js +100 -20
- package/dist/generateWebmSegmentIndex.js.map +1 -1
- package/dist/idempotentTask.cjs +1 -1
- package/dist/idempotentTask.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/tasks/generateScrubTrack.cjs +24 -27
- package/dist/tasks/generateScrubTrack.cjs.map +1 -1
- package/dist/tasks/generateScrubTrack.js +26 -29
- package/dist/tasks/generateScrubTrack.js.map +1 -1
- package/dist/tasks/generateTrack.cjs +26 -8
- package/dist/tasks/generateTrack.cjs.map +1 -1
- package/dist/tasks/generateTrack.js +27 -10
- package/dist/tasks/generateTrack.js.map +1 -1
- package/dist/tasks/generateTrackFragmentIndex.cjs +51 -29
- package/dist/tasks/generateTrackFragmentIndex.cjs.map +1 -1
- package/dist/tasks/generateTrackFragmentIndex.d.cts +8 -1
- package/dist/tasks/generateTrackFragmentIndex.d.ts +8 -1
- package/dist/tasks/generateTrackFragmentIndex.js +51 -29
- package/dist/tasks/generateTrackFragmentIndex.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_Probe = require("./Probe.cjs");
|
|
3
3
|
let node_fs = require("node:fs");
|
|
4
|
+
let node_fs_promises = require("node:fs/promises");
|
|
4
5
|
let debug = require("debug");
|
|
5
6
|
debug = require_runtime.__toESM(debug);
|
|
6
7
|
let node_stream = require("node:stream");
|
|
7
8
|
let node_stream_promises = require("node:stream/promises");
|
|
8
|
-
let node_fs_promises = require("node:fs/promises");
|
|
9
9
|
let node_os = require("node:os");
|
|
10
10
|
let node_path = require("node:path");
|
|
11
11
|
let node_crypto = require("node:crypto");
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { PacketProbe } from "./Probe.js";
|
|
2
2
|
import { createWriteStream } from "node:fs";
|
|
3
|
+
import { unlink } from "node:fs/promises";
|
|
3
4
|
import debug from "debug";
|
|
4
5
|
import { Transform, Writable } from "node:stream";
|
|
5
6
|
import { pipeline } from "node:stream/promises";
|
|
6
|
-
import { unlink } from "node:fs/promises";
|
|
7
7
|
import { tmpdir } from "node:os";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { randomBytes } from "node:crypto";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_Probe = require("./Probe.cjs");
|
|
3
|
+
let node_fs_promises = require("node:fs/promises");
|
|
3
4
|
let debug = require("debug");
|
|
4
5
|
debug = require_runtime.__toESM(debug);
|
|
5
|
-
let node_fs_promises = require("node:fs/promises");
|
|
6
6
|
//#region src/generateWebmSegmentIndex.ts
|
|
7
7
|
/**
|
|
8
8
|
* WebM / Matroska segment index generator.
|
|
@@ -183,11 +183,9 @@ function parseWebmStructure(buf) {
|
|
|
183
183
|
* More reliable than parsing SimpleBlock flags in-process for large files.
|
|
184
184
|
*/
|
|
185
185
|
async function annotateKeyframes(clusters, absolutePath) {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
cluster.hasKeyframe = keyframePositions.some((pos) => pos >= cluster.offset && pos < clusterEnd);
|
|
190
|
-
}
|
|
186
|
+
const probe = await require_Probe.PacketProbe.probePath(absolutePath);
|
|
187
|
+
const keyframeTimesMs = new Set(probe.packets.filter((p) => p.flags?.includes("K") && p.pts_time !== void 0).map((p) => Math.round(parseFloat(String(p.pts_time)) * 1e3)));
|
|
188
|
+
for (const cluster of clusters) cluster.hasKeyframe = keyframeTimesMs.has(cluster.timestampMs);
|
|
191
189
|
}
|
|
192
190
|
function buildSegments(clusters, timescale, totalDurationMs) {
|
|
193
191
|
const segments = [];
|
|
@@ -243,8 +241,18 @@ async function generateWebmSegmentIndex(absolutePath, startTimeOffsetMs) {
|
|
|
243
241
|
const lastCluster = clusters[clusters.length - 1];
|
|
244
242
|
let finalDurationMs = lastCluster.timestampMs + lastCluster.size / 4096;
|
|
245
243
|
try {
|
|
246
|
-
const
|
|
244
|
+
const probe = await require_Probe.PacketProbe.probePath(absolutePath);
|
|
245
|
+
const videoStream = probe.data?.streams?.find((s) => s.codec_type === "video");
|
|
247
246
|
if (videoStream?.duration) finalDurationMs = Math.round(parseFloat(videoStream.duration) * 1e3);
|
|
247
|
+
else {
|
|
248
|
+
const videoPackets = probe.packets?.filter((p) => p.stream_index === 0);
|
|
249
|
+
if (videoPackets && videoPackets.length > 0) {
|
|
250
|
+
const lastPkt = videoPackets[videoPackets.length - 1];
|
|
251
|
+
const ptsMs = Math.round(parseFloat(String(lastPkt.pts_time ?? 0)) * 1e3);
|
|
252
|
+
const durMs = Math.round(parseFloat(String(lastPkt.duration_time ?? 0)) * 1e3);
|
|
253
|
+
if (ptsMs + durMs > 0) finalDurationMs = ptsMs + durMs;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
248
256
|
} catch {}
|
|
249
257
|
log(`Total duration: ${finalDurationMs}ms`);
|
|
250
258
|
const segments = buildSegments(clusters, timescale, finalDurationMs);
|
|
@@ -278,8 +286,83 @@ async function generateWebmSegmentIndex(absolutePath, startTimeOffsetMs) {
|
|
|
278
286
|
return { 1: trackIndex };
|
|
279
287
|
}
|
|
280
288
|
const ID_SEEKHEAD = 290298740;
|
|
289
|
+
const ID_TRACKS = 374648427;
|
|
290
|
+
const ID_TRACK_ENTRY = 174;
|
|
291
|
+
const ID_VIDEO = 224;
|
|
292
|
+
const ID_COLOUR = 21936;
|
|
281
293
|
const EBML_VOID_ID = 236;
|
|
282
294
|
/**
|
|
295
|
+
* Encode a Void element header (id + size VINT) such that the entire
|
|
296
|
+
* element occupies exactly `totalBytes` bytes. Returns the [id, ...vintBytes]
|
|
297
|
+
* prefix; the caller fills the remaining `totalBytes - prefix.length` with zeros.
|
|
298
|
+
*/
|
|
299
|
+
function encodeVoidHeader(totalBytes) {
|
|
300
|
+
const c1 = totalBytes - 2;
|
|
301
|
+
if (c1 >= 0 && c1 <= 126) return [EBML_VOID_ID, 128 | c1];
|
|
302
|
+
const c2 = totalBytes - 3;
|
|
303
|
+
if (c2 >= 0 && c2 <= 16382) return [
|
|
304
|
+
EBML_VOID_ID,
|
|
305
|
+
64 | c2 >> 8,
|
|
306
|
+
c2 & 255
|
|
307
|
+
];
|
|
308
|
+
const c3 = totalBytes - 4;
|
|
309
|
+
return [
|
|
310
|
+
EBML_VOID_ID,
|
|
311
|
+
32 | c3 >> 16,
|
|
312
|
+
c3 >> 8 & 255,
|
|
313
|
+
c3 & 255
|
|
314
|
+
];
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Replace the Colour element inside the video TrackEntry with an EBML Void
|
|
318
|
+
* of identical byte length. We do this because ffmpeg's matroska muxer always
|
|
319
|
+
* emits a Colour element with `MatrixCoefficients=bt470bg, Range=full` derived
|
|
320
|
+
* from `format=yuva420p` filter output, but the actual VP9 bitstream encodes
|
|
321
|
+
* `color_space=BT.601` — the mismatch causes Chrome's WebCodecs VideoDecoder
|
|
322
|
+
* to silently drop every delta frame after the keyframe (issue surfaces as
|
|
323
|
+
* "only 1 sample emitted from a 49-frame segment"). With no Colour element
|
|
324
|
+
* mediabunny passes `colorSpace: undefined` to the decoder and Chrome decodes
|
|
325
|
+
* normally.
|
|
326
|
+
*/
|
|
327
|
+
function stripColourElement(buf, tracksStart, tracksEnd) {
|
|
328
|
+
let pos = tracksStart;
|
|
329
|
+
while (pos < tracksEnd) {
|
|
330
|
+
const { id: childId, width: childIdW } = readElementId(buf, pos);
|
|
331
|
+
const { value: childSize, width: childSizeW } = readVintSize(buf, pos + childIdW);
|
|
332
|
+
if (childSize === null) return;
|
|
333
|
+
const childContentStart = pos + childIdW + childSizeW;
|
|
334
|
+
const childEnd = childContentStart + childSize;
|
|
335
|
+
if (childId === ID_TRACK_ENTRY) {
|
|
336
|
+
let tepos = childContentStart;
|
|
337
|
+
while (tepos < childEnd) {
|
|
338
|
+
const { id: teid, width: teidW } = readElementId(buf, tepos);
|
|
339
|
+
const { value: tesize, width: tesizeW } = readVintSize(buf, tepos + teidW);
|
|
340
|
+
if (tesize === null) break;
|
|
341
|
+
const teContentStart = tepos + teidW + tesizeW;
|
|
342
|
+
const teEnd = teContentStart + tesize;
|
|
343
|
+
if (teid === ID_VIDEO) {
|
|
344
|
+
let vpos = teContentStart;
|
|
345
|
+
while (vpos < teEnd) {
|
|
346
|
+
const { id: vid, width: vidW } = readElementId(buf, vpos);
|
|
347
|
+
const { value: vsize, width: vsizeW } = readVintSize(buf, vpos + vidW);
|
|
348
|
+
if (vsize === null) break;
|
|
349
|
+
const totalElementSize = vidW + vsizeW + vsize;
|
|
350
|
+
if (vid === ID_COLOUR) {
|
|
351
|
+
const header = encodeVoidHeader(totalElementSize);
|
|
352
|
+
for (let i = 0; i < header.length; i++) buf[vpos + i] = header[i];
|
|
353
|
+
buf.fill(0, vpos + header.length, vpos + totalElementSize);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
vpos += totalElementSize;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
tepos = teContentStart + tesize;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
pos = childContentStart + childSize;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
283
366
|
* Patch a WebM buffer in-place to make it safe for partial (segment-sliced) serving:
|
|
284
367
|
*
|
|
285
368
|
* 1. Segment-element size VINT → EBML unknown-size (0x01FFFFFFFFFFFFFF).
|
|
@@ -291,7 +374,10 @@ const EBML_VOID_ID = 236;
|
|
|
291
374
|
* falls off the end of the buffer, causing seek errors and de-sync. Replacing
|
|
292
375
|
* it with a Void element forces linear parsing: EBML → Info → Tracks → Clusters.
|
|
293
376
|
*
|
|
294
|
-
*
|
|
377
|
+
* 3. Colour element inside Video TrackEntry → EBML Void of the same byte length.
|
|
378
|
+
* See stripColourElement() for rationale.
|
|
379
|
+
*
|
|
380
|
+
* All patches are applied to a Buffer copy; the source file on disk is not modified.
|
|
295
381
|
*/
|
|
296
382
|
function patchWebmForSegmentedServing(buf) {
|
|
297
383
|
try {
|
|
@@ -322,18 +408,12 @@ function patchWebmForSegmentedServing(buf) {
|
|
|
322
408
|
if (childSize === null) break;
|
|
323
409
|
const totalElementSize = childIdWidth + childSizeWidth + childSize;
|
|
324
410
|
if (childId === ID_SEEKHEAD) {
|
|
325
|
-
const
|
|
326
|
-
let
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
voidContentSize >> 8 & 255,
|
|
332
|
-
voidContentSize & 255
|
|
333
|
-
];
|
|
334
|
-
buf[pos] = EBML_VOID_ID;
|
|
335
|
-
for (let i = 0; i < vintBytes.length; i++) buf[pos + 1 + i] = vintBytes[i];
|
|
336
|
-
buf.fill(0, pos + 1 + vintBytes.length, pos + totalElementSize);
|
|
411
|
+
const header = encodeVoidHeader(totalElementSize);
|
|
412
|
+
for (let i = 0; i < header.length; i++) buf[pos + i] = header[i];
|
|
413
|
+
buf.fill(0, pos + header.length, pos + totalElementSize);
|
|
414
|
+
} else if (childId === ID_TRACKS) {
|
|
415
|
+
const tracksStart = pos + childIdWidth + childSizeWidth;
|
|
416
|
+
stripColourElement(buf, tracksStart, tracksStart + childSize);
|
|
337
417
|
break;
|
|
338
418
|
}
|
|
339
419
|
pos += totalElementSize;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateWebmSegmentIndex.cjs","names":["PacketProbe"],"sources":["../src/generateWebmSegmentIndex.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"generateWebmSegmentIndex.cjs","names":["PacketProbe"],"sources":["../src/generateWebmSegmentIndex.ts"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PacketProbe } from "./Probe.js";
|
|
2
|
-
import debug from "debug";
|
|
3
2
|
import { readFile } from "node:fs/promises";
|
|
3
|
+
import debug from "debug";
|
|
4
4
|
//#region src/generateWebmSegmentIndex.ts
|
|
5
5
|
/**
|
|
6
6
|
* WebM / Matroska segment index generator.
|
|
@@ -181,11 +181,9 @@ function parseWebmStructure(buf) {
|
|
|
181
181
|
* More reliable than parsing SimpleBlock flags in-process for large files.
|
|
182
182
|
*/
|
|
183
183
|
async function annotateKeyframes(clusters, absolutePath) {
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
cluster.hasKeyframe = keyframePositions.some((pos) => pos >= cluster.offset && pos < clusterEnd);
|
|
188
|
-
}
|
|
184
|
+
const probe = await PacketProbe.probePath(absolutePath);
|
|
185
|
+
const keyframeTimesMs = new Set(probe.packets.filter((p) => p.flags?.includes("K") && p.pts_time !== void 0).map((p) => Math.round(parseFloat(String(p.pts_time)) * 1e3)));
|
|
186
|
+
for (const cluster of clusters) cluster.hasKeyframe = keyframeTimesMs.has(cluster.timestampMs);
|
|
189
187
|
}
|
|
190
188
|
function buildSegments(clusters, timescale, totalDurationMs) {
|
|
191
189
|
const segments = [];
|
|
@@ -241,8 +239,18 @@ async function generateWebmSegmentIndex(absolutePath, startTimeOffsetMs) {
|
|
|
241
239
|
const lastCluster = clusters[clusters.length - 1];
|
|
242
240
|
let finalDurationMs = lastCluster.timestampMs + lastCluster.size / 4096;
|
|
243
241
|
try {
|
|
244
|
-
const
|
|
242
|
+
const probe = await PacketProbe.probePath(absolutePath);
|
|
243
|
+
const videoStream = probe.data?.streams?.find((s) => s.codec_type === "video");
|
|
245
244
|
if (videoStream?.duration) finalDurationMs = Math.round(parseFloat(videoStream.duration) * 1e3);
|
|
245
|
+
else {
|
|
246
|
+
const videoPackets = probe.packets?.filter((p) => p.stream_index === 0);
|
|
247
|
+
if (videoPackets && videoPackets.length > 0) {
|
|
248
|
+
const lastPkt = videoPackets[videoPackets.length - 1];
|
|
249
|
+
const ptsMs = Math.round(parseFloat(String(lastPkt.pts_time ?? 0)) * 1e3);
|
|
250
|
+
const durMs = Math.round(parseFloat(String(lastPkt.duration_time ?? 0)) * 1e3);
|
|
251
|
+
if (ptsMs + durMs > 0) finalDurationMs = ptsMs + durMs;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
246
254
|
} catch {}
|
|
247
255
|
log(`Total duration: ${finalDurationMs}ms`);
|
|
248
256
|
const segments = buildSegments(clusters, timescale, finalDurationMs);
|
|
@@ -276,8 +284,83 @@ async function generateWebmSegmentIndex(absolutePath, startTimeOffsetMs) {
|
|
|
276
284
|
return { 1: trackIndex };
|
|
277
285
|
}
|
|
278
286
|
const ID_SEEKHEAD = 290298740;
|
|
287
|
+
const ID_TRACKS = 374648427;
|
|
288
|
+
const ID_TRACK_ENTRY = 174;
|
|
289
|
+
const ID_VIDEO = 224;
|
|
290
|
+
const ID_COLOUR = 21936;
|
|
279
291
|
const EBML_VOID_ID = 236;
|
|
280
292
|
/**
|
|
293
|
+
* Encode a Void element header (id + size VINT) such that the entire
|
|
294
|
+
* element occupies exactly `totalBytes` bytes. Returns the [id, ...vintBytes]
|
|
295
|
+
* prefix; the caller fills the remaining `totalBytes - prefix.length` with zeros.
|
|
296
|
+
*/
|
|
297
|
+
function encodeVoidHeader(totalBytes) {
|
|
298
|
+
const c1 = totalBytes - 2;
|
|
299
|
+
if (c1 >= 0 && c1 <= 126) return [EBML_VOID_ID, 128 | c1];
|
|
300
|
+
const c2 = totalBytes - 3;
|
|
301
|
+
if (c2 >= 0 && c2 <= 16382) return [
|
|
302
|
+
EBML_VOID_ID,
|
|
303
|
+
64 | c2 >> 8,
|
|
304
|
+
c2 & 255
|
|
305
|
+
];
|
|
306
|
+
const c3 = totalBytes - 4;
|
|
307
|
+
return [
|
|
308
|
+
EBML_VOID_ID,
|
|
309
|
+
32 | c3 >> 16,
|
|
310
|
+
c3 >> 8 & 255,
|
|
311
|
+
c3 & 255
|
|
312
|
+
];
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Replace the Colour element inside the video TrackEntry with an EBML Void
|
|
316
|
+
* of identical byte length. We do this because ffmpeg's matroska muxer always
|
|
317
|
+
* emits a Colour element with `MatrixCoefficients=bt470bg, Range=full` derived
|
|
318
|
+
* from `format=yuva420p` filter output, but the actual VP9 bitstream encodes
|
|
319
|
+
* `color_space=BT.601` — the mismatch causes Chrome's WebCodecs VideoDecoder
|
|
320
|
+
* to silently drop every delta frame after the keyframe (issue surfaces as
|
|
321
|
+
* "only 1 sample emitted from a 49-frame segment"). With no Colour element
|
|
322
|
+
* mediabunny passes `colorSpace: undefined` to the decoder and Chrome decodes
|
|
323
|
+
* normally.
|
|
324
|
+
*/
|
|
325
|
+
function stripColourElement(buf, tracksStart, tracksEnd) {
|
|
326
|
+
let pos = tracksStart;
|
|
327
|
+
while (pos < tracksEnd) {
|
|
328
|
+
const { id: childId, width: childIdW } = readElementId(buf, pos);
|
|
329
|
+
const { value: childSize, width: childSizeW } = readVintSize(buf, pos + childIdW);
|
|
330
|
+
if (childSize === null) return;
|
|
331
|
+
const childContentStart = pos + childIdW + childSizeW;
|
|
332
|
+
const childEnd = childContentStart + childSize;
|
|
333
|
+
if (childId === ID_TRACK_ENTRY) {
|
|
334
|
+
let tepos = childContentStart;
|
|
335
|
+
while (tepos < childEnd) {
|
|
336
|
+
const { id: teid, width: teidW } = readElementId(buf, tepos);
|
|
337
|
+
const { value: tesize, width: tesizeW } = readVintSize(buf, tepos + teidW);
|
|
338
|
+
if (tesize === null) break;
|
|
339
|
+
const teContentStart = tepos + teidW + tesizeW;
|
|
340
|
+
const teEnd = teContentStart + tesize;
|
|
341
|
+
if (teid === ID_VIDEO) {
|
|
342
|
+
let vpos = teContentStart;
|
|
343
|
+
while (vpos < teEnd) {
|
|
344
|
+
const { id: vid, width: vidW } = readElementId(buf, vpos);
|
|
345
|
+
const { value: vsize, width: vsizeW } = readVintSize(buf, vpos + vidW);
|
|
346
|
+
if (vsize === null) break;
|
|
347
|
+
const totalElementSize = vidW + vsizeW + vsize;
|
|
348
|
+
if (vid === ID_COLOUR) {
|
|
349
|
+
const header = encodeVoidHeader(totalElementSize);
|
|
350
|
+
for (let i = 0; i < header.length; i++) buf[vpos + i] = header[i];
|
|
351
|
+
buf.fill(0, vpos + header.length, vpos + totalElementSize);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
vpos += totalElementSize;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
tepos = teContentStart + tesize;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
pos = childContentStart + childSize;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
281
364
|
* Patch a WebM buffer in-place to make it safe for partial (segment-sliced) serving:
|
|
282
365
|
*
|
|
283
366
|
* 1. Segment-element size VINT → EBML unknown-size (0x01FFFFFFFFFFFFFF).
|
|
@@ -289,7 +372,10 @@ const EBML_VOID_ID = 236;
|
|
|
289
372
|
* falls off the end of the buffer, causing seek errors and de-sync. Replacing
|
|
290
373
|
* it with a Void element forces linear parsing: EBML → Info → Tracks → Clusters.
|
|
291
374
|
*
|
|
292
|
-
*
|
|
375
|
+
* 3. Colour element inside Video TrackEntry → EBML Void of the same byte length.
|
|
376
|
+
* See stripColourElement() for rationale.
|
|
377
|
+
*
|
|
378
|
+
* All patches are applied to a Buffer copy; the source file on disk is not modified.
|
|
293
379
|
*/
|
|
294
380
|
function patchWebmForSegmentedServing(buf) {
|
|
295
381
|
try {
|
|
@@ -320,18 +406,12 @@ function patchWebmForSegmentedServing(buf) {
|
|
|
320
406
|
if (childSize === null) break;
|
|
321
407
|
const totalElementSize = childIdWidth + childSizeWidth + childSize;
|
|
322
408
|
if (childId === ID_SEEKHEAD) {
|
|
323
|
-
const
|
|
324
|
-
let
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
voidContentSize >> 8 & 255,
|
|
330
|
-
voidContentSize & 255
|
|
331
|
-
];
|
|
332
|
-
buf[pos] = EBML_VOID_ID;
|
|
333
|
-
for (let i = 0; i < vintBytes.length; i++) buf[pos + 1 + i] = vintBytes[i];
|
|
334
|
-
buf.fill(0, pos + 1 + vintBytes.length, pos + totalElementSize);
|
|
409
|
+
const header = encodeVoidHeader(totalElementSize);
|
|
410
|
+
for (let i = 0; i < header.length; i++) buf[pos + i] = header[i];
|
|
411
|
+
buf.fill(0, pos + header.length, pos + totalElementSize);
|
|
412
|
+
} else if (childId === ID_TRACKS) {
|
|
413
|
+
const tracksStart = pos + childIdWidth + childSizeWidth;
|
|
414
|
+
stripColourElement(buf, tracksStart, tracksStart + childSize);
|
|
335
415
|
break;
|
|
336
416
|
}
|
|
337
417
|
pos += totalElementSize;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateWebmSegmentIndex.js","names":[],"sources":["../src/generateWebmSegmentIndex.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"generateWebmSegmentIndex.js","names":[],"sources":["../src/generateWebmSegmentIndex.ts"],"mappings":"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"}
|
package/dist/idempotentTask.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_md5 = require("./md5.cjs");
|
|
3
3
|
let node_fs = require("node:fs");
|
|
4
|
+
let node_fs_promises = require("node:fs/promises");
|
|
4
5
|
let debug = require("debug");
|
|
5
6
|
debug = require_runtime.__toESM(debug);
|
|
6
7
|
let node_stream = require("node:stream");
|
|
7
|
-
let node_fs_promises = require("node:fs/promises");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
9
|
node_path = require_runtime.__toESM(node_path);
|
|
10
10
|
let node_url = require("node:url");
|
package/dist/idempotentTask.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { md5FilePath } from "./md5.js";
|
|
2
2
|
import { createWriteStream, existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
4
|
import debug from "debug";
|
|
4
5
|
import { Readable } from "node:stream";
|
|
5
|
-
import { mkdir, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
6
6
|
import path, { join } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
//#region src/idempotentTask.ts
|
package/dist/index.cjs
CHANGED
|
@@ -2,8 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_Probe = require("./Probe.cjs");
|
|
3
3
|
const require_generateFragmentIndex = require("./generateFragmentIndex.cjs");
|
|
4
4
|
const require_md5 = require("./md5.cjs");
|
|
5
|
-
const require_generateTrackFragmentIndex = require("./tasks/generateTrackFragmentIndex.cjs");
|
|
6
5
|
const require_generateTrack = require("./tasks/generateTrack.cjs");
|
|
6
|
+
const require_generateTrackFragmentIndex = require("./tasks/generateTrackFragmentIndex.cjs");
|
|
7
7
|
const require_generateScrubTrack = require("./tasks/generateScrubTrack.cjs");
|
|
8
8
|
const require_findOrCreateCaptions = require("./tasks/findOrCreateCaptions.cjs");
|
|
9
9
|
const require_cacheImage = require("./tasks/cacheImage.cjs");
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PacketProbe, Probe } from "./Probe.js";
|
|
2
2
|
import { generateFragmentIndex } from "./generateFragmentIndex.js";
|
|
3
3
|
import { md5Buffer, md5Directory, md5FilePath, md5ReadStream } from "./md5.js";
|
|
4
|
-
import { generateTrackFragmentIndex, generateTrackFragmentIndexFromPath } from "./tasks/generateTrackFragmentIndex.js";
|
|
5
4
|
import { generateTrack, generateTrackFromPath } from "./tasks/generateTrack.js";
|
|
5
|
+
import { generateTrackFragmentIndex, generateTrackFragmentIndexFromPath } from "./tasks/generateTrackFragmentIndex.js";
|
|
6
6
|
import { generateScrubTrack, generateScrubTrackFromPath } from "./tasks/generateScrubTrack.js";
|
|
7
7
|
import { findOrCreateCaptions, generateCaptionDataFromPath } from "./tasks/findOrCreateCaptions.js";
|
|
8
8
|
import { cacheImage } from "./tasks/cacheImage.js";
|
|
@@ -3,11 +3,10 @@ const require_Probe = require("../Probe.cjs");
|
|
|
3
3
|
const require_generateFragmentIndex = require("../generateFragmentIndex.cjs");
|
|
4
4
|
const require_idempotentTask = require("../idempotentTask.cjs");
|
|
5
5
|
const require_generateWebmSegmentIndex = require("../generateWebmSegmentIndex.cjs");
|
|
6
|
-
let
|
|
6
|
+
let node_fs_promises = require("node:fs/promises");
|
|
7
7
|
let debug = require("debug");
|
|
8
8
|
debug = require_runtime.__toESM(debug);
|
|
9
9
|
let node_stream = require("node:stream");
|
|
10
|
-
let node_fs_promises = require("node:fs/promises");
|
|
11
10
|
let node_os = require("node:os");
|
|
12
11
|
let node_path = require("node:path");
|
|
13
12
|
//#region src/tasks/generateScrubTrack.ts
|
|
@@ -21,30 +20,26 @@ const generateScrubTrackFromPath = async (absolutePath) => {
|
|
|
21
20
|
log("VP9 alpha source: generating WebM scrub track");
|
|
22
21
|
const tmpDir = await (0, node_fs_promises.mkdtemp)((0, node_path.join)((0, node_os.tmpdir)(), "ef-scrub-webm-"));
|
|
23
22
|
const tmpPath = (0, node_path.join)(tmpDir, "scrub.webm");
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
23
|
+
try {
|
|
24
|
+
await probe.transcodeWebmScrubToFile(tmpPath);
|
|
25
|
+
const scrubTrack = (await require_generateWebmSegmentIndex.generateWebmSegmentIndex(tmpPath, startTimeOffsetMs))[1];
|
|
26
|
+
if (!scrubTrack) throw new Error("No track 1 in VP9 scrub WebM segment index");
|
|
27
|
+
const fragmentIndex = { [-1]: {
|
|
28
|
+
...scrubTrack,
|
|
29
|
+
track: -1
|
|
30
|
+
} };
|
|
31
|
+
const buf = await (0, node_fs_promises.readFile)(tmpPath);
|
|
32
|
+
require_generateWebmSegmentIndex.patchWebmForSegmentedServing(buf);
|
|
33
|
+
return {
|
|
34
|
+
stream: node_stream.Readable.from(buf),
|
|
35
|
+
fragmentIndex: Promise.resolve(fragmentIndex)
|
|
36
|
+
};
|
|
37
|
+
} finally {
|
|
39
38
|
(0, node_fs_promises.rm)(tmpDir, {
|
|
40
39
|
recursive: true,
|
|
41
40
|
force: true
|
|
42
41
|
}).catch(() => {});
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
stream: outputStream,
|
|
46
|
-
fragmentIndex: Promise.resolve(fragmentIndex)
|
|
47
|
-
};
|
|
42
|
+
}
|
|
48
43
|
}
|
|
49
44
|
const scrubStream = probe.createScrubTrackReadstream();
|
|
50
45
|
const outputStream = new node_stream.PassThrough();
|
|
@@ -86,15 +81,17 @@ const generateScrubTrackTask = require_idempotentTask.idempotentTask({
|
|
|
86
81
|
log("VP9 alpha source: generating WebM scrub track for cache");
|
|
87
82
|
const tmpDir = await (0, node_fs_promises.mkdtemp)((0, node_path.join)((0, node_os.tmpdir)(), "ef-scrub-webm-"));
|
|
88
83
|
const tmpPath = (0, node_path.join)(tmpDir, "scrub.webm");
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
84
|
+
try {
|
|
85
|
+
await probe.transcodeWebmScrubToFile(tmpPath);
|
|
86
|
+
const buf = await (0, node_fs_promises.readFile)(tmpPath);
|
|
87
|
+
require_generateWebmSegmentIndex.patchWebmForSegmentedServing(buf);
|
|
88
|
+
return node_stream.Readable.from(buf);
|
|
89
|
+
} finally {
|
|
92
90
|
(0, node_fs_promises.rm)(tmpDir, {
|
|
93
91
|
recursive: true,
|
|
94
92
|
force: true
|
|
95
93
|
}).catch(() => {});
|
|
96
|
-
}
|
|
97
|
-
return fileStream;
|
|
94
|
+
}
|
|
98
95
|
}
|
|
99
96
|
const scrubStream = probe.createScrubTrackReadstream();
|
|
100
97
|
const finalStream = new node_stream.PassThrough();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateScrubTrack.cjs","names":["Probe","generateWebmSegmentIndex","PassThrough","generateFragmentIndex","idempotentTask"],"sources":["../../src/tasks/generateScrubTrack.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"generateScrubTrack.cjs","names":["Probe","generateWebmSegmentIndex","Readable","PassThrough","generateFragmentIndex","idempotentTask"],"sources":["../../src/tasks/generateScrubTrack.ts"],"mappings":"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"}
|