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, <[email protected]> wrote: > # HG changeset patch > # User Deepthi Nandakumar <[email protected]> > # 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 > [email protected] > https://mailman.videolan.org/listinfo/x265-devel >
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
