Konverzia lineárneho vstupu na HDR a upload na youtube

Sekcia: Aplikácie & Desktop 03.09.2022 | 17:33
Avatar Miroslav Bendík Gentoo  Administrátor

Ahojte. Mám 32-bitový lineárny float point výstup z OpenGL (áno som si na 100% istý, že je lineárny). Chcel by som z toho uploadnúť video na Youtube s 10-bitovou hĺbkou pretože 8 bitov vyzerá v tmavých odtieňoch hrozne.

Teraz moje neúspešné pokusy (screenshoty sú v priloženom obrázku, horný riadok je výstup z OpenGL).

Takže tento príkaz vyzerá na desktope OK a má 12 bitový výstup, ale youtube ho prevedie na 8 bit:

# 1
ffmpeg \
  -r 60 \
  -f rawvideo \
  -s 1920x1080 \
  -pix_fmt gbrpf32le \
  -color_range pc \
  -color_trc linear \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -i pipe:0 \
  -y \
  -crf 18 \
  -c:v libx265 \
  -c:a flac \
  -pix_fmt yuv444p12le \
  -preset fast \
  -loglevel error out.mkv

Podľa youtube musí mať HDR video metadáta, takže ich pridávam:

# 2
  ...
  -i pipe:0 \
  ...
  -color_range pc \
  -color_trc linear \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -x265-params colorprim=bt2020:transfer=linear:colormatrix=bt2020nc:range=full \
  ...

To neberie, pretože používa lineárny transfer. Takže:

# 3
ffmpeg \
  ...
  -i pipe:0 \
  ...
  -vf zscale=rin=full:pin=2020:tin=linear:min=2020:r=full:p=2020:npl=200:t=arib-std-b67,format=yuv444p12le \
  -color_range pc \
  -color_trc arib-std-b67 \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -x265-params colorprim=bt2020:transfer=arib-std-b67:colormatrix=bt2020nc:range=full \
  ...

Youtube to berie, ale vyzerá úplne naprd na všetkom, čím prehrávam. Keď však zmením vstupnú transfer funkciu na bt709 vyzerá to skoro dobre (ale prečo bt709 keď je vstup lineárny?)

# 4
ffmpeg \
  ...
  -i pipe:0 \
  ...
  -vf zscale=rin=full:pin=2020:tin=709:min=2020:r=full:p=2020:npl=200:t=arib-std-b67,format=yuv444p12le \
  -color_range pc \
  -color_trc arib-std-b67 \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -x265-params colorprim=bt2020:transfer=arib-std-b67:colormatrix=bt2020nc:range=full \
  ...

Colorspace filter s lineárnym vstupom vyzerá rovnako zle:

# 5
ffmpeg \
  ...
  -i pipe:0 \
  ...
  -vf colorspace=bt2020:ispace=bt2020nc:itrc=linear:iprimaries=bt2020:trc=bt2020-12:irange=pc:range=pc:format=yuv444p12 \
  -color_range pc \
  -color_trc arib-std-b67 \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -x265-params colorprim=bt2020:transfer=arib-std-b67:colormatrix=bt2020nc:range=full:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1):max-cll=1000 \
  ...

Ale zase s bt709 vyzerá skoro dobre, akurát farby sú rozhodené a jas tiež celkom nesedí

# 6
ffmpeg \
  ...
  -i pipe:0 \
  ...
  -vf colorspace=bt2020:ispace=bt2020nc:itrc=bt709:iprimaries=bt2020:trc=bt2020-12:irange=pc:range=pc:format=yuv444p12 \
  -color_range pc \
  -color_trc arib-std-b67 \
  -color_primaries bt2020 \
  -colorspace bt2020nc \
  -x265-params colorprim=bt2020:transfer=arib-std-b67:colormatrix=bt2020nc:range=full:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1):max-cll=1000 \
  ...

Aké parametre sú správne pre HDR určené na youtube?