[x265] [PATCH] add API and implementation for Region of Interest(ROI)
Steve Borho
steve at borho.org
Thu Aug 6 17:58:58 CEST 2015
On 08/06, santhoshini at multicorewareinc.com wrote:
> # HG changeset patch
> # User Santhoshini Sekar<santhoshini at multicorewareinc.com>
> # Date 1438839704 -19800
> # Thu Aug 06 11:11:44 2015 +0530
> # Node ID fb00cab476a5d860e2fcddd51d764bdc3c8b96bc
> # Parent 377a996a8d74110f838ff2e3cef1c42781d6d730
> add API and implementation for Region of Interest(ROI)
>
> diff -r 377a996a8d74 -r fb00cab476a5 source/CMakeLists.txt
> --- a/source/CMakeLists.txt Wed Aug 05 15:09:14 2015 +0530
> +++ b/source/CMakeLists.txt Thu Aug 06 11:11:44 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 377a996a8d74 -r fb00cab476a5 source/common/frame.h
> --- a/source/common/frame.h Wed Aug 05 15:09:14 2015 +0530
> +++ b/source/common/frame.h Thu Aug 06 11:11:44 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 377a996a8d74 -r fb00cab476a5 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Wed Aug 05 15:09:14 2015 +0530
> +++ b/source/encoder/encoder.cpp Thu Aug 06 11:11:44 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;
> @@ -630,6 +631,10 @@
> * curEncoder is guaranteed to be idle at this point */
> if (!pass)
> frameEnc = m_lookahead->getDecidedPicture();
> +
> + if (pic_in && pic_in->quantOffsets_free)
> + pic_in->quantOffsets_free(pic_in->quantOffsets);
pic_in is still the frame that was just passed into the encoder, which
has probably not been analyzed by pre-lookahead yet. frameEnc is the
frame which has been output by the lookahead.
> if (frameEnc && !pass)
> {
> /* give this frame a FrameData instance before encoding */
> diff -r 377a996a8d74 -r fb00cab476a5 source/encoder/slicetype.cpp
> --- a/source/encoder/slicetype.cpp Wed Aug 05 15:09:14 2015 +0530
> +++ b/source/encoder/slicetype.cpp Thu Aug 06 11:11:44 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 377a996a8d74 -r fb00cab476a5 source/x265.h
> --- a/source/x265.h Wed Aug 05 15:09:14 2015 +0530
> +++ b/source/x265.h Thu Aug 06 11:11:44 2015 +0530
> @@ -205,6 +205,17 @@
> * 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;
> +
> + /* optional callback to free quant_offsets when used.
> + * Useful if one wants to use a different quant_offset array for each frame. */
> + void (*quantOffsets_free)(void*);
> +
> /* Frame level statistics */
> x265_frame_stats frameData;
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
--
Steve Borho
More information about the x265-devel
mailing list