版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、x264源代碼解析x264編碼詳細(xì)文字全過程x264_param_default(x264_param_t*param)作用:對(duì)編碼器進(jìn)行參數(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ù)集初始化并開辟幀空間對(duì)前一宏塊的信息保存,因?yàn)槭浅跏蓟?,所以作為第一個(gè)宏塊的參考,后面會(huì)有x264_macroblock_cache_load(h,i_mb_x,i_mb_y);它是將要編碼的宏塊的周圍的宏塊的值讀進(jìn)來,要想得到當(dāng)前塊的預(yù)測(cè)值,要先知道上面,左面的預(yù)測(cè)值初始化cpu對(duì)各種分塊的參數(shù)設(shè)定1x264_t*x264_encoder_open(x264_param_t*param)這個(gè)函數(shù)是對(duì)不正確的參數(shù)進(jìn)行修改,并對(duì)各結(jié)構(gòu)體參數(shù)和cabac編碼,預(yù)測(cè)等需要的參數(shù)進(jìn)行初始化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);進(jìn)入核心碼層核心編碼層的總流程圖:(x264.c)1x264_encoder_encode(h,&nal,&i_nal,pic,&pic_out)對(duì)幀進(jìn)行編碼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返回,對(duì)下一幀進(jìn)行編碼下面一頁是詳細(xì)的流程圖:一幀內(nèi)詳細(xì)流程圖:x264_enco
5、der_encode(h,&nal,&i_nal,pic,&pic_out)對(duì)幀進(jìn)行編碼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);/里面包含低象素的擴(kuò)展,很多for循環(huán),應(yīng)該是抽頭計(jì)算和半精度象素的擴(kuò)展,要認(rèn)真看(2)264_slicetype_d
6、ecide(h);對(duì)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);這主要是因?yàn)锽幀必須等后面的非B幀編碼結(jié)束后才能編碼,所以把暫時(shí)不編的一系列B幀存入隊(duì)列中,一直到非B幀才取出進(jìn)行編碼,之后再進(jìn)行前面的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+)對(duì)一個(gè)slice中每個(gè)宏塊進(jìn)行循環(huán)遍歷編碼,其中constinti_mb_y=mb_xy/h-sps-i_mb_width;和constinti_mb_x=mb_xy%h-sps-i_mb_width;是對(duì)宏塊位置在slice中的x,y坐標(biāo)的定位,這個(gè)for語句幾乎覆蓋了整個(gè)x264_slices_write()函數(shù)x264_macroblock_cache_load(h,i_mb_x,i_mb_y);它是將要編碼的宏塊的周圍的宏塊的值讀進(jìn)來,要想得到當(dāng)前塊的預(yù)測(cè)值,要先知道上面,左面的預(yù)測(cè)值!*x264_macroblock_analyse(h);重
9、點(diǎn)。通過一系列的SAD算出最優(yōu)化方案,例如把I幀16U16的宏塊分成16個(gè)4U4分別計(jì)算SAD和與原16U16SAD比較我感覺,在下面一層再詳細(xì)分析。x264_mb_analyse_intra(扎&analysis,COST_MAX);我感覺是在一個(gè)16Q16的SAD,4個(gè)8D8的SAD和,16個(gè)4U4SAD和中選出最優(yōu)方式進(jìn)行,可能我的理解不對(duì),里面的x264_mb_encode_i4x4(h,idx,a-i_qp);i8Q8幾個(gè)函數(shù)的跟蹤有問題,跟得我都找不到,要仔細(xì)看(現(xiàn)在又能跟到了)這邊好像如果是直流分量在這里就進(jìn)行量化ZIGZAG掃描了,不用等到x264_macroblock_enc
10、ode(h)再完成了x264_analyse_update_cache(h,&analysis);有對(duì)色度塊的模式選擇的計(jì)算,好像也有更新信息以為下次的預(yù)測(cè)作為參考x264_macroblock_encode(h);判斷宏塊的類型根據(jù)判斷的類型進(jìn)行DCT,量化,ZIGZAG,并記錄當(dāng)前的模式為下次編碼宏塊(亞宏塊)做參考ZIGZAG的實(shí)現(xiàn)不明白(原來ZIGZAG有宏定義,在上面,現(xiàn)在明白了),反量化和IDCT的過程跟不進(jìn)去,應(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);還有,這個(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ù)前面的模式改變的,可能是上面兩個(gè)函數(shù)沒能更進(jìn)去所以模糊對(duì)色度塊進(jìn)行編碼,QP限制在051之間,選定預(yù)測(cè)模式(DC的話值全為128)x264_mb_encode_8x8_chroma(h,!IS_I
12、NTRA(h-mb.i_type),i_qp);里面對(duì)兩個(gè)色度信號(hào)分別編碼,與亮度信號(hào)類似求亮度和色度的cbp,完全不明白是怎么求的,需要解決!現(xiàn)在有點(diǎn)明白,每個(gè)比特代表子塊是不是全為0,但還沒有全部明白,色度塊cbp中0 x02表示有AC,DC0 x01表示只有DC,利用CBP判斷要不要SKIP.,里面還關(guān)系到向量預(yù)測(cè),明天好好看一下。其中h-mb.qph-mb.i_mb_xy=h-mb.i_last_qp;這個(gè)為讀下一個(gè)qp的保存,不然解碼端是讀不出下一個(gè)qp的,關(guān)于CBP的理解還存在問題,他的8位比特各個(gè)代表的意思還不是十分明確,反正是對(duì)DC,AC的編碼的選擇。185頁有介紹(新一代視頻
13、壓縮標(biāo)準(zhǔn)畢厚杰)選用CABAC還是CAVLCCABAC的原理實(shí)現(xiàn)沒仔細(xì)看x264_macroblock_cache_save(h);保存以為下次的預(yù)測(cè)作為參考一些收尾工作,為下次宏塊作準(zhǔn)備(看的比較粗)x264基于經(jīng)驗(yàn)和感覺的碼率控制策略收藏前提:1high-complexityorhigh-motionscenes,細(xì)節(jié)將不會(huì)很明顯,此時(shí)高qp也是浪費(fèi)2wheremotioncompensationworkswell,在景物邊沿的失真,只需在一幀中去掉,以后就都不會(huì)有.在這里投入有限的bits可以獲得最好的圖像質(zhì)量性價(jià)比3已經(jīng)編碼一frame,可以預(yù)測(cè)其他qp下所需bit數(shù).預(yù)測(cè)距離越遠(yuǎn)越不
14、精確4隨著frame重要性降低,他們只配用更大的qp,i,p,參考bdisposableb.依次降低5H.264支持1frame內(nèi)不同mb使用不同qp,x264不支持,而由rc返回統(tǒng)一qp。但有那個(gè)功能函數(shù)存在那個(gè)函數(shù)僅精確到每一行mb變一次qp所以rc策略如下:2pass:step11pass編碼,由qp推斷某qp下framesize*0.6符合目標(biāo)framesize的限制,得到這個(gè)qpstep2修改qp以滿足requestedtotalsize(total是指整個(gè)Gop的大小,分段先編一邊再一邊)step3encode根據(jù)實(shí)際大小值修正預(yù)測(cè)的qp,并額外增加short-termcompen
15、sation,針對(duì)開始和結(jié)束部分沒有很多bits余地的位置.1pass:abr(averagebitrate)step1用半尺寸快速運(yùn)動(dòng)估計(jì)和SATDresiduals替換1stpass中相關(guān)部分,獲得預(yù)測(cè)step2用之前的樣本估計(jì)scalestep3Overflowcompensation和2pass相似限制filesize犧牲圖像質(zhì)量1pass,:constantbitrate(VBVcompliant)!VBV是指:VideoBufferVerifierTheVideoBufferVerifier(VBV)isamodelhypotheticaldecoderbufferthatwill
16、notoverfloworunderflowwhenfedaconformingMPEGbitstream.包含2個(gè)因素.size和造成的delaystep1sameasabrstep2Scalingfactorisbasedonalocalaverage(dependentonVBVbuffersize)insteadofallpastframesstep3stricterOverflowcompensation,additionaltermtohardlimittheQPsiftheVBVisnearempty.nohardlimitisdoneforafullVBV這里更加嚴(yán)格的空限制,
17、防止沒有bits可以送出,破壞了cbr的傳輸1pass,constantratefactor:ConstantRateFactor(orConstantQuality)(1)SameasABR.(2)Thescalingfactorisaconstantbasedonthe-crfargument.(3)Nooverflowcompensationisdone.ratefactor是指:constantquantizer:QPsaresimplybasedonframetype.RC中的蛋雞悖論:為了計(jì)算當(dāng)前幀中宏塊的RDO,需利用已定qp確定當(dāng)前幀或宏塊的cost預(yù)測(cè)每個(gè)宏塊的modemvr
18、ef等.ratecontrol是在確定modemvref后決定qp,在此之前qp不能獲得。于是rdo與rc不知道先做哪個(gè)了.x264命令行參數(shù)解釋收藏本文對(duì)應(yīng)的是x264命令行模式,VFW方式也用相同的參數(shù),不過是圖形界面,可以自己找對(duì)應(yīng)的英文。使用格式:x264默認(rèn)選項(xiàng)-o輸出文件輸入文件長(zhǎng)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ù)
19、最大IDR幀間距,默認(rèn)250-i/一min-keyint整數(shù)最小IDR幀間距,默認(rèn)25-scenecut整數(shù)畫面動(dòng)態(tài)變化限,當(dāng)超出此值時(shí)插入I幀,默認(rèn)40-b/bframes整數(shù)在IP幀之間可插入的B幀數(shù)量最大值,范圍016,默認(rèn)0no-b-adapt關(guān)閉自適應(yīng)B幀判定(-b設(shè)為1時(shí)可用,其他不推薦)-b-bias整數(shù)控制插入B幀判定,范圍-100+100,越高越容易插入B幀,默認(rèn)0-b-pyramid允許B幀做參考幀-no-cabac關(guān)閉內(nèi)容自適應(yīng)二進(jìn)制算術(shù)編碼(CABAC,高效率的熵編碼)(會(huì)提高速度,但嚴(yán)重影響質(zhì)量)-r/-ref整數(shù)最大參考幀數(shù),范圍016,默認(rèn)1-nf關(guān)閉環(huán)路濾波(一
20、種除馬賽克算法)-f/-filteralpha: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整數(shù)質(zhì)量模式,量化值動(dòng)態(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
21、-maxrate整數(shù)平均碼率模式下,最大瞬時(shí)碼率,默認(rèn)0(與-B設(shè)置相同)-vbv-bufsize整數(shù)碼率控制緩沖區(qū)的大小,單位kbit,默認(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.40pbratio小數(shù)P幀和B幀之間的量化系數(shù),默認(rèn)1.30色度-qp-offset整數(shù)色度和亮度之間的量化差,范圍-12+12,默認(rèn)0-p/-pass1|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
22、字符串統(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ù)對(duì)統(tǒng)計(jì)文件結(jié)果平滑量化值比例的最大值,范圍099.9,默認(rèn)0.5,只用于2-pass-zonesz0/zl/分段量化,格式為:開始幀,結(jié)束幀,選項(xiàng),可選項(xiàng)為:q=整數(shù)(量化值)或b二小數(shù)(碼率倍數(shù))分析選項(xiàng):-A/一analyse字符串動(dòng)
23、態(tài)塊劃分方法,默認(rèn)p8x&b8x8,i8x&i4x4??蛇x項(xiàng):p8x8/p4x4/b8x8/i8x8/i4x4;none/all(p4x4需要p8x8.i8x8需要-8x8dct)-direct字符串動(dòng)態(tài)預(yù)測(cè)方式,默認(rèn)spatial??蛇x項(xiàng):none/spatial/temporal/auto-w/-weightb允許B幀加權(quán)預(yù)測(cè)(可以減少相鄰B幀質(zhì)量低的影響)me字符串對(duì)全像素塊動(dòng)態(tài)預(yù)測(cè)搜索的方式,默認(rèn)hex,可選項(xiàng):dia:菱形搜索,半徑1(快)hex:正六邊形搜索,半徑2umh:可變半徑六邊形搜索esa:全面搜索(很慢,而且效果與umh幾乎相同)-merange整數(shù)-me為umh/esa
24、時(shí)的搜索半徑,最大64,默認(rèn)16-m/-subme整數(shù)動(dòng)態(tài)預(yù)測(cè)和分區(qū)方式,可選項(xiàng)17,默認(rèn)5(與壓縮質(zhì)量和時(shí)間關(guān)系密切,1是7速度的四倍以上)1:用全像素塊進(jìn)行動(dòng)態(tài)搜索,對(duì)每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索2:用半像素塊進(jìn)行動(dòng)態(tài)搜索,對(duì)每個(gè)塊再用快速模式進(jìn)行四分之一像素塊精確搜索3:用半像素塊進(jìn)行動(dòng)態(tài)搜索,對(duì)每個(gè)塊再用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索4:用快速模式進(jìn)行四分之一像素塊精確搜索5:用質(zhì)量模式進(jìn)行四分之一像素塊精確搜索:進(jìn)行I、P幀像素塊的速率失真最優(yōu)化(rdo):進(jìn)行I、P幀運(yùn)動(dòng)矢量及塊內(nèi)部的速率失真最優(yōu)化(質(zhì)量最好)一b-rdoB幀也進(jìn)行rdo,需要一subme在6以
25、上-mixed-refs可以在一幀內(nèi)使用不同參考幀-no-chroma-me不進(jìn)行色度的動(dòng)態(tài)預(yù)測(cè)-bime可以平均B幀參考?jí)K的運(yùn)動(dòng)矢量-8/8x8dct可以使用8x8的離散余弦變換(DCT)-t/-trellis整數(shù)Trellis量化,對(duì)每個(gè)8x8的塊尋找合適的量化值,需要CABAC,默認(rèn)00:關(guān)閉1:只在最后編碼時(shí)使用2:一直使用-no-fast-pskip關(guān)閉快速P幀跳過檢測(cè)-no-dct-decimate關(guān)閉P幀聯(lián)合編碼(可以增加細(xì)節(jié),但也會(huì)增大體積)-nr整數(shù)噪聲去除,范圍0100000,默認(rèn)0cqm字符串設(shè)置外部量化矩陣格式,默認(rèn)flat,可選項(xiàng):jvt/flat-cqmfile字符
26、串讀取JM格式的外部量化矩陣文件,自動(dòng)忽略其他-cqm*選項(xiàng)-cqm4list設(shè)置4x4的量化矩陣,用逗號(hào)分開,范圍1255的16個(gè)整數(shù)-cqm8list設(shè)置8x8的量化矩陣,用逗號(hào)分開,范圍1255的64個(gè)整數(shù)-cqm4i/-cqm4p/-cqm8i/-cqm8p設(shè)置I、P幀不同的量化矩陣-cqm4iy/-cqm4ic/-cqm4py/-cqm4pc設(shè)置亮度、色度不同的量化矩陣視頻標(biāo)準(zhǔn)化選項(xiàng):這些選項(xiàng)與編碼無關(guān),不過如果要用mp4之類的播放器,可以設(shè)置,風(fēng)險(xiǎn)自擔(dān)-sarwidth:height設(shè)置長(zhǎng)寬比-overscan字符串過掃描線,默認(rèn)undef(不設(shè)置),可選項(xiàng):show(觀看)/cr
27、op(去除)-videoformat字符串視頻格式,默認(rèn)undef,可選項(xiàng):component/pal/ntsc/secam/mac/undef一fullrange字符串Specifyfullrangesamplessetting,默認(rèn)off,可選項(xiàng):off/on(我也不明白這是干什么的,請(qǐng)高手指點(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/bt470bg/linear,log
28、100/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è)定等級(jí)(asdefinedbyAnnexA)(不明白,請(qǐng)高手指點(diǎn))-fps小數(shù)設(shè)定幀率-seek整數(shù)設(shè)定起始幀-frames整數(shù)最大編碼幀數(shù)-o/-output指定輸出文件-threads整數(shù)編碼線程(使用分片技術(shù))-thread-input在編碼線程中運(yùn)行Avisynth-no-a
29、sm關(guān)閉全部CPU優(yōu)化指令-no-psnr關(guān)閉PSNR計(jì)算-quiet安靜模式-v/-verbose顯示每一個(gè)幀的信息-progress顯示編碼進(jìn)程-visualize顯示運(yùn)動(dòng)矢量-sps-id整數(shù)設(shè)置SPS和PPS的ID值,默認(rèn)0-aud使用數(shù)據(jù)單元定義符號(hào)x264中重要結(jié)構(gòu)體說明收藏首先解釋一下Cli_opt_t的這個(gè)_t代表結(jié)構(gòu)圖可能是type的意思。同時(shí)還有很多i_b_等作為前綴的變量,其中的1_表示int類型的變量b表示bool類型的。依次類推。正式進(jìn)入主題。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表示一個(gè)bool類型的變量,看參數(shù)幫助也就是x264-help你會(huì)知道,他是用來控制是否顯示編碼進(jìn)度的一個(gè)東西。取值為0,1.I_seek整數(shù)類型表示開始從哪一幀編碼。因?yàn)椴灰欢◤倪@個(gè)文件的第一幀開始編碼,這是可以控制的。Hnd_t(hnd二handle)是一空指針,void*在C語言里空指針是有幾個(gè)特性的,他是一般化指針,可以指向仸何一種類型,但卻不能解引用,需要解引用的時(shí)候,需要進(jìn)行強(qiáng)制轉(zhuǎn)換。采用空指針的策
31、略,應(yīng)該是為了聲明變量的簡(jiǎn)便和統(tǒng)一。Hin指向輸入yuv文件的指針。Hout指向編碼過后生成的文件的指針。Qpfile是一個(gè)指向文件類型的指針,他是文本文件,其每一行的格式是framenumframetypeQP用于強(qiáng)制指定某些幀或者全部幀的幀類型和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;/用兩個(gè)整型的數(shù)的比值,來表示幀率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;/cabac的開關(guān)param-i_cabac_init_idc=-1;param-rc.b_cbr=1;/constantbitrate恒定碼率控制模式param-rc.i_bitrate=0;/默認(rèn)的碼率param-rc.i_rc_buffer_size
33、=0;/buffer的大小param-rc.i_rc_init_buffer=0;/param-rc.i_rc_sens=100;/整個(gè)param的一個(gè)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ù)測(cè)模式param-analys
34、e.i_me_method=X264_ME_HEX;/運(yùn)動(dòng)估計(jì)模式param-analyse.i_me_range=16;/運(yùn)動(dòng)估計(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;/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代表當(dāng)前畫面的量化參數(shù)值。I_pts:programtimestamp程序時(shí)間戳,指示這幅畫面編碼的時(shí)間戳。Img:存放真正一副圖像的原始數(shù)據(jù)。typede
37、fstructinti_csp;inti_plane;inti_stride4;uint8_t*plane4;x264_image_t;Csp:colorspaceparameter色彩空間參數(shù)X264只支持I420i_Plane代表色彩空間的個(gè)數(shù)。一般為3,YUV,初始化為x264常用options整理收藏x264源碼解析2009年11月12日星期四22:44http:/mingjiang_apple/blog/item/aed41f08efbl0b3ae82488eb.htmlx264源碼解析(01)由main函數(shù)進(jìn)入?yún)?shù)設(shè)置后開始Encode函數(shù)。這里只把Encode函數(shù)體解析下借鑒了很
38、多網(wǎng)上資源(即使不全是自己原話也是親手打字上去的哦,感謝網(wǎng)友。代碼似懂非懂的注釋了下,盡當(dāng)資源存儲(chǔ)吧吧,暫且發(fā)到博客大家討論批評(píng)。staticintEncode(x264_param_t*param,cli_opt_t*opt)x264_t*h;/還不知道干啥的,這個(gè)結(jié)構(gòu)也很煩,不壓x264_param_tx264_picture_tpic;/一幀的結(jié)構(gòu)體,色度存儲(chǔ)inti_frame,i_frame_total;int64_ti_start,i_end;/用來計(jì)算時(shí)間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;/上面這段代碼是實(shí)現(xiàn),計(jì)算文件中的總共的幀數(shù),并根據(jù)輸入的參數(shù)初始幀的位置,/對(duì)i_frame_total做出修正,i_frame_total-=opt-i_seek,然后再根據(jù)param-i_frame_total,/對(duì)i_fra
40、me_total做出進(jìn)一步的修正。/總體來說,就是對(duì)參數(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_encoder_open(param)根據(jù)參數(shù)要求對(duì)encoder進(jìn)行一系列的初始化,例如分配內(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í)的計(jì)算,設(shè)定起始時(shí)間i_start=x264_mdate();for(i_frame=0,i_file=0;b_ctrl_c=0&(i_framehin提供的輸入文件的地址,讀入圖像的內(nèi)容到&pic提供的存儲(chǔ)區(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代表當(dāng)前畫面的量化參數(shù)值i_frame_size=Encode_frame(h,opt-hout,&pic);/用于顯示整個(gè)編碼過程的進(jìn)度if(opt-b_progress&
43、i_frame%i_update_interval=0)int64_ti_elapsed=x264_mdate()-i_start;/編碼使用的時(shí)間計(jì)算/幀率的計(jì)算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學(xué)習(xí)筆記(9)-x264中16x16運(yùn)動(dòng)搜索過程函數(shù)實(shí)現(xiàn)是函數(shù)staticvoidx264_mb_analyse_inter_p16x16(x264_t*h,x264_mb_analysis_t*a)1、大循環(huán)是參考幀的循環(huán),從最近的一個(gè)參考幀開始搜索,一直到最遠(yuǎn)的一個(gè)參考幀;2、調(diào)用x264_mb_predict_mv_16x16函數(shù),以上、右上、左塊運(yùn)動(dòng)矢量的中值m.mvp作為候選運(yùn)動(dòng)矢量。3、調(diào)用x264_mb_predict_mv_ref16x16函數(shù),尋找其它候選運(yùn)動(dòng)矢量。這些候選者包括:空間相鄰的左、左上、上、右上塊的MV;第0個(gè)參考幀中的當(dāng)前塊、右邊塊、下邊快運(yùn)動(dòng)矢量乘
45、以時(shí)間差權(quán)重。4、調(diào)用x264_me_search_ref進(jìn)行運(yùn)動(dòng)搜索。搜索時(shí)先從所有候選運(yùn)動(dòng)矢量中選出最佳的起點(diǎn),然后使用小鉆石法、六邊形法、UMH或者全搜索搜索出最佳的整像素位置。5、x264_me_search_ref調(diào)用refine_subpel進(jìn)行1/2和1/4運(yùn)動(dòng)搜索。兩者都使用小鉆石法。6、搜索出最佳運(yùn)動(dòng)矢量后,如果當(dāng)前是最近一個(gè)參考幀,而且最佳SA(T)D小與檢測(cè)門限,則嘗試對(duì)其進(jìn)行P_SKIP編碼。7、保存搜索結(jié)果。2、x264學(xué)習(xí)筆記(10)-分像素的運(yùn)動(dòng)估計(jì)總結(jié)得到分像素的值函數(shù)是下面兩個(gè)函數(shù),對(duì)照著(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);/偏移到所選的整像素點(diǎn)uint8_t*src1=srchpel_ref0qpel_idx+offset+(mvy&3)=3)*i_src_stride;這里面的4+2的這個(gè)2代表色度,而這個(gè)4分別代表整像素,在整像素水平右邊的1/2像素,在整像素垂直下面的1/2像素和整像素右下角的1/2像素。1/2像素的值已經(jīng)在前面函數(shù)里面插值存好了,只要調(diào)用就
47、可以了,而如果要進(jìn)行1/4像素估計(jì),要臨時(shí)插值?,F(xiàn)在這個(gè)函數(shù)get_ref中,srcO、srcl、src2、src3這傳進(jìn)來的就是分別是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í)需要臨時(shí)插值函數(shù)returndst;else*i_dst_stride=i_src_stride;returnsrc1;按照畢
48、厚杰的新一代視頻壓縮編碼標(biāo)準(zhǔn)H.264/AVC關(guān)于運(yùn)動(dòng)矢量那一節(jié)的介紹??磮D6.22那四個(gè)像素點(diǎn),G為整像素點(diǎn)b、h、i分別是lH,lV,lHV,也就是水平,垂直和對(duì)角線的值。Gbhi對(duì)應(yīng)為src0src1src2src3現(xiàn)在看這兩個(gè)數(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像素值和對(duì)角線1/2像素值,也就是畢厚杰書中的G、b、h、I。這里要注意srchpel_ref0qpel_idx最后一行的0111和srchpel_reflqpel_idx最右邊一列0222不是當(dāng)前的整像素0的1/2像素,而分別是其下面和右邊一個(gè)整像素的對(duì)應(yīng)的1/2像素值,因?yàn)?mvy&3)=3)*i_src_stride和(mvx&3)=3)。為什么要這么來排,是因?yàn)橐鶕?jù)1/4像素是通過1/2像素線性插值的公式來的,具體看下面這個(gè)函數(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í)需要臨時(shí)插值函數(shù)intx,y;for(y=0;yi_height;y+)for(x=0;x1;/利用相鄰半像素和兩個(gè)像素取平均插值dst+=i_dst_stride;src1+=i_src1_stride;src2+=i_src2_stride;不過最后我有個(gè)疑問,那就是1/4插值后,應(yīng)該原來的1/2值保持不變的.但是分析發(fā)現(xiàn),這個(gè)b、h、i這三
51、個(gè)1/2像素中,h和i是不變的,不過b會(huì)發(fā)生變化.個(gè)人覺得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也不會(huì)發(fā)生變化.所以這里打個(gè)問號(hào)?3、x264學(xué)習(xí)筆記(11)-關(guān)于運(yùn)動(dòng)矢量MV不傳輸?shù)膯栴}昨天看到H.264樂園群里面有人在討論運(yùn)動(dòng)矢量MV不用傳輸?shù)膯栴},就去看了下x264源代碼,作個(gè)總結(jié)編碼端:運(yùn)動(dòng)估計(jì)搜索得到的運(yùn)動(dòng)矢量MV是不需要傳送的,需要傳送的是MVD,MVD即運(yùn)動(dòng)矢量MV(運(yùn)動(dòng)估計(jì)得
52、到)和運(yùn)動(dòng)矢量的預(yù)測(cè)矢量MVP(預(yù)測(cè)得到)的差值。MVD=MV-MVP解碼端:通過預(yù)測(cè)得到MVP,將傳輸過來的MVD和MVP相加得到MV=MVD+MVP,然后用這個(gè)MV去參考幀中獲取預(yù)測(cè)象素值,最后把這個(gè)預(yù)測(cè)值和殘差加一起,作為重構(gòu)像素值x264中把這個(gè)過程放在了熵編碼階段,在這個(gè)函數(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ù)測(cè)MVPmdx=h-mb.cache.mvi_listx264_scan8idx0-mvpO;/計(jì)算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ù)測(cè)過程詳解(附圖)=第一步:確定相鄰塊=MV預(yù)測(cè)以宏塊分割(或亞宏塊分割,如果宏塊存在亞分割)為單位,同一個(gè)宏塊分割(或亞宏塊分割)內(nèi)所有4*4塊MV預(yù)測(cè)值相同。以每個(gè)宏塊分割(或亞宏塊分割)的左上角像素pixel1和右上角像素pixel2為參考點(diǎn)來確定相鄰塊則:pixel1左側(cè)相鄰像素所在4*4塊為當(dāng)前宏塊分割(或亞宏塊分割)的相鄰塊Apixel1上方相鄰像素所在4*4塊為當(dāng)前宏塊分割(或亞宏塊分割)的相鄰塊Bpixel2右上對(duì)角線像素所在4*4塊為當(dāng)前宏塊分割(或亞宏塊分割)的相鄰塊Cpixel1左上對(duì)角
55、線像素所在4*4塊為當(dāng)前宏塊分割(或亞宏塊分割)的相鄰塊D圖片附件:MV預(yù)測(cè)示意圖JPG(2006-9-2911:14AM,85.25K)以最復(fù)雜的8*8宏塊分割類型為例(此時(shí)只存在亞宏塊分割),分析如下:假設(shè)圖中黑色框表示宏塊、每個(gè)綠色框表示一個(gè)4*4塊、每個(gè)紅色框表示一個(gè)8*8塊。當(dāng)前宏塊的宏塊分割模式為8*8(如圖中紅色線),其亞宏塊分割模式分別為:第一個(gè)8*8塊為8*8,第二個(gè)8*8塊為4*4(如圖中藍(lán)色線),第三個(gè)8*8塊為4*8(如圖中藍(lán)色線),第四個(gè)8*8塊為8*4(如圖中藍(lán)色線)。則按照上述方法來確定相鄰塊的方法如下:第一個(gè)預(yù)測(cè)對(duì)象為第一個(gè)8*8塊,以其左上角像素pixel1和右上角像素pixel2為參考點(diǎn),則:A為7號(hào)4*4塊,B為2號(hào)4*4塊,C為4號(hào)4*4塊,D為1號(hào)4*4塊。9、14、15與8具有相同MV預(yù)測(cè)值第二個(gè)預(yù)測(cè)對(duì)象為第二個(gè)8*8塊的第一個(gè)4*4塊,即10號(hào)塊,以其左上角像素pixel1和右上角像素pixel2為參考點(diǎn),則:A為9號(hào)4*4塊,B為4號(hào)4*4塊,C為號(hào)4*4塊,D為3號(hào)4*4塊第三個(gè)預(yù)測(cè)對(duì)象為第二個(gè)8*8塊的第二個(gè)4*4塊,即11號(hào)塊,以其左上角像素pixel1和右上角像素pixel2為參考點(diǎn),則:A為10號(hào)4*4塊,B為5號(hào)4*4塊,C為號(hào)4*4塊,D為4號(hào)4*4塊第四個(gè)預(yù)測(cè)對(duì)象為第二個(gè)8*8塊的第三個(gè)4*4塊,即16號(hào)塊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)村個(gè)人地基使用權(quán)轉(zhuǎn)讓及宅基地置換合同3篇
- 2025年農(nóng)村堰塘生態(tài)農(nóng)業(yè)與鄉(xiāng)村旅游合作開發(fā)合同
- 2025年度員工薪酬福利及晉升管理體系工資合同3篇
- 二零二五年度航空航天配件賒銷服務(wù)合同3篇
- 二零二五年度數(shù)據(jù)中心機(jī)房租賃協(xié)議含網(wǎng)絡(luò)及安全服務(wù)3篇
- 二零二五年度戀愛關(guān)系維系與責(zé)任分配協(xié)議3篇
- 二零二五年度企業(yè)年會(huì)禮品定制及派發(fā)合同3篇
- 2025合同樣例項(xiàng)目工程建設(shè)合作合同范本
- 二零二五年度養(yǎng)殖產(chǎn)業(yè)鏈供應(yīng)鏈金融服務(wù)合同書人3篇
- 2025年度新材料研發(fā)營(yíng)銷策劃合作協(xié)議3篇
- 2025年北京探礦工程研究所招聘高校應(yīng)屆畢業(yè)生歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025-2030年中國(guó)新能源汽車行業(yè)市場(chǎng)分析報(bào)告
- 宜賓天原5萬噸氯化法鈦白粉環(huán)評(píng)報(bào)告
- GB/T 44888-2024政務(wù)服務(wù)大廳智能化建設(shè)指南
- 2024年工廠股權(quán)轉(zhuǎn)讓盡職調(diào)查報(bào)告3篇
- 創(chuàng)意寫作與文學(xué)欣賞
- 高空伐樹作業(yè)施工方案
- 新媒體用戶行為研究-洞察分析
- 初三家長(zhǎng)會(huì)數(shù)學(xué)老師發(fā)言稿
- 2025版國(guó)家開放大學(xué)法學(xué)本科《知識(shí)產(chǎn)權(quán)法》期末紙質(zhì)考試總題庫(kù)
- 醫(yī)藥銷售培訓(xùn)課程
評(píng)論
0/150
提交評(píng)論