# HG changeset patch # User Ashok Kumar Mishra <as...@multicorewareinc.com> # Date 1537871551 -19800 # Tue Sep 25 16:02:31 2018 +0530 # Node ID e5434c75d9ba2a327a06d74bbc93523cf5c81b80 # Parent bbad4e55b51a938dd4ce1375e0cb4dd4f59a5f27 Cleanup
diff -r bbad4e55b51a -r e5434c75d9ba source/common/frame.cpp --- a/source/common/frame.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/frame.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -94,7 +94,7 @@ CHECKED_MALLOC_ZERO(m_classifyCount, uint32_t, size); } - if (m_fencPic->create(param, !!m_param->bCopyPicToFrame) && m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode || !!param->bAQMotion, param->rc.qgSize)) + if (m_fencPic->create(param, !!m_param->bCopyPicToFrame) && m_lowres.create(param, m_fencPic, param->rc.qgSize)) { X265_CHECK((m_reconColCount == NULL), "m_reconColCount was initialized"); m_numRows = (m_fencPic->m_picHeight + param->maxCUSize - 1) / param->maxCUSize; @@ -103,11 +103,8 @@ if (quantOffsets) { - int32_t cuCount; - if (param->rc.qgSize == 8) - cuCount = m_lowres.maxBlocksInRowFullRes * m_lowres.maxBlocksInColFullRes; - else - cuCount = m_lowres.maxBlocksInRow * m_lowres.maxBlocksInCol; + int32_t cuCount = (param->rc.qgSize == 8) ? m_lowres.maxBlocksInRowFullRes * m_lowres.maxBlocksInColFullRes : + m_lowres.maxBlocksInRow * m_lowres.maxBlocksInCol; m_quantOffsets = new float[cuCount]; } return true; diff -r bbad4e55b51a -r e5434c75d9ba source/common/lowres.cpp --- a/source/common/lowres.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/lowres.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -27,10 +27,10 @@ using namespace X265_NS; -bool Lowres::create(PicYuv *origPic, int _bframes, bool bAQEnabled, uint32_t qgSize) +bool Lowres::create(x265_param* param, PicYuv *origPic, uint32_t qgSize) { isLowres = true; - bframes = _bframes; + bframes = param->bframes; width = origPic->m_picWidth / 2; lines = origPic->m_picHeight / 2; lumaStride = width + 2 * origPic->m_lumaMarginX; @@ -41,11 +41,7 @@ maxBlocksInRowFullRes = maxBlocksInRow * 2; maxBlocksInColFullRes = maxBlocksInCol * 2; int cuCount = maxBlocksInRow * maxBlocksInCol; - int cuCountFullRes; - if (qgSize == 8) - cuCountFullRes = maxBlocksInRowFullRes * maxBlocksInColFullRes; - else - cuCountFullRes = cuCount; + int cuCountFullRes = (qgSize > 8) ? cuCount : cuCount << 2; /* rounding the width to multiple of lowres CU size */ width = maxBlocksInRow * X265_LOWRES_CU_SIZE; @@ -53,7 +49,7 @@ size_t planesize = lumaStride * (lines + 2 * origPic->m_lumaMarginY); size_t padoffset = lumaStride * origPic->m_lumaMarginY + origPic->m_lumaMarginX; - if (bAQEnabled) + if (!!param->rc.aqMode) { CHECKED_MALLOC_ZERO(qpAqOffset, double, cuCountFullRes); CHECKED_MALLOC_ZERO(invQscaleFactor, int, cuCountFullRes); diff -r bbad4e55b51a -r e5434c75d9ba source/common/lowres.h --- a/source/common/lowres.h Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/lowres.h Tue Sep 25 16:02:31 2018 +0530 @@ -152,14 +152,12 @@ uint32_t* blockVariance; uint64_t wp_ssd[3]; // This is different than SSDY, this is sum(pixel^2) - sum(pixel)^2 for entire frame uint64_t wp_sum[3]; - uint64_t frameVariance; /* cutree intermediate data */ uint16_t* propagateCost; double weightedCostDelta[X265_BFRAME_MAX + 2]; ReferencePlanes weightedRef[X265_BFRAME_MAX + 2]; - - bool create(PicYuv *origPic, int _bframes, bool bAqEnabled, uint32_t qgSize); + bool create(x265_param* param, PicYuv *origPic, uint32_t qgSize); void destroy(); void init(PicYuv *origPic, int poc); }; diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/analysis.cpp --- a/source/encoder/analysis.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/analysis.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -3357,13 +3357,13 @@ primitives.chroma[m_csp].cu[sizeIdx].copy_pp(reconPic.getCbAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predU, predYuv.m_csize); - if (cu.m_cbf[2][0]) - { - bool reconPicAlign = (reconPic.m_cuOffsetC[cu.m_cuAddr] + reconPic.m_buOffsetC[absPartIdx]) % 64 == 0; - bool predValign = predYuv.getChromaAddrOffset(absPartIdx) % 64 == 0; - primitives.chroma[m_csp].cu[sizeIdx].add_ps[reconPicAlign && predValign && (reconPic.m_strideC % 64 == 0) && (predYuv.m_csize % 64 == 0) && - (resiYuv.m_csize % 64 == 0)](reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize); - } + if (cu.m_cbf[2][0]) + { + bool reconPicAlign = (reconPic.m_cuOffsetC[cu.m_cuAddr] + reconPic.m_buOffsetC[absPartIdx]) % 64 == 0; + bool predValign = predYuv.getChromaAddrOffset(absPartIdx) % 64 == 0; + primitives.chroma[m_csp].cu[sizeIdx].add_ps[reconPicAlign && predValign && (reconPic.m_strideC % 64 == 0) && (predYuv.m_csize % 64 == 0) && + (resiYuv.m_csize % 64 == 0)](reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize); + } else primitives.chroma[m_csp].cu[sizeIdx].copy_pp(reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, predYuv.m_csize); @@ -3568,18 +3568,12 @@ qp += distortionData->offset[ctu.m_cuAddr]; } - int loopIncr; - if (m_param->rc.qgSize == 8) - loopIncr = 8; - else - loopIncr = 16; + int loopIncr = (m_param->rc.qgSize == 8) ? 8 : 16; + /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */ bool isReferenced = IS_REFERENCED(m_frame); - double *qpoffs; - if (complexCheck) - qpoffs = m_frame->m_lowres.qpAqOffset; - else - qpoffs = (isReferenced && m_param->rc.cuTree) ? m_frame->m_lowres.qpCuTreeOffset : m_frame->m_lowres.qpAqOffset; + double *qpoffs = (isReferenced && m_param->rc.cuTree && !complexCheck) ? m_frame->m_lowres.qpCuTreeOffset : + m_frame->m_lowres.qpAqOffset; if (qpoffs) { uint32_t width = m_frame->m_fencPic->m_picWidth; @@ -3590,13 +3584,11 @@ uint32_t blockSize = m_param->maxCUSize >> cuGeom.depth; double qp_offset = 0; uint32_t cnt = 0; - uint32_t idx; - for (uint32_t block_yy = block_y; block_yy < block_y + blockSize && block_yy < height; block_yy += loopIncr) { for (uint32_t block_xx = block_x; block_xx < block_x + blockSize && block_xx < width; block_xx += loopIncr) { - idx = ((block_yy / loopIncr) * (maxCols)) + (block_xx / loopIncr); + uint32_t idx = ((block_yy / loopIncr) * (maxCols)) + (block_xx / loopIncr); qp_offset += qpoffs[idx]; cnt++; } @@ -3609,10 +3601,7 @@ int32_t offset = (int32_t)(qp_offset * 100 + .5); double threshold = (1 - ((x265_ADAPT_RD_STRENGTH - m_param->dynamicRd) * 0.5)); int32_t max_threshold = (int32_t)(threshold * 100 + .5); - if (offset < max_threshold) - return 1; - else - return 0; + return (offset < max_threshold); } } diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/ratecontrol.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -2803,12 +2803,8 @@ /* called to write out the rate control frame stats info in multipass encodes */ int RateControl::writeRateControlFrameStats(Frame* curFrame, RateControlEntry* rce) { - FrameData& curEncData = *curFrame->m_encData; - int ncu; - if (m_param->rc.qgSize == 8) - ncu = m_ncu * 4; - else - ncu = m_ncu; + FrameData& curEncData = *curFrame->m_encData; + int ncu = (m_param->rc.qgSize == 8) ? m_ncu * 4 : m_ncu; char cType = rce->sliceType == I_SLICE ? (curFrame->m_lowres.sliceType == X265_TYPE_IDR ? 'I' : 'i') : rce->sliceType == P_SLICE ? 'P' : IS_REFERENCED(curFrame) ? 'B' : 'b'; diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/slicetype.cpp --- a/source/encoder/slicetype.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/slicetype.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -150,20 +150,14 @@ curFrame->m_lowres.wp_sum[y] = 0; } - /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */ - int blockXY = 0; - int blockX = 0, blockY = 0; - double strength = 0.f; + /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */ if ((param->rc.aqMode == X265_AQ_NONE || param->rc.aqStrength == 0) || (param->rc.bStatRead && param->rc.cuTree && IS_REFERENCED(curFrame))) { - /* Need to init it anyways for CU tree */ - int cuCount = blockCount; - if (param->rc.aqMode && param->rc.aqStrength == 0) { if (quantOffsets) { - for (int cuxy = 0; cuxy < cuCount; cuxy++) + for (int cuxy = 0; cuxy < blockCount; cuxy++) { curFrame->m_lowres.qpCuTreeOffset[cuxy] = curFrame->m_lowres.qpAqOffset[cuxy] = quantOffsets[cuxy]; curFrame->m_lowres.invQscaleFactor[cuxy] = x265_exp2fix8(curFrame->m_lowres.qpCuTreeOffset[cuxy]); @@ -171,60 +165,55 @@ } else { - memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount * sizeof(double)); - memset(curFrame->m_lowres.qpAqOffset, 0, cuCount * sizeof(double)); - for (int cuxy = 0; cuxy < cuCount; cuxy++) - curFrame->m_lowres.invQscaleFactor[cuxy] = 256; + memset(curFrame->m_lowres.qpCuTreeOffset, 0, blockCount * sizeof(double)); + memset(curFrame->m_lowres.qpAqOffset, 0, blockCount * sizeof(double)); + for (int cuxy = 0; cuxy < blockCount; cuxy++) + curFrame->m_lowres.invQscaleFactor[cuxy] = 256; } } /* Need variance data for weighted prediction and dynamic refinement*/ if (param->bEnableWeightedPred || param->bEnableWeightedBiPred) - { - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + { + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); } } else { - blockXY = 0; - double avg_adj_pow2 = 0, avg_adj = 0, qp_adj = 0; - double bias_strength = 0.f; + int blockXY = 0; + double avg_adj_pow2 = 0.f, avg_adj = 0.f, qp_adj = 0.f; + double bias_strength = 0.f, strength = 0.f; if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE || param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED) { - double bit_depth_correction = 1.f / (1 << (2*(X265_DEPTH-8))); - curFrame->m_lowres.frameVariance = 0; - uint64_t rowVariance = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - { - rowVariance = 0; - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + double bit_depth_correction = 1.f / (1 << (2*(X265_DEPTH-8))); + + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + { + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { - uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); - rowVariance += energy; + uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); qp_adj = pow(energy * bit_depth_correction + 1, 0.1); curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj; avg_adj += qp_adj; avg_adj_pow2 += qp_adj * qp_adj; blockXY++; } - curFrame->m_lowres.frameVariance += (rowVariance / maxCol); } - curFrame->m_lowres.frameVariance /= maxRow; avg_adj /= blockCount; avg_adj_pow2 /= blockCount; strength = param->rc.aqStrength * avg_adj; - avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - (modeTwoConst)) / avg_adj; + avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - modeTwoConst) / avg_adj; bias_strength = param->rc.aqStrength; } else strength = param->rc.aqStrength * 1.0397f; blockXY = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) { - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED) { @@ -310,9 +299,9 @@ if (param->bDynamicRefine) { - blockXY = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + int blockXY = 0; + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { curFrame->m_lowres.blockVariance[blockXY] = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); blockXY++;
# HG changeset patch # User Ashok Kumar Mishra <as...@multicorewareinc.com> # Date 1537871551 -19800 # Tue Sep 25 16:02:31 2018 +0530 # Node ID e5434c75d9ba2a327a06d74bbc93523cf5c81b80 # Parent bbad4e55b51a938dd4ce1375e0cb4dd4f59a5f27 Cleanup diff -r bbad4e55b51a -r e5434c75d9ba source/common/frame.cpp --- a/source/common/frame.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/frame.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -94,7 +94,7 @@ CHECKED_MALLOC_ZERO(m_classifyCount, uint32_t, size); } - if (m_fencPic->create(param, !!m_param->bCopyPicToFrame) && m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode || !!param->bAQMotion, param->rc.qgSize)) + if (m_fencPic->create(param, !!m_param->bCopyPicToFrame) && m_lowres.create(param, m_fencPic, param->rc.qgSize)) { X265_CHECK((m_reconColCount == NULL), "m_reconColCount was initialized"); m_numRows = (m_fencPic->m_picHeight + param->maxCUSize - 1) / param->maxCUSize; @@ -103,11 +103,8 @@ if (quantOffsets) { - int32_t cuCount; - if (param->rc.qgSize == 8) - cuCount = m_lowres.maxBlocksInRowFullRes * m_lowres.maxBlocksInColFullRes; - else - cuCount = m_lowres.maxBlocksInRow * m_lowres.maxBlocksInCol; + int32_t cuCount = (param->rc.qgSize == 8) ? m_lowres.maxBlocksInRowFullRes * m_lowres.maxBlocksInColFullRes : + m_lowres.maxBlocksInRow * m_lowres.maxBlocksInCol; m_quantOffsets = new float[cuCount]; } return true; diff -r bbad4e55b51a -r e5434c75d9ba source/common/lowres.cpp --- a/source/common/lowres.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/lowres.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -27,10 +27,10 @@ using namespace X265_NS; -bool Lowres::create(PicYuv *origPic, int _bframes, bool bAQEnabled, uint32_t qgSize) +bool Lowres::create(x265_param* param, PicYuv *origPic, uint32_t qgSize) { isLowres = true; - bframes = _bframes; + bframes = param->bframes; width = origPic->m_picWidth / 2; lines = origPic->m_picHeight / 2; lumaStride = width + 2 * origPic->m_lumaMarginX; @@ -41,11 +41,7 @@ maxBlocksInRowFullRes = maxBlocksInRow * 2; maxBlocksInColFullRes = maxBlocksInCol * 2; int cuCount = maxBlocksInRow * maxBlocksInCol; - int cuCountFullRes; - if (qgSize == 8) - cuCountFullRes = maxBlocksInRowFullRes * maxBlocksInColFullRes; - else - cuCountFullRes = cuCount; + int cuCountFullRes = (qgSize > 8) ? cuCount : cuCount << 2; /* rounding the width to multiple of lowres CU size */ width = maxBlocksInRow * X265_LOWRES_CU_SIZE; @@ -53,7 +49,7 @@ size_t planesize = lumaStride * (lines + 2 * origPic->m_lumaMarginY); size_t padoffset = lumaStride * origPic->m_lumaMarginY + origPic->m_lumaMarginX; - if (bAQEnabled) + if (!!param->rc.aqMode) { CHECKED_MALLOC_ZERO(qpAqOffset, double, cuCountFullRes); CHECKED_MALLOC_ZERO(invQscaleFactor, int, cuCountFullRes); diff -r bbad4e55b51a -r e5434c75d9ba source/common/lowres.h --- a/source/common/lowres.h Tue Sep 18 16:34:04 2018 +0530 +++ b/source/common/lowres.h Tue Sep 25 16:02:31 2018 +0530 @@ -152,14 +152,12 @@ uint32_t* blockVariance; uint64_t wp_ssd[3]; // This is different than SSDY, this is sum(pixel^2) - sum(pixel)^2 for entire frame uint64_t wp_sum[3]; - uint64_t frameVariance; /* cutree intermediate data */ uint16_t* propagateCost; double weightedCostDelta[X265_BFRAME_MAX + 2]; ReferencePlanes weightedRef[X265_BFRAME_MAX + 2]; - - bool create(PicYuv *origPic, int _bframes, bool bAqEnabled, uint32_t qgSize); + bool create(x265_param* param, PicYuv *origPic, uint32_t qgSize); void destroy(); void init(PicYuv *origPic, int poc); }; diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/analysis.cpp --- a/source/encoder/analysis.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/analysis.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -3357,13 +3357,13 @@ primitives.chroma[m_csp].cu[sizeIdx].copy_pp(reconPic.getCbAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predU, predYuv.m_csize); - if (cu.m_cbf[2][0]) - { - bool reconPicAlign = (reconPic.m_cuOffsetC[cu.m_cuAddr] + reconPic.m_buOffsetC[absPartIdx]) % 64 == 0; - bool predValign = predYuv.getChromaAddrOffset(absPartIdx) % 64 == 0; - primitives.chroma[m_csp].cu[sizeIdx].add_ps[reconPicAlign && predValign && (reconPic.m_strideC % 64 == 0) && (predYuv.m_csize % 64 == 0) && - (resiYuv.m_csize % 64 == 0)](reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize); - } + if (cu.m_cbf[2][0]) + { + bool reconPicAlign = (reconPic.m_cuOffsetC[cu.m_cuAddr] + reconPic.m_buOffsetC[absPartIdx]) % 64 == 0; + bool predValign = predYuv.getChromaAddrOffset(absPartIdx) % 64 == 0; + primitives.chroma[m_csp].cu[sizeIdx].add_ps[reconPicAlign && predValign && (reconPic.m_strideC % 64 == 0) && (predYuv.m_csize % 64 == 0) && + (resiYuv.m_csize % 64 == 0)](reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize); + } else primitives.chroma[m_csp].cu[sizeIdx].copy_pp(reconPic.getCrAddr(cu.m_cuAddr, absPartIdx), reconPic.m_strideC, predV, predYuv.m_csize); @@ -3568,18 +3568,12 @@ qp += distortionData->offset[ctu.m_cuAddr]; } - int loopIncr; - if (m_param->rc.qgSize == 8) - loopIncr = 8; - else - loopIncr = 16; + int loopIncr = (m_param->rc.qgSize == 8) ? 8 : 16; + /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */ bool isReferenced = IS_REFERENCED(m_frame); - double *qpoffs; - if (complexCheck) - qpoffs = m_frame->m_lowres.qpAqOffset; - else - qpoffs = (isReferenced && m_param->rc.cuTree) ? m_frame->m_lowres.qpCuTreeOffset : m_frame->m_lowres.qpAqOffset; + double *qpoffs = (isReferenced && m_param->rc.cuTree && !complexCheck) ? m_frame->m_lowres.qpCuTreeOffset : + m_frame->m_lowres.qpAqOffset; if (qpoffs) { uint32_t width = m_frame->m_fencPic->m_picWidth; @@ -3590,13 +3584,11 @@ uint32_t blockSize = m_param->maxCUSize >> cuGeom.depth; double qp_offset = 0; uint32_t cnt = 0; - uint32_t idx; - for (uint32_t block_yy = block_y; block_yy < block_y + blockSize && block_yy < height; block_yy += loopIncr) { for (uint32_t block_xx = block_x; block_xx < block_x + blockSize && block_xx < width; block_xx += loopIncr) { - idx = ((block_yy / loopIncr) * (maxCols)) + (block_xx / loopIncr); + uint32_t idx = ((block_yy / loopIncr) * (maxCols)) + (block_xx / loopIncr); qp_offset += qpoffs[idx]; cnt++; } @@ -3609,10 +3601,7 @@ int32_t offset = (int32_t)(qp_offset * 100 + .5); double threshold = (1 - ((x265_ADAPT_RD_STRENGTH - m_param->dynamicRd) * 0.5)); int32_t max_threshold = (int32_t)(threshold * 100 + .5); - if (offset < max_threshold) - return 1; - else - return 0; + return (offset < max_threshold); } } diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/ratecontrol.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -2803,12 +2803,8 @@ /* called to write out the rate control frame stats info in multipass encodes */ int RateControl::writeRateControlFrameStats(Frame* curFrame, RateControlEntry* rce) { - FrameData& curEncData = *curFrame->m_encData; - int ncu; - if (m_param->rc.qgSize == 8) - ncu = m_ncu * 4; - else - ncu = m_ncu; + FrameData& curEncData = *curFrame->m_encData; + int ncu = (m_param->rc.qgSize == 8) ? m_ncu * 4 : m_ncu; char cType = rce->sliceType == I_SLICE ? (curFrame->m_lowres.sliceType == X265_TYPE_IDR ? 'I' : 'i') : rce->sliceType == P_SLICE ? 'P' : IS_REFERENCED(curFrame) ? 'B' : 'b'; diff -r bbad4e55b51a -r e5434c75d9ba source/encoder/slicetype.cpp --- a/source/encoder/slicetype.cpp Tue Sep 18 16:34:04 2018 +0530 +++ b/source/encoder/slicetype.cpp Tue Sep 25 16:02:31 2018 +0530 @@ -150,20 +150,14 @@ curFrame->m_lowres.wp_sum[y] = 0; } - /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */ - int blockXY = 0; - int blockX = 0, blockY = 0; - double strength = 0.f; + /* Calculate Qp offset for each 16x16 or 8x8 block in the frame */ if ((param->rc.aqMode == X265_AQ_NONE || param->rc.aqStrength == 0) || (param->rc.bStatRead && param->rc.cuTree && IS_REFERENCED(curFrame))) { - /* Need to init it anyways for CU tree */ - int cuCount = blockCount; - if (param->rc.aqMode && param->rc.aqStrength == 0) { if (quantOffsets) { - for (int cuxy = 0; cuxy < cuCount; cuxy++) + for (int cuxy = 0; cuxy < blockCount; cuxy++) { curFrame->m_lowres.qpCuTreeOffset[cuxy] = curFrame->m_lowres.qpAqOffset[cuxy] = quantOffsets[cuxy]; curFrame->m_lowres.invQscaleFactor[cuxy] = x265_exp2fix8(curFrame->m_lowres.qpCuTreeOffset[cuxy]); @@ -171,60 +165,55 @@ } else { - memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount * sizeof(double)); - memset(curFrame->m_lowres.qpAqOffset, 0, cuCount * sizeof(double)); - for (int cuxy = 0; cuxy < cuCount; cuxy++) - curFrame->m_lowres.invQscaleFactor[cuxy] = 256; + memset(curFrame->m_lowres.qpCuTreeOffset, 0, blockCount * sizeof(double)); + memset(curFrame->m_lowres.qpAqOffset, 0, blockCount * sizeof(double)); + for (int cuxy = 0; cuxy < blockCount; cuxy++) + curFrame->m_lowres.invQscaleFactor[cuxy] = 256; } } /* Need variance data for weighted prediction and dynamic refinement*/ if (param->bEnableWeightedPred || param->bEnableWeightedBiPred) - { - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + { + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); } } else { - blockXY = 0; - double avg_adj_pow2 = 0, avg_adj = 0, qp_adj = 0; - double bias_strength = 0.f; + int blockXY = 0; + double avg_adj_pow2 = 0.f, avg_adj = 0.f, qp_adj = 0.f; + double bias_strength = 0.f, strength = 0.f; if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE || param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED) { - double bit_depth_correction = 1.f / (1 << (2*(X265_DEPTH-8))); - curFrame->m_lowres.frameVariance = 0; - uint64_t rowVariance = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - { - rowVariance = 0; - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + double bit_depth_correction = 1.f / (1 << (2*(X265_DEPTH-8))); + + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + { + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { - uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); - rowVariance += energy; + uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); qp_adj = pow(energy * bit_depth_correction + 1, 0.1); curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj; avg_adj += qp_adj; avg_adj_pow2 += qp_adj * qp_adj; blockXY++; } - curFrame->m_lowres.frameVariance += (rowVariance / maxCol); } - curFrame->m_lowres.frameVariance /= maxRow; avg_adj /= blockCount; avg_adj_pow2 /= blockCount; strength = param->rc.aqStrength * avg_adj; - avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - (modeTwoConst)) / avg_adj; + avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - modeTwoConst) / avg_adj; bias_strength = param->rc.aqStrength; } else strength = param->rc.aqStrength * 1.0397f; blockXY = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) { - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED) { @@ -310,9 +299,9 @@ if (param->bDynamicRefine) { - blockXY = 0; - for (blockY = 0; blockY < maxRow; blockY += loopIncr) - for (blockX = 0; blockX < maxCol; blockX += loopIncr) + int blockXY = 0; + for (int blockY = 0; blockY < maxRow; blockY += loopIncr) + for (int blockX = 0; blockX < maxCol; blockX += loopIncr) { curFrame->m_lowres.blockVariance[blockXY] = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize); blockXY++;
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel