Compare commits

...

2 Commits

Author SHA1 Message Date
mes123456
70721187c0 Bind validation report to fallback sources
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
2026-09-07 17:19:37 +08:00
mes123456
93c01c8f09 Complete ffmpeg movie fallback wiring 2026-09-07 17:17:44 +08:00
3 changed files with 30 additions and 2 deletions

View File

@@ -1,8 +1,8 @@
{
"schemaVersion": 1,
"reportId": "WBV2-FULL-SOURCE-PARITY-VALIDATION-001",
"generatedAt": "2026-09-07T09:10:38.474Z",
"gitCommit": "f68c6c9678d67641d14ea6b17b53c0cfa24adb51",
"generatedAt": "2026-09-07T09:19:37.040Z",
"gitCommit": "93c01c8f09e734f69a41451394d443ebbece2233",
"sourceParityStatus": "PARTIAL",
"webProductStatus": "READY",
"releaseStatus": "READY",

View File

@@ -129,6 +129,19 @@ export async function probeSequencerCodec(
return probeMovie(request, source);
}
/** Probe a movie with the browser decoder first, then use the local ffmpeg.wasm
* Worker when Chromium cannot decode the container/codec. */
export async function probeSequencerMovieCodecWithFallback(
requestValue: unknown,
source: ArrayBuffer,
signal?: AbortSignal,
): Promise<SequencerCodecProbeResultIR> {
const browserResult = await probeSequencerCodec(requestValue, source);
if (browserResult.status === "READY") return browserResult;
const { probeMovieWithFFmpeg } = await import("./FFmpegMovieProbe");
return probeMovieWithFFmpeg(requestValue, source, signal);
}
export function createSequencerCodecProbeRequest(
stripType: SequencerCodecProbeRequestIR["stripType"],
mimeType: string,

View File

@@ -88,6 +88,21 @@ export async function generateInitialSequencerMovieProxyFrame(
throw new SequencerMediaCacheValidationError("SEQUENCER_CACHE_SOURCE_MISMATCH", "Movie proxy source bytes failed identity verification");
}
cancelled(signal);
if (capability.backend === "FFMPEG_WASM") {
try {
const { decodeMovieFrameWithFFmpeg } = await import("./FFmpegMovieProbe");
const frame = await decodeMovieFrameWithFFmpeg(source, sourceData, profile.width, profile.height, signal);
cancelled(signal);
return {
manifest: await createSequencerMediaCacheManifest(source, capability, profile, 0, frame.rgba),
data: frame.rgba,
};
}
catch (error) {
if (error instanceof DOMException && error.name === "AbortError") throw new SequencerMediaCacheValidationError("SEQUENCER_CANCELLED", "Movie proxy generation was cancelled");
throw new SequencerMediaCacheValidationError("SEQUENCER_CODEC_UNSUPPORTED", "ffmpeg.wasm movie proxy frame decode failed");
}
}
if (typeof document === "undefined" || typeof HTMLMediaElement === "undefined") {
throw new SequencerMediaCacheValidationError("SEQUENCER_CODEC_UNSUPPORTED", "HTML media proxy generation is unavailable");
}