davinci-resolve-mcp 2.57.4 → 2.58.0
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.
- package/AGENTS.md +20 -0
- package/CHANGELOG.md +197 -2
- package/LICENSE +1 -1
- package/README.md +73 -1
- package/bin/davinci-resolve-advanced-mcp.mjs +20 -0
- package/docs/README.md +19 -0
- package/docs/SKILL.md +62 -1
- package/docs/contributing.md +1 -1
- package/docs/guides/control-panel.md +9 -0
- package/docs/kernels/README.md +21 -0
- package/docs/kernels/audio-fairlight-kernel.md +22 -0
- package/docs/kernels/color-grade-kernel.md +51 -0
- package/docs/kernels/fusion-composition-kernel.md +17 -0
- package/docs/kernels/media-pool-ingest-kernel.md +20 -0
- package/docs/kernels/render-deliver-kernel.md +32 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +39 -0
- package/docs/kernels/timeline-edit-kernel.md +17 -0
- package/docs/process/release-process.md +29 -7
- package/docs/reference/api-coverage.md +1 -1
- package/docs/reference/api-limitations.md +38 -1
- package/install.py +27 -4
- package/package.json +23 -2
- package/resolve-advanced/README.md +194 -0
- package/resolve-advanced/package.json +50 -0
- package/resolve-advanced/server/black-balance.mjs +92 -0
- package/resolve-advanced/server/capabilities.mjs +86 -0
- package/resolve-advanced/server/cdl-io.mjs +76 -0
- package/resolve-advanced/server/contrast-normalize.mjs +180 -0
- package/resolve-advanced/server/db-patch.mjs +91 -0
- package/resolve-advanced/server/deliverable-entities.mjs +86 -0
- package/resolve-advanced/server/deliverable-qc.mjs +270 -0
- package/resolve-advanced/server/editorial.mjs +370 -0
- package/resolve-advanced/server/exposure-level.mjs +129 -0
- package/resolve-advanced/server/extract-frames.mjs +196 -0
- package/resolve-advanced/server/ffprobe-media.mjs +88 -0
- package/resolve-advanced/server/gamut-legal.mjs +112 -0
- package/resolve-advanced/server/grade-body-patch.mjs +246 -0
- package/resolve-advanced/server/grade-transfer.mjs +66 -0
- package/resolve-advanced/server/group-grade-read.mjs +137 -0
- package/resolve-advanced/server/index.mjs +105 -0
- package/resolve-advanced/server/lib.mjs +84 -0
- package/resolve-advanced/server/libs.mjs +65 -0
- package/resolve-advanced/server/lineage-db.mjs +479 -0
- package/resolve-advanced/server/lut-apply.mjs +61 -0
- package/resolve-advanced/server/match-to-reference.mjs +173 -0
- package/resolve-advanced/server/media-inventory.mjs +169 -0
- package/resolve-advanced/server/media-ops.mjs +243 -0
- package/resolve-advanced/server/node-meta-db.mjs +62 -0
- package/resolve-advanced/server/node-provenance.mjs +102 -0
- package/resolve-advanced/server/offline-ref-db.mjs +420 -0
- package/resolve-advanced/server/offline-ref.mjs +179 -0
- package/resolve-advanced/server/project-db.mjs +233 -0
- package/resolve-advanced/server/provenance-audit.mjs +210 -0
- package/resolve-advanced/server/qc-frame.mjs +224 -0
- package/resolve-advanced/server/qc-sampler.mjs +67 -0
- package/resolve-advanced/server/readback.mjs +77 -0
- package/resolve-advanced/server/render-manifest.mjs +93 -0
- package/resolve-advanced/server/reverse-clip-db.mjs +270 -0
- package/resolve-advanced/server/runner-apply-contract.mjs +64 -0
- package/resolve-advanced/server/runner.mjs +244 -0
- package/resolve-advanced/server/saturation-match.mjs +108 -0
- package/resolve-advanced/server/scope-read.mjs +257 -0
- package/resolve-advanced/server/season-look.mjs +96 -0
- package/resolve-advanced/server/shot-intent.mjs +82 -0
- package/resolve-advanced/server/shot-match.mjs +147 -0
- package/resolve-advanced/server/skin-match.mjs +205 -0
- package/resolve-advanced/server/spec-compile.mjs +217 -0
- package/resolve-advanced/server/tone-curve-transfer.mjs +184 -0
- package/resolve-advanced/server/tool-catalog.mjs +265 -0
- package/resolve-advanced/server/tools/audio.mjs +54 -0
- package/resolve-advanced/server/tools/audio_plan.mjs +58 -0
- package/resolve-advanced/server/tools/capabilities.mjs +16 -0
- package/resolve-advanced/server/tools/color_trace.mjs +165 -0
- package/resolve-advanced/server/tools/conform.mjs +291 -0
- package/resolve-advanced/server/tools/deliverable.mjs +105 -0
- package/resolve-advanced/server/tools/drp.mjs +232 -0
- package/resolve-advanced/server/tools/drt.mjs +200 -0
- package/resolve-advanced/server/tools/drx.mjs +943 -0
- package/resolve-advanced/server/tools/editorial.mjs +69 -0
- package/resolve-advanced/server/tools/fairlight.mjs +108 -0
- package/resolve-advanced/server/tools/fusion.mjs +64 -0
- package/resolve-advanced/server/tools/media.mjs +102 -0
- package/resolve-advanced/server/tools/offline_ref.mjs +123 -0
- package/resolve-advanced/server/tools/pipeline.mjs +137 -0
- package/resolve-advanced/server/tools/project_db.mjs +200 -0
- package/resolve-advanced/server/tools/project_read.mjs +212 -0
- package/resolve-advanced/server/tools/provenance.mjs +73 -0
- package/resolve-advanced/server/verify-grade.mjs +113 -0
- package/resolve-advanced/server/white-balance-match.mjs +122 -0
- package/resolve-advanced/vendor/audio/format-converter.js +330 -0
- package/resolve-advanced/vendor/audio/split.js +173 -0
- package/resolve-advanced/vendor/audio/trim.js +188 -0
- package/resolve-advanced/vendor/audio-fairlight/index.js +391 -0
- package/resolve-advanced/vendor/conform-qc/adapters/frame-sampler.js +56 -0
- package/resolve-advanced/vendor/conform-qc/adapters/local-ffmpeg-sampler.js +65 -0
- package/resolve-advanced/vendor/conform-qc/adapters/rendernode-ffmpeg-sampler.js +50 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve/driver.py +176 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve-driver.js +61 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve-headless-driver.js +86 -0
- package/resolve-advanced/vendor/conform-qc/adapters/vision-validator.js +75 -0
- package/resolve-advanced/vendor/conform-qc/cli.js +63 -0
- package/resolve-advanced/vendor/conform-qc/compare/advisory.js +106 -0
- package/resolve-advanced/vendor/conform-qc/compare/decode.js +36 -0
- package/resolve-advanced/vendor/conform-qc/compare/index.js +61 -0
- package/resolve-advanced/vendor/conform-qc/compare/locate.js +70 -0
- package/resolve-advanced/vendor/conform-qc/compare/metrics.js +409 -0
- package/resolve-advanced/vendor/conform-qc/docs/runbook.md +72 -0
- package/resolve-advanced/vendor/conform-qc/index.js +49 -0
- package/resolve-advanced/vendor/conform-qc/knowledge/index.js +110 -0
- package/resolve-advanced/vendor/conform-qc/ops/conform-core.js +137 -0
- package/resolve-advanced/vendor/conform-qc/ops/conform-diff.js +109 -0
- package/resolve-advanced/vendor/conform-qc/ops/insert.js +108 -0
- package/resolve-advanced/vendor/conform-qc/ops/local-conform.js +61 -0
- package/resolve-advanced/vendor/conform-qc/ops/patch.js +80 -0
- package/resolve-advanced/vendor/conform-qc/ops/trigger.js +32 -0
- package/resolve-advanced/vendor/conform-qc/ops/verify.js +105 -0
- package/resolve-advanced/vendor/conform-qc/ops/workflow.js +30 -0
- package/resolve-advanced/vendor/conform-qc/oracle/emulate.js +155 -0
- package/resolve-advanced/vendor/conform-qc/oracle/index.js +38 -0
- package/resolve-advanced/vendor/conform-qc/oracle/resolve.js +196 -0
- package/resolve-advanced/vendor/conform-qc/package.json +16 -0
- package/resolve-advanced/vendor/conform-qc/packaging/emit-aaf.js +30 -0
- package/resolve-advanced/vendor/conform-qc/packaging/emit-fcp7.js +64 -0
- package/resolve-advanced/vendor/conform-qc/packaging/index.js +169 -0
- package/resolve-advanced/vendor/conform-qc/packaging/media-ops.js +56 -0
- package/resolve-advanced/vendor/conform-qc/packaging/otio.js +50 -0
- package/resolve-advanced/vendor/conform-qc/packaging/relink.js +50 -0
- package/resolve-advanced/vendor/conform-qc/packaging/surgical-relink.js +195 -0
- package/resolve-advanced/vendor/conform-qc/parse/index.js +54 -0
- package/resolve-advanced/vendor/conform-qc/parse/merge-dto.js +27 -0
- package/resolve-advanced/vendor/conform-qc/parse/xmeml-geometry.js +256 -0
- package/resolve-advanced/vendor/conform-qc/reference/burnin-ocr.js +100 -0
- package/resolve-advanced/vendor/conform-qc/reference/sidecar.js +37 -0
- package/resolve-advanced/vendor/conform-qc/repair/analysis.js +62 -0
- package/resolve-advanced/vendor/conform-qc/repair/index.js +78 -0
- package/resolve-advanced/vendor/conform-qc/repair/media-analysis.js +139 -0
- package/resolve-advanced/vendor/conform-qc/repair/media-index.js +135 -0
- package/resolve-advanced/vendor/conform-qc/repair/strategies.js +250 -0
- package/resolve-advanced/vendor/conform-qc/report/index.js +133 -0
- package/resolve-advanced/vendor/conform-qc/roles/index.js +96 -0
- package/resolve-advanced/vendor/conform-qc/synthetic/generate.js +233 -0
- package/resolve-advanced/vendor/conform-qc/test/advisory.test.js +85 -0
- package/resolve-advanced/vendor/conform-qc/test/cli.test.js +39 -0
- package/resolve-advanced/vendor/conform-qc/test/compare.test.js +152 -0
- package/resolve-advanced/vendor/conform-qc/test/conform-diff.test.js +70 -0
- package/resolve-advanced/vendor/conform-qc/test/emulate.test.js +51 -0
- package/resolve-advanced/vendor/conform-qc/test/frame-sampler.test.js +30 -0
- package/resolve-advanced/vendor/conform-qc/test/geometry.test.js +112 -0
- package/resolve-advanced/vendor/conform-qc/test/knowledge.test.js +56 -0
- package/resolve-advanced/vendor/conform-qc/test/lifecycle.test.js +110 -0
- package/resolve-advanced/vendor/conform-qc/test/local-ffmpeg-sampler.test.js +66 -0
- package/resolve-advanced/vendor/conform-qc/test/locate.test.js +63 -0
- package/resolve-advanced/vendor/conform-qc/test/media-analysis.test.js +63 -0
- package/resolve-advanced/vendor/conform-qc/test/media-index-normalized.test.js +65 -0
- package/resolve-advanced/vendor/conform-qc/test/media-index-origin.test.js +53 -0
- package/resolve-advanced/vendor/conform-qc/test/metrics-fast.test.js +91 -0
- package/resolve-advanced/vendor/conform-qc/test/oracle-reverse.test.js +86 -0
- package/resolve-advanced/vendor/conform-qc/test/oracle.test.js +136 -0
- package/resolve-advanced/vendor/conform-qc/test/p0-acceptance.test.js +60 -0
- package/resolve-advanced/vendor/conform-qc/test/p1-acceptance.test.js +75 -0
- package/resolve-advanced/vendor/conform-qc/test/p45-patch-acceptance.test.js +102 -0
- package/resolve-advanced/vendor/conform-qc/test/packaging.test.js +133 -0
- package/resolve-advanced/vendor/conform-qc/test/parse-stubs.test.js +28 -0
- package/resolve-advanced/vendor/conform-qc/test/repair-strategies.test.js +128 -0
- package/resolve-advanced/vendor/conform-qc/test/repair.test.js +84 -0
- package/resolve-advanced/vendor/conform-qc/test/report.test.js +52 -0
- package/resolve-advanced/vendor/conform-qc/test/resolve-readback.test.js +71 -0
- package/resolve-advanced/vendor/conform-qc/test/roles.test.js +107 -0
- package/resolve-advanced/vendor/conform-qc/test/runbook.test.js +30 -0
- package/resolve-advanced/vendor/conform-qc/test/scale-residual.test.js +40 -0
- package/resolve-advanced/vendor/conform-qc/test/sidecar.test.js +51 -0
- package/resolve-advanced/vendor/conform-qc/test/smoke.test.js +87 -0
- package/resolve-advanced/vendor/conform-qc/test/surgical-relink.test.js +73 -0
- package/resolve-advanced/vendor/conform-qc/test/synthetic.test.js +98 -0
- package/resolve-advanced/vendor/conform-qc/test/verify.test.js +93 -0
- package/resolve-advanced/vendor/conform-qc/test/vision-validator.test.js +43 -0
- package/resolve-advanced/vendor/conform-qc/test/workflow-driver.test.js +46 -0
- package/resolve-advanced/vendor/conform-qc/toolset/index.js +53 -0
- package/resolve-advanced/vendor/drp-format/README.md +116 -0
- package/resolve-advanced/vendor/drp-format/__tests__/_resolve-verify.js +39 -0
- package/resolve-advanced/vendor/drp-format/__tests__/add-media-clip.test.js +30 -0
- package/resolve-advanced/vendor/drp-format/__tests__/assemble-timeline.test.js +68 -0
- package/resolve-advanced/vendor/drp-format/__tests__/author-project.test.js +57 -0
- package/resolve-advanced/vendor/drp-format/__tests__/composition-text.test.js +98 -0
- package/resolve-advanced/vendor/drp-format/__tests__/diff.test.js +272 -0
- package/resolve-advanced/vendor/drp-format/__tests__/effect-filters-compressed.test.js +143 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/p0-3-session30-empty-effectfilters.drp +0 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-50pct.hex +1 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-dynamic.hex +1 -0
- package/resolve-advanced/vendor/drp-format/__tests__/inject-grades.test.js +238 -0
- package/resolve-advanced/vendor/drp-format/__tests__/keyed-dict.test.js +85 -0
- package/resolve-advanced/vendor/drp-format/__tests__/lut-refs.test.js +119 -0
- package/resolve-advanced/vendor/drp-format/__tests__/media-blobs.test.js +25 -0
- package/resolve-advanced/vendor/drp-format/__tests__/media-timemap.test.js +119 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-fusion-title.test.js +52 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-generator.test.js +40 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-transition.test.js +48 -0
- package/resolve-advanced/vendor/drp-format/__tests__/protobuf-wire.test.js +64 -0
- package/resolve-advanced/vendor/drp-format/__tests__/relink-media.test.js +106 -0
- package/resolve-advanced/vendor/drp-format/__tests__/splice-clips.test.js +256 -0
- package/resolve-advanced/vendor/drp-format/assemble-timeline.js +65 -0
- package/resolve-advanced/vendor/drp-format/author-project.js +118 -0
- package/resolve-advanced/vendor/drp-format/composition-text.js +213 -0
- package/resolve-advanced/vendor/drp-format/curves-encoder.js +763 -0
- package/resolve-advanced/vendor/drp-format/diff.js +310 -0
- package/resolve-advanced/vendor/drp-format/drp-packager.js +201 -0
- package/resolve-advanced/vendor/drp-format/drp-validator.js +809 -0
- package/resolve-advanced/vendor/drp-format/effect-encoder.js +640 -0
- package/resolve-advanced/vendor/drp-format/extract-lut-refs.js +119 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.example.js +133 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.js +401 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.test.js +171 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.verify.js +249 -0
- package/resolve-advanced/vendor/drp-format/grade-node-extractor.js +495 -0
- package/resolve-advanced/vendor/drp-format/grade-parameter-decoder.js +774 -0
- package/resolve-advanced/vendor/drp-format/index.js +174 -0
- package/resolve-advanced/vendor/drp-format/inject-grades.js +219 -0
- package/resolve-advanced/vendor/drp-format/keyed-dict.js +227 -0
- package/resolve-advanced/vendor/drp-format/marker-encoder.js +532 -0
- package/resolve-advanced/vendor/drp-format/media-blobs.js +53 -0
- package/resolve-advanced/vendor/drp-format/media-timemap.js +164 -0
- package/resolve-advanced/vendor/drp-format/mp-folder-builder.js +293 -0
- package/resolve-advanced/vendor/drp-format/node-tree-encoder.js +1246 -0
- package/resolve-advanced/vendor/drp-format/package.json +18 -0
- package/resolve-advanced/vendor/drp-format/place-fusion-title.js +131 -0
- package/resolve-advanced/vendor/drp-format/place-generator.js +77 -0
- package/resolve-advanced/vendor/drp-format/place-transition.js +91 -0
- package/resolve-advanced/vendor/drp-format/power-window-encoder.js +776 -0
- package/resolve-advanced/vendor/drp-format/protobuf-wire.js +111 -0
- package/resolve-advanced/vendor/drp-format/qualifier-encoder.js +706 -0
- package/resolve-advanced/vendor/drp-format/relink-media.js +218 -0
- package/resolve-advanced/vendor/drp-format/rich-title-encoder.js +447 -0
- package/resolve-advanced/vendor/drp-format/seq-container-builder.js +572 -0
- package/resolve-advanced/vendor/drp-format/seq-surgery.js +155 -0
- package/resolve-advanced/vendor/drp-format/splice-clips.js +445 -0
- package/resolve-advanced/vendor/drp-format/templates/empty-project.drp +0 -0
- package/resolve-advanced/vendor/drp-format/templates/fusion-title.xml +56 -0
- package/resolve-advanced/vendor/drp-format/templates/generator-solid-color.xml +21 -0
- package/resolve-advanced/vendor/drp-format/templates/media-clip-h264.drp +0 -0
- package/resolve-advanced/vendor/drp-format/templates/transition-cross-dissolve.xml +22 -0
- package/resolve-advanced/vendor/drp-format/tool-registry.descriptor.js +80 -0
- package/resolve-advanced/vendor/drp-format/utils/safe-archive.js +54 -0
- package/resolve-advanced/vendor/drp-format/xml-builder.js +759 -0
- package/resolve-advanced/vendor/drt-format/__tests__/_resolve-verify.js +21 -0
- package/resolve-advanced/vendor/drt-format/__tests__/build.test.js +113 -0
- package/resolve-advanced/vendor/drt-format/__tests__/multi-format.test.js +93 -0
- package/resolve-advanced/vendor/drt-format/__tests__/parse-real-resolve21.test.js +51 -0
- package/resolve-advanced/vendor/drt-format/__tests__/parse.test.js +134 -0
- package/resolve-advanced/vendor/drt-format/__tests__/resolve-versions.test.js +120 -0
- package/resolve-advanced/vendor/drt-format/__tests__/schema-fingerprint.test.js +62 -0
- package/resolve-advanced/vendor/drt-format/__tests__/smoke.test.js +27 -0
- package/resolve-advanced/vendor/drt-format/__tests__/validate.test.js +109 -0
- package/resolve-advanced/vendor/drt-format/capabilities.js +69 -0
- package/resolve-advanced/vendor/drt-format/capability-domains.js +56 -0
- package/resolve-advanced/vendor/drt-format/drt-builder.js +42 -0
- package/resolve-advanced/vendor/drt-format/drt-parser.js +164 -0
- package/resolve-advanced/vendor/drt-format/drt-validator.js +98 -0
- package/resolve-advanced/vendor/drt-format/index.js +45 -0
- package/resolve-advanced/vendor/drt-format/package.json +17 -0
- package/resolve-advanced/vendor/drt-format/resolve-versions.js +153 -0
- package/resolve-advanced/vendor/drt-format/schema-fingerprint.js +74 -0
- package/resolve-advanced/vendor/drt-format/templates/drt-project-shell.xml +124 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/curves-roundtrip.test.js +148 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-face-refinement.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-filmgrain.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-glow.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-lens-flare.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-25.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-75.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-no-lut.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-with-lut.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/hsl-curves-roundtrip.test.js +117 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/lut-refs-roundtrip.test.js +112 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/matte-roundtrip.test.js +167 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/ofx-roundtrip.test.js +215 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/ofx-slugs-discovery.test.js +149 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/power-window-roundtrip.test.js +230 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/qualifier-roundtrip.test.js +226 -0
- package/resolve-advanced/vendor/drx-codec/cdl-exporter.js +470 -0
- package/resolve-advanced/vendor/drx-codec/color-nlp-parser.js +833 -0
- package/resolve-advanced/vendor/drx-codec/data/color-nlp-action-mappings.json +2232 -0
- package/resolve-advanced/vendor/drx-codec/drx-generator.js +4123 -0
- package/resolve-advanced/vendor/drx-codec/drx-merger.js +320 -0
- package/resolve-advanced/vendor/drx-codec/drx-parser.js +1808 -0
- package/resolve-advanced/vendor/drx-codec/extract-custom-curves.js +215 -0
- package/resolve-advanced/vendor/drx-codec/extract-hsl-curves.js +180 -0
- package/resolve-advanced/vendor/drx-codec/extract-lut-refs.js +158 -0
- package/resolve-advanced/vendor/drx-codec/extract-matte-finesse.js +83 -0
- package/resolve-advanced/vendor/drx-codec/extract-ofx-params.js +226 -0
- package/resolve-advanced/vendor/drx-codec/extract-power-window.js +184 -0
- package/resolve-advanced/vendor/drx-codec/extract-qualifier.js +99 -0
- package/resolve-advanced/vendor/drx-codec/index.js +109 -0
- package/resolve-advanced/vendor/drx-codec/node-layout.js +249 -0
- package/resolve-advanced/vendor/drx-codec/resolved-drx-generator.js +393 -0
- package/resolve-advanced/vendor/drx-codec/tool-resolver.js +974 -0
- package/resolve-advanced/vendor/drx-codec/training-examples.js +548 -0
- package/resolve-advanced/vendor/drx-codec/vocabulary-intents.js +539 -0
- package/resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md +319 -0
- package/resolve-advanced/vendor/drx-parameters/DRX-VALUE-SCALING.md +251 -0
- package/resolve-advanced/vendor/drx-parameters/calibrated-ranges.json +17737 -0
- package/resolve-advanced/vendor/drx-parameters/corrector-types.js +120 -0
- package/resolve-advanced/vendor/drx-parameters/index.js +193 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-codec.js +451 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-ids.js +1292 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-ranges.js +570 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-validator.js +392 -0
- package/resolve-advanced/vendor/drx-parameters/resolvefx-registry.json +14973 -0
- package/resolve-advanced/vendor/drx-parameters/tool-registry.descriptor.js +38 -0
- package/resolve-advanced/vendor/drx-parameters/tools/drx-analyzer.js +371 -0
- package/resolve-advanced/vendor/fairlight/index.js +833 -0
- package/resolve-advanced/vendor/fusion-codec/composition-generator.js +401 -0
- package/resolve-advanced/vendor/fusion-codec/templates/blur-region.js +103 -0
- package/resolve-advanced/vendor/fusion-codec/templates/color-correct.js +87 -0
- package/resolve-advanced/vendor/fusion-codec/templates/film-grain.js +106 -0
- package/resolve-advanced/vendor/fusion-codec/templates/lower-third.js +241 -0
- package/resolve-advanced/vendor/fusion-codec/templates/picture-in-picture.js +188 -0
- package/resolve-advanced/vendor/fusion-codec/templates/text-overlay.js +161 -0
- package/resolve-advanced/vendor/fusion-codec/templates/title-card.js +184 -0
- package/resolve-advanced/vendor/fusion-codec/templates/vignette.js +107 -0
- package/resolve-advanced/vendor/fusion-codec/templates/watermark.js +101 -0
- package/scripts/agent-rules/README.md +68 -0
- package/src/analysis_dashboard.py +233 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +479 -29
- package/src/utils/api_truth.py +117 -0
- package/src/utils/cut_ir.py +1 -1
- package/src/utils/failure_tracker.py +0 -2
- package/src/utils/timeline_xml.py +405 -0
|
@@ -0,0 +1,776 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DaVinci Resolve Power Window Encoder
|
|
3
|
+
*
|
|
4
|
+
* Advanced power window encoding for secondary corrections including:
|
|
5
|
+
* - Circular/Oval windows
|
|
6
|
+
* - Linear (gradient) windows
|
|
7
|
+
* - Polygon windows
|
|
8
|
+
* - Power Curve windows
|
|
9
|
+
* - Gradient windows
|
|
10
|
+
* - Transform controls (pan, zoom, rotation)
|
|
11
|
+
* - Softness and feathering
|
|
12
|
+
* - Window animation/tracking data
|
|
13
|
+
*
|
|
14
|
+
* Works with node-tree-encoder.js for complete grade encoding.
|
|
15
|
+
*
|
|
16
|
+
* @module power-window-encoder
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const { encodeVarint, encodeFloat, encodeTag } = require('./grade-encoder');
|
|
20
|
+
const { WINDOW_TYPES, WINDOW_FIELDS, CORRECTOR_TYPE } = require('./grade-parameter-decoder');
|
|
21
|
+
|
|
22
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
23
|
+
// WINDOW CONSTANTS
|
|
24
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Standard aspect ratios for oval windows
|
|
28
|
+
*/
|
|
29
|
+
const ASPECT_RATIOS = {
|
|
30
|
+
SQUARE: 1.0,
|
|
31
|
+
WIDE_16_9: 16 / 9,
|
|
32
|
+
WIDE_2_35: 2.35,
|
|
33
|
+
TALL_9_16: 9 / 16,
|
|
34
|
+
PORTRAIT_4_5: 4 / 5,
|
|
35
|
+
ANAMORPHIC_2_39: 2.39,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Common gradient directions (in degrees)
|
|
40
|
+
*/
|
|
41
|
+
const GRADIENT_DIRECTIONS = {
|
|
42
|
+
TOP_TO_BOTTOM: 0,
|
|
43
|
+
BOTTOM_TO_TOP: 180,
|
|
44
|
+
LEFT_TO_RIGHT: 90,
|
|
45
|
+
RIGHT_TO_LEFT: 270,
|
|
46
|
+
TOP_LEFT_TO_BOTTOM_RIGHT: 45,
|
|
47
|
+
TOP_RIGHT_TO_BOTTOM_LEFT: 135,
|
|
48
|
+
BOTTOM_LEFT_TO_TOP_RIGHT: 315,
|
|
49
|
+
BOTTOM_RIGHT_TO_TOP_LEFT: 225,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Pre-defined softness levels
|
|
54
|
+
*/
|
|
55
|
+
const SOFTNESS_PRESETS = {
|
|
56
|
+
SHARP: 0,
|
|
57
|
+
SUBTLE: 0.05,
|
|
58
|
+
SOFT: 0.15,
|
|
59
|
+
VERY_SOFT: 0.3,
|
|
60
|
+
FEATHERED: 0.5,
|
|
61
|
+
EXTREME: 0.8,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
65
|
+
// CIRCULAR/OVAL WINDOW BUILDERS
|
|
66
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create a circular power window
|
|
70
|
+
*
|
|
71
|
+
* @param {Object} options - Window options
|
|
72
|
+
* @param {number} options.centerX - Center X position (0-1, default 0.5)
|
|
73
|
+
* @param {number} options.centerY - Center Y position (0-1, default 0.5)
|
|
74
|
+
* @param {number} options.radius - Window radius (0-1, default 0.25)
|
|
75
|
+
* @param {number} options.softness - Edge softness (0-1, default 0.1)
|
|
76
|
+
* @param {number} options.rotation - Rotation in degrees
|
|
77
|
+
* @param {boolean} options.invert - Invert selection
|
|
78
|
+
* @returns {Object} Window settings
|
|
79
|
+
*/
|
|
80
|
+
function createCircularWindow(options = {}) {
|
|
81
|
+
const {
|
|
82
|
+
centerX = 0.5,
|
|
83
|
+
centerY = 0.5,
|
|
84
|
+
radius = 0.25,
|
|
85
|
+
softness = 0.1,
|
|
86
|
+
rotation = 0,
|
|
87
|
+
invert = false,
|
|
88
|
+
} = options;
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
type: 'CIRCLE',
|
|
92
|
+
enabled: true,
|
|
93
|
+
transform: {
|
|
94
|
+
panX: centerX - 0.5, // Offset from center
|
|
95
|
+
panY: centerY - 0.5,
|
|
96
|
+
zoomX: 1.0,
|
|
97
|
+
zoomY: 1.0,
|
|
98
|
+
rotation,
|
|
99
|
+
anchorX: 0.5,
|
|
100
|
+
anchorY: 0.5,
|
|
101
|
+
},
|
|
102
|
+
shape: {
|
|
103
|
+
radiusX: radius,
|
|
104
|
+
radiusY: radius,
|
|
105
|
+
softness,
|
|
106
|
+
insideSoftness: 0,
|
|
107
|
+
outsideSoftness: softness,
|
|
108
|
+
},
|
|
109
|
+
invert,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Create an oval power window with aspect ratio control
|
|
115
|
+
*
|
|
116
|
+
* @param {Object} options - Window options
|
|
117
|
+
* @param {number} options.centerX - Center X position (0-1)
|
|
118
|
+
* @param {number} options.centerY - Center Y position (0-1)
|
|
119
|
+
* @param {number} options.radiusX - Horizontal radius (0-1)
|
|
120
|
+
* @param {number} options.radiusY - Vertical radius (0-1)
|
|
121
|
+
* @param {number} options.aspectRatio - Use preset aspect ratio (overrides radiusY)
|
|
122
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
123
|
+
* @param {number} options.rotation - Rotation in degrees
|
|
124
|
+
* @param {boolean} options.invert - Invert selection
|
|
125
|
+
* @returns {Object} Window settings
|
|
126
|
+
*/
|
|
127
|
+
function createOvalWindow(options = {}) {
|
|
128
|
+
const {
|
|
129
|
+
centerX = 0.5,
|
|
130
|
+
centerY = 0.5,
|
|
131
|
+
radiusX = 0.3,
|
|
132
|
+
radiusY = 0.2,
|
|
133
|
+
aspectRatio = null,
|
|
134
|
+
softness = 0.1,
|
|
135
|
+
rotation = 0,
|
|
136
|
+
invert = false,
|
|
137
|
+
} = options;
|
|
138
|
+
|
|
139
|
+
// Calculate radiusY from aspect ratio if provided
|
|
140
|
+
let finalRadiusY = radiusY;
|
|
141
|
+
if (aspectRatio) {
|
|
142
|
+
finalRadiusY = radiusX / aspectRatio;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
type: 'CIRCLE',
|
|
147
|
+
enabled: true,
|
|
148
|
+
transform: {
|
|
149
|
+
panX: centerX - 0.5,
|
|
150
|
+
panY: centerY - 0.5,
|
|
151
|
+
zoomX: 1.0,
|
|
152
|
+
zoomY: 1.0,
|
|
153
|
+
rotation,
|
|
154
|
+
anchorX: 0.5,
|
|
155
|
+
anchorY: 0.5,
|
|
156
|
+
},
|
|
157
|
+
shape: {
|
|
158
|
+
radiusX,
|
|
159
|
+
radiusY: finalRadiusY,
|
|
160
|
+
softness,
|
|
161
|
+
insideSoftness: 0,
|
|
162
|
+
outsideSoftness: softness,
|
|
163
|
+
},
|
|
164
|
+
invert,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Create a vignette effect (large inverted oval)
|
|
170
|
+
*
|
|
171
|
+
* @param {Object} options - Vignette options
|
|
172
|
+
* @param {number} options.strength - Vignette strength (0-1, affects size and softness)
|
|
173
|
+
* @param {number} options.roundness - Vignette roundness (1 = circle, <1 = oval)
|
|
174
|
+
* @param {number} options.offsetX - Horizontal center offset (-0.5 to 0.5)
|
|
175
|
+
* @param {number} options.offsetY - Vertical center offset (-0.5 to 0.5)
|
|
176
|
+
* @returns {Object} Window settings for vignette
|
|
177
|
+
*/
|
|
178
|
+
function createVignetteWindow(options = {}) {
|
|
179
|
+
const {
|
|
180
|
+
strength = 0.5,
|
|
181
|
+
roundness = 0.8,
|
|
182
|
+
offsetX = 0,
|
|
183
|
+
offsetY = 0,
|
|
184
|
+
} = options;
|
|
185
|
+
|
|
186
|
+
// Calculate size based on strength (stronger = smaller/more visible)
|
|
187
|
+
const baseRadius = 1.2 - strength * 0.7;
|
|
188
|
+
const softness = 0.2 + strength * 0.4;
|
|
189
|
+
|
|
190
|
+
return createOvalWindow({
|
|
191
|
+
centerX: 0.5 + offsetX,
|
|
192
|
+
centerY: 0.5 + offsetY,
|
|
193
|
+
radiusX: baseRadius,
|
|
194
|
+
radiusY: baseRadius * roundness,
|
|
195
|
+
softness,
|
|
196
|
+
invert: true, // Vignettes are inverted to darken edges
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
201
|
+
// LINEAR/GRADIENT WINDOW BUILDERS
|
|
202
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Create a linear (gradient) power window
|
|
206
|
+
*
|
|
207
|
+
* @param {Object} options - Window options
|
|
208
|
+
* @param {number} options.angle - Gradient angle in degrees (0 = top to bottom)
|
|
209
|
+
* @param {number} options.position - Position of gradient center (0-1)
|
|
210
|
+
* @param {number} options.softness - Gradient softness (0-1)
|
|
211
|
+
* @param {boolean} options.invert - Invert selection
|
|
212
|
+
* @returns {Object} Window settings
|
|
213
|
+
*/
|
|
214
|
+
function createLinearWindow(options = {}) {
|
|
215
|
+
const {
|
|
216
|
+
angle = 0,
|
|
217
|
+
position = 0.5,
|
|
218
|
+
softness = 0.2,
|
|
219
|
+
invert = false,
|
|
220
|
+
} = options;
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
type: 'LINEAR',
|
|
224
|
+
enabled: true,
|
|
225
|
+
transform: {
|
|
226
|
+
panX: 0,
|
|
227
|
+
panY: 0,
|
|
228
|
+
zoomX: 1.0,
|
|
229
|
+
zoomY: 1.0,
|
|
230
|
+
rotation: 0,
|
|
231
|
+
anchorX: 0.5,
|
|
232
|
+
anchorY: 0.5,
|
|
233
|
+
},
|
|
234
|
+
shape: {
|
|
235
|
+
angle,
|
|
236
|
+
position,
|
|
237
|
+
softness,
|
|
238
|
+
},
|
|
239
|
+
invert,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Create a gradient window from preset direction
|
|
245
|
+
*
|
|
246
|
+
* @param {string} direction - Direction name from GRADIENT_DIRECTIONS
|
|
247
|
+
* @param {Object} options - Additional options
|
|
248
|
+
* @param {number} options.position - Gradient position (0-1)
|
|
249
|
+
* @param {number} options.softness - Gradient softness (0-1)
|
|
250
|
+
* @param {boolean} options.invert - Invert selection
|
|
251
|
+
* @returns {Object} Window settings
|
|
252
|
+
*/
|
|
253
|
+
function createGradientWindow(direction, options = {}) {
|
|
254
|
+
const angle = GRADIENT_DIRECTIONS[direction.toUpperCase()] ?? 0;
|
|
255
|
+
return createLinearWindow({ ...options, angle });
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Create a horizontal split window (left/right)
|
|
260
|
+
*
|
|
261
|
+
* @param {Object} options - Split options
|
|
262
|
+
* @param {number} options.position - Split position (0-1, 0.5 = center)
|
|
263
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
264
|
+
* @param {boolean} options.selectRight - Select right side (default left)
|
|
265
|
+
* @returns {Object} Window settings
|
|
266
|
+
*/
|
|
267
|
+
function createHorizontalSplit(options = {}) {
|
|
268
|
+
const { position = 0.5, softness = 0.05, selectRight = false } = options;
|
|
269
|
+
|
|
270
|
+
return createLinearWindow({
|
|
271
|
+
angle: 90,
|
|
272
|
+
position,
|
|
273
|
+
softness,
|
|
274
|
+
invert: selectRight,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Create a vertical split window (top/bottom)
|
|
280
|
+
*
|
|
281
|
+
* @param {Object} options - Split options
|
|
282
|
+
* @param {number} options.position - Split position (0-1, 0.5 = center)
|
|
283
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
284
|
+
* @param {boolean} options.selectBottom - Select bottom side (default top)
|
|
285
|
+
* @returns {Object} Window settings
|
|
286
|
+
*/
|
|
287
|
+
function createVerticalSplit(options = {}) {
|
|
288
|
+
const { position = 0.5, softness = 0.05, selectBottom = false } = options;
|
|
289
|
+
|
|
290
|
+
return createLinearWindow({
|
|
291
|
+
angle: 0,
|
|
292
|
+
position,
|
|
293
|
+
softness,
|
|
294
|
+
invert: selectBottom,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
299
|
+
// POLYGON WINDOW BUILDERS
|
|
300
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Create a polygon power window
|
|
304
|
+
*
|
|
305
|
+
* @param {Array} points - Array of {x, y} points (0-1 normalized)
|
|
306
|
+
* @param {Object} options - Window options
|
|
307
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
308
|
+
* @param {boolean} options.invert - Invert selection
|
|
309
|
+
* @returns {Object} Window settings
|
|
310
|
+
*/
|
|
311
|
+
function createPolygonWindow(points, options = {}) {
|
|
312
|
+
const { softness = 0.05, invert = false } = options;
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
type: 'POLYGON',
|
|
316
|
+
enabled: true,
|
|
317
|
+
transform: {
|
|
318
|
+
panX: 0,
|
|
319
|
+
panY: 0,
|
|
320
|
+
zoomX: 1.0,
|
|
321
|
+
zoomY: 1.0,
|
|
322
|
+
rotation: 0,
|
|
323
|
+
anchorX: 0.5,
|
|
324
|
+
anchorY: 0.5,
|
|
325
|
+
},
|
|
326
|
+
shape: {
|
|
327
|
+
points: points.map((p) => ({ x: p.x, y: p.y })),
|
|
328
|
+
softness,
|
|
329
|
+
},
|
|
330
|
+
invert,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Create a rectangular polygon window
|
|
336
|
+
*
|
|
337
|
+
* @param {Object} options - Rectangle options
|
|
338
|
+
* @param {number} options.left - Left edge (0-1)
|
|
339
|
+
* @param {number} options.top - Top edge (0-1)
|
|
340
|
+
* @param {number} options.right - Right edge (0-1)
|
|
341
|
+
* @param {number} options.bottom - Bottom edge (0-1)
|
|
342
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
343
|
+
* @param {boolean} options.invert - Invert selection
|
|
344
|
+
* @returns {Object} Window settings
|
|
345
|
+
*/
|
|
346
|
+
function createRectangleWindow(options = {}) {
|
|
347
|
+
const {
|
|
348
|
+
left = 0.25,
|
|
349
|
+
top = 0.25,
|
|
350
|
+
right = 0.75,
|
|
351
|
+
bottom = 0.75,
|
|
352
|
+
softness = 0.05,
|
|
353
|
+
invert = false,
|
|
354
|
+
} = options;
|
|
355
|
+
|
|
356
|
+
const points = [
|
|
357
|
+
{ x: left, y: top },
|
|
358
|
+
{ x: right, y: top },
|
|
359
|
+
{ x: right, y: bottom },
|
|
360
|
+
{ x: left, y: bottom },
|
|
361
|
+
];
|
|
362
|
+
|
|
363
|
+
return createPolygonWindow(points, { softness, invert });
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Create a triangular polygon window
|
|
368
|
+
*
|
|
369
|
+
* @param {Object} options - Triangle options
|
|
370
|
+
* @param {Object} options.point1 - First point {x, y}
|
|
371
|
+
* @param {Object} options.point2 - Second point {x, y}
|
|
372
|
+
* @param {Object} options.point3 - Third point {x, y}
|
|
373
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
374
|
+
* @param {boolean} options.invert - Invert selection
|
|
375
|
+
* @returns {Object} Window settings
|
|
376
|
+
*/
|
|
377
|
+
function createTriangleWindow(options = {}) {
|
|
378
|
+
const {
|
|
379
|
+
point1 = { x: 0.5, y: 0.2 },
|
|
380
|
+
point2 = { x: 0.2, y: 0.8 },
|
|
381
|
+
point3 = { x: 0.8, y: 0.8 },
|
|
382
|
+
softness = 0.05,
|
|
383
|
+
invert = false,
|
|
384
|
+
} = options;
|
|
385
|
+
|
|
386
|
+
return createPolygonWindow([point1, point2, point3], { softness, invert });
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Create a regular polygon window (pentagon, hexagon, etc.)
|
|
391
|
+
*
|
|
392
|
+
* @param {Object} options - Polygon options
|
|
393
|
+
* @param {number} options.sides - Number of sides (3-12)
|
|
394
|
+
* @param {number} options.centerX - Center X position (0-1)
|
|
395
|
+
* @param {number} options.centerY - Center Y position (0-1)
|
|
396
|
+
* @param {number} options.radius - Polygon radius (0-0.5)
|
|
397
|
+
* @param {number} options.rotation - Rotation in degrees
|
|
398
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
399
|
+
* @param {boolean} options.invert - Invert selection
|
|
400
|
+
* @returns {Object} Window settings
|
|
401
|
+
*/
|
|
402
|
+
function createRegularPolygonWindow(options = {}) {
|
|
403
|
+
const {
|
|
404
|
+
sides = 6,
|
|
405
|
+
centerX = 0.5,
|
|
406
|
+
centerY = 0.5,
|
|
407
|
+
radius = 0.25,
|
|
408
|
+
rotation = 0,
|
|
409
|
+
softness = 0.05,
|
|
410
|
+
invert = false,
|
|
411
|
+
} = options;
|
|
412
|
+
|
|
413
|
+
const points = [];
|
|
414
|
+
const angleStep = (2 * Math.PI) / sides;
|
|
415
|
+
const rotationRad = (rotation * Math.PI) / 180;
|
|
416
|
+
|
|
417
|
+
for (let i = 0; i < sides; i++) {
|
|
418
|
+
const angle = angleStep * i - Math.PI / 2 + rotationRad;
|
|
419
|
+
points.push({
|
|
420
|
+
x: centerX + radius * Math.cos(angle),
|
|
421
|
+
y: centerY + radius * Math.sin(angle),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return createPolygonWindow(points, { softness, invert });
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
429
|
+
// POWER CURVE WINDOW BUILDERS
|
|
430
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Create a power curve window (bezier-edged shape)
|
|
434
|
+
*
|
|
435
|
+
* @param {Array} controlPoints - Array of {x, y, handleX, handleY} points
|
|
436
|
+
* @param {Object} options - Window options
|
|
437
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
438
|
+
* @param {boolean} options.invert - Invert selection
|
|
439
|
+
* @returns {Object} Window settings
|
|
440
|
+
*/
|
|
441
|
+
function createPowerCurveWindow(controlPoints, options = {}) {
|
|
442
|
+
const { softness = 0.1, invert = false } = options;
|
|
443
|
+
|
|
444
|
+
return {
|
|
445
|
+
type: 'CURVE',
|
|
446
|
+
enabled: true,
|
|
447
|
+
transform: {
|
|
448
|
+
panX: 0,
|
|
449
|
+
panY: 0,
|
|
450
|
+
zoomX: 1.0,
|
|
451
|
+
zoomY: 1.0,
|
|
452
|
+
rotation: 0,
|
|
453
|
+
anchorX: 0.5,
|
|
454
|
+
anchorY: 0.5,
|
|
455
|
+
},
|
|
456
|
+
shape: {
|
|
457
|
+
points: controlPoints.map((p) => ({
|
|
458
|
+
x: p.x,
|
|
459
|
+
y: p.y,
|
|
460
|
+
handleX: p.handleX ?? p.x,
|
|
461
|
+
handleY: p.handleY ?? p.y,
|
|
462
|
+
})),
|
|
463
|
+
softness,
|
|
464
|
+
feather: softness,
|
|
465
|
+
},
|
|
466
|
+
invert,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Create a curved rectangle (rounded corners)
|
|
472
|
+
*
|
|
473
|
+
* @param {Object} options - Rectangle options
|
|
474
|
+
* @param {number} options.left - Left edge (0-1)
|
|
475
|
+
* @param {number} options.top - Top edge (0-1)
|
|
476
|
+
* @param {number} options.right - Right edge (0-1)
|
|
477
|
+
* @param {number} options.bottom - Bottom edge (0-1)
|
|
478
|
+
* @param {number} options.cornerRadius - Corner radius (0-0.5)
|
|
479
|
+
* @param {number} options.softness - Edge softness (0-1)
|
|
480
|
+
* @param {boolean} options.invert - Invert selection
|
|
481
|
+
* @returns {Object} Window settings
|
|
482
|
+
*/
|
|
483
|
+
function createRoundedRectangleWindow(options = {}) {
|
|
484
|
+
const {
|
|
485
|
+
left = 0.2,
|
|
486
|
+
top = 0.2,
|
|
487
|
+
right = 0.8,
|
|
488
|
+
bottom = 0.8,
|
|
489
|
+
cornerRadius = 0.1,
|
|
490
|
+
softness = 0.05,
|
|
491
|
+
invert = false,
|
|
492
|
+
} = options;
|
|
493
|
+
|
|
494
|
+
// Generate points with bezier handles for rounded corners
|
|
495
|
+
const r = cornerRadius;
|
|
496
|
+
const controlPoints = [
|
|
497
|
+
// Top edge
|
|
498
|
+
{ x: left + r, y: top, handleX: left, handleY: top },
|
|
499
|
+
{ x: right - r, y: top, handleX: right, handleY: top },
|
|
500
|
+
// Right edge
|
|
501
|
+
{ x: right, y: top + r, handleX: right, handleY: top },
|
|
502
|
+
{ x: right, y: bottom - r, handleX: right, handleY: bottom },
|
|
503
|
+
// Bottom edge
|
|
504
|
+
{ x: right - r, y: bottom, handleX: right, handleY: bottom },
|
|
505
|
+
{ x: left + r, y: bottom, handleX: left, handleY: bottom },
|
|
506
|
+
// Left edge
|
|
507
|
+
{ x: left, y: bottom - r, handleX: left, handleY: bottom },
|
|
508
|
+
{ x: left, y: top + r, handleX: left, handleY: top },
|
|
509
|
+
];
|
|
510
|
+
|
|
511
|
+
return createPowerCurveWindow(controlPoints, { softness, invert });
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
515
|
+
// WINDOW TRANSFORM UTILITIES
|
|
516
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Apply transform to an existing window
|
|
520
|
+
*
|
|
521
|
+
* @param {Object} window - Existing window settings
|
|
522
|
+
* @param {Object} transform - Transform to apply
|
|
523
|
+
* @param {number} transform.panX - X offset (-1 to 1)
|
|
524
|
+
* @param {number} transform.panY - Y offset (-1 to 1)
|
|
525
|
+
* @param {number} transform.zoomX - X scale (0.1 to 10)
|
|
526
|
+
* @param {number} transform.zoomY - Y scale (0.1 to 10)
|
|
527
|
+
* @param {number} transform.rotation - Rotation in degrees
|
|
528
|
+
* @returns {Object} Transformed window
|
|
529
|
+
*/
|
|
530
|
+
function applyWindowTransform(window, transform) {
|
|
531
|
+
return {
|
|
532
|
+
...window,
|
|
533
|
+
transform: {
|
|
534
|
+
...window.transform,
|
|
535
|
+
panX: (window.transform?.panX ?? 0) + (transform.panX ?? 0),
|
|
536
|
+
panY: (window.transform?.panY ?? 0) + (transform.panY ?? 0),
|
|
537
|
+
zoomX: (window.transform?.zoomX ?? 1) * (transform.zoomX ?? 1),
|
|
538
|
+
zoomY: (window.transform?.zoomY ?? 1) * (transform.zoomY ?? 1),
|
|
539
|
+
rotation: (window.transform?.rotation ?? 0) + (transform.rotation ?? 0),
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Scale a window uniformly
|
|
546
|
+
*
|
|
547
|
+
* @param {Object} window - Existing window settings
|
|
548
|
+
* @param {number} scale - Scale factor (1 = no change)
|
|
549
|
+
* @returns {Object} Scaled window
|
|
550
|
+
*/
|
|
551
|
+
function scaleWindow(window, scale) {
|
|
552
|
+
return applyWindowTransform(window, {
|
|
553
|
+
zoomX: scale,
|
|
554
|
+
zoomY: scale,
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* Move a window
|
|
560
|
+
*
|
|
561
|
+
* @param {Object} window - Existing window settings
|
|
562
|
+
* @param {number} offsetX - X offset (-1 to 1)
|
|
563
|
+
* @param {number} offsetY - Y offset (-1 to 1)
|
|
564
|
+
* @returns {Object} Moved window
|
|
565
|
+
*/
|
|
566
|
+
function moveWindow(window, offsetX, offsetY) {
|
|
567
|
+
return applyWindowTransform(window, {
|
|
568
|
+
panX: offsetX,
|
|
569
|
+
panY: offsetY,
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Rotate a window
|
|
575
|
+
*
|
|
576
|
+
* @param {Object} window - Existing window settings
|
|
577
|
+
* @param {number} degrees - Rotation in degrees
|
|
578
|
+
* @returns {Object} Rotated window
|
|
579
|
+
*/
|
|
580
|
+
function rotateWindow(window, degrees) {
|
|
581
|
+
return applyWindowTransform(window, {
|
|
582
|
+
rotation: degrees,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
587
|
+
// WINDOW SOFTNESS UTILITIES
|
|
588
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Apply softness settings to a window
|
|
592
|
+
*
|
|
593
|
+
* @param {Object} window - Existing window settings
|
|
594
|
+
* @param {Object} softness - Softness settings
|
|
595
|
+
* @param {number} softness.overall - Overall softness (0-1)
|
|
596
|
+
* @param {number} softness.inside - Inside edge softness (0-1)
|
|
597
|
+
* @param {number} softness.outside - Outside edge softness (0-1)
|
|
598
|
+
* @returns {Object} Window with updated softness
|
|
599
|
+
*/
|
|
600
|
+
function applyWindowSoftness(window, softness = {}) {
|
|
601
|
+
const { overall, inside = 0, outside = softness.overall } = softness;
|
|
602
|
+
|
|
603
|
+
return {
|
|
604
|
+
...window,
|
|
605
|
+
shape: {
|
|
606
|
+
...window.shape,
|
|
607
|
+
softness: overall ?? window.shape?.softness,
|
|
608
|
+
insideSoftness: inside,
|
|
609
|
+
outsideSoftness: outside ?? overall ?? window.shape?.outsideSoftness,
|
|
610
|
+
},
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Apply preset softness to a window
|
|
616
|
+
*
|
|
617
|
+
* @param {Object} window - Existing window settings
|
|
618
|
+
* @param {string} preset - Preset name from SOFTNESS_PRESETS
|
|
619
|
+
* @returns {Object} Window with preset softness
|
|
620
|
+
*/
|
|
621
|
+
function applyPresetSoftness(window, preset) {
|
|
622
|
+
const softness = SOFTNESS_PRESETS[preset.toUpperCase()] ?? SOFTNESS_PRESETS.SOFT;
|
|
623
|
+
return applyWindowSoftness(window, { overall: softness });
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
627
|
+
// WINDOW CORRECTOR BUILDER
|
|
628
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* Create a complete window corrector ready for encoding
|
|
632
|
+
*
|
|
633
|
+
* @param {Object} window - Window settings from any builder
|
|
634
|
+
* @returns {Object} Corrector object for node-tree-encoder
|
|
635
|
+
*/
|
|
636
|
+
function createWindowCorrector(window) {
|
|
637
|
+
return {
|
|
638
|
+
typeId: CORRECTOR_TYPE.WINDOW,
|
|
639
|
+
enabled: true,
|
|
640
|
+
values: {
|
|
641
|
+
window,
|
|
642
|
+
},
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Create a windowed correction node (window + primary correction)
|
|
648
|
+
*
|
|
649
|
+
* @param {Object} window - Window settings
|
|
650
|
+
* @param {Object} correction - Primary correction to apply
|
|
651
|
+
* @returns {Object} Node definition with both correctors
|
|
652
|
+
*/
|
|
653
|
+
function createWindowedCorrectionNode(window, correction) {
|
|
654
|
+
return {
|
|
655
|
+
id: `windowed_node_${Date.now()}`,
|
|
656
|
+
label: 'Windowed Correction',
|
|
657
|
+
enabled: true,
|
|
658
|
+
correctors: [
|
|
659
|
+
createWindowCorrector(window),
|
|
660
|
+
{
|
|
661
|
+
typeId: CORRECTOR_TYPE.PRIMARY,
|
|
662
|
+
enabled: true,
|
|
663
|
+
values: correction,
|
|
664
|
+
},
|
|
665
|
+
],
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Combine multiple windows (intersect/union)
|
|
671
|
+
*
|
|
672
|
+
* Note: DaVinci Resolve handles multiple windows per node
|
|
673
|
+
* through multiple window correctors. This creates a node
|
|
674
|
+
* with multiple windows.
|
|
675
|
+
*
|
|
676
|
+
* @param {Array} windows - Array of window settings
|
|
677
|
+
* @param {Object} correction - Primary correction to apply
|
|
678
|
+
* @returns {Object} Node with multiple windows
|
|
679
|
+
*/
|
|
680
|
+
function createMultiWindowNode(windows, correction) {
|
|
681
|
+
const correctors = windows.map((w) => createWindowCorrector(w));
|
|
682
|
+
|
|
683
|
+
if (correction) {
|
|
684
|
+
correctors.push({
|
|
685
|
+
typeId: CORRECTOR_TYPE.PRIMARY,
|
|
686
|
+
enabled: true,
|
|
687
|
+
values: correction,
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
return {
|
|
692
|
+
id: `multi_window_node_${Date.now()}`,
|
|
693
|
+
label: 'Multi-Window',
|
|
694
|
+
enabled: true,
|
|
695
|
+
correctors,
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
700
|
+
// TRACKING DATA (PLACEHOLDER)
|
|
701
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Window tracking data structure (read-only reference)
|
|
705
|
+
*
|
|
706
|
+
* Note: Tracking data is typically generated by Resolve's tracker,
|
|
707
|
+
* not encoded manually. This structure documents the format for
|
|
708
|
+
* potential future use in reading/modifying existing tracking data.
|
|
709
|
+
*/
|
|
710
|
+
const TRACKING_DATA_STRUCTURE = {
|
|
711
|
+
// Frame-by-frame transform data
|
|
712
|
+
frames: [
|
|
713
|
+
{
|
|
714
|
+
frame: 0,
|
|
715
|
+
panX: 0,
|
|
716
|
+
panY: 0,
|
|
717
|
+
zoomX: 1,
|
|
718
|
+
zoomY: 1,
|
|
719
|
+
rotation: 0,
|
|
720
|
+
},
|
|
721
|
+
],
|
|
722
|
+
// Tracking type
|
|
723
|
+
type: 'point', // 'point', 'object', 'surface'
|
|
724
|
+
// Source clip reference
|
|
725
|
+
clipId: null,
|
|
726
|
+
// Tracking region
|
|
727
|
+
searchRegion: { x: 0, y: 0, width: 0.2, height: 0.2 },
|
|
728
|
+
};
|
|
729
|
+
|
|
730
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
731
|
+
// EXPORTS
|
|
732
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
733
|
+
|
|
734
|
+
module.exports = {
|
|
735
|
+
// Circular/Oval windows
|
|
736
|
+
createCircularWindow,
|
|
737
|
+
createOvalWindow,
|
|
738
|
+
createVignetteWindow,
|
|
739
|
+
|
|
740
|
+
// Linear/Gradient windows
|
|
741
|
+
createLinearWindow,
|
|
742
|
+
createGradientWindow,
|
|
743
|
+
createHorizontalSplit,
|
|
744
|
+
createVerticalSplit,
|
|
745
|
+
|
|
746
|
+
// Polygon windows
|
|
747
|
+
createPolygonWindow,
|
|
748
|
+
createRectangleWindow,
|
|
749
|
+
createTriangleWindow,
|
|
750
|
+
createRegularPolygonWindow,
|
|
751
|
+
|
|
752
|
+
// Power curve windows
|
|
753
|
+
createPowerCurveWindow,
|
|
754
|
+
createRoundedRectangleWindow,
|
|
755
|
+
|
|
756
|
+
// Transform utilities
|
|
757
|
+
applyWindowTransform,
|
|
758
|
+
scaleWindow,
|
|
759
|
+
moveWindow,
|
|
760
|
+
rotateWindow,
|
|
761
|
+
|
|
762
|
+
// Softness utilities
|
|
763
|
+
applyWindowSoftness,
|
|
764
|
+
applyPresetSoftness,
|
|
765
|
+
|
|
766
|
+
// Corrector builders
|
|
767
|
+
createWindowCorrector,
|
|
768
|
+
createWindowedCorrectionNode,
|
|
769
|
+
createMultiWindowNode,
|
|
770
|
+
|
|
771
|
+
// Constants
|
|
772
|
+
ASPECT_RATIOS,
|
|
773
|
+
GRADIENT_DIRECTIONS,
|
|
774
|
+
SOFTNESS_PRESETS,
|
|
775
|
+
TRACKING_DATA_STRUCTURE,
|
|
776
|
+
};
|