




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、x264源代碼解析x264編碼詳細文字全過程x264_param_default(x264_param_t*param)作用:對編碼器進行參數(shù)設(shè)定cqm:量化表相關(guān)信息csp:量化表相關(guān)信息里的memset(param-cqm_4iy,16,16);memset(param-cqm_4ic,16,16);memset(param-cqm_4py,16,16);memset(param-cqm_4pc,16,16);memset(param-cqm_8iy,16,64);memset(param-cqm_8py,16,64);staticintParse(intargc,char*argv,x2
2、64_param_t*param,cli_opt_t*opt)初始化1getopt_long(nargc,nargv,options,long_options,idx)得到入口地址的向量與方式的選則2getopt_internal(nargc,nargv,options)解析入口地址向量staticintEncode(x264_param_t*param,cli_opt_t*opt)h-param=paramvui信息主要包括幀率、圖像尺寸等信息x264_sps_init(h-sps,0,&h-param);序列圖像集x264_pps_init(h-pps,0,&h-param,h-sps);
3、圖像參數(shù)集初始化并開辟幀空間對前一宏塊的信息保存,因為是初始化,所以作為第一個宏塊的參考,后面會有x264_macroblock_cache_load(h,i_mb_x,i_mb_y);它是將要編碼的宏塊的周圍的宏塊的值讀進來,要想得到當前塊的預(yù)測值,要先知道上面,左面的預(yù)測值初始化cpu對各種分塊的參數(shù)設(shè)定1x264_t*x264_encoder_open(x264_param_t*param)這個函數(shù)是對不正確的參數(shù)進行修改,并對各結(jié)構(gòu)體參數(shù)和cabac編碼,預(yù)測等需要的參數(shù)進行初始化2、p_read_frame(&pic,opt-hin,i_frame+opt-i_seek,param-
4、i_width,param-i_height)讀取一幀,并把這幀設(shè)為previ_file+=Encode_frame(h,opt-hout,&pic);進入核心碼層核心編碼層的總流程圖:(x264.c)1x264_encoder_encode(h,&nal,&i_nal,pic,&pic_out)對幀進行編碼2i_size=x264_nal_encode(data,&i_data,1,&nali)網(wǎng)絡(luò)打包編碼3i_file+=p_write_nalu(hout,data,i_size)把網(wǎng)絡(luò)包寫入到輸出文件中去4返回,對下一幀進行編碼下面一頁是詳細的流程圖:一幀內(nèi)詳細流程圖:x264_enco
5、der_encode(h,&nal,&i_nal,pic,&pic_out)對幀進行編碼1x264_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-param.cpu,fenc);/里面包含低象素的擴展,很多for循環(huán),應(yīng)該是抽頭計算和半精度象素的擴展,要認真看(2)264_slicetype_d
6、ecide(h);對slice類型的判定,里面也要看一下(3)while(IS_X264_TYPE_B(h-frames.nextbframes-i_type)bframes+;x264_frame_put(h-frames.current,x264_frame_get(&h-frames.nextbframes);這主要是因為B幀必須等后面的非B幀編碼結(jié)束后才能編碼,所以把暫時不編的一系列B幀存入隊列中,一直到非B幀才取出進行編碼,之后再進行前面的B幀編碼do_encode:(4).建立listO&listl.我感覺x264_reference_build_list(h,h-fdec-i_p
7、oc,i_slice_type);比特率控制初始化x264_ratecontrol_start(h,i_slice_type,h-fenc-i_qpplusl);(5).創(chuàng)建slice的頭部數(shù)據(jù)x264_slice_init(h,i_nal_type,i_slice_type,i_global_qp);(6)i_frame_size=x264_slices_write(h);這是編碼的關(guān)鍵了x264_slice_header_write(&h-out.bs,&h-sh,h-i_nal_ref_idc);一些初始化工作for(mb_xy=h-sh.i_first_mb,i_skip=O;mb_x
8、ysh.i_last_mb;mb_xy+)對一個slice中每個宏塊進行循環(huán)遍歷編碼,其中constinti_mb_y=mb_xy/h-sps-i_mb_width;和constinti_mb_x=mb_xy%h-sps-i_mb_width;是對宏塊位置在slice中的x,y坐標的定位,這個for語句幾乎覆蓋了整個x264_slices_write()函數(shù)x264_macroblock_cache_load(h,i_mb_x,i_mb_y);它是將要編碼的宏塊的周圍的宏塊的值讀進來,要想得到當前塊的預(yù)測值,要先知道上面,左面的預(yù)測值!*x264_macroblock_analyse(h);重
9、點。通過一系列的SAD算出最優(yōu)化方案,例如把I幀16U16的宏塊分成16個4U4分別計算SAD和與原16U16SAD比較我感覺,在下面一層再詳細分析。x264_mb_analyse_intra(扎&analysis,COST_MAX);我感覺是在一個16Q16的SAD,4個8D8的SAD和,16個4U4SAD和中選出最優(yōu)方式進行,可能我的理解不對,里面的x264_mb_encode_i4x4(h,idx,a-i_qp);i8Q8幾個函數(shù)的跟蹤有問題,跟得我都找不到,要仔細看(現(xiàn)在又能跟到了)這邊好像如果是直流分量在這里就進行量化ZIGZAG掃描了,不用等到x264_macroblock_enc
10、ode(h)再完成了x264_analyse_update_cache(h,&analysis);有對色度塊的模式選擇的計算,好像也有更新信息以為下次的預(yù)測作為參考x264_macroblock_encode(h);判斷宏塊的類型根據(jù)判斷的類型進行DCT,量化,ZIGZAG,并記錄當前的模式為下次編碼宏塊(亞宏塊)做參考ZIGZAG的實現(xiàn)不明白(原來ZIGZAG有宏定義,在上面,現(xiàn)在明白了),反量化和IDCT的過程跟不進去,應(yīng)該是匯編了!函數(shù)如下:(I4D4中x264_mb_encode_i4x4(h,i,i_qp);)x264_mb_dequant_4x4(dct4x4,h-dequant4
11、_mfCQM_4IY,i_qscale);h-dctf.add4x4_idct(p_dst,i_stride,dct4x4);還有,這個函數(shù)跟蹤不進去,應(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);這個值到底是怎么根據(jù)前面的模式改變的,可能是上面兩個函數(shù)沒能更進去所以模糊對色度塊進行編碼,QP限制在051之間,選定預(yù)測模式(DC的話值全為128)x264_mb_encode_8x8_chroma(h,!IS_I
12、NTRA(h-mb.i_type),i_qp);里面對兩個色度信號分別編碼,與亮度信號類似求亮度和色度的cbp,完全不明白是怎么求的,需要解決!現(xiàn)在有點明白,每個比特代表子塊是不是全為0,但還沒有全部明白,色度塊cbp中0 x02表示有AC,DC0 x01表示只有DC,利用CBP判斷要不要SKIP.,里面還關(guān)系到向量預(yù)測,明天好好看一下。其中h-mb.qph-mb.i_mb_xy=h-mb.i_last_qp;這個為讀下一個qp的保存,不然解碼端是讀不出下一個qp的,關(guān)于CBP的理解還存在問題,他的8位比特各個代表的意思還不是十分明確,反正是對DC,AC的編碼的選擇。185頁有介紹(新一代視頻
13、壓縮標準畢厚杰)選用CABAC還是CAVLCCABAC的原理實現(xiàn)沒仔細看x264_macroblock_cache_save(h);保存以為下次的預(yù)測作為參考一些收尾工作,為下次宏塊作準備(看的比較粗)x264基于經(jīng)驗和感覺的碼率控制策略收藏前提:1high-complexityorhigh-motionscenes,細節(jié)將不會很明顯,此時高qp也是浪費2wheremotioncompensationworkswell,在景物邊沿的失真,只需在一幀中去掉,以后就都不會有.在這里投入有限的bits可以獲得最好的圖像質(zhì)量性價比3已經(jīng)編碼一frame,可以預(yù)測其他qp下所需bit數(shù).預(yù)測距離越遠越不
14、精確4隨著frame重要性降低,他們只配用更大的qp,i,p,參考bdisposableb.依次降低5H.264支持1frame內(nèi)不同mb使用不同qp,x264不支持,而由rc返回統(tǒng)一qp。但有那個功能函數(shù)存在那個函數(shù)僅精確到每一行mb變一次qp所以rc策略如下:2pass:step11pass編碼,由qp推斷某qp下framesize*0.6符合目標framesize的限制,得到這個qpstep2修改qp以滿足requestedtotalsize(total是指整個Gop的大小,分段先編一邊再一邊)step3encode根據(jù)實際大小值修正預(yù)測的qp,并額外增加short-termcompen
15、sation,針對開始和結(jié)束部分沒有很多bits余地的位置.1pass:abr(averagebitrate)step1用半尺寸快速運動估計和SATDresiduals替換1stpass中相關(guān)部分,獲得預(yù)測step2用之前的樣本估計scalestep3Overflowcompensation和2pass相似限制filesize犧牲圖像質(zhì)量1pass,:constantbitrate(VBVcompliant)!VBV是指:VideoBufferVerifierTheVideoBufferVerifier(VBV)isamodelhypotheticaldecoderbufferthatwill
16、notoverfloworunderflowwhenfedaconformingMPEGbitstream.包含2個因素.size和造成的delaystep1sameasabrstep2Scalingfactorisbasedonalocalaverage(dependentonVBVbuffersize)insteadofallpastframesstep3stricterOverflowcompensation,additionaltermtohardlimittheQPsiftheVBVisnearempty.nohardlimitisdoneforafullVBV這里更加嚴格的空限制,
17、防止沒有bits可以送出,破壞了cbr的傳輸1pass,constantratefactor:ConstantRateFactor(orConstantQuality)(1)SameasABR.(2)Thescalingfactorisaconstantbasedonthe-crfargument.(3)Nooverflowcompensationisdone.ratefactor是指:constantquantizer:QPsaresimplybasedonframetype.RC中的蛋雞悖論:為了計算當前幀中宏塊的RDO,需利用已定qp確定當前幀或宏塊的cost預(yù)測每個宏塊的modemvr
18、ef等.ratecontrol是在確定modemvref后決定qp,在此之前qp不能獲得。于是rdo與rc不知道先做哪個了.x264命令行參數(shù)解釋收藏本文對應(yīng)的是x264命令行模式,VFW方式也用相同的參數(shù),不過是圖形界面,可以自己找對應(yīng)的英文。使用格式:x264默認選項-o輸出文件輸入文件長x寬輸入支持格式:RAW/y4m/avi/avs(編譯時可選)輸出支持格式:264/mkv/mp4(編譯時可選)x264的許多參數(shù)可以有-/-兩種輸入法,筆者也不知道為什么。以下等價參數(shù)用“參數(shù)1/參數(shù)2必需數(shù)值格式”表示,參數(shù)尾部()內(nèi)為個人推薦。-h/-help幫助幀類型選項:-I/一keyint整數(shù)
19、最大IDR幀間距,默認250-i/一min-keyint整數(shù)最小IDR幀間距,默認25-scenecut整數(shù)畫面動態(tài)變化限,當超出此值時插入I幀,默認40-b/bframes整數(shù)在IP幀之間可插入的B幀數(shù)量最大值,范圍016,默認0no-b-adapt關(guān)閉自適應(yīng)B幀判定(-b設(shè)為1時可用,其他不推薦)-b-bias整數(shù)控制插入B幀判定,范圍-100+100,越高越容易插入B幀,默認0-b-pyramid允許B幀做參考幀-no-cabac關(guān)閉內(nèi)容自適應(yīng)二進制算術(shù)編碼(CABAC,高效率的熵編碼)(會提高速度,但嚴重影響質(zhì)量)-r/-ref整數(shù)最大參考幀數(shù),范圍016,默認1-nf關(guān)閉環(huán)路濾波(一
20、種除馬賽克算法)-f/-filteralpha:beta設(shè)置環(huán)路濾波的AlphaC和Beta的參數(shù),范圍-6-6,默認都為0碼率控制選項:-q/-qp整數(shù)固定量化模式并設(shè)置使用的量化值,范圍051,0為無損壓縮,默認26-B/-bitrate整數(shù)設(shè)置平均碼率-crf整數(shù)質(zhì)量模式,量化值動態(tài)可變(目前不太成熟,質(zhì)量不如設(shè)置固定量化值)-qpmin整數(shù)設(shè)置最小量化值,范圍051,默認10-qpmax整數(shù)設(shè)置最大量化值,范圍051,默認51-qpstep整數(shù)設(shè)置相鄰幀之間的量化值差,范圍050,默認4-ratetol小數(shù)平均碼率模式下,瞬時碼率可以偏離的倍數(shù),范圍0.1100.0,默認1.0-vbv
21、-maxrate整數(shù)平均碼率模式下,最大瞬時碼率,默認0(與-B設(shè)置相同)-vbv-bufsize整數(shù)碼率控制緩沖區(qū)的大小,單位kbit,默認0-vbv-init小數(shù)碼率控制緩沖區(qū)數(shù)據(jù)保留的最大數(shù)據(jù)量與緩沖區(qū)大小之比,范圍01.0,默認0.9-ipratio小數(shù)I幀和P幀之間的量化系數(shù),默認1.40pbratio小數(shù)P幀和B幀之間的量化系數(shù),默認1.30色度-qp-offset整數(shù)色度和亮度之間的量化差,范圍-12+12,默認0-p/-pass1|2|3多次壓縮碼率控制1:第一次壓縮,創(chuàng)建統(tǒng)計文件2:按建立的統(tǒng)計文件壓縮并輸出,不覆蓋統(tǒng)計文件,3:按建立的統(tǒng)計文件壓縮,優(yōu)化統(tǒng)計文件-stats
22、字符串統(tǒng)計文件的名稱,默認x264_2pass.log-rceq字符串速率控制公式,默認blurCplx八(1-qComp)-qcomp小數(shù)線性量化控制,0.0為固定碼率,1.0為固定量化值,默認0.6,只用于2-pass和質(zhì)量模式-cplxblur小數(shù)根據(jù)相鄰幀平滑量化值比例的最大值,范圍099.9,默認20.0,只用于2-pass和質(zhì)量模式-qblur小數(shù)對統(tǒng)計文件結(jié)果平滑量化值比例的最大值,范圍099.9,默認0.5,只用于2-pass-zonesz0/zl/分段量化,格式為:開始幀,結(jié)束幀,選項,可選項為:q=整數(shù)(量化值)或b二小數(shù)(碼率倍數(shù))分析選項:-A/一analyse字符串動
23、態(tài)塊劃分方法,默認p8x&b8x8,i8x&i4x4。可選項:p8x8/p4x4/b8x8/i8x8/i4x4;none/all(p4x4需要p8x8.i8x8需要-8x8dct)-direct字符串動態(tài)預(yù)測方式,默認spatial??蛇x項:none/spatial/temporal/auto-w/-weightb允許B幀加權(quán)預(yù)測(可以減少相鄰B幀質(zhì)量低的影響)me字符串對全像素塊動態(tài)預(yù)測搜索的方式,默認hex,可選項:dia:菱形搜索,半徑1(快)hex:正六邊形搜索,半徑2umh:可變半徑六邊形搜索esa:全面搜索(很慢,而且效果與umh幾乎相同)-merange整數(shù)-me為umh/esa
24、時的搜索半徑,最大64,默認16-m/-subme整數(shù)動態(tài)預(yù)測和分區(qū)方式,可選項17,默認5(與壓縮質(zhì)量和時間關(guān)系密切,1是7速度的四倍以上)1:用全像素塊進行動態(tài)搜索,對每個塊再用快速模式進行四分之一像素塊精確搜索2:用半像素塊進行動態(tài)搜索,對每個塊再用快速模式進行四分之一像素塊精確搜索3:用半像素塊進行動態(tài)搜索,對每個塊再用質(zhì)量模式進行四分之一像素塊精確搜索4:用快速模式進行四分之一像素塊精確搜索5:用質(zhì)量模式進行四分之一像素塊精確搜索:進行I、P幀像素塊的速率失真最優(yōu)化(rdo):進行I、P幀運動矢量及塊內(nèi)部的速率失真最優(yōu)化(質(zhì)量最好)一b-rdoB幀也進行rdo,需要一subme在6以
25、上-mixed-refs可以在一幀內(nèi)使用不同參考幀-no-chroma-me不進行色度的動態(tài)預(yù)測-bime可以平均B幀參考塊的運動矢量-8/8x8dct可以使用8x8的離散余弦變換(DCT)-t/-trellis整數(shù)Trellis量化,對每個8x8的塊尋找合適的量化值,需要CABAC,默認00:關(guān)閉1:只在最后編碼時使用2:一直使用-no-fast-pskip關(guān)閉快速P幀跳過檢測-no-dct-decimate關(guān)閉P幀聯(lián)合編碼(可以增加細節(jié),但也會增大體積)-nr整數(shù)噪聲去除,范圍0100000,默認0cqm字符串設(shè)置外部量化矩陣格式,默認flat,可選項:jvt/flat-cqmfile字符
26、串讀取JM格式的外部量化矩陣文件,自動忽略其他-cqm*選項-cqm4list設(shè)置4x4的量化矩陣,用逗號分開,范圍1255的16個整數(shù)-cqm8list設(shè)置8x8的量化矩陣,用逗號分開,范圍1255的64個整數(shù)-cqm4i/-cqm4p/-cqm8i/-cqm8p設(shè)置I、P幀不同的量化矩陣-cqm4iy/-cqm4ic/-cqm4py/-cqm4pc設(shè)置亮度、色度不同的量化矩陣視頻標準化選項:這些選項與編碼無關(guān),不過如果要用mp4之類的播放器,可以設(shè)置,風險自擔-sarwidth:height設(shè)置長寬比-overscan字符串過掃描線,默認undef(不設(shè)置),可選項:show(觀看)/cr
27、op(去除)-videoformat字符串視頻格式,默認undef,可選項:component/pal/ntsc/secam/mac/undef一fullrange字符串Specifyfullrangesamplessetting,默認off,可選項:off/on(我也不明白這是干什么的,請高手指點)一colorprim字符串原始色度格式,默認undef,可選項:undef/bt709/bt470m/bt470bg,smpte170m/smpte240m/film-transfer字符串轉(zhuǎn)換方式,默認undef,可選項:undef/bt709/bt470m/bt470bg/linear,log
28、100/log316/smpte170m/smpte240m一colormatrix字符串色度矩陣設(shè)置,默認undef,undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo-chromaloc整數(shù)色度樣本指定,范圍05,默認0輸入、輸出選項:-level字符串設(shè)定等級(asdefinedbyAnnexA)(不明白,請高手指點)-fps小數(shù)設(shè)定幀率-seek整數(shù)設(shè)定起始幀-frames整數(shù)最大編碼幀數(shù)-o/-output指定輸出文件-threads整數(shù)編碼線程(使用分片技術(shù))-thread-input在編碼線程中運行Avisynth-no-a
29、sm關(guān)閉全部CPU優(yōu)化指令-no-psnr關(guān)閉PSNR計算-quiet安靜模式-v/-verbose顯示每一個幀的信息-progress顯示編碼進程-visualize顯示運動矢量-sps-id整數(shù)設(shè)置SPS和PPS的ID值,默認0-aud使用數(shù)據(jù)單元定義符號x264中重要結(jié)構(gòu)體說明收藏首先解釋一下Cli_opt_t的這個_t代表結(jié)構(gòu)圖可能是type的意思。同時還有很多i_b_等作為前綴的變量,其中的1_表示int類型的變量b表示bool類型的。依次類推。正式進入主題。typedefstruCtintb_progress;inti_seek;hnd_thin;hnd_thout;FILE*qp
30、file;Cli_opt_t;此結(jié)構(gòu)體是記錄一些與編碼關(guān)系較小的設(shè)置信息的opt=option。結(jié)構(gòu)體內(nèi)部的變量都可以通過讀取main()的參數(shù)獲得。也就是argv。b_progress表示一個bool類型的變量,看參數(shù)幫助也就是x264-help你會知道,他是用來控制是否顯示編碼進度的一個東西。取值為0,1.I_seek整數(shù)類型表示開始從哪一幀編碼。因為不一定從這個文件的第一幀開始編碼,這是可以控制的。Hnd_t(hnd二handle)是一空指針,void*在C語言里空指針是有幾個特性的,他是一般化指針,可以指向仸何一種類型,但卻不能解引用,需要解引用的時候,需要進行強制轉(zhuǎn)換。采用空指針的策
31、略,應(yīng)該是為了聲明變量的簡便和統(tǒng)一。Hin指向輸入yuv文件的指針。Hout指向編碼過后生成的文件的指針。Qpfile是一個指向文件類型的指針,他是文本文件,其每一行的格式是framenumframetypeQP用于強制指定某些幀或者全部幀的幀類型和QP(quantparam量化參數(shù))的值。x264_param_default(¶m);這部分設(shè)置編碼參數(shù)的缺省值附結(jié)構(gòu)體param中部分變量的意義:param-i_Csp=X264_CSP_I420;/設(shè)置輸入的視頻采樣的格式param-vui.i_sar_width=0;/VUI:videousabilityinformationpar
32、am-i_fps_num=10;/幀率param-i_fps_den=1;/用兩個整型的數(shù)的比值,來表示幀率param-i_frame_referenCe=1;/參考幀的最大幀數(shù)。param-i_bframe=0;/兩個參考幀之間的B幀數(shù)目。param-b_deblocking_filter=1;/去塊效應(yīng)相關(guān)param-b_cabac=0;/cabac的開關(guān)param-i_cabac_init_idc=-1;param-rc.b_cbr=1;/constantbitrate恒定碼率控制模式param-rc.i_bitrate=0;/默認的碼率param-rc.i_rc_buffer_size
33、=0;/buffer的大小param-rc.i_rc_init_buffer=0;/param-rc.i_rc_sens=100;/整個param的一個log文件param-ra=X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;/楨內(nèi)分析param-er=X264_ANALYSE_I4x4|X264_ANALYSE_I8x8|X264_ANALYSE_PSUB16x16|X264_ANALYSE_BSUB16x16;/楨間分析param-analyse.i_direct_mv_pred=X264_DIRECT_PRED_SPATIAL;/預(yù)測模式param-analys
34、e.i_me_method=X264_ME_HEX;/運動估計模式param-analyse.i_me_range=16;/運動估計范圍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;/setfromlevel_idcparam-analyse.i_direct_8x8_inference=-1;/setfromlevel_idcparam-analyse.i_chroma_qp_offset=0;
35、param-analyse.b_fast_pskip=1;param-analyse.b_dct_decimate=1;param-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;/自定義量化矩陣(CQM),初始化量化模式為flattypedefstructinti_type;inti_type;inti_qpplus1;inti_qpplus1;int64_ti
36、_pts;x264_image_timg;x264_picture_t;具體的含義理解參考了read_frame_yuv()x264_picture_alloc();I_type指明被編碼圖像的類型,有X264_TYPE_AUTOX264_TYPE_IDRX264_TYPE_IX264_TYPE_PX264_TYPE_BREFX264_TYPE_B可供選擇,初始化為AUTO,說明由x264在編碼過程中自行控制。I_qpplus1:此參數(shù)減1代表當前畫面的量化參數(shù)值。I_pts:programtimestamp程序時間戳,指示這幅畫面編碼的時間戳。Img:存放真正一副圖像的原始數(shù)據(jù)。typede
37、fstructinti_csp;inti_plane;inti_stride4;uint8_t*plane4;x264_image_t;Csp:colorspaceparameter色彩空間參數(shù)X264只支持I420i_Plane代表色彩空間的個數(shù)。一般為3,YUV,初始化為x264常用options整理收藏x264源碼解析2009年11月12日星期四22:44http:/mingjiang_apple/blog/item/aed41f08efbl0b3ae82488eb.htmlx264源碼解析(01)由main函數(shù)進入?yún)?shù)設(shè)置后開始Encode函數(shù)。這里只把Encode函數(shù)體解析下借鑒了很
38、多網(wǎng)上資源(即使不全是自己原話也是親手打字上去的哦,感謝網(wǎng)友。代碼似懂非懂的注釋了下,盡當資源存儲吧吧,暫且發(fā)到博客大家討論批評。staticintEncode(x264_param_t*param,cli_opt_t*opt)x264_t*h;/還不知道干啥的,這個結(jié)構(gòu)也很煩,不壓x264_param_tx264_picture_tpic;/一幀的結(jié)構(gòu)體,色度存儲inti_frame,i_frame_total;int64_ti_start,i_end;/用來計算時間int64_ti_file;inti_frame_size;inti_update_interval;charbuf200;o
39、pt-b_progress&=param-i_log_levelhin);i_frame_total-=opt-i_seek;if(i_frame_total=0|param-i_frame_totali_frame_total0)i_frame_total=param-i_frame_total;param-i_frame_total=i_frame_total;/上面這段代碼是實現(xiàn),計算文件中的總共的幀數(shù),并根據(jù)輸入的參數(shù)初始幀的位置,/對i_frame_total做出修正,i_frame_total-=opt-i_seek,然后再根據(jù)param-i_frame_total,/對i_fra
40、me_total做出進一步的修正。/總體來說,就是對參數(shù)設(shè)置中的進行編碼的幀數(shù)的總數(shù)進行修正和計算。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_encoder_open(param)根據(jù)參數(shù)要求對encoder進行一系列的初始化,例如分配內(nèi)存,值的初始化等。(略)if(p_set_outfile_param(opt-hout,param)/關(guān)鍵函數(shù):p_set_outfile_param()設(shè)置輸出文件格式
41、(略)/關(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)(略)/關(guān)鍵函數(shù):x264_mdate()用于編碼用時的計算,設(shè)定起始時間i_start=x264_mdate();for(i_frame=0,i_file=0;b_ctrl_c=0&(i_framehin提供的輸入文件的地址,讀入圖像的內(nèi)容到&pic提供的存儲區(qū)的首地址if(p_read_frame(&pic,opt-hin,i_frame+op
42、t-i_seek)break;pic.i_pts=(int64_t)i_frame*param-i_fps_den;if(opt-qpfile)parse_qpfile(opt,&pic,i_frame+opt-i_seek);/parse_qpfile()為從指定的文件中讀入qp的值留下的接口,qpfile為文件的首地址elsepic.i_type=X264_TYPE_AUTO;pic.i_qpplus1=0;/參數(shù)減1代表當前畫面的量化參數(shù)值i_frame_size=Encode_frame(h,opt-hout,&pic);/用于顯示整個編碼過程的進度if(opt-b_progress&
43、i_frame%i_update_interval=0)int64_ti_elapsed=x264_mdate()-i_start;/編碼使用的時間計算/幀率的計算doublefps=i_elapsed0?i_frame*1000000./i_elapsed:0;doublebitrate=(double)i_file*8*param-i_fps_num/(double)param-i_fps_den*i_frame*1000);(略)SetConsoleTitle(buf);fflush(stderr);/neededinwindows/后邊的除了清理工作,其他的還不知道。return0;1
44、、x264學習筆記(9)-x264中16x16運動搜索過程函數(shù)實現(xiàn)是函數(shù)staticvoidx264_mb_analyse_inter_p16x16(x264_t*h,x264_mb_analysis_t*a)1、大循環(huán)是參考幀的循環(huán),從最近的一個參考幀開始搜索,一直到最遠的一個參考幀;2、調(diào)用x264_mb_predict_mv_16x16函數(shù),以上、右上、左塊運動矢量的中值m.mvp作為候選運動矢量。3、調(diào)用x264_mb_predict_mv_ref16x16函數(shù),尋找其它候選運動矢量。這些候選者包括:空間相鄰的左、左上、上、右上塊的MV;第0個參考幀中的當前塊、右邊塊、下邊快運動矢量乘
45、以時間差權(quán)重。4、調(diào)用x264_me_search_ref進行運動搜索。搜索時先從所有候選運動矢量中選出最佳的起點,然后使用小鉆石法、六邊形法、UMH或者全搜索搜索出最佳的整像素位置。5、x264_me_search_ref調(diào)用refine_subpel進行1/2和1/4運動搜索。兩者都使用小鉆石法。6、搜索出最佳運動矢量后,如果當前是最近一個參考幀,而且最佳SA(T)D小與檢測門限,則嘗試對其進行P_SKIP編碼。7、保存搜索結(jié)果。2、x264學習筆記(10)-分像素的運動估計總結(jié)得到分像素的值函數(shù)是下面兩個函數(shù),對照著(1)staticuint8_t*get_ref(uint8_t*src
46、4,inti_src_stride,uint8_t*dst,int*i_dst_stride,intmvx,intmvy,inti_width,inti_height)intqpel_idx=(mvy&3)2)*i_src_stride+(mvx2);/偏移到所選的整像素點uint8_t*src1=srchpel_ref0qpel_idx+offset+(mvy&3)=3)*i_src_stride;這里面的4+2的這個2代表色度,而這個4分別代表整像素,在整像素水平右邊的1/2像素,在整像素垂直下面的1/2像素和整像素右下角的1/2像素。1/2像素的值已經(jīng)在前面函數(shù)里面插值存好了,只要調(diào)用就
47、可以了,而如果要進行1/4像素估計,要臨時插值?,F(xiàn)在這個函數(shù)get_ref中,srcO、srcl、src2、src3這傳進來的就是分別是IN,lH,lV,lHV*/if(qpel_idx&5)uint8_t*src2=srchpel_ref1qpel_idx+offset+(mvx&3)=3);pixel_avg(dst,*i_dst_stride,src1,i_src_stride,src2,i_src_stride,i_width,i_height);/1/4搜索時需要臨時插值函數(shù)returndst;else*i_dst_stride=i_src_stride;returnsrc1;按照畢
48、厚杰的新一代視頻壓縮編碼標準H.264/AVC關(guān)于運動矢量那一節(jié)的介紹??磮D6.22那四個像素點,G為整像素點b、h、i分別是lH,lV,lHV,也就是水平,垂直和對角線的值。Gbhi對應(yīng)為src0src1src2src3現(xiàn)在看這兩個數(shù)組staticconstinthpel_ref016=0,1,1,1,0,1,1,1,2,3,3,3,0,1,1,1;staticconstinthpel_ref116=0,0,0,0,2,2,3,2,2,2,3,2,2,2,3,2;也按像素的平面圖畫出來的話srchpel_ref0qpel_idx為0111011123330111srchpel_ref1qpe
49、l_idx為0000223222322232這上面的數(shù)字0、1、2、3分別代表整像素、水平1/2像素值、垂直1/2像素值和對角線1/2像素值,也就是畢厚杰書中的G、b、h、I。這里要注意srchpel_ref0qpel_idx最后一行的0111和srchpel_reflqpel_idx最右邊一列0222不是當前的整像素0的1/2像素,而分別是其下面和右邊一個整像素的對應(yīng)的1/2像素值,因為(mvy&3)=3)*i_src_stride和(mvx&3)=3)。為什么要這么來排,是因為要根據(jù)1/4像素是通過1/2像素線性插值的公式來的,具體看下面這個函數(shù)。(2)staticinlinevoidpi
50、xel_avg(uint8_t*dst,inti_dst_stride,uint8_t*src1,inti_src1_stride,uint8_t*src2,inti_src2_stride,inti_width,inti_height)/1/4搜索時需要臨時插值函數(shù)intx,y;for(y=0;yi_height;y+)for(x=0;x1;/利用相鄰半像素和兩個像素取平均插值dst+=i_dst_stride;src1+=i_src1_stride;src2+=i_src2_stride;不過最后我有個疑問,那就是1/4插值后,應(yīng)該原來的1/2值保持不變的.但是分析發(fā)現(xiàn),這個b、h、i這三
51、個1/2像素中,h和i是不變的,不過b會發(fā)生變化.個人覺得staticconstinthpel_ref116=0,0,0,0,2,2,3,2,2,2,3,2,2,2,3,2;如果改為staticconstinthpel_ref116=0,0,1,0,2,2,3,2,2,2,3,2,2,2,3,2;則b也不會發(fā)生變化.所以這里打個問號?3、x264學習筆記(11)-關(guān)于運動矢量MV不傳輸?shù)膯栴}昨天看到H.264樂園群里面有人在討論運動矢量MV不用傳輸?shù)膯栴},就去看了下x264源代碼,作個總結(jié)編碼端:運動估計搜索得到的運動矢量MV是不需要傳送的,需要傳送的是MVD,MVD即運動矢量MV(運動估計得
52、到)和運動矢量的預(yù)測矢量MVP(預(yù)測得到)的差值。MVD=MV-MVP解碼端:通過預(yù)測得到MVP,將傳輸過來的MVD和MVP相加得到MV=MVD+MVP,然后用這個MV去參考幀中獲取預(yù)測象素值,最后把這個預(yù)測值和殘差加一起,作為重構(gòu)像素值x264中把這個過程放在了熵編碼階段,在這個函數(shù)里x264_macroblock_write_cabacMVD并保存下來以備傳輸?shù)暮瘮?shù)如下:staticinlinevoidx264_cabac_mb_mvd(x264_t*h,x264_cabac_t*cb,inti_list,intidx,intwidth,intheight)intmvp2;intmdx,m
53、dy;x264_mb_predict_mv(h,i_list,idx,width,mvp);/預(yù)測MVPmdx=h-mb.cache.mvi_listx264_scan8idx0-mvpO;/計算MVDmdy=h-mb.cache.mvi_listx264_scan8idx1-mvp1;x264_cabac_mb_mvd_cpn(h,cb,i_list,idx,0,mdx);/編碼x264_cabac_mb_mvd_cpn(h,cb,i_list,idx,1,mdy);x264_macroblock_cache_mvd(h,block_idx_xidx,block_idx_yidx,width
54、,height,i_list,mdx,mdy);/保存MVD4、firstimeMV預(yù)測過程詳解(附圖)=第一步:確定相鄰塊=MV預(yù)測以宏塊分割(或亞宏塊分割,如果宏塊存在亞分割)為單位,同一個宏塊分割(或亞宏塊分割)內(nèi)所有4*4塊MV預(yù)測值相同。以每個宏塊分割(或亞宏塊分割)的左上角像素pixel1和右上角像素pixel2為參考點來確定相鄰塊則:pixel1左側(cè)相鄰像素所在4*4塊為當前宏塊分割(或亞宏塊分割)的相鄰塊Apixel1上方相鄰像素所在4*4塊為當前宏塊分割(或亞宏塊分割)的相鄰塊Bpixel2右上對角線像素所在4*4塊為當前宏塊分割(或亞宏塊分割)的相鄰塊Cpixel1左上對角
55、線像素所在4*4塊為當前宏塊分割(或亞宏塊分割)的相鄰塊D圖片附件:MV預(yù)測示意圖JPG(2006-9-2911:14AM,85.25K)以最復(fù)雜的8*8宏塊分割類型為例(此時只存在亞宏塊分割),分析如下:假設(shè)圖中黑色框表示宏塊、每個綠色框表示一個4*4塊、每個紅色框表示一個8*8塊。當前宏塊的宏塊分割模式為8*8(如圖中紅色線),其亞宏塊分割模式分別為:第一個8*8塊為8*8,第二個8*8塊為4*4(如圖中藍色線),第三個8*8塊為4*8(如圖中藍色線),第四個8*8塊為8*4(如圖中藍色線)。則按照上述方法來確定相鄰塊的方法如下:第一個預(yù)測對象為第一個8*8塊,以其左上角像素pixel1和右上角像素pixel2為參考點,則:A為7號4*4塊,B為2號4*4塊,C為4號4*4塊,D為1號4*4塊。9、14、15與8具有相同MV預(yù)測值第二個預(yù)測對象為第二個8*8塊的第一個4*4塊,即10號塊,以其左上角像素pixel1和右上角像素pixel2為參考點,則:A為9號4*4塊,B為4號4*4塊,C為號4*4塊,D為3號4*4塊第三個預(yù)測對象為第二個8*8塊的第二個4*4塊,即11號塊,以其左上角像素pixel1和右上角像素pixel2為參考點,則:A為10號4*4塊,B為5號4*4塊,C為號4*4塊,D為4號4*4塊第四個預(yù)測對象為第二個8*8塊的第三個4*4塊,即16號塊
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場內(nèi)的商鋪租賃合同
- 停車場承包合同
- 技術(shù)培訓(xùn)委托合同書
- 草籽草坪采購合同
- 房屋獨家代理銷售合同
- 車庫轉(zhuǎn)讓合同協(xié)議書
- 醫(yī)療美容手術(shù)項目合同協(xié)議書
- 高層管理團隊建設(shè)活動方案
- 上海餐飲商鋪租賃合同
- 奶茶店轉(zhuǎn)讓合同(新標準版)8篇
- RASS評分表的解讀及常用鎮(zhèn)靜藥物的臨床應(yīng)用
- 品管部崗位職責20篇
- LY/T 2242-2014自然保護區(qū)建設(shè)項目生物多樣性影響評價技術(shù)規(guī)范
- LM2500燃氣輪機結(jié)構(gòu)簡介
- 電力系統(tǒng)規(guī)劃
- 資本市場運作的國際借鑒
- 2023年廣東學習網(wǎng)繼續(xù)教育大數(shù)據(jù)考試試題和答案匯總
- 四級700核心詞 詞根詞綴記憶法 劉一男講義
- 公路工程工程量清單第章解析及計量支付
- DB33-T 2082-2017(2021)托幼機構(gòu)消毒衛(wèi)生規(guī)范
- 《隋朝的統(tǒng)一與滅亡》 -完整版課件
評論
0/150
提交評論