懒人李冰

记录我的生活、学习

X264源码解析之x264_encoder_open函数

本文主要记录x264_encoder_open函数。

x264_encoder_open函数是encode函数的几大主要函数之一。从名字可以看出,该函数主要是打开编码器, 它的主要作用是对编码器用到的一些参数进行初始化、并对编码器用到的一些与编码算法相关的函数进行初始化。 可以首先看一下它的声明:

1
2
3
/* x264_encoder_open:
 *      create a new encoder handler, all parameters from x264_param_t are copied */
x264_t *x264_encoder_open( x264_param_t * );

x264_encoder_open中会调用到一些宏定义的函数,比如x264_reduce_fraction,这里先把该函数的定义给出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/****************************************************************************
 * x264_reduce_fraction:
 ****************************************************************************/
#define REDUCE_FRACTION( name, type )\
void name( type *n, type *d )\
{                   \
    type a = *n;    \
    type b = *d;    \
    type c;         \
    if( !a || !b )  \
        return;     \
    c = a % b;      \
    while( c )      \
    {               \
        a = b;      \
        b = c;      \
        c = a % b;  \
    }               \
    *n /= b;        \
    *d /= b;        \
}

REDUCE_FRACTION( x264_reduce_fraction  , uint32_t )
REDUCE_FRACTION( x264_reduce_fraction64, uint64_t )

将上面的x264_reduce_fraction展开,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void x264_reduce_fraction(uint32_t *n, uint32_t *d)
{
	uint32_t a = *n;
	uint32_t b = *d;
	uint32_t c;
	
	if(!a || !b)
	    return;
	c = a % b;
	while(c)
	{
		a = b;
		b = c;
		c = a % b;
	}
	*n /=b;
	*d /=b;
}

通过上面的展开可能一眼看不出所以然,其实这是一个非常简单的算法应用,求两个数 n 和 m 约分后再分别 赋值给相应的分子和分母,函数的前半部分就是经典的求最大公约数 b 的过程,可以参考细说算法–最大公约数

暂时先理解这段代码的含义,至于为什么要这么做,后面在分析。