UNPKG

@omnimedia/omnitool

Version:

open source video processing tools

128 lines 7.66 kB
import { expect, Science, test } from "@e280/science"; import { O } from "./o.js"; import { Omni } from "./omni.js"; import { Driver } from "../../driver/driver.js"; import { Datafile } from "../utils/datafile.js"; import { loadVideo } from "../../demo/routines/load-video.js"; import { computeItemDuration } from "../renderers/parts/handy.js"; const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url); export async function setupTest() { const driver = await Driver.setup({ workerUrl }); const omni = new Omni(driver); const testVideo = await loadVideo("/assets/temp/test.mp4"); const { videoA } = await omni.load({ videoA: Datafile.make(testVideo, "test.mp4") }); return { driver, omni, testVideo, videoA }; } export default Science.suite({ "basic demo": test(async () => { const driver = await Driver.setup({ workerUrl: new URL("../driver/driver.worker.bundle.min.js", import.meta.url) }); const omni = new Omni(driver); const testVideo = await loadVideo("/assets/temp/test.mp4"); const { videoA } = await omni.load({ videoA: Datafile.make(testVideo, "test.mp4") }); const o = new O({ timeline: omni.timeline(o => o.sequence()) }); const rootItem = o.require(o.timeline.rootId); const video = o.video(videoA); o.addChildren(rootItem, video); const videoDuration = computeItemDuration(video.id, o.timeline); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(videoDuration).is(timelineDuration); }), "sequence duration is 3x": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA), o.video(videoA), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration * 3); }), "stack duration is 1x": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.stack(o.video(videoA), o.video(videoA), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration); }), "nested stack inside sequence": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA), o.stack(o.video(videoA), o.video(videoA)), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration * 3); }), "nested sequence inside stack": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.stack(o.video(videoA), o.sequence(o.video(videoA), o.video(videoA)))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration * 2); }), "empty timeline duration is 0": test(async () => { const { omni } = await setupTest(); const o1 = new O({ timeline: omni.timeline(o => o.sequence()) }); const o2 = new O({ timeline: omni.timeline(o => o.stack()) }); const duration1 = computeItemDuration(o1.timeline.rootId, o1.timeline); const duration2 = computeItemDuration(o2.timeline.rootId, o2.timeline); expect(duration1).is(0); expect(duration2).is(0); }), "transition in a sequence": test(async () => { const { omni, videoA } = await setupTest(); const transitionDuration = 1000; const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA), o.transition.fade(transitionDuration), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); const expectedDuration = (videoA.duration * 2) + transitionDuration; expect(timelineDuration).is(expectedDuration); }), "transition in a stack": test(async () => { const { omni, videoA } = await setupTest(); const transitionDuration = 1000; const o = new O({ timeline: omni.timeline(o => o.stack(o.video(videoA), o.transition.fade(transitionDuration), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration); }), "edge transition takes sequence space": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.sequence(o.transition.fade(1000), o.video(videoA), o.video(videoA), o.transition.fade(1000))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration * 2 + 2000); }), "transition duration can be longer than neighboring clips": test(async () => { const { omni, videoA } = await setupTest(); const duration = 3000; const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA, { duration }), o.transition.fade(duration * 2), o.video(videoA, { duration }))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(duration * 4); }), "multiple transitions": test(async () => { const { omni, videoA } = await setupTest(); const transitionDuration = 1000; const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA), o.transition.fade(transitionDuration), o.video(videoA), o.transition.fade(transitionDuration), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); const expected = (videoA.duration * 3) + (transitionDuration * 2); expect(timelineDuration).is(expected); }), "gap item in a sequence": test(async () => { const { omni, videoA } = await setupTest(); const gapDuration = 1000; const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA), o.gap(gapDuration), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); const expected = videoA.duration * 2 + gapDuration; expect(timelineDuration).is(expected); }), "gap item in a stack": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.stack(o.video(videoA), o.gap(1000), o.video(videoA))) }); const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline); expect(timelineDuration).is(videoA.duration); }), "load media into Omni": test(async () => { const driver = await Driver.setup({ workerUrl }); const omni = new Omni(driver); const testVideo = await loadVideo("/assets/temp/test.mp4"); const { videoA } = await omni.load({ videoA: Datafile.make(testVideo, "test.mp4") }); expect(omni.resources.require(videoA.datafile.checksum.hash)).happy(); }), "playback seeks to correct time": test(async () => { const { omni, videoA } = await setupTest(); const o = new O({ timeline: omni.timeline(o => o.sequence(o.video(videoA, { duration: 2000 }), o.gap(500), o.video(videoA, { duration: 2500 }))) }); const playback = await omni.playback(o.timeline); await playback.seek(1000); expect(playback.currentTime).is(1000); }) }); //# sourceMappingURL=omni.test.js.map