Index: branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp	(revision 601)
@@ -44,5 +44,7 @@
 //! \ingroup TLibCommon
 //! \{
+#if !SVC_EXTENSION
 UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS]; 
+#endif
 
 SAOOffset::SAOOffset()
@@ -160,5 +162,9 @@
     Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC;
     m_offsetStepLog2  [compIdx] = max(bitDepthSample - MAX_SAO_TRUNCATED_BITDEPTH, 0);
+#if SVC_EXTENSION
+    m_saoMaxOffsetQVal[compIdx] = (1<<(min(bitDepthSample,MAX_SAO_TRUNCATED_BITDEPTH)-5))-1; //Table 9-32, inclusive
+#else
     g_saoMaxOffsetQVal[compIdx] = (1<<(min(bitDepthSample,MAX_SAO_TRUNCATED_BITDEPTH)-5))-1; //Table 9-32, inclusive
+#endif
   }
 
@@ -168,5 +174,9 @@
     Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC; //exclusive
     Int maxSampleValue = (1<< bitDepthSample); //exclusive
+#if SVC_EXTENSION
+    Int maxOffsetValue = (m_saoMaxOffsetQVal[compIdx] << m_offsetStepLog2[compIdx]); 
+#else
     Int maxOffsetValue = (g_saoMaxOffsetQVal[compIdx] << m_offsetStepLog2[compIdx]); 
+#endif
 
     m_offsetClipTable[compIdx] = new Int[(maxSampleValue + maxOffsetValue -1)+ (maxOffsetValue)+1 ]; //positive & negative range plus 0
Index: branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h	(revision 601)
@@ -53,5 +53,7 @@
 // Class definition
 // ====================================================================================================================
+#if !SVC_EXTENSION
 extern UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS]; 
+#endif
 
 class TComSampleAdaptiveOffset
@@ -69,4 +71,7 @@
   Void reconstructBlkSAOParams(TComPic* pic, SAOBlkParam* saoBlkParams);
   Void PCMLFDisableProcess (TComPic* pcPic);
+#if SVC_EXTENSION
+  UInt* getSaoMaxOffsetQVal() { return m_saoMaxOffsetQVal; } 
+#endif
 protected:
   Void offsetBlock(Int compIdx, Int typeIdx, Int* offset, Pel* srcBlk, Pel* resBlk, Int srcStride, Int resStride,  Int width, Int height
@@ -101,5 +106,7 @@
   Int*   m_offsetClipTable[NUM_SAO_COMPONENTS];
   Short* m_signTable;
-
+#if SVC_EXTENSION
+  UInt m_saoMaxOffsetQVal[NUM_SAO_COMPONENTS]; 
+#endif
 };
 
Index: branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.cpp	(revision 601)
@@ -1394,4 +1394,7 @@
 
 Void TDecSbac::parseSAOBlkParam (SAOBlkParam& saoBlkParam
+#if SVC_EXTENSION
+                                , UInt* saoMaxOffsetQVal
+#endif
                                 , Bool* sliceEnabled
                                 , Bool leftMergeAvail
@@ -1468,5 +1471,9 @@
         for(Int i=0; i< 4; i++)
         {
+#if SVC_EXTENSION
+          parseSaoMaxUvlc(uiSymbol,  saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
+#else
           parseSaoMaxUvlc(uiSymbol,  g_saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
+#endif
           offset[i] = (Int)uiSymbol;
         }
Index: branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSbac.h	(revision 601)
@@ -90,5 +90,10 @@
   Void  parseSaoTypeIdx           ( UInt&  ruiVal  );
   Void  parseSaoUflc              ( UInt uiLength, UInt& ruiVal     );
+
+#if SVC_EXTENSION
+  Void parseSAOBlkParam (SAOBlkParam& saoBlkParam, UInt* saoMaxOffsetQVal, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail );
+#else
   Void parseSAOBlkParam (SAOBlkParam& saoBlkParam, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail);
+#endif
   Void parseSaoSign(UInt& val);
 private:
Index: branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.cpp	(revision 601)
@@ -105,9 +105,9 @@
 
 #if SVC_EXTENSION
-Void TDecSlice::init(TDecTop** ppcDecTop,TDecEntropy* pcEntropyDecoder, TDecCu* pcCuDecoder)
+Void TDecSlice::init(TDecEntropy* pcEntropyDecoder, TDecCu* pcCuDecoder, UInt* saoMaxOffsetQVal)
 {
   m_pcEntropyDecoder  = pcEntropyDecoder;
   m_pcCuDecoder       = pcCuDecoder;
-  m_ppcTDecTop        = ppcDecTop;
+  m_saoMaxOffsetQVal  = saoMaxOffsetQVal;
 }
 #else
@@ -347,6 +347,9 @@
           aboveMergeAvail = rpcPic->getSAOMergeAvailability(iCUAddr, iCUAddr-uiWidthInLCUs);
         }
-
+#if SVC_EXTENSION
+        pcSbacDecoder->parseSAOBlkParam( saoblkParam, m_saoMaxOffsetQVal, sliceEnabled, leftMergeAvail, aboveMergeAvail);
+#else
         pcSbacDecoder->parseSAOBlkParam( saoblkParam, sliceEnabled, leftMergeAvail, aboveMergeAvail);
+#endif
       }
       else 
Index: branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecSlice.h	(revision 601)
@@ -72,5 +72,5 @@
   std::vector<TDecSbac*> CTXMem;
 #if SVC_EXTENSION
-  TDecTop**       m_ppcTDecTop;
+  UInt*           m_saoMaxOffsetQVal; 
 #endif 
   
@@ -80,5 +80,5 @@
   
 #if SVC_EXTENSION  
-  Void  init              ( TDecTop** ppcDecTop, TDecEntropy* pcEntropyDecoder, TDecCu* pcMbDecoder );
+  Void  init              ( TDecEntropy* pcEntropyDecoder, TDecCu* pcMbDecoder, UInt* saoMaxOffsetQVal );
 #else
   Void  init              ( TDecEntropy* pcEntropyDecoder, TDecCu* pcMbDecoder );
@@ -91,7 +91,4 @@
   Void      setCtxMem( TDecSbac* sb, Int b )   { CTXMem[b] = sb; }
   Int       getCtxMemSize( )                   { return (Int)CTXMem.size(); }
-#if SVC_EXTENSION
-  TDecTop*  getLayerDec   ( UInt LayerId )  { return m_ppcTDecTop[LayerId]; }  
-#endif
 };
 
Index: branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecTop.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecTop.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibDecoder/TDecTop.cpp	(revision 601)
@@ -138,5 +138,5 @@
 #if SVC_EXTENSION
   m_cGopDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO);
-  m_cSliceDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cCuDecoder );
+  m_cSliceDecoder.init( &m_cEntropyDecoder, &m_cCuDecoder, m_cSAO.getSaoMaxOffsetQVal() );
 #else
   m_cGopDecoder.init( &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO);
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncCavlc.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncCavlc.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncCavlc.h	(revision 601)
@@ -100,5 +100,9 @@
   
   Void codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
+#if SVC_EXTENSION
+  Void codeSAOBlkParam(SAOBlkParam& saoBlkParam, UInt* saoMaxOffsetQVal, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail, Bool onlyEstMergeInfo = false){printf("only supported in CABAC"); assert(0); exit(-1);}
+#else
   Void codeSAOBlkParam(SAOBlkParam& saoBlkParam, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail, Bool onlyEstMergeInfo = false){printf("only supported in CABAC"); assert(0); exit(-1);}
+#endif
   Void codeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx );
   Void codeSkipFlag      ( TComDataCU* pcCU, UInt uiAbsPartIdx );
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncEntropy.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncEntropy.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncEntropy.h	(revision 601)
@@ -105,5 +105,9 @@
   virtual Void codeCoeffNxN      ( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType ) = 0;
   virtual Void codeTransformSkipFlags ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, TextType eTType ) = 0;
+#if SVC_EXTENSION
+  virtual Void codeSAOBlkParam(SAOBlkParam& saoBlkParam, UInt* saoMaxOffsetQVal, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail, Bool onlyEstMergeInfo = false)    =0;
+#else
   virtual Void codeSAOBlkParam(SAOBlkParam& saoBlkParam, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail, Bool onlyEstMergeInfo = false)    =0;
+#endif
   virtual Void estBit               (estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType) = 0;
   
@@ -184,5 +188,9 @@
   
   Void estimateBit             ( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType);
+#if SVC_EXTENSION
+  Void encodeSAOBlkParam(SAOBlkParam& saoBlkParam, UInt* saoMaxOffsetQVal, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail){m_pcEntropyCoderIf->codeSAOBlkParam(saoBlkParam, saoMaxOffsetQVal, sliceEnabled, leftMergeAvail, aboveMergeAvail, false);}
+#else
   Void encodeSAOBlkParam(SAOBlkParam& saoBlkParam, Bool* sliceEnabled, Bool leftMergeAvail, Bool aboveMergeAvail){m_pcEntropyCoderIf->codeSAOBlkParam(saoBlkParam, sliceEnabled, leftMergeAvail, aboveMergeAvail, false);}
+#endif
   static Int countNonZeroCoeffs( TCoeff* pcCoef, UInt uiSize );
 
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp	(revision 601)
@@ -463,5 +463,9 @@
   Int bitDepth = (compIdx== SAO_Y) ? g_bitDepthY : g_bitDepthC;
   Int shift = 2 * DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
+#if SVC_EXTENSION
+  Int offsetTh = getSaoMaxOffsetQVal()[compIdx];  //inclusive
+#else
   Int offsetTh = g_saoMaxOffsetQVal[compIdx];  //inclusive
+#endif
 
   ::memset(quantOffsets, 0, sizeof(Int)*MAX_NUM_SAO_CLASSES);
@@ -582,5 +586,9 @@
   modeParam[SAO_Y ].modeIdc = SAO_MODE_OFF;
   m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
+#if SVC_EXTENSION
+  m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, getSaoMaxOffsetQVal(), sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), true);
+#else
   m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), true);
+#endif
   m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
 
@@ -590,5 +598,9 @@
   modeParam[compIdx].modeIdc = SAO_MODE_OFF;
   m_pcRDGoOnSbacCoder->resetBits();
+#if SVC_EXTENSION
+  m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, modeParam[compIdx], sliceEnabled[compIdx], getSaoMaxOffsetQVal());
+#else
   m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, modeParam[compIdx], sliceEnabled[compIdx]);
+#endif
   modeDist[compIdx] = 0;
   minCost= m_lambda[compIdx]*((Double)m_pcRDGoOnSbacCoder->getNumberOfWrittenBits());
@@ -613,5 +625,9 @@
       m_pcRDGoOnSbacCoder->load(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
       m_pcRDGoOnSbacCoder->resetBits();
+#if SVC_EXTENSION
+      m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx], getSaoMaxOffsetQVal());
+#else
       m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx]);
+#endif
       rate = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
       cost = (Double)dist[compIdx] + m_lambda[compIdx]*((Double)rate);
@@ -638,5 +654,9 @@
     modeDist [component] = 0;
 
+#if SVC_EXTENSION
+    m_pcRDGoOnSbacCoder->codeSAOOffsetParam(component, modeParam[component], sliceEnabled[component], getSaoMaxOffsetQVal());
+#else
     m_pcRDGoOnSbacCoder->codeSAOOffsetParam(component, modeParam[component], sliceEnabled[component]);
+#endif
 
     const UInt currentWrittenBits = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
@@ -672,5 +692,9 @@
       dist[compIdx]= getDistortion(ctu, compIdx, typeIdc, testOffset[compIdx].typeAuxInfo, invQuantOffset, blkStats[ctu][compIdx][typeIdc]);
 
+#if SVC_EXTENSION
+      m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx], getSaoMaxOffsetQVal());
+#else
       m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx]);
+#endif
 
       const UInt currentWrittenBits = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
@@ -699,5 +723,9 @@
   m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
   m_pcRDGoOnSbacCoder->resetBits();
+#if SVC_EXTENSION
+  m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, getSaoMaxOffsetQVal(), sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
+#else
   m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
+#endif
   modeNormCost += (Double)m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
 
@@ -742,5 +770,9 @@
     m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
     m_pcRDGoOnSbacCoder->resetBits();
+#if SVC_EXTENSION
+    m_pcRDGoOnSbacCoder->codeSAOBlkParam(testBlkParam, getSaoMaxOffsetQVal(), sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
+#else
     m_pcRDGoOnSbacCoder->codeSAOBlkParam(testBlkParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
+#endif
     Int rate = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
 
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.cpp	(revision 601)
@@ -1592,5 +1592,9 @@
 }
 
+#if SVC_EXTENSION
+Void TEncSbac::codeSAOOffsetParam(Int compIdx, SAOOffset& ctbParam, Bool sliceEnabled, UInt* saoMaxOffsetQVal)
+#else
 Void TEncSbac::codeSAOOffsetParam(Int compIdx, SAOOffset& ctbParam, Bool sliceEnabled)
+#endif
 {
   UInt uiSymbol;
@@ -1639,5 +1643,9 @@
     for(Int i=0; i< 4; i++)
     {
+#if SVC_EXTENSION
+      codeSaoMaxUvlc((offset[i]<0)?(-offset[i]):(offset[i]),  saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
+#else
       codeSaoMaxUvlc((offset[i]<0)?(-offset[i]):(offset[i]),  g_saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
+#endif
     }
 
@@ -1669,4 +1677,7 @@
 
 Void TEncSbac::codeSAOBlkParam(SAOBlkParam& saoBlkParam
+#if SVC_EXTENSION
+                              , UInt* saoMaxOffsetQVal
+#endif
                               , Bool* sliceEnabled
                               , Bool leftMergeAvail
@@ -1700,5 +1711,9 @@
     for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     {
+#if SVC_EXTENSION
+      codeSAOOffsetParam(compIdx, saoBlkParam[compIdx], sliceEnabled[compIdx], saoMaxOffsetQVal);
+#else
       codeSAOOffsetParam(compIdx, saoBlkParam[compIdx], sliceEnabled[compIdx]);
+#endif
     }
   }
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.h
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.h	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSbac.h	(revision 601)
@@ -104,4 +104,14 @@
   Void  codeScalingList      ( TComScalingList* /*scalingList*/     ){ assert (0);  return;};
 
+#if SVC_EXTENSION
+  Void codeSAOOffsetParam(Int compIdx, SAOOffset& ctbParam, Bool sliceEnabled, UInt* saoMaxOffsetQVal);
+  Void codeSAOBlkParam(SAOBlkParam& saoBlkParam
+                    , UInt* saoMaxOffsetQVal
+                    , Bool* sliceEnabled
+                    , Bool leftMergeAvail
+                    , Bool aboveMergeAvail
+                    , Bool onlyEstMergeInfo = false
+                    );
+#else
   Void codeSAOOffsetParam(Int compIdx, SAOOffset& ctbParam, Bool sliceEnabled);
   Void codeSAOBlkParam(SAOBlkParam& saoBlkParam
@@ -111,4 +121,5 @@
                     , Bool onlyEstMergeInfo = false
                     );
+#endif  
 
 private:
Index: branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSlice.cpp
===================================================================
--- branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSlice.cpp	(revision 596)
+++ branches/SHM-5.0-dev/source/Lib/TLibEncoder/TEncSlice.cpp	(revision 601)
@@ -1356,5 +1356,9 @@
         }
 
+#if SVC_EXTENSION
+        m_pcEntropyCoder->encodeSAOBlkParam(saoblkParam, m_ppcTEncTop[pcSlice->getLayerId()]->getSAO()->getSaoMaxOffsetQVal(), sliceEnabled, leftMergeAvail, aboveMergeAvail);
+#else
         m_pcEntropyCoder->encodeSAOBlkParam(saoblkParam,sliceEnabled, leftMergeAvail, aboveMergeAvail);
+#endif
       }
     }
