Re: [x265] [PATCH 2 of 2] Implement slice-level SAO filter
Please ignore this patch. I have sent an updated version which can be found in the link - https://mailman.videolan.org/pipermail/x265-devel/2019-September/012662.html On Tue, Sep 10, 2019 at 11:08 AM wrote: > # HG changeset patch > # User Soundariya Ranin Venkatesh > # Date 1567501320 -19800 > # Tue Sep 03 14:32:00 2019 +0530 > # Node ID b1799841d3307237a741eb7d097cba2efd76f1eb > # Parent f6d9a0145c4fcd7ac0a2a776a4f99fc431f8fd4a > Implement slice-level SAO filter. > > diff -r f6d9a0145c4f -r b1799841d330 source/encoder/frameencoder.cpp > --- a/source/encoder/frameencoder.cpp Tue Sep 03 14:25:44 2019 +0530 > +++ b/source/encoder/frameencoder.cpp Tue Sep 03 14:32:00 2019 +0530 > @@ -634,14 +634,22 @@ > if (!m_param->bEnableWavefront) > m_backupStreams = new Bitstream[numSubstreams]; > m_substreamSizes = X265_MALLOC(uint32_t, numSubstreams); > -if (!m_param->enableSAO) > +if (!slice->m_bUseSao) > +{ > for (uint32_t i = 0; i < numSubstreams; i++) > m_rows[i].rowGoOnCoder.setBitstream(_outStreams[i]); > +} > } > else > { > for (uint32_t i = 0; i < numSubstreams; i++) > +{ > m_outStreams[i].resetBits(); > +if (!slice->m_bUseSao) > +m_rows[i].rowGoOnCoder.setBitstream(_outStreams[i]); > +else > +m_rows[i].rowGoOnCoder.setBitstream(NULL); > +} > } > > m_rce.encodeOrder = m_frame->m_encodeOrder; > @@ -981,7 +989,7 @@ > m_entropyCoder.setBitstream(_bs); > > // finish encode of each CTU row, only required when SAO is enabled > -if (m_param->enableSAO) > +if (slice->m_bUseSao) > encodeSlice(0); > > m_entropyCoder.setBitstream(_bs); > @@ -1221,7 +1229,7 @@ > const uint32_t lastCUAddr = (slice->m_endCUAddr + > m_param->num4x4Partitions - 1) / m_param->num4x4Partitions; > const uint32_t numSubstreams = m_param->bEnableWavefront ? > slice->m_sps->numCuInHeight : 1; > > -SAOParam* saoParam = slice->m_sps->bUseSAO ? > m_frame->m_encData->m_saoParam : NULL; > +SAOParam* saoParam = slice->m_sps->bUseSAO && slice->m_bUseSao ? > m_frame->m_encData->m_saoParam : NULL; > for (uint32_t cuAddr = sliceAddr; cuAddr < lastCUAddr; cuAddr++) > { > uint32_t col = cuAddr % widthInLCUs; > @@ -1515,11 +1523,11 @@ > curRow.bufferedEntropy.loadContexts(rowCoder); > > /* SAO parameter estimation using non-deblocked pixels for CTU > bottom and right boundary areas */ > -if (m_param->enableSAO && m_param->bSaoNonDeblocked) > +if (slice->m_bUseSao && m_param->bSaoNonDeblocked) > > m_frameFilter.m_parallelFilter[row].m_sao.calcSaoStatsCu_BeforeDblk(m_frame, > col, row); > > /* Deblock with idle threading */ > -if (m_param->bEnableLoopFilter | m_param->enableSAO) > +if (m_param->bEnableLoopFilter | slice->m_bUseSao) > { > // NOTE: in VBV mode, we may reencode anytime, so we can't do > Deblock stage-Horizon and SAO > if (!bIsVbv) > @@ -1833,12 +1841,12 @@ > > /* flush row bitstream (if WPP and no SAO) or flush frame if no WPP > and no SAO */ > /* end_of_sub_stream_one_bit / end_of_slice_segment_flag */ > -if (!m_param->enableSAO && (m_param->bEnableWavefront || > bLastRowInSlice)) > -rowCoder.finishSlice(); > + if (!slice->m_bUseSao && (m_param->bEnableWavefront || > bLastRowInSlice)) > + rowCoder.finishSlice(); > > > /* Processing left Deblock block with current threading */ > -if ((m_param->bEnableLoopFilter | m_param->enableSAO) & (rowInSlice > >= 2)) > +if ((m_param->bEnableLoopFilter | slice->m_bUseSao) & (rowInSlice >= > 2)) > { > /* Check conditional to start previous row process with current > threading */ > if (m_frameFilter.m_parallelFilter[row - 2].m_lastDeblocked.get() > == (int)numCols) > diff -r f6d9a0145c4f -r b1799841d330 source/encoder/frameencoder.h > --- a/source/encoder/frameencoder.h Tue Sep 03 14:25:44 2019 +0530 > +++ b/source/encoder/frameencoder.h Tue Sep 03 14:32:00 2019 +0530 > @@ -150,6 +150,7 @@ > uint32_t m_filterRowDelay; > uint32_t m_filterRowDelayCus; > uint32_t m_refLagRows; > +bool m_bUseSao; > > CTURow* m_rows; > uint16_t m_sliceAddrBits; > ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
Re: [x265] [PATCH 1 of 2] Add option to enable slicetype based SAO filter
Please ignore this patch. I have sent an updated version which can be found in the link - https://mailman.videolan.org/pipermail/x265-devel/2019-September/012661.html On Tue, Sep 10, 2019 at 11:08 AM wrote: > # HG changeset patch > # User Pooja Venkatesan > # Date 1567500944 -19800 > # Tue Sep 03 14:25:44 2019 +0530 > # Node ID f6d9a0145c4fcd7ac0a2a776a4f99fc431f8fd4a > # Parent a092e82e6acfe7afe6a9a381e9ef52323e4e2467 > Add option to enable slicetype based SAO filter. > > diff -r a092e82e6acf -r f6d9a0145c4f doc/reST/cli.rst > --- a/doc/reST/cli.rst Thu Aug 01 22:55:21 2019 +0200 > +++ b/doc/reST/cli.rst Tue Sep 03 14:25:44 2019 +0530 > @@ -1979,9 +1979,22 @@ > If deblocking is disabled, or the offsets are non-zero, these > changes from the default configuration are signaled in the PPS. > > -.. option:: --sao, --no-sao > - > - Toggle Sample Adaptive Offset loop filter, default enabled > +.. option:: --sao <0..4> > + > + Toggle Sample Adaptive Offset loop filter at slice level. Default > 4. > + +--+---+ > + | Level| Description | > + +==+===+ > + | 0 | Disable SAO for all slices| > + +--+---+ > + | 1 | Enable SAO only for I-slices | > + +--+---+ > + | 2 | Enable SAO for I-slices & P-slices| > + +--+---+ > + | 3 | Enable SAO for all reference slices | > + +--+---+ > + | 4 | Enable SAO for all slices | > + +--+---+ > > .. option:: --sao-non-deblock, --no-sao-non-deblock > > diff -r a092e82e6acf -r f6d9a0145c4f source/common/param.cpp > --- a/source/common/param.cpp Thu Aug 01 22:55:21 2019 +0200 > +++ b/source/common/param.cpp Tue Sep 03 14:25:44 2019 +0530 > @@ -212,7 +212,7 @@ > param->bEnableLoopFilter = 1; > > /* SAO Loop Filter */ > -param->bEnableSAO = 1; > +param->enableSAO = 4; > param->bSaoNonDeblocked = 0; > param->bLimitSAO = 0; > > @@ -374,7 +374,7 @@ > param->bFrameAdaptive = 0; > param->subpelRefine = 0; > param->searchMethod = X265_DIA_SEARCH; > -param->bEnableSAO = 0; > +param->enableSAO = 0; > param->bEnableSignHiding = 0; > param->bEnableWeightedPred = 0; > param->rdLevel = 2; > @@ -403,7 +403,7 @@ > param->rc.aqMode = X265_AQ_NONE; > param->rc.hevcAq = 0; > param->rc.qgSize = 32; > -param->bEnableSAO = 0; > +param->enableSAO = 0; > param->bEnableFastIntra = 1; > } > else if (!strcmp(preset, "veryfast")) > @@ -550,7 +550,7 @@ > !strcmp(tune, "fast-decode")) > { > param->bEnableLoopFilter = 0; > -param->bEnableSAO = 0; > +param->enableSAO = 0; > param->bEnableWeightedPred = 0; > param->bEnableWeightedBiPred = 0; > param->bIntraInBFrames = 0; > @@ -577,7 +577,7 @@ > param->bEnableRecursionSkip = 0; > param->psyRd = 4.0; > param->psyRdoq = 10.0; > -param->bEnableSAO = 0; > +param->enableSAO = 0; > param->rc.bEnableConstVbv = 1; > } > else if (!strcmp(tune, "animation")) > @@ -1001,7 +1001,7 @@ > else > p->bEnableLoopFilter = atobool(value); > } > -OPT("sao") p->bEnableSAO = atobool(value); > +OPT("sao") p->enableSAO = atoi(value); > OPT("sao-non-deblock") p->bSaoNonDeblocked = atobool(value); > OPT("ssim") p->bEnableSsim = atobool(value); > OPT("psnr") p->bEnablePsnr = atobool(value); > @@ -1861,7 +1861,7 @@ > TOOLOPT(param->bEnableLoopFilter, "deblock"); > } > TOOLOPT(param->bSaoNonDeblocked, "sao-non-deblock"); > -TOOLOPT(!param->bSaoNonDeblocked && param->bEnableSAO, "sao"); > +TOOLOPT(!param->bSaoNonDeblocked && param->enableSAO, "sao"); > TOOLOPT(param->rc.bStatWrite, "stats-write"); > TOOLOPT(param->rc.bStatRead, "stats-read"); > TOOLOPT(param->bSingleSeiNal, "single-sei"); > @@ -1968,7 +1968,7 @@ > BOOL(p->bEnableLoopFilter, "deblock"); > if (p->bEnableLoopFilter) > s += sprintf(s, "=%d:%d", p->deblockingFilterTCOffset, > p->deblockingFilterBetaOffset); > -BOOL(p->bEnableSAO, "sao"); > +s += sprintf(s, " sao=%d", p->enableSAO); > BOOL(p->bSaoNonDeblocked, "sao-non-deblock"); > s += sprintf(s, " rd=%d", p->rdLevel); > BOOL(p->bEnableEarlySkip, "early-skip"); >
[x265] [PATCH] Fix issue #508 - Crash in case of encoder fail condition
# HG changeset patch # User Pooja Venkatesan # Date 1565673681 -19800 # Tue Aug 13 10:51:21 2019 +0530 # Node ID 1047791ed56e29e6fc1aa2e210998a67ea2409d9 # Parent a092e82e6acfe7afe6a9a381e9ef52323e4e2467 Fix issue #508 - Crash in case of encoder fail condition. This patch also includes: Free memory for zone param. diff -r a092e82e6acf -r 1047791ed56e source/encoder/api.cpp --- a/source/encoder/api.cppThu Aug 01 22:55:21 2019 +0200 +++ b/source/encoder/api.cppTue Aug 13 10:51:21 2019 +0530 @@ -96,7 +96,12 @@ x265_param* param = PARAM_NS::x265_param_alloc(); x265_param* latestParam = PARAM_NS::x265_param_alloc(); x265_param* zoneParam = PARAM_NS::x265_param_alloc(); -if (!param || !latestParam) + +if(param) PARAM_NS::x265_param_default(param); +if(latestParam) PARAM_NS::x265_param_default(latestParam); +if(zoneParam) PARAM_NS::x265_param_default(zoneParam); + +if (!param || !latestParam || !zoneParam) goto fail; if (p->rc.zoneCount || p->rc.zonefileCount) { @@ -106,6 +111,8 @@ } x265_copy_params(param, p); +x265_copy_params(latestParam, p); +x265_copy_params(zoneParam, p); x265_log(param, X265_LOG_INFO, "HEVC encoder version %s\n", PFX(version_str)); x265_log(param, X265_LOG_INFO, "build info %s\n", PFX(build_info_str)); @@ -212,6 +219,7 @@ delete encoder; PARAM_NS::x265_param_free(param); PARAM_NS::x265_param_free(latestParam); +PARAM_NS::x265_param_free(zoneParam); return NULL; } @@ -944,11 +952,11 @@ void x265_zone_free(x265_param *param) { -if (param->rc.zonefileCount) { +if (param && param->rc.zonefileCount) { for (int i = 0; i < param->rc.zonefileCount; i++) x265_free(param->rc.zones[i].zoneParam); } -if (param->rc.zoneCount || param->rc.zonefileCount) +if (param && (param->rc.zoneCount || param->rc.zonefileCount)) x265_free(param->rc.zones); } # HG changeset patch # User Pooja Venkatesan # Date 1565673681 -19800 # Tue Aug 13 10:51:21 2019 +0530 # Node ID 1047791ed56e29e6fc1aa2e210998a67ea2409d9 # Parent a092e82e6acfe7afe6a9a381e9ef52323e4e2467 Fix issue #508 - Crash in case of encoder fail condition. This patch also includes: Free memory for zone param. diff -r a092e82e6acf -r 1047791ed56e source/encoder/api.cpp --- a/source/encoder/api.cpp Thu Aug 01 22:55:21 2019 +0200 +++ b/source/encoder/api.cpp Tue Aug 13 10:51:21 2019 +0530 @@ -96,7 +96,12 @@ x265_param* param = PARAM_NS::x265_param_alloc(); x265_param* latestParam = PARAM_NS::x265_param_alloc(); x265_param* zoneParam = PARAM_NS::x265_param_alloc(); -if (!param || !latestParam) + +if(param) PARAM_NS::x265_param_default(param); +if(latestParam) PARAM_NS::x265_param_default(latestParam); +if(zoneParam) PARAM_NS::x265_param_default(zoneParam); + +if (!param || !latestParam || !zoneParam) goto fail; if (p->rc.zoneCount || p->rc.zonefileCount) { @@ -106,6 +111,8 @@ } x265_copy_params(param, p); +x265_copy_params(latestParam, p); +x265_copy_params(zoneParam, p); x265_log(param, X265_LOG_INFO, "HEVC encoder version %s\n", PFX(version_str)); x265_log(param, X265_LOG_INFO, "build info %s\n", PFX(build_info_str)); @@ -212,6 +219,7 @@ delete encoder; PARAM_NS::x265_param_free(param); PARAM_NS::x265_param_free(latestParam); +PARAM_NS::x265_param_free(zoneParam); return NULL; } @@ -944,11 +952,11 @@ void x265_zone_free(x265_param *param) { -if (param->rc.zonefileCount) { +if (param && param->rc.zonefileCount) { for (int i = 0; i < param->rc.zonefileCount; i++) x265_free(param->rc.zones[i].zoneParam); } -if (param->rc.zoneCount || param->rc.zonefileCount) +if (param && (param->rc.zoneCount || param->rc.zonefileCount)) x265_free(param->rc.zones); } ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] [PATCH 1 of 2] Add option to enable slice-based SAO filter
# HG changeset patch # User Pooja Venkatesan # Date 1567500944 -19800 # Tue Sep 03 14:25:44 2019 +0530 # Node ID 5e791399ec4a0a788f880a9967c9e21fbaa22fa3 # Parent a092e82e6acfe7afe6a9a381e9ef52323e4e2467 Add option to enable slice-based SAO filter. diff -r a092e82e6acf -r 5e791399ec4a doc/reST/cli.rst --- a/doc/reST/cli.rst Thu Aug 01 22:55:21 2019 +0200 +++ b/doc/reST/cli.rst Tue Sep 03 14:25:44 2019 +0530 @@ -1996,6 +1996,24 @@ on inter prediction mode, CTU spatial-domain correlations, and relations between luma and chroma. Default disabled + +.. option:: --selective-sao <0..4> + + Toggles SAO at slice level. Default 4. + + +--+---+ + | Level| Description | + +==+===+ + | 0 | Disable SAO for all slices| + +--+---+ + | 1 | Enable SAO only for I-slices | + +--+---+ + | 2 | Enable SAO for I-slices & P-slices| | + +--+---+ + | 3 | Enable SAO for all reference slices | + +--+---+ + | 4 | Enable SAO for all slices | + +--+---+ VUI (Video Usability Information) options = diff -r a092e82e6acf -r 5e791399ec4a source/CMakeLists.txt --- a/source/CMakeLists.txt Thu Aug 01 22:55:21 2019 +0200 +++ b/source/CMakeLists.txt Tue Sep 03 14:25:44 2019 +0530 @@ -29,7 +29,7 @@ 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 178) +set(X265_BUILD 179) configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" "${PROJECT_BINARY_DIR}/x265.def") configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" diff -r a092e82e6acf -r 5e791399ec4a source/common/param.cpp --- a/source/common/param.cpp Thu Aug 01 22:55:21 2019 +0200 +++ b/source/common/param.cpp Tue Sep 03 14:25:44 2019 +0530 @@ -215,6 +215,7 @@ param->bEnableSAO = 1; param->bSaoNonDeblocked = 0; param->bLimitSAO = 0; +param->selectiveSAO = 4; /* Coding Quality */ param->cbQpOffset = 0; @@ -375,6 +376,7 @@ param->subpelRefine = 0; param->searchMethod = X265_DIA_SEARCH; param->bEnableSAO = 0; +param->selectiveSAO = 0; param->bEnableSignHiding = 0; param->bEnableWeightedPred = 0; param->rdLevel = 2; @@ -404,6 +406,7 @@ param->rc.hevcAq = 0; param->rc.qgSize = 32; param->bEnableSAO = 0; +param->selectiveSAO = 0; param->bEnableFastIntra = 1; } else if (!strcmp(preset, "veryfast")) @@ -551,6 +554,7 @@ { param->bEnableLoopFilter = 0; param->bEnableSAO = 0; +param->selectiveSAO = 0; param->bEnableWeightedPred = 0; param->bEnableWeightedBiPred = 0; param->bIntraInBFrames = 0; @@ -578,6 +582,7 @@ param->psyRd = 4.0; param->psyRdoq = 10.0; param->bEnableSAO = 0; +param->selectiveSAO = 0; param->rc.bEnableConstVbv = 1; } else if (!strcmp(tune, "animation")) @@ -1282,6 +1287,10 @@ OPT("svt-pred-struct") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name); OPT("svt-fps-in-vps") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name); #endif +OPT("selective-sao") +{ +p->selectiveSAO = atoi(value); +} OPT("fades") p->bEnableFades = atobool(value); OPT("field") p->bField = atobool( value ); OPT("cll") p->bEmitCLL = atobool(value); @@ -1686,6 +1695,8 @@ CHECK( (param->bFrameAdaptive==0), "Adaptive B-frame decision method should be closed for field feature.\n" ); // to do } +CHECK(param->selectiveSAO < 0 || param->selectiveSAO > 4, +"Invalid SAO tune level. Value must be between 0 and 4 (inclusive)"); #if !X86_64 CHECK(param->searchMethod == X265_SEA && (param->sourceWidth > 840 || param->sourceHeight > 480), "SEA motion search does not support resolutions greater than 480p in 32 bit build"); @@ -1862,6 +1873,8 @@ } TOOLOPT(param->bSaoNonDeblocked, "sao-non-deblock"); TOOLOPT(!param->bSaoNonDeblocked && param->bEnableSAO, "sao"); +
[x265] [PATCH 2 of 2] Implement slice-level SAO filter
# HG changeset patch # User Soundariya Ranin Venkatesh # Date 1567501320 -19800 # Tue Sep 03 14:32:00 2019 +0530 # Node ID ef2a478cde8712ba9b558257111f4abc50283609 # Parent 5e791399ec4a0a788f880a9967c9e21fbaa22fa3 Implement slice-level SAO filter. diff -r 5e791399ec4a -r ef2a478cde87 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Tue Sep 03 14:25:44 2019 +0530 +++ b/source/encoder/frameencoder.cpp Tue Sep 03 14:32:00 2019 +0530 @@ -634,14 +634,22 @@ if (!m_param->bEnableWavefront) m_backupStreams = new Bitstream[numSubstreams]; m_substreamSizes = X265_MALLOC(uint32_t, numSubstreams); -if (!m_param->bEnableSAO) +if (!slice->m_bUseSao) +{ for (uint32_t i = 0; i < numSubstreams; i++) m_rows[i].rowGoOnCoder.setBitstream(_outStreams[i]); +} } else { for (uint32_t i = 0; i < numSubstreams; i++) +{ m_outStreams[i].resetBits(); +if (!slice->m_bUseSao) +m_rows[i].rowGoOnCoder.setBitstream(_outStreams[i]); +else +m_rows[i].rowGoOnCoder.setBitstream(NULL); +} } m_rce.encodeOrder = m_frame->m_encodeOrder; @@ -981,7 +989,7 @@ m_entropyCoder.setBitstream(_bs); // finish encode of each CTU row, only required when SAO is enabled -if (m_param->bEnableSAO) +if (slice->m_bUseSao) encodeSlice(0); m_entropyCoder.setBitstream(_bs); @@ -1221,7 +1229,7 @@ const uint32_t lastCUAddr = (slice->m_endCUAddr + m_param->num4x4Partitions - 1) / m_param->num4x4Partitions; const uint32_t numSubstreams = m_param->bEnableWavefront ? slice->m_sps->numCuInHeight : 1; -SAOParam* saoParam = slice->m_sps->bUseSAO ? m_frame->m_encData->m_saoParam : NULL; +SAOParam* saoParam = slice->m_sps->bUseSAO && slice->m_bUseSao ? m_frame->m_encData->m_saoParam : NULL; for (uint32_t cuAddr = sliceAddr; cuAddr < lastCUAddr; cuAddr++) { uint32_t col = cuAddr % widthInLCUs; @@ -1515,11 +1523,11 @@ curRow.bufferedEntropy.loadContexts(rowCoder); /* SAO parameter estimation using non-deblocked pixels for CTU bottom and right boundary areas */ -if (m_param->bEnableSAO && m_param->bSaoNonDeblocked) +if (slice->m_bUseSao && m_param->bSaoNonDeblocked) m_frameFilter.m_parallelFilter[row].m_sao.calcSaoStatsCu_BeforeDblk(m_frame, col, row); /* Deblock with idle threading */ -if (m_param->bEnableLoopFilter | m_param->bEnableSAO) +if (m_param->bEnableLoopFilter | slice->m_bUseSao) { // NOTE: in VBV mode, we may reencode anytime, so we can't do Deblock stage-Horizon and SAO if (!bIsVbv) @@ -1833,12 +1841,12 @@ /* flush row bitstream (if WPP and no SAO) or flush frame if no WPP and no SAO */ /* end_of_sub_stream_one_bit / end_of_slice_segment_flag */ -if (!m_param->bEnableSAO && (m_param->bEnableWavefront || bLastRowInSlice)) -rowCoder.finishSlice(); + if (!slice->m_bUseSao && (m_param->bEnableWavefront || bLastRowInSlice)) + rowCoder.finishSlice(); /* Processing left Deblock block with current threading */ -if ((m_param->bEnableLoopFilter | m_param->bEnableSAO) & (rowInSlice >= 2)) +if ((m_param->bEnableLoopFilter | slice->m_bUseSao) & (rowInSlice >= 2)) { /* Check conditional to start previous row process with current threading */ if (m_frameFilter.m_parallelFilter[row - 2].m_lastDeblocked.get() == (int)numCols) diff -r 5e791399ec4a -r ef2a478cde87 source/encoder/frameencoder.h --- a/source/encoder/frameencoder.h Tue Sep 03 14:25:44 2019 +0530 +++ b/source/encoder/frameencoder.h Tue Sep 03 14:32:00 2019 +0530 @@ -150,6 +150,7 @@ uint32_t m_filterRowDelay; uint32_t m_filterRowDelayCus; uint32_t m_refLagRows; +bool m_bUseSao; CTURow* m_rows; uint16_t m_sliceAddrBits; # HG changeset patch # User Soundariya Ranin Venkatesh # Date 1567501320 -19800 # Tue Sep 03 14:32:00 2019 +0530 # Node ID ef2a478cde8712ba9b558257111f4abc50283609 # Parent 5e791399ec4a0a788f880a9967c9e21fbaa22fa3 Implement slice-level SAO filter. diff -r 5e791399ec4a -r ef2a478cde87 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Tue Sep 03 14:25:44 2019 +0530 +++ b/source/encoder/frameencoder.cpp Tue Sep 03 14:32:00 2019 +0530 @@ -634,14 +634,22 @@ if (!m_param->bEnableWavefront) m_backupStreams = new Bitstream[numSubstreams]; m_substreamSizes = X265_MALLOC(uint32_t, numSubstreams); -if (!m_param->bEnableSAO) +if (!slice->m_bUseSao) +{ for (uint32_t i = 0; i < numSubstreams; i++) m_rows[i].rowGoOnCoder.setBitstream(_outStreams[i]); +