[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第1頁
[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第2頁
[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第3頁
[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第4頁
[計(jì)算機(jī)硬件及網(wǎng)絡(luò)]x264學(xué)習(xí)筆記_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.x264編碼詳細(xì)文字全過程 (1)       x264_param_default( x264_param_t *param )  /重點(diǎn)參考x264_param_t結(jié)構(gòu)定義。作用: 對編碼器進(jìn)行參數(shù)設(shè)定 cqm:量化表相關(guān)信息                 csp:        

2、                    量化表相關(guān)信息里的memset( param->cqm_4iy, 16, 16 );                        &

3、#160;           memset( param->cqm_4ic, 16, 16 );                                 

4、   memset( param->cqm_4py, 16, 16 );                                    memset( param->cqm_4pc, 16, 16 );

5、0;                                   memset( param->cqm_8iy, 16, 64 );         

6、60;                          memset( param->cqm_8py, 16, 64 );(2)static int  Parse( int argc, char *argv, x264_param_t *param, cli_opt_t *opt ) 初始化1   getopt

7、_long(nargc, nargv, options, long_options, idx) 得到入口地址的向量與方式的選則2   getopt_internal(nargc, nargv, options)     解析入口地址向量(3) static int  Encode( x264_param_t *param, cli_opt_t *opt )/* Create a copy of param */ h->param=param/* VUI */vui信息主要包括幀率、圖像尺寸等信息/* Init x264

8、_t */x264_sps_init( h->sps, 0, &h->param );序列圖像集x264_pps_init( h->pps, 0, &h->param, h->sps);圖像參數(shù)集/* Init frames. */     初始化并開辟幀空間/* init mb cache */   對前一宏塊的信息保存,因?yàn)槭浅跏蓟?,所以作為第一個(gè)宏塊的參考,后面會有x264_macroblock_cache_load( h, i_mb_x, i_mb_y );它是將要編碼的宏塊的周圍

9、的宏塊的值讀進(jìn)來, 要想得到當(dāng)前塊的預(yù)測值,要先知道上面,左面的預(yù)測值/* init cabac adaptive model */* init CPU functions */  初始化cpu對各種分塊的參數(shù)設(shè)定/* rate control */        1 x264_t *x264_encoder_open   ( x264_param_t *param ) 這個(gè)函數(shù)是對不正確的參數(shù)進(jìn)行修改,并對各結(jié)構(gòu)體參數(shù)和cabac編碼,預(yù)測等需要的參數(shù)進(jìn)行初始化  

10、0;     2、p_read_frame( &pic, opt->hin, i_frame + opt->i_seek, param->i_width, param->i_height )  讀取一幀,并把這幀設(shè)為prev 3. i_file += Encode_frame( h, opt->hout, &pic );進(jìn)入核心碼層 核心編碼層的總流程圖:(x264.c) 1       &

11、#160; x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )對幀進(jìn)行編碼 2         i_size = x264_nal_encode( data, &i_data, 1, &nali ) 網(wǎng)絡(luò)打包編碼 3         i_file += p_write_nalu( hout, data, i_size )

12、把網(wǎng)絡(luò)包寫入到輸出文件中去 4         返回,對下一幀進(jìn)行編碼  下面一頁是詳細(xì)的流程圖:一幀內(nèi)詳細(xì)流程圖: (1)           x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out )對幀進(jìn)行編碼 1    /* 1: Copy the picture to

13、 a frame and move it to a buffer */     x264_frame_t*fenc=x264_frame_get( h->frames.unused ); x264_frame_copy_picture( h, fenc, pic_in ); fenc->i_frame = h->frames.i_input+; x264_frame_put( h->frames.next, fenc ); x264_frame_init_lowres( h->para

14、m.cpu, fenc );/里面包含低象素的擴(kuò)展,很多for循環(huán),應(yīng)該是抽頭計(jì)算和半精度象素的擴(kuò)展,要認(rèn)真看 (2)            264_slicetype_decide( h );對slice類型的判定,里面也要看一下 (3)            while( IS_X264_TYPE_B( h->frames.nextbframes-

15、>i_type ) )bframes+;x264_frame_put(h->frames.current,x264_frame_get( &h->frames.nextbframes ) );這主要是因?yàn)锽幀必須等后面的非B幀編碼結(jié)束后才能編碼,所以把暫時(shí)不編的一系列B幀存入隊(duì)列中,一直到非B幀才取出進(jìn)行編碼,之后再進(jìn)行前面的B幀編碼do_encode:(4)            建立list0 & list1.我感覺  

16、0;    x264_reference_build_list( h, h->fdec->i_poc, i_slice_type );      比特率控制初始化x264_ratecontrol_start(h, i_slice_type, h->fenc->i_qpplus1 );(5)   創(chuàng)建slice的頭部數(shù)據(jù)x264_slice_init( h, i_nal_type, i_slice_type, i_global_qp );(6)  

17、60;  i_frame_size = x264_slices_write( h );這是編碼的關(guān)鍵了1.      x264_slice_header_write(&h->out.bs,&h->sh,h->i_nal_ref_idc ); /* Slice header */2.      一些初始化工作3.      for(mb_xy=h->sh.i_first_mb, i_skip = 0

18、; mb_xy < h->sh.i_last_mb; mb_xy+ )對一個(gè)slice中每個(gè)宏塊進(jìn)行循環(huán)遍歷編碼,其中const int i_mb_y = mb_xy / h->sps->i_mb_width;和const int i_mb_x = mb_xy % h->sps->i_mb_width;是對宏塊位置在slice中的x,y坐標(biāo)的定位,這個(gè)for語句幾乎覆蓋了整個(gè)x264_slices_write()函數(shù)4.      x264_macroblock_cache_load( h, i_mb_x,

19、i_mb_y ); 它是將要編碼的宏塊的周圍的宏塊的值讀進(jìn)來, 要想得到當(dāng)前塊的預(yù)測值,要先知道上面,左面的預(yù)測值!5.      *x264_macroblock_analyse( h );重點(diǎn)。通過一系列的SAD算出最優(yōu)化方案,例如把I幀16×16的宏塊分成16個(gè)4×4分別計(jì)算SAD和與原16×16SAD比較我感覺,在下面一層再詳細(xì)分析。a.   x264_mb_analyse_intra( h, &analysis, COST_MAX );我感覺是在一個(gè)16×16的SAD

20、,4個(gè)8×8的SAD和,16個(gè)4×4SAD和中選出最優(yōu)方式進(jìn)行,可能我的理解不對,里面的x264_mb_encode_i4x4( h, idx, a->i_qp );i8×8幾個(gè)函數(shù)的跟蹤有問題,跟得我都找不到,要仔細(xì)看(現(xiàn)在又能跟到了) 這邊好像如果是直流分量在這里就進(jìn)行量化ZIGZAG掃描了,不用等到x264_macroblock_encode( h )再完成了 b.   x264_analyse_update_cache( h, &analysis ); 有對色度塊的模式選擇的計(jì)算,好像也有更新信息以為下

21、次的預(yù)測作為參考 6.      x264_macroblock_encode( h ); a.   判斷宏塊的類型 b.   根據(jù)判斷的類型進(jìn)行DCT,量化,ZIGZAG,并記錄當(dāng)前的模式為下次編碼宏塊(亞宏塊)做參考 ZIGZAG的實(shí)現(xiàn)不明白(原來ZIGZAG有宏定義,在上面,現(xiàn)在明白了),反量化和IDCT的過程跟不進(jìn)去,應(yīng)該是匯編了!函數(shù)如下:( I 4×4 中 x264_mb_encode_i4x4( h, i, i_qp );) x26

22、4_mb_dequant_4x4( dct4x4, h->dequant4_mfCQM_4IY, i_qscale ); h->dctf.add4x4_idct( p_dst, i_stride, dct4x4 ); 還有,這個(gè)函數(shù)跟蹤不進(jìn)去,應(yīng)該是重構(gòu)圖像的反變換吧 h->dctf.add4x4_idct( p_dst, i_stride, dct4x4 ); h->ra4x4_pred_modex264_scan8i=x264_mb_pred_mode4x4_fix(i_mode);這個(gè)值到底是怎么根據(jù)

23、前面的模式改變的,可能是上面兩個(gè)函數(shù)沒能更進(jìn)去所以模糊 c.    對色度塊進(jìn)行編碼,QP限制在051之間,選定預(yù)測模式(DC的話值全為128) x264_mb_encode_8x8_chroma( h, !IS_INTRA( h->mb.i_type ), i_qp );里面對兩個(gè)色度信號分別編碼,與亮度信號類似 d.   求亮度和色度的cbp,完全不明白是怎么求的,需要解決!現(xiàn)在有點(diǎn)明白,每個(gè)比特代表子塊是不是全為0,但還沒有全部明白,色度塊cbp中0x02表示有AC,DC 0x01表示只有DC,

24、0;e利用CBP判斷要不要SKIP.,里面還關(guān)系到向量預(yù)測,明天好好看一下。  其中 h->mb.qph->mb.i_mb_xy = h->mb.i_last_qp;這個(gè)為讀下一個(gè)     qp的保存,不然解碼端是讀不出下一個(gè)  qp的, 關(guān)于CBP的理解還存在問題,他的8位比特各個(gè)代表的意思還不是十分明確,反正是對DC,AC的編碼的選擇。185頁有介紹(新一代視頻壓縮標(biāo)準(zhǔn)畢厚杰) 7.      選用CABAC還是CAVLC 

25、CABAC的原理實(shí)現(xiàn)沒仔細(xì)看 8.     x264_macroblock_cache_save( h );保存以為下次的預(yù)測作為參考 9.     一些收尾工作,為下次宏塊作準(zhǔn)備(看的比較粗)  x264基于經(jīng)驗(yàn)和感覺的碼率控制策略 收藏 前提:  1 high-complexity or high-motion scenes,細(xì)節(jié)將不會很明顯,此時(shí)高qp也是浪費(fèi) 2 where motion compensation works well,在景物邊沿的失真,只需

26、在一幀中去掉,以后就都不會有.在這里投入有限的bits可以獲得最好的圖像質(zhì)量性價(jià)比 3 已經(jīng)編碼一frame,可以預(yù)測其他qp下所需bit數(shù).預(yù)測距離越遠(yuǎn)越不精確 4隨著frame重要性降低,他們只配用更大的qp,i ,p ,參考b ,disposable b.依次降低 5H.264支持1frame內(nèi)不同mb使用不同qp,x264不支持,而由rc返回統(tǒng)一qp。但有那個(gè)功能函數(shù)存在那個(gè)函數(shù)僅精確到每一行mb變一次qp 所以rc策略如下: 2pass: step1 1pass編碼,由qp推斷某qp下framesize *0.6符合目標(biāo)fr

27、ame size的限制,得到這個(gè)qp step2 修改qp 以滿足requested total size(total是指整個(gè)Gop的大小,分段先編一邊再一邊) step3 encode根據(jù)實(shí)際大小值修正預(yù)測的qp,并額外增加short-term compensation,針對開始和結(jié)束部分沒有很多bits余地的位置. 1pass:  abr (average bit rate ) step1 用半尺寸快速運(yùn)動估計(jì)和SATD residuals 替換1st pass中相關(guān)部分,獲得預(yù)測 step2 用之前的樣本估計(jì)scale 

28、;step3 Overflow compensation 和2pass相似 限制filesize 犧牲圖像質(zhì)量 1pass,:constant bitrate (VBV compliant)! VBV是指:   Video Buffer Verifier  The Video Buffer Verifier (VBV) is a model hypothetical decoder buffer that will not overflow or underflow when fed a conforming MPEG bit stream.&

29、#160;  包含2個(gè)因素.size和造成的delay step1  same as abr step2 Scaling factor is based on a local average (dependent on VBV buffer size) instead of all past frames step3 stricter Overflow compensation  ,  additional term to hard limit the QPs if the VBV is near empty. no har

30、d limit is done for a full VBV這里更加嚴(yán)格的空限制,防止沒有bits可以送出,破壞了cbr的傳輸 1pass, constant ratefactor:      Constant Rate Factor (or Constant Quality)(1) Same as ABR.(2) The scaling factor is a constant based on the -crf argument.(3) No overflow compensation is done.  ra

31、tefactor是指: constant quantizer:QPs are simply based on frame type.  RC中的蛋雞悖論:為了計(jì)算當(dāng)前幀中宏塊的RDO,需利用已定qp確定當(dāng)前幀或宏塊的cost預(yù)測每個(gè)宏塊的mode mv ref等. ratecontrol是在確定mode mv ref后決定qp,在此之前qp不能獲得。 于是rdo與rc不知道先做哪個(gè)了.  x264命令行參數(shù)解釋 收藏 本文對應(yīng)的是x264命令行模式,VFW方式也用相同的參數(shù),不過是圖形界面,可以自己找對應(yīng)的英文。  

32、;  使用格式:x264 默認(rèn)選項(xiàng) -o 輸出文件 輸入文件 長x寬輸入支持格式:RAW/y4m/avi/avs(編譯時(shí)可選)輸出支持格式:264/mkv/mp4(編譯時(shí)可選)     x264的許多參數(shù)可以有-/-兩種輸入法,筆者也不知道為什么。以下等價(jià)參數(shù)用“參數(shù)1/參數(shù)2 <必需數(shù)值格式>”表示,參數(shù)尾部()內(nèi)為個(gè)人推薦。 -h/-help 幫助 幀類型選項(xiàng): -I/-keyint <整數(shù)> 最大IDR幀間距,默認(rèn)250-i/-min-keyint <整數(shù)> 最小IDR幀間

33、距,默認(rèn)25-scenecut <整數(shù)> 畫面動態(tài)變化限,當(dāng)超出此值時(shí)插入I幀,默認(rèn)40-b/-bframes <整數(shù)>     在IP幀之間可插入的B幀數(shù)量最大值,范圍016,默認(rèn)0-no-b-adapt            關(guān)閉自適應(yīng)B幀判定(-b設(shè)為1時(shí)可用,其他不推薦)-b-bias <整數(shù)> 控制插入B幀判定,范圍-100+100,越高越容易插入B幀,默認(rèn)0-b-pyramid  

34、;           允許B幀做參考幀-no-cabac              關(guān)閉內(nèi)容自適應(yīng)二進(jìn)制算術(shù)編碼(CABAC,高效率的熵編碼)(會提高速度,但嚴(yán)重影響質(zhì)量)-r/-ref <整數(shù)>         最大參考幀數(shù),范圍016,默認(rèn)1-nf  

35、                  關(guān)閉環(huán)路濾波(一種除馬賽克算法)-f/-filter <alpha:beta>設(shè)置環(huán)路濾波的AlphaC和Beta的參數(shù),范圍-6-6,默認(rèn)都為0  碼率控制選項(xiàng): -q/-qp <整數(shù)> 固定量化模式并設(shè)置使用的量化值,范圍051,0為無損壓縮,默認(rèn)26 -B/-bitrate <整數(shù)> 設(shè)置平均碼率-crf &l

36、t;整數(shù)> 質(zhì)量模式,量化值動態(tài)可變(目前不太成熟,質(zhì)量不如設(shè)置固定量化值)-qpmin <整數(shù)> 設(shè)置最小量化值,范圍051,默認(rèn)10-qpmax <整數(shù)> 設(shè)置最大量化值,范圍051,默認(rèn)51-qpstep <整數(shù)> 設(shè)置相鄰幀之間的量化值差,范圍050,默認(rèn)4-ratetol <小數(shù)> 平均碼率模式下,瞬時(shí)碼率可以偏離的倍數(shù),范圍0.1100.0,默認(rèn)1.0-vbv-maxrate <整數(shù)> 平均碼率模式下,最大瞬時(shí)碼率,默認(rèn)0(與-B設(shè)置相同)-vbv-bufsize <整數(shù)> 碼率控制緩沖區(qū)的大小,單位kb

37、it,默認(rèn)0-vbv-init <小數(shù)> 碼率控制緩沖區(qū)數(shù)據(jù)保留的最大數(shù)據(jù)量與緩沖區(qū)大小之比,范圍01.0,默認(rèn)0.9 -ipratio <小數(shù)> I幀和P幀之間的量化系數(shù),默認(rèn)1.40-pbratio <小數(shù)> P幀和B幀之間的量化系數(shù),默認(rèn)1.30-色度-qp-offset <整數(shù)> 色度和亮度之間的量化差,范圍-12+12,默認(rèn)0 -p/-pass <1|2|3> 多次壓縮碼率控制1:第一次壓縮,創(chuàng)建統(tǒng)計(jì)文件2:按建立的統(tǒng)計(jì)文件壓縮并輸出,不覆蓋統(tǒng)計(jì)文件,3:按建立的統(tǒng)計(jì)文件壓縮,優(yōu)化統(tǒng)計(jì)文件-stats &

38、lt;字符串> 統(tǒng)計(jì)文件的名稱,默認(rèn)"x264_2pass.log"-rceq <字符串> 速率控制公式,默認(rèn)"blurCplx(1-qComp)"-qcomp <小數(shù)> 線性量化控制,0.0為固定碼率,1.0為固定量化值,默認(rèn)0.6,只用于2-pass和質(zhì)量模式-cplxblur <小數(shù)> 根據(jù)相鄰幀平滑量化值比例的最大值,范圍099.9,默認(rèn)20.0,只用于2-pass和質(zhì)量模式-qblur <小數(shù)> 對統(tǒng)計(jì)文件結(jié)果平滑量化值比例的最大值,范圍099.9,默認(rèn)0.5,只用于2-pass 

39、-zones <z0>/<z1>/ 分段量化,格式為:<開始幀>,<結(jié)束幀>,<選項(xiàng)>,可選項(xiàng)為:q=<整數(shù)>(量化值)或b=<小數(shù)>(碼率倍數(shù)) 分析選項(xiàng): -A/-analyse <字符串> 動態(tài)塊劃分方法,默認(rèn)"p8x8,b8x8,i8x8,i4x4"。可選項(xiàng):p8x8/p4x4/b8x8/i8x8/i4x4;none/all(p4x4需要p8x8. i8x8需要-8x8dct)-direct <字符串>   &

40、#160;   動態(tài)預(yù)測方式,默認(rèn)"spatial"??蛇x項(xiàng):none/spatial/temporal/auto-w/-weightb 允許B幀加權(quán)預(yù)測(可以減少相鄰B幀質(zhì)量低的影響)-me <字符串> 對全像素塊動態(tài)預(yù)測搜索的方式,默認(rèn)"hex",可選項(xiàng):dia:菱形搜索,半徑1 (快)hex:正六邊形搜索,半徑2umh:可變半徑六邊形搜索esa:全面搜索(很慢,而且效果與umh幾乎相同)-merange <整數(shù)> -me為umh/esa時(shí)的搜索半徑,最大64,默認(rèn)16-m/-subme <整數(shù)>

41、; 動態(tài)預(yù)測和分區(qū)方式,可選項(xiàng)17,默認(rèn)5(與壓縮質(zhì)量和時(shí)間關(guān)系密切,1是7速度的四倍以上)1:用全像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索2:用半像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索3:用半像素塊進(jìn)行動態(tài)搜索,對每個(gè)塊再用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索4:用快速模式進(jìn)行四分之一像素塊精確搜索5:用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索6:進(jìn)行I、P幀像素塊的速率失真最優(yōu)化(rdo)7:進(jìn)行I、P幀運(yùn)動矢量及塊內(nèi)部的速率失真最優(yōu)化(質(zhì)量最好)-b-rdo B幀也進(jìn)行rdo,需要-subme在6以上-mixed-refs 可以在一幀內(nèi)使用不

42、同參考幀-no-chroma-me 不進(jìn)行色度的動態(tài)預(yù)測-bime 可以平均B幀參考塊的運(yùn)動矢量-8/-8x8dct 可以使用8x8的離散余弦變換(DCT)-t/-trellis <整數(shù)>     Trellis量化,對每個(gè)8x8的塊尋找合適的量化值,需要CABAC,默認(rèn)00:關(guān)閉1:只在最后編碼時(shí)使用2:一直使用-no-fast-pskip 關(guān)閉快速P幀跳過檢測-no-dct-decimate       關(guān)閉P幀聯(lián)合編碼(可以增加細(xì)節(jié),但也會增大體積)-nr <整數(shù)>

43、 噪聲去除,范圍0100000,默認(rèn)0 -cqm <字符串> 設(shè)置外部量化矩陣格式,默認(rèn)"flat",可選項(xiàng):jvt/flat-cqmfile <字符串> 讀取JM格式的外部量化矩陣文件,自動忽略其他-cqm*選項(xiàng)-cqm4 <list> 設(shè)置4x4的量化矩陣,用逗號分開,范圍1255的16個(gè)整數(shù)-cqm8 <list> 設(shè)置8x8的量化矩陣,用逗號分開,范圍1255的64個(gè)整數(shù)-cqm4i/-cqm4p/-cqm8i/-cqm8p 設(shè)置I、P幀不同的量化矩陣-cqm4iy/-cqm4ic/-cqm4py/-cqm4

44、pc 設(shè)置亮度、色度不同的量化矩陣 視頻標(biāo)準(zhǔn)化選項(xiàng):這些選項(xiàng)與編碼無關(guān),不過如果要用mp4之類的播放器,可以設(shè)置,風(fēng)險(xiǎn)自擔(dān) -sar width:height 設(shè)置長寬比-overscan <字符串> 過掃描線,默認(rèn)"undef"(不設(shè)置),可選項(xiàng):show(觀看)/crop(去除)-videoformat <字符串> 視頻格式,默認(rèn)"undef",可選項(xiàng):component/pal/ntsc/secam/mac/undef-fullrange <字符串>    Spe

45、cify full range samples setting,默認(rèn)"off",可選項(xiàng):off/on(我也不明白這是干什么的,請高手指點(diǎn))-colorprim <字符串>    原始色度格式,默認(rèn)"undef",可選項(xiàng):undef/bt709/bt470m/bt470bg,smpte170m/smpte240m/film-transfer <字符串>     轉(zhuǎn)換方式,默認(rèn)"undef",可選項(xiàng):undef/bt709/bt470m/bt47

46、0bg/linear,log100/log316/smpte170m/smpte240m-colormatrix <字符串>  色度矩陣設(shè)置,默認(rèn)"undef",undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo-chromaloc <整數(shù)> 色度樣本指定,范圍05,默認(rèn)0 輸入、輸出選項(xiàng): -level <字符串> 設(shè)定等級(as defined by Annex A)(不明白,請高手指點(diǎn))-fps <小數(shù)> 設(shè)定幀率-seek <整

47、數(shù)> 設(shè)定起始幀-frames <整數(shù)> 最大編碼幀數(shù)-o/-output 指定輸出文件 -threads <整數(shù)> 編碼線程(使用分片技術(shù))-thread-input 在編碼線程中運(yùn)行Avisynth-no-asm 關(guān)閉全部CPU優(yōu)化指令-no-psnr 關(guān)閉PSNR計(jì)算-quiet 安靜模式-v/-verbose 顯示每一個(gè)幀的信息-progress 顯示編碼進(jìn)程-visualize 顯示運(yùn)動矢量-sps-id <整數(shù)> 設(shè)置SPS和PPS的ID值,默認(rèn)0-aud 使用數(shù)據(jù)單元定義符號x264中重要結(jié)構(gòu)體說明 收藏 首先解釋一下cli_o

48、pt_t的這個(gè)_t代表結(jié)構(gòu)圖可能是type的意思。同時(shí)還有很多i_ b_等作為前綴的變量,其中的I_表示int類型的變量 b表示bool類型的。依次類推。 正式進(jìn)入主題。 typedef struct     int b_progress;    int i_seek;    hnd_t hin;    hnd_t hout;    FILE *qpfile; cli_opt_t;此結(jié)構(gòu)體是記錄一些與編碼關(guān)系較小的設(shè)置信息的o

49、pt=option。結(jié)構(gòu)體內(nèi)部的變量都可以通過讀取main()的參數(shù)獲得。也就是argv。b_progress表示一個(gè)bool類型的變量,看參數(shù)幫助 也就是x264-help你會知道,他是用來控制是否顯示編碼進(jìn)度的一個(gè)東西。取值為0,1.I_seek 整數(shù)類型 表示開始從哪一幀編碼。因?yàn)椴灰欢◤倪@個(gè)文件的第一幀開始編碼,這是可以控制的。Hnd_t(hnd=handle)是一個(gè)空指針, void *在C語言里空指針是有幾個(gè)特性的,他是一個(gè)一般化指針,可以指向任何一種類型,但卻不能解引用,需要解引用的時(shí)候,需要進(jìn)行強(qiáng)制轉(zhuǎn)換。采用空指針的策略,應(yīng)該是為了聲明變量的簡便和統(tǒng)一。Hin 指向輸入yuv文

50、件的指針。Hout 指向編碼過后生成的文件的指針。Qpfile 是一個(gè)指向文件類型的指針,他是文本文件,其每一行的格式是framenum frametype QP用于強(qiáng)制指定某些幀或者全部幀的幀類型和QP(quant param量化參數(shù))的值。x264_param_default( &param ); 這部分設(shè)置編碼參數(shù)的缺省值附結(jié)構(gòu)體param中部分變量的意義:    param->i_csp          = X264_CSP_I420; /

51、設(shè)置輸入的視頻采樣的格式param->vui.i_sar_width = 0;  /VUI:video usability information    param->i_fps_num       = 10; /幀率    param->i_fps_den       = 1;  /用兩個(gè)整型的數(shù)的比值,來表示幀率    /* Encoder pa

52、rameters */    param->i_frame_reference = 1; /參考幀的最大幀數(shù)。    param->i_bframe = 0;          /兩個(gè)參考幀之間的B幀數(shù)目。    param->b_deblocking_filter = 1; /去塊效應(yīng)相關(guān)    param->b_cabac = 0;  &#

53、160;         /cabac的開關(guān)    param->i_cabac_init_idc = -1;    param->rc.b_cbr = 1;           /constant bitrate 恒定碼率控制模式    param->rc.i_bitrate = 0;  

54、     /默認(rèn)的碼率    param->rc.i_rc_buffer_size = 0;   /buffer的大小    param->rc.i_rc_init_buffer = 0;   /param->rc.i_rc_sens = 100;       /* rate control sensitivityparam->rc.i_rc_method = X264_R

55、C_NONE;  /碼率控制,CQP(恒定質(zhì)量)、/CRF(恒定碼率)、ABR(平均碼率)param->rc.i_qp_constant = 26; /qp的初始值,最大最小的qp值,    param->rc.i_qp_min = 10;           /最小的qp值    param->rc.i_qp_max = 51;      

56、0;   /最大的qp值param->rc.i_qp_step = 4;       /qp步長step。    param->rc.f_ip_factor = 1.4;  /ip-i幀p幀的qp的差值    param->rc.f_pb_factor = 1.3;  /pb-p幀b幀的qp的差值/* Log */ /整個(gè)param的一個(gè)log文件    /*analyse */ 

57、;param->ra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8;  /楨內(nèi)分析 param->er = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8                         

58、0; |X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; /楨間分析 param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; /預(yù)測模式param->analyse.i_me_method = X264_ME_HEX;      /運(yùn)動估計(jì)模式param->analyse.i_me_range = 16;        

59、0;     /運(yùn)動估計(jì)范圍    param->analyse.i_subpel_refine = 5;    param->analyse.b_chroma_me = 1;     param->analyse.i_mv_range_thread = -1;     param->analyse.i_mv_range = -1; / set from level_idc 

60、0;   param->analyse.i_direct_8x8_inference = -1; / set from level_idc     param->analyse.i_chroma_qp_offset = 0;     param->analyse.b_fast_pskip = 1;     param->analyse.b_dct_decimate = 1;     param

61、->analyse.i_luma_deadzone0 = 21;     param->analyse.i_luma_deadzone1 = 11;     param->analyse.b_psnr = 1;     param->analyse.b_ssim = 1;       param->i_cqm_preset = X264_CQM_FLAT;  /自定義量化矩陣(

62、CQM),初始化量化模式為flat    typedef struct      /* In: force picture type (if not auto)      *     If x264 encoding parameters are violated in the forcing of picture types,      *  &

63、#160;  x264 will correct the input picture type and log a warning.      *     The quality of frametype decisions may suffer if a great deal of fine-grained      *     mixing of auto and forced frametypes i

64、s done.      * Out: type of the picture encoded */     int     i_type;     /* In: force quantizer for > 0 */     int     i_qpplus1;     /* In: user pts,

65、 Out: pts of encoded picture (user)*/     int64_t i_pts;       /* In: raw data */     x264_image_t img;  x264_picture_t; 具體的含義理解參考了read_frame_yuv()x264_picture_alloc(); I_type 指明被編碼圖像的類型,有X264_TYPE_AUTO X264_TYPE_ID

66、R         X264_TYPE_I X264_TYPE_P X264_TYPE_BREF X264_TYPE_B可供選擇,初始化為AUTO,說明由x264在編碼過程中自行控制。 I_qpplus1 :此參數(shù)減1代表當(dāng)前畫面的量化參數(shù)值。 I_pts :program time stamp 程序時(shí)間戳,指示這幅畫面編碼的時(shí)間戳。 Img :存放真正一副圖像的原始數(shù)據(jù)。   typedef struct    &

67、#160; int     i_csp;     int     i_plane;     int     i_stride4;     uint8_t *plane4;  x264_image_t;   Csp: color space parameter 色彩空間參數(shù) X264只支持I420 i_Plan

68、e 代表色彩空間的個(gè)數(shù)。一般為3,YUV,初始化為 x264常用options整理 收藏    x264源碼解析2009年11月12日 星期四 22:44   x264源碼解析(01)    由main函數(shù)進(jìn)入?yún)?shù)設(shè)置后開始Encode函數(shù)。這里只把Encode函數(shù)體解析下,借鑒了很多網(wǎng)上資源(即使不全是自己原話也是親手打字上去的哦_),感謝網(wǎng)友。    代碼似懂非懂的注釋了下,盡當(dāng)資源存儲吧吧,暫且發(fā)到博客大家討論批評。static int Encode( x26

69、4_param_t *param, cli_opt_t *opt )    x264_t *h; /還不知道干啥的,這個(gè)結(jié)構(gòu)也很煩,不壓x264_param_t    x264_picture_t pic; /一幀的結(jié)構(gòu)體,色度存儲    int     i_frame, i_frame_total;    int64_t i_start, i_end; /用來計(jì)算時(shí)間    int64_t i_file;

70、    int     i_frame_size;    int     i_update_interval;    char    buf200;    opt->b_progress &= param->i_log_level < X264_LOG_DEBUG;    i_frame_total = p_ge

71、t_frame_total( opt->hin );    i_frame_total -= opt->i_seek;    if( ( i_frame_total = 0 | param->i_frame_total < i_frame_total )        && param->i_frame_total > 0 )        i_

72、frame_total = param->i_frame_total;    param->i_frame_total = i_frame_total;       /上面這段代碼是實(shí)現(xiàn),計(jì)算文件中的總共的幀數(shù),并根據(jù)輸入的參數(shù)初始幀的位置,       /對i_frame_total做出修正,i_frame_total -= opt->i_seek,然后再根據(jù)param->i_frame_total, 

73、0;     /對i_frame_total做出進(jìn)一步的修正。       /總體來說,就是對參數(shù)設(shè)置中的進(jìn)行編碼的幀數(shù)的總數(shù)進(jìn)行修正和計(jì)算。    i_update_interval = i_frame_total ? x264_clip3( i_frame_total / 1000, 1, 10 ) : 10;    if( ( h = x264_encoder_open( param ) ) = NULL )/關(guān)鍵函數(shù):x264_

74、encoder_open( param ) 根據(jù)參數(shù)要求對encoder進(jìn)行一系列的初始化,例如分配內(nèi)存,值的初始化等。            (略)        if( p_set_outfile_param( opt->hout, param ) )/關(guān)鍵函數(shù):p_set_outfile_param() 設(shè)置輸出文件格式         

75、0;  (略)        /* Create a new pic */       /關(guān)鍵函數(shù):x264_picture_alloc() 按照色度空間分配內(nèi)存,并返回內(nèi)存的首地址作為指針    if( x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height ) < 0 )     

76、;       (略)           /關(guān)鍵函數(shù):x264_mdate()     用于編碼用時(shí)的計(jì)算,設(shè)定起始時(shí)間    i_start = x264_mdate();    /* Encode frames */    for( i_frame = 0, i_file = 0; b_ctrl_c = 0 &a

77、mp;& (i_frame < i_frame_total | i_frame_total = 0); )                  /p_read_frame() 按照h->hin提供的輸入文件的地址,讀入圖像的內(nèi)容到&pic提供的存儲區(qū)的首地址        if( p_read_frame( &pic, opt->hin,

78、 i_frame + opt->i_seek ) )            break;        pic.i_pts = (int64_t)i_frame * param->i_fps_den;        if( opt->qpfile )       

79、;     parse_qpfile( opt, &pic, i_frame + opt->i_seek );/parse_qpfile() 為從指定的文件中讀入qp的值留下的接口,qpfile為文件的首地址        else                    /* Do not fo

80、rce any parameters */            pic.i_type = X264_TYPE_AUTO;            pic.i_qpplus1 = 0;/ 參數(shù)減1代表當(dāng)前畫面的量化參數(shù)值              &#

81、160; i_frame_size = Encode_frame( h, opt->hout, &pic );/*核心程序        (略)        /* update status line (up to 1000 times per input file) */           /用于顯示整個(gè)編碼過程的進(jìn)度        if( opt->b_progress && i_frame % i_update_interval = 0 )                    int64_t i_elapsed = x264

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論