[x265] [PATCH] Add CLI option to enable or disable picture copy to internal frame buffer

Pradeep Ramachandran pradeep at multicorewareinc.com
Wed Nov 15 04:24:20 CET 2017


On Tue, Nov 14, 2017 at 3:41 PM, <kavitha at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Kavitha Sampath <kavitha at multicorewareinc.com>
> # Date 1510637409 -19800
> #      Tue Nov 14 11:00:09 2017 +0530
> # Node ID dd9772385d152528201d335efbc6f75fdc43b08c
> # Parent  6ac1b12bcde91b691ef1de8bb936e23c0f29b6ff
> Add CLI option to enable or disable picture copy to internal frame buffer
>

Pushed to default branch


>
> diff -r 6ac1b12bcde9 -r dd9772385d15 doc/reST/cli.rst
> --- a/doc/reST/cli.rst  Fri Nov 10 19:02:48 2017 +0530
> +++ b/doc/reST/cli.rst  Tue Nov 14 11:00:09 2017 +0530
> @@ -399,6 +399,18 @@
>
>         Default: 1 slice per frame. **Experimental feature**
>
> +.. option:: --copy-pic, --no-copy-pic
> +
> +       Allow encoder to copy input x265 pictures to internal frame
> buffers. When disabled,
> +       x265 will not make an internal copy of the input picture and will
> work with the
> +       application's buffers. While this allows for deeper integration,
> it is the responsbility
> +       of the application to (a) ensure that the allocated picture has
> extra space for padding
> +       that will be done by the library, and (b) the buffers aren't
> recycled until the library
> +       has completed encoding this frame (which can be figured out by
> tracking NALs output by x265)
> +
> +       Default: enabled
> +
> +
>  Input/Output File Options
>  =========================
>
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/CMakeLists.txt
> --- a/source/CMakeLists.txt     Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/CMakeLists.txt     Tue Nov 14 11:00:09 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 144)
> +set(X265_BUILD 145)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/common/frame.cpp
> --- a/source/common/frame.cpp   Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/common/frame.cpp   Tue Nov 14 11:00:09 2017 +0530
> @@ -85,7 +85,7 @@
>          m_analysis2Pass.analysisFramedata = NULL;
>      }
>
> -    if (m_fencPic->create(param) && m_lowres.create(m_fencPic,
> param->bframes, !!param->rc.aqMode || !!param->bAQMotion, param->rc.qgSize))
> +    if (m_fencPic->create(param, !!m_param->bCopyPicToFrame) &&
> m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode ||
> !!param->bAQMotion, param->rc.qgSize))
>      {
>          X265_CHECK((m_reconColCount == NULL), "m_reconColCount was
> initialized");
>          m_numRows = (m_fencPic->m_picHeight + param->maxCUSize - 1)  /
> param->maxCUSize;
> @@ -158,7 +158,8 @@
>
>      if (m_fencPic)
>      {
> -        m_fencPic->destroy();
> +        if (m_param->bCopyPicToFrame)
> +            m_fencPic->destroy();
>          delete m_fencPic;
>          m_fencPic = NULL;
>      }
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/common/param.cpp
> --- a/source/common/param.cpp   Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/common/param.cpp   Tue Nov 14 11:00:09 2017 +0530
> @@ -290,6 +290,7 @@
>      param->csvfpt = NULL;
>      param->forceFlush = 0;
>      param->bDisableLookahead = 0;
> +    param->bCopyPicToFrame = 1;
>
>      /* DCT Approximations */
>      param->bLowPassDct = 0;
> @@ -987,6 +988,7 @@
>                 OPT("lowpass-dct") p->bLowPassDct = atobool(value);
>          OPT("vbv-end") p->vbvBufferEnd = atof(value);
>          OPT("vbv-end-fr-adj") p->vbvEndFrameAdjust = atof(value);
> +        OPT("copy-pic") p->bCopyPicToFrame = atobool(value);
>          OPT("refine-mv-type")
>          {
>              if (strcmp(strdup(value), "avc") == 0)
> @@ -1718,6 +1720,7 @@
>      s += sprintf(s, " ctu-info=%d", p->bCTUInfo);
>      BOOL(p->bLowPassDct, "lowpass-dct");
>      s += sprintf(s, " refine-mv-type=%d", p->bMVType);
> +    s += sprintf(s, " copy-pic=%d", p->bCopyPicToFrame);
>  #undef BOOL
>      return buf;
>  }
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/common/picyuv.cpp
> --- a/source/common/picyuv.cpp  Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/common/picyuv.cpp  Tue Nov 14 11:00:09 2017 +0530
> @@ -69,7 +69,7 @@
>      m_vChromaShift = 0;
>  }
>
> -bool PicYuv::create(x265_param* param, pixel *pixelbuf)
> +bool PicYuv::create(x265_param* param, bool picAlloc, pixel *pixelbuf)
>  {
>      m_param = param;
>      uint32_t picWidth = m_param->sourceWidth;
> @@ -93,8 +93,11 @@
>          m_picOrg[0] = pixelbuf;
>      else
>      {
> -        CHECKED_MALLOC(m_picBuf[0], pixel, m_stride * (maxHeight +
> (m_lumaMarginY * 2)));
> -        m_picOrg[0] = m_picBuf[0] + m_lumaMarginY * m_stride +
> m_lumaMarginX;
> +        if (picAlloc)
> +        {
> +            CHECKED_MALLOC(m_picBuf[0], pixel, m_stride * (maxHeight +
> (m_lumaMarginY * 2)));
> +            m_picOrg[0] = m_picBuf[0] + m_lumaMarginY * m_stride +
> m_lumaMarginX;
> +        }
>      }
>
>      if (picCsp != X265_CSP_I400)
> @@ -102,12 +105,14 @@
>          m_chromaMarginX = m_lumaMarginX;  // keep 16-byte alignment for
> chroma CTUs
>          m_chromaMarginY = m_lumaMarginY >> m_vChromaShift;
>          m_strideC = ((numCuInWidth * m_param->maxCUSize) >>
> m_hChromaShift) + (m_chromaMarginX * 2);
> +        if (picAlloc)
> +        {
> +            CHECKED_MALLOC(m_picBuf[1], pixel, m_strideC * ((maxHeight >>
> m_vChromaShift) + (m_chromaMarginY * 2)));
> +            CHECKED_MALLOC(m_picBuf[2], pixel, m_strideC * ((maxHeight >>
> m_vChromaShift) + (m_chromaMarginY * 2)));
>
> -        CHECKED_MALLOC(m_picBuf[1], pixel, m_strideC * ((maxHeight >>
> m_vChromaShift) + (m_chromaMarginY * 2)));
> -        CHECKED_MALLOC(m_picBuf[2], pixel, m_strideC * ((maxHeight >>
> m_vChromaShift) + (m_chromaMarginY * 2)));
> -
> -        m_picOrg[1] = m_picBuf[1] + m_chromaMarginY * m_strideC +
> m_chromaMarginX;
> -        m_picOrg[2] = m_picBuf[2] + m_chromaMarginY * m_strideC +
> m_chromaMarginX;
> +            m_picOrg[1] = m_picBuf[1] + m_chromaMarginY * m_strideC +
> m_chromaMarginX;
> +            m_picOrg[2] = m_picBuf[2] + m_chromaMarginY * m_strideC +
> m_chromaMarginX;
> +        }
>      }
>      else
>      {
> @@ -236,8 +241,10 @@
>      uint64_t crSum;
>      lumaSum = cbSum = crSum = 0;
>
> -    if (pic.bitDepth == 8)
> +    if (m_param->bCopyPicToFrame)
>      {
> +        if (pic.bitDepth == 8)
> +        {
>  #if (X265_DEPTH > 8)
>          {
>              pixel *yPixel = m_picOrg[0];
> @@ -260,7 +267,7 @@
>              }
>          }
>  #else /* Case for (X265_DEPTH == 8) */
> -        // TODO: Does we need this path? may merge into above in future
> +            // TODO: Does we need this path? may merge into above in
> future
>          {
>              pixel *yPixel = m_picOrg[0];
>              uint8_t *yChar = (uint8_t*)pic.planes[0];
> @@ -294,47 +301,54 @@
>              }
>          }
>  #endif /* (X265_DEPTH > 8) */
> -    }
> -    else /* pic.bitDepth > 8 */
> -    {
> -        /* defensive programming, mask off bits that are supposed to be
> zero */
> -        uint16_t mask = (1 << X265_DEPTH) - 1;
> -        int shift = abs(pic.bitDepth - X265_DEPTH);
> -        pixel *yPixel = m_picOrg[0];
> -
> -        uint16_t *yShort = (uint16_t*)pic.planes[0];
> -
> -        if (pic.bitDepth > X265_DEPTH)
> +        }
> +        else /* pic.bitDepth > 8 */
>          {
> -            /* shift right and mask pixels to final size */
> -            primitives.planecopy_sp(yShort, pic.stride[0] /
> sizeof(*yShort), yPixel, m_stride, width, height, shift, mask);
> -        }
> -        else /* Case for (pic.bitDepth <= X265_DEPTH) */
> -        {
> -            /* shift left and mask pixels to final size */
> -            primitives.planecopy_sp_shl(yShort, pic.stride[0] /
> sizeof(*yShort), yPixel, m_stride, width, height, shift, mask);
> -        }
> +            /* defensive programming, mask off bits that are supposed to
> be zero */
> +            uint16_t mask = (1 << X265_DEPTH) - 1;
> +            int shift = abs(pic.bitDepth - X265_DEPTH);
> +            pixel *yPixel = m_picOrg[0];
>
> -        if (param.internalCsp != X265_CSP_I400)
> -        {
> -            pixel *uPixel = m_picOrg[1];
> -            pixel *vPixel = m_picOrg[2];
> -
> -            uint16_t *uShort = (uint16_t*)pic.planes[1];
> -            uint16_t *vShort = (uint16_t*)pic.planes[2];
> +            uint16_t *yShort = (uint16_t*)pic.planes[0];
>
>              if (pic.bitDepth > X265_DEPTH)
>              {
> -                primitives.planecopy_sp(uShort, pic.stride[1] /
> sizeof(*uShort), uPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> -                primitives.planecopy_sp(vShort, pic.stride[2] /
> sizeof(*vShort), vPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                /* shift right and mask pixels to final size */
> +                primitives.planecopy_sp(yShort, pic.stride[0] /
> sizeof(*yShort), yPixel, m_stride, width, height, shift, mask);
>              }
>              else /* Case for (pic.bitDepth <= X265_DEPTH) */
>              {
> -                primitives.planecopy_sp_shl(uShort, pic.stride[1] /
> sizeof(*uShort), uPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> -                primitives.planecopy_sp_shl(vShort, pic.stride[2] /
> sizeof(*vShort), vPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                /* shift left and mask pixels to final size */
> +                primitives.planecopy_sp_shl(yShort, pic.stride[0] /
> sizeof(*yShort), yPixel, m_stride, width, height, shift, mask);
> +            }
> +
> +            if (param.internalCsp != X265_CSP_I400)
> +            {
> +                pixel *uPixel = m_picOrg[1];
> +                pixel *vPixel = m_picOrg[2];
> +
> +                uint16_t *uShort = (uint16_t*)pic.planes[1];
> +                uint16_t *vShort = (uint16_t*)pic.planes[2];
> +
> +                if (pic.bitDepth > X265_DEPTH)
> +                {
> +                    primitives.planecopy_sp(uShort, pic.stride[1] /
> sizeof(*uShort), uPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                    primitives.planecopy_sp(vShort, pic.stride[2] /
> sizeof(*vShort), vPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                }
> +                else /* Case for (pic.bitDepth <= X265_DEPTH) */
> +                {
> +                    primitives.planecopy_sp_shl(uShort, pic.stride[1] /
> sizeof(*uShort), uPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                    primitives.planecopy_sp_shl(vShort, pic.stride[2] /
> sizeof(*vShort), vPixel, m_strideC, width >> m_hChromaShift, height >>
> m_vChromaShift, shift, mask);
> +                }
>              }
>          }
>      }
> +    else
> +    {
> +        m_picOrg[0] = (pixel*)pic.planes[0];
> +        m_picOrg[1] = (pixel*)pic.planes[1];
> +        m_picOrg[2] = (pixel*)pic.planes[2];
> +    }
>
>      pixel *Y = m_picOrg[0];
>      pixel *U = m_picOrg[1];
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/common/picyuv.h
> --- a/source/common/picyuv.h    Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/common/picyuv.h    Tue Nov 14 11:00:09 2017 +0530
> @@ -76,7 +76,7 @@
>
>      PicYuv();
>
> -    bool  create(x265_param* param, pixel *pixelbuf = NULL);
> +    bool  create(x265_param* param, bool picAlloc = true, pixel *pixelbuf
> = NULL);
>      bool  createOffsets(const SPS& sps);
>      void  destroy();
>      int   getLumaBufLen(uint32_t picWidth, uint32_t picHeight, uint32_t
> picCsp);
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/x265.h
> --- a/source/x265.h     Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/x265.h     Tue Nov 14 11:00:09 2017 +0530
> @@ -1531,6 +1531,9 @@
>
>      /* Reuse MV information obtained through API */
>      int       bMVType;
> +
> +    /* Allow the encoder to have a copy of the planes of x265_picture in
> Frame */
> +    int       bCopyPicToFrame;
>  } x265_param;
>
>  /* x265_param_alloc:
> diff -r 6ac1b12bcde9 -r dd9772385d15 source/x265cli.h
> --- a/source/x265cli.h  Fri Nov 10 19:02:48 2017 +0530
> +++ b/source/x265cli.h  Tue Nov 14 11:00:09 2017 +0530
> @@ -286,6 +286,8 @@
>      { "no-splitrd-skip",      no_argument, NULL, 0 },
>      { "lowpass-dct",          no_argument, NULL, 0 },
>      { "refine-mv-type", required_argument, NULL, 0 },
> +    { "copy-pic",             no_argument, NULL, 0 },
> +    { "no-copy-pic",          no_argument, NULL, 0 },
>      { 0, 0, 0, 0 },
>      { 0, 0, 0, 0 },
>      { 0, 0, 0, 0 },
> @@ -339,6 +341,7 @@
>      H0("   --seek <integer>              First frame to encode\n");
>      H1("   --[no-]interlace <bff|tff>    Indicate input pictures are
> interlace fields in temporal order. Default progressive\n");
>      H1("   --dither                      Enable dither if downscaling to
> 8 bit pixels. Default disabled\n");
> +    H0("   --[no-]copy-pic               Copy buffers of input picture in
> frame. Default %s\n", OPT(param->bCopyPicToFrame));
>      H0("\nQuality reporting metrics:\n");
>      H0("   --[no-]ssim                   Enable reporting SSIM metric
> scores. Default %s\n", OPT(param->bEnableSsim));
>      H0("   --[no-]psnr                   Enable reporting PSNR metric
> scores. Default %s\n", OPT(param->bEnablePsnr));
> _______________________________________________
> 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/20171115/8e55ba69/attachment-0001.html>


More information about the x265-devel mailing list