chore: add ForgeOffload + ForgeProxy targets, plan phases 7-8 (offload/verify/MHL, proxy gen)
This commit is contained in:
parent
8b2f77aa46
commit
e3318b073d
6 changed files with 49 additions and 0 deletions
|
|
@ -40,6 +40,9 @@ let package = Package(
|
||||||
.systemLibrary(name: "CSQLite", path: "Sources/CSQLite"),
|
.systemLibrary(name: "CSQLite", path: "Sources/CSQLite"),
|
||||||
.target(name: "ForgeLogger", dependencies: ["ForgeCamera", "ForgeLibrary"]),
|
.target(name: "ForgeLogger", dependencies: ["ForgeCamera", "ForgeLibrary"]),
|
||||||
.target(name: "ForgeExport", dependencies: ["ForgeLibrary", "ForgeGrade"]),
|
.target(name: "ForgeExport", dependencies: ["ForgeLibrary", "ForgeGrade"]),
|
||||||
|
// Offload + proxy
|
||||||
|
.target(name: "ForgeOffload", dependencies: ["ForgeLibrary"]),
|
||||||
|
.target(name: "ForgeProxy", dependencies: ["ForgeLibrary", "ForgeGrade", "ForgeColor"]),
|
||||||
// Panel + video seams
|
// Panel + video seams
|
||||||
.target(name: "ForgePanel", dependencies: [
|
.target(name: "ForgePanel", dependencies: [
|
||||||
"ForgeGrade",
|
"ForgeGrade",
|
||||||
|
|
@ -50,6 +53,7 @@ let package = Package(
|
||||||
.executableTarget(name: "forge-cli", dependencies: [
|
.executableTarget(name: "forge-cli", dependencies: [
|
||||||
"ForgeCamera", "ForgeCameraARRI", "ForgeCameraRED", "ForgeCameraSony",
|
"ForgeCamera", "ForgeCameraARRI", "ForgeCameraRED", "ForgeCameraSony",
|
||||||
"ForgeSim", "ForgeLogger", "ForgeExport", "ForgePanel", "ForgeVideo",
|
"ForgeSim", "ForgeLogger", "ForgeExport", "ForgePanel", "ForgeVideo",
|
||||||
|
"ForgeOffload", "ForgeProxy",
|
||||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||||
]),
|
]),
|
||||||
// Tests
|
// Tests
|
||||||
|
|
@ -62,6 +66,8 @@ let package = Package(
|
||||||
.testTarget(name: "ForgeLibraryTests", dependencies: ["ForgeLibrary"]),
|
.testTarget(name: "ForgeLibraryTests", dependencies: ["ForgeLibrary"]),
|
||||||
.testTarget(name: "ForgeLoggerTests", dependencies: ["ForgeLogger", "ForgeSim"]),
|
.testTarget(name: "ForgeLoggerTests", dependencies: ["ForgeLogger", "ForgeSim"]),
|
||||||
.testTarget(name: "ForgeExportTests", dependencies: ["ForgeExport"]),
|
.testTarget(name: "ForgeExportTests", dependencies: ["ForgeExport"]),
|
||||||
|
.testTarget(name: "ForgeOffloadTests", dependencies: ["ForgeOffload"]),
|
||||||
|
.testTarget(name: "ForgeProxyTests", dependencies: ["ForgeProxy"]),
|
||||||
.testTarget(name: "ForgePanelTests", dependencies: ["ForgePanel"]),
|
.testTarget(name: "ForgePanelTests", dependencies: ["ForgePanel"]),
|
||||||
.testTarget(name: "ForgeVideoTests", dependencies: ["ForgeVideo"]),
|
.testTarget(name: "ForgeVideoTests", dependencies: ["ForgeVideo"]),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
1
Sources/ForgeOffload/ForgeOffload.swift
Normal file
1
Sources/ForgeOffload/ForgeOffload.swift
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
// ForgeOffload
|
||||||
1
Sources/ForgeProxy/ForgeProxy.swift
Normal file
1
Sources/ForgeProxy/ForgeProxy.swift
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
// ForgeProxy
|
||||||
5
Tests/ForgeOffloadTests/PlaceholderTests.swift
Normal file
5
Tests/ForgeOffloadTests/PlaceholderTests.swift
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class ForgeOffloadPlaceholderTests: XCTestCase {
|
||||||
|
func testPlaceholder() { XCTAssertTrue(true) }
|
||||||
|
}
|
||||||
5
Tests/ForgeProxyTests/PlaceholderTests.swift
Normal file
5
Tests/ForgeProxyTests/PlaceholderTests.swift
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class ForgeProxyPlaceholderTests: XCTestCase {
|
||||||
|
func testPlaceholder() { XCTAssertTrue(true) }
|
||||||
|
}
|
||||||
|
|
@ -154,6 +154,37 @@ public protocol CameraDriver: Actor {
|
||||||
### Task 5.3: Debounced push pipeline
|
### Task 5.3: Debounced push pipeline
|
||||||
- Tests: rapid param changes (simulated panel spins) → preview eval every change, camera push coalesced to ≤1 per 150ms, final state always pushed (trailing edge); per-camera independent debounce.
|
- Tests: rapid param changes (simulated panel spins) → preview eval every change, camera push coalesced to ≤1 per 150ms, final state always pushed (trailing edge); per-camera independent debounce.
|
||||||
|
|
||||||
|
## Phase 7 — Offload + verification
|
||||||
|
|
||||||
|
### Task 7.1: ForgeOffload — hashing
|
||||||
|
- Tests: xxHash64 + MD5 known-vector tests; streaming hash of large file matches whole-file hash; chunked reader.
|
||||||
|
- Impl: xxHash64 (pure Swift, spec vectors), MD5 via system, `HashingReader`.
|
||||||
|
|
||||||
|
### Task 7.2: ForgeOffload — copy engine
|
||||||
|
- Tests: source tree → 2 destinations, byte-identical, hash-verified via post-copy re-read; interrupted copy resumes (partial file detected, re-copied); collision policy (exists+same hash = skip, exists+diff hash = error).
|
||||||
|
- Impl: `OffloadJob` (source, [destinations]), sequential copy w/ streaming hash, verify pass re-reads destination.
|
||||||
|
|
||||||
|
### Task 7.3: ForgeOffload — MHL v2 manifest
|
||||||
|
- Tests: golden-file MHL XML (ASC MHL spec shape: hashes, paths, sizes, creator info); manifest verifies against tree; tamper detection (flipped byte → verify fail).
|
||||||
|
- Impl: MHL writer + verifier.
|
||||||
|
|
||||||
|
### Task 7.4: Offload reports + library link
|
||||||
|
- Tests: HTML/CSV report golden; offloaded clip matched to shot record by clip name.
|
||||||
|
- CLI: `forge offload <src> --to <dst1> --to <dst2>`, `forge verify <mhl>`.
|
||||||
|
|
||||||
|
## Phase 8 — Proxy generation
|
||||||
|
|
||||||
|
### Task 8.1: ForgeProxy — ffmpeg wrapper
|
||||||
|
- Tests: command-line assembly golden (ProRes/DNxHR/H.264 presets, scale, lut3d filter path quoting, TC+clipname drawtext burn-in); process runner against `true`/fake-ffmpeg script asserting argv; real ffmpeg smoke test if binary present (skip otherwise).
|
||||||
|
- Impl: `ProxyPreset`, `FFmpegCommandBuilder`, `ProxyJob` queue (serial v1).
|
||||||
|
|
||||||
|
### Task 8.2: Graded proxies
|
||||||
|
- Tests: shot grade snapshot → flattened .cube written to temp → lut3d filter arg references it; ungraded fallback when no snapshot.
|
||||||
|
- CLI: `forge proxy --day <d> --preset prores-proxy --burn-look`.
|
||||||
|
|
||||||
|
### Task 8.3: Watch folder
|
||||||
|
- Tests: new file in watched dir → job enqueued once (debounce partial writes via size-stable check); already-processed skip list.
|
||||||
|
|
||||||
## Phase 6 — macOS (requires Mac hardware; out of scope on this box, scaffolded only)
|
## Phase 6 — macOS (requires Mac hardware; out of scope on this box, scaffolded only)
|
||||||
|
|
||||||
- SwiftUI app shell (3-zone layout per design), Metal preview renderer (same GradeStack→shader codegen or LUT texture sampling), DeckLink SDK C++ bridge implementing FrameSource/Sink, Tangent Hub local connection, real-camera path verification (ARRI paths const file, RED SDK agreement, Venice protocol docs).
|
- SwiftUI app shell (3-zone layout per design), Metal preview renderer (same GradeStack→shader codegen or LUT texture sampling), DeckLink SDK C++ bridge implementing FrameSource/Sink, Tangent Hub local connection, real-camera path verification (ARRI paths const file, RED SDK agreement, Venice protocol docs).
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue