HDR 動画再生

ハイ ダイナミック レンジ(HDR)動画は、高画質動画のデコーディング処理における次なるフロンティアと言われ、他と一線を画すシーンの再生品質を特徴とします。これを実現するために、輝度コンポーネントのダイナミック レンジを大幅に増やし(現在の 100 cd/m2 から数千 cd/m2 まで)、より幅広い色空間(BT 2020)が使用されています。これは、テレビ業界の 4K UHD の進化における中心的な要素となっています。

Android 10 は、次の HDR 動画をサポートしています。

  • HDR10
  • VP9
  • HDR10+

Android 9 以降、MediaCodec はトンネルモードに関係なく HDR メタデータを報告します。非トンネルモードでは、デコードされたデータを静的メタデータや動的メタデータと一緒に取得できます。静的メタデータを使用する HDR10 と VP9Profile2 の場合、出力形式でキー KEY_HDR_STATIC_INFO を付与して報告されます。動的メタデータを使用する HDR10+ の場合はキー KEY_HDR10_PLUS_INFO を付与して報告され、出力フレームごとに変わる可能性があります。詳しくは、マルチメディア トンネリングをご覧ください。

Android 7.0 以降、初期 HDR のサポートには HDR 動画パイプラインの検出と設定のための適切な定数の作成が含まれています。つまり、コーデックの種類と表示モードを定義し、HDR データを MediaCodec に、さらには HDR デコーダに渡す方法を指定することです。

このドキュメントは、アプリケーション デベロッパーによる HDR ストリームの再生対応と、OEM や SOC ベンダーによる HDR 機能の導入をそれぞれ支援することを目的に書かれています。

サポートされている HDR テクノロジー

Android 7.0 以降は、次の HDR テクノロジーがサポートされています。

テクノロジー ドルビー ビジョン HDR10 VP9-HLG VP9-PQ
コーデック AVC / HEVC HEVC VP9 VP9
伝達関数 ST-2084 ST-2084 HLG ST-2084
HDR メタデータ タイプ 動的 静的 なし 静的

Android 7.0 はトンネルモードによる HDR 再生のみが定義されていますが、デバイスでは、不透明バッファを使用して SurfaceView で HDR の動画再生サポートを追加することができます。つまり、現状は次のとおりです。

  • 非トンネルモード対応デコーダを使用した HDR 再生がサポートされているかどうかを確認する標準 Android API は存在しない。
  • トンネリングをサポートし、HDR 再生機能をアドバタイズする動画デコーダは、HDR 対応ディスプレイに接続したときに HDR 再生をサポートする必要がある。
  • AOSP Android 7.0 リリースでは、HDR コンテンツの GL コンポジションはサポートされていない。

検出

HDR 再生には、HDR 対応デコーダと HDR 対応ディスプレイへの接続が必要です。一部のテクノロジーでは、特定のエクストラクタが必要になることもあります。

ディスプレイ

アプリケーションは、指定されたディスプレイでサポートされている HDR テクノロジーを照会する新しい Display.getHdrCapabilities API を使用することになります。これは基本的に、CTA-861.3 で定義されている EDID 静的メタデータ データブロックの情報です。

  • public Display.HdrCapabilities getHdrCapabilities()
    ディスプレイの HDR 機能を返します。
  • Display.HdrCapabilities
    指定されたディスプレイの HDR 機能をカプセル化します。たとえば、サポートされる HDR の種類や、望ましい輝度データの詳細などです。

定数:

  • int HDR_TYPE_DOLBY_VISION
    ドルビー ビジョンのサポート。
  • int HDR_TYPE_HDR10
    HDR10 / PQ のサポート。
  • int HDR_TYPE_HLG
    HLG(ハイブリッド ログガンマ)のサポート。
  • float INVALID_LUMINANCE
    輝度の値が無効です。

パブリック メソッド:

  • float getDesiredMaxAverageLuminance()
    このディスプレイに望ましいコンテンツの最大フレーム平均輝度データを cd/cd/m2 で返します。
  • float getDesiredMaxLuminance()
    このディスプレイに望ましいコンテンツの最大輝度データを cd/cd/m2 で返します。
  • float getDesiredMinLuminance()
    このディスプレイに望ましいコンテンツの最小輝度データを cd/cd/m2 で返します。
  • int[] getSupportedHdrTypes()
    このディスプレイがサポートする HDR タイプを取得します(定数を参照してください)。ディスプレイが HDR をサポートしていない場合は空の配列を返します。

デコーダ

アプリケーションでは、既存の CodecCapabilities.profileLevels API を使用して、新しい HDR 対応プロファイルのサポートを確認することになります。

ドルビー ビジョン

MediaFormat MIME 定数:

    String MIMETYPE_VIDEO_DOLBY_VISION
    

MediaCodecInfo.CodecProfileLevel プロファイル定数:

    int DolbyVisionProfileDvavPen
    int DolbyVisionProfileDvavPer
    int DolbyVisionProfileDvheDen
    int DolbyVisionProfileDvheDer
    int DolbyVisionProfileDvheDtb
    int DolbyVisionProfileDvheDth
    int DolbyVisionProfileDvheDtr
    int DolbyVisionProfileDvheStn
    

ドルビー ビジョンの動画レイヤとメタデータは、動画アプリケーションでフレームごとに 1 つのバッファに連結する必要があります。これは、ドルビー ビジョン対応の MediaExtractor によって自動的に行われます。

HEVC HDR 10

MediaCodecInfo.CodecProfileLevel プロファイル定数:

    int HEVCProfileMain10HDR10
    

VP9 HLG および PQ

MediaCodecInfo.CodecProfileLevel プロファイル定数:

    int VP9Profile2HDR
    int VP9Profile3HDR
    

プラットフォームで HDR 対応デコーダをサポートする場合、HDR 対応エクストラクタもサポートすることになります。

HDR コンテンツの再生が保証されるのは、トンネリングをサポートするデコーダのみです。トンネリングをサポートしないデコーダで再生した場合、HDR 情報が失われ、SDR のカラー ボリュームに収まるようにコンテンツがフラット化される可能性があります。

エクストラクタ

以下のコンテナは、Android 7.0 のさまざまな HDR テクノロジーでサポートされています。

テクノロジー ドルビー ビジョン HDR10 VP9-HLG VP9-PQ
コンテナ MP4 MP4 WebM WebM

(ファイルの)トラックが HDR 対応を必要とするかどうかの検出は、プラットフォームではサポートされていませんが、アプリケーションでは、コーデック固有のデータを解析して、トラックに特定の HDR プロファイルが必要かどうかを判断できます。

概要

各 HDR テクノロジーのコンポーネント要件を次の表に示します。

テクノロジー ドルビー ビジョン HDR10 VP9-HLG VP9-PQ
サポートされている HDR タイプ(ディスプレイ) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
コンテナ(エクストラクタ) MP4 MP4 WebM WebM
デコーダ MIMETYPE_VIDEO_DOLBY_VISION MIMETYPE_VIDEO_HEVC MIMETYPE_VIDEO_VP9 MIMETYPE_VIDEO_VP9
プロファイル(デコーダ) ドルビーのプロファイルの 1 つ HEVCProfileMain10HDR10 VP9Profile2HDR または VP9Profile3HDR VP9Profile2HDR または VP9Profile3HDR

注:

  • ドルビー ビジョンのビットストリームは、ドルビーで定義された方法で MP4 コンテナにパッケージ化されます。アプリケーションでは、独自のドルビー対応エクストラクタの実装が可能ですが、その場合は、対応レイヤからのアクセス ユニットを、ドルビーで定義された単一のデコーダ用アクセス ユニットにパッケージ化しなければなりません。
  • プラットフォームで HDR 対応エクストラクタをサポートすることは可能ですが、それに対応する HDR デコーダをサポートしない可能性があります。

再生

アプリケーションで HDR 再生のサポートが確認されると、非 HDR コンテンツを再生するのとほぼ同じ方法で HDR コンテンツを再生できます。ただし、次の点に注意してください。

  • ドルビー ビジョンの場合、特定のメディア ファイルやトラックに HDR 対応デコーダが必要かどうかをすぐには判断できません。アプリケーションは、MediaFormat のコーデック固有のデータ セクションを解析してこの情報を事前に取得するか、取得機能を実装する必要があります。
  • CodecCapabilities.isFormatSupported は、こうしたプロファイルのサポートのためにトンネリング対応デコーダ機能が必要かどうかを判断しません。

HDR プラットフォーム サポートの有効化

SoC ベンダーと OEM は、デバイスで HDR プラットフォームのサポートを有効にするために追加の作業を行う必要があります。

HDR に関して Android 7.0 で加えられたプラットフォームの変更点

OEM と SoC ベンダーが認識しなければならないプラットフォーム(アプリケーション / ネイティブ レイヤ)の主な変更点は次のとおりです。

ディスプレイ

ハードウェア コンポジション

HDR 対応プラットフォームでは、HDR コンテンツと非 HDR コンテンツのブレンディングをサポートする必要があります。Android 7.0 のリリース時点ではブレンディングの特性やオペレーションは厳密に定義されていませんが、このプロセスは一般に次の手順で構成されています。

  1. レイヤの色、マスタリング、付与可能な動的メタデータに基づいて、合成するすべてのレイヤを含むリニアの色空間やボリュームを決定します。
    ディスプレイに直接合成する場合、これはディスプレイのカラー ボリュームに一致するリニア空間になります。
  2. すべてのレイヤを共通の色空間に変換します。
  3. ブレンディングを実行します。
  4. HDMI 経由で表示する場合:
    1. ブレンドするシーンの色、マスタリング、付与可能な動的メタデータを決定します。
    2. ブレンドの結果生成されるシーンを、そこから抽出される色空間やボリュームに変換します。
  5. ディスプレイに直接表示する場合は、結果のブレンドシーンを必要な表示信号に変換してそのシーンを生成します。

ディスプレイ検出

HDR ディスプレイ検出は、HWC2 経由でのみサポートされます。デバイスの実装者は、この機能を搭載するために Android 7.0 でリリースされた HWC2 アダプターを選択的に有効にする必要があります。したがって、プラットフォームで HWC2 のサポートを追加するか、AOSP フレームワークを拡張してこの情報を提供できるようにする必要があります。HWC2 は、HDR 静的データをフレームワークとアプリケーションに伝播するための新しい API を公開してします。

HDMI

  • 接続された HDMI ディスプレイは、CTA-861.3 のセクション 4.2 で定義されているとおり、HDMI EDID を通じて HDR 機能をアドバタイズします。
  • 次の EOTF マッピングを使用することになります。
    • ET_0 従来のガンマ - SDR 輝度範囲: どの HDR タイプにもマッピングされていません
    • ET_1 従来のガンマ - HDR 輝度範囲: どの HDR タイプにもマッピングされていません
    • ET_2 SMPTE ST 2084 - HDR タイプ HDR10 にマッピングされています
  • HDMI 経由でのドルビー ビジョンまたは HLG サポートのシグナリングは、それぞれの関連団体が定めた規格に従って行われます。
  • HWC2 API では浮動小数点数の望ましい輝度値が使用されるため、8 ビットの EDID 値は適切な方法で変換する必要があります。

デコーダ

プラットフォームでは、トンネリングをサポートする HDR 対応デコーダを追加して HDR サポートをアドバタイズする必要があります。一般に、HDR 対応デコーダは、次の条件を満たす必要があります。

  • トンネルモードのデコードをサポートしている(FEATURE_TunneledPlayback)。
  • HDR 静的メタデータ(OMX.google.android.index.describeHDRColorInfo)と、ディスプレイ / ハードウェア コンポジションへの情報伝播をサポートしている。HLG の場合、適切なメタデータをディスプレイに送信する必要があります。
  • 色の記述(OMX.google.android.index.describeColorAspects)と、ディスプレイ / ハードウェア コンポジションへの情報伝播をサポートしている。
  • 関連規格で定義されているとおり、HDR が埋め込まれたメタデータをサポートしている。

ドルビー ビジョン デコーダのサポート

プラットフォームでドルビー ビジョンをサポートするには、ドルビー ビジョン対応の HDR OMX デコーダを追加する必要があります。ドルビー ビジョンの仕様を考慮すると、これは通常、1 つ以上の AVC または HEVC デコーダとコンポジタのラッパーで、次の条件を満たす必要があります。

  • MIME タイプ「video/dolby-vision」をサポートしている。
  • サポートされているドルビー ビジョンのプロファイルやレベルをアドバタイズする。
  • ドルビーの定義どおりに、すべてのレイヤのサブアクセス ユニットを含むアクセス ユニットを受け入れられる。
  • ドルビーで定義されているコーデック固有のデータを受け入れられる。たとえば、ドルビー ビジョンのプロファイルやレベルを含むデータのほか、内部デコーダが必要とする場合はコーデック固有のデータも含まれます。
  • ドルビーで定められているとおりに、ドルビー ビジョンのプロファイルやレベル間の適応切り替え(アダプティブ スイッチング)をサポートしている。

デコーダの設定時には、実際のドルビーのプロファイルはコーデックに伝送されません。これは、デコーダが開始された後にコーデック固有のデータを介してのみ行われます。プラットフォームで複数のドルビー ビジョンのデコーダをサポートして(1 つを AVC プロファイル用、もう 1 つを HEVC プロファイル用など)、デコーダの設定中に元になるコーデックを初期化できるようにすることも可能です。1 つのドルビー ビジョン デコーダで両方のタイプのプロファイルをサポートする場合は、両者の動的なアダプティブ スイッチングもデコーダでサポートする必要があります。

一般的な HDR デコーダのサポートに加えてドルビー ビジョン対応デコーダを提供する場合、プラットフォームは次の条件を満たす必要があります。

  • ドルビー ビジョン対応エクストラクタを提供する(HDR 再生をサポートしない場合も同様)。
  • ドルビーで定義されているとおりにビジョン プロファイルをサポートするデコーダを提供する。

HDR10 デコーダのサポート

プラットフォームで HDR10 をサポートするには、HDR10 対応 OMX デコーダを追加する必要があります。これは通常、トンネリングをサポートし、HDMI 関連のメタデータの解析と処理もサポートする HEVC デコーダです。このようなデコーダは、一般的な HDR デコーダのサポートに加えて、次の条件を満たす必要があります。

  • MIME タイプ「video/hevc」をサポートしている。
  • サポートされている HEVCMain10HDR10 をアドバタイズする。HEVCMain10HRD10 プロファイルのサポートでは、HEVCMain10 プロファイルもサポートする必要があります。この場合、同じレベルで HEVCMain プロファイルのサポートが必要になります。
  • マスタリング メタデータの SEI ブロックと SPS に含まれる他の HDR 関連の情報の解析をサポートしている。

VP9 デコーダのサポート

プラットフォームで VP9 HDR をサポートするには、VP9 Profile2 対応 HDR OMX デコーダを追加する必要があります。これは通常、トンネリングをサポートし、HDMI 関連のメタデータの処理もサポートする VP9 デコーダです。このようなデコーダは、一般的な HDR デコーダのサポートに加えて、次の条件を満たす必要があります。

  • MIME タイプ「video/x-vnd.on2.vp9」をサポートしている。
  • サポートされている VP9Profile2HDR をアドバタイズする。VP9Profile2HDR プロファイルのサポートでは、VP9Profile2 プロファイルも同じレベルでサポートする必要があります。

エクストラクタ

ドルビー ビジョンエクストラクタのサポート

ドルビー ビジョン デコーダをサポートするプラットフォームは、ドルビー動画コンテンツ用に Dolby Extractor というドルビーのエクストラクタのサポートを追加する必要があります。

  • 標準の MP4 エクストラクタは、ファイルからベースレイヤのみを抽出できますが、拡張レイヤやメタデータ レイヤは抽出できません。そのため、ファイルからデータを抽出するにはドルビー専用のエクストラクタが必要です。
  • ドルビーエクストラクタは、ドルビー動画のトラック(グループ)ごとに 1 つまたは 2 つのトラックを書き出す必要があります。
    • 「video/dolby-vision」タイプのドルビー ビジョン HDR トラック - 第2、第 3 レイヤのドルビー ストリームの組み合わせ。HDR トラックのアクセス ユニット形式(ベースレイヤ、拡張レイヤ、メタデータ レイヤからアクセス ユニットを 1 つのバッファにパッケージ化し、1 つの HDR フレームにデコードする方法を定義したもの)は、ドルビーで定義されます。
    • ドルビー ビジョンの動画トラックに別の(下位互換性のある)ベースレイヤ(BL)がある場合は、別の「video/avc」または「video/hevc」トラックとして書き出す必要があります。エクストラクタは、このトラックに標準の AVC / HEVC アクセス ユニットを提供する必要があります。
    • BL トラックには、HDR トラックと同じトラックの一意の ID(「track-ID」)が必要です。それにより、アプリケーションはこれらが同じ動画の 2 つのエンコードであると理解できます。
    • プラットフォームの機能に基づいて、アプリケーションは選択するトラックを決定できます。
  • ドルビー ビジョンのプロファイルやレベルは、HDR トラックのトラック形式で書き出す必要があります。
  • プラットフォームがドルビー ビジョン対応デコーダを提供している場合、HDR 再生をサポートしていなくても、ドルビー ビジョン対応エクストラクタを提供する必要があります。

HDR10 および VP9 HDR エクストラクタのサポート

HDR10 または VP9 HLG をサポートするための追加のエクストラクタの要件はありません。MP4 で VP9 PQ をサポートするには、プラットフォームで MP4 エクストラクタを拡張する必要があります。HDR 静的メタデータを VP9 PQ ビットストリームに伝播し、このメタデータが通常の MediaExtractor => MediaCodec のパイプラインを経て、VP9 PQ デコーダ、そしてディスプレイに渡されるようにする必要があります。

ドルビー ビジョン サポートの Stagefright 拡張機能

プラットフォームは、Stagefright に以下のドルビー ビジョン形式のサポートを追加する必要があります。

  • 圧縮ポートのポート定義クエリのサポート。
  • DV デコーダのプロファイルやレベルの列挙のサポート。
  • DV HDR トラックの DV プロファイルやレベルの公開のサポート。

テクノロジー固有の実装の詳細

HDR10 デコーダ パイプライン

図 1. HDR10 のパイプライン

HDR10 ビットストリームは MP4 コンテナにパッケージ化されます。アプリケーションは標準の MP4 エクストラクタを使用してフレームデータを抽出し、デコーダに送信します。

  • MPEG4 Extractor
    HDR10 ビットストリームは、MPEG4Extractor によって通常の HEVC ストリームとして認識され、「video/HEVC」タイプの HDR トラックが抽出されます。フレームワークは、Main10HDR10 プロファイルをサポートする HEVC 動画デコーダを選択し、そのトラックをデコードします。
  • HEVC デコーダ
    HDR 情報は、SEI または SPS のいずれかにあります。HEVC デコーダは、まず、HDR 情報を含むフレームを受信します。デコーダはこの HDR 情報を抽出し、HDR 動画をデコードしていることをアプリケーションに通知します。HDR 情報はデコーダ出力形式にバンドルされ、後でサーフェスに伝播されます。

ベンダーのアクション

  1. サポートされている HDR デコーダのプロファイルとレベルの OMX タイプをアドバタイズします。例:
    OMX_VIDEO_HEVCProfileMain10HDR10(および Main10
  2. インデックス「OMX.google.android.index.describeHDRColorInfo」のサポートを実装します。
  3. インデックス「OMX.google.android.index.describeColorAspects」のサポートを実装します。
  4. マスタリング メタデータの SEI 解析のサポートを実装します。

ドルビー ビジョン デコーダのパイプライン

図 2. ドルビー ビジョンのパイプライン

ドルビー ビットストリームは、ドルビーの定義に従って MP4 コンテナにパッケージ化されます。理論上では、アプリケーションで標準の MP4 エクストラクタを使用して、ベースレイヤ、拡張レイヤ、メタデータ レイヤを個別に抽出できますが、それは現在の Android MediaExtractor / MediaCodec モデルに適合していません。

  • DolbyExtractor:
    • ドルビー ビットストリームは、DolbyExtractor によって認識され、ドルビー動画トラック(グループ)ごとに 1 つまたは 2 つのトラックとして各種レイヤが書き出されます。
      • 「video/dolby-vision」タイプの HDR トラック - 第2、第 3 レイヤのドルビー ストリームの組み合わせ。HDR トラックのアクセス ユニット形式(ベースレイヤ、拡張レイヤ、メタデータ レイヤからアクセス ユニットを 1 つのバッファにパッケージ化し、1 つの HDR フレームにデコードする方法を定義したもの)は、ドルビーで定義されます。
      • (BL に下位互換性がある場合のみ)ベースレイヤのみが含まれる BL トラック。このレイヤは、標準の MediaCodec デコーダ(例: AVC / HEVC デコーダ)でデコードできる必要があります。エクストラクタは、このトラックに標準の AVC / HEVC アクセス ユニットを提供する必要があります。BL トラックには、ドルビー トラックと同じトラックの一意の ID(「track-ID」)が必要です。それにより、アプリケーションはこれらが同じ動画の 2 つのエンコードであると理解できます。
    • プラットフォームの機能に基づいて、アプリケーションは選択するトラックを決定できます。
    • HDR トラックには特定の HDR タイプがあるため、フレームワークはドルビー動画デコーダを選択してそのトラックをデコードします。BL トラックは、標準の AVC / HEVC ビデオデコーダによってデコードされます。
  • DolbyDecoder:
    • DolbyDecoder は、すべてのレイヤ(EL+BL+MD または BL+MD)に必要なアクセス ユニットを含むアクセス ユニットを受け取ります。
    • 個々のレイヤの CSD(SPS+PPS+VPS などのコーデック固有のデータ)情報は、ドルビーで定義される 1 つの CSD フレームにパッケージ化できます。CSD フレームを 1 つ作成する必要があります。

ドルビーのアクション

  1. 抽象的なドルビー デコーダについて、さまざまなドルビー コンテナ スキーマ(例: BL+EL+MD)のアクセス ユニットのパッケージング(つまり、HDR デコーダが受け入れ可能なバッファ形式)を定義します。
  2. 抽象的なドルビー デコーダの CSD のパッケージングを定義します。

ベンダーのアクション

  1. ドルビーエクストラクタを実装します。これはドルビーでも行うことができます。
  2. DolbyExtractor をフレームワークに組み込みます。エントリ ポイントは frameworks/av/media/libstagefright/MediaExtractor.cpp です。
  3. HDR デコーダのプロファイルとレベルの OMX タイプを宣言します。例: OMX_VIDEO_DOLBYPROFILETYPEOMX_VIDEO_DOLBYLEVELTYP
  4. インデックス「'OMX.google.android.index.describeColorAspects」のサポートを実装します。
  5. フレームごとに、アプリとサーフェスに動的 HDR メタデータを伝播します。通常、この情報は HDMI 規格ではディスプレイに渡すことができないため、ドルビーで定義されたとおり、デコードされたフレームにパッケージ化する必要があります。

VP9 デコーダ パイプライン

図 3. VP9-PQ のパイプライン

VP9 ビットストリームは、WebM チームによって定義された方法で WebM コンテナにパッケージ化されます。アプリケーションで WebM エクストラクタを使用してビットストリームから HDR メタデータを抽出してから、デコーダにフレームを送信する必要があります。

  • WebM エクストラクタ:
  • VP9 デコーダ:
    • デコーダは Profile2 のビットストリームを受信し、通常の VP9 ストリームとしてデコードします。
    • デコーダはフレームワークから HDR 静的メタデータを受け取ります。
    • デコーダは、ビットストリームのアクセス ユニットを介して VP9 PQ ストリームの静的メタデータを受け取ります。
    • VP9 デコーダは、HDR 静的 / 動的メタデータをディスプレイに伝播できる必要があります。

ベンダーのアクション

  1. インデックス「OMX.google.android.index.describeHDRColorInfo」のサポートを実装します。
  2. インデックス「OMX.google.android.index.describeColorAspects」のサポートを実装します。
  3. HDR 静的メタデータを伝播します。