1.这个类型,一定要吃透,虽然代码是用C写得,但是写得很C++,这个其实可以看做一个C++的类,里面定义了很多指针,这些指针指又指向了一些,而这个其实相当于C++的成员函数,成员函数的初始化,一般是在函数里面初始化的 。这一点,可以在后面的叙述中体现出来 。
【H.264 ,MPEG-2,MPEG-1,H.263,MPEG-4系列】2.再说一下编码的过程,函数,做了的编码,在1629行,开始做DCT&quant,1686行,开始做霍夫曼编码,而霍夫曼编码,对不同的标准来说,码表是不一样的,因此在1687行做了一个的选择,mpeg1和mpeg2,都是用的相同的函数进行block的编码,而block内的编码,在以前的笔记中已经提到,过程这里不重复 。
![H.264 ,MPEG-2,MPEG-1,H.263,MPEG-4系列](http://img.gansulong.com/231017/025FU613-0.png)
文章插图
3.现在说DCT&quant,其中,1635行s->[i] = s->(s, s->block[i], i, s->, &);,就是做DCT&quant 。正如第1点中说的,本来只是中的一个元素,类型为指针,指向一个,而这个就相当于C++里面的成员函数 。现在,我们知道了在这个地方,相当于调用了一个成员函数,做了DCT&quant这件事情,接下来,讨论这个成员函数在哪里初始化的 。
4.在.c的函数里面,对编码所需要的一些“成员函数”进行了初始化 。前面一堆东西,是做编码器的选择 。在第656行,这成员函数被初始化为这个函数 。于是,接下去找这个函数的定义 。发现,3649行,又调用了dsp.fdct这个成员函数,做离散余弦变换 。接下来找dsp.fdct这个成员函数的初始化地方 。
这个非常费劲,我找了半天才找到——在函数里面做了fdct的初始化,一步一步的跟踪调用关系,可以发现过程是这样的:
调用,再调用,在里面初始化了fdct,而紧接着,执行前面提到的的初始化 。
至此,整个初始化完成 。