[x265] [PATCH 1 of 4] add function to copy analysis data after z scan
Pradeep Ramachandran
pradeep at multicorewareinc.com
Wed Nov 8 06:42:21 CET 2017
On Tue, Nov 7, 2017 at 12:22 PM, <santhoshini at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Santhoshini Sekar <santhoshini at multicorewareinc.com>
> # Date 1502258938 -19800
> # Wed Aug 09 11:38:58 2017 +0530
> # Node ID dea515c3180ab2e45c1682bd258683fdf2f16ae6
> # Parent 8a121d8cc134cc348466e5d63a6a02d1531d8055
> add function to copy analysis data after z scan
>
Pushed full series to default branch. Thanks!
>
> The pointer to x265_analysis_data sent as parameter to this function has
> data for
> 16x16 blocks stored continuously. To store this data in bigger CTU
> sizes(32x32 or 64x64) we
> need to perform z-scan of constituent 16x16 blocks before copying.
>
> diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp
> +++ b/source/encoder/encoder.cpp
> @@ -487,6 +487,95 @@
> return 0;
> }
>
> +int Encoder::setAnalysisDataAfterZScan(x265_analysis_data
> *analysis_data, Frame* curFrame)
> +{
> + int mbImageWidth, mbImageHeight;
> + mbImageWidth = (curFrame->m_fencPic->m_picWidth + 16 - 1) >> 4;
> //AVC block sizes
> + mbImageHeight = (curFrame->m_fencPic->m_picHeight + 16 - 1) >> 4;
> + if (analysis_data->sliceType == X265_TYPE_IDR ||
> analysis_data->sliceType == X265_TYPE_I)
> + {
> + curFrame->m_analysisData.sliceType = X265_TYPE_I;
> + if (m_param->analysisReuseLevel < 7)
> + return -1;
> + curFrame->m_analysisData.numPartitions =
> m_param->num4x4Partitions;
> + int num16x16inCUWidth = m_param->maxCUSize >> 4;
> + uint32_t ctuAddr, offset, cuPos;
> + analysis_intra_data * intraData = (analysis_intra_data
> *)curFrame->m_analysisData.intraData;
> + analysis_intra_data * srcIntraData = (analysis_intra_data
> *)analysis_data->intraData;
> + for (int i = 0; i < mbImageHeight; i++)
> + {
> + for (int j = 0; j < mbImageWidth; j++)
> + {
> + int mbIndex = j + i * mbImageWidth;
> + ctuAddr = (j / num16x16inCUWidth + ((i /
> num16x16inCUWidth) * (mbImageWidth / num16x16inCUWidth)));
> + offset = ((i % num16x16inCUWidth) << 5) + ((j %
> num16x16inCUWidth) << 4);
> + if ((j % 4 >= 2) && m_param->maxCUSize == 64)
> + offset += (2 * 16);
> + if ((i % 4 >= 2) && m_param->maxCUSize == 64)
> + offset += (2 * 32);
> + cuPos = ctuAddr * curFrame->m_analysisData.numPartitions
> + offset;
> + memcpy(&(intraData)->depth[cuPos],
> &(srcIntraData)->depth[mbIndex * 16], 16);
> + memcpy(&(intraData)->chromaModes[cuPos],
> &(srcIntraData)->chromaModes[mbIndex * 16], 16);
> + memcpy(&(intraData)->partSizes[cuPos],
> &(srcIntraData)->partSizes[mbIndex * 16], 16);
> + memcpy(&(intraData)->partSizes[cuPos],
> &(srcIntraData)->partSizes[mbIndex * 16], 16);
> + }
> + }
> + memcpy(&(intraData)->modes, (srcIntraData)->modes,
> curFrame->m_analysisData.numPartitions * analysis_data->numCUsInFrame);
> + }
> + else
> + {
> + uint32_t numDir = analysis_data->sliceType == X265_TYPE_P ? 1 : 2;
> + if (m_param->analysisReuseLevel < 7)
> + return -1;
> + curFrame->m_analysisData.numPartitions =
> m_param->num4x4Partitions;
> + int num16x16inCUWidth = m_param->maxCUSize >> 4;
> + uint32_t ctuAddr, offset, cuPos;
> + analysis_inter_data * interData = (analysis_inter_data
> *)curFrame->m_analysisData.interData;
> + analysis_inter_data * srcInterData = (analysis_inter_data*)
> analysis_data->interData;
> + for (int i = 0; i < mbImageHeight; i++)
> + {
> + for (int j = 0; j < mbImageWidth; j++)
> + {
> + int mbIndex = j + i * mbImageWidth;
> + ctuAddr = (j / num16x16inCUWidth + ((i /
> num16x16inCUWidth) * (mbImageWidth / num16x16inCUWidth)));
> + offset = ((i % num16x16inCUWidth) << 5) + ((j %
> num16x16inCUWidth) << 4);
> + if ((j % 4 >= 2) && m_param->maxCUSize == 64)
> + offset += (2 * 16);
> + if ((i % 4 >= 2) && m_param->maxCUSize == 64)
> + offset += (2 * 32);
> + cuPos = ctuAddr * curFrame->m_analysisData.numPartitions
> + offset;
> + memcpy(&(interData)->depth[cuPos],
> &(srcInterData)->depth[mbIndex * 16], 16);
> + memcpy(&(interData)->modes[cuPos],
> &(srcInterData)->modes[mbIndex * 16], 16);
> +
> + memcpy(&(interData)->partSize[cuPos],
> &(srcInterData)->partSize[mbIndex * 16], 16);
> +
> + int bytes = curFrame->m_analysisData.numPartitions >>
> ((srcInterData)->depth[mbIndex * 16] * 2);
> + int cuCount = 1;
> + if (bytes < 16)
> + cuCount = 4;
> + for (int cuI = 0; cuI < cuCount; cuI++)
> + {
> + int numPU = nbPartsTable[(srcInterData)->partSize[mbIndex
> * 16 + cuI * bytes]];
> + for (int pu = 0; pu < numPU; pu++)
> + {
> + int cuOffset = cuI * bytes + pu;
> + (interData)->mergeFlag[cuPos + cuOffset] =
> (srcInterData)->mergeFlag[(mbIndex * 16) + cuOffset];
> +
> + (interData)->interDir[cuPos + cuOffset] =
> (srcInterData)->interDir[(mbIndex * 16) + cuOffset];
> + for (uint32_t k = 0; k < numDir; k++)
> + {
> + (interData)->mvpIdx[k][cuPos + cuOffset] =
> (srcInterData)->mvpIdx[k][(mbIndex * 16) + cuOffset];
> + (interData)->refIdx[k][cuPos + cuOffset] =
> (srcInterData)->refIdx[k][(mbIndex * 16) + cuOffset];
> + memcpy(&(interData)->mv[k][cuPos +
> cuOffset], &(srcInterData)->mv[k][(mbIndex * 16) + cuOffset], sizeof(MV));
> + }
> + }
> + }
> + }
> + }
> + }
> + return 0;
> +}
> +
> void Encoder::destroy()
> {
> #if ENABLE_HDR10_PLUS
> diff --git a/source/encoder/encoder.h b/source/encoder/encoder.h
> --- a/source/encoder/encoder.h
> +++ b/source/encoder/encoder.h
> @@ -209,6 +209,8 @@
>
> int getRefFrameList(PicYuv** l0, PicYuv** l1, int sliceType, int poc);
>
> + int setAnalysisDataAfterZScan(x265_analysis_data *analysis_data,
> Frame* curFrame);
> +
> void getStreamHeaders(NALList& list, Entropy& sbacCoder, Bitstream&
> bs);
>
> void fetchStats(x265_stats* stats, size_t statsSizeBytes);
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20171108/0961bf77/attachment-0001.html>
More information about the x265-devel
mailing list