# HG changeset patch # User Steve Borho <st...@borho.org> # Date 1404281950 18000 # Wed Jul 02 01:19:10 2014 -0500 # Node ID 0743791a8245aacf4868f5a94ab04ab5aaba2d7a # Parent 99b8e4d69e0fa63cc7403dba371c6a0f24fb127d encoder: fix --no-wpp behavior, keep TLD selection logic in one place
do not use static m_threadLocalData, this would break if multiple encoders were allocated in a single process pass the selected TLD to row processes, so they do not need to be aware of the WPP/NO-WPP details. Cleanup frameencoder.h, move non-trivial processRow() to the cpp file diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/encoder.cpp Wed Jul 02 01:19:10 2014 -0500 @@ -42,7 +42,6 @@ #include "x265.h" using namespace x265; -ThreadLocalData* Encoder::m_threadLocalData; Encoder::Encoder() { diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/encoder.h --- a/source/encoder/encoder.h Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/encoder.h Wed Jul 02 01:19:10 2014 -0500 @@ -166,7 +166,7 @@ x265_param* m_param; RateControl* m_rateControl; - static ThreadLocalData* m_threadLocalData; + ThreadLocalData* m_threadLocalData; bool m_bEnableRDOQ; diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/frameencoder.cpp Wed Jul 02 01:19:10 2014 -0500 @@ -507,9 +507,7 @@ // Extend border after whole-frame SAO is finished for (int row = 0; row < m_numRows; row++) - { - m_frameFilter.processRowPost(row, 0); - } + m_frameFilter.processRowPost(row); } slice->setSaoEnabledFlag((saoParam->bSaoFlag[0] == 1) ? true : false); @@ -831,8 +829,29 @@ m_totalTime = 0; } +void FrameEncoder::processRow(int row, const int threadId) +{ + const int realRow = row >> 1; + const int typeNum = row & 1; + + ThreadLocalData& tld = threadId >= 0 ? m_top->m_threadLocalData[threadId] : m_tld; + + if (!typeNum) + processRowEncoder(realRow, tld); + else + { + processRowFilter(realRow, tld); + + // NOTE: Active next row + if (realRow != m_numRows - 1) + enqueueRowFilter(realRow + 1); + else + m_completionEvent.trigger(); + } +} + // Called by worker threads -void FrameEncoder::processRowEncoder(int row, const int threadId) +void FrameEncoder::processRowEncoder(int row, ThreadLocalData& tld) { PPAScopeEvent(Thread_ProcessRow); @@ -860,7 +879,6 @@ } // setup thread-local data - ThreadLocalData& tld = threadId >= 0 ? Encoder::m_threadLocalData[threadId] : m_tld; tld.m_trQuant.m_nr = &m_nr; tld.m_search.m_mref = m_mref; codeRow.setThreadLocalData(tld); diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/frameencoder.h --- a/source/encoder/frameencoder.h Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/frameencoder.h Wed Jul 02 01:19:10 2014 -0500 @@ -69,61 +69,21 @@ void destroy(); - void processRowEncoder(int row, const int threadId); + /* Called by WaveFront::findJob() */ + void processRow(int row, const int threadId); - void processRowFilter(int row, const int threadId) - { - m_frameFilter.processRow(row, threadId); - } + void processRowEncoder(int row, ThreadLocalData& tld); - void enqueueRowEncoder(int row) - { - WaveFront::enqueueRow(row * 2 + 0); - } + void processRowFilter(int row, ThreadLocalData& tld) { m_frameFilter.processRow(row, tld); } - void enqueueRowFilter(int row) - { - WaveFront::enqueueRow(row * 2 + 1); - } - - void enableRowEncoder(int row) - { - WaveFront::enableRow(row * 2 + 0); - } - - void enableRowFilter(int row) - { - WaveFront::enableRow(row * 2 + 1); - } - - void processRow(int row, int threadId) - { - const int realRow = row >> 1; - const int typeNum = row & 1; - - // TODO: use switch when more type - if (typeNum == 0) - { - processRowEncoder(realRow, threadId); - } - else - { - processRowFilter(realRow, threadId); - - // NOTE: Active next row - if (realRow != m_numRows - 1) - enqueueRowFilter(realRow + 1); - else - m_completionEvent.trigger(); - } - } + void enqueueRowEncoder(int row) { WaveFront::enqueueRow(row * 2 + 0); } + void enqueueRowFilter(int row) { WaveFront::enqueueRow(row * 2 + 1); } + void enableRowEncoder(int row) { WaveFront::enableRow(row * 2 + 0); } + void enableRowFilter(int row) { WaveFront::enableRow(row * 2 + 1); } TEncEntropy* getEntropyCoder(int row) { return &this->m_rows[row].m_entropyCoder; } - TEncSbac* getSbacCoder(int row) { return &this->m_rows[row].m_sbacCoder; } - TEncSbac* getRDGoOnSbacCoder(int row) { return &this->m_rows[row].m_rdGoOnSbacCoder; } - TEncSbac* getBufferSBac(int row) { return &this->m_rows[row].m_bufferSbacCoder; } /* Frame singletons, last the life of the encoder */ @@ -139,9 +99,10 @@ /* called by compressFrame to perform wave-front compression analysis */ void compressCTURows(); + /* called by compressFrame to generate final per-row bitstreams */ void encodeSlice(Bitstream* substreams); - /* blocks until worker thread is done, returns encoded picture and bitstream */ + /* blocks until worker thread is done, returns access unit */ Frame *getEncodedPicture(NALList& list); void setLambda(int qp, ThreadLocalData& tld); diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/framefilter.cpp --- a/source/encoder/framefilter.cpp Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/framefilter.cpp Wed Jul 02 01:19:10 2014 -0500 @@ -121,15 +121,13 @@ } } -void FrameFilter::processRow(int row, const int threadId) +void FrameFilter::processRow(int row, ThreadLocalData& tld) { PPAScopeEvent(Thread_filterCU); - assert(threadId >= 0); - ThreadLocalData& tld = Encoder::m_threadLocalData[threadId]; if (!m_param->bEnableLoopFilter && !m_param->bEnableSAO) { - processRowPost(row, threadId); + processRowPost(row); return; } @@ -177,7 +175,7 @@ // NOTE: Delay a row because SAO decide need top row pixels at next row, is it HM's bug? if (row >= m_saoRowDelay) { - processSao(row - m_saoRowDelay, threadId); + processSao(row - m_saoRowDelay); } } @@ -189,7 +187,7 @@ if (row > 0) { - processRowPost(row - 1, threadId); + processRowPost(row - 1); } if (row == m_numRows - 1) @@ -200,15 +198,15 @@ for (int i = m_numRows - m_saoRowDelay; i < m_numRows; i++) { - processSao(i, threadId); + processSao(i); } } - processRowPost(row, threadId); + processRowPost(row); } } -void FrameFilter::processRowPost(int row, const int /*threadId*/) +void FrameFilter::processRowPost(int row) { const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU(); const uint32_t lineStartCUAddr = row * numCols; @@ -501,7 +499,7 @@ return ssim; } -void FrameFilter::processSao(int row, const int /*threadId*/) +void FrameFilter::processSao(int row) { const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU(); const uint32_t lineStartCUAddr = row * numCols; diff -r 99b8e4d69e0f -r 0743791a8245 source/encoder/framefilter.h --- a/source/encoder/framefilter.h Tue Jul 01 17:47:28 2014 -0500 +++ b/source/encoder/framefilter.h Wed Jul 02 01:19:10 2014 -0500 @@ -50,9 +50,9 @@ void start(Frame *pic); - void processRow(int row, const int threadId); - void processRowPost(int row, const int threadId); - void processSao(int row, const int threadId); + void processRow(int row, ThreadLocalData& tld); + void processRowPost(int row); + void processSao(int row); protected: _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel