@omnimedia/omnitool 1.1.0-60 → 1.1.0-62

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.
Files changed (47) hide show
  1. package/package.json +1 -1
  2. package/s/demo/routines/playback-test.ts +2 -17
  3. package/s/driver/fns/work.ts +3 -4
  4. package/s/timeline/renderers/player/parts/playback.ts +5 -2
  5. package/s/timeline/renderers/player/player.ts +19 -9
  6. package/x/demo/demo.bundle.min.js +4 -4
  7. package/x/demo/demo.bundle.min.js.map +3 -3
  8. package/x/demo/routines/playback-test.js +2 -16
  9. package/x/demo/routines/playback-test.js.map +1 -1
  10. package/x/driver/driver.worker.bundle.min.js +7 -11
  11. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  12. package/x/driver/fns/work.js +0 -2
  13. package/x/driver/fns/work.js.map +1 -1
  14. package/x/index.html +2 -2
  15. package/x/tests.bundle.min.js +5 -5
  16. package/x/tests.bundle.min.js.map +3 -3
  17. package/x/tests.html +1 -1
  18. package/x/timeline/renderers/player/parts/playback.d.ts +2 -1
  19. package/x/timeline/renderers/player/parts/playback.js +4 -2
  20. package/x/timeline/renderers/player/parts/playback.js.map +1 -1
  21. package/x/timeline/renderers/player/player.d.ts +2 -2
  22. package/x/timeline/renderers/player/player.js +17 -10
  23. package/x/timeline/renderers/player/player.js.map +1 -1
  24. package/x/driver/WebGLRenderer-OMRWYQIV.js +0 -2
  25. package/x/driver/WebGLRenderer-OMRWYQIV.js.map +0 -7
  26. package/x/driver/WebGPURenderer-KQJB2OJJ.js +0 -2
  27. package/x/driver/WebGPURenderer-KQJB2OJJ.js.map +0 -7
  28. package/x/driver/browserAll-YBZEJCN3.js +0 -2
  29. package/x/driver/browserAll-YBZEJCN3.js.map +0 -7
  30. package/x/driver/chunk-3L3MB5NY.js +0 -393
  31. package/x/driver/chunk-3L3MB5NY.js.map +0 -7
  32. package/x/driver/chunk-42BQ4XKE.js +0 -269
  33. package/x/driver/chunk-42BQ4XKE.js.map +0 -7
  34. package/x/driver/chunk-4HAYG3N5.js +0 -327
  35. package/x/driver/chunk-4HAYG3N5.js.map +0 -7
  36. package/x/driver/chunk-BFBY7VYB.js +0 -42
  37. package/x/driver/chunk-BFBY7VYB.js.map +0 -7
  38. package/x/driver/chunk-KM6O72WE.js +0 -157
  39. package/x/driver/chunk-KM6O72WE.js.map +0 -7
  40. package/x/driver/chunk-N6HD4WYJ.js +0 -2
  41. package/x/driver/chunk-N6HD4WYJ.js.map +0 -7
  42. package/x/driver/chunk-WCZ2O3UN.js +0 -15
  43. package/x/driver/chunk-WCZ2O3UN.js.map +0 -7
  44. package/x/driver/chunk-XWNSF3WJ.js +0 -2
  45. package/x/driver/chunk-XWNSF3WJ.js.map +0 -7
  46. package/x/driver/webworkerAll-BKJQW6P7.js +0 -2
  47. package/x/driver/webworkerAll-BKJQW6P7.js.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnimedia/omnitool",
3
- "version": "1.1.0-60",
3
+ "version": "1.1.0-62",
4
4
  "description": "open source video processing tools",
5
5
  "license": "MIT",
6
6
  "author": "Przemysław Gałęzki",
@@ -20,24 +20,9 @@ export async function playbackTest(timeline: TimelineFile, omni: Omni, root: HTM
20
20
  scrub.max = String(Math.ceil(player.duration))
21
21
 
22
22
  let isScrubbing = false
23
- let pendingSeek: number | null = null
24
- let seekInFlight = false
25
23
 
26
24
  player.playback.onTick.on(() => setScrubState(player.currentTime, player.duration))
27
25
 
28
- const queueSeek = async (timeMs: number) => {
29
- pendingSeek = timeMs
30
- if (seekInFlight)
31
- return
32
- seekInFlight = true
33
- while (pendingSeek) {
34
- const next = pendingSeek
35
- pendingSeek = null
36
- await player.seek(next)
37
- }
38
- seekInFlight = false
39
- }
40
-
41
26
  const updateTimecode = (currentMs: number, durationMs: number) => {
42
27
  timecode.textContent = `${formatTime(currentMs)} / ${formatTime(durationMs)}`
43
28
  }
@@ -46,13 +31,13 @@ export async function playbackTest(timeline: TimelineFile, omni: Omni, root: HTM
46
31
  isScrubbing = true
47
32
  const next = Math.max(0, Math.min(+scrub.value, player.duration))
48
33
  updateTimecode(next, player.duration)
49
- await queueSeek(next)
34
+ await player.seek(next)
50
35
  })
51
36
 
52
37
  scrub.addEventListener("change", async () => {
53
38
  isScrubbing = false
54
39
  const next = Math.max(0, Math.min(+scrub.value, player.duration))
55
- await queueSeek(next)
40
+ await player.seek(next)
56
41
  })
57
42
 
58
43
  const setScrubState = (timeMs: number, durationMs: number) => {
@@ -1,10 +1,9 @@
1
1
  import {Comrade} from "@e280/comrade"
2
- import {DOMAdapter, WebWorkerAdapter} from "pixi.js"
3
- import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink, AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
4
2
 
5
- import {DecoderSource, DriverSchematic} from "./schematic.js"
3
+ import {Input, ALL_FORMATS, VideoSampleSink, Output, Mp4OutputFormat, VideoSampleSource, VideoSample, AudioSampleSink,
4
+ AudioSampleSource, AudioSample, StreamTarget, BlobSource, UrlSource} from "mediabunny"
6
5
 
7
- DOMAdapter.set(WebWorkerAdapter)
6
+ import {DecoderSource, DriverSchematic} from "./schematic.js"
8
7
 
9
8
  const loadSource = async (source: DecoderSource) => {
10
9
  if(source instanceof Blob) {
@@ -39,6 +39,10 @@ export class Playback {
39
39
  this.#samples()
40
40
  }
41
41
 
42
+ update(timeline: TimelineFile) {
43
+ this.timeline = timeline
44
+ }
45
+
42
46
  async #samples() {
43
47
  for await (const _ of this.#controller.ticks()) {
44
48
  const layers = await this.playVisualSampler?.next(this.currentTime) ?? []
@@ -57,11 +61,10 @@ export class Playback {
57
61
  return await this.seekVisualSampler.sample(this.timeline, time)
58
62
  }
59
63
 
60
- async start(timeline: TimelineFile) {
64
+ async start() {
61
65
  if(this.#controller.isPlaying())
62
66
  return
63
67
 
64
- this.timeline = timeline
65
68
  await this.audioContext.resume()
66
69
 
67
70
  this.#playbackStart = this.currentTime
@@ -12,27 +12,29 @@ export class VideoPlayer {
12
12
  canvas: HTMLCanvasElement
13
13
  playback: Playback
14
14
 
15
+ #pendingSeek: number | null = null
16
+ #flushTask: Promise<void> | null = null
17
+
15
18
  constructor(
16
19
  private driver: Driver,
17
20
  resolveMedia: ResolveMedia,
18
- private timeline: TimelineFile,
21
+ timeline: TimelineFile
19
22
  ) {
20
23
  this.playback = new Playback(driver, timeline, resolveMedia)
21
24
  this.canvas = driver.compositor.pixi.renderer.canvas
22
25
  }
23
26
 
24
27
  async play() {
25
- await this.playback.start(this.timeline)
28
+ await this.playback.start()
26
29
  }
27
30
 
28
31
  pause() {
29
32
  this.playback.pause()
30
33
  }
31
34
 
32
- async seek(timeMs: number) {
33
- const layers = await this.playback.seek(ms(timeMs))
34
- const frame = await this.driver.composite(layers)
35
- frame.close()
35
+ seek(timeMs: number) {
36
+ this.#pendingSeek = timeMs
37
+ return this.#flushTask ??= this.#flushSeeks().finally(() => this.#flushTask = null)
36
38
  }
37
39
 
38
40
  setFPS(value: number) {
@@ -50,10 +52,18 @@ export class VideoPlayer {
50
52
  /**
51
53
  call this whenever your timeline state changes
52
54
  */
53
- async update(timeline: TimelineFile) {
54
- this.timeline = timeline
55
+ update(timeline: TimelineFile) {
56
+ this.playback.update(timeline)
55
57
  }
56
58
 
59
+ async #flushSeeks() {
60
+ while (this.#pendingSeek !== null) {
61
+ const next = this.#pendingSeek
62
+ this.#pendingSeek = null
63
+ const layers = await this.playback.seek(ms(next))
64
+ const frame = await this.driver.composite(layers)
65
+ frame.close()
66
+ }
67
+ }
57
68
  }
58
69
 
59
- const toUrl = (src: DecoderSource) => (src instanceof Blob ? URL.createObjectURL(src) : String(src))