# HG changeset patch # User Aarthi Thirumalai<aarthi at multicorewareinc.com> # Date 1405661493 -19800 # Fri Jul 18 11:01:33 2014 +0530 # Node ID cc4d25a063853f2a79fffa2757f3d606011ee0c9 # Parent 382e20845179925356c178c0ff738410f2d0648e rc: generate cutree offsets for 2nd pass from stats
diff -r 382e20845179 -r cc4d25a06385 source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Fri Jul 18 17:22:24 2014 +0530 +++ b/source/encoder/encoder.cpp Fri Jul 18 11:01:33 2014 +0530 @@ -309,7 +309,18 @@ ATOMIC_INC(&pic->m_countRefEncoders); bool bEnableWP = m_param->bEnableWeightedPred || m_param->bEnableWeightedBiPred; if (m_param->rc.aqMode || bEnableWP) - m_rateControl->calcAdaptiveQuantFrame(pic); + { + if (m_param->rc.cuTree && m_param->rc.bStatRead) + { + if (!m_rateControl->cuTreeReadFor2Pass(pic)) + { + m_aborted = 1; + return -1; + } + } + else + m_rateControl->calcAdaptiveQuantFrame(pic); + } m_lookahead->addPicture(pic, pic_in->sliceType); m_numDelayedPic++; } diff -r 382e20845179 -r cc4d25a06385 source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cpp Fri Jul 18 17:22:24 2014 +0530 +++ b/source/encoder/ratecontrol.cpp Fri Jul 18 11:01:33 2014 +0530 @@ -1272,6 +1272,47 @@ return adjusted; } +bool RateControl::cuTreeReadFor2Pass(Frame* frame) +{ + uint8_t sliceTypeActual = m_rce2Pass[frame->m_POC].sliceType; + + if (m_rce2Pass[frame->m_POC].keptAsRef) + { + uint8_t type; + if (m_cuTreeStats.qpBufPos < 0) + { + do + { + m_cuTreeStats.qpBufPos++; + + if (!fread(&type, 1, 1, m_cutreeStatFileIn)) + goto fail; + if (fread(m_cuTreeStats.qpBuffer[m_cuTreeStats.qpBufPos], sizeof(uint16_t), m_ncu, m_cutreeStatFileIn) != m_ncu) + goto fail; + + if (type != sliceTypeActual && m_cuTreeStats.qpBufPos == 1) + { + x265_log(m_param, X265_LOG_ERROR, "CU-tree frametype %d doesn't match actual frametype %d.\n", type, sliceTypeActual); + return false; + } + } while(type != sliceTypeActual); + } + for (int i = 0; i < m_ncu; i++) + { + int16_t qpFix8 = m_cuTreeStats.qpBuffer[m_cuTreeStats.qpBufPos][i]; + frame->m_lowres.qpCuTreeOffset[i] = (double)(qpFix8) / 256.0; + frame->m_lowres.invQscaleFactor[i] = x265_exp2fix8(frame->m_lowres.qpCuTreeOffset[i]); + } + m_cuTreeStats.qpBufPos--; + } + else + calcAdaptiveQuantFrame(frame); + return true; +fail: + x265_log(m_param, X265_LOG_ERROR, "Incomplete CU-tree stats file.\n"); + return false; +} + double RateControl::rateEstimateQscale(Frame* pic, RateControlEntry *rce) { double q; diff -r 382e20845179 -r cc4d25a06385 source/encoder/ratecontrol.h --- a/source/encoder/ratecontrol.h Fri Jul 18 17:22:24 2014 +0530 +++ b/source/encoder/ratecontrol.h Fri Jul 18 11:01:33 2014 +0530 @@ -206,6 +206,7 @@ bool init(const SPS* sps); void initHRD(SPS* sps); int rateControlSliceType(int frameNum); + bool cuTreeReadFor2Pass(Frame* frame); protected: static const double s_amortizeFraction; _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel