davinci-resolve-mcp 2.93.0 → 2.93.2
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/CHANGELOG.md +57 -0
- package/README.md +1 -1
- package/README.zh-CN.md +2 -2
- package/docs/guides/media-analysis-guide.md +42 -0
- package/docs/reference/api-limitations.md +2 -2
- package/install.py +1 -1
- package/package.json +1 -1
- package/resolve-advanced/vendor/drp-format/README.md +32 -4
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
- package/src/utils/api_truth.py +32 -2
- package/src/utils/delivery_targets.py +10 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
|
|
4
4
|
|
|
5
|
+
## What's New in v2.93.2
|
|
6
|
+
|
|
7
|
+
Documentation and ledger correction, validated live against DaVinci Resolve
|
|
8
|
+
Studio **21.0.4.5** (version read from the running instance, not assumed).
|
|
9
|
+
|
|
10
|
+
- **A false "verified live" workaround for issue #74 is withdrawn, and the real
|
|
11
|
+
mechanism is documented.** `resolve-advanced/vendor/drp-format/README.md`
|
|
12
|
+
claimed that locking the video tracks below your target redirects
|
|
13
|
+
`InsertFusionTitleIntoTimeline` to that track, and called it verified live. It
|
|
14
|
+
shipped with no test, log, or evidence file, and it contradicted the
|
|
15
|
+
`api_truth` ledger entry written twelve days earlier from an explicit test
|
|
16
|
+
matrix. A third party independently reproduced the ledger's version on
|
|
17
|
+
21.0.4.5, so the two claims were re-measured on one rig, one fresh
|
|
18
|
+
3-video-track timeline per arm so no insert could fail on a collision:
|
|
19
|
+
|
|
20
|
+
| Arm | Setup | `InsertFusionTitleIntoTimeline("Text+")` |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| A | nothing locked | lands on **V1** |
|
|
23
|
+
| B | V1 locked via `Timeline.SetTrackLock` | returns **`None`** |
|
|
24
|
+
| C | V1 locked by **clicking the padlock in the UI** | returns **`None`** |
|
|
25
|
+
| D | nothing locked, source patch dragged to V2 in the UI | lands on **V2** |
|
|
26
|
+
|
|
27
|
+
B and C are identical, which kills the standing theory that a GUI lock
|
|
28
|
+
advances the selector where the API lock does not. Locking blocks the target;
|
|
29
|
+
it never re-targets. The README claim is withdrawn as false and the ledger
|
|
30
|
+
entry — previously measured on 21.0.0 — is confirmed on the newest build.
|
|
31
|
+
|
|
32
|
+
- **The destination is the patch panel, not the lock state.** Arm D is the
|
|
33
|
+
finding: dragging the source patch badge onto V2 in the Edit page sends the
|
|
34
|
+
next insert to V2. The per-track badge column in the track header is the
|
|
35
|
+
auto-track-selector toggle; the source patch badge appears only on the patched
|
|
36
|
+
track, and dragging that is what re-targets. The capability exists in the
|
|
37
|
+
application and is reachable only by GUI automation — so the request to
|
|
38
|
+
Blackmagic is read/write access to the patch panel, which is smaller and
|
|
39
|
+
better defined than adding `trackIndex` to all six `Insert*IntoTimeline`
|
|
40
|
+
methods. The route is unverifiable from the API side (nothing in the scripting
|
|
41
|
+
surface confirms where the selector landed), so read the landing track back
|
|
42
|
+
with `TimelineItem.GetTrackTypeAndIndex()` and treat a wrong track as a
|
|
43
|
+
failure. Offline, `drp place_fusion_title` remains deterministic.
|
|
44
|
+
|
|
45
|
+
## What's New in v2.93.1
|
|
46
|
+
|
|
47
|
+
Documentation only; no behavior changed and no Resolve validation required.
|
|
48
|
+
|
|
49
|
+
- **The immediate-retake blind spot is now in the media-analysis guide.** Issue
|
|
50
|
+
#125 asked for three things; the `rank_takes` caveat and the
|
|
51
|
+
`possible_swallowed_retakes` flag shipped in v2.83.0, but the documented
|
|
52
|
+
limitation never did — the guide had zero mentions of retakes, so the only way
|
|
53
|
+
to learn that word timestamps are untrustworthy around an immediate re-read was
|
|
54
|
+
to already be looking at output that flagged one. The new section states what
|
|
55
|
+
whisper does (emits a re-read sentence once, aligns it to the first take, and
|
|
56
|
+
absorbs pause-plus-second-take into a single word), names every feature that
|
|
57
|
+
inherits it, and records why silence detection cannot substitute — the
|
|
58
|
+
swallowed span measured **−12.1 dB** against adjacent speech at −16.7 dB, and a
|
|
59
|
+
silence pass recalled **3 of 17**. It is explicit that the flag is never a cut
|
|
60
|
+
point, and that no flags is weak evidence rather than proof.
|
|
61
|
+
|
|
5
62
|
## What's New in v2.93.0
|
|
6
63
|
|
|
7
64
|
`source_end` is a source frame again, and the guidance v2.91.0 shipped about WAV
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
English | [简体中文](README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
8
|
[-blue.svg)](#server-modes)
|
package/README.zh-CN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | 简体中文
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
8
|
[-blue.svg)](#服务器模式)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://www.python.org/downloads/)
|
|
13
13
|
[](https://opensource.org/licenses/MIT)
|
|
14
14
|
|
|
15
|
-
> 本翻译对应 v2.93.
|
|
15
|
+
> 本翻译对应 v2.93.2 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
|
@@ -798,6 +798,48 @@ When analysis reveals potential issues, always alert the user:
|
|
|
798
798
|
|
|
799
799
|
---
|
|
800
800
|
|
|
801
|
+
## Known Limitation: word timestamps lie around immediate retakes
|
|
802
|
+
|
|
803
|
+
**Transcripts do not report a re-read sentence twice.** When a speaker
|
|
804
|
+
immediately re-reads a line — the ordinary way people self-correct while
|
|
805
|
+
recording — whisper emits the text **once**, aligns it to the **first** take, and
|
|
806
|
+
absorbs "pause + entire second take" into the duration of a **single word**.
|
|
807
|
+
Measured on real Chinese material: one single-character word spanning **6.06 s**,
|
|
808
|
+
another **4.4 s**, where real speech runs 4–7 chars/s. Reproduced on English with
|
|
809
|
+
the identical signature: the word *"lives"* carrying **2.42 s**. Issue #125.
|
|
810
|
+
|
|
811
|
+
Everything downstream of the transcript inherits it:
|
|
812
|
+
|
|
813
|
+
- **Retake and false-start detection never fires** for this class — the
|
|
814
|
+
transcript says the sentence was spoken cleanly, once.
|
|
815
|
+
- **`rank_takes` undercounts restarts**, so a take that stumbled and recovered
|
|
816
|
+
can outscore one that did not. Its `caveat` field says so at runtime.
|
|
817
|
+
- **Word-level cuts near a swallow land inside speech**, because the timestamps
|
|
818
|
+
inflate around the absorption point.
|
|
819
|
+
- **`plan_transcript_tighten` is structurally blind here** — its false-start
|
|
820
|
+
heuristic only sees restarts the transcript reports.
|
|
821
|
+
|
|
822
|
+
**Silence detection cannot rescue it.** The swallowed span is not silence: in the
|
|
823
|
+
original measurement it was breathing and keyboard noise peaking at **−12.1 dB**,
|
|
824
|
+
*louder* than the adjacent real speech at −16.7 dB. A silence-based pass recalled
|
|
825
|
+
**3 of 17** ground-truth instances at any threshold.
|
|
826
|
+
|
|
827
|
+
**What the analysis output gives you.** Transcript-reading results carry
|
|
828
|
+
`possible_swallowed_retakes`: words whose duration exceeds an absolute bar
|
|
829
|
+
(default **1.2 s**), which is language-agnostic and computed from data the
|
|
830
|
+
pipeline already has. Treat it as a **flag, not a cut point** — where inside the
|
|
831
|
+
stretched word the second take begins is precisely what the swallow destroyed, so
|
|
832
|
+
those need a human ear or a re-transcription of the isolated window before
|
|
833
|
+
anything is removed.
|
|
834
|
+
|
|
835
|
+
**Read the empty case correctly.** No flags is *weak evidence, not proof*. A
|
|
836
|
+
swallow smeared across several words instead of concentrated in one will not
|
|
837
|
+
clear the bar, and that case is expected to exist. The bar itself is a usable
|
|
838
|
+
default chosen from limited data — 17 real instances in Chinese, confirmed by a
|
|
839
|
+
single genuine English swallow in synthetic material — not a tuned constant.
|
|
840
|
+
|
|
841
|
+
---
|
|
842
|
+
|
|
801
843
|
## Key Principles
|
|
802
844
|
|
|
803
845
|
- **The source is sacred.** Read from source files, write only to analysis sidecars unless a visual analysis workflow needs sampled frames/contact sheets in a separate analysis directory. Confirmed metadata publishing writes to Resolve's project database, not source media. `analyze_media` can opt out with `include_visuals=false`.
|
|
@@ -66,8 +66,8 @@ equivalent, blocking full automation.
|
|
|
66
66
|
### Source Track Selector / destination track for Insert*IntoTimeline
|
|
67
67
|
|
|
68
68
|
- **Object:** `Timeline`
|
|
69
|
-
- **Behavior:** There is no API to read or set the Source/Auto Track Selector (the Edit-page patch panel that picks the destination track). InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, InsertOFXGeneratorIntoTimeline and InsertFusionCompositionIntoTimeline take no trackIndex and always drop the clip on the selector's current target (V1 in practice). Locking lower video tracks does NOT redirect the insert — verified live on 21.0.0: locking V1 makes the insert FAIL rather than land on V2. Titles/generators also can't be moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo and MoveClips don't apply).
|
|
70
|
-
- **Workaround / current handling:** Accept the limitation for titles/generators (insert lands on V1). For clips that DO have a MediaPoolItem, target a track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' instead (exposed as media_pool append_to_timeline clip_infos). See issue #74.
|
|
69
|
+
- **Behavior:** There is no API to read or set the Source/Auto Track Selector (the Edit-page patch panel that picks the destination track). InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, InsertOFXGeneratorIntoTimeline and InsertFusionCompositionIntoTimeline take no trackIndex and always drop the clip on the selector's current target (V1 in practice). Locking lower video tracks does NOT redirect the insert — verified live on 21.0.0: locking V1 makes the insert FAIL rather than land on V2. Titles/generators also can't be moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo and MoveClips don't apply). RE-MEASURED on Studio 21.0.4.5 (2026-08-12, version read live), one fresh 3-video-track timeline per arm so no insert could fail on a collision: nothing locked -> lands V1; V1 locked via SetTrackLock -> returns None; V1 locked by CLICKING THE PADLOCK IN THE UI -> returns None, IDENTICAL to the API lock. That kills the recurring theory that the GUI lock advances the selector where the API lock does not — it does not, and a revision of resolve-advanced/vendor/drp-format/README.md that claimed otherwise as 'verified live' has been withdrawn as false. WHAT DOES WORK, and it is the whole mechanism: dragging the SOURCE PATCH badge onto V2 in the Edit-page patch panel sends the next insert to V2 (measured, same rig, nothing locked). The destination is the patch panel, never the lock state. In the track header the per-track badge column is the auto-track-selector toggle, while the source patch badge appears only on the patched track and dragging THAT is what re-targets. So the capability exists in the application and is reachable only by GUI automation; exposing read/write on the patch panel is a smaller, better-defined API request than adding trackIndex to all six Insert*IntoTimeline methods.
|
|
70
|
+
- **Workaround / current handling:** Accept the limitation for titles/generators (insert lands on V1). For clips that DO have a MediaPoolItem, target a track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' instead (exposed as media_pool append_to_timeline clip_infos). Do NOT reach for track locking as a bypass in either form — it blocks the insert rather than re-targeting it. If a title genuinely must land on a chosen track of the OPEN timeline, the only route is GUI automation of the patch panel, and it is unverifiable from the API side: nothing in the scripting surface can confirm the selector went where you dragged it, so read the landing track back with TimelineItem.GetTrackTypeAndIndex() and treat a wrong track as a failure. For anything that can be built offline, place titles by track and frame with the advanced server's drp place_fusion_title instead. See issue #74.
|
|
71
71
|
- **Reference:** [issue #74](https://github.com/samuelgursky/davinci-resolve-mcp/issues/74)
|
|
72
72
|
- **Tags:** missing-method, timeline, title, generator, track
|
|
73
73
|
|
package/install.py
CHANGED
|
@@ -36,7 +36,7 @@ from src.utils.update_check import (
|
|
|
36
36
|
|
|
37
37
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
38
38
|
|
|
39
|
-
VERSION = "2.93.
|
|
39
|
+
VERSION = "2.93.2"
|
|
40
40
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
41
41
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
42
42
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
|
@@ -87,10 +87,38 @@ Plus the full **DRX grade** surface (`createSimpleGrade`, curves/qualifiers/wind
|
|
|
87
87
|
## Live-edit recipe (the one thing that needs Resolve running)
|
|
88
88
|
|
|
89
89
|
**#74 — insert a Text+/generator on a chosen track of the OPEN timeline.** The API's
|
|
90
|
-
`InsertFusionTitleIntoTimeline` takes no track arg
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
`InsertFusionTitleIntoTimeline` takes no track arg; the insert lands on the Source/Auto Track
|
|
91
|
+
Selector's current target (V1 in practice), which no API can read or set.
|
|
92
|
+
|
|
93
|
+
> **Track locking does not redirect the insert — through the API *or* the UI.** An earlier
|
|
94
|
+
> revision of this README claimed that locking the tracks below your target via computer-use
|
|
95
|
+
> redirects the insert, and called it verified live. That claim shipped with no test or evidence
|
|
96
|
+
> and is **withdrawn as false.** Measured 2026-08-12 on **Studio 21.0.4.5** (version read live,
|
|
97
|
+
> not assumed), one fresh 3-video-track timeline per arm so no insert could fail on a collision:
|
|
98
|
+
>
|
|
99
|
+
> | Arm | Setup | `InsertFusionTitleIntoTimeline("Text+")` |
|
|
100
|
+
> |---|---|---|
|
|
101
|
+
> | A | nothing locked | lands on **V1** |
|
|
102
|
+
> | B | V1 locked via `Timeline.SetTrackLock` | returns **None**, nothing placed |
|
|
103
|
+
> | C | V1 locked by **clicking the padlock in the UI** | returns **None**, nothing placed |
|
|
104
|
+
> | D | nothing locked, source patch dragged to V2 in the UI | lands on **V2** |
|
|
105
|
+
>
|
|
106
|
+
> B and C are identical, so the GUI-lock hypothesis is dead: locking blocks the target, it never
|
|
107
|
+
> re-targets. This also reproduces issue #74 (measured on 21.0.0) on the newest build.
|
|
108
|
+
>
|
|
109
|
+
> **D is the real control.** The destination is the Edit-page patch panel, not the lock state.
|
|
110
|
+
> Dragging the source patch onto V2 sends the insert to V2. In the header, the x-column of
|
|
111
|
+
> per-track badges is the auto-track-selector toggle; the source patch badge appears only on the
|
|
112
|
+
> patched track, and dragging it is what re-targets. The API can neither read nor set any of it —
|
|
113
|
+
> which is exactly the gap to put in front of Blackmagic, and a far smaller ask than new
|
|
114
|
+
> parameters on all six `Insert*IntoTimeline` methods.
|
|
115
|
+
>
|
|
116
|
+
> So a live-edit recipe does exist, but it is **GUI automation of the patch panel**, not track
|
|
117
|
+
> locking. Treat it as such: it is not verifiable from the API side, since nothing in the
|
|
118
|
+
> scripting surface can confirm the selector landed where you dragged it.
|
|
119
|
+
|
|
120
|
+
For export-based workflows, `place_fusion_title` places a title on any track at an exact frame
|
|
121
|
+
offline, with no selector involved.
|
|
94
122
|
|
|
95
123
|
---
|
|
96
124
|
|
package/src/granular/common.py
CHANGED
|
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
|
|
|
87
87
|
handlers=[logging.StreamHandler()],
|
|
88
88
|
)
|
|
89
89
|
|
|
90
|
-
VERSION = "2.93.
|
|
90
|
+
VERSION = "2.93.2"
|
|
91
91
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
92
92
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
93
93
|
logger.info(f"Detected platform: {get_platform()}")
|
package/src/server.py
CHANGED
package/src/utils/api_truth.py
CHANGED
|
@@ -560,12 +560,42 @@ API_TRUTH: List[Dict[str, Any]] = [
|
|
|
560
560
|
"insert — verified live on 21.0.0: locking V1 makes the insert "
|
|
561
561
|
"FAIL rather than land on V2. Titles/generators also can't be "
|
|
562
562
|
"moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo "
|
|
563
|
-
"and MoveClips don't apply)."
|
|
563
|
+
"and MoveClips don't apply). RE-MEASURED on Studio 21.0.4.5 "
|
|
564
|
+
"(2026-08-12, version read live), one fresh 3-video-track "
|
|
565
|
+
"timeline per arm so no insert could fail on a collision: "
|
|
566
|
+
"nothing locked -> lands V1; V1 locked via SetTrackLock -> "
|
|
567
|
+
"returns None; V1 locked by CLICKING THE PADLOCK IN THE UI -> "
|
|
568
|
+
"returns None, IDENTICAL to the API lock. That kills the "
|
|
569
|
+
"recurring theory that the GUI lock advances the selector where "
|
|
570
|
+
"the API lock does not — it does not, and a revision of "
|
|
571
|
+
"resolve-advanced/vendor/drp-format/README.md that claimed "
|
|
572
|
+
"otherwise as 'verified live' has been withdrawn as false. "
|
|
573
|
+
"WHAT DOES WORK, and it is the whole mechanism: dragging the "
|
|
574
|
+
"SOURCE PATCH badge onto V2 in the Edit-page patch panel sends "
|
|
575
|
+
"the next insert to V2 (measured, same rig, nothing locked). The "
|
|
576
|
+
"destination is the patch panel, never the lock state. In the "
|
|
577
|
+
"track header the per-track badge column is the auto-track-selector "
|
|
578
|
+
"toggle, while the source patch badge appears only on the patched "
|
|
579
|
+
"track and dragging THAT is what re-targets. So the capability "
|
|
580
|
+
"exists in the application and is reachable only by GUI "
|
|
581
|
+
"automation; exposing read/write on the patch panel is a smaller, "
|
|
582
|
+
"better-defined API request than adding trackIndex to all six "
|
|
583
|
+
"Insert*IntoTimeline methods.",
|
|
564
584
|
"recommended": "Accept the limitation for titles/generators (insert lands "
|
|
565
585
|
"on V1). For clips that DO have a MediaPoolItem, target a "
|
|
566
586
|
"track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' "
|
|
567
587
|
"instead (exposed as media_pool append_to_timeline clip_infos). "
|
|
568
|
-
"
|
|
588
|
+
"Do NOT reach for track locking as a bypass in either form — "
|
|
589
|
+
"it blocks the insert rather than re-targeting it. If a title "
|
|
590
|
+
"genuinely must land on a chosen track of the OPEN timeline, "
|
|
591
|
+
"the only route is GUI automation of the patch panel, and it "
|
|
592
|
+
"is unverifiable from the API side: nothing in the scripting "
|
|
593
|
+
"surface can confirm the selector went where you dragged it, "
|
|
594
|
+
"so read the landing track back with "
|
|
595
|
+
"TimelineItem.GetTrackTypeAndIndex() and treat a wrong track "
|
|
596
|
+
"as a failure. For anything that can be built offline, place "
|
|
597
|
+
"titles by track and frame with the advanced server's "
|
|
598
|
+
"drp place_fusion_title instead. See issue #74.",
|
|
569
599
|
"tags": ["missing-method", "timeline", "title", "generator", "track"],
|
|
570
600
|
"submit": "missing",
|
|
571
601
|
"issue": 74,
|
|
@@ -471,33 +471,35 @@ DELIVERY_TARGETS: Dict[str, DeliveryTarget] = {
|
|
|
471
471
|
# ── Mastering: DNxHR family ─────────────────────────────────────────────
|
|
472
472
|
"dnxhr_lb_master": _dnxhr(
|
|
473
473
|
"dnxhr_lb_master", "LB",
|
|
474
|
-
("DNxHR LB", "
|
|
474
|
+
("DNxHRLB", "Avid DNxHR LB 12-bit", "DNxHR LB"),
|
|
475
475
|
"Low-bandwidth DNxHR. Offline/review, not finishing.",
|
|
476
476
|
),
|
|
477
477
|
"dnxhr_sq_master": _dnxhr(
|
|
478
478
|
"dnxhr_sq_master", "SQ",
|
|
479
|
-
("DNxHR SQ", "
|
|
479
|
+
("DNxHRSQ", "Avid DNxHR SQ 12-bit", "DNxHR SQ"),
|
|
480
480
|
"Standard-quality DNxHR. Avid-family review and distribution.",
|
|
481
481
|
),
|
|
482
482
|
"dnxhr_hq_master": _dnxhr(
|
|
483
483
|
"dnxhr_hq_master", "HQ",
|
|
484
|
-
("DNxHR HQ", "
|
|
484
|
+
("DNxHRHQ", "Avid DNxHR HQ 12-bit", "DNxHR HQ"),
|
|
485
485
|
"High-quality 8-bit DNxHR. Common Avid mezzanine.",
|
|
486
486
|
),
|
|
487
|
-
#
|
|
487
|
+
# Codec IDS proved stable across 19.1.3.7 -> 21.0.4.5 while DESCRIPTIONS did not:
|
|
488
|
+
# every DNx description gained an "Avid " prefix in 21.x, and plain "DNxHR HQX"
|
|
489
|
+
# never existed. So the id leads each candidate list and descriptions follow.
|
|
488
490
|
"dnxhr_hqx_master": _dnxhr(
|
|
489
491
|
"dnxhr_hqx_master", "HQX 10-bit",
|
|
490
|
-
("DNxHR HQX 10-bit", "
|
|
492
|
+
("DNxHRHQX_10", "Avid DNxHR HQX 10-bit", "DNxHR HQX 10-bit", "DNxHRHQX_12", "DNxHR HQX"),
|
|
491
493
|
"10-bit DNxHR. The DNx tier to use for finishing and HDR.",
|
|
492
494
|
),
|
|
493
495
|
"dnxhr_444_master": _dnxhr(
|
|
494
496
|
"dnxhr_444_master", "444 12-bit",
|
|
495
|
-
("DNxHR 444 12-bit", "
|
|
497
|
+
("DNxHR444_12", "Avid DNxHR 444 12-bit", "DNxHR 444 12-bit", "DNxHR444_10", "DNxHR 444"),
|
|
496
498
|
"4:4:4 12-bit DNxHR. Highest DNx tier for finishing.",
|
|
497
499
|
),
|
|
498
500
|
"dnxhd_1080p220_10_master": _dnxhr(
|
|
499
501
|
"dnxhd_1080p220_10_master", "HD 1080p 220 10-bit",
|
|
500
|
-
("DNxHD 1080p 220/185/175 10-bit", "
|
|
502
|
+
("DNxHD1080p220_10", "Avid DNxHD 1080p 220/185/175 10-bit", "DNxHD 1080p 220/185/175 10-bit"),
|
|
501
503
|
"HD-era 10-bit DNxHD for Avid finishing at 1920x1080.",
|
|
502
504
|
width=1920,
|
|
503
505
|
height=1080,
|
|
@@ -561,7 +563,7 @@ DELIVERY_TARGETS: Dict[str, DeliveryTarget] = {
|
|
|
561
563
|
describe="Avid-native handoff: MXF OP-Atom essence, DNxHR HQ.",
|
|
562
564
|
tier="broadcast",
|
|
563
565
|
format_candidates=("MXF OP-Atom", "MXF_OP_Atom", "mxf_op_atom"),
|
|
564
|
-
codec_candidates=("DNxHR HQ", "
|
|
566
|
+
codec_candidates=("DNxHRHQ", "Avid DNxHR HQ 12-bit", "DNxHR HQ"),
|
|
565
567
|
qc_container="mxf",
|
|
566
568
|
qc_codec="dnxhd",
|
|
567
569
|
audio_channels=2,
|