# HG changeset patch # User Deepthi Nandakumar <deep...@multicorewareinc.com> # Date 1457090985 -19800 # Fri Mar 04 16:59:45 2016 +0530 # Node ID 88aebc166fa8e16f91d5f0acce77690003be9d91 # Parent 5cded27462444bee633d687151cf32299353b28b encoder: handle m_latestParam and m_param correctly
During a reconfigure, m_latestParam and m_param will be different. Once all FEs have been reconfigured, the Encoder considers its reconfigure complete. diff -r 5cded2746244 -r 88aebc166fa8 source/encoder/api.cpp --- a/source/encoder/api.cpp Fri Mar 04 16:33:57 2016 +0530 +++ b/source/encoder/api.cpp Fri Mar 04 16:59:45 2016 +0530 @@ -166,6 +166,8 @@ x265_param save; Encoder* encoder = static_cast<Encoder*>(enc); + if (encoder->m_reconfigure) /* Reconfigure in progress */ + return -1; memcpy(&save, encoder->m_latestParam, sizeof(x265_param)); int ret = encoder->reconfigureParam(encoder->m_latestParam, param_in); if (ret) @@ -173,7 +175,7 @@ memcpy(encoder->m_latestParam, &save, sizeof(x265_param)); else { - encoder->m_reconfigured = true; + encoder->m_reconfigure = true; x265_print_reconfigured_params(&save, encoder->m_latestParam); } return ret; diff -r 5cded2746244 -r 88aebc166fa8 source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Fri Mar 04 16:33:57 2016 +0530 +++ b/source/encoder/encoder.cpp Fri Mar 04 16:59:45 2016 +0530 @@ -55,7 +55,7 @@ Encoder::Encoder() { m_aborted = false; - m_reconfigured = false; + m_reconfigure = false; m_encodedFrameNum = 0; m_pocLast = -1; m_curEncoder = 0; @@ -528,7 +528,7 @@ if (m_dpb->m_freeList.empty()) { inFrame = new Frame; - x265_param* p = m_reconfigured? m_latestParam : m_param; + x265_param* p = m_reconfigure ? m_latestParam : m_param; if (inFrame->create(p, pic_in->quantOffsets)) { /* the first PicYuv created is asked to generate the CU and block unit offset @@ -594,7 +594,7 @@ inFrame->m_userData = pic_in->userData; inFrame->m_pts = pic_in->pts; inFrame->m_forceqp = pic_in->forceqp; - inFrame->m_param = m_reconfigured ? m_latestParam : m_param; + inFrame->m_param = m_reconfigure ? m_latestParam : m_param; if (pic_in->quantOffsets != NULL) { @@ -818,16 +818,36 @@ frameEnc = m_lookahead->getDecidedPicture(); if (frameEnc && !pass) { + if (curEncoder->m_reconfigure) + { + /* One round robin cycle of FE reconfigure is complete */ + if (m_reconfigure) + { + /* Safe to copy m_latestParam to Encoder::m_param, encoder reconfigure complete */ + memcpy (m_param, m_latestParam, sizeof(x265_param)); + m_reconfigure = false; + } + /* Reset current FEs to default */ + curEncoder->m_param = m_param; + curEncoder->m_reconfigure = false; + } + else + { + /* Initiate reconfigure for this FE if necessary */ + curEncoder->m_param = m_reconfigure ? m_latestParam : m_param; + curEncoder->m_reconfigure = m_reconfigure; + } /* give this frame a FrameData instance before encoding */ if (m_dpb->m_frameDataFreeList) { frameEnc->m_encData = m_dpb->m_frameDataFreeList; m_dpb->m_frameDataFreeList = m_dpb->m_frameDataFreeList->m_freeListNext; frameEnc->reinit(m_sps); + frameEnc->m_param = m_reconfigure ? m_latestParam : m_param; } else { - frameEnc->allocEncodeData(m_param, m_sps); + frameEnc->allocEncodeData(m_reconfigure ? m_latestParam : m_param, m_sps); Slice* slice = frameEnc->m_encData->m_slice; slice->m_sps = &m_sps; slice->m_pps = &m_pps; diff -r 5cded2746244 -r 88aebc166fa8 source/encoder/encoder.h --- a/source/encoder/encoder.h Fri Mar 04 16:33:57 2016 +0530 +++ b/source/encoder/encoder.h Fri Mar 04 16:59:45 2016 +0530 @@ -111,7 +111,7 @@ Frame* m_exportedPic; FILE* m_analysisFile; x265_param* m_param; - x265_param* m_latestParam; + x265_param* m_latestParam; // Holds latest param during a reconfigure RateControl* m_rateControl; Lookahead* m_lookahead; @@ -130,7 +130,7 @@ bool m_emitCLLSEI; bool m_bZeroLatency; // x265_encoder_encode() returns NALs for the input picture, zero lag bool m_aborted; // fatal error detected - bool m_reconfigured; // reconfigure of encoder detected + bool m_reconfigure; // Encoder reconfigure in progress /* Begin intra refresh when one not in progress or else begin one as soon as the current * one is done. Requires bIntraRefresh to be set.*/ diff -r 5cded2746244 -r 88aebc166fa8 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Fri Mar 04 16:33:57 2016 +0530 +++ b/source/encoder/frameencoder.cpp Fri Mar 04 16:59:45 2016 +0530 @@ -41,6 +41,7 @@ FrameEncoder::FrameEncoder() { m_prevOutputTime = x265_mdate(); + m_reconfigure = false; m_isFrameEncoder = true; m_threadActive = true; m_slicetypeWaitTime = 0; @@ -104,6 +105,7 @@ m_param = top->m_param; m_numRows = numRows; m_numCols = numCols; + m_reconfigure = false; m_filterRowDelay = ((m_param->bEnableSAO && m_param->bSaoNonDeblocked) || (!m_param->bEnableLoopFilter && m_param->bEnableSAO)) ? 2 : (m_param->bEnableSAO || m_param->bEnableLoopFilter ? 1 : 0); diff -r 5cded2746244 -r 88aebc166fa8 source/encoder/frameencoder.h --- a/source/encoder/frameencoder.h Fri Mar 04 16:33:57 2016 +0530 +++ b/source/encoder/frameencoder.h Fri Mar 04 16:59:45 2016 +0530 @@ -129,7 +129,7 @@ Event m_done; Event m_completionEvent; int m_localTldIdx; - + bool m_reconfigure; /* reconfigure in progress */ volatile bool m_threadActive; volatile bool m_bAllRowsStop; volatile int m_completionCount; -- Deepthi Nandakumar Engineering Manager, x265 Multicoreware, Inc
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel