Files
Recordly/electron/ipc/nativeVideoExport.test.ts

94 lines
2.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
buildEditedTrackSourceAudioFilter,
buildTrimmedSourceAudioFilter,
} from "./nativeVideoExport";
describe("buildTrimmedSourceAudioFilter", () => {
it("concatenates trimmed source segments into a single output label", () => {
expect(
buildTrimmedSourceAudioFilter([
{ startMs: 0, endMs: 2_000 },
{ startMs: 4_000, endMs: 6_000 },
]),
).toBe(
"[1:a]atrim=start=0.000:end=2.000,asetpts=PTS-STARTPTS[trimmed_audio_0];" +
"[1:a]atrim=start=4.000:end=6.000,asetpts=PTS-STARTPTS[trimmed_audio_1];" +
"[trimmed_audio_0][trimmed_audio_1]concat=n=2:v=0:a=1[aout]",
);
});
});
describe("buildEditedTrackSourceAudioFilter", () => {
it("builds a concat filtergraph that pitch-shifts via asetrate for speed changes", () => {
const filter = buildEditedTrackSourceAudioFilter(
[
{ startMs: 0, endMs: 2_000, speed: 1 },
{ startMs: 2_000, endMs: 6_000, speed: 1.5 },
],
44_100,
);
expect(filter).toBe(
"[1:a]atrim=start=0.000:end=2.000,asetpts=PTS-STARTPTS[edited_audio_0];" +
"[1:a]atrim=start=2.000:end=6.000,asetpts=PTS-STARTPTS,asetrate=66150,aresample=44100[edited_audio_1];" +
"[edited_audio_0][edited_audio_1]concat=n=2:v=0:a=1[aout]",
);
});
it("builds a filtergraph for slowdown segments by lowering then resampling the source rate", () => {
const filter = buildEditedTrackSourceAudioFilter(
[{ startMs: 0, endMs: 2_000, speed: 0.5 }],
44_100,
);
expect(filter).toBe(
"[1:a]atrim=start=0.000:end=2.000,asetpts=PTS-STARTPTS,asetrate=22050,aresample=44100[edited_audio_0];" +
"[edited_audio_0]anull[aout]",
);
});
it("returns null when the edited-track filtergraph inputs are incomplete", () => {
expect(buildEditedTrackSourceAudioFilter([], 44_100)).toBeNull();
expect(
buildEditedTrackSourceAudioFilter(
[{ startMs: 0, endMs: 2_000, speed: 1.5 }],
Number.NaN,
),
).toBeNull();
});
it("returns null when the edited-track segments are malformed", () => {
expect(
buildEditedTrackSourceAudioFilter(
[{ startMs: Number.NaN, endMs: 2_000, speed: 1.5 }],
44_100,
),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter([{ startMs: 0, endMs: 2_000, speed: 0 }], 44_100),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter([{ startMs: 0, endMs: 2_000, speed: -1 }], 44_100),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter(
[{ startMs: 0, endMs: 2_000, speed: Number.NaN }],
44_100,
),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter([{ startMs: 0, endMs: 2_000, speed: 1 }], 0.4),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter([{ startMs: -100, endMs: 2_000, speed: 1 }], 44_100),
).toBeNull();
expect(
buildEditedTrackSourceAudioFilter(
[{ startMs: 0, endMs: 2_000, speed: Number.MAX_SAFE_INTEGER }],
44_100,
),
).toBeNull();
});
});