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 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
- [![Version](https://img.shields.io/badge/version-2.93.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.93.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(353%20full)-blue.svg)](#server-modes)
package/README.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | 简体中文
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.93.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.93.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(353%20full)-blue.svg)](#服务器模式)
@@ -12,7 +12,7 @@
12
12
  [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
13
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
14
14
 
15
- > 本翻译对应 v2.93.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
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.0"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.93.0",
3
+ "version": "2.93.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -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 (always the lowest unlocked video track). Bypass:
91
- via computer-use, **lock the video tracks below your target**, then call `timeline.insert_fusion_title` —
92
- it lands on the chosen track. Verified live. (For export-based workflows, `place_fusion_title` does this
93
- offline.)
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
 
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.93.0"
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
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 353-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.93.0"
14
+ VERSION = "2.93.2"
15
15
 
16
16
  import base64
17
17
  import os
@@ -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
- "See issue #74.",
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", "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", "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", "DNxHR_HQ"),
484
+ ("DNxHRHQ", "Avid DNxHR HQ 12-bit", "DNxHR HQ"),
485
485
  "High-quality 8-bit DNxHR. Common Avid mezzanine.",
486
486
  ),
487
- # Live matrix carries a bit depth in the label plain "DNxHR HQX" does not exist.
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", "DNxHRHQX_10", "DNxHR HQX 12-bit", "DNxHRHQX_12", "DNxHR HQX"),
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", "DNxHR444_12", "DNxHR 444 10-bit", "DNxHR444_10", "DNxHR 444"),
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", "DNxHD1080p220_10"),
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", "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,