>From d4f147e357b63012736591a6b5eb58540e19a983 Mon Sep 17 00:00:00 2001 From: Praveen Karadugattu <praveenku...@multicorewareinc.com> Date: Sun, 20 Jun 2021 21:20:50 +0530 Subject: [PATCH] Disable fall-back on traditional scenecut algorithm with --hist-scenecut
--- doc/reST/cli.rst | 10 ++++++++-- source/CMakeLists.txt | 2 +- source/common/param.cpp | 9 ++++++++- source/encoder/encoder.cpp | 17 ++++++++++++----- source/encoder/slicetype.cpp | 15 ++++++++++----- source/test/regression-tests.txt | 1 + source/x265.h | 4 ++++ source/x265cli.h | 2 ++ 8 files changed, 46 insertions(+), 14 deletions(-) diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst index 4154221af..b24fa72a9 100755 --- a/doc/reST/cli.rst +++ b/doc/reST/cli.rst @@ -1470,7 +1470,8 @@ Slice decision options .. option:: --hist-scenecut, --no-hist-scenecut Indicates that scenecuts need to be detected using luma edge and chroma histograms. - :option:`--hist-scenecut` enables scenecut detection using the histograms and disables the default scene cut algorithm. + :option:`--hist-scenecut` enables scenecut detection using the histograms. + It also uses the intra and inter cost info to arrive at a scenecut decision from the default scenecut method. :option:`--no-hist-scenecut` disables histogram based scenecut algorithm. .. option:: --hist-threshold <0.0..1.0> @@ -1480,7 +1481,12 @@ Slice decision options greater than 0.2 against the previous frame as scenecut. Increasing the threshold reduces the number of scenecuts detected. Default 0.03. - + +.. option:: --traditional-scenecut, --no-traditional-scenecut + + Enable traditional scenecut detection using intra and inter cost when :option:`--hist-scenecut` is used. + Default enabled. + .. option:: --radl <integer> Number of RADL pictures allowed infront of IDR. Requires closed gop interval. diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index b4e57b592..f4a9cb793 100755 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF) 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 200) +set(X265_BUILD 201) configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" "${PROJECT_BINARY_DIR}/x265.def") configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" diff --git a/source/common/param.cpp b/source/common/param.cpp index 8a27aaef3..6751e0aa7 100755 --- a/source/common/param.cpp +++ b/source/common/param.cpp @@ -172,6 +172,7 @@ void x265_param_default(x265_param* param) param->scenecutThreshold = 40; /* Magic number pulled in from x264 */ param->edgeTransitionThreshold = 0.03; param->bHistBasedSceneCut = 0; + param->bEnableTradScdInHscd = 1; param->lookaheadSlices = 8; param->lookaheadThreads = 0; param->scenecutBias = 5.0; @@ -598,6 +599,7 @@ int x265_param_default_preset(x265_param* param, const char* preset, const char* param->lookaheadDepth = 0; param->scenecutThreshold = 0; param->bHistBasedSceneCut = 0; + param->bEnableTradScdInHscd = 1; param->rc.cuTree = 0; param->frameNumThreads = 1; } @@ -953,6 +955,7 @@ int x265_param_parse(x265_param* p, const char* name, const char* value) bError = false; p->scenecutThreshold = atoi(value); p->bHistBasedSceneCut = 0; + p->bEnableTradScdInHscd = 1; } } OPT("temporal-layers") p->bEnableTemporalSubLayers = atobool(value); @@ -1234,6 +1237,7 @@ int x265_param_parse(x265_param* p, const char* name, const char* value) } } OPT("hist-threshold") p->edgeTransitionThreshold = atof(value); + OPT("traditional-scenecut") p->bEnableTradScdInHscd = atobool(value); OPT("rskip-edge-threshold") p->edgeVarThreshold = atoi(value)/100.0f; OPT("lookahead-threads") p->lookaheadThreads = atoi(value); OPT("opt-cu-delta-qp") p->bOptCUDeltaQP = atobool(value); @@ -2151,7 +2155,9 @@ char *x265_param2string(x265_param* p, int padx, int pady) s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth); s += sprintf(s, " lookahead-slices=%d", p->lookaheadSlices); s += sprintf(s, " scenecut=%d", p->scenecutThreshold); - s += sprintf(s, " hist-scenecut=%d", p->bHistBasedSceneCut); + BOOL(p->bHistBasedSceneCut, "hist-scenecut"); + if (p->bHistBasedSceneCut) + BOOL(p->bEnableTradScdInHscd, "traditional-scenecut"); s += sprintf(s, " radl=%d", p->radl); BOOL(p->bEnableHRDConcatFlag, "splice"); BOOL(p->bIntraRefresh, "intra-refresh"); @@ -2467,6 +2473,7 @@ void x265_copy_params(x265_param* dst, x265_param* src) dst->lookaheadThreads = src->lookaheadThreads; dst->scenecutThreshold = src->scenecutThreshold; dst->bHistBasedSceneCut = src->bHistBasedSceneCut; + dst->bEnableTradScdInHscd = src->bEnableTradScdInHscd; dst->bIntraRefresh = src->bIntraRefresh; dst->maxCUSize = src->maxCUSize; dst->minCUSize = src->minCUSize; diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp index c1e1cb46d..c079e94c4 100644 --- a/source/encoder/encoder.cpp +++ b/source/encoder/encoder.cpp @@ -3680,6 +3680,7 @@ void Encoder::configure(x265_param *p) p->keyframeMax = INT_MAX; p->scenecutThreshold = 0; p->bHistBasedSceneCut = 0; + p->bEnableTradScdInHscd = 1; } else if (p->keyframeMax <= 1) { @@ -3694,6 +3695,7 @@ void Encoder::configure(x265_param *p) p->bframes = 0; p->scenecutThreshold = 0; p->bHistBasedSceneCut = 0; + p->bEnableTradScdInHscd = 1; p->bFrameAdaptive = 0; p->rc.cuTree = 0; p->bEnableWeightedPred = 0; @@ -4421,12 +4423,17 @@ void Encoder::configure(x265_param *p) m_param->searchRange = m_param->hmeRange[2]; } - if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold) - { - p->edgeTransitionThreshold = 0.03; - x265_log(p, X265_LOG_WARNING, "using default threshold %.2lf for scene cut detection\n", p->edgeTransitionThreshold); - } + if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold) + { + p->edgeTransitionThreshold = 0.03; + x265_log(p, X265_LOG_WARNING, "using default threshold %.2lf for scene cut detection.\n", p->edgeTransitionThreshold); + } + if (!p->bHistBasedSceneCut && !p->bEnableTradScdInHscd) + { + p->bEnableTradScdInHscd = 1; + x265_log(p, X265_LOG_WARNING, "option --no-traditional-scenecut requires --hist-scenecut to be enabled.\n"); + } } void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc, const x265_picture* picIn, int paramBytes) diff --git a/source/encoder/slicetype.cpp b/source/encoder/slicetype.cpp index 0adb0d0db..e77f0ac70 100644 --- a/source/encoder/slicetype.cpp +++ b/source/encoder/slicetype.cpp @@ -2014,7 +2014,7 @@ void Lookahead::slicetypeAnalyse(Lowres **frames, bool bKeyframe) bool isScenecut = false; /* Temporal computations for scenecut detection */ - if (m_param->bHistBasedSceneCut) + if (m_param->bHistBasedSceneCut && m_param->bEnableTradScdInHscd) { for (int i = numFrames - 1; i > 0; i--) { @@ -2047,8 +2047,10 @@ void Lookahead::slicetypeAnalyse(Lowres **frames, bool bKeyframe) } /* When scenecut threshold is set, use scenecut detection for I frame placements */ - if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && frames[1]->bScenecut)) + if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && m_param->bEnableTradScdInHscd && frames[1]->bScenecut)) isScenecut = scenecut(frames, 0, 1, true, origNumFrames); + else if (m_param->bHistBasedSceneCut && frames[1]->bScenecut) + isScenecut = true; if (isScenecut && (m_param->bHistBasedSceneCut || m_param->scenecutThreshold)) { @@ -2061,14 +2063,17 @@ void Lookahead::slicetypeAnalyse(Lowres **frames, bool bKeyframe) m_extendGopBoundary = false; for (int i = m_param->bframes + 1; i < origNumFrames; i += m_param->bframes + 1) { - if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && frames[i + 1]->bScenecut)) + if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && m_param->bEnableTradScdInHscd && frames[i + 1]->bScenecut)) scenecut(frames, i, i + 1, true, origNumFrames); for (int j = i + 1; j <= X265_MIN(i + m_param->bframes + 1, origNumFrames); j++) { - if (frames[j]->bScenecut && scenecutInternal(frames, j - 1, j, true)) + if (frames[j]->bScenecut) { - m_extendGopBoundary = true; + if (m_param->bEnableTradScdInHscd) + m_extendGopBoundary = scenecutInternal(frames, j - 1, j, true); + else + m_extendGopBoundary = true; break; } } diff --git a/source/test/regression-tests.txt b/source/test/regression-tests.txt index 971c854df..26d43b28a 100644 --- a/source/test/regression-tests.txt +++ b/source/test/regression-tests.txt @@ -160,6 +160,7 @@ Traffic_4096x2048_30p.y4m, --preset medium --frame-dup --dup-threshold 60 --hrd Kimono1_1920x1080_24_400.yuv,--preset superfast --qp 28 --zones 0,139,q=32 sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut --hist-threshold 0.02 --frame-dup --dup-threshold 60 --hrd --bitrate 10000 --vbv-bufsize 15000 --vbv-maxrate 12000 sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut --hist-threshold 0.02 +sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut --hist-threshold 0.02 --no-traditional-scenecut sintel_trailer_2k_1920x1080_24.yuv, --preset ultrafast --hist-scenecut --hist-threshold 0.02 crowd_run_1920x1080_50.yuv, --preset faster --ctu 32 --rskip 2 --rskip-edge-threshold 5 crowd_run_1920x1080_50.yuv, --preset fast --ctu 64 --rskip 2 --rskip-edge-threshold 5 --aq-mode 4 diff --git a/source/x265.h b/source/x265.h index 324f3163f..3f3133536 100644 --- a/source/x265.h +++ b/source/x265.h @@ -1963,6 +1963,10 @@ typedef struct x265_param /* Flag indicating whether the encoder should emit an End of Sequence * NAL at the end of every Coded Video Sequence. Default false */ int bEnableEndOfSequence; + + /* Flag to turn on/off traditional scenecut detection in histogram based scenecut detection. + * When false, only spatial properties are used for scenecut detection. Default true */ + int bEnableTradScdInHscd; } x265_param; /* x265_param_alloc: diff --git a/source/x265cli.h b/source/x265cli.h index 46a2b68ae..8fcf37b8a 100644 --- a/source/x265cli.h +++ b/source/x265cli.h @@ -144,6 +144,8 @@ static const struct option long_options[] = { "hist-scenecut", no_argument, NULL, 0}, { "no-hist-scenecut", no_argument, NULL, 0}, { "hist-threshold", required_argument, NULL, 0}, + { "traditional-scenecut", no_argument, NULL, 0}, + { "no-traditional-scenecut", no_argument, NULL, 0}, { "fades", no_argument, NULL, 0 }, { "no-fades", no_argument, NULL, 0 }, { "scenecut-aware-qp", required_argument, NULL, 0 }, -- 2.24.0.windows.2 On Fri, Jul 30, 2021 at 3:24 PM Pooja Venkatesan <po...@multicorewareinc.com> wrote: > > > On Fri, Jul 30, 2021 at 2:18 PM Aruna Matheswaran < > ar...@multicorewareinc.com> wrote: > >> >> >> On Thu, Jun 24, 2021 at 2:18 PM Pooja Venkatesan < >> po...@multicorewareinc.com> wrote: >> >>> From f6c1b86d99ab3a0dd57204f930e526a07e28fed7 Mon Sep 17 00:00:00 2001 >>> From: Praveen Karadugattu <praveenku...@multicorewareinc.com> >>> Date: Sun, 20 Jun 2021 21:20:50 +0530 >>> Subject: [PATCH] Disable fall-back on traditional scenecut algorithm with >>> --hist-scenecut >>> >>> --- >>> doc/reST/cli.rst | 9 +++++++-- >>> source/CMakeLists.txt | 2 +- >>> source/common/param.cpp | 8 +++++++- >>> source/encoder/encoder.cpp | 17 ++++++++++++----- >>> source/encoder/slicetype.cpp | 15 ++++++++++----- >>> source/test/regression-tests.txt | 1 + >>> source/x265.h | 4 ++++ >>> source/x265cli.h | 1 + >>> 8 files changed, 43 insertions(+), 14 deletions(-) >>> >>> diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst >>> index 4154221af..280b734b3 100755 >>> --- a/doc/reST/cli.rst >>> +++ b/doc/reST/cli.rst >>> @@ -1470,7 +1470,8 @@ Slice decision options >>> .. option:: --hist-scenecut, --no-hist-scenecut >>> >>> Indicates that scenecuts need to be detected using luma edge and >>> chroma histograms. >>> - :option:`--hist-scenecut` enables scenecut detection using the >>> histograms and disables the default scene cut algorithm. >>> + :option:`--hist-scenecut` enables scenecut detection using the >>> histograms. >>> + It also uses the intra and inter cost info to arrive at a scenecut >>> decision from the default scenecut method. >>> :option:`--no-hist-scenecut` disables histogram based scenecut >>> algorithm. >>> >>> .. option:: --hist-threshold <0.0..1.0> >>> @@ -1480,7 +1481,11 @@ Slice decision options >>> greater than 0.2 against the previous frame as scenecut. >>> Increasing the threshold reduces the number of scenecuts detected. >>> Default 0.03. >>> - >>> + >>> +.. option:: --disable-traditional-scenecut >>> + >>> + Indicates that the usage of traditional scenecut detection using intra >>> and inter cost should be disabled when :option:`--hist-scenecut` is used. >>> + >>> .. option:: --radl <integer> >>> >>> Number of RADL pictures allowed infront of IDR. Requires closed gop >>> interval. >>> diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt >>> index b4e57b592..f4a9cb793 100755 >>> --- a/source/CMakeLists.txt >>> +++ b/source/CMakeLists.txt >>> @@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF) >>> 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 200) >>> +set(X265_BUILD 201) >>> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" >>> "${PROJECT_BINARY_DIR}/x265.def") >>> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" >>> diff --git a/source/common/param.cpp b/source/common/param.cpp >>> index 8a27aaef3..3b84415c3 100755 >>> --- a/source/common/param.cpp >>> +++ b/source/common/param.cpp >>> @@ -172,6 +172,7 @@ void x265_param_default(x265_param* param) >>> param->scenecutThreshold = 40; /* Magic number pulled in from x264 >>> */ >>> param->edgeTransitionThreshold = 0.03; >>> param->bHistBasedSceneCut = 0; >>> + param->bDisableTradScdInHscd = 0; >>> param->lookaheadSlices = 8; >>> param->lookaheadThreads = 0; >>> param->scenecutBias = 5.0; >>> @@ -598,6 +599,7 @@ int x265_param_default_preset(x265_param* param, >>> const char* preset, const char* >>> param->lookaheadDepth = 0; >>> param->scenecutThreshold = 0; >>> param->bHistBasedSceneCut = 0; >>> + param->bDisableTradScdInHscd = 0; >>> param->rc.cuTree = 0; >>> param->frameNumThreads = 1; >>> } >>> @@ -953,6 +955,7 @@ int x265_param_parse(x265_param* p, const char* >>> name, const char* value) >>> bError = false; >>> p->scenecutThreshold = atoi(value); >>> p->bHistBasedSceneCut = 0; >>> + p->bDisableTradScdInHscd = 0; >>> } >>> } >>> OPT("temporal-layers") p->bEnableTemporalSubLayers = atobool(value); >>> @@ -1234,6 +1237,7 @@ int x265_param_parse(x265_param* p, const char* >>> name, const char* value) >>> } >>> } >>> OPT("hist-threshold") p->edgeTransitionThreshold = atof(value); >>> + OPT("disable-traditional-scenecut") p->bDisableTradScdInHscd = >>> atobool(value); >>> OPT("rskip-edge-threshold") p->edgeVarThreshold = >>> atoi(value)/100.0f; >>> OPT("lookahead-threads") p->lookaheadThreads = atoi(value); >>> OPT("opt-cu-delta-qp") p->bOptCUDeltaQP = atobool(value); >>> @@ -2151,7 +2155,8 @@ char *x265_param2string(x265_param* p, int padx, >>> int pady) >>> s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth); >>> s += sprintf(s, " lookahead-slices=%d", p->lookaheadSlices); >>> s += sprintf(s, " scenecut=%d", p->scenecutThreshold); >>> - s += sprintf(s, " hist-scenecut=%d", p->bHistBasedSceneCut); >>> + BOOL(p->bHistBasedSceneCut, "hist-scenecut"); >>> + BOOL(p->bDisableTradScdInHscd, "disable-traditional-scenecut"); >>> >> [AM] This will add invalid CLI option "no-disable-traditional-scenecut" >> to info-sei. Please fix this. >> > [PV] Will modify CLI to take both options to enable/disable traditional > scene cut and resend the patch. > >> s += sprintf(s, " radl=%d", p->radl); >>> BOOL(p->bEnableHRDConcatFlag, "splice"); >>> BOOL(p->bIntraRefresh, "intra-refresh"); >>> @@ -2467,6 +2472,7 @@ void x265_copy_params(x265_param* dst, x265_param* >>> src) >>> dst->lookaheadThreads = src->lookaheadThreads; >>> dst->scenecutThreshold = src->scenecutThreshold; >>> dst->bHistBasedSceneCut = src->bHistBasedSceneCut; >>> + dst->bDisableTradScdInHscd = src->bDisableTradScdInHscd; >>> dst->bIntraRefresh = src->bIntraRefresh; >>> dst->maxCUSize = src->maxCUSize; >>> dst->minCUSize = src->minCUSize; >>> diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp >>> index c1e1cb46d..dfb872889 100644 >>> --- a/source/encoder/encoder.cpp >>> +++ b/source/encoder/encoder.cpp >>> @@ -3680,6 +3680,7 @@ void Encoder::configure(x265_param *p) >>> p->keyframeMax = INT_MAX; >>> p->scenecutThreshold = 0; >>> p->bHistBasedSceneCut = 0; >>> + p->bDisableTradScdInHscd = 0; >>> } >>> else if (p->keyframeMax <= 1) >>> { >>> @@ -3694,6 +3695,7 @@ void Encoder::configure(x265_param *p) >>> p->bframes = 0; >>> p->scenecutThreshold = 0; >>> p->bHistBasedSceneCut = 0; >>> + p->bDisableTradScdInHscd = 0; >>> p->bFrameAdaptive = 0; >>> p->rc.cuTree = 0; >>> p->bEnableWeightedPred = 0; >>> @@ -4421,12 +4423,17 @@ void Encoder::configure(x265_param *p) >>> m_param->searchRange = m_param->hmeRange[2]; >>> } >>> >>> - if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold) >>> - { >>> - p->edgeTransitionThreshold = 0.03; >>> - x265_log(p, X265_LOG_WARNING, "using default threshold %.2lf >>> for scene cut detection\n", p->edgeTransitionThreshold); >>> - } >>> + if (p->bHistBasedSceneCut && !p->edgeTransitionThreshold) >>> + { >>> + p->edgeTransitionThreshold = 0.03; >>> + x265_log(p, X265_LOG_WARNING, "using default threshold %.2lf >>> for scene cut detection.\n", p->edgeTransitionThreshold); >>> + } >>> >>> + if (!p->bHistBasedSceneCut && p->bDisableTradScdInHscd) >>> + { >>> + p->bDisableTradScdInHscd = 0; >>> + x265_log(p, X265_LOG_WARNING, "option >>> --disable-traditional-scenecut requires --hist-scenecut to be enabled.\n"); >>> + } >>> } >>> >>> void Encoder::readAnalysisFile(x265_analysis_data* analysis, int >>> curPoc, const x265_picture* picIn, int paramBytes) >>> diff --git a/source/encoder/slicetype.cpp b/source/encoder/slicetype.cpp >>> index 0adb0d0db..ace3b5469 100644 >>> --- a/source/encoder/slicetype.cpp >>> +++ b/source/encoder/slicetype.cpp >>> @@ -2014,7 +2014,7 @@ void Lookahead::slicetypeAnalyse(Lowres **frames, >>> bool bKeyframe) >>> bool isScenecut = false; >>> >>> /* Temporal computations for scenecut detection */ >>> - if (m_param->bHistBasedSceneCut) >>> + if (m_param->bHistBasedSceneCut && !m_param->bDisableTradScdInHscd) >>> { >>> for (int i = numFrames - 1; i > 0; i--) >>> { >>> @@ -2047,8 +2047,10 @@ void Lookahead::slicetypeAnalyse(Lowres **frames, >>> bool bKeyframe) >>> } >>> >>> /* When scenecut threshold is set, use scenecut detection for I >>> frame placements */ >>> - if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && >>> frames[1]->bScenecut)) >>> + if (!m_param->bHistBasedSceneCut || (m_param->bHistBasedSceneCut && >>> !m_param->bDisableTradScdInHscd && frames[1]->bScenecut)) >>> isScenecut = scenecut(frames, 0, 1, true, origNumFrames); >>> + else if (m_param->bHistBasedSceneCut && frames[1]->bScenecut) >>> + isScenecut = true; >>> >>> if (isScenecut && (m_param->bHistBasedSceneCut || >>> m_param->scenecutThreshold)) >>> { >>> @@ -2061,14 +2063,17 @@ void Lookahead::slicetypeAnalyse(Lowres >>> **frames, bool bKeyframe) >>> m_extendGopBoundary = false; >>> for (int i = m_param->bframes + 1; i < origNumFrames; i += >>> m_param->bframes + 1) >>> { >>> - if (!m_param->bHistBasedSceneCut || >>> (m_param->bHistBasedSceneCut && frames[i + 1]->bScenecut)) >>> + if (!m_param->bHistBasedSceneCut || >>> (m_param->bHistBasedSceneCut && !m_param->bDisableTradScdInHscd && frames[i >>> + 1]->bScenecut)) >>> scenecut(frames, i, i + 1, true, origNumFrames); >>> >>> for (int j = i + 1; j <= X265_MIN(i + m_param->bframes + 1, >>> origNumFrames); j++) >>> { >>> - if (frames[j]->bScenecut && scenecutInternal(frames, j >>> - 1, j, true)) >>> + if (frames[j]->bScenecut) >>> { >>> - m_extendGopBoundary = true; >>> + if (!m_param->bDisableTradScdInHscd) >>> + m_extendGopBoundary = scenecutInternal(frames, >>> j - 1, j, true); >>> + else >>> + m_extendGopBoundary = true; >>> break; >>> } >>> } >>> diff --git a/source/test/regression-tests.txt >>> b/source/test/regression-tests.txt >>> index 971c854df..828157cab 100644 >>> --- a/source/test/regression-tests.txt >>> +++ b/source/test/regression-tests.txt >>> @@ -160,6 +160,7 @@ Traffic_4096x2048_30p.y4m, --preset medium >>> --frame-dup --dup-threshold 60 --hrd >>> Kimono1_1920x1080_24_400.yuv,--preset superfast --qp 28 --zones >>> 0,139,q=32 >>> sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut >>> --hist-threshold 0.02 --frame-dup --dup-threshold 60 --hrd --bitrate 10000 >>> --vbv-bufsize 15000 --vbv-maxrate 12000 >>> sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut >>> --hist-threshold 0.02 >>> +sintel_trailer_2k_1920x1080_24.yuv, --preset medium --hist-scenecut >>> --hist-threshold 0.02 --disable-traditional-scenecut >>> sintel_trailer_2k_1920x1080_24.yuv, --preset ultrafast --hist-scenecut >>> --hist-threshold 0.02 >>> crowd_run_1920x1080_50.yuv, --preset faster --ctu 32 --rskip 2 >>> --rskip-edge-threshold 5 >>> crowd_run_1920x1080_50.yuv, --preset fast --ctu 64 --rskip 2 >>> --rskip-edge-threshold 5 --aq-mode 4 >>> diff --git a/source/x265.h b/source/x265.h >>> index 324f3163f..3a65fdda6 100644 >>> --- a/source/x265.h >>> +++ b/source/x265.h >>> @@ -1963,6 +1963,10 @@ typedef struct x265_param >>> /* Flag indicating whether the encoder should emit an End of >>> Sequence >>> * NAL at the end of every Coded Video Sequence. Default false */ >>> int bEnableEndOfSequence; >>> + >>> + /* Flag to turn off traditional scenecut detection in histogram >>> based scenecut detection so that >>> + * only spatial properties are used for scenecut detection. Default >>> false */ >>> + int bDisableTradScdInHscd; >>> } x265_param; >>> >>> /* x265_param_alloc: >>> diff --git a/source/x265cli.h b/source/x265cli.h >>> index 46a2b68ae..86136fbfb 100644 >>> --- a/source/x265cli.h >>> +++ b/source/x265cli.h >>> @@ -144,6 +144,7 @@ static const struct option long_options[] = >>> { "hist-scenecut", no_argument, NULL, 0}, >>> { "no-hist-scenecut", no_argument, NULL, 0}, >>> { "hist-threshold", required_argument, NULL, 0}, >>> + { "disable-traditional-scenecut", no_argument, NULL, 0}, >>> { "fades", no_argument, NULL, 0 }, >>> { "no-fades", no_argument, NULL, 0 }, >>> { "scenecut-aware-qp", required_argument, NULL, 0 }, >>> -- >>> 2.24.0.windows.2 >>> >>> Regards, >>> *Pooja Venkatesan*, >>> Video Codec Engineer, >>> Media & AI analytics BU >>> >>> _______________________________________________ >>> x265-devel mailing list >>> x265-devel@videolan.org >>> https://mailman.videolan.org/listinfo/x265-devel >>> >> >> >> -- >> Regards, >> *Aruna Matheswaran,* >> Video Codec Engineer, >> Media & AI analytics BU, >> >> >> >> _______________________________________________ >> x265-devel mailing list >> x265-devel@videolan.org >> https://mailman.videolan.org/listinfo/x265-devel >> >
0001-Disable-fall-back-on-traditional-scenecut-algorithm-.patch
Description: Binary data
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel