首先說明這篇主要是記錄用(意思是裡面很多是我自己的理解,我也是剛入門的新手,肯定有許多不正確的地方,還請輕噴),使用的是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 )實現。我們直接看核心功能實現,這裡博主使用的hm10,和我使用的16.3略有不同,我這裡關於這個函式是這個樣子的這又是乙個碉堡了的函式,佔了將近400行……**就不貼了,會死人的……簡單看下好了。
首先還是各種編碼的配置,包括配置熵編碼器、初始化cu編碼器等。在完成了一長串的設定之後,在compresscu函式中實現對乙個cu的編碼:
// 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 ...