x264重要结构体详细说明(2): x264_image_t、x264_picture_t、x264_nal_t

本博客转载于:http://nkwavelet.blog.163.com/blog/static/2277560382013102923912753/


/********************************************************************************************
 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;
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页