x264 struct学习 1

x264_t 结构体维护着CODEC的诸多重要信息

 

其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧,其类型已经确定;next是尚未确定类型的帧;unused用于回收不使用的frame结构体以备今后再次使用。

struct x264_t                                 

{

    /* cpu capabilities */

    unsigned int   cpu;

    /* bitstream output */

    struct

    {

        int         i_nal;         //定义一个网络提取层//

        x264_nal_t  nal[3];         /* for now 3 is enought */

        int         i_bitstream;    /* size of p_bitstream */

        uint8_t     *p_bitstream;   /* will hold data for all nal */

        bs_t        bs;

    } out;

    /* encoder parameters */

    x264_param_t    param;

    /* frame number/poc (TODO: rework that for B-frame) */

    int             i_frame;            //一个指示和控制帧编码过程的结构

    int             i_poc;

    int             i_frame_offset; /* decoding only */

    int             i_frame_num;    /* decoding only*/

    int             i_poc_msb;      /* decoding only */

    int             i_poc_lsb;      /* decoding only */

    /* We use only one SPS and one PPS */

    x264_sps_t      sps_array[32];

    x264_sps_t      *sps;

    x264_pps_t      pps_array[256];

    x264_pps_t      *pps;

    int             i_idr_pic_id;

    /* Slice header */

    x264_slice_header_t sh;
    /*cabac context */

    x264_cabac_t    cabac;

    /*current picture being encoded */

    x264_picture_t  *picture;

    /*bframe handling (only encoding for now) */

    x264_frame_t    *bframe_current[X264_BFRAME_MAX]; /* store the sequence of b frame being encoded */

    x264_frame_t    *frame_next[X264_BFRAME_MAX+1];   /* store the next sequence of frames to be encoded */这个是定义下一个帧,但不一定是B帧

    x264_frame_t    *frame_unused[X264_BFRAME_MAX+1]; /* store unused frames */

    /*frame being reconstructed */

    x264_frame_t    *fdec;

    /*Current MB DCT coeffs */

    struct

    {

        DECLARE_ALIGNED( int, luma16×16_dc[16], 16 );

        DECLARE_ALIGNED( int, chroma_dc[2][4], 16 );//色度

        struct

        {

            DECLARE_ALIGNED( int, residual_ac[15], 16 );

            DECLARE_ALIGNED( int, luma4×4[16], 16 );

        } block[16+8];16*8的宏快的取用情况

    } dct;离散余弦变换

    /* MBtable and cache for current frame/mb */

    struct

    {

        /*Strides */

        int     i_mb_stride;

 

        /*Current index */

        int     i_mb_x;

        int     i_mb_y;

        int     i_mb_xy;

        unsigned int i_neighbour;

        /* mb table */

        int8_t  *type;                      /*mb type */

        int8_t  *qp;                        /* mb qp */

        int16_t *cbp;       ?                /* mbcbp: 0×0?: luma, 0x?0: chroma, 0×100: luma dc, 0×0200 and 0×0400: chroma
dc  (all set for PCM)*/

        int8_t  (*intra4×4_pred_mode)[7];   /* intra4×4 predmode. for non I4×4 set to I_PRED_4×4_DC(2) */

        uint8_t (*non_zero_count)[16+4+4];  /* nzc. for I_PCMset to 16 */

        int8_t  *chroma_pred_mode;          /*chroma_pred_mode. cabac only. for non intra I_PRED_CHROMA_DC(0) */

        int16_t (*mv[2])[2];                /* mb mv. set to 0 for intra mb */

        int16_t (*mvd[2])[2];               /* mb mv difference with predict. set to 0 if intra. cabac only */

        int8_t   *ref[2];                   /*mb ref. set to -1 if non used (intra or Lx only */

        /*current value */

        int     i_type;

        int    i_partition;

        int     i_sub_partition[4];

        int     i_cbp_luma;

        int     i_cbp_chroma;

        int     i_intra16×16_pred_mode;

        int     i_chroma_pred_mode;

        struct

        {

            /*pointer over mb of the frame to be compressed */

            uint8_t *p_img[3];

            int      i_img[3];

 

            /*pointers over mb of references and reconstrucated frame */

            uint8_t *p_fdec[3];

            uint8_t*p_fref[2][16][3];

            int     i_fdec[3]; /* same strides for p_fdec/p_fref */

        } pic;

        /*cache */

        struct

        {

            /*real intra4×4_pred_mode if I_4X4, I_PRED_4×4_DC if mb available, -1 if not */

            int     intra4×4_pred_mode[X264_SCAN8_SIZE];色度预测模式

            /*i_non_zero_count if availble else 0×80 */

            int     non_zero_count[X264_SCAN8_SIZE];

            /*-1 if unused, -2 if unavaible */

            int8_t ref[2][X264_SCAN8_SIZE];

            /*0 if non avaible */

            int16_t mv[2][X264_SCAN8_SIZE][2];

            int16_t mvd[2][X264_SCAN8_SIZE][2];运动矢量与真实值之间的差

        } cache;

        /**/

        int     i_last_qp; /* last qp */

        int     i_last_dqp; /*last delta qp */

 
    } mb;宏快的预测以及运动补偿和运动估计

    /*frames used for reference */

    x264_frame_t      *freference[16+1];  /* all references frames plus current */

    int               i_ref0; 参考帧列表一(定义为lsit0意为向前预测编码)

    x264_frame_t      *fref0[16];       /* ref list 0*/

    int               i_ref1;参考帧列表二(定义为lsit1意为向后预测编码)

    x264_frame_t      *fref1[16];       /* ref list 1*/

    /*rate control encoding only */

    x264_ratecontrol_t *rc;

    /*stats */

    struct

    {

        /*per slice info */

        int   i_slice_count[5];

        int   i_slice_size[5];

        float f_psnr_y[5];

        float f_psnr_u[5];

        float f_psnr_v[5];

        int   i_mb_count[5][18];

    } stat;声明每一片的参数变量

    /* CPU functions dependants */

    x264_predict_t      predict_16×16[4+3];

    x264_predict_t      predict_8×8[4+3];

    x264_predict_t      predict_4×4[9+3];

    x264_pixel_function_t pixf;

    x264_mc_function_t    mc[2];

    x264_dct_function_t   dctf;

    /* vlc table for decoding purpose only */

    x264_vlc_table_t *x264_coeff_token_lookup[5];

    x264_vlc_table_t *x264_level_prefix_lookup;

    x264_vlc_table_t *x264_total_zeros_lookup[15];

    x264_vlc_table_t *x264_total_zeros_dc_lookup[3];

    x264_vlc_table_t *x264_run_before_lookup[7];

};

#endif

给出编码过程中的各个参数的初始化

x264_param_t

typedef struct

{

    /* CPU flags */

    unsigned int cpu;

    /* Video Properties */

    int         i_width;

    int         i_height;

    struct

    {

        /*they will be reduced to be 0 < x <= 65535 and prime */

        int         i_sar_height;

        int         i_sar_width;

    } vui;?

    float       f_fps;
/* Used for rate control only */

    /*Bitstream parameters */

    int         i_frame_reference;  /* Maximum number of reference frames */

    int         i_idrframe; /*every i_idrframe I frame are marked as IDR */

    int         i_iframe;   /* every i_iframe are intra */

    int         i_bframe;   /* how many b-frame between 2 references pictures */

    int         b_deblocking_filter;

    int         b_cabac;

    int         i_cabac_init_idc;给出熵编码初始化时表格的选择

    int         i_qp_constant;  /* 1-51 */

    int         i_bitrate;      /* not working yet */

    /* Encoder analyser parameters */

    struct

    {

        unsigned int intra;    /* intra flags */

        unsigned int inter;    /* inter flags */

    } analyse;

 

}
x264_param_t给出编码过程中的各个参数的初始化

 

sps序列参数集

typedef struct

{

    int i_id;
 
    int i_profile_idc;指明所用profile

    int i_level_idc; 指明所用level

     int b_constraint_set0;

    int b_constraint_set1;

    int b_constraint_set2; 当他们值等于1时,表示必须遵守某些制约条件

    int i_log2_max_frame_num;表示图像解码顺序的最大取值
 
    int i_poc_type;    /* poc 0 */

    int i_log2_max_poc_lsb;    /* poc 1 */

    int b_delta_pic_order_always_zero;其值等于一时句法元素delta_pic_order_cnt[0]和 delta_pic_order_cnt[1]不再片头出现,且他们的默认值都为0。为0时上述则出现。

    int i_offset_for_non_ref_pic;用来计算非参考帧或场的picture order count ,其值应在[-2e31,2e31-1]

    int i_offset_for_top_to_bottom_field; 用来计算帧的底场的picture order count 其值应在[-2e31,2e31-1]

    int i_num_ref_frames_in_poc_cycle;用来解码picture order count 取值应在[0,255]之间

    int i_offset_for_ref_frame[256]; 当picture order count type=1时用来解码poc,这句语法对循环num_ref_frames_in_poc_cycle中的每一个元素指定了一个偏移
 
    int i_num_ref_frames;指定参考帧队列的最大长度 h264规定最多可为16个参考帧

    int b_gaps_in_frame_num_value_allowed;值为1时表示允许句法frame_num可以不连续

    int i_mb_width;

    int i_mb_height;

    int b_frame_mbs_only;

    int b_mb_adaptive_frame_field;

    int b_direct8×8_inference;指明b片的直接和skip模式下运动矢量的预测方法
   
    int b_crop;

    struct

    {

        int i_left;

        int i_right;

        int i_top;

        int i_bottom;

    } crop;图像剪彩后输出的参数

 

    int b_vui;

    struct

    {

        int i_sar_width;

        int i_sar_height;

        /* FIXME to complete */

    } vui;

 

}
x264_sps_t定义序列参考队列的参数以及初始化

 

pps图像参数集

typedef struct

{

    int i_id;

    int i_sps_id;

    int b_cabac;

    int b_pic_order;

    int i_num_slice_groups; 加一表示图像中片组的个数

 

  
int i_slice_group_map_type;片组分割类型    /*i_slice_group_map_type == 0 */

    int i_run_length[256];  指明片组类型为2时每个片组连续的map_units的个数    /* FIXME */

    /*i_slice_group_map_type == 2 */

    int i_top_left[256];        /* FIXME */

    int i_bottom_right[256];    /* FIXME */

    /*i_slice_group_map_type == 3, 4, 5 */

    int b_slice_group_change_direction; 当类型为345时与下句语法一起指明片组分割方法

    int i_slice_group_change_rate;    /*i_slice_group_map_type == 6 */

    int i_pic_size_in_map_units;类型为6时指明图像以map_units为单位的大小
   
    int i_slice_group_id[256];  /* FIXME */指明map_units属于哪个片组

    int i_num_ref_idx_l0_active;加1为参考帧队列的长度 此为list0

    int i_num_ref_idx_l1_active;此为list1

    int b_weighted_pred;用以指明是否允许P和SP片的加权预测
   
    int b_weighted_bipred; 用以指明是否允许B片的加权预测

     int i_pic_init_qp;加26后用以指明亮度分量的量化参数的初始值

    int i_pic_init_qs;同上只是用于SP和SI

    int i_chroma_qp_index_offset;指明计算使用时用到的参数

    int b_deblocking_filter_control;

    int b_constrained_intra_pred;控制PB帧的帧内编码

    int b_redundant_pic_cnt;是否出现redundant_pic_cnt句法元素

} x264_pps_t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2016 ACM/ICPC Asia Regional Dalian Online

自己还是太菜&#xff0c;补题离不开题解。。。 但还是留个博客&#xff0c;万一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇见&#xff0c;学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列&#xff0c;旋转后就可以通过…

tornado学习笔记day07-同步与异步

同步 概念 同步就是按部就班的依次执行我们的代码 进阶 但是有些情况我们有一些比较耗时的从操作,比如去别的地方拿点资源,去其他网站请求数据,去访问数据库,上传文件等等,所以这里面优点瑕疵,有小编一一道来 比如这样 本模块的功能:<同步异步demo># 这个就相等于一个…

关键字: on

关键字: on 数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条…

天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险

近日&#xff0c;天融信阿尔法实验室在JSOF实验室发布的由Treck公司开发的TCP/IP软件库中获取到一系列0day漏洞。JSOF实验室发布的这批漏洞共计19个&#xff0c;被JSOF研究人员称为"Ripple20"。受此软件库影响的产品数量估计超过数亿&#xff0c;其中包括智能家居设备…

Service-Oriented Architecture,SOA(转)

http://blog.csdn.net/WOOSHN/article/details/8036910 介绍&#xff1a; IT体系结构已非常成熟&#xff0c;它是一种成功处理典型IT问题的方法。体系结构中一个受到很大重视且相对较新的分支是面向服务的体系结构(SOA)。SOA经常被吹捧为企业用于解决应用程序灵活性和高维护成本…

tornado学习笔记day08-tornado中的异步

概述 应为epoll主要用来解决网络的并发问题,所以tornado中的异步也是主要体现在网络的IO异步上,即异步web请求 tornado.httpclient.AsyncHTTPClient tornado提供异步web请求客户端,可以用来进行异步web请求, 这个客户端和服务端是相对来说的,当tornado的Handler去其他位置去…

GreenSock (TweenMax) 动画案例(二)

实现效果 动画分解 1.灯光闪烁2.文字出现3.水流4.心电图 知识点 1.AI(可尽情骚扰UI欧巴)2.SVG(了解基本的知识点)3.TweenMax(GreenSock)4.CSS animation 写在前面 写过第一篇文章后GreenSock (TweenMax) 动画案例(一)再回头看发现代码太多&#xff0c;根本没耐心去看完。所以每…

vue 用key拿对象value_利用 WeakMap 对 Vue 新建数组中的对象赋予 :key

需求在 Vue 中&#xff0c;对组件进行循环都需要加入key以便“就地复用”&#xff0c;可是在某些情况下&#xff0c;我们需要新建多个对象&#xff0c;而这些对象不是从后端获取到的&#xff0c;而是前端生成的&#xff0c;没有唯一值&#xff0c;且 Vue 目前版本只允许字符串&…

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能&#xff0c;这里总结一下常用的两种方式的实现原理 一、使用UIScrollview实现无限轮播用UIScrollView实现&#xff0c;在scrollView上添加3个UIImageView&#xff0c;分别用来显示上一张图片&#xff0c;当前显示的图片&#xff0c…

开启 JM 的 trace 功能

[JM代码] 开启 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑 城里汉子说过&#xff1a; trace文件对分析码流结构很有效。我说的是trace文件&#xff0c;不是一步一步跟踪&#xff0c;就是编解码同时生成的 trace_enc.txt 这个文件&#xff0c;里面对每个比…

kafka入门介绍(转载)

Kafka作为一个分布式的流平台&#xff0c;这到底意味着什么&#xff1f; 我们认为&#xff0c;一个流处理平台具有三个关键能力&#xff1a; 发布和订阅消息&#xff08;流&#xff09;&#xff0c;在这方面&#xff0c;它类似于一个消息队列或企业消息系统。 以容错的方式存储…

Cmd Markdown 编辑阅读器

欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想&#xff0c;整理笔记、知识&#xff0c;并将其中承载的价值传播给他人&#xff0c;Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown&…

关于在smarty中实现省市区三级联动

刚开始接触php&#xff0c;&#xff0c;其实对于一些比较深入的东西还不是很了解&#xff0c;就像是这次的省市区联动&#xff0c;都是用三张表为基础编码的&#xff0c;原谅我的无知&#xff0c;谢谢。 接下来就是编码部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

相关博文&#xff1a; Ubuntu 简单安装和配置 GitLabUbuntu 简单安装 DockerUbuntu Docker 简单安装 GitLabUbuntu Docker 安装和配置 GitLab CI 持续集成服务器版本 Ubuntu 16.04 LTS。 经过上面四篇博文中的相关安装和配置&#xff0c;我们主要完成了两个容器的创建和运行&am…

X264学习笔记(1)

X264学习笔记&#xff08;1&#xff09; X264编码流程 参数的初始化 1.opt&#xff0c;param根据输入的参数和标准的规定&#xff0c;进行初始化设置。 Opt的说明如下&#xff1a; Opt->hin用于给出读入的yuv文件的指针地址 Opt->hout给出了输出的文件的指针地址 Opt->…

python 数字转化excel行列_Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换...

Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母转数字(python实现 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #实现从1对应Aif num > 25:while Tr…

错误提示:'……' is not assignable to Android.app.Activity Manifest XML

1 问题描述&#xff1a; 针对这段代码&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

关于Lambda和匿名内部类

先上代码&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg参数分析

H264 encoder.cfg参数分析 收藏 (1) 文件操作参数:#Files InputFile "silent.yuv" #输入序列,YUV 4:2:0 StartFrame 0 # 从视频流的第几帧开始编码 FramesToBeEncoded 30 #编码图象帧数,指明了除去 B帧后将要被编码的帧数(应该再实验一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、关键步骤 1.删除旧的ckeditor静态文件 所在目录&#xff1a;项目目录下的static文件夹下的ckditor文件夹 rm ckeditor -rf 原因&#xff1a;在安装ckeditor后需要执行collectstatic命令&#xff0c;这个过程中的查找静态文件会去…