[x265] [PATCH 2 of 2] pass TLD into class FrameFilter

Min Chen chenm003 at 163.com
Tue Jun 24 02:06:13 CEST 2014


# HG changeset patch
# User Min Chen <chenm003 at 163.com>
# Date 1403568362 25200
# Node ID efa48bc0245bded1418db3c42b042acb9969146c
# Parent  12c1d8aaa8f56a8f2de74c8ff1451d99d04c817d
pass TLD into class FrameFilter

diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/cturow.h
--- a/source/encoder/cturow.h	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/cturow.h	Mon Jun 23 17:06:02 2014 -0700
@@ -47,6 +47,10 @@
     RDCost      m_rdCost;
     TComTrQuant m_trQuant;
 
+    // NOTE: the maximum LCU 64x64 have 256 partitions
+    bool        m_edgeFilter[256];
+    uint8_t     m_blockingStrength[256];
+
     void init(Encoder&);
     ~ThreadLocalData();
 };
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/encoder.cpp	Mon Jun 23 17:06:02 2014 -0700
@@ -42,6 +42,7 @@
 #include "x265.h"
 
 using namespace x265;
+ThreadLocalData* Encoder::m_threadLocalData;
 
 Encoder::Encoder()
 {
@@ -194,9 +195,10 @@
     if (m_frameEncoder)
     {
         int numRows = (m_param->sourceHeight + g_maxCUSize - 1) / g_maxCUSize;
+        int numCols = (m_param->sourceWidth  + g_maxCUSize - 1) / g_maxCUSize;
         for (int i = 0; i < m_param->frameNumThreads; i++)
         {
-            if (!m_frameEncoder[i].init(this, numRows))
+            if (!m_frameEncoder[i].init(this, numRows, numCols))
             {
                 x265_log(m_param, X265_LOG_ERROR, "Unable to initialize frame encoder, aborting\n");
                 m_aborted = true;
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/encoder.h
--- a/source/encoder/encoder.h	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/encoder.h	Mon Jun 23 17:06:02 2014 -0700
@@ -175,7 +175,7 @@
 
     x265_param*        m_param;
     RateControl*       m_rateControl;
-    ThreadLocalData*   m_threadLocalData;
+    static ThreadLocalData*   m_threadLocalData;
 
     bool               m_bEnableRDOQ;
 
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/frameencoder.cpp	Mon Jun 23 17:06:02 2014 -0700
@@ -80,15 +80,17 @@
     stop();
 }
 
-bool FrameEncoder::init(Encoder *top, int numRows)
+bool FrameEncoder::init(Encoder *top, int numRows, int numCols)
 {
     bool ok = true;
 
     m_top = top;
     m_param = top->m_param;
     m_numRows = numRows;
+    m_numCols = numCols;
     m_filterRowDelay = (m_param->saoLcuBasedOptimization && m_param->saoLcuBoundary) ?
         2 : (m_param->bEnableSAO || m_param->bEnableLoopFilter ? 1 : 0);
+    m_filterRowDelayCus = m_filterRowDelay * numCols;
 
     m_rows = new CTURow[m_numRows];
     for (int i = 0; i < m_numRows; ++i)
@@ -505,7 +507,7 @@
             // Extend border after whole-frame SAO is finished
             for (int row = 0; row < m_numRows; row++)
             {
-                m_frameFilter.processRowPost(row);
+                m_frameFilter.processRowPost(row, 0);
             }
         }
 
@@ -845,7 +847,7 @@
     }
 
     // setup thread-local data
-    ThreadLocalData& tld = threadId >= 0 ? m_top->m_threadLocalData[threadId] : m_tld;
+    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);
@@ -856,7 +858,8 @@
     tld.m_cuCoder.m_log = &tld.m_cuCoder.m_sliceTypeLog[m_frame->getSlice()->getSliceType()];
 
     int64_t startTime = x265_mdate();
-    const uint32_t numCols = m_frame->getPicSym()->getFrameWidthInCU();
+    assert(m_frame->getPicSym()->getFrameWidthInCU() == m_numCols);
+    const uint32_t numCols = m_numCols;
     const uint32_t lineStartCUAddr = row * numCols;
     bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;
 
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/frameencoder.h
--- a/source/encoder/frameencoder.h	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/frameencoder.h	Mon Jun 23 17:06:02 2014 -0700
@@ -65,15 +65,15 @@
 
     void setThreadPool(ThreadPool *p);
 
-    bool init(Encoder *top, int numRows);
+    bool init(Encoder *top, int numRows, int numCols);
 
     void destroy();
 
     void processRowEncoder(int row, const int threadId);
 
-    void processRowFilter(int row)
+    void processRowFilter(int row, const int threadId)
     {
-        m_frameFilter.processRow(row);
+        m_frameFilter.processRow(row, threadId);
     }
 
     void enqueueRowEncoder(int row)
@@ -108,7 +108,7 @@
         }
         else
         {
-            processRowFilter(realRow);
+            processRowFilter(realRow, threadId);
 
             // NOTE: Active next row
             if (realRow != m_numRows - 1)
@@ -154,6 +154,7 @@
     bool                     m_threadActive;
 
     int                      m_numRows;
+    uint32_t                 m_numCols;
     CTURow*                  m_rows;
     TComSPS                  m_sps;
     TComPPS                  m_pps;
@@ -195,6 +196,7 @@
     Frame*                   m_frame;
 
     int                      m_filterRowDelay;
+    int                      m_filterRowDelayCus;
     Event                    m_completionEvent;
     int64_t                  m_totalTime;
     bool                     m_isReferenced;
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/framefilter.cpp
--- a/source/encoder/framefilter.cpp	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/framefilter.cpp	Mon Jun 23 17:06:02 2014 -0700
@@ -121,13 +121,15 @@
     }
 }
 
-void FrameFilter::processRow(int row)
+void FrameFilter::processRow(int row, const int threadId)
 {
     PPAScopeEvent(Thread_filterCU);
+    assert(threadId >= 0);
+    ThreadLocalData& tld = Encoder::m_threadLocalData[threadId];
 
     if (!m_param->bEnableLoopFilter && !m_param->bEnableSAO)
     {
-        processRowPost(row);
+        processRowPost(row, threadId);
         return;
     }
 
@@ -146,26 +148,23 @@
 
     if (m_param->bEnableLoopFilter)
     {
-        bool edgeFilter[256];    // NOTE: the maximum LCU 64x64 have 256 partitions
-        uint8_t blockingStrength[256];
-
         for (uint32_t col = 0; col < numCols; col++)
         {
             const uint32_t cuAddr = lineStartCUAddr + col;
             TComDataCU* cu = m_pic->getCU(cuAddr);
 
-            m_loopFilter.loopFilterCU(cu, EDGE_VER, edgeFilter, blockingStrength);
+            m_loopFilter.loopFilterCU(cu, EDGE_VER, tld.m_edgeFilter, tld.m_blockingStrength);
 
             if (col > 0)
             {
                 TComDataCU* cu_prev = m_pic->getCU(cuAddr - 1);
-                m_loopFilter.loopFilterCU(cu_prev, EDGE_HOR, edgeFilter, blockingStrength);
+                m_loopFilter.loopFilterCU(cu_prev, EDGE_HOR, tld.m_edgeFilter, tld.m_blockingStrength);
             }
         }
 
         {
             TComDataCU* cu_prev = m_pic->getCU(lineStartCUAddr + numCols - 1);
-            m_loopFilter.loopFilterCU(cu_prev, EDGE_HOR, edgeFilter, blockingStrength);
+            m_loopFilter.loopFilterCU(cu_prev, EDGE_HOR, tld.m_edgeFilter, tld.m_blockingStrength);
         }
     }
 
@@ -178,7 +177,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);
+            processSao(row - m_saoRowDelay, threadId);
         }
     }
 
@@ -190,7 +189,7 @@
 
     if (row > 0)
     {
-        processRowPost(row - 1);
+        processRowPost(row - 1, threadId);
     }
 
     if (row == m_numRows - 1)
@@ -201,15 +200,15 @@
 
             for (int i = m_numRows - m_saoRowDelay; i < m_numRows; i++)
             {
-                processSao(i);
+                processSao(i, threadId);
             }
         }
 
-        processRowPost(row);
+        processRowPost(row, threadId);
     }
 }
 
-void FrameFilter::processRowPost(int row)
+void FrameFilter::processRowPost(int row, const int /*threadId*/)
 {
     const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU();
     const uint32_t lineStartCUAddr = row * numCols;
@@ -502,7 +501,7 @@
     return ssim;
 }
 
-void FrameFilter::processSao(int row)
+void FrameFilter::processSao(int row, const int threadId)
 {
     const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU();
     const uint32_t lineStartCUAddr = row * numCols;
diff -r 12c1d8aaa8f5 -r efa48bc0245b source/encoder/framefilter.h
--- a/source/encoder/framefilter.h	Mon Jun 23 17:03:49 2014 -0700
+++ b/source/encoder/framefilter.h	Mon Jun 23 17:06:02 2014 -0700
@@ -50,9 +50,9 @@
 
     void start(Frame *pic);
 
-    void processRow(int row);
-    void processRowPost(int row);
-    void processSao(int row);
+    void processRow(int row, const int threadId);
+    void processRowPost(int row, const int threadId);
+    void processSao(int row, const int threadId);
 
 protected:
 



More information about the x265-devel mailing list