diff --git a/.gitattributes b/.gitattributes index 23850c109..e2cb66f19 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,6 +4,9 @@ packages/producer/tests/*/output/output.mp4 filter=lfs diff=lfs merge=lfs -text # Source video clips for regression test fixtures (HDR samples, etc.) packages/producer/tests/*/src/*.mp4 filter=lfs diff=lfs merge=lfs -text +# Source image assets for regression test fixtures (HDR PNGs, screenshot fixtures, etc.) +packages/producer/tests/*/src/*.png filter=lfs diff=lfs merge=lfs -text + # GitHub Linguist overrides — HTML files are compositions (user content / templates), # not the framework source. Hide them from the repo language stats so TypeScript, # which is the actual implementation, surfaces as the dominant language. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95855f55c..98e770466 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,6 +45,8 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: @@ -60,6 +62,8 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: @@ -73,6 +77,8 @@ jobs: timeout-minutes: 5 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: @@ -88,6 +94,8 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: @@ -104,6 +112,8 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: @@ -119,6 +129,8 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4 + with: + lfs: true - uses: oven-sh/setup-bun@v2 - uses: actions/setup-node@v4 with: diff --git a/.github/workflows/windows-render.yml b/.github/workflows/windows-render.yml index 36715e633..ea727dfa0 100644 --- a/.github/workflows/windows-render.yml +++ b/.github/workflows/windows-render.yml @@ -60,6 +60,7 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} + lfs: true - name: Show platform info shell: pwsh @@ -222,6 +223,7 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} + lfs: true # ----------------------------------------------------------------- # Install FFmpeg so vitest suites that gate on `HAS_FFMPEG` diff --git a/packages/engine/src/services/chunkEncoder.test.ts b/packages/engine/src/services/chunkEncoder.test.ts index 98e104c8f..c63335bf2 100644 --- a/packages/engine/src/services/chunkEncoder.test.ts +++ b/packages/engine/src/services/chunkEncoder.test.ts @@ -356,6 +356,7 @@ describe("buildEncoderArgs HDR color space", () => { expect(args[paramIdx + 1]).not.toContain("max-cll"); }); + it("strips HDR and tags as SDR/BT.709 when codec=h264 (libx264 has no HDR support)", () => { // libx264 cannot encode HDR. Rather than emit a "half-HDR" file (BT.2020 // container tags + BT.709 VUI inside the bitstream — confusing to HDR-aware diff --git a/packages/engine/src/services/videoFrameExtractor.ts b/packages/engine/src/services/videoFrameExtractor.ts index b16627af9..0464aa24d 100644 --- a/packages/engine/src/services/videoFrameExtractor.ts +++ b/packages/engine/src/services/videoFrameExtractor.ts @@ -418,6 +418,7 @@ export async function extractAllVideoFrames( const hdrInfo = analyzeCompositionHdr(videoColorSpaces); if (hdrInfo.hasHdr && hdrInfo.dominantTransfer) { + // dominantTransfer is "majority wins" — if a composition mixes PQ and HLG // sources (rare but legal), the minority transfer's videos get converted // with the wrong curve. We treat this as caller-error: a single composition diff --git a/packages/producer/tests/hdr-regression/src/hdr-photo-pq.png b/packages/producer/tests/hdr-regression/src/hdr-photo-pq.png index 245a8b811..a570038f2 100644 Binary files a/packages/producer/tests/hdr-regression/src/hdr-photo-pq.png and b/packages/producer/tests/hdr-regression/src/hdr-photo-pq.png differ diff --git a/packages/producer/tests/heygen-promo-preview-assets/src/feature-strip.png b/packages/producer/tests/heygen-promo-preview-assets/src/feature-strip.png index 669fc2ccc..873e61c80 100644 Binary files a/packages/producer/tests/heygen-promo-preview-assets/src/feature-strip.png and b/packages/producer/tests/heygen-promo-preview-assets/src/feature-strip.png differ diff --git a/packages/producer/tests/heygen-promo-preview-assets/src/hero-prism.png b/packages/producer/tests/heygen-promo-preview-assets/src/hero-prism.png index ba64f599a..375848dcf 100644 Binary files a/packages/producer/tests/heygen-promo-preview-assets/src/hero-prism.png and b/packages/producer/tests/heygen-promo-preview-assets/src/hero-prism.png differ diff --git a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-homepage.png b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-homepage.png index 3d6f8d819..087928bab 100644 Binary files a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-homepage.png and b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-homepage.png differ diff --git a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-logo.png b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-logo.png index c1e998d90..b0f34d578 100644 Binary files a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-logo.png and b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-logo.png differ diff --git a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-superpower.png b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-superpower.png index f59af1e5e..b96766cbd 100644 Binary files a/packages/producer/tests/heygen-promo-preview-assets/src/heygen-superpower.png and b/packages/producer/tests/heygen-promo-preview-assets/src/heygen-superpower.png differ