[x265] [PATCH] Add flag to enable/disable temporal MVP

Steve Borho steve at borho.org
Tue Oct 28 01:51:19 CET 2014


On 10/27, Nicolas Morey-Chaisemartin wrote:
> # HG changeset patch
> # User Nicolas Morey-Chaisemartin <nmorey at kalray.eu>
> # Date 1414074805 -7200
> #      Thu Oct 23 15:33:25 2014 +0200
> 
> Add flag to enable/disable temporal MVP

queued locally. I had to apply most of the changes manually; at some
step in your process all blank lines are getting removed, so none of
these chunks match the contexts in the official source files.

> diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
> index 5e59f61..4644501 100644
> --- a/source/CMakeLists.txt
> +++ b/source/CMakeLists.txt
> @@ -27,7 +27,7 @@ include(CheckSymbolExists)
>  include(CheckCXXCompilerFlag)
>  # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 34)
> +set(X265_BUILD 35)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff --git a/source/common/cudata.cpp b/source/common/cudata.cpp
> index fec2a8d..f288bf5 100644
> --- a/source/common/cudata.cpp
> +++ b/source/common/cudata.cpp
> @@ -1534,7 +1534,7 @@ uint32_t CUData::getInterMergeCandidates(uint32_t absPartIdx, uint32_t puIdx, MV
>                  return maxNumMergeCand;
>          }
>      }
> -    // TMVP always enabled
> +    if (m_slice->m_sps->bTemporalMVPEnabled)
>      {
>          MV colmv;
>          uint32_t partIdxRB;
> @@ -1763,7 +1763,7 @@ int CUData::fillMvpCand(uint32_t partIdx, uint32_t partAddr, int picList, int re
>              return numMvc;
>      }
> -    // TMVP always enabled
> +    if (m_slice->m_sps->bTemporalMVPEnabled)
>      {
>          uint32_t absPartAddr = m_absIdxInCTU + partAddr;
>          MV colmv;
> diff --git a/source/common/param.cpp b/source/common/param.cpp
> index 3ff7edb..4ced165 100644
> --- a/source/common/param.cpp
> +++ b/source/common/param.cpp
> @@ -161,6 +161,7 @@ void x265_param_default(x265_param *param)
>      param->bEnableTransformSkip = 0;
>      param->bEnableTSkipFast = 0;
>      param->maxNumReferences = 3;
> +    param->bEnableTemporalMvp = 1;
>      /* Loop Filter */
>      param->bEnableLoopFilter = 1;
> @@ -1167,6 +1168,7 @@ void x265_print_params(x265_param *param)
>      TOOLOPT(param->bEnableConstrainedIntra, "cip");
>      TOOLOPT(param->bIntraInBFrames, "b-intra");
>      TOOLOPT(param->bEnableFastIntra, "fast-intra");
> +    TOOLOPT(param->bEnableTemporalMvp, "tmvp");
>      if (param->bEnableTransformSkip)
>          fprintf(stderr, "tskip%s ", param->bEnableTSkipFast ? "-fast" : "");
>      TOOLOPT(param->bCULossless, "cu-lossless");
> diff --git a/source/common/slice.h b/source/common/slice.h
> index 9944aa2..bd0ba63 100644
> --- a/source/common/slice.h
> +++ b/source/common/slice.h
> @@ -232,6 +232,7 @@ struct SPS
>      int      numReorderPics;
>      bool     bUseStrongIntraSmoothing; // use param
> +    bool     bTemporalMVPEnabled;
>      Window   conformanceWindow;
>      VUI      vuiParameters;
> diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
> index fe3daa4..341705c 100644
> --- a/source/encoder/encoder.cpp
> +++ b/source/encoder/encoder.cpp
> @@ -1223,6 +1223,7 @@ void Encoder::initSPS(SPS *sps)
>      sps->numReorderPics = m_vps.numReorderPics;
>      sps->bUseStrongIntraSmoothing = m_param->bEnableStrongIntraSmoothing;
> +    sps->bTemporalMVPEnabled = m_param->bEnableTemporalMvp;
>      VUI& vui = sps->vuiParameters;
>      vui.aspectRatioInfoPresentFlag = !!m_param->vui.aspectRatioIdc;
> diff --git a/source/encoder/entropy.cpp b/source/encoder/entropy.cpp
> index ff11db6..f62fdad 100644
> --- a/source/encoder/entropy.cpp
> +++ b/source/encoder/entropy.cpp
> @@ -124,7 +124,7 @@ void Entropy::codeSPS(const SPS& sps, const ScalingList& scalingList, const Prof
>      WRITE_UVLC(0, "num_short_term_ref_pic_sets");
>      WRITE_FLAG(0, "long_term_ref_pics_present_flag");
> -    WRITE_FLAG(1, "sps_temporal_mvp_enable_flag");
> +    WRITE_FLAG(sps.bTemporalMVPEnabled, "sps_temporal_mvp_enable_flag");
>      WRITE_FLAG(sps.bUseStrongIntraSmoothing, "sps_strong_intra_smoothing_enable_flag");
>      WRITE_FLAG(1, "vui_parameters_present_flag");
> @@ -402,7 +402,8 @@ void Entropy::codeSliceHeader(const Slice& slice, FrameData& encData)
>          WRITE_FLAG(0, "short_term_ref_pic_set_sps_flag");
>          codeShortTermRefPicSet(slice.m_rps);
> -        WRITE_FLAG(1, "slice_temporal_mvp_enable_flag");
> +        if (slice.m_sps->bTemporalMVPEnabled)
> +            WRITE_FLAG(1, "slice_temporal_mvp_enable_flag");
>      }
>      const SAOParam *saoParam = encData.m_saoParam;
>      if (slice.m_sps->bUseSAO)
> @@ -437,7 +438,7 @@ void Entropy::codeSliceHeader(const Slice& slice, FrameData& encData)
>      if (slice.isInterB())
>          WRITE_FLAG(0, "mvd_l1_zero_flag");
> -    // TMVP always enabled
> +    if (slice.m_sps->bTemporalMVPEnabled)
>      {
>          if (slice.m_sliceType == B_SLICE)
>              WRITE_FLAG(slice.m_colFromL0Flag, "collocated_from_l0_flag");
> diff --git a/source/x265.h b/source/x265.h
> index 6ed0764..b2bdd61 100644
> --- a/source/x265.h
> +++ b/source/x265.h
> @@ -628,6 +628,9 @@ typedef struct x265_param
>       * the performance but the less compression efficiency. Default is 3 */
>      uint32_t  maxNumMergeCand;
> +    /* Disable availability of temporal motion vector for AMVP */
> +    int bEnableTemporalMvp;
> +
>      /* Enable weighted prediction in P slices.  This enables weighting analysis
>       * in the lookahead, which influences slice decisions, and enables weighting
>       * analysis in the main encoder which allows P reference samples to have a
> -- 
> Nicolas Morey Chaisemartin
> Phone : +33 6 42 46 68 87
> _______________________________________________
> 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