On 08/05, santhosh...@multicorewareinc.com wrote: > # HG changeset patch > # User Santhoshini Sekar<santhosh...@multicorewareinc.com> > # Date 1438679012 -19800 > # Tue Aug 04 14:33:32 2015 +0530 > # Node ID 14abf498e49b0963fb1c0db19e39aa5de18560a5 > # Parent 3fa7f6838098854de79d3800b2d775dabaf45705 > add API and implementation for Region of Interest(ROI) > > diff -r 3fa7f6838098 -r 14abf498e49b source/CMakeLists.txt > --- a/source/CMakeLists.txt Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/CMakeLists.txt Tue Aug 04 14:33:32 2015 +0530 > @@ -30,7 +30,7 @@ > mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD) > > # X265_BUILD must be incremented each time the public API is changed > -set(X265_BUILD 68) > +set(X265_BUILD 69) > configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" > "${PROJECT_BINARY_DIR}/x265.def") > configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" > diff -r 3fa7f6838098 -r 14abf498e49b source/common/frame.h > --- a/source/common/frame.h Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/common/frame.h Tue Aug 04 14:33:32 2015 +0530 > @@ -59,6 +59,8 @@ > bool m_lowresInit; // lowres init complete > (pre-analysis) > bool m_bChromaExtended; // orig chroma planes > motion extended for weight analysis > > + float* m_quantOffsets; // points to quantOffsets > in x265_picture > + > /* Frame Parallelism - notification between FrameEncoders of available > motion reference rows */ > ThreadSafeInteger m_reconRowCount; // count of CTU rows > completely reconstructed and extended for motion reference > volatile uint32_t m_countRefEncoders; // count of FrameEncoder > threads monitoring m_reconRowCount > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/api.cpp > --- a/source/encoder/api.cpp Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/encoder/api.cpp Tue Aug 04 14:33:32 2015 +0530 > @@ -281,6 +281,8 @@ > > void x265_picture_free(x265_picture *p) > { > + if (p->quantOffsets) > + X265_FREE(p->quantOffsets);
I'm not sure this is any better. For us to use X265_FREE the user would need to use X265_ALLOC and we do not make this function public. Plus, a user might re-use an x265_picture instance, so this would leak buffers. I think we still need the user-supplied free function pointer, but we need to defer calling it until after we're certain the offset buffer is no longer needed. If it is only read by pre-lookahead, then we can call the free function as we take the picture off of the lookahead output queue and pass it to a frame encoder. > return x265_free(p); > } > > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/encoder.cpp > --- a/source/encoder/encoder.cpp Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/encoder/encoder.cpp Tue Aug 04 14:33:32 2015 +0530 > @@ -465,6 +465,7 @@ > inFrame->m_pts = pic_in->pts; > inFrame->m_forceqp = pic_in->forceqp; > inFrame->m_param = m_reconfigured ? m_latestParam : m_param; > + inFrame->m_quantOffsets = pic_in->quantOffsets; > > if (m_pocLast == 0) > m_firstPts = inFrame->m_pts; > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/slicetype.cpp > --- a/source/encoder/slicetype.cpp Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/encoder/slicetype.cpp Tue Aug 04 14:33:32 2015 +0530 > @@ -96,6 +96,7 @@ > int maxRow = curFrame->m_fencPic->m_picHeight; > int blockCount = curFrame->m_lowres.maxBlocksInRow * > curFrame->m_lowres.maxBlocksInCol; > > + float* quantOffsets = curFrame->m_quantOffsets; > for (int y = 0; y < 3; y++) > { > curFrame->m_lowres.wp_ssd[y] = 0; > @@ -113,10 +114,21 @@ > > if (param->rc.aqMode && param->rc.aqStrength == 0) > { > - 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; > + if (quantOffsets) > + { > + for (int cuxy = 0; cuxy < cuCount; 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]); > + } > + } > + 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; > + } > } > > /* Need variance data for weighted prediction */ > @@ -177,6 +189,8 @@ > uint32_t energy = acEnergyCu(curFrame, blockX, blockY, > param->internalCsp); > qp_adj = strength * (X265_LOG2(X265_MAX(energy, 1)) - > (14.427f + 2 * (X265_DEPTH - 8))); > } > + if (quantOffsets) > + qp_adj += quantOffsets[blockXY]; > curFrame->m_lowres.qpAqOffset[blockXY] = qp_adj; > curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj; > curFrame->m_lowres.invQscaleFactor[blockXY] = > x265_exp2fix8(qp_adj); > diff -r 3fa7f6838098 -r 14abf498e49b source/x265.h > --- a/source/x265.h Mon Aug 03 14:56:21 2015 -0500 > +++ b/source/x265.h Tue Aug 04 14:33:32 2015 +0530 > @@ -205,6 +205,13 @@ > * this data structure */ > x265_analysis_data analysisData; > > + /* An array of quantizer offsets to be applied to this image during > encoding. > + * These are added on top of the decisions made by rateControl. > + * Adaptive quantization must be enabled to use this feature. These > quantizer > + * offsets should be given for each 16x16 block. Behavior if quant > + * offsets differ between encoding passes is undefined. */ > + float *quantOffsets; > + > /* Frame level statistics */ > x265_frame_stats frameData; the rest looks ok -- Steve Borho _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel