sswroom
核心会员
核心会员
帖子: 31
注册时间: 2012-08-03 1:42

播放程式/轉檔程式常見的問題

近期發現播放程式/轉檔程式有不同的問題, 想拿出來討論一下

1: Resizer問題
現時畫質最高的Resizer是Colorspace-awared Resizer, 其次是RGB Resizer, 最差的是YUV Resizer
這個是我比較Colorspace-awared Lanczos Resizer, RGB Lanczos Resizer和YUV Lanczos Resizer後的結論
可是, 現時大部分的Video Resizer也是YUV Resizer, 令畫質下降不少

2: Deinterlacer的問題
Deinterlacer同Resizer情況也差不多, 也分Colorspace-awared Deinterlacer, RGB Deinterlacer, 和YUV Deinterlacer
現時實時的Deinterlacer畫質都不太好, 常常產生鋸齒, 我現在用的Lanczos RGB Deinterlacer速度快畫質又不錯, 不明白為何其他程式不用.....

3: 色彩位置問題
MPEG-1的色彩位置是在正中間, 而MPEG-2/MPEG-4/H.264是在左中

代码: 全选

MPEG-1:
Y   Y   Y   Y
  C       C
Y   Y   Y   Y

MPEG-2/MPEG-4/H.264:
Y   Y   Y   Y
C       C
Y   Y   Y   Y
相信超過99%的程式也不理會這個色彩位置, 產生色彩移位或色彩模糊等情況。
-有不少程式(如PowerDVD)為了減低色階情況, 而將C的位置放在左上, 左下C的值用上下兩個C的平均值, 這樣會令色彩上移半個像素
-有不少程式YUV 4:4:4 -> YUV 4:2:0時, C是將4個數值取平均, 現時正確的做法應該是將左邊2個C取平均, 右邊的C值要捨棄不用

4: RGB色空間問題
現時大部分播放程式/轉檔程式也不理會影片內的色空間, MPEG-2/MPEG-4/H.264預設的色空間是Bt.709, H.264還新增了Bt.1361和Log Color,
正確的做法應該是要將影片的色空間轉成顯示器的色空間才輸出, 但有這樣做的程式實在太少...

5: xvYCC的支援度
大部分程式也不能顯示xvYCC的色彩, 現時其中一個能顯示xvYCC色彩的方法是將計算上的Reference White設成85-90% 顯示器亮度, 令顯示器有10-15%擴充範圍顯示xvYCC色彩

P.S. 1
Colorspace-awared Lanczos Resizer與RGB Lanczos Resizer比較
縮細時視覺上Colorspace-awared Lanczos Resizer明顯好很多
放大時視覺上分別不大, 數字上RGB Lanczos Resizer 4-tap比3-tap/5-tap也要好, 而Colorspace-awared Lanczos Resizer tap數越多越好, Colorspace-awared Lanczos Resizer 50-tap與4-tap差很遠

P.S. 2
以前用MPEG-4 CQ1壓縮的DVDRIP畫質實在太差了, 現在用HQMP3直接播放VOB/SFD/PSS/MPG/MP4(AVC), 畫質好太多
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: 播放程式/轉檔程式常見的問題

Colorspace-awared Resizer是什么我不清楚,我只知道doom9上madVR的帖子里有人说upscale建议使用gamma-aware resizer而downscale则建议使用linear resizer(但根据我自己的测试来看downscale时gamma-aware的优势很明显而upscale时gamma-aware配合一般的resizer容易出ringing)。
AVS里dither工具有Dither_y_gamma_to_linear()和Dither_y_linear_to_gamma()可以实现gamma和linear之间的转换从而配合Dither_resize16可以实现gamma-aware的resize。
madVR里默认也是gamma-aware的。

第三点,chroma subsampling的chroma placement问题以及nnedi3 interpolation的align问题是我写nnedi3_resize16 v2.0的最大难点——用了120行代码来处理参数……

第四点,colormatrix的问题,其他渲染器怎么做的我不清楚,至少madVR在有旗标的情况下根据旗标选择matrix,在没旗标的情况下根据分辨率选择matrix——SD为BT.601,HD为BT.709,UHD最近更新为BT.2020但又改回了BT.709(考虑到现在BT.2020还没有普及的情况)。
上次由 mawen1250 在 2013-08-14 12:24,总共编辑 1 次。
sswroom
核心会员
核心会员
帖子: 31
注册时间: 2012-08-03 1:42

Re: 播放程式/轉檔程式常見的問題

mawen1250 写了:Colorspace-awared Resizer是什么我不清楚,我只知道upscale建议使用gamma-aware resizer而downscale则建议使用一般的linear resizer。
AVS里dither工具有Dither_y_gamma_to_linear()和Dither_y_linear_to_gamma()可以实现gamma和linear之间的转换从而配合Dither_resize16可以实现gamma-aware的resize。
madVR里默认也是gamma-aware的。

第三点,chroma subsampling的chroma placement问题以及nnedi3 interpolation的align问题是我写nnedi3_resize16 v2.0的最大难点——用了120行代码来处理参数……

第四点,colormatrix的问题,其他渲染器怎么做的我不清楚,至少madVR在有旗标的情况下根据旗标选择matrix,在没旗标的情况下根据分辨率选择matrix——SD为BT.601,HD为BT.709,UHD最近更新为BT.2020但又改回了BT.709(考虑到现在BT.2020还没有普及的情况)。
Dither_y_gamma_to_linear()和Dither_y_linear_to_gamma()理論上也是YUV 色空間, 是YUV Resizer.
Colorspace-awared Resizer即是要將顏色轉成Linear RGB才進行Resize, 理論上數值最準確, 實測畫質最高
RGB Resizer即是在Non-linear RGB(如sRGB/Bt.709)進行Linear Resize, 理論上數值會有偏差, 實測縮細時畫質明顯劣化
YUV Resizer即是在YUV色空間下進行Linear Resizer, 理論上數值偏差最大

第三點, 我現時是用Lanczos Resizer進行Chroma upsampling來解決.
還有, Lanczos Interpolation的Setup時, 可以指定Sample offset, Resize時應該不是問題(我的Lanczos Deinterlacer也要指定Sample offset來避免抖動的問題)

第四點不是Colormatrix, 是Transfer Function. Colormatrix現時主流是sRGB/BT.709/BT.1361等, Colormatrix完全相同, 可以不用處理。但Transfer Function不同, 要轉成顯示器的Transfer Function(如sRGB)才可以
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: 播放程式/轉檔程式常見的問題

Dither工具除了能支持16bit YUV的处理还能支持hack的16bit RGB格式RGB48Y,也就是将1帧的RGB三个平面Interleave在3帧YUV的Y中。
Dither_y_gamma_to_linear()和Dither_y_linear_to_gamma()在Dither文档里说了也能用于RGB48Y而且推荐使用在RGB48Y上,所以可以通过这个加上Dither_resize16实现你说的Colorspace-awared Resize。

第三点,至少目前AVS内处理chroma upsampling和chroma downsampling的滤镜基本都还是按照MPEG-2的chroma placement进行的,所以对于大部分YUV420和YUV422的chroma upsampling/downsampling是正确处理的。而dither工具里涉及到chroma placement的滤镜可以选择MPEG-1、MPEG-2或是DV。
另外一点就是AVS内置的resizer对MPEG-2的YUV420/YUV422进行resize时的确是没有考虑到chroma placement所以会造成chroma shift,我前段时间对于这个问题进行过研究和测试,测试结果显示AVS内置resizer是有问题的,而dither_resize16则正确处理了这个问题,我写nnedi3_resize16时也正确处理了这个问题。

至于upscale的算法,多数情况下还是nnedi3>Jinc+AR(madVR)>Lanczos+AR,毕竟edi的算法和常见的resizer有很大的不同,我写nnedi3_resize16时也专门增加了选择输出chroma subsampling的功能,通过nnedi3来实现chroma upsampling。
sswroom
核心会员
核心会员
帖子: 31
注册时间: 2012-08-03 1:42

Re: 播放程式/轉檔程式常見的問題

mawen1250 写了:Dither工具除了能支持16bit YUV的处理还能支持hack的16bit RGB格式RGB48Y,也就是将1帧的RGB三个平面Interleave在3帧YUV的Y中。
Dither_y_gamma_to_linear()和Dither_y_linear_to_gamma()在Dither文档里说了也能用于RGB48Y而且推荐使用在RGB48Y上,所以可以通过这个加上Dither_resize16实现你说的Colorspace-awared Resize。

第三点,至少目前AVS内处理chroma upsampling和chroma downsampling的滤镜基本都还是按照MPEG-2的chroma placement进行的,所以对于大部分YUV420和YUV422的chroma upsampling/downsampling是正确处理的。而dither工具里涉及到chroma placement的滤镜可以选择MPEG-1、MPEG-2或是DV。
另外一点就是AVS内置的resizer对MPEG-2的YUV420/YUV422进行resize时的确是没有考虑到chroma placement所以会造成chroma shift,我前段时间对于这个问题进行过研究和测试,测试结果显示AVS内置resizer是有问题的,而dither_resize16则正确处理了这个问题,我写nnedi3_resize16时也正确处理了这个问题。
如果用Dither的hack來實行Colorspace-awared Resize, 速度會不會很慢呢?
我試過Decode+Colorspace-awared Lanczos Resizer, 用我4年前的CPU跑(AMD P-II 955 BE 4x3.2GHz), 最多只有約40fps (720x480 -> 1920x1080)
最慢的過程是Linear RGB轉成顯示器用的RGB, 這個過程佔了大部分CPU時間, 原因是要做太多次LUT。

現時用RGB Lanczos Resizer的方法, MPEG-2 Decode(ffvfw/libavcodec)->YV12->(Lanczos Resizer Upsampling to 4:2:2)->RGB->顯示器用的RGB->Lanczos Deinterlacer->Lanczos Resizer->1920x1080有60fps, CPU Usage <70%
這方法放大時目視畫質差不多, 但快很多~~
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: 播放程式/轉檔程式常見的問題

于是我测试了一下,CPU是E3-1230 V2。

先是解码712x476 yuv420p10的源并转换成RGB48Y,测试这部分的速度。
[syntax="avisynth"]SetMemoryMax(800)

LWLibavVideoSource("R:\Encode\Kaitou Saint Tail 1995 [DVD 712x476p x264-Hi10P AC3] - mawen1250\Kaitou Saint Tail 1995 EP01 [DVD 712x476p 23.976fps x264-Hi10P AC3] - mawen1250.mkv", threads=4, stacked=true, format="yuv420p16")

Dither_convert_yuv_to_rgb(lsb_in=true, output="rgb48y")[/syntax]
用avs2avi跑得到405fps,由于帧数变成了3倍所以实际上是135fps。

然后测试加上gamma到linear与linear到gamma的速度。这里我利用MP_Pipeline把各部分放在不同进程里跑。
[syntax="avisynth"]MP_Pipeline("""

SetMemoryMax(800)

LWLibavVideoSource("R:\Encode\Kaitou Saint Tail 1995 [DVD 712x476p x264-Hi10P AC3] - mawen1250\Kaitou Saint Tail 1995 EP01 [DVD 712x476p 23.976fps x264-Hi10P AC3] - mawen1250.mkv", threads=4, stacked=true, format="yuv420p16")

Dither_convert_yuv_to_rgb(lsb_in=true, output="rgb48y")

### prefetch: 16, 0
### ###

SetMemoryMax(800)

Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)
Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)

""")[/syntax]
得到267fps,除以三就是89fps。

加上lanczos resize以后
[syntax="avisynth"]MP_Pipeline("""

SetMemoryMax(800)

LWLibavVideoSource("R:\Encode\Kaitou Saint Tail 1995 [DVD 712x476p x264-Hi10P AC3] - mawen1250\Kaitou Saint Tail 1995 EP01 [DVD 712x476p 23.976fps x264-Hi10P AC3] - mawen1250.mkv", threads=4, stacked=true, format="yuv420p16")

Dither_convert_yuv_to_rgb(lsb_in=true, output="rgb48y")

Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)

### prefetch: 16, 0
### ###

SetMemoryMax(800)

Dither_resize16(1920, 1060, kernel="lanczos", Y=3, U=1, V=1)

Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)

""")[/syntax]
得到105fps,除以三就是35fps。

进一步加上non-ringing算法的话
[syntax="avisynth"]MP_Pipeline("""

SetMemoryMax(800)

LWLibavVideoSource("R:\Encode\Kaitou Saint Tail 1995 [DVD 712x476p x264-Hi10P AC3] - mawen1250\Kaitou Saint Tail 1995 EP01 [DVD 712x476p 23.976fps x264-Hi10P AC3] - mawen1250.mkv", threads=4, stacked=true, format="yuv420p16")

Dither_convert_yuv_to_rgb(lsb_in=true, output="rgb48y")

Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)

### prefetch: 16, 0
### ###

SetMemoryMax(800)

lanczos = Dither_resize16(1920, 1060, kernel="lanczos", Y=3, U=1, V=1)

### export clip: lanczos
### prefetch: 16, 0
### ###

SetMemoryMax(800)

gauss = Dither_resize16(1920, 1060, kernel="gauss", a1=100, Y=3, U=1, V=1)

lanczos.Dither_repair16(gauss, 1, -1)

Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve="srgb", U=1, V=1)

""")[/syntax]
得到60fps,除以三就是20fps。
可能由于Dither_resize16中的gauss kernel优化不够到位,所以这里速度都卡在gauss resize上了。
sswroom
核心会员
核心会员
帖子: 31
注册时间: 2012-08-03 1:42

Re: 播放程式/轉檔程式常見的問題

似乎是Dither_convert_yuv_to_rgb優化不夠好
你的CPU速度約比我的CPU快一倍, 我的CPU跑720x480的YUV->RGB(Linear RGB)有120fps以上, 所以你CPU跑的話, 速度應該是200fps以上才對

Resize後, 速度大幅下降是正常的, 因為像素大幅增加, 令Dither_y_linear_to_gamma處理慢了很多。

回到 “理论讨论 / Theoratical discussion”