[x265] [PATCH] add API and implementation for Region of Interest(ROI)

Deepthi Nandakumar deepthi at multicorewareinc.com
Fri Aug 7 07:20:51 CEST 2015


Shall we copy quant offsets into inFrame within Encoder, so we dont need to
worry about the user-handled x265_picture instances? Of course, inFrame
will need to alloc/delete its own memory.

x264 uses callback free function pointers for all its structures (param,
mb_info, quant_offsets) but we've not gone down this route yet (is there a
good reason to?). Handling this the above way will keep it consistent with
the way x265_picture::planes, analysis data etc are handled currently.



On Wed, Aug 5, 2015 at 8:48 PM, Steve Borho <steve at borho.org> wrote:

> On 08/05, santhoshini at multicorewareinc.com wrote:
> > # HG changeset patch
> > # User Santhoshini Sekar<santhoshini at multicorewareinc.com>
> > # Date 1438679012 -19800
> > #      Tue Aug 04 14:33:32 2015 +0530
> > # Node ID 14abf498e49b0963fb1c0db19e39aa5de18560a5
> > # Parent  3fa7f6838098854de79d3800b2d775dabaf45705
> > add API and implementation for Region of Interest(ROI)
> >
> > diff -r 3fa7f6838098 -r 14abf498e49b source/CMakeLists.txt
> > --- a/source/CMakeLists.txt   Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/CMakeLists.txt   Tue Aug 04 14:33:32 2015 +0530
> > @@ -30,7 +30,7 @@
> >  mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
> >
> >  # X265_BUILD must be incremented each time the public API is changed
> > -set(X265_BUILD 68)
> > +set(X265_BUILD 69)
> >  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
> >                 "${PROJECT_BINARY_DIR}/x265.def")
> >  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> > diff -r 3fa7f6838098 -r 14abf498e49b source/common/frame.h
> > --- a/source/common/frame.h   Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/common/frame.h   Tue Aug 04 14:33:32 2015 +0530
> > @@ -59,6 +59,8 @@
> >      bool                   m_lowresInit;         // lowres init
> complete (pre-analysis)
> >      bool                   m_bChromaExtended;    // orig chroma planes
> motion extended for weight analysis
> >
> > +    float*                 m_quantOffsets;       // points to
> quantOffsets in x265_picture
> > +
> >      /* Frame Parallelism - notification between FrameEncoders of
> available motion reference rows */
> >      ThreadSafeInteger      m_reconRowCount;      // count of CTU rows
> completely reconstructed and extended for motion reference
> >      volatile uint32_t      m_countRefEncoders;   // count of
> FrameEncoder threads monitoring m_reconRowCount
> > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/api.cpp
> > --- a/source/encoder/api.cpp  Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/encoder/api.cpp  Tue Aug 04 14:33:32 2015 +0530
> > @@ -281,6 +281,8 @@
> >
> >  void x265_picture_free(x265_picture *p)
> >  {
> > +    if (p->quantOffsets)
> > +        X265_FREE(p->quantOffsets);
>
> I'm not sure this is any better. For us to use X265_FREE the user would
> need to use X265_ALLOC and we do not make this function public. Plus, a
> user might re-use an x265_picture instance, so this would leak buffers.
>
> I think we still need the user-supplied free function pointer, but we
> need to defer calling it until after we're certain the offset buffer is
> no longer needed. If it is only read by pre-lookahead, then we can call
> the free function as we take the picture off of the lookahead output
> queue and pass it to a frame encoder.
>
> >      return x265_free(p);
> >  }
> >
> > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/encoder.cpp
> > --- a/source/encoder/encoder.cpp      Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/encoder/encoder.cpp      Tue Aug 04 14:33:32 2015 +0530
> > @@ -465,6 +465,7 @@
> >          inFrame->m_pts       = pic_in->pts;
> >          inFrame->m_forceqp   = pic_in->forceqp;
> >          inFrame->m_param     = m_reconfigured ? m_latestParam : m_param;
> > +        inFrame->m_quantOffsets = pic_in->quantOffsets;
> >
> >          if (m_pocLast == 0)
> >              m_firstPts = inFrame->m_pts;
> > diff -r 3fa7f6838098 -r 14abf498e49b source/encoder/slicetype.cpp
> > --- a/source/encoder/slicetype.cpp    Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/encoder/slicetype.cpp    Tue Aug 04 14:33:32 2015 +0530
> > @@ -96,6 +96,7 @@
> >      int maxRow = curFrame->m_fencPic->m_picHeight;
> >      int blockCount = curFrame->m_lowres.maxBlocksInRow *
> curFrame->m_lowres.maxBlocksInCol;
> >
> > +    float* quantOffsets = curFrame->m_quantOffsets;
> >      for (int y = 0; y < 3; y++)
> >      {
> >          curFrame->m_lowres.wp_ssd[y] = 0;
> > @@ -113,10 +114,21 @@
> >
> >          if (param->rc.aqMode && param->rc.aqStrength == 0)
> >          {
> > -            memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount *
> sizeof(double));
> > -            memset(curFrame->m_lowres.qpAqOffset, 0, cuCount *
> sizeof(double));
> > -            for (int cuxy = 0; cuxy < cuCount; cuxy++)
> > -                curFrame->m_lowres.invQscaleFactor[cuxy] = 256;
> > +            if (quantOffsets)
> > +            {
> > +                for (int cuxy = 0; cuxy < cuCount; cuxy++)
> > +                {
> > +                    curFrame->m_lowres.qpCuTreeOffset[cuxy] =
> curFrame->m_lowres.qpAqOffset[cuxy] = quantOffsets[cuxy];
> > +                    curFrame->m_lowres.invQscaleFactor[cuxy] =
> x265_exp2fix8(curFrame->m_lowres.qpCuTreeOffset[cuxy]);
> > +                }
> > +            }
> > +            else
> > +            {
> > +                memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount *
> sizeof(double));
> > +                memset(curFrame->m_lowres.qpAqOffset, 0, cuCount *
> sizeof(double));
> > +                for (int cuxy = 0; cuxy < cuCount; cuxy++)
> > +                    curFrame->m_lowres.invQscaleFactor[cuxy] = 256;
> > +            }
> >          }
> >
> >          /* Need variance data for weighted prediction */
> > @@ -177,6 +189,8 @@
> >                      uint32_t energy = acEnergyCu(curFrame, blockX,
> blockY, param->internalCsp);
> >                      qp_adj = strength * (X265_LOG2(X265_MAX(energy, 1))
> - (14.427f + 2 * (X265_DEPTH - 8)));
> >                  }
> > +                if (quantOffsets)
> > +                    qp_adj += quantOffsets[blockXY];
> >                  curFrame->m_lowres.qpAqOffset[blockXY] = qp_adj;
> >                  curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj;
> >                  curFrame->m_lowres.invQscaleFactor[blockXY] =
> x265_exp2fix8(qp_adj);
> > diff -r 3fa7f6838098 -r 14abf498e49b source/x265.h
> > --- a/source/x265.h   Mon Aug 03 14:56:21 2015 -0500
> > +++ b/source/x265.h   Tue Aug 04 14:33:32 2015 +0530
> > @@ -205,6 +205,13 @@
> >       * this data structure */
> >      x265_analysis_data analysisData;
> >
> > +    /* An array of quantizer offsets to be applied to this image during
> encoding.
> > +     * These are added on top of the decisions made by rateControl.
> > +     * Adaptive quantization must be enabled to use this feature. These
> quantizer
> > +     * offsets should be given for each 16x16 block. Behavior if quant
> > +     * offsets differ between encoding passes is undefined. */
> > +    float            *quantOffsets;
> > +
> >      /* Frame level statistics */
> >      x265_frame_stats frameData;
>
> the rest looks ok
>
> --
> Steve Borho
> _______________________________________________
> 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/20150807/a3e5c04e/attachment-0001.html>


More information about the x265-devel mailing list