Re: [x265] [PATCH 2 of 2] Implement slice-level SAO filter

2019-09-11 Thread Pooja Venkatesan
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

2019-09-11 Thread Pooja Venkatesan
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

2019-09-11 Thread pooja
# 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

2019-09-11 Thread pooja
# 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

2019-09-11 Thread pooja
# 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]);
+