/********************************************************************************************
x264_image_t 结构用于存放一帧图像实际像素数据。该结构体定义在x264.h中
*********************************************************************************************/
typedef struct
{
int i_csp; // 设置彩色空间,通常取值 X264_CSP_I420,所有可能取值定义在x264.h中
int i_plane; // 图像平面个数,例如彩色空间是YUV420格式的,此处取值3
int i_stride[4]; // 每个图像平面的跨度,也就是每一行数据的字节数
uint8_t *plane[4]; // 每个图像平面存放数据的起始地址, plane[0]是Y平面,
// plane[1]和plane[2]分别代表U和V平面
} x264_image_t;
/********************************************************************************************
x264_picture_t 结构体描述一视频帧的特征,该结构体定义在x264.h中。
*********************************************************************************************/
typedef struct
{
int i_type; // 帧的类型,取值有X264_TYPE_KEYFRAME、X264_TYPE_P、
// X264_TYPE_AUTO等。初始化为auto,则在编码过程自行控制。
int i_qpplus1; // 此参数减1代表当前帧的量化参数值
int i_pic_struct; // 帧的结构类型,表示是帧还是场,是逐行还是隔行,
// 取值为枚举值 pic_struct_e,定义在x264.h中
int b_keyframe; // 输出:是否是关键帧
int64_t i_pts; // 一帧的显示时间戳
int64_t i_dts; // 输出:解码时间戳。当一帧的pts非常接近0时,该dts值可能为负。
/* 编码器参数设置,如果为NULL则表示继续使用前一帧的设置。某些参数
(例如aspect ratio) 由于收到H264本身的限制,只能每隔一个GOP才能改变。
这种情况下,如果想让这些改变的参数立即生效,则必须强制生成一个IDR帧。*/
x264_param_t *param;
x264_image_t img; // 存放一帧图像的真实数据
x264_image_properties_t prop;
x264_hrd_t hrd_timing; // 输出:HRD时间信息,仅当i_nal_hrd设置了才有效
void *opaque; // 私有数据存放区,将输入数据拷贝到输出帧中
} x264_picture_t ;
/****************************************************************************************************************
x264_nal_t中的数据在下一次调用x264_encoder_encode之后就无效了,因此必须在调用
x264_encoder_encode 或 x264_encoder_headers 之前使用或拷贝其中的数据。
*****************************************************************************************************************/
typedef struct
{
int i_ref_idc; // Nal的优先级
int i_type; // Nal的类型
int b_long_startcode; // 是否采用长前缀码0x00000001
int i_first_mb; // 如果Nal为一条带,则表示该条带第一个宏块的指数
int i_last_mb; // 如果Nal为一条带,则表示该条带最后一个宏块的指数
int i_payload; // payload 的字节大小
uint8_t *p_payload; // 存放编码后的数据,已经封装成Nal单元
} x264_nal_t;
/****************************************************************************************************************
cli_opt_t结构体主要记录一些与编码关系较小的设置信息,其变量可通过读取main()的参数获得。
*****************************************************************************************************************/
typedef struct
{
int b_progress; // bool类型的变量,用来控制是否显示编码进度。取值为0或1。
int i_seek; // 整数类型 表示开始从哪一帧开始编码。
// 因为不一定从文件的第一帧开始编码,这是可以控制的。
/* hnd_t(hnd=handle)是一个空指针, 定义在x264cli.h 中。void *在C语言里空指针是有几个
特性的,它是一个一般化指针,可以指向任何一种类型,但却不能解引用,需要解引
用的时候,需要进行强制转换。采用空指针的策略,是为了声明变量的简便和统一。 */
hnd_t hin; // 指向输入yuv文件的指针
hnd_t hout; // 指向编码过后生成的文件的指针。
/* 一个指向文件类型的指针,它是文本文件,其每一行的格式是 :framenum frametye
QP用于强制指定某些帧或者全部帧的帧类型和QP(quant param量化参数)的值. */
FILE *qpfile;
} cli_opt_t;