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.pswp.cn/news/455230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455230.shtml
英文地址,請注明出處:http://en.pswp.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;這個過程中的查找靜態文件會去…