[x265] [PATCH] frameencoder: store the reference state of the picture to FrameEncoder Member variable(m_keptAsRef)

Gopu Govindaswamy gopu at multicorewareinc.com
Thu Apr 3 14:04:12 CEST 2014


Please Ignore this patch, I have sent an another patch, the member variable
name and commit message has been changed a bit

Thanks



On Thu, Apr 3, 2014 at 4:57 PM, <gopu at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Gopu Govindaswamy
> # Date 1396524444 -19800
> #      Thu Apr 03 16:57:24 2014 +0530
> # Node ID 099c17e87f7318c62b6f6323dfc0b84e8ff5f076
> # Parent  c0362b478e23777120ee2cf3c286ca1f2e740018
> frameencoder: store the reference state of the picture to FrameEncoder
> Member variable(m_keptAsRef)
>
> We find that reference state of the reference frame changed during the
> encode when we use frame-thread > 1
> this cause the CU level QP for the frame is non-deterministic, this is
> leading the non-deterministic
> encoded output for the frame, to avoid this store the reference state of
> the frame to FrameEncoder->m_keptAsRef and
> when the QP is calculate for CU, refer the reference state of the frame
> from FrameEncoder->m_keptAsRef
> this stat will never change during the encode
>
> Moved slice reference state initialization from dpb to FrameEncoder
> initSlice()
>
> diff -r c0362b478e23 -r 099c17e87f73 source/encoder/dpb.cpp
> --- a/source/encoder/dpb.cpp    Wed Apr 02 22:52:19 2014 -0500
> +++ b/source/encoder/dpb.cpp    Thu Apr 03 16:57:24 2014 +0530
> @@ -79,17 +79,6 @@
>          m_lastIDR = pocCurr;
>      }
>      slice->setLastIDR(m_lastIDR);
> -
> -    if (slice->getSliceType() != B_SLICE)
> -        slice->setReferenced(true);
> -    else
> -    {
> -        if (pic->m_lowres.sliceType == X265_TYPE_BREF)
> -            slice->setReferenced(true);
> -        else
> -            slice->setReferenced(false);
> -    }
> -
>      slice->setTemporalLayerNonReferenceFlag(!slice->isReferenced());
>      // Set the nal unit type
>      slice->setNalUnitType(getNalUnitType(pocCurr, m_lastIDR, pic));
> diff -r c0362b478e23 -r 099c17e87f73 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Wed Apr 02 22:52:19 2014 -0500
> +++ b/source/encoder/frameencoder.cpp   Thu Apr 03 16:57:24 2014 +0530
> @@ -265,7 +265,18 @@
>      int type = pic->m_lowres.sliceType;
>      SliceType sliceType = IS_X265_TYPE_B(type) ? B_SLICE : ((type ==
> X265_TYPE_P) ? P_SLICE : I_SLICE);
>      slice->setSliceType(sliceType);
> -    slice->setReferenced(true);
> +
> +    if (sliceType != B_SLICE)
> +        m_isReferenced = true;
> +    else
> +    {
> +        if (pic->m_lowres.sliceType == X265_TYPE_BREF)
> +            m_isReferenced = true;
> +        else
> +            m_isReferenced = false;
> +    }
> +    slice->setReferenced(m_isReferenced);
> +
>      slice->setScalingList(m_top->getScalingList());
>
>  slice->getScalingList()->setUseTransformSkip(m_pps.getUseTransformSkip());
>  #if LOG_CU_STATISTICS
> @@ -1229,9 +1240,8 @@
>      int block_x = (cuAddr * noOfBlocks) - block_y *
> m_pic->getPicSym()->getFrameWidthInCU();
>
>      /* Use cuTree offsets in m_pic->m_lowres.qpOffset if cuTree enabled
> and
> -     * frame is referenced (if P, ignore ref state). Else use AQ offsets
> */
> -    double *qpoffs = ((m_pic->getSlice()->isReferenced() ||
> m_pic->getSlice()->getSliceType() == P_SLICE) && m_cfg->param->rc.cuTree) ?
> -                     m_pic->m_lowres.qpOffset :
> m_pic->m_lowres.qpAqOffset;
> +     * frame is referenced Else use AQ offsets */
> +    double *qpoffs = (m_isReferenced && m_cfg->param->rc.cuTree) ?
> m_pic->m_lowres.qpOffset : m_pic->m_lowres.qpAqOffset;
>
>      int cnt = 0, idx = 0;
>      for (int h = 0; h < noOfBlocks && block_y < maxBlockRows; h++,
> block_y++)
> diff -r c0362b478e23 -r 099c17e87f73 source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h     Wed Apr 02 22:52:19 2014 -0500
> +++ b/source/encoder/frameencoder.h     Thu Apr 03 16:57:24 2014 +0530
> @@ -190,6 +190,7 @@
>      int                      m_filterRowDelay;
>      Event                    m_completionEvent;
>      int64_t                  m_totalTime;
> +    bool                     m_isReferenced;
>  };
>  }
>
>


-- 
Thanks & Regards
Gopu G
Multicoreware Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140403/d5f2fbca/attachment.html>


More information about the x265-devel mailing list