[x265] [PATCH 1 of 2] framepp: let sao use own context
Steve Borho
steve at borho.org
Sun Sep 8 00:37:37 CEST 2013
On Sat, Sep 7, 2013 at 12:12 AM, Min Chen <chenm003 at 163.com> wrote:
> # HG changeset patch
> # User Min Chen <chenm003 at 163.com>
> # Date 1378530725 -28800
> # Node ID 4bcc6891ab95a5e34c3e2b27137ffaaa224a9987
> # Parent 385c0b29be4fe35f78746574fd26608e125fd314
> framepp: let sao use own context
>
Thanks Min, with these two patches we can safely run with -F2 --no-wpp.
Next, can you make it safe to run with -F2 --no-sao --no-lft (right now it
deadlocks on the first B/P frame)?
> diff -r 385c0b29be4f -r 4bcc6891ab95
> source/Lib/TLibEncoder/TEncBinCoderCABAC.h
> --- a/source/Lib/TLibEncoder/TEncBinCoderCABAC.h Fri Sep 06
> 15:29:50 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncBinCoderCABAC.h Sat Sep 07
> 13:12:05 2013 +0800
> @@ -88,6 +88,7 @@
> void testAndWriteOut();
> void writeOut();
>
> +public:
> TComBitIf* m_pcTComBitIf;
> UInt m_uiLow;
> UInt m_uiRange;
> diff -r 385c0b29be4f -r 4bcc6891ab95 source/Lib/TLibEncoder/TEncSbac.h
> --- a/source/Lib/TLibEncoder/TEncSbac.h Fri Sep 06 15:29:50 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncSbac.h Sat Sep 07 13:12:05 2013 +0800
> @@ -121,7 +121,7 @@
>
> void codeDFSvlc(int /*iCode*/, const char* /*pSymbolName*/) {
> printf("Not supported in codeDFSvlc()\n"); assert(0); exit(1); }
>
> -protected:
> +public:
>
> TComBitIf* m_pcBitIf;
> TComSlice* m_pcSlice;
> diff -r 385c0b29be4f -r 4bcc6891ab95 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp Fri Sep 06 15:29:50 2013 -0500
> +++ b/source/encoder/frameencoder.cpp Sat Sep 07 13:12:05 2013 +0800
> @@ -106,7 +106,7 @@
> m_pool = NULL;
> }
>
> - m_frameFilter.init(top, numRows, getEntropyCoder(0),
> getRDGoOnSbacCoder(0));
> + m_frameFilter.init(top, numRows, getRDGoOnSbacCoder(0));
>
> // initialize SPS
> top->xInitSPS(&m_sps);
> diff -r 385c0b29be4f -r 4bcc6891ab95 source/encoder/framefilter.cpp
> --- a/source/encoder/framefilter.cpp Fri Sep 06 15:29:50 2013 -0500
> +++ b/source/encoder/framefilter.cpp Sat Sep 07 13:12:05 2013 +0800
> @@ -37,8 +37,6 @@
> , m_cfg(NULL)
> , m_pic(NULL)
> , active_lft(0)
> - , m_entropyCoder(NULL)
> - , m_rdGoOnSbacCoder(NULL)
> {}
>
> void FrameFilter::destroy()
> @@ -75,14 +73,13 @@
> return false;
> }
>
> -void FrameFilter::init(TEncTop *top, int numRows, TEncEntropy*
> entropyCoder, TEncSbac* rdGoOnSbacCoder)
> +void FrameFilter::init(TEncTop *top, int numRows, TEncSbac*
> rdGoOnSbacCoder)
> {
> m_cfg = top;
> m_numRows = numRows;
>
> - // NOTE: for sao only, DON'T use before first row finished
> - m_entropyCoder = entropyCoder;
> - m_rdGoOnSbacCoder = rdGoOnSbacCoder;
> + // NOTE: for sao only, I write this code because I want to exact
> match with HM's bug bitstream
> + m_rdGoOnSbacCoderRow0 = rdGoOnSbacCoder;
>
> if (top->param.bEnableLoopFilter)
> {
> @@ -103,6 +100,11 @@
> row_ready = -1;
> row_done = -1;
> active_lft = 0;
> +
> + m_rdGoOnSbacCoder.init(&m_rdGoOnBinCodersCABAC);
> + m_entropyCoder.setEntropyCoder(&m_rdGoOnSbacCoder, pic->getSlice());
> + m_entropyCoder.setBitstream(&m_bitCounter);
> +
> if (m_cfg->param.bEnableLoopFilter)
> {
> m_sao.resetStats();
> @@ -148,11 +150,12 @@
>
> // Called by worker threads
>
> - // NOTE: We are here only active both of loopfilter and sao, and row
> 0 always finished, so we can safe to reuse row[0]'s data
> + // NOTE: We are here only active both of loopfilter and sao, the row
> 0 always finished, so we can safe to copy row[0]'s data
> if (row == 0)
> {
> - // CHECK_ME: I think the SAO uses a temp Sbac only, so I always
> use [0], am I right?
> - m_sao.startSaoEnc(m_pic, m_entropyCoder, m_rdGoOnSbacCoder);
> + // NOTE: not need, seems HM's bug, I want to keep output exact
> matched.
> + m_rdGoOnBinCodersCABAC.m_fracBits =
> ((TEncBinCABACCounter*)((TEncSbac*)m_rdGoOnSbacCoderRow0->m_pcBinIf))->m_fracBits;
> + m_sao.startSaoEnc(m_pic, &m_entropyCoder, &m_rdGoOnSbacCoder);
> }
>
> const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU();
> diff -r 385c0b29be4f -r 4bcc6891ab95 source/encoder/framefilter.h
> --- a/source/encoder/framefilter.h Fri Sep 06 15:29:50 2013 -0500
> +++ b/source/encoder/framefilter.h Sat Sep 07 13:12:05 2013 +0800
> @@ -47,7 +47,7 @@
>
> virtual ~FrameFilter() {}
>
> - void init(TEncTop *top, int numRows, TEncEntropy* entropyCoder,
> TEncSbac* rdGoOnSbacCoder);
> + void init(TEncTop *top, int numRows, TEncSbac* rdGoOnSbacCoder);
>
> void destroy();
>
> @@ -71,10 +71,15 @@
>
> TComLoopFilter m_loopFilter;
> TEncSampleAdaptiveOffset m_sao;
> - TEncEntropy* m_entropyCoder;
> - TEncSbac* m_rdGoOnSbacCoder;
> int m_numRows;
>
> + // SAO
> + TEncEntropy m_entropyCoder;
> + TEncSbac m_rdGoOnSbacCoder;
> + TEncBinCABACCounter m_rdGoOnBinCodersCABAC;
> + TComBitCounter m_bitCounter;
> + TEncSbac* m_rdGoOnSbacCoderRow0; // for bitstream
> exact only, depends on HM's bug
> +
> // TODO: if you want thread priority logic, add col here
> volatile int row_ready;
> volatile int row_done;
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
--
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.videolan.org/private/x265-devel/attachments/20130907/2781afbd/attachment-0001.html>
More information about the x265-devel
mailing list