ここまでは、シーケンス上でCDLを確認する構成を見てきました。

次に、この仕組みをBatch(ショット単位)でも使っていきます。

手動で確認

まずはBatch上で、手動からLook(.ccファイル)を切り替えて確認します。

Batch SchematicにACES2065-1をロード

BatchからもViewとLookが正しく認識

Context Variablesを選択しているクリップのクリップネームに変更

Look(.ccファイル)が適用

シーケンスセグメントと同じで、
データに影響を与えず、ビューポート上の見た目だけが変化している状態です。

Batchビューポートは更新されていますが、
Scopeが更新されていません。

Look on → off → on のようにリフレッシュする必要があります。

Pythonによる自動化(クリップ)

Context Variablesを毎回手動で切り替えるのは現実的ではないため、
Pythonスクリプトで自動化します。

シーケンスではセグメントを選択するため、
そこからリンクしているクリップの名前を取得しています。

shot = seg.source_name.strip()

Batchでは、クリップを直接選択できるため、
そのままクリップネームをSHOTとして使用しています。

shot = selected_clip.name.get_value().strip()

シーケンスとBatchで入口は異なりますが、最終的には同じ処理になります。

[シーケンス]
 セグメント → クリップ → SHOT

[Batch]
 クリップ → SHOT

以下が実際に使用しているスクリプトです。
最小構成の例として記載しています。

set_shot_from_selected_clip.py
import flame

DEFAULT_SHOT_NAME = "default"

def _set_shot_context(shot_name):
    proj = flame.project.current_project

    if not shot_name:
        raise RuntimeError("SHOT名が空です")

    proj.set_context_variable("SHOT", shot_name)
    proj.reload_ocio_config()

    print("SHOT =", shot_name)
    print("contexts =", proj.get_context_variables())

def set_shot_from_selected_clip(selection):
    try:
        nodes = flame.batch.selected_nodes.get_value()
    except Exception as e:
        raise RuntimeError(f"選択ノードを取得できません: {e}")

    if not nodes:
        raise RuntimeError("Clipノードを1つ選択してください")

    selected_clip = None

    for node in nodes:
        try:
            if node.__class__.__name__ == "PyClipNode":
                selected_clip = node
                break
        except Exception:
            pass

    if not selected_clip:
        raise RuntimeError("Clipノードを1つ選択してください")

    shot = selected_clip.name.get_value().strip()

    if not shot:
        raise RuntimeError("Clip名が空です")

    _set_shot_context(shot)

def set_default_cc(selection):
    _set_shot_context(DEFAULT_SHOT_NAME)

def is_batch_visible(selection):
    try:
        nodes = flame.batch.selected_nodes.get_value()
        if not nodes:
            return False

        for node in nodes:
            try:
                if node.__class__.__name__ == "PyClipNode":
                    return True
            except Exception:
                pass
    except Exception:
        return False

    return False

def always_visible(selection):
    return True

def get_batch_custom_ui_actions():
    return [
        {
            "name": "Shot_CDL_Tools",
            "actions": [
                {
                    "name": "Set_Selected_Clip",
                    "isVisible": is_batch_visible,
                    "execute": set_shot_from_selected_clip,
                    "minimumVersion": "2026.0",
                },
                {
                    "name": "Set_Default_CC",
                    "isVisible": always_visible,
                    "execute": set_default_cc,
                    "minimumVersion": "2026.0",
                },
            ],
        }
    ]

シーケンスセグメントと同じように、「Set Default CC」も用意しています。

チェック用Rec.709ムービー

ショットベースワークフローの場合、チェック用のRec.709ムービーが必要になるケースがあると思います。

Context VariablesにロードしているLook(.ccファイル)から簡単に作成することができます。

Viewを追加

チェック用ムービーはdisplay-referred(ここではRec.709想定)になるため、
今回は「Video」というルールを追加しています。

ViewsにあるCreate Viewから手動でルールを追加することもできますが、config.ocioに追加します。

shared_views:
  - ! {name: ACES 2.0 - SDR 100 nits + CDL, view_transform: ACES 2.0 - SDR 100 nits (Rec.709), display_colorspace: , looks: cdl_per_shot}
  - ! {name: Video, colorspace: Raw} ----> 追加

Display / active_views

該当displayに登録

displays:
  Rec.1886 Rec.709 - Display:
    - ! {name: Raw, colorspace: Raw}
    - ! [ACES 2.0 - SDR 100 nits (Rec.709), ACES 2.0 - SDR 100 nits + CDL, Video, Un-tone-mapped]

active_viewsに登録

active_views: [ACES 2.0 - HDR 1000 nits (P3 D65), ACES 2.0 - HDR 1000 nits (Rec.2020), ACES 2.0 - HDR 2000 nits (P3 D65), ACES 2.0 - HDR 2000 nits (Rec.2020), ACES 2.0 - HDR 4000 nits (P3 D65), ACES 2.0 - HDR 4000 nits (Rec.2020), ACES 2.0 - HDR 500 nits (P3 D65), ACES 2.0 - HDR 500 nits (Rec.2020), ACES 2.0 - HDR 108 nits (P3 D65), ACES 2.0 - SDR 100 nits (P3 D65), ACES 2.0 - SDR 100 nits (Rec.709), ACES 2.0 - SDR 100 nits + CDL, Video, Un-tone-mapped, Raw]

config.ocio設定は以上です。

View Transform

追加したViewが正しく認識されているか確認

Context VariablesをPythonスクリプトから変更

Colour ManagementノードをBatch Schematicに追加

View > Batchビューポートと同じACES 2.0 – SDR 100 nits + CDLを選択。

Batchでは、Colour ManagementノードのView Transformを使用し、
以下の順序で処理しています。

ACES2065-1(ソース)

Context Variables(CDL適用)

Viewport(SDR 100 nits Rec.709)

Video(出力) ※config.ocioに追加したルールを選択

View TransformからBatchビューポートで確認している状態と出力結果が一致します。

ACES 2.0 -SDR 100 nits + CDL

Video (View Transform)

DaVinci Resolveレンダークリップは、CDLをベイクしているので、Lookをオフにする必要があります。

すべて同じ結果を出力

まとめ

Context Variablesを使うことで、
ショットごとのCDLをLook(.ccファイル)として管理し、
シンプルに切り替えることができます。

シーケンスではViewで確認し、
Batchではそのまま出力することもできるので、
同じルールで運用を統一することができます。

こうした運用は、ACESのシーンリニア(scene-referred)な構造の上で、
表示と出力を分離できることによって成立しています。

なお、Flame 2027ではOCIOまわりにも変更があるため、
こうした運用がどう変わるのかは、今後確認していきます。