日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

x264 struct学习 1

發布時間:2023/12/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的x264 struct学习 1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。