TS packet 格闘日記

アニメを見ながら TS ときゃっきゃうふふするお仕事。 github: https://github.com/github-mec/mecenc twitter: https://twitter.com/mecenc

10bit エンコード時に一部のプレイヤーで白が黒くなる問題と回避策

具体的には Android の MX Player において、SW デコーダで 10bit color depth の動画を再生すると白いはずのピクセルが黒で表示される問題が発生する。調べてもよく分からなかったのでバグじゃないかと MX Player のフォーラムで質問してみたところ、YCbCr の Y 成分の範囲がおかしいんじゃね?との回答が返ってきた。

[Bug Report] White pixels are rendered as black in 10-bit depth video. - XDA Forums

補足しておくと、放送波で使われる BT.709 色空間において、輝度信号の範囲は 0-255 ではなく 16-235 であり、235 を超える範囲は「whiter than white」な状態である。どう描画するかは受信側次第。

通常アニメ本編はこの 16-235 という範囲を守っており問題になることは少ないが、OP/ED におけるスタッフ一覧などのクレジット文字列はこの範囲を超えた値を含むことが散見される。10bit color depth の動画の場合、MX Player (1.7.36a) の SW デコーダはこれらを黒く描画してしまう。そのためエンコード時に輝度の値を 16-235 の範囲に切り取ってしまうことでこの問題を回避できる。ffmpeg では lutyuv フィルタを使えば良い。

$ ffmpeg -i input.ts -filter:v lutyuv=y=clipval output.mp4

https://www.ffmpeg.org/ffmpeg-filters.html#lut_002c-lutrgb_002c-lutyuv

この回避策には再エンコードが必要なため、できれば MX Player 側で workaround を入れて欲しい。


追記
既存の動画については、MX Player の設定→デコーダー→カラーフォーマット を RGB 32bit にすれば問題を回避できる。しかし再生負荷が増大するなどの問題がある。