[x265] [PATCH] API: 'x265_set_analysis_data' to capture analysis information

Ashok Kumar Mishra ashok at multicorewareinc.com
Mon Nov 13 10:09:25 CET 2017


On Mon, Nov 13, 2017 at 12:21 PM, <praveen at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Praveen Tiwari <praveen at multicorewareinc.com>
> # Date 1510555850 -19800
> #      Mon Nov 13 12:20:50 2017 +0530
> # Node ID 5ea4fdbdea99a8bdd91d0d7961bcf50764d445b6
> # Parent  563cbe1f4a21dcfe2117ccaa874b713d94434f92
> API: 'x265_set_analysis_data' to capture analysis information
>
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/CMakeLists.txt
> --- a/source/CMakeLists.txt     Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/CMakeLists.txt     Mon Nov 13 12:20:50 2017 +0530
> @@ -29,7 +29,7 @@
>  option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
>  mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
>  # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 143)
> +set(X265_BUILD 144)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/encoder/api.cpp
> --- a/source/encoder/api.cpp    Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/encoder/api.cpp    Mon Nov 13 12:20:50 2017 +0530
> @@ -365,6 +365,18 @@
>      return encoder->getRefFrameList((PicYuv**)l0, (PicYuv**)l1,
> sliceType, poc);
>  }
>
> +int x265_set_analysis_data(x265_encoder *enc, x265_analysis_data
> *analysis_data, int poc, uint32_t cuBytes)
> +{
> +    if (!enc)
> +        return -1;
> +
> +    Encoder *encoder = static_cast<Encoder*>(enc);
> +    if (!encoder->setAnalysisData(analysis_data, poc, cuBytes))
> +        return 0;
> +
> +    return -1;
> +}
> +
>  void x265_cleanup(void)
>  {
>      BitCost::destroy();
> @@ -444,6 +456,7 @@
>      &x265_csvlog_frame,
>      &x265_csvlog_encode,
>      &x265_dither_image,
> +    &x265_set_analysis_data
>  };
>
>  typedef const x265_api* (*api_get_func)(int bitDepth);
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/encoder/encoder.cpp        Mon Nov 13 12:20:50 2017 +0530
> @@ -576,6 +576,85 @@
>      return 0;
>  }
>
> +int Encoder::setAnalysisData(x265_analysis_data *analysis_data, int poc,
> uint32_t cuBytes)
> +{
> +    uint32_t widthInCU = (m_param->sourceWidth + m_param->maxCUSize - 1)
> >> m_param->maxLog2CUSize;
> +    uint32_t heightInCU = (m_param->sourceHeight + m_param->maxCUSize -
> 1) >> m_param->maxLog2CUSize;
> +
> +    Frame* curFrame = m_dpb->m_picList.getPOC(poc);
> +    if (curFrame != NULL)
> +    {
> +        curFrame->m_analysisData = (*analysis_data);
> +        curFrame->m_analysisData.numCUsInFrame = widthInCU * heightInCU;
> +        curFrame->m_analysisData.numPartitions =
> m_param->num4x4Partitions;
> +        allocAnalysis(&curFrame->m_analysisData);
> +        if (m_param->maxCUSize == 16)
> +        {
> +            if (analysis_data->sliceType == X265_TYPE_IDR ||
> analysis_data->sliceType == X265_TYPE_I)
> +            {
> +                curFrame->m_analysisData.sliceType = X265_TYPE_I;
> +                if (m_param->analysisReuseLevel < 2)
> +                    return -1;
> +
> +                curFrame->m_analysisData.numPartitions =
> m_param->num4x4Partitions;
> +                size_t count = 0;
> +                for (uint32_t d = 0; d < cuBytes; d++)
> +                {
> +                    int bytes = curFrame->m_analysisData.numPartitions
> >> (((analysis_intra_data *)analysis_data->intraData)->depth[d] * 2);
> +                    memset(&((analysis_intra_data
> *)curFrame->m_analysisData.intraData)->depth[count],
> ((analysis_intra_data *)analysis_data->intraData)->depth[d], bytes);
> +                    memset(&((analysis_intra_data
> *)curFrame->m_analysisData.intraData)->chromaModes[count],
> ((analysis_intra_data *)analysis_data->intraData)->chromaModes[d], bytes);
> +                    memset(&((analysis_intra_data
> *)curFrame->m_analysisData.intraData)->partSizes[count],
> ((analysis_intra_data *)analysis_data->intraData)->partSizes[d], bytes);
> +                    memset(&((analysis_intra_data
> *)curFrame->m_analysisData.intraData)->partSizes[count],
> ((analysis_intra_data *)analysis_data->intraData)->partSizes[d], bytes);
> +                    count += bytes;
> +                }
> +                memcpy(&((analysis_intra_data *)curFrame->m_analysisData.intraData)->modes,
> ((analysis_intra_data *)analysis_data->intraData)->modes,
> curFrame->m_analysisData.numPartitions * analysis_data->numCUsInFrame);
> +            }
> +            else
> +            {
> +                uint32_t numDir = analysis_data->sliceType == X265_TYPE_P
> ? 1 : 2;
> +                if (m_param->analysisReuseLevel < 2)
> +                    return -1;
> +
> +                curFrame->m_analysisData.numPartitions =
> m_param->num4x4Partitions;
> +                size_t count = 0;
> +                for (uint32_t d = 0; d < cuBytes; d++)
> +                {
> +                    int bytes = curFrame->m_analysisData.numPartitions
> >> (((analysis_inter_data *)analysis_data->interData)->depth[d] * 2);
> +                    memset(&((analysis_inter_data
> *)curFrame->m_analysisData.interData)->depth[count],
> ((analysis_inter_data*)analysis_data->interData)->depth[d], bytes);
> +                    memset(&((analysis_inter_data
> *)curFrame->m_analysisData.interData)->modes[count],
> ((analysis_inter_data*)analysis_data->interData)->modes[d], bytes);
> +                    if (m_param->analysisReuseLevel > 4)
> +                    {
> +                        memset(&((analysis_inter_data
> *)curFrame->m_analysisData.interData)->partSize[count],
> ((analysis_inter_data*)analysis_data->interData)->partSize[d], bytes);
> +                        int numPU = nbPartsTable[((analysis_inter_
> data*)analysis_data->interData)->partSize[d]];
> +                        for (int pu = 0; pu < numPU; pu++)
> +                        {
> +                            if (pu) d++;
>

Increment of d can be inserted in for loop statement.
for (int pu = 0; pu < numPU; pu++, d++)

+                            ((analysis_inter_data
> *)curFrame->m_analysisData.interData)->mergeFlag[count + pu] =
> ((analysis_inter_data*)analysis_data->interData)->mergeFlag[d];
> +                            if (m_param->analysisReuseLevel >= 7)
> +                            {
> +                                ((analysis_inter_data
> *)curFrame->m_analysisData.interData)->interDir[count + pu] =
> ((analysis_inter_data*)analysis_data->interData)->interDir[d];
> +                                for (uint32_t i = 0; i < numDir; i++)
> +                                {
> +                                    ((analysis_inter_data
> *)curFrame->m_analysisData.interData)->mvpIdx[i][count + pu] =
> ((analysis_inter_data*)analysis_data->interData)->mvpIdx[i][d];
> +                                    ((analysis_inter_data
> *)curFrame->m_analysisData.interData)->refIdx[i][count + pu] =
> ((analysis_inter_data*)analysis_data->interData)->refIdx[i][d];
> +                                    memcpy(&((analysis_inter_data
> *)curFrame->m_analysisData.interData)->mv[i][count + pu],
> &((analysis_inter_data*)analysis_data->interData)->mv[i][d], sizeof(MV));
>

Better to use a local pointer of type analysis_inter_data*.


> +                                }
> +                            }
> +                        }
> +                    }
> +                    count += bytes;
> +                }
> +            }
> +        }
> +        else
> +            setAnalysisDataAfterZScan(analysis_data, curFrame);
> +
> +        curFrame->m_copyMVType.trigger();
> +        return 0;
> +    }
> +    return -1;
> +}
> +
>  void Encoder::destroy()
>  {
>  #if ENABLE_HDR10_PLUS
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/encoder/encoder.h
> --- a/source/encoder/encoder.h  Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/encoder/encoder.h  Mon Nov 13 12:20:50 2017 +0530
> @@ -212,6 +212,8 @@
>
>      int setAnalysisDataAfterZScan(x265_analysis_data *analysis_data,
> Frame* curFrame);
>
> +    int setAnalysisData(x265_analysis_data *analysis_data, int poc,
> uint32_t cuBytes);
> +
>      void getStreamHeaders(NALList& list, Entropy& sbacCoder, Bitstream&
> bs);
>
>      void fetchStats(x265_stats* stats, size_t statsSizeBytes);
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/x265.def.in
> --- a/source/x265.def.in        Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/x265.def.in        Mon Nov 13 12:20:50 2017 +0530
> @@ -30,3 +30,4 @@
>  x265_csvlog_frame
>  x265_csvlog_encode
>  x265_dither_image
> +x265_set_analysis_data
> diff -r 563cbe1f4a21 -r 5ea4fdbdea99 source/x265.h
> --- a/source/x265.h     Wed Nov 08 17:08:18 2017 +0530
> +++ b/source/x265.h     Mon Nov 13 12:20:50 2017 +0530
> @@ -1743,6 +1743,11 @@
>   *     This API must be called after(poc >= lookaheadDepth + bframes + 2)
> condition check */
>  int x265_get_ref_frame_list(x265_encoder *encoder, x265_picyuv**,
> x265_picyuv**, int, int);
>
> +/* x265_set_analysis_data:
> + *     set the analysis data,
> + *     returns negative on error, 0 access unit were output. */
> +int x265_set_analysis_data(x265_encoder *encoder, x265_analysis_data
> *analysis_data, int poc, uint32_t cuBytes);
> +
>  void x265_cleanup(void);
>
>  /* Open a CSV log file. On success it returns a file handle which must be
> passed
> @@ -1816,6 +1821,7 @@
>      void          (*csvlog_frame)(const x265_param&, const x265_picture&);
>      void          (*csvlog_encode)(x265_encoder*, const x265_stats&,
> int, char**);
>      void          (*dither_image)(x265_picture&, int, int, int16_t*, int);
> +    int           (*set_analysis_data)(x265_encoder *encoder,
> x265_analysis_data *analysis_data, int poc, uint32_t cuBytes);
>      /* add new pointers to the end, or increment X265_MAJOR_VERSION */
>  } x265_api;
>
> _______________________________________________
> 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/20171113/bc239952/attachment-0001.html>


More information about the x265-devel mailing list