Android 7.0(Nougat)から各種コーデックをハードウェア処理する VPU 周りで VUI 情報を受け渡しできるようになった。
Android 6.x までは Starflight で OMX を叩くと VUI をまったく見てくれないため、Android は「よくわからないから BT.601 で処理しちゃうね(*ノω・*)テヘ」とばかりに BT.601 係数で映像を展開していたから、現在主流のテレビ放送(ARIB STD-B32) 向けに作成されたコンテンツや、HD 解像度だから色空間変換を BT.709 係数にしちゃおうオレオレ映像を拵えると、Android で観たときに正しくない色で表示されていた。
つまり、今まで Youtube、ニコ動、AmebaTV などで HD テレビ向けコンテンツを Android で見た場合、意図したのとは少し違う色や見えるべき色が見えない状態で表示されていたけれど、少なくとも VUI から Matrix Coefficients(色空間変換係数)を取得することで正しい係数で YUV ⇔ RGB 変換ができ、データとしては正しい展開が期待できる。
で、実際どういう手が加えられたかというと、それら一部コードはこのあたりで確認でき、Android 7.0 r1 で最終的に VideoAPI.h としてリリース版の実装へと至った(もちろん、これらに付随するコードも書き替えられている)。
ところが、とんでもないオチがあり、VUI で Matrix Coefficients を指定しても色空間変換に適用されず、Color Primaries(映像データが基準としている表示デバイスの色域・ホワイトポイント定義)で指定された値を Matrix Coefficients として扱ってしまう不具合を抱えている。これらは、Android 7.0 へアップデートした Xperia XZ と Android 7.0 を標準搭載した Galaxy Tab S3 いずれにおいても確認でき、H/W Decoder に対応した複数の動画アプリでチェックしても同様の挙動を示すため、アプリ側が一斉に同じ実装ミスをしたとかいうのでもない限り、OS 側の OMX(OepnMAX) 周りが怪しい感じはする。
おそらくは、Color Primaries で Matrix Coefficients の値を上書きしてしまっているか、Color Primaries と Matrix Coefficients 値が入れ替わっているかだと思うのだけど、いずれも全く意味が異なる情報なので正しく適用できないのはかなり問題がある。
今のところとても残念な実装状況ではあるけれど、チェックしていて Galaxy Tab S3 が BT.2020nc の色空間変換に対応している点に気づき、HDR Ready を謳うだけのことはあるなぁ~という確認ができたのは収穫だった。