记一次从AviSynth到VapourSynth的迁移(1):感受不同的API 上
(内容待整理…orz)
1.细碎的问题
变量命名习惯的变化
avs的pitch = vs的stride
avs的env = vs的vi?那avs的params呢?
vs中很少见dst->width之类的写法,而是d->width
函数的迁移
1.GetRowSize()到GetWidth()*sizeof()?
2.BitBlt()到vs_bitblt
3.获取子采样的字节数
GetPlaneWidthSubsampling()、GetPlaneHeightSubsampling()到subSamplingW、subSamplingH
4.在初始化gcd_h、gcd_v的时候写了一串,是因为avs没有提供类似vsapi->getFrameWidth(src, plane)的api,在vs中,不用这么费力。
变量类型的重新定义
1.为了兼容32bit,不能用unsigned修饰变量类型,因为32bit的取值是[-1.0, 1.0],包含负值。
2.为了避免我不知道的麻烦,把所有short类型全用int代替,之后有可能再改回来。
2.函数调用逻辑的变化
- 判断RGB or YUV空间 -> 选择相应的函数
就是这么简单的逻辑,写个if语句就好,为什么感到这么凌乱。
我需要回答几个问题
- 为什么把横向和纵向写成两个函数?在
process()调用时,这两个函数的关系是什么,是先处理一个方向吗? - 在if判断条件中的运算结果,其生存期是多少?
- 为什么在Hor和Ver两个方向,分别代入了源和输出的尺寸?
3.从类到模版
还是类和对象好啊,为什么使用了vs api后,就没有那种教科书一般经典的类和对象的用法了呢?
调用VapourSynth API本身的一些问题
使用函数(我想说啥来着…)
我甚至忘了vsapi->getFrameWidth(src, plane),把src换成dst就是输出的尺寸了啊..一个劲写d->target_width总感觉不对劲…
4.C++基础相关
this指针
语法上的概念
只有成员函数才有this指针,每个对象都能通过this指针访问自己的地址。
这篇菜鸟教程确实很好,不仅说明了this指针,也更加清楚地理解了->运算符。
这是类和对象中的概念,我在迁移后的VapouSynth中根本没有写class,所以不要this指针了吧。
从语法上讲,this指针不能用于被static标记的(成员)函数。
具体实现的功能
1 | |
从这个判断语句中能得到什么?让我终于明白了代码中四个核心处理函数为什么要写成bool型了。像这样
1 | |
emmm…但是每个函数最后都写着return true,那false是怎么来的…
数学函数
gcd(),求最大公约数,实现如下
1 | |
C++的多线程
并发(Concurrency)和并行(Parallelism)
1 | |
switch语句
在条件并列且写法整齐时,用switch比if…else更简洁一些。
基础的基础
第一次看到类似这样的写法
1 | |
最后的判断项省略了。