@meframe/core 0.0.1 → 0.0.3

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 (159) hide show
  1. package/README.md +17 -4
  2. package/dist/Meframe.d.ts.map +1 -1
  3. package/dist/Meframe.js +2 -4
  4. package/dist/Meframe.js.map +1 -1
  5. package/dist/cache/CacheManager.d.ts.map +1 -1
  6. package/dist/cache/CacheManager.js +8 -1
  7. package/dist/cache/CacheManager.js.map +1 -1
  8. package/dist/config/defaults.d.ts.map +1 -1
  9. package/dist/config/defaults.js +2 -9
  10. package/dist/config/defaults.js.map +1 -1
  11. package/dist/config/types.d.ts +3 -4
  12. package/dist/config/types.d.ts.map +1 -1
  13. package/dist/controllers/PlaybackController.d.ts +4 -2
  14. package/dist/controllers/PlaybackController.d.ts.map +1 -1
  15. package/dist/controllers/PlaybackController.js +7 -13
  16. package/dist/controllers/PlaybackController.js.map +1 -1
  17. package/dist/controllers/PreRenderService.d.ts +3 -2
  18. package/dist/controllers/PreRenderService.d.ts.map +1 -1
  19. package/dist/controllers/PreRenderService.js.map +1 -1
  20. package/dist/controllers/PreviewHandle.d.ts +2 -0
  21. package/dist/controllers/PreviewHandle.d.ts.map +1 -1
  22. package/dist/controllers/PreviewHandle.js +6 -0
  23. package/dist/controllers/PreviewHandle.js.map +1 -1
  24. package/dist/controllers/index.d.ts +1 -1
  25. package/dist/controllers/index.d.ts.map +1 -1
  26. package/dist/controllers/types.d.ts +2 -12
  27. package/dist/controllers/types.d.ts.map +1 -1
  28. package/dist/event/events.d.ts +5 -59
  29. package/dist/event/events.d.ts.map +1 -1
  30. package/dist/event/events.js +1 -6
  31. package/dist/event/events.js.map +1 -1
  32. package/dist/model/CompositionModel.js +1 -2
  33. package/dist/model/CompositionModel.js.map +1 -1
  34. package/dist/orchestrator/CompositionPlanner.d.ts.map +1 -1
  35. package/dist/orchestrator/CompositionPlanner.js +1 -0
  36. package/dist/orchestrator/CompositionPlanner.js.map +1 -1
  37. package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
  38. package/dist/orchestrator/Orchestrator.js +3 -13
  39. package/dist/orchestrator/Orchestrator.js.map +1 -1
  40. package/dist/orchestrator/VideoClipSession.d.ts.map +1 -1
  41. package/dist/orchestrator/VideoClipSession.js +4 -5
  42. package/dist/orchestrator/VideoClipSession.js.map +1 -1
  43. package/dist/orchestrator/types.d.ts +1 -1
  44. package/dist/orchestrator/types.d.ts.map +1 -1
  45. package/dist/stages/compose/GlobalAudioSession.d.ts.map +1 -1
  46. package/dist/stages/compose/GlobalAudioSession.js +3 -2
  47. package/dist/stages/compose/GlobalAudioSession.js.map +1 -1
  48. package/dist/stages/compose/VideoComposer.d.ts.map +1 -1
  49. package/dist/stages/compose/types.d.ts +3 -1
  50. package/dist/stages/compose/types.d.ts.map +1 -1
  51. package/dist/stages/decode/AudioChunkDecoder.d.ts.map +1 -1
  52. package/dist/stages/decode/VideoChunkDecoder.d.ts +0 -1
  53. package/dist/stages/decode/VideoChunkDecoder.d.ts.map +1 -1
  54. package/dist/stages/demux/MP4Demuxer.d.ts +2 -1
  55. package/dist/stages/demux/MP4Demuxer.d.ts.map +1 -1
  56. package/dist/stages/load/EventHandlers.d.ts +2 -11
  57. package/dist/stages/load/EventHandlers.d.ts.map +1 -1
  58. package/dist/stages/load/EventHandlers.js +1 -24
  59. package/dist/stages/load/EventHandlers.js.map +1 -1
  60. package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
  61. package/dist/stages/load/ResourceLoader.js +11 -13
  62. package/dist/stages/load/ResourceLoader.js.map +1 -1
  63. package/dist/stages/load/TaskManager.d.ts +1 -1
  64. package/dist/stages/load/TaskManager.d.ts.map +1 -1
  65. package/dist/stages/load/TaskManager.js +3 -2
  66. package/dist/stages/load/TaskManager.js.map +1 -1
  67. package/dist/stages/load/types.d.ts +2 -0
  68. package/dist/stages/load/types.d.ts.map +1 -1
  69. package/dist/utils/time-utils.d.ts +3 -2
  70. package/dist/utils/time-utils.d.ts.map +1 -1
  71. package/dist/utils/time-utils.js +2 -1
  72. package/dist/utils/time-utils.js.map +1 -1
  73. package/dist/vite-plugin.d.ts +19 -0
  74. package/dist/vite-plugin.d.ts.map +1 -0
  75. package/dist/vite-plugin.js +145 -0
  76. package/dist/vite-plugin.js.map +1 -0
  77. package/dist/worker/WorkerPool.d.ts +7 -4
  78. package/dist/worker/WorkerPool.d.ts.map +1 -1
  79. package/dist/worker/WorkerPool.js +29 -18
  80. package/dist/worker/WorkerPool.js.map +1 -1
  81. package/dist/{stages/demux → workers}/MP4Demuxer.js +17 -15
  82. package/dist/workers/MP4Demuxer.js.map +1 -0
  83. package/dist/workers/WorkerChannel.js +486 -0
  84. package/dist/workers/WorkerChannel.js.map +1 -0
  85. package/dist/workers/mp4box.all.js +7049 -0
  86. package/dist/workers/mp4box.all.js.map +1 -0
  87. package/dist/workers/stages/compose/audio-compose.worker.js +1063 -0
  88. package/dist/workers/stages/compose/audio-compose.worker.js.map +1 -0
  89. package/dist/workers/stages/compose/video-compose.worker.js +1209 -0
  90. package/dist/workers/stages/compose/video-compose.worker.js.map +1 -0
  91. package/dist/{stages → workers/stages}/decode/decode.worker.js +401 -20
  92. package/dist/workers/stages/decode/decode.worker.js.map +1 -0
  93. package/dist/{stages → workers/stages}/demux/audio-demux.worker.js +184 -4
  94. package/dist/workers/stages/demux/audio-demux.worker.js.map +1 -0
  95. package/dist/{stages → workers/stages}/demux/video-demux.worker.js +7 -30
  96. package/dist/workers/stages/demux/video-demux.worker.js.map +1 -0
  97. package/dist/{stages → workers/stages}/encode/encode.worker.js +238 -5
  98. package/dist/workers/stages/encode/encode.worker.js.map +1 -0
  99. package/dist/{stages/mux/MP4Muxer.js → workers/stages/mux/mux.worker.js} +244 -5
  100. package/dist/workers/stages/mux/mux.worker.js.map +1 -0
  101. package/package.json +27 -21
  102. package/dist/model/types.js +0 -5
  103. package/dist/model/types.js.map +0 -1
  104. package/dist/plugins/BackpressureMonitor.js +0 -62
  105. package/dist/plugins/BackpressureMonitor.js.map +0 -1
  106. package/dist/stages/compose/AudioDucker.js +0 -161
  107. package/dist/stages/compose/AudioDucker.js.map +0 -1
  108. package/dist/stages/compose/AudioMixer.js +0 -373
  109. package/dist/stages/compose/AudioMixer.js.map +0 -1
  110. package/dist/stages/compose/FilterProcessor.js +0 -226
  111. package/dist/stages/compose/FilterProcessor.js.map +0 -1
  112. package/dist/stages/compose/LayerRenderer.js +0 -215
  113. package/dist/stages/compose/LayerRenderer.js.map +0 -1
  114. package/dist/stages/compose/TransitionProcessor.js +0 -189
  115. package/dist/stages/compose/TransitionProcessor.js.map +0 -1
  116. package/dist/stages/compose/VideoComposer.js +0 -186
  117. package/dist/stages/compose/VideoComposer.js.map +0 -1
  118. package/dist/stages/compose/audio-compose.worker.d.ts +0 -79
  119. package/dist/stages/compose/audio-compose.worker.d.ts.map +0 -1
  120. package/dist/stages/compose/audio-compose.worker.js +0 -541
  121. package/dist/stages/compose/audio-compose.worker.js.map +0 -1
  122. package/dist/stages/compose/video-compose.worker.d.ts +0 -60
  123. package/dist/stages/compose/video-compose.worker.d.ts.map +0 -1
  124. package/dist/stages/compose/video-compose.worker.js +0 -369
  125. package/dist/stages/compose/video-compose.worker.js.map +0 -1
  126. package/dist/stages/decode/AudioChunkDecoder.js +0 -83
  127. package/dist/stages/decode/AudioChunkDecoder.js.map +0 -1
  128. package/dist/stages/decode/BaseDecoder.js +0 -130
  129. package/dist/stages/decode/BaseDecoder.js.map +0 -1
  130. package/dist/stages/decode/VideoChunkDecoder.js +0 -209
  131. package/dist/stages/decode/VideoChunkDecoder.js.map +0 -1
  132. package/dist/stages/decode/decode.worker.d.ts +0 -70
  133. package/dist/stages/decode/decode.worker.d.ts.map +0 -1
  134. package/dist/stages/decode/decode.worker.js.map +0 -1
  135. package/dist/stages/demux/MP3FrameParser.js +0 -186
  136. package/dist/stages/demux/MP3FrameParser.js.map +0 -1
  137. package/dist/stages/demux/MP4Demuxer.js.map +0 -1
  138. package/dist/stages/demux/audio-demux.worker.d.ts +0 -51
  139. package/dist/stages/demux/audio-demux.worker.d.ts.map +0 -1
  140. package/dist/stages/demux/audio-demux.worker.js.map +0 -1
  141. package/dist/stages/demux/video-demux.worker.d.ts +0 -48
  142. package/dist/stages/demux/video-demux.worker.d.ts.map +0 -1
  143. package/dist/stages/demux/video-demux.worker.js.map +0 -1
  144. package/dist/stages/encode/AudioChunkEncoder.js +0 -37
  145. package/dist/stages/encode/AudioChunkEncoder.js.map +0 -1
  146. package/dist/stages/encode/BaseEncoder.js +0 -164
  147. package/dist/stages/encode/BaseEncoder.js.map +0 -1
  148. package/dist/stages/encode/VideoChunkEncoder.js +0 -50
  149. package/dist/stages/encode/VideoChunkEncoder.js.map +0 -1
  150. package/dist/stages/encode/encode.worker.d.ts +0 -3
  151. package/dist/stages/encode/encode.worker.d.ts.map +0 -1
  152. package/dist/stages/encode/encode.worker.js.map +0 -1
  153. package/dist/stages/mux/MP4Muxer.js.map +0 -1
  154. package/dist/stages/mux/mux.worker.d.ts +0 -65
  155. package/dist/stages/mux/mux.worker.d.ts.map +0 -1
  156. package/dist/stages/mux/mux.worker.js +0 -219
  157. package/dist/stages/mux/mux.worker.js.map +0 -1
  158. package/dist/stages/mux/utils.js +0 -34
  159. package/dist/stages/mux/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PlaybackController.js","sources":["../../src/controllers/PlaybackController.ts"],"sourcesContent":["import type {\n IPlaybackController,\n PlaybackState,\n PlaybackOptions,\n IOrchestratorForControl,\n IEventBus,\n} from './types';\nimport type { TimeUs } from '../model/types';\nimport { MeframeEvent } from '../event/events';\nimport { quantizeTimestampToFrame } from '../utils/time-utils';\nimport type { GlobalAudioSession } from '../stages/compose/GlobalAudioSession';\n\n/**\n * Playback controller for preview\n * Internal implementation - not exposed directly to external consumers\n */\nexport class PlaybackController implements IPlaybackController {\n private orchestrator: IOrchestratorForControl;\n private eventBus: IEventBus;\n private canvas: HTMLCanvasElement | OffscreenCanvas;\n private ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\n // Playback state\n private _currentTimeUs: TimeUs = 0;\n private _state: PlaybackState = 'idle';\n private playbackRate = 1.0;\n private volume = 1.0;\n private loop = false;\n\n // Animation loop\n private rafId: number | null = null;\n private startTime = 0;\n\n // Frame tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private audioContext: AudioContext | null = null;\n private audioSource: AudioBufferSourceNode | null = null;\n private audioGainNode: GainNode | null = null;\n private audioSession: GlobalAudioSession | null = null;\n\n // Buffering state\n private isBuffering = false;\n\n constructor(\n orchestrator: IOrchestratorForControl,\n eventBus: IEventBus,\n options: PlaybackOptions\n ) {\n this.orchestrator = orchestrator;\n this.eventBus = eventBus;\n this.canvas = options.canvas;\n\n // Get 2D context with high quality settings\n const ctx = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n colorSpace: 'srgb',\n } as any);\n if (!ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n this.ctx = ctx as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\n // Configure high quality rendering\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n\n // Set initial time if provided\n if (options.startUs !== undefined) {\n this._currentTimeUs = options.startUs;\n }\n\n if (options.rate !== undefined) {\n this.playbackRate = options.rate;\n }\n\n if (options.loop !== undefined) {\n this.loop = options.loop;\n }\n\n if (options.autoStart) {\n this.play();\n }\n }\n\n // Playback control\n play(): void {\n if (this._state === 'playing') return;\n\n void this.startPlayback();\n }\n\n private async startPlayback(): Promise<void> {\n const wasIdle = this._state === 'idle';\n\n this._state = 'buffering';\n this.eventBus.emit(MeframeEvent.PlaybackBuffering);\n\n try {\n await this.orchestrator.ensureClipCache(this._currentTimeUs);\n\n const ready = await this.orchestrator.waitForClipReady(this._currentTimeUs, {\n minFrameCount: 30,\n timeoutMs: 3_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Buffering timeout, starting anyway');\n }\n\n this._state = 'playing';\n this.startTime = performance.now() - this._currentTimeUs / 1000 / this.playbackRate;\n await this.ensureAudioContext();\n this.startAudioPlayback();\n this.playbackLoop();\n\n this.eventBus.emit(MeframeEvent.PlaybackPlay);\n } catch (error) {\n console.error('[PlaybackController] Failed to start playback:', error);\n this._state = wasIdle ? 'idle' : 'paused';\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n }\n }\n\n pause(): void {\n if (this._state !== 'playing') return;\n\n this._state = 'paused';\n\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n this.stopAudioPlayback();\n\n this.eventBus.emit(MeframeEvent.PlaybackPause);\n }\n\n stop(): void {\n this.pause();\n this._currentTimeUs = 0;\n this._state = 'idle';\n this.frameCount = 0; // Reset frame counter\n this.lastFrameTime = 0; // Reset frame timing\n this.fps = 0; // Reset FPS\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n this.audioSession?.reset();\n this.stopAudioPlayback();\n\n this.eventBus.emit(MeframeEvent.PlaybackStop);\n }\n\n async seek(timeUs: TimeUs): Promise<void> {\n const wasPlaying = this._state === 'playing';\n const previousState = this._state;\n\n if (wasPlaying) {\n this.pause();\n }\n\n const clamped = this.clampTime(timeUs);\n this._currentTimeUs = clamped;\n\n this._state = 'seeking';\n this.stopAudioPlayback();\n\n try {\n await this.orchestrator.ensureClipCache(clamped);\n\n const ready = await this.orchestrator.waitForClipReady(clamped, {\n minFrameCount: 10,\n timeoutMs: 2_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Seek buffering timeout');\n }\n\n await this.renderCurrentFrame(clamped);\n this.eventBus.emit(MeframeEvent.PlaybackSeek, { timeUs: this._currentTimeUs });\n } catch (error) {\n console.error('[PlaybackController] Seek error:', error);\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n } finally {\n if (wasPlaying) {\n this._state = 'playing';\n this.startTime = performance.now() - this._currentTimeUs / 1000 / this.playbackRate;\n await this.ensureAudioContext();\n this.startAudioPlayback();\n if (!this.rafId) {\n this.playbackLoop();\n }\n } else {\n this._state = previousState === 'idle' ? 'idle' : 'paused';\n }\n }\n }\n\n // Playback properties\n setRate(rate: number): void {\n // Adjust start time to maintain current position\n const elapsed = performance.now() - this.startTime;\n this.playbackRate = rate;\n this.startTime = performance.now() - elapsed / rate;\n\n this.eventBus.emit(MeframeEvent.PlaybackRateChange, { rate });\n\n if (this.audioSource) {\n this.audioSource.playbackRate.value = this.playbackRate;\n }\n }\n\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n this.eventBus.emit(MeframeEvent.PlaybackVolumeChange, { volume: this.volume });\n\n if (this.audioGainNode) {\n this.audioGainNode.gain.value = this.volume;\n }\n }\n\n setMute(muted: boolean): void {\n if (muted) {\n this.stopAudioPlayback();\n } else if (this._state === 'playing') {\n this.startAudioPlayback();\n }\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n // State properties\n get currentTime(): TimeUs {\n if (this._state === 'playing') {\n const elapsed = (performance.now() - this.startTime) * this.playbackRate;\n this._currentTimeUs = Math.min(elapsed * 1000, this.duration);\n }\n return this._currentTimeUs;\n }\n\n get duration(): TimeUs {\n const modelDuration = this.orchestrator.compositionModel?.durationUs;\n if (modelDuration !== undefined) {\n return modelDuration;\n }\n\n return 0;\n }\n\n get state(): PlaybackState {\n return this._state;\n }\n\n get playing(): boolean {\n return this._state === 'playing';\n }\n\n setAudioSession(session: GlobalAudioSession): void {\n this.audioSession = session;\n }\n\n // Resume is just an alias for play\n resume(): void {\n this.play();\n }\n\n // Private methods\n private playbackLoop(): void {\n // Only continue loop if actively playing (not buffering/paused/etc)\n if (this._state !== 'playing') {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n return;\n }\n\n const frameStartTime = performance.now();\n\n this.rafId = requestAnimationFrame(async () => {\n // Check state again after async boundary\n if (this._state !== 'playing') {\n return;\n }\n\n this.updateTime();\n\n await this.renderCurrentFrame();\n\n // Check if still playing after render (might have entered buffering)\n if (this._state !== 'playing') {\n return;\n }\n\n // Calculate FPS based on actual frame timing\n const now = performance.now();\n if (this.lastFrameTime > 0) {\n const deltaTime = now - this.lastFrameTime;\n const instantFps = 1000 / deltaTime;\n this.fps = this.fps > 0 ? this.fps * 0.9 + instantFps * 0.1 : instantFps;\n }\n this.lastFrameTime = now;\n\n this.frameCount++;\n\n // Emit frame rendered event for plugins\n const primaryClip = this.orchestrator.compositionModel?.primaryClip;\n if (primaryClip) {\n this.eventBus.emit(MeframeEvent.ComposeFrameReady, {\n timeUs: this._currentTimeUs,\n frameNumber: this.frameCount,\n renderTimeMs: now - frameStartTime,\n trackId: primaryClip.trackId || 'main',\n clipId: primaryClip.id,\n });\n }\n\n this.playbackLoop();\n });\n }\n\n private updateTime(): void {\n const elapsed = (performance.now() - this.startTime) * this.playbackRate;\n const rawTimeUs = elapsed * 1000;\n const fps = this.orchestrator.compositionModel?.fps;\n this._currentTimeUs = quantizeTimestampToFrame(rawTimeUs, 0, fps, 'nearest');\n\n // Check if reached end\n if (this._currentTimeUs >= this.duration) {\n if (this.loop) {\n this._currentTimeUs = 0;\n this.startTime = performance.now();\n } else {\n this._currentTimeUs = this.duration;\n this.pause();\n this._state = 'ended';\n this.eventBus.emit(MeframeEvent.PlaybackEnded, { timeUs: this._currentTimeUs });\n }\n }\n\n // Emit time update\n this.eventBus.emit(MeframeEvent.PlaybackTimeUpdate, { timeUs: this._currentTimeUs });\n }\n\n private async renderCurrentFrame(timeUs?: TimeUs): Promise<void> {\n try {\n const targetTime = timeUs ?? this._currentTimeUs;\n const rcFrame = await this.orchestrator.renderFrame(targetTime);\n\n if (!rcFrame) {\n // Cache miss during playback - trigger buffering\n if (this._state === 'playing') {\n await this.handlePlaybackBuffering(targetTime);\n }\n return;\n }\n\n await rcFrame.use((frame) => {\n // Ensure high quality rendering for every frame\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);\n });\n } catch (error) {\n console.error('Render error:', error);\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n }\n }\n\n private async handlePlaybackBuffering(timeUs: TimeUs): Promise<void> {\n // Prevent duplicate buffering requests\n if (this.isBuffering) {\n return;\n }\n\n // Pause the playback loop\n const wasPlaying = this._state === 'playing';\n if (!wasPlaying) return;\n\n this.isBuffering = true;\n this._state = 'buffering';\n this.eventBus.emit(MeframeEvent.PlaybackBuffering);\n\n console.log(`[PlaybackController] Buffering at ${timeUs}µs (clip transition)`);\n\n try {\n // Ensure clip cache for current time\n await this.orchestrator.ensureClipCache(timeUs);\n\n // Wait for minimum frames (smaller buffer for clip transitions)\n const ready = await this.orchestrator.waitForClipReady(timeUs, {\n minFrameCount: 15, // 0.5s @30fps - faster resume\n timeoutMs: 2_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Buffering timeout during playback');\n }\n\n // Resume playback\n this._state = 'playing';\n this.startTime = performance.now() - timeUs / 1000 / this.playbackRate;\n this.eventBus.emit(MeframeEvent.PlaybackPlay);\n\n // Restart playback loop\n if (!this.rafId) {\n this.playbackLoop();\n }\n } catch (error) {\n console.error('[PlaybackController] Buffering error:', error);\n this._state = 'paused';\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n } finally {\n this.isBuffering = false;\n }\n }\n\n private clampTime(timeUs: TimeUs): TimeUs {\n return Math.max(0, Math.min(timeUs, this.duration));\n }\n\n // Cleanup\n dispose(): void {\n this.stop();\n }\n\n private async ensureAudioContext(): Promise<void> {\n if (this.audioContext) {\n return;\n }\n\n this.audioContext = new AudioContext();\n this.audioGainNode = this.audioContext.createGain();\n this.audioGainNode.gain.value = this.volume;\n this.audioGainNode.connect(this.audioContext.destination);\n }\n\n private startAudioPlayback(): void {\n if (!this.audioContext || !this.audioSession || !this.audioGainNode) {\n return;\n }\n\n this.stopAudioPlayback();\n\n const startUs = this._currentTimeUs;\n\n this.audioSession\n .ensureMixedPCM(startUs)\n .then((audioBuffer) => {\n if (!audioBuffer || !this.audioContext || !this.audioGainNode) {\n return;\n }\n\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.playbackRate.value = this.playbackRate;\n source.onended = () => {\n this.audioSource = null;\n if (this._state === 'playing') {\n this.startAudioPlayback();\n }\n };\n\n source.connect(this.audioGainNode);\n source.start();\n this.audioSource = source;\n })\n .catch((error) => {\n console.error('[PlaybackController] Audio playback error:', error);\n });\n }\n\n private stopAudioPlayback(): void {\n if (this.audioSource) {\n try {\n this.audioSource.stop();\n } catch (error) {\n console.warn('[PlaybackController] stop audio failed', error);\n }\n this.audioSource.disconnect();\n this.audioSource = null;\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PlaybackController.js","sources":["../../src/controllers/PlaybackController.ts"],"sourcesContent":["import type { IPlaybackController, PlaybackState, PlaybackOptions, IEventBus } from './types';\nimport type { TimeUs } from '../model/types';\nimport { MeframeEvent } from '../event/events';\nimport { quantizeTimestampToFrame } from '../utils/time-utils';\nimport type { GlobalAudioSession } from '../stages/compose/GlobalAudioSession';\nimport type { Orchestrator } from '../orchestrator';\n\n/**\n * Playback controller for preview\n * Internal implementation - not exposed directly to external consumers\n */\nexport class PlaybackController implements IPlaybackController {\n private orchestrator: Orchestrator;\n private eventBus: IEventBus;\n private canvas: HTMLCanvasElement | OffscreenCanvas;\n private ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\n // Playback state\n private _currentTimeUs: TimeUs = 0;\n private _state: PlaybackState = 'idle';\n private playbackRate = 1.0;\n private volume = 1.0;\n private loop = false;\n\n // Animation loop\n private rafId: number | null = null;\n private startTime = 0;\n\n // Frame tracking\n private frameCount = 0;\n private lastFrameTime = 0;\n private fps = 0;\n private audioContext: AudioContext | null = null;\n private audioSource: AudioBufferSourceNode | null = null;\n private audioGainNode: GainNode | null = null;\n private audioSession: GlobalAudioSession | null = null;\n\n // Buffering state\n private isBuffering = false;\n\n constructor(orchestrator: Orchestrator, eventBus: IEventBus, options: PlaybackOptions) {\n this.orchestrator = orchestrator;\n this.eventBus = eventBus;\n this.canvas = options.canvas;\n\n // Get 2D context with high quality settings\n const ctx = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n colorSpace: 'srgb',\n } as any);\n if (!ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n this.ctx = ctx as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\n // Configure high quality rendering\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n\n // Set initial time if provided\n if (options.startUs !== undefined) {\n this._currentTimeUs = options.startUs;\n }\n\n if (options.rate !== undefined) {\n this.playbackRate = options.rate;\n }\n\n if (options.loop !== undefined) {\n this.loop = options.loop;\n }\n\n if (options.autoStart) {\n this.play();\n }\n\n this.setupListeners();\n }\n\n // Playback control\n play(): void {\n if (this._state === 'playing') return;\n\n void this.startPlayback();\n }\n\n private async startPlayback(): Promise<void> {\n const wasIdle = this._state === 'idle';\n\n this._state = 'buffering';\n this.eventBus.emit(MeframeEvent.PlaybackBuffering);\n\n try {\n await this.orchestrator.ensureClipCache(this._currentTimeUs);\n\n const ready = await this.orchestrator.waitForClipReady(this._currentTimeUs, {\n minFrameCount: 30,\n timeoutMs: 3_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Buffering timeout, starting anyway');\n }\n\n this._state = 'playing';\n this.startTime = performance.now() - this._currentTimeUs / 1000 / this.playbackRate;\n await this.ensureAudioContext();\n this.startAudioPlayback();\n this.playbackLoop();\n\n this.eventBus.emit(MeframeEvent.PlaybackPlay);\n } catch (error) {\n console.error('[PlaybackController] Failed to start playback:', error);\n this._state = wasIdle ? 'idle' : 'paused';\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n }\n }\n\n pause(): void {\n if (this._state !== 'playing') return;\n\n this._state = 'paused';\n\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n this.stopAudioPlayback();\n\n this.eventBus.emit(MeframeEvent.PlaybackPause);\n }\n\n stop(): void {\n this.pause();\n this._currentTimeUs = 0;\n this._state = 'idle';\n this.frameCount = 0; // Reset frame counter\n this.lastFrameTime = 0; // Reset frame timing\n this.fps = 0; // Reset FPS\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n this.audioSession?.reset();\n this.stopAudioPlayback();\n\n this.eventBus.emit(MeframeEvent.PlaybackStop);\n }\n\n async seek(timeUs: TimeUs): Promise<void> {\n const wasPlaying = this._state === 'playing';\n const previousState = this._state;\n\n if (wasPlaying) {\n this.pause();\n }\n\n const clamped = this.clampTime(timeUs);\n this._currentTimeUs = clamped;\n\n this._state = 'seeking';\n this.stopAudioPlayback();\n\n try {\n await this.orchestrator.ensureClipCache(clamped);\n\n const ready = await this.orchestrator.waitForClipReady(clamped, {\n minFrameCount: 10,\n timeoutMs: 3_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Seek buffering timeout');\n }\n\n await this.renderCurrentFrame(clamped);\n this.eventBus.emit(MeframeEvent.PlaybackSeek, { timeUs: this._currentTimeUs });\n } catch (error) {\n console.error('[PlaybackController] Seek error:', error);\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n } finally {\n if (wasPlaying) {\n this._state = 'playing';\n this.startTime = performance.now() - this._currentTimeUs / 1000 / this.playbackRate;\n await this.ensureAudioContext();\n this.startAudioPlayback();\n if (!this.rafId) {\n this.playbackLoop();\n }\n } else {\n this._state = previousState === 'idle' ? 'idle' : 'paused';\n }\n }\n }\n\n // Playback properties\n setRate(rate: number): void {\n // Adjust start time to maintain current position\n const elapsed = performance.now() - this.startTime;\n this.playbackRate = rate;\n this.startTime = performance.now() - elapsed / rate;\n\n this.eventBus.emit(MeframeEvent.PlaybackRateChange, { rate });\n\n if (this.audioSource) {\n this.audioSource.playbackRate.value = this.playbackRate;\n }\n }\n\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n this.eventBus.emit(MeframeEvent.PlaybackVolumeChange, { volume: this.volume });\n\n if (this.audioGainNode) {\n this.audioGainNode.gain.value = this.volume;\n }\n }\n\n setMute(muted: boolean): void {\n if (muted) {\n this.stopAudioPlayback();\n } else if (this._state === 'playing') {\n this.startAudioPlayback();\n }\n }\n\n setLoop(loop: boolean): void {\n this.loop = loop;\n }\n\n // State properties\n get currentTime(): TimeUs {\n if (this._state === 'playing') {\n const elapsed = (performance.now() - this.startTime) * this.playbackRate;\n this._currentTimeUs = Math.min(elapsed * 1000, this.duration);\n }\n return this._currentTimeUs;\n }\n\n get duration(): TimeUs {\n const modelDuration = this.orchestrator.compositionModel?.durationUs;\n if (modelDuration !== undefined) {\n return modelDuration;\n }\n\n return 0;\n }\n\n get state(): PlaybackState {\n return this._state;\n }\n\n get playing(): boolean {\n return this._state === 'playing';\n }\n\n setAudioSession(session: GlobalAudioSession): void {\n this.audioSession = session;\n }\n\n // Resume is just an alias for play\n resume(): void {\n this.play();\n }\n\n private setupListeners(): void {\n this.orchestrator.on(MeframeEvent.CacheCover, (event) => {\n this.renderCurrentFrame(event.timeUs);\n });\n }\n\n // Private methods\n private playbackLoop(): void {\n // Only continue loop if actively playing (not buffering/paused/etc)\n if (this._state !== 'playing') {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n return;\n }\n\n this.rafId = requestAnimationFrame(async () => {\n // Check state again after async boundary\n if (this._state !== 'playing') {\n return;\n }\n\n this.updateTime();\n\n await this.renderCurrentFrame();\n\n // Check if still playing after render (might have entered buffering)\n if (this._state !== 'playing') {\n return;\n }\n\n // Calculate FPS based on actual frame timing\n const now = performance.now();\n if (this.lastFrameTime > 0) {\n const deltaTime = now - this.lastFrameTime;\n const instantFps = 1000 / deltaTime;\n this.fps = this.fps > 0 ? this.fps * 0.9 + instantFps * 0.1 : instantFps;\n }\n this.lastFrameTime = now;\n\n this.frameCount++;\n\n this.playbackLoop();\n });\n }\n\n private updateTime(): void {\n const elapsed = (performance.now() - this.startTime) * this.playbackRate;\n const rawTimeUs = elapsed * 1000;\n const fps = this.orchestrator.compositionModel?.fps;\n this._currentTimeUs = quantizeTimestampToFrame(rawTimeUs, 0, fps, 'nearest');\n\n // Check if reached end\n if (this._currentTimeUs >= this.duration) {\n if (this.loop) {\n this._currentTimeUs = 0;\n this.startTime = performance.now();\n } else {\n this._currentTimeUs = this.duration;\n this.pause();\n this._state = 'ended';\n this.eventBus.emit(MeframeEvent.PlaybackEnded, { timeUs: this._currentTimeUs });\n }\n }\n\n // Emit time update\n this.eventBus.emit(MeframeEvent.PlaybackTimeUpdate, { timeUs: this._currentTimeUs });\n }\n\n private async renderCurrentFrame(timeUs?: TimeUs): Promise<void> {\n try {\n const targetTime = timeUs ?? this._currentTimeUs;\n const rcFrame = await this.orchestrator.renderFrame(targetTime);\n\n if (!rcFrame) {\n // Cache miss during playback - trigger buffering\n if (this._state === 'playing') {\n await this.handlePlaybackBuffering(targetTime);\n }\n return;\n }\n\n await rcFrame.use((frame) => {\n // Ensure high quality rendering for every frame\n this.ctx.imageSmoothingEnabled = true;\n this.ctx.imageSmoothingQuality = 'high';\n this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);\n });\n } catch (error) {\n console.error('Render error:', error);\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n }\n }\n\n private async handlePlaybackBuffering(timeUs: TimeUs): Promise<void> {\n // Prevent duplicate buffering requests\n if (this.isBuffering) {\n return;\n }\n\n // Pause the playback loop\n const wasPlaying = this._state === 'playing';\n if (!wasPlaying) return;\n\n this.isBuffering = true;\n this._state = 'buffering';\n this.eventBus.emit(MeframeEvent.PlaybackBuffering);\n\n try {\n // Ensure clip cache for current time\n await this.orchestrator.ensureClipCache(timeUs);\n\n // Wait for minimum frames (smaller buffer for clip transitions)\n const ready = await this.orchestrator.waitForClipReady(timeUs, {\n minFrameCount: 15, // 0.5s @30fps - faster resume\n timeoutMs: 2_000,\n });\n\n if (!ready) {\n console.warn('[PlaybackController] Buffering timeout during playback');\n }\n\n // Resume playback\n this._state = 'playing';\n this.startTime = performance.now() - timeUs / 1000 / this.playbackRate;\n this.eventBus.emit(MeframeEvent.PlaybackPlay);\n\n // Restart playback loop\n if (!this.rafId) {\n this.playbackLoop();\n }\n } catch (error) {\n console.error('[PlaybackController] Buffering error:', error);\n this._state = 'paused';\n this.eventBus.emit(MeframeEvent.PlaybackError, error as Error);\n } finally {\n this.isBuffering = false;\n }\n }\n\n private clampTime(timeUs: TimeUs): TimeUs {\n return Math.max(0, Math.min(timeUs, this.duration));\n }\n\n // Cleanup\n dispose(): void {\n this.stop();\n }\n\n private async ensureAudioContext(): Promise<void> {\n if (this.audioContext) {\n return;\n }\n\n this.audioContext = new AudioContext();\n this.audioGainNode = this.audioContext.createGain();\n this.audioGainNode.gain.value = this.volume;\n this.audioGainNode.connect(this.audioContext.destination);\n }\n\n private startAudioPlayback(): void {\n if (!this.audioContext || !this.audioSession || !this.audioGainNode) {\n return;\n }\n\n this.stopAudioPlayback();\n\n const startUs = this._currentTimeUs;\n\n this.audioSession\n .ensureMixedPCM(startUs)\n .then((audioBuffer) => {\n if (!audioBuffer || !this.audioContext || !this.audioGainNode) {\n return;\n }\n\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.playbackRate.value = this.playbackRate;\n source.onended = () => {\n this.audioSource = null;\n if (this._state === 'playing') {\n this.startAudioPlayback();\n }\n };\n\n source.connect(this.audioGainNode);\n source.start();\n this.audioSource = source;\n })\n .catch((error) => {\n console.error('[PlaybackController] Audio playback error:', error);\n });\n }\n\n private stopAudioPlayback(): void {\n if (this.audioSource) {\n try {\n this.audioSource.stop();\n } catch (error) {\n console.warn('[PlaybackController] stop audio failed', error);\n }\n this.audioSource.disconnect();\n this.audioSource = null;\n }\n }\n}\n"],"names":[],"mappings":";;AAWO,MAAM,mBAAkD;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA,iBAAyB;AAAA,EACzB,SAAwB;AAAA,EACxB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,OAAO;AAAA;AAAA,EAGP,QAAuB;AAAA,EACvB,YAAY;AAAA;AAAA,EAGZ,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,eAAoC;AAAA,EACpC,cAA4C;AAAA,EAC5C,gBAAiC;AAAA,EACjC,eAA0C;AAAA;AAAA,EAG1C,cAAc;AAAA,EAEtB,YAAY,cAA4B,UAAqB,SAA0B;AACrF,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,SAAS,QAAQ;AAGtB,UAAM,MAAM,KAAK,OAAO,WAAW,MAAM;AAAA,MACvC,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY;AAAA,IAAA,CACN;AACR,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,SAAK,MAAM;AAGX,SAAK,IAAI,wBAAwB;AACjC,SAAK,IAAI,wBAAwB;AAGjC,QAAI,QAAQ,YAAY,QAAW;AACjC,WAAK,iBAAiB,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,SAAS,QAAW;AAC9B,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAEA,QAAI,QAAQ,SAAS,QAAW;AAC9B,WAAK,OAAO,QAAQ;AAAA,IACtB;AAEA,QAAI,QAAQ,WAAW;AACrB,WAAK,KAAA;AAAA,IACP;AAEA,SAAK,eAAA;AAAA,EACP;AAAA;AAAA,EAGA,OAAa;AACX,QAAI,KAAK,WAAW,UAAW;AAE/B,SAAK,KAAK,cAAA;AAAA,EACZ;AAAA,EAEA,MAAc,gBAA+B;AAC3C,UAAM,UAAU,KAAK,WAAW;AAEhC,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,aAAa,iBAAiB;AAEjD,QAAI;AACF,YAAM,KAAK,aAAa,gBAAgB,KAAK,cAAc;AAE3D,YAAM,QAAQ,MAAM,KAAK,aAAa,iBAAiB,KAAK,gBAAgB;AAAA,QAC1E,eAAe;AAAA,QACf,WAAW;AAAA,MAAA,CACZ;AAED,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,yDAAyD;AAAA,MACxE;AAEA,WAAK,SAAS;AACd,WAAK,YAAY,YAAY,IAAA,IAAQ,KAAK,iBAAiB,MAAO,KAAK;AACvE,YAAM,KAAK,mBAAA;AACX,WAAK,mBAAA;AACL,WAAK,aAAA;AAEL,WAAK,SAAS,KAAK,aAAa,YAAY;AAAA,IAC9C,SAAS,OAAO;AACd,cAAQ,MAAM,kDAAkD,KAAK;AACrE,WAAK,SAAS,UAAU,SAAS;AACjC,WAAK,SAAS,KAAK,aAAa,eAAe,KAAc;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,WAAW,UAAW;AAE/B,SAAK,SAAS;AAEd,QAAI,KAAK,UAAU,MAAM;AACvB,2BAAqB,KAAK,KAAK;AAC/B,WAAK,QAAQ;AAAA,IACf;AAEA,SAAK,kBAAA;AAEL,SAAK,SAAS,KAAK,aAAa,aAAa;AAAA,EAC/C;AAAA,EAEA,OAAa;AACX,SAAK,MAAA;AACL,SAAK,iBAAiB;AACtB,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,gBAAgB;AACrB,SAAK,MAAM;AAGX,SAAK,IAAI,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM;AAE9D,SAAK,cAAc,MAAA;AACnB,SAAK,kBAAA;AAEL,SAAK,SAAS,KAAK,aAAa,YAAY;AAAA,EAC9C;AAAA,EAEA,MAAM,KAAK,QAA+B;AACxC,UAAM,aAAa,KAAK,WAAW;AACnC,UAAM,gBAAgB,KAAK;AAE3B,QAAI,YAAY;AACd,WAAK,MAAA;AAAA,IACP;AAEA,UAAM,UAAU,KAAK,UAAU,MAAM;AACrC,SAAK,iBAAiB;AAEtB,SAAK,SAAS;AACd,SAAK,kBAAA;AAEL,QAAI;AACF,YAAM,KAAK,aAAa,gBAAgB,OAAO;AAE/C,YAAM,QAAQ,MAAM,KAAK,aAAa,iBAAiB,SAAS;AAAA,QAC9D,eAAe;AAAA,QACf,WAAW;AAAA,MAAA,CACZ;AAED,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,6CAA6C;AAAA,MAC5D;AAEA,YAAM,KAAK,mBAAmB,OAAO;AACrC,WAAK,SAAS,KAAK,aAAa,cAAc,EAAE,QAAQ,KAAK,gBAAgB;AAAA,IAC/E,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AACvD,WAAK,SAAS,KAAK,aAAa,eAAe,KAAc;AAAA,IAC/D,UAAA;AACE,UAAI,YAAY;AACd,aAAK,SAAS;AACd,aAAK,YAAY,YAAY,IAAA,IAAQ,KAAK,iBAAiB,MAAO,KAAK;AACvE,cAAM,KAAK,mBAAA;AACX,aAAK,mBAAA;AACL,YAAI,CAAC,KAAK,OAAO;AACf,eAAK,aAAA;AAAA,QACP;AAAA,MACF,OAAO;AACL,aAAK,SAAS,kBAAkB,SAAS,SAAS;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,MAAoB;AAE1B,UAAM,UAAU,YAAY,IAAA,IAAQ,KAAK;AACzC,SAAK,eAAe;AACpB,SAAK,YAAY,YAAY,IAAA,IAAQ,UAAU;AAE/C,SAAK,SAAS,KAAK,aAAa,oBAAoB,EAAE,MAAM;AAE5D,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,aAAa,QAAQ,KAAK;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AAC7C,SAAK,SAAS,KAAK,aAAa,sBAAsB,EAAE,QAAQ,KAAK,QAAQ;AAE7E,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK,QAAQ,KAAK;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,QAAQ,OAAsB;AAC5B,QAAI,OAAO;AACT,WAAK,kBAAA;AAAA,IACP,WAAW,KAAK,WAAW,WAAW;AACpC,WAAK,mBAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,QAAQ,MAAqB;AAC3B,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,cAAsB;AACxB,QAAI,KAAK,WAAW,WAAW;AAC7B,YAAM,WAAW,YAAY,IAAA,IAAQ,KAAK,aAAa,KAAK;AAC5D,WAAK,iBAAiB,KAAK,IAAI,UAAU,KAAM,KAAK,QAAQ;AAAA,IAC9D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAmB;AACrB,UAAM,gBAAgB,KAAK,aAAa,kBAAkB;AAC1D,QAAI,kBAAkB,QAAW;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,gBAAgB,SAAmC;AACjD,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,KAAA;AAAA,EACP;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,aAAa,GAAG,aAAa,YAAY,CAAC,UAAU;AACvD,WAAK,mBAAmB,MAAM,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGQ,eAAqB;AAE3B,QAAI,KAAK,WAAW,WAAW;AAC7B,UAAI,KAAK,UAAU,MAAM;AACvB,6BAAqB,KAAK,KAAK;AAC/B,aAAK,QAAQ;AAAA,MACf;AACA;AAAA,IACF;AAEA,SAAK,QAAQ,sBAAsB,YAAY;AAE7C,UAAI,KAAK,WAAW,WAAW;AAC7B;AAAA,MACF;AAEA,WAAK,WAAA;AAEL,YAAM,KAAK,mBAAA;AAGX,UAAI,KAAK,WAAW,WAAW;AAC7B;AAAA,MACF;AAGA,YAAM,MAAM,YAAY,IAAA;AACxB,UAAI,KAAK,gBAAgB,GAAG;AAC1B,cAAM,YAAY,MAAM,KAAK;AAC7B,cAAM,aAAa,MAAO;AAC1B,aAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM,aAAa,MAAM;AAAA,MAChE;AACA,WAAK,gBAAgB;AAErB,WAAK;AAEL,WAAK,aAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,aAAmB;AACzB,UAAM,WAAW,YAAY,IAAA,IAAQ,KAAK,aAAa,KAAK;AAC5D,UAAM,YAAY,UAAU;AAC5B,UAAM,MAAM,KAAK,aAAa,kBAAkB;AAChD,SAAK,iBAAiB,yBAAyB,WAAW,GAAG,KAAK,SAAS;AAG3E,QAAI,KAAK,kBAAkB,KAAK,UAAU;AACxC,UAAI,KAAK,MAAM;AACb,aAAK,iBAAiB;AACtB,aAAK,YAAY,YAAY,IAAA;AAAA,MAC/B,OAAO;AACL,aAAK,iBAAiB,KAAK;AAC3B,aAAK,MAAA;AACL,aAAK,SAAS;AACd,aAAK,SAAS,KAAK,aAAa,eAAe,EAAE,QAAQ,KAAK,gBAAgB;AAAA,MAChF;AAAA,IACF;AAGA,SAAK,SAAS,KAAK,aAAa,oBAAoB,EAAE,QAAQ,KAAK,gBAAgB;AAAA,EACrF;AAAA,EAEA,MAAc,mBAAmB,QAAgC;AAC/D,QAAI;AACF,YAAM,aAAa,UAAU,KAAK;AAClC,YAAM,UAAU,MAAM,KAAK,aAAa,YAAY,UAAU;AAE9D,UAAI,CAAC,SAAS;AAEZ,YAAI,KAAK,WAAW,WAAW;AAC7B,gBAAM,KAAK,wBAAwB,UAAU;AAAA,QAC/C;AACA;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,CAAC,UAAU;AAE3B,aAAK,IAAI,wBAAwB;AACjC,aAAK,IAAI,wBAAwB;AACjC,aAAK,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM;AAAA,MACvE,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,iBAAiB,KAAK;AACpC,WAAK,SAAS,KAAK,aAAa,eAAe,KAAc;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAc,wBAAwB,QAA+B;AAEnE,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,WAAW;AACnC,QAAI,CAAC,WAAY;AAEjB,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,aAAa,iBAAiB;AAEjD,QAAI;AAEF,YAAM,KAAK,aAAa,gBAAgB,MAAM;AAG9C,YAAM,QAAQ,MAAM,KAAK,aAAa,iBAAiB,QAAQ;AAAA,QAC7D,eAAe;AAAA;AAAA,QACf,WAAW;AAAA,MAAA,CACZ;AAED,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,wDAAwD;AAAA,MACvE;AAGA,WAAK,SAAS;AACd,WAAK,YAAY,YAAY,IAAA,IAAQ,SAAS,MAAO,KAAK;AAC1D,WAAK,SAAS,KAAK,aAAa,YAAY;AAG5C,UAAI,CAAC,KAAK,OAAO;AACf,aAAK,aAAA;AAAA,MACP;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,WAAK,SAAS;AACd,WAAK,SAAS,KAAK,aAAa,eAAe,KAAc;AAAA,IAC/D,UAAA;AACE,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,UAAU,QAAwB;AACxC,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,KAAK,QAAQ,CAAC;AAAA,EACpD;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,MAAc,qBAAoC;AAChD,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AAEA,SAAK,eAAe,IAAI,aAAA;AACxB,SAAK,gBAAgB,KAAK,aAAa,WAAA;AACvC,SAAK,cAAc,KAAK,QAAQ,KAAK;AACrC,SAAK,cAAc,QAAQ,KAAK,aAAa,WAAW;AAAA,EAC1D;AAAA,EAEQ,qBAA2B;AACjC,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,gBAAgB,CAAC,KAAK,eAAe;AACnE;AAAA,IACF;AAEA,SAAK,kBAAA;AAEL,UAAM,UAAU,KAAK;AAErB,SAAK,aACF,eAAe,OAAO,EACtB,KAAK,CAAC,gBAAgB;AACrB,UAAI,CAAC,eAAe,CAAC,KAAK,gBAAgB,CAAC,KAAK,eAAe;AAC7D;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,aAAa,mBAAA;AACjC,aAAO,SAAS;AAChB,aAAO,aAAa,QAAQ,KAAK;AACjC,aAAO,UAAU,MAAM;AACrB,aAAK,cAAc;AACnB,YAAI,KAAK,WAAW,WAAW;AAC7B,eAAK,mBAAA;AAAA,QACP;AAAA,MACF;AAEA,aAAO,QAAQ,KAAK,aAAa;AACjC,aAAO,MAAA;AACP,WAAK,cAAc;AAAA,IACrB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,cAAQ,MAAM,8CAA8C,KAAK;AAAA,IACnE,CAAC;AAAA,EACL;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,aAAa;AACpB,UAAI;AACF,aAAK,YAAY,KAAA;AAAA,MACnB,SAAS,OAAO;AACd,gBAAQ,KAAK,0CAA0C,KAAK;AAAA,MAC9D;AACA,WAAK,YAAY,WAAA;AACjB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AACF;"}
@@ -1,5 +1,6 @@
1
- import { IPreRenderService, RenderStrategy, PreRenderStatus, IOrchestratorForControl } from './types';
1
+ import { IPreRenderService, RenderStrategy, PreRenderStatus } from './types';
2
2
  import { TimeUs } from '../model/types';
3
+ import { Orchestrator } from '../orchestrator';
3
4
 
4
5
  /**
5
6
  * Simplified background pre-render service for 3-Clip strategy
@@ -14,7 +15,7 @@ export declare class PreRenderService implements IPreRenderService {
14
15
  private _framesRendered;
15
16
  private _currentTimeUs;
16
17
  private strategy;
17
- constructor(orchestrator: IOrchestratorForControl, _eventBus: any);
18
+ constructor(orchestrator: Orchestrator, _eventBus: any);
18
19
  start(): void;
19
20
  stop(): void;
20
21
  pause(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"PreRenderService.d.ts","sourceRoot":"","sources":["../../src/controllers/PreRenderService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,uBAAuB,EACxB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,QAAQ,CAKd;gBAEU,YAAY,EAAE,uBAAuB,EAAE,SAAS,EAAE,GAAG;IAIjE,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IASZ,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAIpD,WAAW,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI;IAIvD,UAAU,IAAI,IAAI;IAIlB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAItE,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,MAAM,IAAI,eAAe,CAO5B;IAED,OAAO,CAAC,kBAAkB;YAYZ,UAAU;CASzB"}
1
+ {"version":3,"file":"PreRenderService.d.ts","sourceRoot":"","sources":["../../src/controllers/PreRenderService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,QAAQ,CAKd;gBAEU,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG;IAItD,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IASZ,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAIpD,WAAW,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI;IAIvD,UAAU,IAAI,IAAI;IAIlB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAItE,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,MAAM,IAAI,eAAe,CAO5B;IAED,OAAO,CAAC,kBAAkB;YAYZ,UAAU;CASzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"PreRenderService.js","sources":["../../src/controllers/PreRenderService.ts"],"sourcesContent":["import type {\n IPreRenderService,\n RenderStrategy,\n PreRenderStatus,\n IOrchestratorForControl,\n} from './types';\nimport type { TimeUs } from '../model/types';\n\n/**\n * Simplified background pre-render service for 3-Clip strategy\n *\n * In the 3-Clip strategy, ClipFetchQueue already handles Prev/Current/Next caching.\n * This service is kept minimal for compatibility but does minimal work.\n */\nexport class PreRenderService implements IPreRenderService {\n private orchestrator: IOrchestratorForControl;\n private _isRunning = false;\n private renderLoopId: number | null = null;\n private _framesRendered = 0;\n private _currentTimeUs: TimeUs = 0;\n private strategy: RenderStrategy = {\n direction: 'forward',\n lookahead: 3_000_000,\n lookbehind: 2_000_000,\n keyframesOnly: false,\n };\n\n constructor(orchestrator: IOrchestratorForControl, _eventBus: any) {\n this.orchestrator = orchestrator;\n }\n\n start(): void {\n if (this._isRunning) return;\n this._isRunning = true;\n this.scheduleNextRender();\n }\n\n stop(): void {\n this._isRunning = false;\n\n if (this.renderLoopId !== null) {\n cancelIdleCallback(this.renderLoopId);\n this.renderLoopId = null;\n }\n }\n\n pause(): void {\n this.stop();\n }\n\n resume(): void {\n this.start();\n }\n\n setWindow(size: TimeUs): void {\n this.strategy.lookahead = size;\n }\n\n setStrategy(strategy: Partial<RenderStrategy>): void {\n this.strategy = { ...this.strategy, ...strategy };\n }\n\n setPriority(_priority: 'low' | 'normal' | 'high'): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n clearQueue(): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n queueRange(_startUs: TimeUs, _endUs: TimeUs, _priority?: number): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n updatePlaybackTime(timeUs: TimeUs): void {\n this._currentTimeUs = timeUs;\n }\n\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n get queueSize(): number {\n return 0;\n }\n\n get status(): PreRenderStatus {\n return {\n isRunning: this._isRunning,\n framesRendered: this._framesRendered,\n queueSize: 0,\n currentTimeUs: this._currentTimeUs,\n };\n }\n\n private scheduleNextRender(): void {\n if (!this._isRunning) return;\n\n this.renderLoopId = requestIdleCallback(\n async () => {\n await this.renderTick();\n this.scheduleNextRender();\n },\n { timeout: 100 }\n );\n }\n\n private async renderTick(): Promise<void> {\n if (!this._isRunning || !this.orchestrator.compositionModel) {\n return;\n }\n\n // In 3-Clip strategy, just ensure clips are cached\n // ClipFetchQueue handles the actual fetching\n await this.orchestrator.ensureClipCache(this._currentTimeUs);\n }\n}\n"],"names":[],"mappings":"AAcO,MAAM,iBAA8C;AAAA,EACjD;AAAA,EACA,aAAa;AAAA,EACb,eAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,iBAAyB;AAAA,EACzB,WAA2B;AAAA,IACjC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,EAAA;AAAA,EAGjB,YAAY,cAAuC,WAAgB;AACjE,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,WAAY;AACrB,SAAK,aAAa;AAClB,SAAK,mBAAA;AAAA,EACP;AAAA,EAEA,OAAa;AACX,SAAK,aAAa;AAElB,QAAI,KAAK,iBAAiB,MAAM;AAC9B,yBAAmB,KAAK,YAAY;AACpC,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,SAAe;AACb,SAAK,MAAA;AAAA,EACP;AAAA,EAEA,UAAU,MAAoB;AAC5B,SAAK,SAAS,YAAY;AAAA,EAC5B;AAAA,EAEA,YAAY,UAAyC;AACnD,SAAK,WAAW,EAAE,GAAG,KAAK,UAAU,GAAG,SAAA;AAAA,EACzC;AAAA,EAEA,YAAY,WAA4C;AAAA,EAExD;AAAA,EAEA,aAAmB;AAAA,EAEnB;AAAA,EAEA,WAAW,UAAkB,QAAgB,WAA0B;AAAA,EAEvE;AAAA,EAEA,mBAAmB,QAAsB;AACvC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAA0B;AAC5B,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,gBAAgB,KAAK;AAAA,MACrB,WAAW;AAAA,MACX,eAAe,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEQ,qBAA2B;AACjC,QAAI,CAAC,KAAK,WAAY;AAEtB,SAAK,eAAe;AAAA,MAClB,YAAY;AACV,cAAM,KAAK,WAAA;AACX,aAAK,mBAAA;AAAA,MACP;AAAA,MACA,EAAE,SAAS,IAAA;AAAA,IAAI;AAAA,EAEnB;AAAA,EAEA,MAAc,aAA4B;AACxC,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,aAAa,kBAAkB;AAC3D;AAAA,IACF;AAIA,UAAM,KAAK,aAAa,gBAAgB,KAAK,cAAc;AAAA,EAC7D;AACF;"}
1
+ {"version":3,"file":"PreRenderService.js","sources":["../../src/controllers/PreRenderService.ts"],"sourcesContent":["import type { IPreRenderService, RenderStrategy, PreRenderStatus } from './types';\nimport type { TimeUs } from '../model/types';\nimport type { Orchestrator } from '../orchestrator';\n\n/**\n * Simplified background pre-render service for 3-Clip strategy\n *\n * In the 3-Clip strategy, ClipFetchQueue already handles Prev/Current/Next caching.\n * This service is kept minimal for compatibility but does minimal work.\n */\nexport class PreRenderService implements IPreRenderService {\n private orchestrator: Orchestrator;\n private _isRunning = false;\n private renderLoopId: number | null = null;\n private _framesRendered = 0;\n private _currentTimeUs: TimeUs = 0;\n private strategy: RenderStrategy = {\n direction: 'forward',\n lookahead: 3_000_000,\n lookbehind: 2_000_000,\n keyframesOnly: false,\n };\n\n constructor(orchestrator: Orchestrator, _eventBus: any) {\n this.orchestrator = orchestrator;\n }\n\n start(): void {\n if (this._isRunning) return;\n this._isRunning = true;\n this.scheduleNextRender();\n }\n\n stop(): void {\n this._isRunning = false;\n\n if (this.renderLoopId !== null) {\n cancelIdleCallback(this.renderLoopId);\n this.renderLoopId = null;\n }\n }\n\n pause(): void {\n this.stop();\n }\n\n resume(): void {\n this.start();\n }\n\n setWindow(size: TimeUs): void {\n this.strategy.lookahead = size;\n }\n\n setStrategy(strategy: Partial<RenderStrategy>): void {\n this.strategy = { ...this.strategy, ...strategy };\n }\n\n setPriority(_priority: 'low' | 'normal' | 'high'): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n clearQueue(): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n queueRange(_startUs: TimeUs, _endUs: TimeUs, _priority?: number): void {\n // Simplified - no-op for 3-Clip strategy\n }\n\n updatePlaybackTime(timeUs: TimeUs): void {\n this._currentTimeUs = timeUs;\n }\n\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n get queueSize(): number {\n return 0;\n }\n\n get status(): PreRenderStatus {\n return {\n isRunning: this._isRunning,\n framesRendered: this._framesRendered,\n queueSize: 0,\n currentTimeUs: this._currentTimeUs,\n };\n }\n\n private scheduleNextRender(): void {\n if (!this._isRunning) return;\n\n this.renderLoopId = requestIdleCallback(\n async () => {\n await this.renderTick();\n this.scheduleNextRender();\n },\n { timeout: 100 }\n );\n }\n\n private async renderTick(): Promise<void> {\n if (!this._isRunning || !this.orchestrator.compositionModel) {\n return;\n }\n\n // In 3-Clip strategy, just ensure clips are cached\n // ClipFetchQueue handles the actual fetching\n await this.orchestrator.ensureClipCache(this._currentTimeUs);\n }\n}\n"],"names":[],"mappings":"AAUO,MAAM,iBAA8C;AAAA,EACjD;AAAA,EACA,aAAa;AAAA,EACb,eAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,iBAAyB;AAAA,EACzB,WAA2B;AAAA,IACjC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,eAAe;AAAA,EAAA;AAAA,EAGjB,YAAY,cAA4B,WAAgB;AACtD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,WAAY;AACrB,SAAK,aAAa;AAClB,SAAK,mBAAA;AAAA,EACP;AAAA,EAEA,OAAa;AACX,SAAK,aAAa;AAElB,QAAI,KAAK,iBAAiB,MAAM;AAC9B,yBAAmB,KAAK,YAAY;AACpC,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,SAAe;AACb,SAAK,MAAA;AAAA,EACP;AAAA,EAEA,UAAU,MAAoB;AAC5B,SAAK,SAAS,YAAY;AAAA,EAC5B;AAAA,EAEA,YAAY,UAAyC;AACnD,SAAK,WAAW,EAAE,GAAG,KAAK,UAAU,GAAG,SAAA;AAAA,EACzC;AAAA,EAEA,YAAY,WAA4C;AAAA,EAExD;AAAA,EAEA,aAAmB;AAAA,EAEnB;AAAA,EAEA,WAAW,UAAkB,QAAgB,WAA0B;AAAA,EAEvE;AAAA,EAEA,mBAAmB,QAAsB;AACvC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAA0B;AAC5B,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,gBAAgB,KAAK;AAAA,MACrB,WAAW;AAAA,MACX,eAAe,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EAEQ,qBAA2B;AACjC,QAAI,CAAC,KAAK,WAAY;AAEtB,SAAK,eAAe;AAAA,MAClB,YAAY;AACV,cAAM,KAAK,WAAA;AACX,aAAK,mBAAA;AAAA,MACP;AAAA,MACA,EAAE,SAAS,IAAA;AAAA,IAAI;AAAA,EAEnB;AAAA,EAEA,MAAc,aAA4B;AACxC,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,aAAa,kBAAkB;AAC3D;AAAA,IACF;AAIA,UAAM,KAAK,aAAa,gBAAgB,KAAK,cAAc;AAAA,EAC7D;AACF;"}
@@ -16,7 +16,9 @@ export declare class PreviewHandleImpl implements PreviewHandle {
16
16
  pause(): void;
17
17
  resume(): void;
18
18
  stop(): void;
19
+ setVolume(volume: number): void;
19
20
  get currentTimeUs(): TimeUs;
21
+ get isPlaying(): boolean;
20
22
  on(event: string, handler: Function): void;
21
23
  off(event: string, handler: Function): void;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewHandle.d.ts","sourceRoot":"","sources":["../../src/controllers/PreviewHandle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC;IAK/E,IAAI,IAAI,IAAI;IAIZ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,IAAI,IAAI,IAAI;IAIZ,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAI1C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;CAG5C"}
1
+ {"version":3,"file":"PreviewHandle.d.ts","sourceRoot":"","sources":["../../src/controllers/PreviewHandle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC;IAK/E,IAAI,IAAI,IAAI;IAIZ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,IAAI,IAAI,IAAI;IAIZ,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAI1C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;CAG5C"}
@@ -23,9 +23,15 @@ class PreviewHandleImpl {
23
23
  stop() {
24
24
  this.controller.stop();
25
25
  }
26
+ setVolume(volume) {
27
+ this.controller.setVolume(volume);
28
+ }
26
29
  get currentTimeUs() {
27
30
  return this.controller.currentTime;
28
31
  }
32
+ get isPlaying() {
33
+ return this.controller.playing;
34
+ }
29
35
  on(event, handler) {
30
36
  this.eventBus.on(event, handler);
31
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewHandle.js","sources":["../../src/controllers/PreviewHandle.ts"],"sourcesContent":["/**\n * PreviewHandle: Implementation of preview playback control handle\n */\n\nimport type { PreviewHandle, TimeUs } from './types';\nimport type { PlaybackController } from './PlaybackController';\nimport type { EventBus } from '../event/EventBus';\nimport type { EventPayloadMap } from '../event/events';\n\n/**\n * PreviewHandle implementation for playback control\n */\nexport class PreviewHandleImpl implements PreviewHandle {\n private controller: PlaybackController;\n private eventBus: EventBus<EventPayloadMap>;\n\n constructor(controller: PlaybackController, eventBus: EventBus<EventPayloadMap>) {\n this.controller = controller;\n this.eventBus = eventBus;\n }\n\n play(): void {\n this.controller.play();\n }\n\n seek(timeUs: TimeUs): void {\n this.controller.seek(timeUs);\n }\n\n setRate(rate: number): void {\n this.controller.setRate(rate);\n }\n\n pause(): void {\n this.controller.pause();\n }\n\n resume(): void {\n this.controller.resume();\n }\n\n stop(): void {\n this.controller.stop();\n }\n\n get currentTimeUs(): TimeUs {\n return this.controller.currentTime;\n }\n\n on(event: string, handler: Function): void {\n this.eventBus.on(event as any, handler as any);\n }\n\n off(event: string, handler: Function): void {\n this.eventBus.off(event as any, handler as any);\n }\n}\n"],"names":[],"mappings":"AAYO,MAAM,kBAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EAER,YAAY,YAAgC,UAAqC;AAC/E,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAa;AACX,SAAK,WAAW,KAAA;AAAA,EAClB;AAAA,EAEA,KAAK,QAAsB;AACzB,SAAK,WAAW,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,WAAW,QAAQ,IAAI;AAAA,EAC9B;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,MAAA;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,SAAK,WAAW,OAAA;AAAA,EAClB;AAAA,EAEA,OAAa;AACX,SAAK,WAAW,KAAA;AAAA,EAClB;AAAA,EAEA,IAAI,gBAAwB;AAC1B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,GAAG,OAAe,SAAyB;AACzC,SAAK,SAAS,GAAG,OAAc,OAAc;AAAA,EAC/C;AAAA,EAEA,IAAI,OAAe,SAAyB;AAC1C,SAAK,SAAS,IAAI,OAAc,OAAc;AAAA,EAChD;AACF;"}
1
+ {"version":3,"file":"PreviewHandle.js","sources":["../../src/controllers/PreviewHandle.ts"],"sourcesContent":["/**\n * PreviewHandle: Implementation of preview playback control handle\n */\n\nimport type { PreviewHandle, TimeUs } from './types';\nimport type { PlaybackController } from './PlaybackController';\nimport type { EventBus } from '../event/EventBus';\nimport type { EventPayloadMap } from '../event/events';\n\n/**\n * PreviewHandle implementation for playback control\n */\nexport class PreviewHandleImpl implements PreviewHandle {\n private controller: PlaybackController;\n private eventBus: EventBus<EventPayloadMap>;\n\n constructor(controller: PlaybackController, eventBus: EventBus<EventPayloadMap>) {\n this.controller = controller;\n this.eventBus = eventBus;\n }\n\n play(): void {\n this.controller.play();\n }\n\n seek(timeUs: TimeUs): void {\n this.controller.seek(timeUs);\n }\n\n setRate(rate: number): void {\n this.controller.setRate(rate);\n }\n\n pause(): void {\n this.controller.pause();\n }\n\n resume(): void {\n this.controller.resume();\n }\n\n stop(): void {\n this.controller.stop();\n }\n\n setVolume(volume: number): void {\n this.controller.setVolume(volume);\n }\n\n get currentTimeUs(): TimeUs {\n return this.controller.currentTime;\n }\n\n get isPlaying(): boolean {\n return this.controller.playing;\n }\n\n on(event: string, handler: Function): void {\n this.eventBus.on(event as any, handler as any);\n }\n\n off(event: string, handler: Function): void {\n this.eventBus.off(event as any, handler as any);\n }\n}\n"],"names":[],"mappings":"AAYO,MAAM,kBAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EAER,YAAY,YAAgC,UAAqC;AAC/E,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAa;AACX,SAAK,WAAW,KAAA;AAAA,EAClB;AAAA,EAEA,KAAK,QAAsB;AACzB,SAAK,WAAW,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,WAAW,QAAQ,IAAI;AAAA,EAC9B;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,MAAA;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,SAAK,WAAW,OAAA;AAAA,EAClB;AAAA,EAEA,OAAa;AACX,SAAK,WAAW,KAAA;AAAA,EAClB;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,WAAW,UAAU,MAAM;AAAA,EAClC;AAAA,EAEA,IAAI,gBAAwB;AAC1B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,GAAG,OAAe,SAAyB;AACzC,SAAK,SAAS,GAAG,OAAc,OAAc;AAAA,EAC/C;AAAA,EAEA,IAAI,OAAe,SAAyB;AAC1C,SAAK,SAAS,IAAI,OAAc,OAAc;AAAA,EAChD;AACF;"}
@@ -4,5 +4,5 @@
4
4
  export { PlaybackController } from './PlaybackController';
5
5
  export { PreRenderService } from './PreRenderService';
6
6
  export { PreRenderTaskQueue } from './PreRenderTaskQueue';
7
- export type { IPreRenderService, RenderStrategy, PreRenderStatus, RenderTask, IPlaybackController, PlaybackState, PlaybackEvent, PlaybackOptions, PreviewHandle, TimeRange, PrioritizedClip, IOrchestratorForControl, IEventBus, FrameStats, } from './types';
7
+ export type { IPreRenderService, RenderStrategy, PreRenderStatus, RenderTask, IPlaybackController, PlaybackState, PlaybackEvent, PlaybackOptions, PreviewHandle, TimeRange, PrioritizedClip, IEventBus, FrameStats, } from './types';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAEV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EAGV,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EAGb,SAAS,EACT,eAAe,EAGf,uBAAuB,EAGvB,SAAS,EAGT,UAAU,GACX,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAEV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EAGV,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EAGb,SAAS,EACT,eAAe,EAGf,SAAS,EAGT,UAAU,GACX,MAAM,SAAS,CAAC"}
@@ -1,8 +1,6 @@
1
1
  import { TimeUs } from '../model/types';
2
- import { RcFrame } from '../model';
3
2
  import { EventBus } from '../event/EventBus';
4
3
  import { EventPayloadMap } from '../event/events';
5
- import { RenderFrameOptions } from '../orchestrator/types';
6
4
 
7
5
  export type { TimeUs } from '../model/types';
8
6
  export interface IPreRenderService {
@@ -65,10 +63,12 @@ export interface PreviewHandle {
65
63
  play(): void;
66
64
  seek(timeUs: TimeUs): void;
67
65
  setRate(rate: number): void;
66
+ setVolume(volume: number): void;
68
67
  pause(): void;
69
68
  resume(): void;
70
69
  stop(): void;
71
70
  readonly currentTimeUs: TimeUs;
71
+ readonly isPlaying: boolean;
72
72
  on(event: string, handler: Function): void;
73
73
  off(event: string, handler: Function): void;
74
74
  }
@@ -82,16 +82,6 @@ export interface PrioritizedClip {
82
82
  endUs: TimeUs;
83
83
  priority: number;
84
84
  }
85
- export interface IOrchestratorForControl {
86
- renderFrame(timeUs: TimeUs, options?: RenderFrameOptions): Promise<RcFrame | null>;
87
- ensureClipCache(timeUs: TimeUs): Promise<void>;
88
- waitForClipReady(timeUs: TimeUs, options?: {
89
- minFrameCount?: number;
90
- timeoutMs?: number;
91
- }): Promise<boolean>;
92
- readonly compositionModel: any;
93
- readonly cacheManager: any;
94
- }
95
85
  export type IEventBus = EventBus<EventPayloadMap>;
96
86
  export interface FrameStats {
97
87
  timeUs: TimeUs;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/controllers/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/controllers/types.ts"],"names":[],"mappings":"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"}
@@ -40,12 +40,7 @@ export declare enum MeframeEvent {
40
40
  CacheMiss = "cache:miss",
41
41
  CacheEvict = "cache:evict",
42
42
  CacheWrite = "cache:write",
43
- CachePinCreated = "cache:pin:created",
44
- CachePinReleased = "cache:pin:released",
45
- CachePinOverflow = "cache:pin:overflow",
46
- CacheCapacityChanged = "cache:capacity:changed",
47
- CachePlaybackWindowBlocked = "cache:playbackWindow:blocked",
48
- CachePrerenderWindowBlocked = "cache:prerenderWindow:blocked",
43
+ CacheCover = "cache:cover",
49
44
  ExportStart = "export:start",
50
45
  ExportProgress = "export:progress",
51
46
  ExportComplete = "export:complete",
@@ -202,60 +197,11 @@ export interface EventPayloadMap {
202
197
  level: 'L1' | 'L2';
203
198
  size: number;
204
199
  };
205
- [MeframeEvent.CachePinCreated]: {
200
+ [MeframeEvent.CacheCover]: {
206
201
  clipId: string;
207
- startUs: TimeUs;
208
- endUs: TimeUs;
209
- source: 'playback' | 'prerender' | 'export';
210
- tokenId: string;
211
- window: {
212
- startUs: TimeUs;
213
- endUs: TimeUs;
214
- };
215
- };
216
- [MeframeEvent.CachePinReleased]: {
217
- clipId: string;
218
- startUs: TimeUs;
219
- endUs: TimeUs;
220
- source: 'playback' | 'prerender' | 'export';
221
- tokenId: string;
222
- reason: 'manual' | 'timeout';
223
- window: {
224
- startUs: TimeUs;
225
- endUs: TimeUs;
226
- };
227
- };
228
- [MeframeEvent.CachePinOverflow]: {
229
- required: number;
230
- maxAllowed: number;
231
- clipId: string;
232
- source: 'playback' | 'prerender' | 'export';
233
- window: {
234
- startUs: TimeUs;
235
- endUs: TimeUs;
236
- };
237
- };
238
- [MeframeEvent.CacheCapacityChanged]: {
239
- l1: {
240
- maxMemoryMB: number;
241
- maxGOPs: number;
242
- };
243
- };
244
- [MeframeEvent.CachePlaybackWindowBlocked]: {
245
- clipId: string;
246
- window: {
247
- startUs: TimeUs;
248
- endUs: TimeUs;
249
- };
250
- reason: 'pinned' | 'memory' | 'inflight';
251
- };
252
- [MeframeEvent.CachePrerenderWindowBlocked]: {
253
- clipId: string;
254
- window: {
255
- startUs: TimeUs;
256
- endUs: TimeUs;
257
- };
258
- reason: 'pinned' | 'memory' | 'inflight';
202
+ timeUs: TimeUs;
203
+ level: 'L1' | 'L2';
204
+ size: number;
259
205
  };
260
206
  [MeframeEvent.ExportStart]: {
261
207
  format: string;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/event/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/event/events.ts"],"names":[],"mappings":"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"}
@@ -27,12 +27,7 @@ var MeframeEvent = /* @__PURE__ */ ((MeframeEvent2) => {
27
27
  MeframeEvent2["CacheMiss"] = "cache:miss";
28
28
  MeframeEvent2["CacheEvict"] = "cache:evict";
29
29
  MeframeEvent2["CacheWrite"] = "cache:write";
30
- MeframeEvent2["CachePinCreated"] = "cache:pin:created";
31
- MeframeEvent2["CachePinReleased"] = "cache:pin:released";
32
- MeframeEvent2["CachePinOverflow"] = "cache:pin:overflow";
33
- MeframeEvent2["CacheCapacityChanged"] = "cache:capacity:changed";
34
- MeframeEvent2["CachePlaybackWindowBlocked"] = "cache:playbackWindow:blocked";
35
- MeframeEvent2["CachePrerenderWindowBlocked"] = "cache:prerenderWindow:blocked";
30
+ MeframeEvent2["CacheCover"] = "cache:cover";
36
31
  MeframeEvent2["ExportStart"] = "export:start";
37
32
  MeframeEvent2["ExportProgress"] = "export:progress";
38
33
  MeframeEvent2["ExportComplete"] = "export:complete";
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sources":["../../src/event/events.ts"],"sourcesContent":["/**\n * Core event definitions for the Meframe engine\n * These are public events exposed to plugins and external components\n */\n\nimport { CompositionModel, Resource, type TimeUs } from '../model';\n\nexport interface ResourceEvent {\n type: MeframeEvent;\n resourceId: string;\n resource?: Resource;\n oldState?: Resource['state'];\n newState?: Resource['state'];\n workerType?: string;\n}\n\n/**\n * Core event types\n */\nexport enum MeframeEvent {\n // Composition model events\n ModelSet = 'model:set',\n\n // Resource events\n ResourceAdd = 'resource:add',\n ResourceUpdate = 'resource:update',\n ResourceRemove = 'resource:remove',\n ResourceStageChange = 'resource:state',\n\n // Load stage events\n LoadStart = 'load:start',\n LoadProgress = 'load:progress',\n LoadComplete = 'load:complete',\n LoadError = 'load:error',\n\n // Demux stage events\n DemuxStart = 'demux:start',\n DemuxProgress = 'demux:progress',\n DemuxComplete = 'demux:complete',\n DemuxError = 'demux:error',\n\n // Decode stage events\n DecodeStart = 'decode:start',\n DecodeProgress = 'decode:progress',\n DecodeComplete = 'decode:complete',\n DecodeError = 'decode:error',\n\n // Compose stage events\n ComposeStart = 'compose:start',\n ComposeProgress = 'compose:progress',\n ComposeComplete = 'compose:complete',\n\n // Composition frame events (L1 cache)\n ComposeFrameReady = 'compose:frameReady',\n ComposeFrameDropped = 'compose:frameDropped',\n\n // Encode events (L2 cache)\n EncodeChunkReady = 'encode:chunkReady',\n EncodeChunkError = 'encode:chunkError',\n\n // Cache events\n CacheHit = 'cache:hit',\n CacheMiss = 'cache:miss',\n CacheEvict = 'cache:evict',\n CacheWrite = 'cache:write',\n CachePinCreated = 'cache:pin:created',\n CachePinReleased = 'cache:pin:released',\n CachePinOverflow = 'cache:pin:overflow',\n CacheCapacityChanged = 'cache:capacity:changed',\n CachePlaybackWindowBlocked = 'cache:playbackWindow:blocked',\n CachePrerenderWindowBlocked = 'cache:prerenderWindow:blocked',\n\n // Export events\n ExportStart = 'export:start',\n ExportProgress = 'export:progress',\n ExportComplete = 'export:complete',\n ExportError = 'export:error',\n\n // Composition model events\n CompositionUpdated = 'composition:updated',\n PatchApplied = 'patch:applied',\n Ready = 'ready',\n\n // Worker events\n WorkerStarted = 'worker:started',\n WorkerReady = 'worker:ready',\n WorkerError = 'worker:error',\n WorkerRestarted = 'worker:restarted',\n\n // Playback events\n PlaybackBuffering = 'playback:buffering',\n PlaybackPlay = 'playback:play',\n PlaybackPause = 'playback:pause',\n PlaybackStop = 'playback:stop',\n PlaybackSeek = 'playback:seek',\n PlaybackEnded = 'playback:ended',\n PlaybackTimeUpdate = 'playback:timeupdate',\n PlaybackRateChange = 'playback:ratechange',\n PlaybackVolumeChange = 'playback:volumechange',\n PlaybackError = 'playback:error',\n PlaybackStarted = 'playback:started',\n PlaybackPaused = 'playback:paused',\n PlaybackSeeked = 'playback:seeked',\n\n // General error event\n Error = 'error',\n\n // Plugin events\n PluginLoaded = 'plugin:loaded',\n PluginError = 'plugin:error',\n PluginUnloaded = 'plugin:unloaded',\n\n // Clip lifecycle events\n ClipActivated = 'clip:activated',\n ClipDeactivated = 'clip:deactivated',\n}\n\n/**\n * Event payload definitions\n */\nexport interface EventPayloadMap {\n // Composition model events\n [MeframeEvent.ModelSet]: CompositionModel;\n\n // Resource events\n [MeframeEvent.ResourceAdd]: ResourceEvent;\n [MeframeEvent.ResourceUpdate]: ResourceEvent;\n [MeframeEvent.ResourceRemove]: ResourceEvent;\n [MeframeEvent.ResourceStageChange]: ResourceEvent;\n\n // Load events\n [MeframeEvent.LoadStart]: {\n resourceId: string;\n url: string;\n size?: number;\n };\n\n [MeframeEvent.LoadProgress]: {\n resourceId: string;\n loaded: number;\n total: number;\n progress: number;\n };\n\n [MeframeEvent.LoadComplete]: {\n resourceId: string;\n bytes: number;\n durationMs: number;\n };\n\n [MeframeEvent.LoadError]: {\n resourceId: string;\n error: Error;\n retry?: boolean;\n };\n\n // Demux events\n [MeframeEvent.DemuxStart]: {\n clipId: string;\n trackId?: string;\n format?: string;\n };\n\n [MeframeEvent.DemuxProgress]: {\n clipId: string;\n progress: number;\n };\n\n [MeframeEvent.DemuxComplete]: {\n clipId: string;\n trackCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.DemuxError]: {\n clipId: string;\n error: Error;\n };\n\n // Decode events\n [MeframeEvent.DecodeStart]: {\n clipId: string;\n frameCount?: number;\n trackType: 'video' | 'audio';\n };\n\n [MeframeEvent.DecodeProgress]: {\n clipId: string;\n decodedFrames: number;\n totalFrames: number;\n progress: number;\n };\n\n [MeframeEvent.DecodeComplete]: {\n clipId: string;\n frameCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.DecodeError]: {\n clipId: string;\n error: Error;\n frame?: number;\n };\n\n // Compose events\n [MeframeEvent.ComposeStart]: {\n timeUs: TimeUs;\n clipIds: string[];\n };\n\n [MeframeEvent.ComposeProgress]: {\n timeUs: TimeUs;\n progress: number;\n };\n\n [MeframeEvent.ComposeComplete]: {\n timeUs: TimeUs;\n frameNumber: number;\n };\n\n // Composition frame events\n [MeframeEvent.ComposeFrameReady]: {\n timeUs: TimeUs;\n frameNumber: number;\n renderTimeMs: number;\n trackId: string;\n clipId: string;\n };\n\n [MeframeEvent.ComposeFrameDropped]: {\n timeUs: TimeUs;\n reason: 'decode_slow' | 'compose_slow' | 'backpressure';\n };\n\n // Encode events\n [MeframeEvent.EncodeChunkReady]: {\n timeUs: TimeUs;\n durationUs: TimeUs;\n track: 'video' | 'audio';\n size: number;\n };\n\n [MeframeEvent.EncodeChunkError]: {\n timeUs: TimeUs;\n track: 'video' | 'audio';\n error: Error;\n };\n\n // Cache events\n [MeframeEvent.CacheHit]: {\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n key?: string;\n };\n\n [MeframeEvent.CacheMiss]: {\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n key?: string;\n };\n\n [MeframeEvent.CacheEvict]: {\n clipId: string;\n count: number;\n level: 'L1' | 'L2';\n reason: 'size' | 'ttl' | 'manual';\n };\n\n [MeframeEvent.CacheWrite]: {\n clipId: string;\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n size: number;\n };\n [MeframeEvent.CachePinCreated]: {\n clipId: string;\n startUs: TimeUs;\n endUs: TimeUs;\n source: 'playback' | 'prerender' | 'export';\n tokenId: string;\n window: { startUs: TimeUs; endUs: TimeUs };\n };\n [MeframeEvent.CachePinReleased]: {\n clipId: string;\n startUs: TimeUs;\n endUs: TimeUs;\n source: 'playback' | 'prerender' | 'export';\n tokenId: string;\n reason: 'manual' | 'timeout';\n window: { startUs: TimeUs; endUs: TimeUs };\n };\n [MeframeEvent.CachePinOverflow]: {\n required: number;\n maxAllowed: number;\n clipId: string;\n source: 'playback' | 'prerender' | 'export';\n window: { startUs: TimeUs; endUs: TimeUs };\n };\n [MeframeEvent.CacheCapacityChanged]: {\n l1: {\n maxMemoryMB: number;\n maxGOPs: number;\n };\n };\n [MeframeEvent.CachePlaybackWindowBlocked]: {\n clipId: string;\n window: { startUs: TimeUs; endUs: TimeUs };\n reason: 'pinned' | 'memory' | 'inflight';\n };\n [MeframeEvent.CachePrerenderWindowBlocked]: {\n clipId: string;\n window: { startUs: TimeUs; endUs: TimeUs };\n reason: 'pinned' | 'memory' | 'inflight';\n };\n\n // Export events\n [MeframeEvent.ExportStart]: {\n format: string;\n width: number;\n height: number;\n fps: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.ExportProgress]: {\n progress: number;\n currentFrame: number;\n totalFrames: number;\n timeUs: TimeUs;\n };\n\n [MeframeEvent.ExportComplete]: {\n size: number;\n durationMs: number;\n format: string;\n };\n\n [MeframeEvent.ExportError]: {\n error: Error;\n stage?: string;\n };\n\n // Composition events\n [MeframeEvent.CompositionUpdated]: {\n trackCount: number;\n clipCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.PatchApplied]: {\n operations: number;\n dirtyRanges: Array<{ startUs: TimeUs; endUs: TimeUs }>;\n };\n\n [MeframeEvent.Ready]: {\n trackCount: number;\n clipCount: number;\n durationUs: TimeUs;\n };\n\n // Worker events\n [MeframeEvent.WorkerStarted]: {\n type: string;\n workerId: string;\n };\n\n [MeframeEvent.WorkerReady]: {\n type: string;\n workerId: string;\n };\n\n [MeframeEvent.WorkerError]: {\n type: string;\n workerId: string;\n error: Error;\n };\n\n [MeframeEvent.WorkerRestarted]: {\n type: string;\n workerId: string;\n reason: string;\n };\n\n // Playback events\n [MeframeEvent.PlaybackBuffering]: undefined;\n\n [MeframeEvent.PlaybackPlay]: undefined;\n\n [MeframeEvent.PlaybackPause]: undefined;\n\n [MeframeEvent.PlaybackStop]: undefined;\n\n [MeframeEvent.PlaybackSeek]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackStarted]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackPaused]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackSeeked]: {\n fromUs: TimeUs;\n toUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackEnded]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackTimeUpdate]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackRateChange]: {\n rate: number;\n };\n\n [MeframeEvent.PlaybackVolumeChange]: {\n volume: number;\n };\n\n [MeframeEvent.PlaybackError]: Error;\n\n // Error event\n [MeframeEvent.Error]: {\n source: string;\n error: Error;\n context?: any;\n recoverable?: boolean;\n };\n\n // Plugin events\n [MeframeEvent.PluginLoaded]: {\n name: string;\n version?: string;\n };\n\n [MeframeEvent.PluginError]: {\n plugin: string;\n error: Error;\n };\n\n [MeframeEvent.PluginUnloaded]: {\n name: string;\n };\n\n // Clip events\n [MeframeEvent.ClipActivated]: {\n clipId: string;\n };\n\n [MeframeEvent.ClipDeactivated]: {\n clipId: string;\n };\n}\n"],"names":["MeframeEvent"],"mappings":"AAmBO,IAAK,iCAAAA,kBAAL;AAELA,gBAAA,UAAA,IAAW;AAGXA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,qBAAA,IAAsB;AAGtBA,gBAAA,WAAA,IAAY;AACZA,gBAAA,cAAA,IAAe;AACfA,gBAAA,cAAA,IAAe;AACfA,gBAAA,WAAA,IAAY;AAGZA,gBAAA,YAAA,IAAa;AACbA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,YAAA,IAAa;AAGbA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,aAAA,IAAc;AAGdA,gBAAA,cAAA,IAAe;AACfA,gBAAA,iBAAA,IAAkB;AAClBA,gBAAA,iBAAA,IAAkB;AAGlBA,gBAAA,mBAAA,IAAoB;AACpBA,gBAAA,qBAAA,IAAsB;AAGtBA,gBAAA,kBAAA,IAAmB;AACnBA,gBAAA,kBAAA,IAAmB;AAGnBA,gBAAA,UAAA,IAAW;AACXA,gBAAA,WAAA,IAAY;AACZA,gBAAA,YAAA,IAAa;AACbA,gBAAA,YAAA,IAAa;AACbA,gBAAA,iBAAA,IAAkB;AAClBA,gBAAA,kBAAA,IAAmB;AACnBA,gBAAA,kBAAA,IAAmB;AACnBA,gBAAA,sBAAA,IAAuB;AACvBA,gBAAA,4BAAA,IAA6B;AAC7BA,gBAAA,6BAAA,IAA8B;AAG9BA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,aAAA,IAAc;AAGdA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,OAAA,IAAQ;AAGRA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,aAAA,IAAc;AACdA,gBAAA,aAAA,IAAc;AACdA,gBAAA,iBAAA,IAAkB;AAGlBA,gBAAA,mBAAA,IAAoB;AACpBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,cAAA,IAAe;AACfA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,sBAAA,IAAuB;AACvBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,iBAAA,IAAkB;AAClBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AAGjBA,gBAAA,OAAA,IAAQ;AAGRA,gBAAA,cAAA,IAAe;AACfA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AAGjBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,iBAAA,IAAkB;AA/FR,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"events.js","sources":["../../src/event/events.ts"],"sourcesContent":["/**\n * Core event definitions for the Meframe engine\n * These are public events exposed to plugins and external components\n */\n\nimport { CompositionModel, Resource, type TimeUs } from '../model';\n\nexport interface ResourceEvent {\n type: MeframeEvent;\n resourceId: string;\n resource?: Resource;\n oldState?: Resource['state'];\n newState?: Resource['state'];\n workerType?: string;\n}\n\n/**\n * Core event types\n */\nexport enum MeframeEvent {\n // Composition model events\n ModelSet = 'model:set',\n\n // Resource events\n ResourceAdd = 'resource:add',\n ResourceUpdate = 'resource:update',\n ResourceRemove = 'resource:remove',\n ResourceStageChange = 'resource:state',\n\n // Load stage events\n LoadStart = 'load:start',\n LoadProgress = 'load:progress',\n LoadComplete = 'load:complete',\n LoadError = 'load:error',\n\n // Demux stage events\n DemuxStart = 'demux:start',\n DemuxProgress = 'demux:progress',\n DemuxComplete = 'demux:complete',\n DemuxError = 'demux:error',\n\n // Decode stage events\n DecodeStart = 'decode:start',\n DecodeProgress = 'decode:progress',\n DecodeComplete = 'decode:complete',\n DecodeError = 'decode:error',\n\n // Compose stage events\n ComposeStart = 'compose:start',\n ComposeProgress = 'compose:progress',\n ComposeComplete = 'compose:complete',\n\n // Composition frame events (L1 cache)\n ComposeFrameReady = 'compose:frameReady',\n ComposeFrameDropped = 'compose:frameDropped',\n\n // Encode events (L2 cache)\n EncodeChunkReady = 'encode:chunkReady',\n EncodeChunkError = 'encode:chunkError',\n\n // Cache events\n CacheHit = 'cache:hit',\n CacheMiss = 'cache:miss',\n CacheEvict = 'cache:evict',\n CacheWrite = 'cache:write',\n CacheCover = 'cache:cover',\n\n // Export events\n ExportStart = 'export:start',\n ExportProgress = 'export:progress',\n ExportComplete = 'export:complete',\n ExportError = 'export:error',\n\n // Composition model events\n CompositionUpdated = 'composition:updated',\n PatchApplied = 'patch:applied',\n Ready = 'ready',\n\n // Worker events\n WorkerStarted = 'worker:started',\n WorkerReady = 'worker:ready',\n WorkerError = 'worker:error',\n WorkerRestarted = 'worker:restarted',\n\n // Playback events\n PlaybackBuffering = 'playback:buffering',\n PlaybackPlay = 'playback:play',\n PlaybackPause = 'playback:pause',\n PlaybackStop = 'playback:stop',\n PlaybackSeek = 'playback:seek',\n PlaybackEnded = 'playback:ended',\n PlaybackTimeUpdate = 'playback:timeupdate',\n PlaybackRateChange = 'playback:ratechange',\n PlaybackVolumeChange = 'playback:volumechange',\n PlaybackError = 'playback:error',\n PlaybackStarted = 'playback:started',\n PlaybackPaused = 'playback:paused',\n PlaybackSeeked = 'playback:seeked',\n\n // General error event\n Error = 'error',\n\n // Plugin events\n PluginLoaded = 'plugin:loaded',\n PluginError = 'plugin:error',\n PluginUnloaded = 'plugin:unloaded',\n\n // Clip lifecycle events\n ClipActivated = 'clip:activated',\n ClipDeactivated = 'clip:deactivated',\n}\n\n/**\n * Event payload definitions\n */\nexport interface EventPayloadMap {\n // Composition model events\n [MeframeEvent.ModelSet]: CompositionModel;\n\n // Resource events\n [MeframeEvent.ResourceAdd]: ResourceEvent;\n [MeframeEvent.ResourceUpdate]: ResourceEvent;\n [MeframeEvent.ResourceRemove]: ResourceEvent;\n [MeframeEvent.ResourceStageChange]: ResourceEvent;\n\n // Load events\n [MeframeEvent.LoadStart]: {\n resourceId: string;\n url: string;\n size?: number;\n };\n\n [MeframeEvent.LoadProgress]: {\n resourceId: string;\n loaded: number;\n total: number;\n progress: number;\n };\n\n [MeframeEvent.LoadComplete]: {\n resourceId: string;\n bytes: number;\n durationMs: number;\n };\n\n [MeframeEvent.LoadError]: {\n resourceId: string;\n error: Error;\n retry?: boolean;\n };\n\n // Demux events\n [MeframeEvent.DemuxStart]: {\n clipId: string;\n trackId?: string;\n format?: string;\n };\n\n [MeframeEvent.DemuxProgress]: {\n clipId: string;\n progress: number;\n };\n\n [MeframeEvent.DemuxComplete]: {\n clipId: string;\n trackCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.DemuxError]: {\n clipId: string;\n error: Error;\n };\n\n // Decode events\n [MeframeEvent.DecodeStart]: {\n clipId: string;\n frameCount?: number;\n trackType: 'video' | 'audio';\n };\n\n [MeframeEvent.DecodeProgress]: {\n clipId: string;\n decodedFrames: number;\n totalFrames: number;\n progress: number;\n };\n\n [MeframeEvent.DecodeComplete]: {\n clipId: string;\n frameCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.DecodeError]: {\n clipId: string;\n error: Error;\n frame?: number;\n };\n\n // Compose events\n [MeframeEvent.ComposeStart]: {\n timeUs: TimeUs;\n clipIds: string[];\n };\n\n [MeframeEvent.ComposeProgress]: {\n timeUs: TimeUs;\n progress: number;\n };\n\n [MeframeEvent.ComposeComplete]: {\n timeUs: TimeUs;\n frameNumber: number;\n };\n\n // Composition frame events\n [MeframeEvent.ComposeFrameReady]: {\n timeUs: TimeUs;\n frameNumber: number;\n renderTimeMs: number;\n trackId: string;\n clipId: string;\n };\n\n [MeframeEvent.ComposeFrameDropped]: {\n timeUs: TimeUs;\n reason: 'decode_slow' | 'compose_slow' | 'backpressure';\n };\n\n // Encode events\n [MeframeEvent.EncodeChunkReady]: {\n timeUs: TimeUs;\n durationUs: TimeUs;\n track: 'video' | 'audio';\n size: number;\n };\n\n [MeframeEvent.EncodeChunkError]: {\n timeUs: TimeUs;\n track: 'video' | 'audio';\n error: Error;\n };\n\n // Cache events\n [MeframeEvent.CacheHit]: {\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n key?: string;\n };\n\n [MeframeEvent.CacheMiss]: {\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n key?: string;\n };\n\n [MeframeEvent.CacheEvict]: {\n clipId: string;\n count: number;\n level: 'L1' | 'L2';\n reason: 'size' | 'ttl' | 'manual';\n };\n\n [MeframeEvent.CacheWrite]: {\n clipId: string;\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n size: number;\n };\n [MeframeEvent.CacheCover]: {\n clipId: string;\n timeUs: TimeUs;\n level: 'L1' | 'L2';\n size: number;\n };\n\n // Export events\n [MeframeEvent.ExportStart]: {\n format: string;\n width: number;\n height: number;\n fps: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.ExportProgress]: {\n progress: number;\n currentFrame: number;\n totalFrames: number;\n timeUs: TimeUs;\n };\n\n [MeframeEvent.ExportComplete]: {\n size: number;\n durationMs: number;\n format: string;\n };\n\n [MeframeEvent.ExportError]: {\n error: Error;\n stage?: string;\n };\n\n // Composition events\n [MeframeEvent.CompositionUpdated]: {\n trackCount: number;\n clipCount: number;\n durationUs: TimeUs;\n };\n\n [MeframeEvent.PatchApplied]: {\n operations: number;\n dirtyRanges: Array<{ startUs: TimeUs; endUs: TimeUs }>;\n };\n\n [MeframeEvent.Ready]: {\n trackCount: number;\n clipCount: number;\n durationUs: TimeUs;\n };\n\n // Worker events\n [MeframeEvent.WorkerStarted]: {\n type: string;\n workerId: string;\n };\n\n [MeframeEvent.WorkerReady]: {\n type: string;\n workerId: string;\n };\n\n [MeframeEvent.WorkerError]: {\n type: string;\n workerId: string;\n error: Error;\n };\n\n [MeframeEvent.WorkerRestarted]: {\n type: string;\n workerId: string;\n reason: string;\n };\n\n // Playback events\n [MeframeEvent.PlaybackBuffering]: undefined;\n\n [MeframeEvent.PlaybackPlay]: undefined;\n\n [MeframeEvent.PlaybackPause]: undefined;\n\n [MeframeEvent.PlaybackStop]: undefined;\n\n [MeframeEvent.PlaybackSeek]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackStarted]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackPaused]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackSeeked]: {\n fromUs: TimeUs;\n toUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackEnded]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackTimeUpdate]: {\n timeUs: TimeUs;\n };\n\n [MeframeEvent.PlaybackRateChange]: {\n rate: number;\n };\n\n [MeframeEvent.PlaybackVolumeChange]: {\n volume: number;\n };\n\n [MeframeEvent.PlaybackError]: Error;\n\n // Error event\n [MeframeEvent.Error]: {\n source: string;\n error: Error;\n context?: any;\n recoverable?: boolean;\n };\n\n // Plugin events\n [MeframeEvent.PluginLoaded]: {\n name: string;\n version?: string;\n };\n\n [MeframeEvent.PluginError]: {\n plugin: string;\n error: Error;\n };\n\n [MeframeEvent.PluginUnloaded]: {\n name: string;\n };\n\n // Clip events\n [MeframeEvent.ClipActivated]: {\n clipId: string;\n };\n\n [MeframeEvent.ClipDeactivated]: {\n clipId: string;\n };\n}\n"],"names":["MeframeEvent"],"mappings":"AAmBO,IAAK,iCAAAA,kBAAL;AAELA,gBAAA,UAAA,IAAW;AAGXA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,qBAAA,IAAsB;AAGtBA,gBAAA,WAAA,IAAY;AACZA,gBAAA,cAAA,IAAe;AACfA,gBAAA,cAAA,IAAe;AACfA,gBAAA,WAAA,IAAY;AAGZA,gBAAA,YAAA,IAAa;AACbA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,YAAA,IAAa;AAGbA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,aAAA,IAAc;AAGdA,gBAAA,cAAA,IAAe;AACfA,gBAAA,iBAAA,IAAkB;AAClBA,gBAAA,iBAAA,IAAkB;AAGlBA,gBAAA,mBAAA,IAAoB;AACpBA,gBAAA,qBAAA,IAAsB;AAGtBA,gBAAA,kBAAA,IAAmB;AACnBA,gBAAA,kBAAA,IAAmB;AAGnBA,gBAAA,UAAA,IAAW;AACXA,gBAAA,WAAA,IAAY;AACZA,gBAAA,YAAA,IAAa;AACbA,gBAAA,YAAA,IAAa;AACbA,gBAAA,YAAA,IAAa;AAGbA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,aAAA,IAAc;AAGdA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,OAAA,IAAQ;AAGRA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,aAAA,IAAc;AACdA,gBAAA,aAAA,IAAc;AACdA,gBAAA,iBAAA,IAAkB;AAGlBA,gBAAA,mBAAA,IAAoB;AACpBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,cAAA,IAAe;AACfA,gBAAA,cAAA,IAAe;AACfA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,oBAAA,IAAqB;AACrBA,gBAAA,sBAAA,IAAuB;AACvBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,iBAAA,IAAkB;AAClBA,gBAAA,gBAAA,IAAiB;AACjBA,gBAAA,gBAAA,IAAiB;AAGjBA,gBAAA,OAAA,IAAQ;AAGRA,gBAAA,cAAA,IAAe;AACfA,gBAAA,aAAA,IAAc;AACdA,gBAAA,gBAAA,IAAiB;AAGjBA,gBAAA,eAAA,IAAgB;AAChBA,gBAAA,iBAAA,IAAkB;AA1FR,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;"}
@@ -121,9 +121,8 @@ ${errors.map((e) => `${e.path}: ${e.message}`).join("\n")}`
121
121
  * Returns array of unique clip IDs (Prev/Current/Next)
122
122
  */
123
123
  getClipsToCacheAtTime(timeUs) {
124
- const { prev, current, next } = this.getNeighboringClips(timeUs);
124
+ const { current, next } = this.getNeighboringClips(timeUs);
125
125
  const clipIds = [];
126
- if (prev) clipIds.push(prev);
127
126
  if (current) clipIds.push(current);
128
127
  if (next) clipIds.push(next);
129
128
  return Array.from(new Set(clipIds));
@@ -1 +1 @@
1
- {"version":3,"file":"CompositionModel.js","sources":["../../src/model/CompositionModel.ts"],"sourcesContent":["import { CompositionModelData, Track, Clip, Resource, TimeUs } from './types';\nimport { binarySearchRange, binarySearchOverlapping } from '../utils/binary-search';\nimport { validateCompositionStructure } from './validation';\n\nexport class CompositionModel {\n public readonly version = '1.0' as const;\n public readonly fps: 24 | 25 | 30 | 60;\n public durationUs: TimeUs;\n public readonly tracks: Track[];\n public readonly resources: Map<string, Resource>;\n\n private readonly trackMap: Map<string, Track>;\n private readonly clipMap: Map<string, Clip>;\n private readonly resourceRefCount: Map<string, number>;\n\n public readonly renderConfig?: {\n width: number;\n height: number;\n backgroundColor?: string;\n };\n\n public readonly ext?: Record<string, unknown>;\n\n constructor(data: CompositionModelData) {\n const errors = validateCompositionStructure(data);\n if (errors.length > 0) {\n throw new Error(\n `Validation failed:\\n${errors.map((e) => `${e.path}: ${e.message}`).join('\\n')}`\n );\n }\n\n this.fps = data.fps;\n this.tracks = data.tracks;\n this.resources = new Map(Object.entries(data.resources));\n this.renderConfig = data.renderConfig;\n this.ext = data.ext;\n\n // Build indexes\n this.trackMap = new Map();\n this.clipMap = new Map();\n this.resourceRefCount = new Map();\n\n this.buildIndexes();\n this.durationUs = this.calculateDuration();\n }\n\n // Track operations\n findTrack(id: string): Track | null {\n return this.trackMap.get(id) || null;\n }\n\n getTracksByKind(kind: 'video' | 'audio' | 'caption' | 'fx'): Track[] {\n return this.tracks.filter((track) => track.kind === kind);\n }\n\n // Clip operations with binary search optimization\n findClip(id: string): Clip | null {\n return this.clipMap.get(id) || null;\n }\n\n getClipsAtTime(timeUs: TimeUs, trackId?: string): Clip[] {\n const tracks = trackId ? [this.findTrack(trackId)] : this.tracks;\n const clips: Clip[] = [];\n\n for (const track of tracks) {\n if (!track) continue;\n // Use binary search for single point lookup\n const clip = binarySearchRange(track.clips, timeUs, (entry) => ({\n start: entry.startUs,\n end: entry.startUs + entry.durationUs,\n }));\n\n if (clip) {\n clips.push(clip);\n }\n }\n\n return clips;\n }\n\n getActiveClips(startUs: TimeUs, endUs: TimeUs): Clip[] {\n const clips: Clip[] = [];\n\n for (const track of this.tracks) {\n // Use binary search for range overlap\n const overlappingClips = binarySearchOverlapping(track.clips, startUs, endUs, (clip) => ({\n start: clip.startUs,\n end: clip.startUs + clip.durationUs,\n }));\n\n clips.push(...overlappingClips);\n }\n\n return clips;\n }\n\n getClipIdsByResourceId(resourceId: string): string[] {\n const resource = this.resources.get(resourceId);\n return resource?.clipIds || [];\n }\n\n getClipIdAtTime(trackId: string, timeUs: TimeUs): string | undefined {\n const track = this.findTrack(trackId);\n if (!track) {\n return undefined;\n }\n\n const clip = binarySearchRange(track.clips, timeUs, (entry) => ({\n start: entry.startUs,\n end: entry.startUs + entry.durationUs,\n }));\n\n return clip?.id;\n }\n\n /**\n * Get neighboring clips (Prev/Current/Next) at a specific time for video tracks\n * Returns prev, current, and next clip IDs\n */\n getNeighboringClips(timeUs: TimeUs): { prev?: string; current?: string; next?: string } {\n const videoTracks = this.getTracksByKind('video');\n const result: { prev?: string; current?: string; next?: string } = {};\n\n for (const track of videoTracks) {\n const clips = track.clips;\n\n for (let i = 0; i < clips.length; i++) {\n const clip = clips[i];\n if (!clip) continue;\n\n const clipEndUs = clip.startUs + clip.durationUs;\n\n if (clip.startUs <= timeUs && timeUs < clipEndUs) {\n if (!result.current) {\n result.current = clip.id;\n }\n\n if (i > 0 && !result.prev) {\n const prevClip = clips[i - 1];\n if (prevClip) {\n result.prev = prevClip.id;\n }\n }\n\n if (i < clips.length - 1 && !result.next) {\n const nextClip = clips[i + 1];\n if (nextClip) {\n result.next = nextClip.id;\n }\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get all clip IDs that should be cached using 3-Clip strategy\n * Returns array of unique clip IDs (Prev/Current/Next)\n */\n getClipsToCacheAtTime(timeUs: TimeUs): string[] {\n const { prev, current, next } = this.getNeighboringClips(timeUs);\n const clipIds: string[] = [];\n\n if (prev) clipIds.push(prev);\n if (current) clipIds.push(current);\n if (next) clipIds.push(next);\n\n return Array.from(new Set(clipIds));\n }\n\n // Resource operations\n getResource(id: string): Resource | null {\n return this.resources.get(id) || null;\n }\n\n updateResourceState(id: string, state: 'pending' | 'loading' | 'ready' | 'error'): void {\n const resource = this.resources.get(id);\n if (resource) {\n resource.state = state;\n }\n }\n\n getUnusedResources(): Resource[] {\n const unused: Resource[] = [];\n\n for (const [id, resource] of this.resources) {\n if (!this.resourceRefCount.has(id) || this.resourceRefCount.get(id) === 0) {\n unused.push(resource);\n }\n }\n\n return unused;\n }\n\n // Time operations\n getDuration(): TimeUs {\n return this.durationUs;\n }\n\n getTrackDuration(trackId: string): TimeUs {\n const track = this.findTrack(trackId);\n if (!track || track.clips.length === 0) return 0;\n\n // Since clips are sorted, last clip determines duration\n const lastClip = track.clips[track.clips.length - 1];\n return (lastClip?.startUs ?? 0) + (lastClip?.durationUs ?? 0);\n }\n\n // Private methods\n private buildIndexes(): void {\n // Clear existing indexes\n this.trackMap.clear();\n this.clipMap.clear();\n this.resourceRefCount.clear();\n\n // Build track and clip indexes\n for (const track of this.tracks) {\n this.trackMap.set(track.id, track);\n\n for (const clip of track.clips) {\n (clip as Clip).trackId = track.id;\n (clip as Clip).trackKind = track.kind;\n this.clipMap.set(clip.id, clip);\n\n // Add clip id to resource\n const resource = this.resources.get(clip.resourceId);\n if (resource) {\n resource.clipIds = [...(resource.clipIds || []), clip.id];\n }\n // Count resource references\n const count = this.resourceRefCount.get(clip.resourceId) || 0;\n this.resourceRefCount.set(clip.resourceId, count + 1);\n }\n }\n\n // Sort clips by startUs within each track for binary search\n for (const track of this.tracks) {\n track.clips.sort((a, b) => a.startUs - b.startUs);\n }\n }\n\n private calculateDuration(): TimeUs {\n let maxEndUs = 0;\n\n for (const track of this.tracks) {\n const trackDuration = this.getTrackDuration(track.id);\n if (trackDuration > maxEndUs) {\n maxEndUs = trackDuration;\n }\n }\n\n return maxEndUs;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CompositionModel.js","sources":["../../src/model/CompositionModel.ts"],"sourcesContent":["import { CompositionModelData, Track, Clip, Resource, TimeUs } from './types';\nimport { binarySearchRange, binarySearchOverlapping } from '../utils/binary-search';\nimport { validateCompositionStructure } from './validation';\n\nexport class CompositionModel {\n public readonly version = '1.0' as const;\n public readonly fps: 24 | 25 | 30 | 60;\n public durationUs: TimeUs;\n public readonly tracks: Track[];\n public readonly resources: Map<string, Resource>;\n\n private readonly trackMap: Map<string, Track>;\n private readonly clipMap: Map<string, Clip>;\n private readonly resourceRefCount: Map<string, number>;\n\n public readonly renderConfig?: {\n width: number;\n height: number;\n backgroundColor?: string;\n };\n\n public readonly ext?: Record<string, unknown>;\n\n constructor(data: CompositionModelData) {\n const errors = validateCompositionStructure(data);\n if (errors.length > 0) {\n throw new Error(\n `Validation failed:\\n${errors.map((e) => `${e.path}: ${e.message}`).join('\\n')}`\n );\n }\n\n this.fps = data.fps;\n this.tracks = data.tracks;\n this.resources = new Map(Object.entries(data.resources));\n this.renderConfig = data.renderConfig;\n this.ext = data.ext;\n\n // Build indexes\n this.trackMap = new Map();\n this.clipMap = new Map();\n this.resourceRefCount = new Map();\n\n this.buildIndexes();\n this.durationUs = this.calculateDuration();\n }\n\n // Track operations\n findTrack(id: string): Track | null {\n return this.trackMap.get(id) || null;\n }\n\n getTracksByKind(kind: 'video' | 'audio' | 'caption' | 'fx'): Track[] {\n return this.tracks.filter((track) => track.kind === kind);\n }\n\n // Clip operations with binary search optimization\n findClip(id: string): Clip | null {\n return this.clipMap.get(id) || null;\n }\n\n getClipsAtTime(timeUs: TimeUs, trackId?: string): Clip[] {\n const tracks = trackId ? [this.findTrack(trackId)] : this.tracks;\n const clips: Clip[] = [];\n\n for (const track of tracks) {\n if (!track) continue;\n // Use binary search for single point lookup\n const clip = binarySearchRange(track.clips, timeUs, (entry) => ({\n start: entry.startUs,\n end: entry.startUs + entry.durationUs,\n }));\n\n if (clip) {\n clips.push(clip);\n }\n }\n\n return clips;\n }\n\n getActiveClips(startUs: TimeUs, endUs: TimeUs): Clip[] {\n const clips: Clip[] = [];\n\n for (const track of this.tracks) {\n // Use binary search for range overlap\n const overlappingClips = binarySearchOverlapping(track.clips, startUs, endUs, (clip) => ({\n start: clip.startUs,\n end: clip.startUs + clip.durationUs,\n }));\n\n clips.push(...overlappingClips);\n }\n\n return clips;\n }\n\n getClipIdsByResourceId(resourceId: string): string[] {\n const resource = this.resources.get(resourceId);\n return resource?.clipIds || [];\n }\n\n getClipIdAtTime(trackId: string, timeUs: TimeUs): string | undefined {\n const track = this.findTrack(trackId);\n if (!track) {\n return undefined;\n }\n\n const clip = binarySearchRange(track.clips, timeUs, (entry) => ({\n start: entry.startUs,\n end: entry.startUs + entry.durationUs,\n }));\n\n return clip?.id;\n }\n\n /**\n * Get neighboring clips (Prev/Current/Next) at a specific time for video tracks\n * Returns prev, current, and next clip IDs\n */\n getNeighboringClips(timeUs: TimeUs): { prev?: string; current?: string; next?: string } {\n const videoTracks = this.getTracksByKind('video');\n const result: { prev?: string; current?: string; next?: string } = {};\n\n for (const track of videoTracks) {\n const clips = track.clips;\n\n for (let i = 0; i < clips.length; i++) {\n const clip = clips[i];\n if (!clip) continue;\n\n const clipEndUs = clip.startUs + clip.durationUs;\n\n if (clip.startUs <= timeUs && timeUs < clipEndUs) {\n if (!result.current) {\n result.current = clip.id;\n }\n\n if (i > 0 && !result.prev) {\n const prevClip = clips[i - 1];\n if (prevClip) {\n result.prev = prevClip.id;\n }\n }\n\n if (i < clips.length - 1 && !result.next) {\n const nextClip = clips[i + 1];\n if (nextClip) {\n result.next = nextClip.id;\n }\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get all clip IDs that should be cached using 3-Clip strategy\n * Returns array of unique clip IDs (Prev/Current/Next)\n */\n getClipsToCacheAtTime(timeUs: TimeUs): string[] {\n const { current, next } = this.getNeighboringClips(timeUs);\n const clipIds: string[] = [];\n\n if (current) clipIds.push(current);\n if (next) clipIds.push(next);\n // if (prev) clipIds.push(prev);\n\n return Array.from(new Set(clipIds));\n }\n\n // Resource operations\n getResource(id: string): Resource | null {\n return this.resources.get(id) || null;\n }\n\n updateResourceState(id: string, state: 'pending' | 'loading' | 'ready' | 'error'): void {\n const resource = this.resources.get(id);\n if (resource) {\n resource.state = state;\n }\n }\n\n getUnusedResources(): Resource[] {\n const unused: Resource[] = [];\n\n for (const [id, resource] of this.resources) {\n if (!this.resourceRefCount.has(id) || this.resourceRefCount.get(id) === 0) {\n unused.push(resource);\n }\n }\n\n return unused;\n }\n\n // Time operations\n getDuration(): TimeUs {\n return this.durationUs;\n }\n\n getTrackDuration(trackId: string): TimeUs {\n const track = this.findTrack(trackId);\n if (!track || track.clips.length === 0) return 0;\n\n // Since clips are sorted, last clip determines duration\n const lastClip = track.clips[track.clips.length - 1];\n return (lastClip?.startUs ?? 0) + (lastClip?.durationUs ?? 0);\n }\n\n // Private methods\n private buildIndexes(): void {\n // Clear existing indexes\n this.trackMap.clear();\n this.clipMap.clear();\n this.resourceRefCount.clear();\n\n // Build track and clip indexes\n for (const track of this.tracks) {\n this.trackMap.set(track.id, track);\n\n for (const clip of track.clips) {\n (clip as Clip).trackId = track.id;\n (clip as Clip).trackKind = track.kind;\n this.clipMap.set(clip.id, clip);\n\n // Add clip id to resource\n const resource = this.resources.get(clip.resourceId);\n if (resource) {\n resource.clipIds = [...(resource.clipIds || []), clip.id];\n }\n // Count resource references\n const count = this.resourceRefCount.get(clip.resourceId) || 0;\n this.resourceRefCount.set(clip.resourceId, count + 1);\n }\n }\n\n // Sort clips by startUs within each track for binary search\n for (const track of this.tracks) {\n track.clips.sort((a, b) => a.startUs - b.startUs);\n }\n }\n\n private calculateDuration(): TimeUs {\n let maxEndUs = 0;\n\n for (const track of this.tracks) {\n const trackDuration = this.getTrackDuration(track.id);\n if (trackDuration > maxEndUs) {\n maxEndUs = trackDuration;\n }\n }\n\n return maxEndUs;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CompositionPlanner.d.ts","sourceRoot":"","sources":["../../src/orchestrator/CompositionPlanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,IAAI,EAKL,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACV,kBAAkB,EAQnB,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAcD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAKvC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAwB1D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIjC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAyB,GAAG,gBAAgB,GAAG,IAAI;IAiCvF,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE;IA6C9E,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,QAAQ;IAqBlE,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,8BAA8B;IAetC,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,gBAAgB;CAmBzB"}
1
+ {"version":3,"file":"CompositionPlanner.d.ts","sourceRoot":"","sources":["../../src/orchestrator/CompositionPlanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,IAAI,EAKL,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACV,kBAAkB,EAQnB,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAcD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAKvC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAwB1D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIjC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAyB,GAAG,gBAAgB,GAAG,IAAI;IAiCvF,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE;IA6C9E,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,QAAQ;IAqBlE,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,8BAA8B;IAetC,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,gBAAgB;CAmBzB"}
@@ -180,6 +180,7 @@ class CompositionPlanner {
180
180
  clipId: clip.id,
181
181
  trackId: clip.trackId ?? "main",
182
182
  clipStartUs: clip.startUs,
183
+ clipDurationUs: clip.durationUs,
183
184
  compositionFps: this.model?.fps ?? DEFAULT_COMPOSITION_FPS
184
185
  }
185
186
  };