记一次从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()subSamplingWsubSamplingH

4.在初始化gcd_hgcd_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
if (!(this->*(this->ResizeHorizontal))(buff, srcp, src_pitch, &params[i]))

从这个判断语句中能得到什么?让我终于明白了代码中四个核心处理函数为什么要写成bool型了。像这样

1
bool AreaResize::ResizeHorizontalPlanar(BYTE* dstp, const BYTE* srcp, const int src_pitch, const params_t* params)

emmm…但是每个函数最后都写着return true,那false是怎么来的…

数学函数

gcd(),求最大公约数,实现如下

1
2
3
4
5
int gcd(int x, int y)
{
int m = x % y;
return m == 0 ? y : gcd(y, m);
}

C++的多线程

并发(Concurrency)和并行(Parallelism)

1
Concurrency::parallel_for();

switch语句

在条件并列且写法整齐时,用switch比if…else更简洁一些。

基础的基础

第一次看到类似这样的写法

1
for (unsigned short index_value = target_width; index_value--; )

最后的判断项省略了。