struct x264_t 维护着CODEC的诸多重要信息

//x264_t结构体维护着CODEC的诸多重要信息
struct x264_t
{
    /* encoder parameters ( 编码器参数 )*/
    x264_param_t    param;

    x264_t *thread[X264_SLICE_MAX];

    /* bitstream output ( 字节流输出 ) */
    struct
    {
        int         i_nal;
        x264_nal_t  nal[X264_NAL_MAX];
        int         i_bitstream;    /* size of p_bitstream */
        uint8_t     *p_bitstream;   /* will hold data for all nal */
        bs_t        bs;
    } out;

    /* frame number/poc ( 帧序号 )*/
    int             i_frame;

    int             i_frame_offset; /* decoding only */
    int             i_frame_num;    /* decoding only */
    int             i_poc_msb;      /* decoding only */
    int             i_poc_lsb;      /* decoding only */
    int             i_poc;          /* decoding only */

    int             i_thread_num;   /* threads only */
    int             i_nal_type;     /* threads only */
    int             i_nal_ref_idc;  /* threads only */

    /* We use only one SPS(序列参数集) and one PPS(图像参数集) */
    x264_sps_t      sps_array[1];
    x264_sps_t      *sps;
    x264_pps_t      pps_array[1];
    x264_pps_t      *pps;
    int             i_idr_pic_id;

    int             (*dequant4_mf[4])[4][4]; /* [4][6][4][4] */
    int             (*dequant8_mf[2])[8][8]; /* [2][6][8][8] */
    int             (*quant4_mf[4])[4][4];   /* [4][6][4][4] */
    int             (*quant8_mf[2])[8][8];   /* [2][6][8][8] */
    int             (*unquant4_mf[4])[16];   /* [4][52][16] */
    int             (*unquant8_mf[2])[64];   /* [2][52][64] */

    uint32_t        nr_residual_sum[2][64];
    uint32_t        nr_offset[2][64];
    uint32_t        nr_count[2];

    /* Slice header (片头部) */
    x264_slice_header_t sh;

    /* cabac(适应性二元算术编码) context */
    x264_cabac_t    cabac;

    struct
    {
        /* Frames to be encoded (whose types have been decided(明确的) ) */
        x264_frame_t *current[X264_BFRAME_MAX+3];//current是已经准备就绪可以编码的帧,其类型已经确定
        /* Temporary(临时的) buffer (frames types not yet decided) */
        x264_frame_t *next[X264_BFRAME_MAX+3];//next是尚未确定类型的帧
        /* 未使用的帧Unused frames */
        x264_frame_t *unused[X264_BFRAME_MAX+3];//unused用于回收不使用的frame结构体以备今后再次使用
        /* For adaptive(适应的) B decision(决策) */
        x264_frame_t *last_nonb;

        /* frames used for reference +1 for decoding + sentinels (发射器,标记) */
        x264_frame_t *reference[16+2+1+2];

        int i_last_idr; /* Frame number of the last IDR (立即刷新图像) */

        int i_input;    //frames结构体中i_input指示当前输入的帧的(播放顺序)序号。/* Number of input frames already accepted */

        int i_max_dpb;  /* Number of frames allocated (分配) in the decoded picture buffer */
        int i_max_ref0;
        int i_max_ref1;
        int i_delay;    //i_delay设置为由B帧个数(线程个数)确定的帧缓冲延迟,在多线程情况下为i_delay = i_bframe + i_threads - 1。而判断B帧缓冲填充是否足够则通过条件判断:h->frames.i_input <= h->frames.i_delay + 1 - h->param.i_threads。 /* Number of frames buffered for B reordering (重新排序) */
        int b_have_lowres;  /* Whether 1/2 resolution (分辨率) luma(亮度) planes(平面) are being used */
    } frames;//指示和控制帧编码过程的结构

    /* current frame being encoded */
    x264_frame_t    *fenc;

    /* frame being reconstructed(重建的) */
    x264_frame_t    *fdec;

    /* references(参考) lists */
    int             i_ref0;
    x264_frame_t    *fref0[16+3];     /* ref list 0 */
    int             i_ref1;
    x264_frame_t    *fref1[16+3];     /* ref list 1 */
    int             b_ref_reorder[2];



    /* Current MB DCT coeffs(估计系数) */
    struct
    {
        DECLARE_ALIGNED( int, luma16x16_dc[16], 16 );
        DECLARE_ALIGNED( int, chroma_dc[2][4], 16 );
        // FIXME merge(合并) with union(结合,并集)
        DECLARE_ALIGNED( int, luma8x8[4][64], 16 );
        union
        {
            DECLARE_ALIGNED( int, residual_ac[15], 16 );
            DECLARE_ALIGNED( int, luma4x4[16], 16 );
        } block[16+8];
    } dct;

    /* MB table and cache(高速缓冲存储器) for current frame/mb */
    struct
    {
        int     i_mb_count;                 /* number of mbs in a frame */ /* 在一帧中的宏块中的序号 */

        /* Strides (跨,越) */
        int     i_mb_stride;
        int     i_b8_stride;
        int     i_b4_stride;

        /* Current index */
        int     i_mb_x;
        int     i_mb_y;
        int     i_mb_xy;
        int     i_b8_xy;
        int     i_b4_xy;
        
        /* Search parameters (搜索参数) */
        int     i_me_method;
        int     i_subpel_refine;
        int     b_chroma_me;
        int     b_trellis;
        int     b_noise_reduction;

        /* Allowed qpel(四分之一映像点) MV range to stay (继续,停留) within the picture + emulated(模拟) edge (边) pixels */
        int     mv_min[2];
        int     mv_max[2];
        /* Subpel MV range for motion search.
         * same mv_min/max but includes levels' i_mv_range. */
        int     mv_min_spel[2];
        int     mv_max_spel[2];
        /* Fullpel MV range for motion search */
        int     mv_min_fpel[2];
        int     mv_max_fpel[2];

        /* neighboring MBs */
        unsigned int i_neighbour;
        unsigned int i_neighbour8[4];       /* neighbours of each 8x8 or 4x4 block that are available */
        unsigned int i_neighbour4[16];      /* at the time the block is coded */
        int     i_mb_type_top;
        int     i_mb_type_left;
        int     i_mb_type_topleft;
        int     i_mb_type_topright;

        /* mb table */
        int8_t  *type;                      /* mb type */
        int8_t  *qp;                        /* mb qp */
        int16_t *cbp;                       /* mb cbp: 0x0?: luma, 0x?0: chroma, 0x100: luma dc, 0x0200 and 0x0400: chroma dc  (all set for PCM)*/
        int8_t  (*intra4x4_pred_mode)[7];   /* intra4x4 pred mode. for non I4x4 set to I_PRED_4x4_DC(2) */
        uint8_t (*non_zero_count)[16+4+4];  /* nzc. for I_PCM set 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) */
        int16_t (*mvr[2][16])[2];           /* 16x16 mv for each possible ref */
        int8_t  *skipbp;                    /* block pattern for SKIP or DIRECT (sub)mbs. B-frames + cabac only */
        int8_t  *mb_transform_size;         /* transform_size_8x8_flag of each mb */

        /* current value */
        int     i_type;
        int     i_partition;
        int     i_sub_partition[4];
        int     b_transform_8x8;

        int     i_cbp_luma;
        int     i_cbp_chroma;

        int     i_intra16x16_pred_mode;
        int     i_chroma_pred_mode;

        struct
        {
            /* space for p_fenc and p_fdec */
#define FENC_STRIDE 16
#define FDEC_STRIDE 32
            DECLARE_ALIGNED( uint8_t, fenc_buf[24*FENC_STRIDE], 16 );
            DECLARE_ALIGNED( uint8_t, fdec_buf[27*FDEC_STRIDE], 16 );

            /* pointer over mb of the frame to be compressed */
            uint8_t *p_fenc[3];

            /* pointer over mb of the frame to be reconstrucated  */
            uint8_t *p_fdec[3];

            /* pointer over mb of the references */
            uint8_t *p_fref[2][16][4+2]; /* last: lN, lH, lV, lHV, cU, cV */
            uint16_t *p_integral[2][16];

            /* fref stride */
            int     i_stride[3];
        } pic;

        /* cache */
        struct
        {
            /* real intra4x4_pred_mode if I_4X4 or I_8X8, I_PRED_4x4_DC if mb available, -1 if not */
            int     intra4x4_pred_mode[X264_SCAN8_SIZE];

            /* i_non_zero_count if availble else 0x80 */
            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];

            /* 1 if SKIP or DIRECT. set only for B-frames + CABAC */
            int8_t  skip[X264_SCAN8_SIZE];

            int16_t direct_mv[2][X264_SCAN8_SIZE][2];
            int8_t  direct_ref[2][X264_SCAN8_SIZE];

            /* number of neighbors (top and left) that used 8x8 dct */
            int     i_neighbour_transform_size;
            int     b_transform_8x8_allowed;
        } cache;

        /* */
        int     i_qp;       /* current qp */
        int     i_last_qp;  /* last qp */
        int     i_last_dqp; /* last delta qp */
        int     b_variable_qp; /* whether qp is allowed to vary per macroblock */
        int     b_lossless;
        int     b_direct_auto_read; /* take stats for --direct auto from the 2pass log */
        int     b_direct_auto_write; /* analyse direct modes, to use and/or save */

        /* B_direct and weighted prediction */
        int     dist_scale_factor[16][16];
        int     bipred_weight[16][16];
        /* maps fref1[0]'s ref indices into the current list0 */
        int     map_col_to_list0_buf[2]; // for negative indices
        int     map_col_to_list0[16];
    } mb;

    /* rate control encoding only */
    x264_ratecontrol_t *rc;//struct x264_ratecontrol_t,ratecontrol.c中定义

    /* stats */
    struct
    {
        /* Current frame stats */
        struct
        {
            /* Headers bits (MV+Ref+MB Block Type */
            int i_hdr_bits;
            /* Texture bits (Intra/Predicted) */
            int i_itex_bits;
            int i_ptex_bits;
            /* ? */
            int i_misc_bits;
            /* MB type counts */
            int i_mb_count[19];
            int i_mb_count_i;
            int i_mb_count_p;
            int i_mb_count_skip;
            int i_mb_count_8x8dct[2];//宏块数_8x8DCT
            int i_mb_count_size[7];
            int i_mb_count_ref[16];
            /* Estimated (SATD) cost as Intra/Predicted frame */
            /* XXX: both omit the cost of MBs coded as P_SKIP */
            int i_intra_cost;
            int i_inter_cost;
            /* Adaptive direct mv pred */
            int i_direct_score[2];
        } frame;

        /* Cummulated stats */

        /* per slice info */
        int     i_slice_count[5];
        int64_t i_slice_size[5];
        int     i_slice_qp[5];
        /* */
        int64_t i_sqe_global[5];
        float   f_psnr_average[5];
        float   f_psnr_mean_y[5];
        float   f_psnr_mean_u[5];
        float   f_psnr_mean_v[5];
        /* */
        int64_t i_mb_count[5][19];
        int64_t i_mb_count_8x8dct[2];
        int64_t i_mb_count_size[2][7];
        int64_t i_mb_count_ref[2][16];
        /* */
        int     i_direct_score[2];
        int     i_direct_frames[2];

    } stat;

    /* CPU functions dependants */
    x264_predict_t      predict_16x16[4+3];//predict:预测
    x264_predict_t      predict_8x8c[4+3];
    x264_predict8x8_t   predict_8x8[9+3];
    x264_predict_t      predict_4x4[9+3];

    x264_pixel_function_t pixf;
    x264_mc_functions_t   mc;
    x264_dct_function_t   dctf;
    x264_csp_function_t   csp;//x264_csp_function_t是一个结构体,在common/csp.h中定义
    x264_quant_function_t quantf;//在common/quant.h中定义
    x264_deblock_function_t loopf;//在common/frame.h中定义

    /* 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];

#if VISUALIZE
    struct visualize_t *visualize;
#endif
};

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

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

相关文章

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题&#xff0c;想了一个解决办法。 我们首先作假设&#xff0c;如果一条曲线有交点&#xff0c;那么它就是相交的对吧。可能大家想的都是这样&#xff0c;就开始找各种方法去识别交点。 我们换个角度想一下&#xff1a;是不是我们判断这条曲线是否带…

XML 与网络的数据传输

&#xfeff;&#xfeff;XML 与网络的数据传输

hdu 5813 Elegant Construction

水题 题意&#xff1a;有n个城市&#xff0c;给你每个城市能到达城市的数量&#xff0c;要你构图&#xff0c;输出有向边&#xff0c;要求无环&#xff0c;输出任意的解 例&#xff1a; Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

Redis实战笔记

Redis 数据库 一、 概要 1. 特点 用于抽象数据类型的 DSL内存存储基础数据结构 API编码风格避免代码复杂两层 API以优化为乐2. 数据类型 键值对&#xff08;字符串->字符串&#xff09;哈希列表&#xff08;链表&#xff09;集合&#xff1a;差并交有序集合 列表 集合位图…

内存申请与一级二级指针

1.如果是函数内进行内存申请&#xff0c;很简单&#xff0c;标准用法就可以了&#xff1a; test(){int *array;array(int *)malloc(sizeof(int)*10);//申请10*4 bytes&#xff0c;即10个单位的int内存单元}注意&#xff0c;malloc使用简单&#xff0c;但是注意参数和返回值&…

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片&#xff0c;会由于相机本身和透镜的影响产生形变&#xff0c;通常需要对相机进行标定&#xff0c;获取相机的内参或内外参&#xff0c;然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变&#xff0c;其中径向畸变是由透…

找寻一个邮箱

import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class zhengze {public static void main(String[] args) { //1.创建一个正则表达式对象Pattern pPattern.compile("[0-9]{6}"); //2.获得匹配器 String s…

先弄个XML解析器代码抄一抄 慢慢研究 O(∩_∩)O哈哈~

&#xfeff;&#xfeff;出处&#xff1a;http://bbs.csdn.net/topics/390229172 已经自我放逐好几年了.打算去上班得了.在最后的自由日子里,做点有意义的事吧... 先来下载地址 http://www.kuaipan.cn/file/id_12470514853353274.htm 已经在很多正式,非正式的场合…

紫书 例题8-10 UVa 714 (二分答案)

这道题让最大值最小&#xff0c; 显然是二分答案当题目求的是最大值最小&#xff0c; 最小值最大&#xff0c; 这个时候就要想到二分答案为什么可以二分答案呢&#xff0c; 因为这个时候解是单调性的&#xff0c; 如果简单粗暴一点就全部枚举一遍&#xff0c; 验证答案。但是因…

was not declared in this scope

“was not declared in this scope”是一个错误信息&#xff0c;在编译的时候会遇到。其含义为标识符在其出现的地方是未被定义的。 出现该错误的时候&#xff0c;会同时把未定义的变量名显示出来。比如如下程序&#xff1a; int main(){ printf("%d",i);//这个i是…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题&#xff08;一级指针和二级指针&#xff09; [转]原以为自己对指针掌握了&#xff0c;却还是对这个问题不太明白。请教&#xff01; 程序1&#xff1a; void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;Ubuntu 是基于DebianGNU/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架构&#xf…

SynchronizationContext

SendOrPostCallback xxx vg > { Text "内部&#xff1a; "vg.ToString(); };dynamic vx new { a SynchronizationContext.Current, b xxx };Thread td new Thread(x >{dynamic tmp x;// SynchronizationContext ds x as SynchronizationContext;for (in…

CoDeSys的前世今生

&#xfeff;&#xfeff;工作以及网上看到不少人说&#xff0c;CoDeSys和西门子step7&#xff0c;在德国都属于标准过程&#xff0c;牛逼的小朋友都可以用其编程&#xff0c;不知真假&#xff0c;相信无风不起浪&#xff0c;多少有些依据&#xff0c;看看国內清一色的日系编程…

UVALive 7324 ASCII Addition (模拟)

ASCII Addition题目链接&#xff1a; http://acm.hust.edu.cn/vjudge/contest/127407#problem/A Description Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. You…

Eclipse中执行Ant脚本出现Could not find the main class的问题及解

试过了&#xff1a;https://blog.csdn.net/bookroader/article/details/2300337 但是不管用&#xff0c;偶然看到这篇没有直接关系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 联想了一下。项目是JDK1.5&#xff0c;Eclipse是JDK1.8启动&#xff0c;所以在R…

获得变量的名称获得传入参数的参数类型与堆栈中的函数名获得变量的名称

获得变量的名称 获得变量的名称函数 public static string GetVarName(Expression<Func<变量类型, 变量类型>> exp) public static string GetVarName_Int(Expression<Func<int, int>> exp){return ((MemberExpression)exp.Body).Member.Name;}使用时…

视频通话研究002

还是关于视频质量。经測试&#xff0c;在公网server使用SQCIF(128x98)进行视频通话。2个client都是这个设置&#xff0c;感觉不出马赛克&#xff0c;模糊严重&#xff0c;在一个手机client抓包&#xff0c;例如以下&#xff1a; 第1,2行是client发到server的数据&#xff1b;第…

实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系

有两个团队已经在量子隐形传输研究领域创造了新的传输记录&#xff1a;利用深不可测的量子力学知识将一个粒子的量子态迅速从一个位置迁移到另一个位置的粒子上。其中一个团队采用这种方法&#xff0c;运用一种光学纤维将一个光子的量子态穿越加拿大西南部的一个城市&#xff0…

Android初级教程:使用xml序列器

之前备份短信的时候生成xml都是手动拼写的&#xff0c;有一个问题&#xff1a;当短信里面存在</body>这样的标签的时候&#xff0c;最后结果就不是完整的xml文件&#xff0c;显然出错。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解决上边遇到的问题。…