configuration:-d encoder_main.cfg
input file:akiyo_qcif.yuv
一、序列级初始化函数功能说明
函数:alloc_encoder(&p_Enc);
功能:p_Enc是全局(指针)变量,该函数为它所指向的对象分配相应的空间,主要是视频参数和输入参数结构体,并进行默认的初始化(一般都是0)。
函数:Configure (p_Enc->p_Vid, p_Enc->p_Inp, argc, argv);
功能:上一个函数为p_Enc->p_Vid, p_Enc->p_Inp两个参数分配了空间,但未进行实质性的初始化。此函数的目的就是根据配置文件(encoder_main.cfg),初始化p_Enc->p_Inp中的部分参数。(调用之前,前两个参数几乎是空白)
函数:init_encoder(p_Enc->p_Vid, p_Enc->p_Inp);
功能:初始化编码器。读取输入视频文件,并初始化编码参数,如输入视频文件的格式、量化参数、预测模式、搜索范围、失真准则等等,完成序列级头信息的写入。调用之前,p_Enc->p_Inp的部分参数根据配置文件进行了相应的初始化(Configure函数中完成),但p_Enc->p_Vid几乎是空白。此函数中调用了几个重要函数:
- OpenFiles(&p_Inp->input_file1); 功能:打开输入的视频文件;
- set_storage_format(p_Vid, &(p_Inp->source), &(p_Vid->p_Dpb_layer[0]->storage_format)); 功能:根据文件设置帧格式,如分辨率(即图像的高和宽)
- Init_QMatrix(p_Vid, p_Inp); 功能:完成量化参数矩阵的空间分配及基本初始化。
- Init_QOffsetMatrix(p_Vid); 功能:参考《The H.264 Advanced Video Compression Standard》2ed (7.24)及下面的说明。
- GenerateParameterSets(p_Vid); 功能:得到sps、pps等参数。包括profile_idc、Level_idc、PPS_id等。
- generate_encode_parameters(p_Vid); 功能:得到输入视频文件的一些参数,如文件格式、分辨率等等。
- init_img (p_Vid); 功能:初始化了许多参数,值得关注。包括图像的基本特性,如图像的高和宽、像素值特性、量化步长、参考帧数目、宏块大小、变换系数等空间的分配,初始化上下文环境(概率模型和熵)。
- Init_Motion_Search_Module (p_Vid, p_Inp); 功能:若研究预测算法,要特别关注这个初始化函数。
- information_init(p_Vid, p_Inp, p_Vid->p_Stats); 功能:打印配置信息。
- p_Vid->p_Stats->bit_slice = start_sequence(p_Vid, p_Inp); 功能:将SPS和PPS信息写入到比特中。写序列级信息,参考标准文档:7.3.2.1.1 Sequence parameter set data syntax。
通过以上函数,基本上完成序列级的初始化。
二、编码器级初始化函数功能说明
函数:prepare_frame_params(p_Vid, p_Inp, curr_frame_to_code);
功能:为编码一帧初始化参数。一帧编码前的准备,初始化了许多参数。之前的初始化是针对一个视频流,此处是针对具体的帧。
三、片级初始化函数功能说明
函数:init_slice (p_Vid, &currSlice, CurrentMbAddr);
功能:为当前处理的片(slice)分配空间并进行初始化,根据帧类型确定参数。这个函数确定了许多参数。
当然,在每一级都会有一些基本的初始化,但主要的初始化工作都在序列级和编码器级完成。