mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
56 lines
1.2 KiB
TypeScript
56 lines
1.2 KiB
TypeScript
import type { SceneTracks, TimelineElement, VideoTrack } from "@/timeline";
|
|
import { type MediaTime, ZERO_MEDIA_TIME } from "@/wasm";
|
|
|
|
export const MAIN_TRACK_NAME = "Main Track";
|
|
|
|
export function getEarliestMainTrackElement({
|
|
mainTrack,
|
|
excludeElementId,
|
|
}: {
|
|
mainTrack: VideoTrack;
|
|
excludeElementId?: string;
|
|
}): TimelineElement | null {
|
|
const elements = mainTrack.elements.filter((element) => {
|
|
return !excludeElementId || element.id !== excludeElementId;
|
|
});
|
|
if (elements.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return elements.reduce((earliestElement, element) => {
|
|
return element.startTime < earliestElement.startTime
|
|
? element
|
|
: earliestElement;
|
|
});
|
|
}
|
|
|
|
export function enforceMainTrackStart({
|
|
tracks,
|
|
targetTrackId,
|
|
requestedStartTime,
|
|
excludeElementId,
|
|
}: {
|
|
tracks: SceneTracks;
|
|
targetTrackId: string;
|
|
requestedStartTime: MediaTime;
|
|
excludeElementId?: string;
|
|
}): MediaTime {
|
|
if (tracks.main.id !== targetTrackId) {
|
|
return requestedStartTime;
|
|
}
|
|
|
|
const earliestElement = getEarliestMainTrackElement({
|
|
mainTrack: tracks.main,
|
|
excludeElementId,
|
|
});
|
|
if (!earliestElement) {
|
|
return ZERO_MEDIA_TIME;
|
|
}
|
|
|
|
if (requestedStartTime <= earliestElement.startTime) {
|
|
return ZERO_MEDIA_TIME;
|
|
}
|
|
|
|
return requestedStartTime;
|
|
}
|