记一次从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 |
|
最后的判断项省略了。