• 转)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;

  • 相关阅读:
    jenkins
    k8s 驱逐限制
    jenkins+k8s 实现持续集成
    镜像更新备份
    【工具分享】2020年4月 phpstorm2020.1 for mac
    【排坑】mac安装homebrew会遇到的各种问题解决方案
    记一次C盘扩容
    2018夏季工作台之再设计
    left join后面加上where条件浅析
    编程随想篇(2018夏)
  • 原文地址:https://www.cnblogs.com/lihaiping/p/4194071.html
Copyright © 2020-2023  润新知