toruのブログ

月1くらいで記事書きたい。

Windows 11 で HDR コンテンツを「オリジナルのまま加工せずに」モニターへ出力する(動画編)

1. はじめに

  • Windows 11 で HDRコンテンツを加工させずにモニターへ出力するのは意外と難しい
  • 大抵の場合は、アプリケーションが表示の破綻を防ぐためにコンテンツに「変換処理」を適用してしまう
  • コンテンツを「楽しむ」のではなく、コンテンツの「制作」や「解析」を目的とする場合、こうした変換が勝手に働くのは好ましくない
  • 本記事ではアプリケーションが行う「変換処理」の内容と、それをキャンセルする方法について述べる

2. 目的

  • HDRコンテンツを表示する際にコンテンツに適用される変換処理についてまとめる
  • Windows 11 で HDRコンテンツをオリジナルのまま加工せずにモニターへ出力する方法をまとめる
    • ただし、今回は YouTube での HDR動画再生に特化した内容とする
    • ISO HDR などの静止画の HDR表示に関しては 次回の記事 で紹介する

3. 結論

  • 現在の HDR対応モニターや TV は、HDRの国際標準と比較すると表示スペックが不足しており表示の際は変換処理が必要である
  • 具体例として「ピーク輝度 10,000 nits の YouTube 動画」を「ピーク輝度 400 nits のモニター」に表示した様子を図1 に示す

図1. ピーク輝度 10,000 nits のコンテンツをピーク輝度 400 nits のモニターで表示した場合に適用される変換処理の様子

  • Windows 11 にて変換処理をキャンセルするには、Windows に対して、接続されているモニターが十分な表示スペックを有していると認識させれば良い
  • 具体的には Windows の Color Management 機能で下記の情報を持つ MHC Profile *1 を設定すれば良い
Min Luminance Max Luminance Max Full Frame Luminance Color primaries White point
0.0 nits 10000 nits 10000 nits Rec.2020 D65

図2. MHC Profile を Windows に設定している様子

参考までに筆者の作成した MHC Profile へのリンクを以下に貼っておく。

drive.google.com

注意事項

筆者は数ヶ月にわたり MHC Profile を使用しているが、MHC Profile の設定は Windows からのサインアウト や モニターの出力オフ でリセットされることがあった。 そのため画質確認をする際は毎回 MHC Profile を設定しなおすことをオススメする。

検証に使用したツール類のバージョン情報

参考までに筆者の検証環境について情報を残しておく。

項目 詳細
OS Windows 11 23H2 build 22631.3880
GPU RTX 3070 (Studio Driver - 555.85)
Capture Device AverMedia GC553G2 (F/W ver.1.0.7.7)
Capture Software RECentral (Version: 4.7.101.1)
Microsoft Edge Version 126.0.2592.102
Google Chrome Version 126.0.6478.127

4. 詳細

ここから先は結論で述べた内容の詳細を順を追って説明していく。

はじめに、冒頭で述べた「変換処理」の必要性について述べる。次に「変換処理」の具体例を説明する。 続いて Windows 11 で適用される「変換処理」について述べる。その際に実際に Windows アプリケーションの「変換処理」の例を提示する。 そうして理解を深めた上で、最後に本記事の目的である Windows 11 で「変換処理」をキャンセルする方法について述べる。

4.1. HDRコンテンツを表示する際に変換処理が必要な理由

簡単に言うと モニターの表示スペックが低いからである。HDRの国際標準である Rec.2100-PQ のスペックは以下の通りである。

項目
輝度レンジ (基準) 0.005 ~ 1,000 nits
輝度レンジ (規格上限) 0.0 ~ 10,000 nits
色域 BT.2020

一方で、市販されている民生用のモニターの中に、上記のスペックを完全に満たす製品は存在しない。 実例を示そう。筆者が大変お世話になっている RTINGS.com の情報を使い、2020年以降に発売した HDR対応モニターのスペックの分布を調べた結果を図3、図4 に示す。

図3. ピーク輝度 (10% Window) のヒストグラム 図4. Rec.2020 色域カバー率のヒストグラム

見て分かる通り、輝度も色域もスペックが不足している。ごく一部の機種が基準の輝度 (1000 nits) をサポートしている程度である。

そのため、多くの場合はモニターの表示スペックに合わせた変換処理が必要となる。

4.2. 変換処理の具体例

ここでは HDRコンテンツの表示に必要な変換処理について具体例を述べていく。

変換処理の実現方法としては以下の 3つが考えられる。

  • Normalization
  • Clipping *2
  • Tone mapping *3

それぞれの処理の説明として Report ITU-R BT.2390-11 の Figure 6 を引用したものを図5 の (c) ~ (e) に示す[1]。

図5. 3種類の変換方法の説明(Report ITU-R BT.2390-11 の Figure 6 を引用)

例として各種処理をテストパターンに適用してみる。このテストパターンは 0 nits ~ 10000 nits の情報を含んでいる。これを 600 nits のモニターで表示することを考える。

DaVinci Resolve を使い変換処理を適用した結果を以下の表に示す。なお、これらの図は説明のために Rec.2100-PQ の画像を sRGBとして無理やり表示している。注意すること。

変換方法 画像 Waveform
Original
Normalization
Clipping
Tone mapping

見て分かる通り Normalization は見た目が著しく変わってしまうため使われることはほぼない。 そのため一般的には Clipping か Tone mapping が使われる。

ここまで輝度方向の変換処理について述べてきたが、同様の処理は彩度方向にも適用できる。この場合は Tone mapping ではなく Gamut mapping と呼ばれ、主にモニターの Rec.2020カバー率の不足を補うために使われる[3]。Gamut mapping の詳細については本記事では省略する(興味がある方は 筆者の過去記事 を参照して頂きたい)。

4.3. Windows 11 で適用される変換処理について

一般的な変換処理の概要を述べたので、次は Windows 11 での変換処理について述べていく。

マイクロソフトの公式ドキュメントである Use DirectX with Advanced Color on high/standard dynamic range displays [4]によると、Windows における変換処理の流れは以下の通りである。

  • Step 1. モニターのカラーボリューム *4 情報の取得
  • Step 2. コンテンツのカラーボリューム情報の取得
  • Step 3. Tone mapping / Gamut mapping の適用

各ステップについて、もう少し詳しく述べる。

Step 1. モニターのカラーボリューム情報の取得

Windows 11 では、HDRをサポートしたデスクトップアプリケーションは DXGI_OUTPUT_DESC1 の情報を使ってモニターのカラーボリューム情報を取得できる。

筆者が DirectX のサンプルアプリケーション を使って情報を取得した結果を以下に示す *5

項目 取得例*6
Red Primary [0.689, 0.3059]
Green Primary [0.2605, 0.6967]
Blue Primary [0.1487, 0.0628]
White Point [0.3457, 0.3585]
Min Luminance 0.0001 (nits)
Max Luminance 460 (nits)
Max Full Frame Luminance 240 (nits)

なお、これらの値は基本的にはモニターの EDID から取得されるが、Windows の Color Management 設定で MHC Profile が設定されている場合、MHC Profile の値から取得される[4]。 MHC Profile について後ほど詳しく述べる。

Step 2. コンテンツのカラーボリューム情報の取得

表示対象のコンテンツのカラーボリューム情報 *7 を取得する方法は大きく分けて 2通りある。

1つ目の方法 はコンテンツのメタデータから取得する方法である。代表的なものに HDR10 の要件となっている SMPTE ST 2086, MaxFALL, MaxCLL のメタデータがある[7]。

参考情報として YouTube のとある HDR動画メタデータを以下に示す *8

項目
Red Primary [0.6780, 0.3220]
Green Primary [0.2450, 0.7030]
Blue Primary [0.1380, 0.0520]
White Point [0.3127, 0.3290]
Min Luminance 0 (nits)
Max Luminance 1000 (nits)
MaxFALL 180 (nits)
MaxCLL 1100 (nits)

2つ目の方法 はコンテンツを解析してメタデータに相当する情報を取得する方法である。ST2086 のメタデータが存在しない場合や、より高品位な表示のために変換処理をフレームごとに動的に変化させる場合に選択する。

具体的な方法については本記事では特に述べない(リンク先のドキュメントのサンプルコードが参考になるかもしれない)。

Step 3. Tone mapping / Gamut mapping の適用

モニターとコンテンツのカラーボリューム情報が分かった後は、Tone mapping / Gamut mapping の処理を適用する。 こうすることで表示スペックが低いモニターでも大きな破綻を起こすことなく HDRコンテンツが表示できる *9

なお、Tone mapping / Gamut mapping の具体的な例は本記事では省略する(説明が大変なので)。参考情報として AVForumsDolby の資料へのリンクを記載しておく[8][9]。

4.4. Windows 11 での変換処理の例

それでは、実際に WindowsHDR対応アプリケーションの変換処理を確認する。 検証方法を以下に示す。

検証機材

変換処理の様子を RGB値で確認するため、AVerMedia製のキャプチャデバイス GC533G2 を用意し、これを Windows に仮想的なモニターとして認識させた。 接続図を図6 に、Windows が認識している様子を図7 に示す。

図6. 接続図。右端の G3223Q はダミーであり今回の検証では使っていない 図7. Windows が GC533G2 をモニターとして認識している様子

加えて GC533G2 には 2種類の異なる MHC Profile を切り替えて適用することで、Windows からは「スペックの異なるモニターが 2台存在している」ように偽装した。

ここで MHC Profile について補足説明を行う。MHC Profile は Microsoft の独自拡張が入った ICC Profile であり HDRモニターのカラーボリューム情報を記載することができる。詳細は 筆者の過去記事の「ICC Profile の MHC2 タグについて」 を参照。

仮想モニターの設定

MHC Profile の値を加工し 2台の仮想的なモニターを準備した。

モニター Min Luminance Max Luminance Max Full Frame
Luminance
Color primaries White point MHC Profile データ
モニター① 0.0 nits 10000 nits 10000 nits Rec.2020 D65 Download
モニター② 1.0 nits 400 nits 400 nits Rec.2020 D65 Download

Windows の Color Management ウィンドウを使って MHC Profile を適用している様子を下図に示す。

図8. モニター① を設定した様子 図9. モニター② を設定した様子
検証用の動画の準備

まず、ベースとなるテストパターン動画を用意した(動画へのリンク)。輝度レンジは 0~10000 nits、color primaries は Rec.2020 であり非常に広いカラーボリュームを持っている。 これに対して以下の2種類のメタデータを付与したものを検証用の動画とし、YouTube にアップロードした。

動画 Min Luminance Max Luminance MaxFALL MaxCLL Color primaries White point 動画リンク
動画① 0.0 nits 10000 nits 10000 nits 10000 nits Rec.2020 D65 Link
動画② 0.05 nits 600 nits 200 nits 400 nits Rec.709 D65 Link

なお、メタデータの付与には mkvmerge というソフトウェアを使用した[10][11]。

変換処理の確認

準備した 2種類のモニター、2種類の動画を組み合わせて変換処理がどう働くかを観察した。 具体的には下図に示す (a) と (b) のデータを調べて、元々の値から変化したかを確認した。

図10. 変換処理の内容を確認するために注目した箇所

確認結果の概要を以下に示す。

動画① 動画②
モニター① 変換処理なし 変換処理なし
モニター② 変換処理あり 変換処理なし

モニター②と動画①の組み合わせ、すなわち「広いカラーボリュームを持つ動画」を「狭いカラーボリュームのモニター」で表示した際にのみ 変換処理が適用され、それ以外の組み合わせでは変換処理が働かなかった。

続いてどのような変換処理が働いたかを確認する。輝度方向の変化の様子を図11 に、彩度方向の変化の様子を図12 に示す。

図11. 輝度方向の変化。10000 nits → 400 nits に Tone mapping が適用されている 図12. 彩度方向の変化。何も変わっていないなかった

図を見ればわかるように Tone mapping は適用されるが Gamut mapping は適用されなかった。 Gamut mapping が適用されなかったのは Chrome/Edge の仕様なのだと思われる*10

4.5. Windows 11 での変換処理をキャンセルする方法

ここまでの内容から自明だと思うが、 Windows 11 で変換処理を無効化するには以下のパラメータを記した MHC Profile をモニターに適用すればよい。

モニター Min Luminance Max Luminance Max Full Frame
Luminance
Color primaries White point MHC Profile データ
モニター① 0.0 nits 10000 nits 10000 nits Rec.2020 D65 Download

すると Windows 11 上で動作するアプリケーションは、接続されている HDRモニターは Rec.2100-PQ のスペックを完全に満たしていると認識するため、 変換処理を適用しなくなる。

というのが、Chrome/Edge で YouTube の動画を再生した場合の挙動である。

その一方で、Chrome/Edge で静止画の HDRファイルを表示したり、DaVinci Resolve で HDRのプレビューを行った場合は、 上記の操作のみだと不足しており、別の変換が適用されてしまう。 これの回避方法については次回以降の記事で述べたいと思う。

5. 感想

Windows での正確な HDR表示は 5年以上前から取り組みたいと考えていた課題であった。 筆者の知識や機材に加えて HDR関連のエコシステムが充実したことにより、ようやく取り組むことができた。 しばらくは、本記事に関連する内容を投稿していく予定である。もし興味のある方がいれば以後の記事も参照して頂きたい。

参考資料

[1] Report ITU-R BT.2390-11, "High dynamic range television for production and international programme exchange", https://www.itu.int/pub/publications.aspx?lang=en&parent=R-REP-BT.2390-11-2023
[2] Report ITU-R BT.2408-7, "Guidance for operational practices in HDR television production", https://www.itu.int/pub/publications.aspx?lang=en&parent=R-REP-BT.2408-7-2023
[3] Ultra HD Forum, "Blue Book – Ultra HD Production and Post Production VERSION 3.2.0", https://ultrahdforum.org/wp-content/uploads/BlueBook-Ultra_HD_Production_and_Post_Production_3.2.0.pdf
[4] Microsoft Learn, "Use DirectX with Advanced Color on high/standard dynamic range displays", https://learn.microsoft.com/en-us/windows/win32/direct3darticles/high-dynamic-range
[5] Ultra HD Forum "Black Book – Terms and Acronyms VERSION 3.2.0", https://ultrahdforum.org/wp-content/uploads/BlackBook-Terms_and_Acronyms_3.2.0.pdf
[6] Wikipedia, "Coding-independent code points", https://en.wikipedia.org/wiki/Coding-independent_code_points
[7] Wikipedia, "HDR10", https://en.wikipedia.org/wiki/HDR10
[8] AVForums, "What is 4K HDR Tone Mapping?", https://www.avforums.com/articles/what-is-4k-hdr-tone-mapping.13883/
[9] Timo Kunkel, "Comparison of linear vs composited HDR pipelines", https://www.w3.org/Graphics/Color/Workshop/slides/talk/kunkel
[10] YouTube Help, "Upload High Dynamic Range (HDR) videos", https://support.google.com/youtube/answer/7126552?hl=en
[11] YouTubeHDR, "hdr_metadata", https://github.com/YouTubeHDR/hdr_metadata

*1:MHC Profile の詳細は後述する

*2:"hard-clipping" や "hard clip" と言う呼び方もある [1][2]

*3:"soft-clipping" や "soft clip" と言う呼び方もある [1][2]

*4:色域情報と輝度情報を組み合わせたもの[5]。Chromaticity gamut のような2次元ではなく 3次元で色空間を示すことが特徴

*5:https://github.com/toru-ver4/DirectX-Graphics-Samples/blob/ca3730309c22ac2374b20cf1bcf1d6b126a68365/Samples/Desktop/D3D12HDR/src/D3D12HDR.cpp#L1183ブレークポイントを設定して desc1 の中身を見ることで情報を取得できる

*6:筆者所有の AW3225QF のデフォルト値

*7:ここで書いているカラーボリューム情報は CICP [6]で表現されるコンテナ情報とは異なる。例えば、CICP は 9-16-9 で Rec.2100-PQ だが、コンテンツ自体はピーク輝度が 200 nits、色域は Rec.709 という場合もある。あくまでも「コンテナ内」でコンテンツが持つカラーボリューム情報を指していることに注意すること

*8:メタデータは Edge や Chrome の開発者ツールの Mediaタブを参照することで確認できる

*9:当然のことだがスペックの低いモニターで完璧な表示を行うことは不可能である。一見すると正しい表示に見えたとしても細部では必ず何らかの破綻が生じている点に注意して頂きたい

*10:Tone mapping と比較して Gamut mapping は適用しなくても絵の破綻は少ない