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.pswp.cn/news/254712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254712.shtml
英文地址,請注明出處:http://en.pswp.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;就能有效的解決上邊遇到的問題。…