版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

O16 mod v2.2.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

O16 mod v2.2.0
NMM碗柜:http://nmm.me/z0
我的所有avsi脚本所需滤镜(Requirements)打包下载(文件夹分享):http://pan.baidu.com/s/1Bt2fY

注:O16mod脚本里有很多函数,但实际使用通常只需要几个,例如脚本本身名字所对应的O16现在在我个人看来完全用不到,我经常使用的就是U16、Down10(如果是TV Range下16bit降为8bit就直接使用DitherPost(mode=0),还可以设置ampo、mask两个参数用于更优化的输出结果),如果有特殊的bit depth转换需求就用万能转换BitDepth。

此脚本由taro大写的O16脚本修改而来。
修改原因主要如下:
1.原先的O16脚本里所有功能都通过f3kdb与SmoothAdjust实现,而经过测试发现,许多较为简单的功能通过新版dither内置函数实现相比于f3kdb可以有更快的速度,所以我便据此对其进行优化。(以前的旧版dither内相关函数可能由于缺乏优化所以速度更慢)
2.增加Round10:接受stacked 16bit输入并可以将其通过Rounding转换为8-15bit输出。
3.taro已经是VS的人了,和AVS脱离关系了所以我改AVS的脚本应该也没问题吧……


大部分说明可以看taro的发布帖或者脚本内部,我这里只说说我修改的东西。

(以下速度测试均基于dither 1.22.0,在我笔记本的i3 370M的结果)

1.U16里的转换由Dither_convert_8_to_16()代替f3kdb实现,速度是3.5倍左右。同时增加参数stack,默认true,设为false时输出interleave格式16bit。

2.C16可以将stack格式的high bit depth clip转换为interleave格式(用于输出给x264)。转换由Dither_out()代替f3kdb实现,速度是5倍左右。

3.增加函数Round10,由Dither_lut16实现TV Range下16bit向低位深的转换,速度与f3kdb差不多。但由于f3kdb在dither=1时是直接shift进行转换(Truncating),所以计算时使用Rounding的Round10的error会更小一点。
参数depth设置输出位深。

4.增加函数U10,由mt_lut实现TV Range下8bit向高位深的转换,由SmoothCurve16实现PC Range下8bit向高位深的转换。
参数depth设置输出位深;参数tvRange,指定是否为TV Range;参数stack,默认true,设为false时输出interleave格式16bit。


5.Down10:
PC Range以及dither>=0时不变,由SmoothCurve16处理。
TV Range时,输出为8bit时,用DitherPost代替原先的f3kdb,速度更快而且支持更多的dither mode。输出为9-15bit时,dither=-2/-3(默认)时依然使用f3kdb做转换;dither=-1时则由Round10来完成;增加了dither=-4的设定,此时将会调用Dither_quantize做转换,支持更多的dither mode,但由于Dither_quantize是通过脚本实现而不是原生滤镜实现,所以速度比f3kdb慢。
DitherPost和Dither_quantize的mode由参数ditherm控制,默认为6。
► 显示剧情透露 ditherm模式说明
6.调用了Down10的函数O16也增加ditherm参数并允许使用dither=-4。

7.增加函数BitDepth,通过SmoothCurve/SmoothCurve16实现将1-16bit的TV/PC Range输入转换为1-16bit的TV/PC Range输出,也就是任意的bit depth及range转换,可以用于各种情况,输入为9-16bit时只接受stack格式,输出为9-16bit时可以为stack或interleave格式。当然由于转换手段限制于SmoothCurve/SmoothCurve16,所以dither算法可选的种类不像Down10那么丰富。输出位深小于等于6时默认dither=0也就是使用ordered-dither,输出位深大于等于7时默认使用dither=50也就是带有random noise的dither,注意在转换结果没有rounding error时即使开启了dither也不会加入dither/noise(例如TV Range下8bit及以上的输入单纯进行提升bit depth)。

主要参数及默认值有input_depth=8, output_depth=input_depth, input_TVrange=True, output_TVrange=input_TVrange, input_LDPad=2, output_LDPad=input_LDPad。
前4个参数不需要解释了,后2个参数特别说明一下,这2个参数分别对输入/输出为1-7bit时起作用,设置输入/输出的low depth量化结果的存储方式。
举个例子,如果输入8bit输出4bit并为了简化起见dither设为-1。
源为PC Range时输入luma的 0、128、200、255经过降低位深后得到的是0、8、12、15,output_LDPad设为0时就保持0、8、12、15原样输出,设为1时会左移4bit(等于乘以2^4)后得到 0、128、192、240,设为2时会按照8bit PC Range的范围定义转换得到0、128、204、255。
源为TV Range时输入luma的16、128、200、235经过降低位深后得到的是1、8、13、15,output_LDPad设为0时就保持1、8、13、15原样输出,设为1时会左移4bit(等于乘以2^4)后得到16、128、208、240,设为2时会按照8bit TV Range的范围定义转换得到16、126、204、235。
如果你降低位深的结果仍然是在8bit下存储、显示,那么LDPad默认的2可以使显示结果的偏差最小。而如果你将输出的结果送入其他工具转换为真正的Low Depth格式,那么就需要根据工具的转换方法来决定使用0、1还是2。


------------------------------------------------------------------------------------------------
Changelog:

v1.6.1
修复Down10的2个bug:
1.dither=-1且stack=false时输出仍为stack的问题
2.dither>=0时f3kdb报错的问题
其他一些无关紧要的脚本上的改动

v1.7.0
看了一下有关YCbCr定义的文档后发现O16/O16mod脚本里的Down10/U16/U10中使用SmoothCurve16时所用的Expr(表达式)有一些问题——注意这个问题只影响启用SmoothCurve16的情况,例如tvRange=false或dither>=0或smooth>0,所以默认值以及多数使用情况不受影响。
原先O16/O16mod中Down10用的Expr是对TV Range下的Y和CbCr都限定了neutral point,而PC Range下均没有限定neutral point。
原先O16/O16mod中U16/U10用的Expr是对PC Range的Y和CbCr都限定了neutral point(TV Range则始终不会使用SmoothCurve16)。
但是根据YCbCr的标准,无论TV Range还是PC Range,Y都只是定义了black level和range,CbCr都只是定义了neutral point和range,所以以上的Expr中Y都不应该有neutral point的限定而CbCr则始终应该有neutral point的限定。
v1.7.0就是按照标准来修正使用SmoothCurve16时所用的Expr。

v2.0.0
由于SmoothAdjust更新了v2.80修改了一些参数的名字,所以v2.0.0也修改相应参数,不再兼容以前版本的SmoothAdjust,另外SmoothAdjust v2.60以后的avs 2.6.x的版本都是对应AviSynth 2.6 Alpha4的API,所以也请还在使用AviSynth 2.6 Alpha3的人更新到Alpha4,对应Alpha4 API的masktools也在上方提供的Requirements里包含了。
原先taro写的用于8bit输入1-8bit输出的半成品LowDepth有overflow的bug(处理PC Range时就会遇到),而且运行效率也不高。于是我将其重写,为了高效与简化起见只通过SmoothCurve实现。同时也增加了LowDepth16用于16bit输入,1-8bit输出。
新增了函数BitDepth,通过SmoothCurve/SmoothCurve16实现将1-16bit的TV/PC Range输入转换为1-16bit的TV/PC Range输出,也就是任意的bit depth及range转换,可以用于各种情况,输入为9-16bit时只接受stack格式,输出为9-16bit时可以为stack或interleave格式。当然由于转换手段限制于SmoothCurve/SmoothCurve16,所以dither算法可选的种类不像Down10那么丰富。输出位深小于等于6时默认dither=0也就是使用ordered-dither,输出位深大于等于7时默认使用dither=50也就是带有random noise的dither,注意在转换结果没有rounding error时即使开启了dither也不会加入dither/noise(例如TV Range下8bit及以上的输入单纯进行提升bit depth)。
BitDepth能够实现U10、LowDepth、LowDepth16的所有功能。

v2.1.0
仔细查看Rec H.264/H.265文档的Matrix Coefficients部分后发现目前O16mod里对PC Range下CbCr的处理与标准定义仍有微小偏差,以8bit转换16bit的U16为例:

代码: 全选

原版本:Cexpr = "      0  -0  ;128-32768;255  -65535  ;65535-65535  "
新版本:Cexpr = "0-0.5;0.5-0.5;128-32768;255.5-65535.5;65535-65535.5"
简单的说,文档中对PC Range下CbCr的定义是以1<<(BitDepth-1)为中值,上下变化范围为[-0.5, 0.5]*(1<<BitDepth-1),所以对于8bit就有了0.5-128-255.5的结果,这是未经量化与Clip的理论值,经过量化与Clip后实际得到的仍然是0-255之间的整数。新版本修正后的结果可能会与原版本有少量区别,但一般都看不出来就是了。
删除了不常用而且完全可以使用BitDepth实现的函数U10、LowDepth、LowDepth16。
增加了一个函数O16mod_TestPattern,用于生成一个测试clip,可以用来测试对各种数值YCbCr的转换结果是否符合标准,目前只能生成8bit的clip。

v2.2.0
将v2.1.0中CbCr表达式超界的部分通过线性缩放限制在对应Bit Depth的上界,防止CbCr降低Bit Depth且输出为PC Range时导致Overflow。
O16函数中调用的U10由于已删除,用BitDepth代替。
修正O16mod_TestPattern中pixel_type参数无效的问题。
增加O16mod_TestPattern16,O16mod_TestPattern改名为O16mod_TestPattern8。
上次由 mawen1250 在 2014-03-22 13:11,总共编辑 22 次。
头像
ccsdken
帖子: 3
注册时间: 2012-07-09 23:17

Re: O16 mod v1.6.1 - 简易的high bit depth转换/输出脚本

今天刚刚更新SmoothAdjust v2.50之后O16就用不了...换回旧版本2.0就没问题
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: O16 mod v1.7.0 - 简易的high bit depth转换/输出脚本

更新v1.7.0
看了一下有关YCbCr定义的文档后发现O16/O16mod脚本里的Down10/U16/U10中使用SmoothCurve16时所用的Expr(表达式)有一些问题——注意这个问题只影响启用SmoothCurve16的情况,例如tvRange=false或dither>=0或smooth>0,所以默认值以及多数使用情况不受影响。
原先O16/O16mod中Down10用的Expr是对TV Range下的Y和CbCr都限定了neutral point,而PC Range下均没有限定neutral point。
原先O16/O16mod中U16/U10用的Expr是对PC Range的Y和CbCr都限定了neutral point(TV Range则始终不会使用SmoothCurve16)。
但是根据YCbCr的标准,无论TV Range还是PC Range,Y都只是定义了black level和range,CbCr都只是定义了neutral point和range,所以以上的Expr中Y都不应该有neutral point的限定而CbCr则始终应该有neutral point的限定。
v1.7.0就是按照标准来修正使用SmoothCurve16时所用的Expr。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: O16 mod v2.0.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

更新v2.0.0
由于SmoothAdjust更新了v2.80修改了一些参数的名字,所以v2.0.0也修改相应参数,不再兼容以前版本的SmoothAdjust,另外SmoothAdjust v2.60以后的avs 2.6.x的版本都是对应AviSynth 2.6 Alpha4的API,所以也请还在使用AviSynth 2.6 Alpha3的人更新到Alpha4,对应Alpha4 API的masktools也在上方提供的Requirements里包含了。
原先taro写的用于8bit输入1-8bit输出的半成品LowDepth有overflow的bug(处理PC Range时就会遇到),而且运行效率也不高。于是我将其重写,为了高效与简化起见只通过SmoothCurve实现。同时也增加了LowDepth16用于16bit输入,1-8bit输出。
新增了函数BitDepth,通过SmoothCurve/SmoothCurve16实现将1-16bit的TV/PC Range输入转换为1-16bit的TV/PC Range输出,也就是任意的bit depth及range转换,可以用于各种情况,输入为9-16bit时只接受stack格式,输出为9-16bit时可以为stack或interleave格式。当然由于转换手段限制于SmoothCurve/SmoothCurve16,所以dither算法可选的种类不像Down10那么丰富。输出位深小于等于6时默认dither=0也就是使用ordered-dither,输出位深大于等于7时默认使用dither=50也就是带有random noise的dither,注意在转换结果没有rounding error时即使开启了dither也不会加入dither/noise(例如TV Range下8bit及以上的输入单纯进行提升bit depth)。
BitDepth能够实现U10、LowDepth、LowDepth16的所有功能。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: O16 mod v2.1.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

v2.1.0
仔细查看Rec H.264/H.265文档的Matrix Coefficients部分后发现目前O16mod里对PC Range下CbCr的处理与标准定义仍有微小偏差,以8bit转换16bit的U16为例:

代码: 全选

原版本:Cexpr = "      0  -0  ;128-32768;255  -65535  ;65535-65535  "
新版本:Cexpr = "0-0.5;0.5-0.5;128-32768;255.5-65535.5;65535-65535.5"
简单的说,文档中对PC Range下CbCr的定义是以1<<(BitDepth-1)为中值,上下变化范围为[-0.5, 0.5]*(1<<BitDepth-1),所以对于8bit就有了0.5-128-255.5的结果,这是未经量化与Clip的理论值,经过量化与Clip后实际得到的仍然是0-255之间的整数。新版本修正后的结果可能会与原版本有少量区别,但一般都看不出来就是了。
删除了不常用而且完全可以使用BitDepth实现的函数U10、LowDepth、LowDepth16。
增加了一个函数O16mod_TestPattern,用于生成一个测试clip,可以用来测试对各种数值YCbCr的转换结果是否符合标准,目前只能生成8bit的clip。
上次由 mawen1250 在 2014-03-09 21:11,总共编辑 1 次。
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: O16 mod v2.1.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

mawen前辈,
不知道为什么用BitDepth(input_depth=16, output_depth=8)把16bit stacked降为8bit时,
在部分白色区域会出现黑点矩阵,
而用Ditherpost(mode=6)则没有问题,求指导。
捕获.JPG
捕获.JPG (49.58 KiB) 查看 21087 次
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: O16 mod v2.1.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

alexz220 写了:mawen前辈,
不知道为什么用BitDepth(input_depth=16, output_depth=8)把16bit stacked降为8bit时,
在部分白色区域会出现黑点矩阵,
而用Ditherpost(mode=6)则没有问题,求指导。
捕获.JPG
无法重现你的问题,SmoothAdjust版本?
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: O16 mod v2.1.0 - 简易的Bit Depth转换/输出脚本 新增万能转换函数BitDepth

mawen1250 写了:
alexz220 写了:mawen前辈,
不知道为什么用BitDepth(input_depth=16, output_depth=8)把16bit stacked降为8bit时,
在部分白色区域会出现黑点矩阵,
而用Ditherpost(mode=6)则没有问题,求指导。
捕获.JPG
无法重现你的问题,SmoothAdjust版本?
v2.95,都是从你百度云分享下的。
奇怪的是把MPP去掉之后就正常了(BitDepth与其src在同一分段)。
第一次遇见这情况。

回到 “AviSynth”