[x265] [PATCH] slicetype: fix bugs in scenecut and slicetype decision

Divya Manivannan divya at multicorewareinc.com
Tue Oct 6 15:53:27 CEST 2015


After applying this patch and tested with two videos, found that there are
some fake scenecuts and consecutive I-frames.

On Tue, Oct 6, 2015 at 5:06 PM, <deepthi at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Deepthi Nandakumar <deepthi at multicorewareinc.com>
> # Date 1444115344 -19800
> #      Tue Oct 06 12:39:04 2015 +0530
> # Branch stable
> # Node ID aaf7fe7452b5c46e564d32ff52f2730a79ebaea1
> # Parent  98ac099a766fc3eb6333fd5676b87a5933e1e3d0
> slicetype: fix bugs in scenecut and slicetype decision
>
> The default value of bScenecut had changed to false (instead of true) and
> this
> was not accounted for correctly.
>
> diff -r 98ac099a766f -r aaf7fe7452b5 source/encoder/slicetype.cpp
> --- a/source/encoder/slicetype.cpp      Tue Sep 29 14:14:24 2015 +0530
> +++ b/source/encoder/slicetype.cpp      Tue Oct 06 12:39:04 2015 +0530
> @@ -1259,7 +1259,7 @@
>      {
>          bool isScenecut = scenecut(frames, 0, 1, true, origNumFrames);
>          /* When scenecut threshold is set, use scenecut detection for I
> frame placements */
> -        if (!m_param->scenecutThreshold && isScenecut)
> +        if (m_param->scenecutThreshold && isScenecut)
>          {
>              frames[1]->sliceType = X265_TYPE_I;
>              return;
> @@ -1402,7 +1402,7 @@
>          origmaxp1 += m_param->bframes;
>          int maxp1 = X265_MIN(origmaxp1, numFrames);
>          bool fluctuate = false;
> -        bool noScenecuts = false;
> +        bool scenecutFound = false;
>          int64_t avgSatdCost = 0;
>          if (frames[0]->costEst[1][0] > -1)
>              avgSatdCost = frames[0]->costEst[1][0];
> @@ -1412,23 +1412,11 @@
>           * and not considered a scenecut. */
>          for (int cp1 = p1; cp1 <= maxp1; cp1++)
>          {
> -            if (!scenecutInternal(frames, p0, cp1, false))
> +            if (scenecutInternal(frames, p0, cp1, false))
>              {
> -                /* Any frame in between p0 and cur_p1 cannot be a real
> scenecut. */
> -                for (int i = cp1; i > p0; i--)
> -                {
> -                    frames[i]->bScenecut = false;
> -                    noScenecuts = false;
> -                }
> +                frames[cp1]->bScenecut = true;
> +                scenecutFound = true;
>              }
> -            else if (scenecutInternal(frames, cp1 - 1, cp1, false))
> -            {
> -                /* If current frame is a Scenecut from p0 frame as well
> as Scenecut from
> -                 * preceeding frame, mark it as a Scenecut */
> -                frames[cp1]->bScenecut = true;
> -                noScenecuts = true;
> -            }
> -
>              /* compute average satdcost of all the frames in the mini-gop
> to confirm
>               * whether there is any great fluctuation among them to rule
> out false positives */
>              X265_CHECK(frames[cp1]->costEst[cp1 - p0][0]!= -1, "costEst
> is not done \n");
> @@ -1440,32 +1428,30 @@
>           * This could denote the beginning or ending of scene transitions.
>           * During a scene transition(fade in/fade outs), if fluctuate
> remains false,
>           * then the scene had completed its transition or stabilized */
> -        if (noScenecuts)
> +        if (scenecutFound)
>          {
>              fluctuate = false;
>              avgSatdCost /= cnt;
> -            for (int i= p1 ; i <= maxp1; i++)
> +            for (int i = p1; i <= maxp1; i++)
>              {
>                  if (fabs((double)(frames[i]->costEst[i - p0][0] -
> avgSatdCost)) > 0.1 * avgSatdCost)
>                  {
>                      fluctuate = true;
> -                    if (!m_isSceneTransition && frames[i]->bScenecut)
> +                    if (frames[i]->bScenecut)
>                      {
> -                        m_isSceneTransition = true;
> -                        /* just mark the first scenechange in the scene
> transition as a scenecut. */
> +                        /* just mark the first scenechange in the scene
> transition as a scenecut */
>                          for (int j = i + 1; j <= maxp1; j++)
>                              frames[j]->bScenecut = false;
> +                        frames[i]->bScenecut = true;
>                          break;
>                      }
>                  }
> -                frames[i]->bScenecut = false;
>              }
>          }
> -        if (!fluctuate && !noScenecuts)
> -            m_isSceneTransition = false; /* Signal end of scene
> transitioning */
> +        if (fluctuate && scenecutFound)
> +            m_isSceneTransition = !m_isSceneTransition;
>      }
>
> -    /* Ignore frames that are part of a flash, i.e. cannot be real
> scenecuts */
>      if (!frames[p1]->bScenecut)
>          return false;
>      return scenecutInternal(frames, p0, p1, bRealScenecut);
> _______________________________________________
> 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/20151006/0e8ca8ea/attachment.html>


More information about the x265-devel mailing list