HEVC函式入門(1) HM編碼器的基本結構

2021-08-02 17:50:59 字數 3473 閱讀 6978

首先說明這篇主要是記錄用(意思是裡面很多是我自己的理解,我也是剛入門的新手,肯定有許多不正確的地方,還請輕噴),使用的是hm 16.3 vs2015 當然如果有新手不太懂的話也可以看看。

本文主要參照

int main(int argc, char* argv)

} catch (df::program_options_lite::parsefailure &e)

#if print_macro_values

printmacrosettings();

#endif

#if environment_variable_debug_and_test

envvar::printenvvarinuse();

#endif

// starting time

double dresult;

clock_t lbefore = clock();

// call encoding function

// ending time

dresult = (double)(clock()-lbefore) / clocks_per_sec;

printf("\n total time: %12.3f sec.\n", dresult);

return0;}

//! \}

tcompicyuv* pcpicyuvorg = new tcompicyuv;

tcompicyuv* pcpicyuvrec = null;

// initialize internal class & member variables

xinitlibcfg();

xcreatelib();

xinitlib(m_isfield);

printchromaformat();

// main encoder loop

int inumencoded = 0;

bool beos = false;

const inputcolourspaceconversion ipcsc = m_inputcolourspaceconvert;

const inputcolourspaceconversion snrcsc = (!m_snrinternalcolourspace) ? m_inputcolourspaceconvert : ipcolourspace_unchanged;

list

outputaccessunits; ///< list of access units to write out. is populated by the encoding process

tcompicyuv cpicyuvtrueorg;

// allocate original yuv buffer

if( m_isfield )

else

while ( !beos )

// call encoding function for one frame

if ( m_isfield )

else

// write bistream to file if necessary

if ( inumencoded > 0 )

} m_ctenctop.printsummary(m_isfield);

// delete original yuv buffer

pcpicyuvorg->destroy();

delete pcpicyuvorg;

pcpicyuvorg = null;

// delete used buffers in encoder class

m_ctenctop.deletepicbuffer();

cpicyuvtrueorg.destroy();

// delete buffers & classes

xdeletebuffer();

xdestroylib();

printratesummary();

return;

}

該函式中首先呼叫pcpicyuvorg->create( m_isourcewidth, m_isourceheight, m_uimaxcuwidth, m_uimaxcuheight, m_uimaxcudepth )分配yuv資料快取,然後再while迴圈中逐幀讀取yuv資料、設定當前以編碼的幀數、編碼當前幀、寫出碼流,隨後做其他清理工作。核心功能實現在m_ctenctop.encode( beos, flush ? 0 : pcpicyuvorg, m_clistpicyuvrec, outputaccessunits, inumencoded )函式中。在該函式中呼叫m_cgopencoder.compressgop(m_ipoclast, m_inumpicrcvd, m_clistpic, rclistpicyuvrecout, accessunitsout)進行編碼乙個gop的操作。這個函式奇長無比,用了接近1500行**,看來實現了很多很多很多的功能。這個碉堡了的函式究竟做了些啥事兒呢?這個函式中大部分內容就是在為了編碼當前slice做準備,以及編碼完成之後一些輔助操作。實際編碼過程的操作由以下函式m_pcsliceencoder->compressslice( pcpic )實現。

這又是乙個碉堡了的函式,佔了將近400行……**就不貼了,會死人的……簡單看下好了。

首先還是各種編碼的配置,包括配置熵編碼器、初始化cu編碼器等。在完成了一長串的設定之後,在compresscu函式中實現對乙個cu的編碼:

我們直接看核心功能實現,這裡博主使用的hm10,和我使用的16.3略有不同,我這裡關於這個函式是這個樣子的

// call encoding function

forone

frame

if( m_isfield )

else

這裡分成兩個了,個人理解第乙個是對第一幀編碼,第二個是對後續幀編碼,那麼來看看第乙個的內容吧

右鍵檢視它的引用,跳轉到了乙個.h檔案裡面(這個不是很懂了就),暫時不管那麼多,接著跳轉,啊啊啊啊不對,不是這麼跳轉的。我是

先全拖住再f12跳轉的,所以錯了應該這樣

這樣就跳轉到了encode裡面

找到這個

// compress gop

m_cgopencoder.compressgop(m_ipoclast, m_inumpicrcvd, m_clistpic, rclistpicyuvrecout, accessunitsout, false, false, snrcsc, m_printframemse);

再跳轉 一步步跳轉之後,最後找cu要跳轉compressctu,我一直搜尋compresscu找不到來著。今天的內容就到這兒吧

Microsoft 指令碼編碼器 1

概 述 指令碼編碼器是一種簡單的命令列工具,它使指令碼設計者可以對最終的指令碼進行編碼,從而使 web 主機和 web 客戶不能檢視或修改它們的源 注意,這種編碼只能防止別人在無意中檢視到您的 並不能防止蓄意黑客檢視您的編碼內容及其方法。web 設計者在 web 頁和伺服器的 active seve...

在DOS介面下如何呼叫HEVC編碼器跟解碼器

在hm的doc資料夾下有乙個software manual檔案,裡面主要講了怎麼使用編碼器跟解碼器的方法。今天試了一下,現在跟大家分享!通常採用以下兩種方法 cmd視窗 1 using the encoder 2 using the decoder 使用步驟如下 1 開啟cmd命令視窗。2 改變工作...

HM編碼器端提取PU分割模式及CU深度資訊

hm tenccu.cpp中,compressctu函式主要功能是對乙個ctu進行壓縮,在該函式中呼叫 函式對ctu進行具體的劃分工作,該函式執行完後其相應的資訊便被儲存在其引數中xcompresscu m ppcbestcu 0 m ppctempcu 0 0 debug string pass ...