[x265] [PATCH] cli: add numPredMode into analysis structure and keep configurable based on param

Steve Borho steve at borho.org
Tue Nov 11 22:28:09 CET 2014


On 11/11, gopu at multicorewareinc.com wrote:
> # HG changeset patch
> # User Gopu Govindaswamy <gopu at multicorewareinc.com>
> # Date 1415689681 -19800
> #      Tue Nov 11 12:38:01 2014 +0530
> # Node ID d98278d6bef3c35af876e6713e526ddace141e2f
> # Parent  64b80aa95091ddcc95df1790dc72a4786d68e125
> cli: add numPredMode into analysis structure and keep configurable based on param
> 
> diff -r 64b80aa95091 -r d98278d6bef3 source/CMakeLists.txt
> --- a/source/CMakeLists.txt	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/CMakeLists.txt	Tue Nov 11 12:38:01 2014 +0530
> @@ -21,7 +21,7 @@
>  include(CheckCXXCompilerFlag)
>  
>  # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 36)
> +set(X265_BUILD 37)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r 64b80aa95091 -r d98278d6bef3 source/common/cudata.h
> --- a/source/common/cudata.h	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/common/cudata.h	Tue Nov 11 12:38:01 2014 +0530
> @@ -79,6 +79,7 @@
>      
>      // (1 + 4 + 16 + 64) = 85.
>      enum { MAX_GEOMS = 85 };
> +    enum { MAX_NUMPART_PER_PRED_UNIT = 2 };
>  
>      uint32_t log2CUSize;    // Log of the CU size.
>      uint32_t childOffset;   // offset of the first child CU from current CU
> diff -r 64b80aa95091 -r d98278d6bef3 source/encoder/analysis.cpp
> --- a/source/encoder/analysis.cpp	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/encoder/analysis.cpp	Tue Nov 11 12:38:01 2014 +0530
> @@ -148,7 +148,10 @@
>      else
>      {
>          if (m_param->analysisMode)
> -            m_interAnalysisData = m_frame->m_interData + (ctu.m_cuAddr * (CUGeom::MAX_GEOMS * NUM_SIZES));
> +        {
> +            uint32_t PredMode = (m_param->bEnableAMP && m_param->bEnableRectInter) ? 8 : (m_param->bEnableAMP || m_param->bEnableRectInter ? 4 : 2);
> +            m_interAnalysisData = m_frame->m_interData + (ctu.m_cuAddr * (CUGeom::MAX_GEOMS * PredMode * CUGeom::MAX_NUMPART_PER_PRED_UNIT));
> +        }
>  
>          if (!m_param->rdLevel)
>          {
> diff -r 64b80aa95091 -r d98278d6bef3 source/encoder/api.cpp
> --- a/source/encoder/api.cpp	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/encoder/api.cpp	Tue Nov 11 12:38:01 2014 +0530
> @@ -205,6 +205,7 @@
>          uint32_t numCUsInFrame   = widthInCU * heightInCU;
>          pic->analysisData.numCUsInFrame = numCUsInFrame;
>          pic->analysisData.numPartitions = numPartitions;
> +        pic->analysisData.numPredMode = (param->bEnableAMP && param->bEnableRectInter) ? 8 : (param->bEnableAMP || param->bEnableRectInter ? 4 : 2);

there is a strict hierarchy, amp is disabled if rect is disabled, so:

numPredMode = 2 /* 2Nx2N + bidir */ + param->bEnableRectInter * 2 + param->bEnableAMP * 4;

BTW: to be safe we should be BOOLIFY'ing all our boolean params like
x264 does, aka #define BOOLIFY(f) f = !!f

>      }
>  }
>  
> @@ -216,7 +217,7 @@
>  
>  int x265_alloc_analysis_data(x265_picture* pic)
>  {
> -    CHECKED_MALLOC(pic->analysisData.interData, x265_inter_data, pic->analysisData.numCUsInFrame * X265_MAX_PRED_MODE_PER_CU);
> +    CHECKED_MALLOC(pic->analysisData.interData, x265_inter_data, pic->analysisData.numCUsInFrame * (X265_MAX_PRED_MODE_PER_CU * pic->analysisData.numPredMode));
>      CHECKED_MALLOC(pic->analysisData.intraData, x265_intra_data, 1);
>      pic->analysisData.intraData->depth      = NULL;
>      pic->analysisData.intraData->modes      = NULL;
> diff -r 64b80aa95091 -r d98278d6bef3 source/x265.cpp
> --- a/source/x265.cpp	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/x265.cpp	Tue Nov 11 12:38:01 2014 +0530
> @@ -891,7 +891,7 @@
>          sizeof(uint8_t), pic->analysisData.numPartitions * pic->analysisData.numCUsInFrame, this->analysisFile);
>      fread(pic->analysisData.intraData->partSizes,
>          sizeof(char), pic->analysisData.numPartitions * pic->analysisData.numCUsInFrame, this->analysisFile);
> -    fread(pic->analysisData.interData, sizeof(x265_inter_data), pic->analysisData.numCUsInFrame * (X265_MAX_PRED_MODE_PER_CU), this->analysisFile);
> +    fread(pic->analysisData.interData, sizeof(x265_inter_data), pic->analysisData.numCUsInFrame * (X265_MAX_PRED_MODE_PER_CU * pic->analysisData.numPredMode), this->analysisFile);
>  }
>  
>  void CLIOptions::writeAnalysisFile(x265_picture* pic, x265_param *p)
> @@ -911,7 +911,7 @@
>          sizeof(uint8_t), pic->analysisData.numPartitions * pic->analysisData.numCUsInFrame, this->analysisFile);
>      fwrite(pic->analysisData.intraData->partSizes,
>          sizeof(char), pic->analysisData.numPartitions * pic->analysisData.numCUsInFrame, this->analysisFile);
> -    fwrite(pic->analysisData.interData, sizeof(x265_inter_data), pic->analysisData.numCUsInFrame * X265_MAX_PRED_MODE_PER_CU, this->analysisFile);
> +    fwrite(pic->analysisData.interData, sizeof(x265_inter_data), pic->analysisData.numCUsInFrame * (X265_MAX_PRED_MODE_PER_CU * pic->analysisData.numPredMode), this->analysisFile);
>  }
>  
>  bool CLIOptions::parseQPFile(x265_picture &pic_org)
> @@ -1013,6 +1013,7 @@
>      }
>      if (param->analysisMode)
>      {
> +        pic_recon->analysisData.numPredMode = pic_in->analysisData.numPredMode;
>          if (param->analysisMode == X265_ANALYSIS_SAVE)
>          {
>              char *p = x265_param2string(param);
> @@ -1024,7 +1025,7 @@
>              uint32_t numCU = pic_in->analysisData.numCUsInFrame;
>              uint32_t numPart = pic_in->analysisData.numPartitions;
>  
> -            cliopt.analysisRecordSize = ((sizeof(int) * 4 + sizeof(uint32_t) * 2) + sizeof(x265_inter_data) * numCU * X265_MAX_PRED_MODE_PER_CU +
> +            cliopt.analysisRecordSize = ((sizeof(int) * 4 + sizeof(uint32_t) * 2) + sizeof(x265_inter_data) * numCU * (X265_MAX_PRED_MODE_PER_CU * pic_in->analysisData.numPredMode) +
>                      sizeof(uint8_t) * 2 * numPart * numCU + sizeof(char) * numPart * numCU);
>  
>              fprintf(cliopt.analysisFile, "#options: %s\n", p);
> diff -r 64b80aa95091 -r d98278d6bef3 source/x265.h
> --- a/source/x265.h	Tue Nov 11 11:51:24 2014 +0530
> +++ b/source/x265.h	Tue Nov 11 12:38:01 2014 +0530
> @@ -114,6 +114,7 @@
>      x265_intra_data* intraData;
>      uint32_t         numCUsInFrame;
>      uint32_t         numPartitions;
> +    uint32_t         numPredMode;
>  } x265_analysis_data;
>  
>  /* Used to pass pictures into the encoder, and to get picture data back out of
> @@ -286,7 +287,7 @@
>  #define X265_ANALYSIS_OFF  0
>  #define X265_ANALYSIS_SAVE 1
>  #define X265_ANALYSIS_LOAD 2
> -#define X265_MAX_PRED_MODE_PER_CU (85 * 8 * 2) /* max-recursive-percu * max-predmode * numberofpart */
> +#define X265_MAX_PRED_MODE_PER_CU (85 * 2) /* max-recursive-percu * numberofpart */
>  
>  typedef struct
>  {
> _______________________________________________
> 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