Skip to content

Commit 13ea834

Browse files
perf(core): hold a clip at 0 inside a later scene until it is due (#5716)
1 parent 12d8df3 commit 13ea834

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

‎packages/core/src/runtime/entry.test.ts‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,21 @@ describe("runtime entry", () => {
680680
expect([first.preload, later.preload, untrimmed.preload]).toEqual(["", "none", ""]);
681681
});
682682

683+
it("defers a clip at 0 inside a later scene, by its start in the film", async () => {
684+
servePreview();
685+
const root = mountRoot();
686+
const opening = timed(root, "div", "0");
687+
const later = timed(root, "div", "5");
688+
for (const scene of [opening, later]) {
689+
scene.setAttribute("data-composition-id", "scene");
690+
timed(scene, "div", "0");
691+
}
692+
await evaluateRuntime();
693+
const [now, due] = [timed(opening, "video", "0"), timed(later, "video", "0")];
694+
await Promise.resolve();
695+
expect([now.preload, due.preload]).toEqual(["", "none"]);
696+
});
697+
683698
it("keeps a render loading every media element at bind", async () => {
684699
spyLoad();
685700
const [now, soon, later] = videos(mountRoot(), "0", "1.5", "5");

‎packages/core/src/runtime/preloadMedia.ts‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { parseStrictFiniteTimingNumber } from "./playbackRate";
2+
import { createRuntimeStartTimeResolver } from "./startResolver";
23
import { skipsHiddenImages } from "./timedClipHide";
34

45
type PreloadableMedia = Pick<
@@ -40,18 +41,19 @@ export function deferMediaUntilDue(): void {
4041
win.__hfMediaDeferral?.disconnect();
4142
win.__hfMediaDeferral = undefined;
4243
if (!skipsHiddenImages()) return;
43-
const defer = (el: Element) => {
44+
const defer = (el: Element, startInFilm: (el: Element) => number) => {
4445
const start = parseStrictFiniteTimingNumber(el.getAttribute("data-start"));
45-
if (start != null && start > 0 && lengthIsAuthored(el))
46+
if (start != null && lengthIsAuthored(el) && startInFilm(el) > 0)
4647
(el as HTMLMediaElement).preload = "none";
4748
};
4849
win.__hfMediaDeferral = new MutationObserver((records) => {
50+
const startInFilm = createRuntimeStartTimeResolver({}).resolveMediaStartForElement;
4951
for (const record of records)
5052
for (const node of record.addedNodes) {
5153
if (node.nodeType !== 1) continue;
5254
const el = node as Element;
53-
if (el.matches("video, audio")) defer(el);
54-
for (const media of el.querySelectorAll("video, audio")) defer(media);
55+
if (el.matches("video, audio")) defer(el, startInFilm);
56+
for (const media of el.querySelectorAll("video, audio")) defer(media, startInFilm);
5557
}
5658
});
5759
win.__hfMediaDeferral.observe(document.documentElement, { childList: true, subtree: true });

0 commit comments

Comments
 (0)