Published on

Encoding: 4:4:4 Chroma Subsampling

Durasi baca 3 menit|0x dilihat

Penulis
Featured Images

insert another generic intro here

Yang dibutuhin:

  • PC
  • Vapoursynth dan segalanyas
  • x264

Silakan ikuti langkah instalasi Vapoursynth berikut terlebih dahulu:


4:4:4 Chroma Subsampling dah menjadi hal normal di Fansub luar negeri. Cuma di Indonesia masih belum normal ya...

Di postingan ini, akan tak kasitau beberapa advantage dari 4:4:4 chroma 10 bit di banding 4:2:0 chroma 10bit

Ukuran/Resolusi Plane

Sesuai namanya, 4:4:4 chroma membagi semua plane (Y:U:V) menjadi sama rata (cue the soviet anthem) dibanding 4:2:0.

Sekilasnya, 4:4:4 menjadikan resolusi per-plane menjadi sama, misal 720p menjadi 720p semua, sedangkan 4:2:0 resolusi per-plane menjadi 720p/360p/360p.

Jadi kalau pake 4:2:0 alhasil chroma plane (U & V) akan di upscale ke 720p.

U Plane

4:4:4 U Plane (720p)
4:4:4 U Plane (720p)
4:4:4 U Plane (720p)
4:4:4 U Plane (720p)

V Plane

4:4:4 V Plane (720p)
4:4:4 V Plane (720p)
4:4:4 V Plane (720p)
4:4:4 V Plane (720p)

Warna lebih detail

Warna lebih detail 4:4:4 walaupun tidak seberapa, perbandingan tak sediakan di bawah.

U Plane

4:2:0 U Plane
4:2:0 U Plane
4:4:4 U Plane
4:4:4 U Plane

V Plane

4:2:0 V Plane
4:2:0 V Plane
4:4:4 V Plane
4:4:4 V Plane

Kalau liat gambarnya, PlaneStatsMin menjadi lebih rendah di 4:4:4 dan PlaneStatsMax lebih tinggi di 4:4:4, Average hanyalah rata-rata atau median dari Min/Max frame tersebut.

Untuk plane Chroma (U&V) saja, untuk plane Luma (Y) sama saja.

Size

Size mungkin bervariasi pada encode masing-masing, cuma dengan melakukan test encode, size 4:4:4 lebih kecil ~4mb dibanding 4:2:0 tetapi speed encode lebih lambat ~1.5fps

Berikut settingan encodenya, perubahan hanya terdapat pada --output-csp, --profile dan --8x8dct

YYY untuk profile adalah 444 dan 10. YYYY untuk output-csp adalah i444 dan i420

test-encode.bat
x264-r2935-545de2f-naoLmod_x64.exe --output-depth 10 --profile highYYY --level 5.0 --preset veryslow --subme 10 --me umh --tune animation --crf 18 --deblock -1:-1 --rc-lookahead 60 --keyint 250 --bframes 16 --ref 16 --qcomp 0.75 --aq-strength 0.85 --merange 32 --psy-rd 0.80:0.05 --output-csp YYYY --colormatrix bt709 --aq-mode 3 --chroma-qp-offset -5 --fade-compensate 0.80 --no-fast-pskip --output "premuxbd_%~n1.264" "%~n1%~x1"

Untuk speed encode:

4:2:0 Encode Speed
4:2:0 Encode Speed
4:4:4 Encode Speed
4:4:4 Encode Speed

Lalu untuk size sendiri:

4:2:0 File Size
4:2:0 File Size
4:4:4 File Size
4:4:4 File Size

Kokkoku NCOP:

444: ~120 mb
420: ~130 mb
Perbadaan speed: ~1fps (lebih cepat 420)

4:4:4 tidak dapat bekerja dengan baik di resolusi ~1080p apalagi 4K, terlalu sedikit advantage yang bisa diambil dari 4:4:4 kalo 1080p+, jadi encoder biasanya ninggalin jadi 4:2:0 10bit aja

Tambahan

Skrip vapoursynth yang dibuat dan digunakan:

zombieOP-4xx-10bit720p.vpy
import vapoursynth as vs
from vapoursynth import core
import fvsfunc as fvf

v = core.ffms2.Source(r"./BDMV/00008.mkv")[0:2157]
v = fvf.Depth(v, 16)
v444 = fvf.Downscale444(v, 1280, 720, kernely="bicubic", kerneluv="bicubic")
v420 = core.resize.Bicubic(v, 1280, 720)

v444y = core.std.ShufflePlanes(v444, 0, vs.GRAY)
v444y = core.std.PlaneStats(v444y, v444y).text.FrameProps().text.Text("Y Plane 444", 8) # Output: 720p
v420y = core.std.ShufflePlanes(v420, 0, vs.GRAY)
v420y = core.std.PlaneStats(v420y, v420y).text.FrameProps().text.Text("Y Plane 420", 8) # Output: 720p

v444u = core.std.ShufflePlanes(v444, 1, vs.GRAY)
v444u = core.std.PlaneStats(v444u, v444u).text.FrameProps().text.Text("U Plane 444", 8) # Output: 720p
v420u = core.std.ShufflePlanes(v420, 1, vs.GRAY).resize.Bicubic(1280, 720)
v420u = core.std.PlaneStats(v420u, v420u).text.FrameProps().text.Text("U Plane 420", 8) # Output: 360p

v444v = core.std.ShufflePlanes(v444, 2, vs.GRAY)
v444v = core.std.PlaneStats(v444v, v444v).text.FrameProps().text.Text("V Plane 444", 8) # Output: 720p
v420v = core.std.ShufflePlanes(v420, 2, vs.GRAY).resize.Bicubic(1280, 720)
v420v = core.std.PlaneStats(v420v, v420v).text.FrameProps().text.Text("V Plane 420", 8) # Output: 360p

compare = core.std.Interleave([v444v, v420v])

v444 = fvf.Depth(v444, 10)
v420 = fvf.Depth(v420, 10)

compare.set_output()

Anime yang digunakan: Zombieland Saga BD (NCOP)

Postingan selanjutnya mungkin tentang OCR