Skip to content
Snippets Groups Projects
Slice.h 144 KiB
Newer Older
  • Learn to ignore specific revisions
  •   void      setAMVREnabledFlag    ( bool b )                                        { m_AMVREnabledFlag = b; }
      bool      getAMVREnabledFlag    ()                                      const     { return m_AMVREnabledFlag; }
    
      void      setUseAffine          ( bool b )                                        { m_Affine = b; }
      bool      getUseAffine          ()                                      const     { return m_Affine; }
      void      setUseAffineType      ( bool b )                                        { m_AffineType = b; }
      bool      getUseAffineType      ()                                      const     { return m_AffineType; }
      void      setUseLMChroma        ( bool b )                                        { m_LMChroma = b; }
      bool      getUseLMChroma        ()                                      const     { return m_LMChroma; }
      void      setCclmCollocatedChromaFlag( bool b )                                   { m_cclmCollocatedChromaFlag = b; }
      bool      getCclmCollocatedChromaFlag()                                 const     { return m_cclmCollocatedChromaFlag; }
      void      setUseMTS             ( bool b )                                        { m_MTS = b; }
      bool      getUseMTS             ()                                      const     { return m_MTS; }
    
    #if JVET_O0541_IMPLICIT_MTS_CONDITION
      bool      getUseImplicitMTS     ()                                      const     { return m_MTS && !m_IntraMTS; }
    #else
    
      bool      getUseImplicitMTS     ()                                      const     { return m_MTS && !m_IntraMTS && !m_InterMTS; }
    
      void      setUseIntraMTS        ( bool b )                                        { m_IntraMTS = b; }
      bool      getUseIntraMTS        ()                                      const     { return m_IntraMTS; }
      void      setUseInterMTS        ( bool b )                                        { m_InterMTS = b; }
      bool      getUseInterMTS        ()                                      const     { return m_InterMTS; }
    
      void      setUseLFNST           ( bool b )                                        { m_LFNST = b; }
      bool      getUseLFNST           ()                                      const     { return m_LFNST; }
    
      void      setUseSMVD(bool b)                                                      { m_SMVD = b; }
      bool      getUseSMVD()                                                  const     { return m_SMVD; }
    
      void      setUseGBi             ( bool b )                                        { m_GBi = b; }
      bool      getUseGBi             ()                                      const     { return m_GBi; }
    #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
      void      setLadfEnabled        ( bool b )                                        { m_LadfEnabled = b; }
      bool      getLadfEnabled        ()                                      const     { return m_LadfEnabled; }
      void      setLadfNumIntervals   ( int i )                                         { m_LadfNumIntervals = i; }
      int       getLadfNumIntervals   ()                                      const     { return m_LadfNumIntervals; }
      void      setLadfQpOffset       ( int value, int idx )                            { m_LadfQpOffset[ idx ] = value; }
      int       getLadfQpOffset       ( int idx )                             const     { return m_LadfQpOffset[ idx ]; }
      void      setLadfIntervalLowerBound( int value, int idx )                         { m_LadfIntervalLowerBound[ idx ] = value; }
      int       getLadfIntervalLowerBound( int idx )                          const     { return m_LadfIntervalLowerBound[ idx ]; }
    #endif
    
      void      setUseMHIntra         ( bool b )                                        { m_MHIntra = b; }
      bool      getUseMHIntra         ()                                      const     { return m_MHIntra; }
      void      setUseTriangle        ( bool b )                                        { m_Triangle = b; }
      bool      getUseTriangle        ()                                      const     { return m_Triangle; }
    
      void      setUseMIP             ( bool b )                                        { m_MIP = b; }
      bool      getUseMIP             ()                                      const     { return m_MIP; }
    
    };
    
    
    /// Reference Picture Lists class
    
    
    /// PPS RExt class
    class PPSRExt // Names aligned to text specification
    {
    private:
      int              m_log2MaxTransformSkipBlockSize;
      bool             m_crossComponentPredictionEnabledFlag;
    
      // Chroma QP Adjustments
    
      int              m_cuChromaQpOffsetSubdiv;
    
      int              m_chromaQpOffsetListLen; // size (excludes the null entry used in the following array).
      ChromaQpAdj      m_ChromaQpAdjTableIncludingNullEntry[1+MAX_QP_OFFSET_LIST_SIZE]; //!< Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
    
      uint32_t             m_log2SaoOffsetScale[MAX_NUM_CHANNEL_TYPE];
    
    public:
      PPSRExt();
    
      bool settingsDifferFromDefaults(const bool bTransformSkipEnabledFlag) const
      {
        return (bTransformSkipEnabledFlag && (getLog2MaxTransformSkipBlockSize() !=2))
            || (getCrossComponentPredictionEnabledFlag() )
            || (getChromaQpOffsetListEnabledFlag() )
            || (getLog2SaoOffsetScale(CHANNEL_TYPE_LUMA) !=0 )
            || (getLog2SaoOffsetScale(CHANNEL_TYPE_CHROMA) !=0 );
      }
    
      uint32_t                   getLog2MaxTransformSkipBlockSize() const                         { return m_log2MaxTransformSkipBlockSize;         }
      void                   setLog2MaxTransformSkipBlockSize( uint32_t u )                       { m_log2MaxTransformSkipBlockSize  = u;           }
    
      bool                   getCrossComponentPredictionEnabledFlag() const                   { return m_crossComponentPredictionEnabledFlag;   }
      void                   setCrossComponentPredictionEnabledFlag(bool value)               { m_crossComponentPredictionEnabledFlag = value;  }
    
      void                   clearChromaQpOffsetList()                                        { m_chromaQpOffsetListLen = 0;                    }
    
    
      uint32_t               getCuChromaQpOffsetSubdiv () const                               { return m_cuChromaQpOffsetSubdiv;                }
      void                   setCuChromaQpOffsetSubdiv ( uint32_t u )                         { m_cuChromaQpOffsetSubdiv = u;                   }
    
    
      bool                   getChromaQpOffsetListEnabledFlag() const                         { return getChromaQpOffsetListLen()>0;            }
      int                    getChromaQpOffsetListLen() const                                 { return m_chromaQpOffsetListLen;                 }
    
      const ChromaQpAdj&     getChromaQpOffsetListEntry( int cuChromaQpOffsetIdxPlus1 ) const
      {
        CHECK(cuChromaQpOffsetIdxPlus1 >= m_chromaQpOffsetListLen+1, "Invalid chroma QP offset");
        return m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1]; // Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
      }
    
    
    Yu Han's avatar
    Yu Han committed
    #if JVET_O1168_CU_CHROMA_QP_OFFSET
      void                   setChromaQpOffsetListEntry( int cuChromaQpOffsetIdxPlus1, int cbOffset, int crOffset, int jointCbCrOffset )
    #else
    
      void                   setChromaQpOffsetListEntry( int cuChromaQpOffsetIdxPlus1, int cbOffset, int crOffset )
    
    Yu Han's avatar
    Yu Han committed
    #endif
    
      {
        CHECK(cuChromaQpOffsetIdxPlus1 == 0 || cuChromaQpOffsetIdxPlus1 > MAX_QP_OFFSET_LIST_SIZE, "Invalid chroma QP offset");
        m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.CbOffset = cbOffset; // Array includes entry [0] for the null offset used when cu_chroma_qp_offset_flag=0, and entries [cu_chroma_qp_offset_idx+1...] otherwise
        m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.CrOffset = crOffset;
    
    Yu Han's avatar
    Yu Han committed
    #if JVET_O1168_CU_CHROMA_QP_OFFSET
        m_ChromaQpAdjTableIncludingNullEntry[cuChromaQpOffsetIdxPlus1].u.comp.JointCbCrOffset = jointCbCrOffset;
    #endif
    
        m_chromaQpOffsetListLen = std::max(m_chromaQpOffsetListLen, cuChromaQpOffsetIdxPlus1);
      }
    
      // Now: getPpsRangeExtension().getLog2SaoOffsetScale and getPpsRangeExtension().setLog2SaoOffsetScale
      uint32_t                   getLog2SaoOffsetScale(ChannelType type) const                    { return m_log2SaoOffsetScale[type];             }
      void                   setLog2SaoOffsetScale(ChannelType type, uint32_t uiBitShift)         { m_log2SaoOffsetScale[type] = uiBitShift;       }
    
    };
    
    
    /// PPS class
    class PPS
    {
    private:
      int              m_PPSId;                    // pic_parameter_set_id
      int              m_SPSId;                    // seq_parameter_set_id
      int              m_picInitQPMinus26;
      bool             m_useDQP;
      bool             m_bConstrainedIntraPred;    // constrained_intra_pred_flag
      bool             m_bSliceChromaQpFlag;       // slicelevel_chroma_qp_flag
    
      // access channel
    
      uint32_t         m_cuQpDeltaSubdiv;           // cu_qp_delta_subdiv
    
      int              m_chromaCbCrQpOffset;
    
    
      uint32_t             m_numRefIdxL0DefaultActive;
      uint32_t             m_numRefIdxL1DefaultActive;
    
    
    Hendry's avatar
    Hendry committed
      bool             m_rpl1IdxPresentFlag;
    
    
      bool             m_bUseWeightPred;                    //!< Use of Weighting Prediction (P_SLICE)
      bool             m_useWeightedBiPred;                 //!< Use of Weighting Bi-Prediction (B_SLICE)
      bool             m_OutputFlagPresentFlag;             //!< Indicates the presence of output_flag in slice header
      bool             m_TransquantBypassEnabledFlag;       //!< Indicates presence of cu_transquant_bypass_flag in CUs.
    
      bool             m_entropyCodingSyncEnabledFlag;      //!< Indicates the presence of wavefronts
    
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      bool             m_loopFilterAcrossBricksEnabledFlag;
      bool             m_uniformTileSpacingFlag;
    
      int              m_numTileColumnsMinus1;
      int              m_numTileRowsMinus1;
      std::vector<int> m_tileColumnWidth;
      std::vector<int> m_tileRowHeight;
    
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      bool             m_singleTileInPicFlag;
      int              m_tileColsWidthMinus1;
      int              m_tileRowsHeightMinus1;
      bool             m_brickSplittingPresentFlag;
      std::vector<bool> m_brickSplitFlag;
      std::vector<bool> m_uniformBrickSpacingFlag;
      std::vector<int> m_brickHeightMinus1;
      std::vector<int> m_numBrickRowsMinus1;
      std::vector<std::vector<int>> m_brickRowHeightMinus1;
      bool             m_singleBrickPerSliceFlag;
      bool             m_rectSliceFlag;
      int              m_numSlicesInPicMinus1;
    
      std::vector<int> m_topLeftBrickIdx;
      std::vector<int> m_bottomRightBrickIdx;
    
      int              m_numTilesInPic;
      int              m_numBricksInPic;
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      bool             m_signalledSliceIdFlag;
      int              m_signalledSliceIdLengthMinus1;
      std::vector<int> m_sliceId;
    
    
      bool             m_cabacInitPresentFlag;
    
      bool             m_sliceHeaderExtensionPresentFlag;
      bool             m_loopFilterAcrossSlicesEnabledFlag;
      bool             m_deblockingFilterControlPresentFlag;
      bool             m_deblockingFilterOverrideEnabledFlag;
      bool             m_ppsDeblockingFilterDisabledFlag;
      int              m_deblockingFilterBetaOffsetDiv2;    //< beta offset for deblocking filter
      int              m_deblockingFilterTcOffsetDiv2;      //< tc offset for deblocking filter
      bool             m_scalingListPresentFlag;
      ScalingList      m_scalingList;                       //!< ScalingList class
      bool             m_listsModificationPresentFlag;
      uint32_t             m_log2ParallelMergeLevelMinus2;
      int              m_numExtraSliceHeaderBits;
    
    
      bool             m_loopFilterAcrossVirtualBoundariesDisabledFlag;
      unsigned         m_numVerVirtualBoundaries;
      unsigned         m_numHorVirtualBoundaries;
      unsigned         m_virtualBoundariesPosX[3];
      unsigned         m_virtualBoundariesPosY[3];
    
    
      PPSRExt          m_ppsRangeExtension;
    
    public:
      PreCalcValues   *pcv;
    
    public:
                             PPS();
      virtual                ~PPS();
    
      int                    getPPSId() const                                                 { return m_PPSId;                               }
      void                   setPPSId(int i)                                                  { m_PPSId = i;                                  }
      int                    getSPSId() const                                                 { return m_SPSId;                               }
      void                   setSPSId(int i)                                                  { m_SPSId = i;                                  }
    
      int                    getPicInitQPMinus26() const                                      { return  m_picInitQPMinus26;                   }
      void                   setPicInitQPMinus26( int i )                                     { m_picInitQPMinus26 = i;                       }
      bool                   getUseDQP() const                                                { return m_useDQP;                              }
      void                   setUseDQP( bool b )                                              { m_useDQP   = b;                               }
      bool                   getConstrainedIntraPred() const                                  { return  m_bConstrainedIntraPred;              }
      void                   setConstrainedIntraPred( bool b )                                { m_bConstrainedIntraPred = b;                  }
      bool                   getSliceChromaQpFlag() const                                     { return  m_bSliceChromaQpFlag;                 }
      void                   setSliceChromaQpFlag( bool b )                                   { m_bSliceChromaQpFlag = b;                     }
    
    
      void                   setCuQpDeltaSubdiv( uint32_t u )                                 { m_cuQpDeltaSubdiv = u;                         }
      uint32_t               getCuQpDeltaSubdiv() const                                       { return m_cuQpDeltaSubdiv;                      }
    
    
      void                   setQpOffset(ComponentID compID, int i )
      {
        if      (compID==COMPONENT_Cb)
        {
          m_chromaCbQpOffset = i;
        }
        else if (compID==COMPONENT_Cr)
        {
          m_chromaCrQpOffset = i;
        }
    
        else if (compID==JOINT_CbCr)
        {
          m_chromaCbCrQpOffset = i;
        }
    
        else
        {
          THROW( "Invalid chroma QP offset" );
        }
      }
      int                    getQpOffset(ComponentID compID) const
      {
    
        return (compID==COMPONENT_Y) ? 0 : (compID==COMPONENT_Cb ? m_chromaCbQpOffset : compID==COMPONENT_Cr ? m_chromaCrQpOffset : m_chromaCbCrQpOffset );
    
      }
    
      void                   setNumRefIdxL0DefaultActive(uint32_t ui)                             { m_numRefIdxL0DefaultActive=ui;                }
      uint32_t                   getNumRefIdxL0DefaultActive() const                              { return m_numRefIdxL0DefaultActive;            }
      void                   setNumRefIdxL1DefaultActive(uint32_t ui)                             { m_numRefIdxL1DefaultActive=ui;                }
      uint32_t                   getNumRefIdxL1DefaultActive() const                              { return m_numRefIdxL1DefaultActive;            }
    
    
    Hendry's avatar
    Hendry committed
      void                   setRpl1IdxPresentFlag(bool isPresent)                            { m_rpl1IdxPresentFlag = isPresent;             }
      uint32_t               getRpl1IdxPresentFlag() const                                    { return m_rpl1IdxPresentFlag;                  }
    
    
      bool                   getUseWP() const                                                 { return m_bUseWeightPred;                      }
      bool                   getWPBiPred() const                                              { return m_useWeightedBiPred;                   }
      void                   setUseWP( bool b )                                               { m_bUseWeightPred = b;                         }
      void                   setWPBiPred( bool b )                                            { m_useWeightedBiPred = b;                      }
    
      void                   setOutputFlagPresentFlag( bool b )                               { m_OutputFlagPresentFlag = b;                  }
      bool                   getOutputFlagPresentFlag() const                                 { return m_OutputFlagPresentFlag;               }
      void                   setTransquantBypassEnabledFlag( bool b )                         { m_TransquantBypassEnabledFlag = b;            }
      bool                   getTransquantBypassEnabledFlag() const                           { return m_TransquantBypassEnabledFlag;         }
    
    
      bool                   getUseTransformSkip() const                                      { return m_useTransformSkip;                    }
      void                   setUseTransformSkip( bool b )                                    { m_useTransformSkip  = b;                      }
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      void                   setLoopFilterAcrossBricksEnabledFlag(bool b)                     { m_loopFilterAcrossBricksEnabledFlag = b;      }
      bool                   getLoopFilterAcrossBricksEnabledFlag() const                     { return m_loopFilterAcrossBricksEnabledFlag;   }
    
      bool                   getEntropyCodingSyncEnabledFlag() const                          { return m_entropyCodingSyncEnabledFlag;        }
      void                   setEntropyCodingSyncEnabledFlag(bool val)                        { m_entropyCodingSyncEnabledFlag = val;         }
    
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      void                   setUniformTileSpacingFlag(bool b)                                { m_uniformTileSpacingFlag = b;                 }
      bool                   getUniformTileSpacingFlag() const                                { return m_uniformTileSpacingFlag;              }
    
      void                   setNumTileColumnsMinus1(int i)                                   { m_numTileColumnsMinus1 = i;                   }
      int                    getNumTileColumnsMinus1() const                                  { return m_numTileColumnsMinus1;                }
      void                   setTileColumnWidth(const std::vector<int>& columnWidth )         { m_tileColumnWidth = columnWidth;              }
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      uint32_t               getTileColumnWidth(uint32_t columnIdx) const                     { return  m_tileColumnWidth[columnIdx];         }
    
      void                   setNumTileRowsMinus1(int i)                                      { m_numTileRowsMinus1 = i;                      }
      int                    getNumTileRowsMinus1() const                                     { return m_numTileRowsMinus1;                   }
      void                   setTileRowHeight(const std::vector<int>& rowHeight)              { m_tileRowHeight = rowHeight;                  }
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      uint32_t               getTileRowHeight(uint32_t rowIdx) const                          { return m_tileRowHeight[rowIdx];               }
    
      bool                   getSingleTileInPicFlag() const                                   { return m_singleTileInPicFlag;                 }
      void                   setSingleTileInPicFlag(bool val)                                 { m_singleTileInPicFlag = val;                  }
      int                    getTileColsWidthMinus1() const                                   { return m_tileColsWidthMinus1;                 }
      void                   setTileColsWidthMinus1(int w)                                    { m_tileColsWidthMinus1 = w;                    }
      int                    getTileRowsHeightMinus1() const                                  { return m_tileRowsHeightMinus1;                }
      void                   setTileRowsHeightMinus1(int h)                                   { m_tileRowsHeightMinus1 = h;                   }
      bool                   getBrickSplittingPresentFlag() const                             { return m_brickSplittingPresentFlag;           }
      void                   setBrickSplittingPresentFlag(bool b)                             { m_brickSplittingPresentFlag = b;              }
      bool                   getBrickSplitFlag(int i) const                                   { return m_brickSplitFlag[i];                   }
      void                   setBrickSplitFlag(std::vector<bool>& val)                        { m_brickSplitFlag = val;                       }
      bool                   getUniformBrickSpacingFlag(int i) const                          { return m_uniformBrickSpacingFlag[i];          }
      void                   setUniformBrickSpacingFlag(std::vector<bool>& val)               { m_uniformBrickSpacingFlag = val;              }
      int                    getBrickHeightMinus1(int i) const                                { return m_brickHeightMinus1[i];                }
      void                   setBrickHeightMinus1(std::vector<int>& val)                      { m_brickHeightMinus1 = val;                    }
      int                    getNumBrickRowsMinus1(int i) const                               { return m_numBrickRowsMinus1[i];               }
      void                   setNumBrickRowsMinus1(std::vector<int>& val)                     { m_numBrickRowsMinus1 = val;                   }
      int                    getBrickRowHeightMinus1(int i, int j) const                      { return m_brickRowHeightMinus1[i][j];          }
      void                   setBrickRowHeightMinus1(std::vector<std::vector<int>>& val)      { m_brickRowHeightMinus1 = val;                 }
      bool                   getSingleBrickPerSliceFlag() const                               { return m_singleBrickPerSliceFlag;             }
      void                   setSingleBrickPerSliceFlag(bool val)                             { m_singleBrickPerSliceFlag = val;              }
      bool                   getRectSliceFlag() const                                         { return m_rectSliceFlag;                       }
      void                   setRectSliceFlag(bool val)                                       { m_rectSliceFlag = val;                        }
      int                    getNumSlicesInPicMinus1() const                                  { return m_numSlicesInPicMinus1;                }
      void                   setNumSlicesInPicMinus1(int val)                                 { m_numSlicesInPicMinus1 = val;                 }
    
      int                    getTopLeftBrickIdx(uint32_t columnIdx) const                     { return  m_topLeftBrickIdx[columnIdx];         }
      void                   setTopLeftBrickIdx(const std::vector<int>& val)                  { m_topLeftBrickIdx = val;                      }
      int                    getBottomRightBrickIdx(uint32_t columnIdx) const                 { return  m_bottomRightBrickIdx[columnIdx];     }
      void                   setBottomRightBrickIdx(const std::vector<int>& val)              { m_bottomRightBrickIdx = val;                  }
      int                    getNumTilesInPic() const                                         { return m_numTilesInPic;                       }
      void                   setNumTilesInPic(int val)                                        { m_numTilesInPic = val;                        }
      int                    getNumBricksInPic() const                                        { return m_numBricksInPic;                      }
      void                   setNumBricksInPic(int val)                                       { m_numBricksInPic = val;                       }
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      bool                   getSignalledSliceIdFlag() const                                  { return m_signalledSliceIdFlag;                }
      void                   setSignalledSliceIdFlag(bool val)                                { m_signalledSliceIdFlag = val;                 }
      int                    getSignalledSliceIdLengthMinus1() const                          { return m_signalledSliceIdLengthMinus1;        }
      void                   setSignalledSliceIdLengthMinus1(int val)                         { m_signalledSliceIdLengthMinus1 = val;         }
      int                    getSliceId(uint32_t columnIdx) const                             { return  m_sliceId[columnIdx];                 }
      void                   setSliceId(const std::vector<int>& val)                          { m_sliceId = val;                              }
    
    
      void                   setCabacInitPresentFlag( bool flag )                             { m_cabacInitPresentFlag = flag;                }
      bool                   getCabacInitPresentFlag() const                                  { return m_cabacInitPresentFlag;                }
      void                   setDeblockingFilterControlPresentFlag( bool val )                { m_deblockingFilterControlPresentFlag = val;   }
      bool                   getDeblockingFilterControlPresentFlag() const                    { return m_deblockingFilterControlPresentFlag;  }
      void                   setDeblockingFilterOverrideEnabledFlag( bool val )               { m_deblockingFilterOverrideEnabledFlag = val;  }
      bool                   getDeblockingFilterOverrideEnabledFlag() const                   { return m_deblockingFilterOverrideEnabledFlag; }
      void                   setPPSDeblockingFilterDisabledFlag(bool val)                     { m_ppsDeblockingFilterDisabledFlag = val;      } //!< set offset for deblocking filter disabled
      bool                   getPPSDeblockingFilterDisabledFlag() const                       { return m_ppsDeblockingFilterDisabledFlag;     } //!< get offset for deblocking filter disabled
      void                   setDeblockingFilterBetaOffsetDiv2(int val)                       { m_deblockingFilterBetaOffsetDiv2 = val;       } //!< set beta offset for deblocking filter
      int                    getDeblockingFilterBetaOffsetDiv2() const                        { return m_deblockingFilterBetaOffsetDiv2;      } //!< get beta offset for deblocking filter
      void                   setDeblockingFilterTcOffsetDiv2(int val)                         { m_deblockingFilterTcOffsetDiv2 = val;         } //!< set tc offset for deblocking filter
      int                    getDeblockingFilterTcOffsetDiv2() const                          { return m_deblockingFilterTcOffsetDiv2;        } //!< get tc offset for deblocking filter
      bool                   getScalingListPresentFlag() const                                { return m_scalingListPresentFlag;              }
      void                   setScalingListPresentFlag( bool b )                              { m_scalingListPresentFlag  = b;                }
      ScalingList&           getScalingList()                                                 { return m_scalingList;                         }
      const ScalingList&     getScalingList() const                                           { return m_scalingList;                         }
      bool                   getListsModificationPresentFlag() const                          { return m_listsModificationPresentFlag;        }
      void                   setListsModificationPresentFlag( bool b )                        { m_listsModificationPresentFlag = b;           }
      uint32_t                   getLog2ParallelMergeLevelMinus2() const                          { return m_log2ParallelMergeLevelMinus2;        }
      void                   setLog2ParallelMergeLevelMinus2(uint32_t mrgLevel)                   { m_log2ParallelMergeLevelMinus2 = mrgLevel;    }
      int                    getNumExtraSliceHeaderBits() const                               { return m_numExtraSliceHeaderBits;             }
      void                   setNumExtraSliceHeaderBits(int i)                                { m_numExtraSliceHeaderBits = i;                }
      void                   setLoopFilterAcrossSlicesEnabledFlag( bool bValue )              { m_loopFilterAcrossSlicesEnabledFlag = bValue; }
      bool                   getLoopFilterAcrossSlicesEnabledFlag() const                     { return m_loopFilterAcrossSlicesEnabledFlag;   }
      bool                   getSliceHeaderExtensionPresentFlag() const                       { return m_sliceHeaderExtensionPresentFlag;     }
      void                   setSliceHeaderExtensionPresentFlag(bool val)                     { m_sliceHeaderExtensionPresentFlag = val;      }
    
    
      void                   setLoopFilterAcrossVirtualBoundariesDisabledFlag(bool b)         { m_loopFilterAcrossVirtualBoundariesDisabledFlag = b; }
      bool                   getLoopFilterAcrossVirtualBoundariesDisabledFlag() const         { return m_loopFilterAcrossVirtualBoundariesDisabledFlag; }
      void                   setNumVerVirtualBoundaries(unsigned u)                           { m_numVerVirtualBoundaries = u;                }
      unsigned               getNumVerVirtualBoundaries() const                               { return m_numVerVirtualBoundaries;             }
      void                   setNumHorVirtualBoundaries(unsigned u)                           { m_numHorVirtualBoundaries = u;                }
      unsigned               getNumHorVirtualBoundaries() const                               { return m_numHorVirtualBoundaries;             }
      void                   setVirtualBoundariesPosX(unsigned u, unsigned idx)               { m_virtualBoundariesPosX[idx] = u;             }
      unsigned               getVirtualBoundariesPosX(unsigned idx) const                     { return m_virtualBoundariesPosX[idx];          }
      void                   setVirtualBoundariesPosY(unsigned u, unsigned idx)               { m_virtualBoundariesPosY[idx] = u;             }
      unsigned               getVirtualBoundariesPosY(unsigned idx) const                     { return m_virtualBoundariesPosY[idx];          }
    
    
      const PPSRExt&         getPpsRangeExtension() const                                     { return m_ppsRangeExtension;                   }
      PPSRExt&               getPpsRangeExtension()                                           { return m_ppsRangeExtension;                   }
    };
    
    
    Hendry's avatar
    Hendry committed
    class APS
    {
    private:
      int                    m_APSId;                    // adaptation_parameter_set_id
    
      int                    m_APSType;                  // aps_params_type
    
    Hendry's avatar
    Hendry committed
      AlfSliceParam          m_alfAPSParam;
    
      SliceReshapeInfo       m_reshapeAPSInfo;
    
    Hendry's avatar
    Hendry committed
    
    public:
      APS();
      virtual                ~APS();
    
      int                    getAPSId() const                                                 { return m_APSId;                               }
      void                   setAPSId(int i)                                                  { m_APSId = i;                                  }
    
    
      int                    getAPSType() const                                               { return m_APSType;                             }
      void                   setAPSType(int type)                                             { m_APSType = type;                             }
    
    
    Hendry's avatar
    Hendry committed
      void                   setAlfAPSParam(AlfSliceParam& alfAPSParam)                       { m_alfAPSParam = alfAPSParam;                  }
    
      void                   setTemporalId(int i) { m_alfAPSParam.tLayer = i; }
      int                    getTemporalId() { return m_alfAPSParam.tLayer; }
      AlfSliceParam&         getAlfAPSParam()  { return m_alfAPSParam; }
    
    
      void                   setReshaperAPSInfo(SliceReshapeInfo& reshapeAPSInfo)             { m_reshapeAPSInfo = reshapeAPSInfo;            }
      SliceReshapeInfo&      getReshaperAPSInfo()                                             { return m_reshapeAPSInfo;                      }
    
    Hendry's avatar
    Hendry committed
    };
    
    struct WPScalingParam
    {
      // Explicit weighted prediction parameters parsed in slice header,
      // or Implicit weighted prediction parameters (8 bits depth values).
      bool bPresentFlag;
      uint32_t uiLog2WeightDenom;
      int  iWeight;
      int  iOffset;
    
      // Weighted prediction scaling values built from above parameters (bitdepth scaled):
      int  w;
      int  o;
      int  offset;
      int  shift;
      int  round;
    
    };
    struct WPACDCParam
    {
      int64_t iAC;
      int64_t iDC;
    };
    
    /// slice header class
    class Slice
    {
    
    private:
      //  Bitstream writing
      bool                       m_saoEnabledFlag[MAX_NUM_CHANNEL_TYPE];
      int                        m_iPPSId;               ///< picture parameter set ID
      bool                       m_PicOutputFlag;        ///< pic_output_flag
      int                        m_iPOC;
      int                        m_iLastIDR;
      int                        m_iAssociatedIRAP;
      NalUnitType                m_iAssociatedIRAPType;
    
    Hendry's avatar
    Hendry committed
      const ReferencePictureList* m_pRPL0;                //< pointer to RPL for L0, either in the SPS or the local RPS in the same slice header
      const ReferencePictureList* m_pRPL1;                //< pointer to RPL for L1, either in the SPS or the local RPS in the same slice header
      ReferencePictureList        m_localRPL0;            //< RPL for L0 when present in slice header
      ReferencePictureList        m_localRPL1;            //< RPL for L1 when present in slice header
      int                         m_rpl0Idx;              //< index of used RPL in the SPS or -1 for local RPL in the slice header
      int                         m_rpl1Idx;              //< index of used RPL in the SPS or -1 for local RPL in the slice header
    
      NalUnitType                m_eNalUnitType;         ///< Nal unit type for the slice
      SliceType                  m_eSliceType;
      int                        m_iSliceQp;
      int                        m_iSliceQpBase;
      bool                       m_ChromaQpAdjEnabled;
      bool                       m_deblockingFilterDisable;
      bool                       m_deblockingFilterOverrideFlag;      //< offsets for deblocking filter inherit from PPS
      int                        m_deblockingFilterBetaOffsetDiv2;    //< beta offset for deblocking filter
      int                        m_deblockingFilterTcOffsetDiv2;      //< tc offset for deblocking filter
      int                        m_list1IdxToList0Idx[MAX_NUM_REF];
      int                        m_aiNumRefIdx   [NUM_REF_PIC_LIST_01];    //  for multiple reference of current slice
      bool                       m_pendingRasInit;
    
      bool                       m_depQuantEnabledFlag;
      bool                       m_signDataHidingEnabledFlag;
      bool                       m_bCheckLDC;
    
    
      int                        m_symRefIdx[2];
    
    
      int                        m_iSliceChromaQpDelta[MAX_NUM_COMPONENT+1];
    
      Picture*                   m_apcRefPicList [NUM_REF_PIC_LIST_01][MAX_NUM_REF+1];
      int                        m_aiRefPOCList  [NUM_REF_PIC_LIST_01][MAX_NUM_REF+1];
      bool                       m_bIsUsedAsLongTerm[NUM_REF_PIC_LIST_01][MAX_NUM_REF+1];
      int                        m_iDepth;
    
    
      // access channel
    
      const DPS*                 m_dps;
    
      const SPS*                 m_pcSPS;
      const PPS*                 m_pcPPS;
      Picture*                   m_pcPic;
      bool                       m_colFromL0Flag;  // collocated picture from List0 flag
    
      bool                       m_noOutputPriorPicsFlag;
      bool                       m_noRaslOutputFlag;
    
      bool                       m_handleCraAsCvsStartFlag;
    
      uint32_t                   m_maxNumAffineMergeCand;
    
      uint32_t                   m_maxNumTriangleCand;
    
    #if JVET_O1140_SLICE_DISABLE_BDOF_DMVR_FLAG
      bool                       m_disBdofDmvrFlag;
    #endif
    
      double                     m_lambdas[MAX_NUM_COMPONENT];
    
      bool                       m_abEqualRef  [NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_REF];
      uint32_t                       m_uiTLayer;
      bool                       m_bTLayerSwitchingFlag;
    
      SliceConstraint            m_sliceMode;
      uint32_t                       m_sliceArgument;
      uint32_t                       m_sliceCurStartCtuTsAddr;
      uint32_t                       m_sliceCurEndCtuTsAddr;
      uint32_t                       m_independentSliceIdx;
      bool                       m_nextSlice;
      uint32_t                       m_sliceBits;
      bool                       m_bFinalized;
    
    
      uint32_t                   m_sliceCurStartBrickIdx;
      uint32_t                   m_sliceCurEndBrickIdx;
      uint32_t                   m_sliceNumBricks;
      uint32_t                   m_sliceIdx;
    
    
      bool                       m_bTestWeightPred;
      bool                       m_bTestWeightBiPred;
      WPScalingParam             m_weightPredTable[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT]; // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V]
      WPACDCParam                m_weightACDCParam[MAX_NUM_COMPONENT];
      ClpRngs                    m_clpRngs;
      std::vector<uint32_t>          m_substreamSizes;
    
      bool                       m_cabacInitFlag;
    
    
    #if JVET_O0105_ICT
      bool                       m_jointCbCrSignFlag;
    #endif
    
    
      bool                       m_bLMvdL1Zero;
      bool                       m_LFCrossSliceBoundaryFlag;
    
      bool                       m_enableTMVPFlag;
    
    
      SliceType                  m_encCABACTableIdx;           // Used to transmit table selection across slices.
    
      clock_t                    m_iProcessingStartTime;
      double                     m_dProcessingTime;
    
      bool                       m_splitConsOverrideFlag;
      uint32_t                   m_uiMinQTSize;
      uint32_t                   m_uiMaxBTDepth;
      uint32_t                   m_uiMaxTTSize;
    
      uint32_t                   m_uiMinQTSizeIChroma;
      uint32_t                   m_uiMaxBTDepthIChroma;
      uint32_t                   m_uiMaxBTSizeIChroma;
      uint32_t                   m_uiMaxTTSizeIChroma;
    
      APS*                       m_alfApss[MAX_NUM_APS];
    
      bool                       m_tileGroupAlfEnabledFlag[MAX_NUM_COMPONENT];
      int                        m_tileGroupNumAps;
      std::vector<int>           m_tileGroupLumaApsId;
      int                        m_tileGroupChromaApsId;
    
      bool                       m_disableSATDForRd;
    
      int                        m_lmcsApsId;
      APS*                       m_lmcsAps;
      bool                       m_tileGroupLmcsEnabledFlag;
      bool                       m_tileGroupLmcsChromaResidualScaleFlag;
    
    public:
                                  Slice();
      virtual                     ~Slice();
      void                        initSlice();
      int                         getRefIdx4MVPair( RefPicList eCurRefPicList, int nCurRefIdx );
    
      void                        setDPS( DPS* dps )                                     { m_dps = dps;                                              }
      const DPS*                  getDPS() const                                         { return m_dps;                                               }
    
    
      void                        setSPS( const SPS* pcSPS )                             { m_pcSPS = pcSPS;                                              }
      const SPS*                  getSPS() const                                         { return m_pcSPS;                                               }
    
      void                        setPPS( const PPS* pcPPS )                             { m_pcPPS = pcPPS; m_iPPSId = (pcPPS) ? pcPPS->getPPSId() : -1; }
      const PPS*                  getPPS() const                                         { return m_pcPPS;                                               }
    
      void                        setPPSId( int PPSId )                                  { m_iPPSId = PPSId;                                             }
      int                         getPPSId() const                                       { return m_iPPSId;                                              }
    
      void                        setAlfAPSs(APS** apss)                                 { memcpy(m_alfApss, apss, sizeof(m_alfApss));                   }
      APS**                       getAlfAPSs()                                           { return m_alfApss;                                             }
      void                        setLmcsAPS(APS* lmcsAps)                               { m_lmcsAps = lmcsAps; m_lmcsApsId = (lmcsAps) ? lmcsAps->getAPSId() : -1; }
      APS*                        getLmcsAPS()                                           { return m_lmcsAps;                                            }
      void                        setLmcsAPSId(int lmcsApsId)                            { m_lmcsApsId = lmcsApsId;                                     }
      int                         getLmcsAPSId() const                                   { return m_lmcsApsId;                                          }
      void                        setLmcsEnabledFlag(bool b)                             { m_tileGroupLmcsEnabledFlag = b;                              }
      bool                        getLmcsEnabledFlag()                                   { return m_tileGroupLmcsEnabledFlag; }
      const bool                  getLmcsEnabledFlag()                             const { return m_tileGroupLmcsEnabledFlag; }
      void                        setLmcsChromaResidualScaleFlag(bool b)                 { m_tileGroupLmcsChromaResidualScaleFlag = b;                  }
      bool                        getLmcsChromaResidualScaleFlag()                       { return m_tileGroupLmcsChromaResidualScaleFlag;               }
      const bool                  getLmcsChromaResidualScaleFlag()                 const { return m_tileGroupLmcsChromaResidualScaleFlag;               }
    
      void                        setPicOutputFlag( bool b   )                           { m_PicOutputFlag = b;                                          }
      bool                        getPicOutputFlag() const                               { return m_PicOutputFlag;                                       }
      void                        setSaoEnabledFlag(ChannelType chType, bool s)          {m_saoEnabledFlag[chType] =s;                                   }
      bool                        getSaoEnabledFlag(ChannelType chType) const            { return m_saoEnabledFlag[chType];                              }
    
    Hendry's avatar
    Hendry committed
      void                        setRPL0(const ReferencePictureList *pcRPL)             { m_pRPL0 = pcRPL;                                             }
      void                        setRPL1(const ReferencePictureList *pcRPL)             { m_pRPL1 = pcRPL;                                             }
      const ReferencePictureList* getRPL0()                                              { return m_pRPL0;                                              }
      const ReferencePictureList* getRPL1()                                              { return m_pRPL1;                                              }
      ReferencePictureList*       getLocalRPL0()                                         { return &m_localRPL0;                                         }
      ReferencePictureList*       getLocalRPL1()                                         { return &m_localRPL1;                                         }
      void                        setRPL0idx(int rplIdx)                                 { m_rpl0Idx = rplIdx;                                          }
      void                        setRPL1idx(int rplIdx)                                 { m_rpl1Idx = rplIdx;                                          }
      int                         getRPL0idx() const                                     { return m_rpl0Idx;                                            }
      int                         getRPL1idx() const                                     { return m_rpl1Idx;                                            }
    
      void                        setLastIDR(int iIDRPOC)                                { m_iLastIDR = iIDRPOC;                                         }
      int                         getLastIDR() const                                     { return m_iLastIDR;                                            }
      void                        setAssociatedIRAPPOC(int iAssociatedIRAPPOC)           { m_iAssociatedIRAP = iAssociatedIRAPPOC;                       }
      int                         getAssociatedIRAPPOC() const                           { return m_iAssociatedIRAP;                                     }
      void                        setAssociatedIRAPType(NalUnitType associatedIRAPType)  { m_iAssociatedIRAPType = associatedIRAPType;                   }
      NalUnitType                 getAssociatedIRAPType() const                          { return m_iAssociatedIRAPType;                                 }
      SliceType                   getSliceType() const                                   { return m_eSliceType;                                          }
      int                         getPOC() const                                         { return m_iPOC;                                                }
      int                         getSliceQp() const                                     { return m_iSliceQp;                                            }
      bool                        getUseWeightedPrediction() const                       { return( (m_eSliceType==P_SLICE && testWeightPred()) || (m_eSliceType==B_SLICE && testWeightBiPred()) ); }
      int                         getSliceQpDelta() const                                { return m_iSliceQpDelta;                                       }
      int                         getSliceChromaQpDelta(ComponentID compID) const        { return isLuma(compID) ? 0 : m_iSliceChromaQpDelta[compID];    }
      bool                        getUseChromaQpAdj() const                              { return m_ChromaQpAdjEnabled;                                  }
      bool                        getDeblockingFilterDisable() const                     { return m_deblockingFilterDisable;                             }
      bool                        getDeblockingFilterOverrideFlag() const                { return m_deblockingFilterOverrideFlag;                        }
      int                         getDeblockingFilterBetaOffsetDiv2()const               { return m_deblockingFilterBetaOffsetDiv2;                      }
      int                         getDeblockingFilterTcOffsetDiv2() const                { return m_deblockingFilterTcOffsetDiv2;                        }
      bool                        getPendingRasInit() const                              { return m_pendingRasInit;                                      }
      void                        setPendingRasInit( bool val )                          { m_pendingRasInit = val;                                       }
    
      int                         getNumRefIdx( RefPicList e ) const                     { return m_aiNumRefIdx[e];                                      }
      Picture*                    getPic()                                               { return m_pcPic;                                               }
      const Picture*              getPic() const                                         { return m_pcPic;                                               }
      const Picture*              getRefPic( RefPicList e, int iRefIdx) const            { return m_apcRefPicList[e][iRefIdx];                           }
      int                         getRefPOC( RefPicList e, int iRefIdx) const            { return m_aiRefPOCList[e][iRefIdx];                            }
      int                         getDepth() const                                       { return m_iDepth;                                              }
      bool                        getColFromL0Flag() const                               { return m_colFromL0Flag;                                       }
      uint32_t                        getColRefIdx() const                                   { return m_colRefIdx;                                           }
      void                        checkColRefIdx(uint32_t curSliceSegmentIdx, const Picture* pic);
      bool                        getIsUsedAsLongTerm(int i, int j) const                { return m_bIsUsedAsLongTerm[i][j];                             }
      void                        setIsUsedAsLongTerm(int i, int j, bool value)          { m_bIsUsedAsLongTerm[i][j] = value;                            }
      bool                        getCheckLDC() const                                    { return m_bCheckLDC;                                           }
      bool                        getMvdL1ZeroFlag() const                               { return m_bLMvdL1Zero;                                         }
      int                         getList1IdxToList0Idx( int list1Idx ) const            { return m_list1IdxToList0Idx[list1Idx];                        }
      void                        setPOC( int i )                                        { m_iPOC              = i;                                      }
      void                        setNalUnitType( NalUnitType e )                        { m_eNalUnitType      = e;                                      }
      NalUnitType                 getNalUnitType() const                                 { return m_eNalUnitType;                                        }
      bool                        getRapPicFlag() const;
      bool                        getIdrPicFlag() const                                  { return getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP; }
    
      bool                        isIRAP() const { return (getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL) && (getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA); }
      bool                        isIDRorBLA() const { return (getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL) || (getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP); }
    
    Hendry's avatar
    Hendry committed
      void                        checkCRA(const ReferencePictureList *pRPL0, const ReferencePictureList *pRPL1, int& pocCRA, NalUnitType& associatedIRAPType, PicList& rcListPic);
    
      void                        decodingRefreshMarking(int& pocCRA, bool& bRefreshPending, PicList& rcListPic, const bool bEfficientFieldIRAPEnabled);
      void                        setSliceType( SliceType e )                            { m_eSliceType        = e;                                      }
      void                        setSliceQp( int i )                                    { m_iSliceQp          = i;                                      }
      void                        setSliceQpDelta( int i )                               { m_iSliceQpDelta     = i;                                      }
      void                        setSliceChromaQpDelta( ComponentID compID, int i )     { m_iSliceChromaQpDelta[compID] = isLuma(compID) ? 0 : i;       }
      void                        setUseChromaQpAdj( bool b )                            { m_ChromaQpAdjEnabled = b;                                     }
      void                        setDeblockingFilterDisable( bool b )                   { m_deblockingFilterDisable= b;                                 }
      void                        setDeblockingFilterOverrideFlag( bool b )              { m_deblockingFilterOverrideFlag = b;                           }
      void                        setDeblockingFilterBetaOffsetDiv2( int i )             { m_deblockingFilterBetaOffsetDiv2 = i;                         }
      void                        setDeblockingFilterTcOffsetDiv2( int i )               { m_deblockingFilterTcOffsetDiv2 = i;                           }
    
      void                        setNumRefIdx( RefPicList e, int i )                    { m_aiNumRefIdx[e]    = i;                                      }
      void                        setPic( Picture* p )                                   { m_pcPic             = p;                                      }
      void                        setDepth( int iDepth )                                 { m_iDepth            = iDepth;                                 }
    
    
    Hendry's avatar
    Hendry committed
      void                        constructRefPicList(PicList& rcListPic);
    
      void                        setRefPOCList();
    
      void                        setColFromL0Flag( bool colFromL0 )                     { m_colFromL0Flag = colFromL0;                                  }
      void                        setColRefIdx( uint32_t refIdx)                             { m_colRefIdx = refIdx;                                         }
      void                        setCheckLDC( bool b )                                  { m_bCheckLDC = b;                                              }
      void                        setMvdL1ZeroFlag( bool b)                              { m_bLMvdL1Zero = b;                                            }
    
    
      void                        setBiDirPred( bool b, int refIdx0, int refIdx1 ) { m_biDirPred = b; m_symRefIdx[0] = refIdx0; m_symRefIdx[1] = refIdx1; }
      bool                        getBiDirPred() const { return m_biDirPred; }
    
      int                         getSymRefIdx( int refList ) const { return m_symRefIdx[refList]; }
    
    
      bool                        isIntra() const                                        { return m_eSliceType == I_SLICE;                               }
      bool                        isInterB() const                                       { return m_eSliceType == B_SLICE;                               }
      bool                        isInterP() const                                       { return m_eSliceType == P_SLICE;                               }
    
      void                        setLambdas( const double lambdas[MAX_NUM_COMPONENT] )  { for (int component = 0; component < MAX_NUM_COMPONENT; component++) m_lambdas[component] = lambdas[component]; }
      const double*               getLambdas() const                                     { return m_lambdas;                                             }
    
    
      void                        setSplitConsOverrideFlag(bool b)                       { m_splitConsOverrideFlag = b; }
      bool                        getSplitConsOverrideFlag() const                       { return m_splitConsOverrideFlag; }
      void                        setMinQTSize(int i)                                    { m_uiMinQTSize = i; }
      uint32_t                    getMinQTSize() const                                   { return m_uiMinQTSize; }
      void                        setMaxBTDepth(int i)                                   { m_uiMaxBTDepth = i; }
      uint32_t                    getMaxBTDepth() const                                  { return m_uiMaxBTDepth; }
      void                        setMaxTTSize(int i)                                    { m_uiMaxTTSize = i; }
      uint32_t                    getMaxTTSize() const                                   { return m_uiMaxTTSize; }
    
      void                        setMinQTSizeIChroma(int i)                             { m_uiMinQTSizeIChroma = i; }
      uint32_t                    getMinQTSizeIChroma() const                            { return m_uiMinQTSizeIChroma; }
      void                        setMaxBTDepthIChroma(int i)                            { m_uiMaxBTDepthIChroma = i; }
      uint32_t                    getMaxBTDepthIChroma() const                           { return m_uiMaxBTDepthIChroma; }
      void                        setMaxBTSizeIChroma(int i)                             { m_uiMaxBTSizeIChroma = i; }
      uint32_t                    getMaxBTSizeIChroma() const                            { return m_uiMaxBTSizeIChroma; }
      void                        setMaxTTSizeIChroma(int i)                             { m_uiMaxTTSizeIChroma = i; }
      uint32_t                    getMaxTTSizeIChroma() const                            { return m_uiMaxTTSizeIChroma; }
    
      void                        setMaxBTSize(int i)                                    { m_uiMaxBTSize = i; }
      uint32_t                        getMaxBTSize() const                                   { return m_uiMaxBTSize; }
    
      void                        setDepQuantEnabledFlag( bool b )                       { m_depQuantEnabledFlag = b; }
      bool                        getDepQuantEnabledFlag() const                         { return m_depQuantEnabledFlag; }
      void                        setSignDataHidingEnabledFlag( bool b )                 { m_signDataHidingEnabledFlag = b;              }
      bool                        getSignDataHidingEnabledFlag() const                   { return m_signDataHidingEnabledFlag;           }
    
      void                        initEqualRef();
      bool                        isEqualRef( RefPicList e, int iRefIdx1, int iRefIdx2 )
      {
        CHECK(e>=NUM_REF_PIC_LIST_01, "Invalid reference picture list");
        if (iRefIdx1 < 0 || iRefIdx2 < 0)
        {
          return false;
        }
        else
        {
          return m_abEqualRef[e][iRefIdx1][iRefIdx2];
        }
      }
    
      void                        setEqualRef( RefPicList e, int iRefIdx1, int iRefIdx2, bool b)
      {
        CHECK( e >= NUM_REF_PIC_LIST_01, "Invalid reference picture list" );
        m_abEqualRef[e][iRefIdx1][iRefIdx2] = m_abEqualRef[e][iRefIdx2][iRefIdx1] = b;
      }
    
      static void                 sortPicList( PicList& rcListPic );
      void                        setList1IdxToList0Idx();
    
      uint32_t                        getTLayer() const                                      { return m_uiTLayer;                                            }
      void                        setTLayer( uint32_t uiTLayer )                             { m_uiTLayer = uiTLayer;                                        }
    
      void                        checkLeadingPictureRestrictions( PicList& rcListPic )                                         const;
    
    Hendry's avatar
    Hendry committed
      void                        applyReferencePictureListBasedMarking( PicList& rcListPic, const ReferencePictureList *pRPL0, const ReferencePictureList *pRPL1 )  const;
    
      bool                        isTemporalLayerSwitchingPoint( PicList& rcListPic )                                           const;
      bool                        isStepwiseTemporalLayerSwitchingPointCandidate( PicList& rcListPic )                          const;
    
    Hendry's avatar
    Hendry committed
      int                         checkThatAllRefPicsAreAvailable(PicList& rcListPic, const ReferencePictureList *pRPL, int rplIdx, bool printErrors)                const;
      void                        createExplicitReferencePictureSetFromReference(PicList& rcListPic, const ReferencePictureList *pRPL0, const ReferencePictureList *pRPL1);
    
      void                        setMaxNumMergeCand(uint32_t val )                          { m_maxNumMergeCand = val;                                      }
    
      uint32_t                    getMaxNumMergeCand() const                             { return m_maxNumMergeCand;                                     }
    
      void                        setMaxNumAffineMergeCand( uint32_t val )               { m_maxNumAffineMergeCand = val;  }
      uint32_t                    getMaxNumAffineMergeCand() const                       { return m_maxNumAffineMergeCand; }
    
      void                        setMaxNumTriangleCand(uint32_t val)                    { m_maxNumTriangleCand = val;}
      uint32_t                    getMaxNumTriangleCand() const                          { return m_maxNumTriangleCand;}
    
      void                        setDisFracMMVD( bool val )                             { m_disFracMMVD = val;                                          }
      bool                        getDisFracMMVD() const                                 { return m_disFracMMVD;                                         }
    
    #if JVET_O1140_SLICE_DISABLE_BDOF_DMVR_FLAG
      void                        setDisBdofDmvrFlag(bool val)                           { m_disBdofDmvrFlag = val;                                          }
      bool                        getDisBdofDmvrFlag() const                             { return m_disBdofDmvrFlag;                                         }
    #endif
    
      void                        setNoOutputPriorPicsFlag( bool val )                   { m_noOutputPriorPicsFlag = val;                                }
      bool                        getNoOutputPriorPicsFlag() const                       { return m_noOutputPriorPicsFlag;                               }
    
      void                        setNoRaslOutputFlag( bool val )                        { m_noRaslOutputFlag = val;                                     }
      bool                        getNoRaslOutputFlag() const                            { return m_noRaslOutputFlag;                                    }
    
    
      void                        setHandleCraAsCvsStartFlag( bool val )                 { m_handleCraAsCvsStartFlag = val;                                   }
      bool                        getHandleCraAsCvsStartFlag() const                     { return m_handleCraAsCvsStartFlag;                                  }
    
    
      void                        setSliceMode( SliceConstraint mode )                   { m_sliceMode = mode;                                           }
      SliceConstraint             getSliceMode() const                                   { return m_sliceMode;                                           }
      void                        setSliceArgument( uint32_t uiArgument )                    { m_sliceArgument = uiArgument;                                 }
      uint32_t                        getSliceArgument() const                               { return m_sliceArgument;                                       }
      void                        setSliceCurStartCtuTsAddr( uint32_t ctuTsAddr )            { m_sliceCurStartCtuTsAddr = ctuTsAddr;                         } // CTU Tile-scan address (as opposed to raster-scan)
      uint32_t                        getSliceCurStartCtuTsAddr() const                      { return m_sliceCurStartCtuTsAddr;                              } // CTU Tile-scan address (as opposed to raster-scan)
      void                        setSliceCurEndCtuTsAddr( uint32_t ctuTsAddr )              { m_sliceCurEndCtuTsAddr = ctuTsAddr;                           } // CTU Tile-scan address (as opposed to raster-scan)
      uint32_t                        getSliceCurEndCtuTsAddr() const                        { return m_sliceCurEndCtuTsAddr;                                } // CTU Tile-scan address (as opposed to raster-scan)
      void                        setIndependentSliceIdx( uint32_t i)                        { m_independentSliceIdx = i;                                    }
      uint32_t                        getIndependentSliceIdx() const                         { return  m_independentSliceIdx;                                }
      void                        copySliceInfo(Slice *pcSliceSrc, bool cpyAlmostAll = true);
      void                        setSliceBits( uint32_t uiVal )                             { m_sliceBits = uiVal;                                          }
      uint32_t                        getSliceBits() const                                   { return m_sliceBits;                                           }
      void                        setFinalized( bool uiVal )                             { m_bFinalized = uiVal;                                         }
      bool                        getFinalized() const                                   { return m_bFinalized;                                          }
    
      void                        setSliceCurStartBrickIdx(uint32_t brickIdx)            { m_sliceCurStartBrickIdx = brickIdx;                           }
      uint32_t                    getSliceCurStartBrickIdx() const                       { return m_sliceCurStartBrickIdx;                               }
      void                        setSliceCurEndBrickIdx(uint32_t brickIdx)              { m_sliceCurEndBrickIdx = brickIdx;                             }
      uint32_t                    getSliceCurEndBrickIdx() const                         { return m_sliceCurEndBrickIdx;                                 }
      void                        setSliceNumBricks(uint32_t numBricks)                  { m_sliceNumBricks = numBricks;                                 }
      uint32_t                    getSliceNumBricks() const                              { return m_sliceNumBricks;                                      }
      void                        setSliceIndex(uint32_t idx)                            { m_sliceIdx = idx;                                             }
      uint32_t                    setSliceIndex() const                                  { return m_sliceIdx;                                            }
    
      bool                        testWeightPred( ) const                                { return m_bTestWeightPred;                                     }
      void                        setTestWeightPred( bool bValue )                       { m_bTestWeightPred = bValue;                                   }
      bool                        testWeightBiPred( ) const                              { return m_bTestWeightBiPred;                                   }
      void                        setTestWeightBiPred( bool bValue )                     { m_bTestWeightBiPred = bValue;                                 }
      void                        setWpScaling( WPScalingParam  wp[NUM_REF_PIC_LIST_01][MAX_NUM_REF][MAX_NUM_COMPONENT] )
      {
        memcpy(m_weightPredTable, wp, sizeof(WPScalingParam)*NUM_REF_PIC_LIST_01*MAX_NUM_REF*MAX_NUM_COMPONENT);
      }
    
      void                        getWpScaling( RefPicList e, int iRefIdx, WPScalingParam *&wp) const;
    
      void                        resetWpScaling();
      void                        initWpScaling(const SPS *sps);
    
      void                        setWpAcDcParam( WPACDCParam wp[MAX_NUM_COMPONENT] )    { memcpy(m_weightACDCParam, wp, sizeof(WPACDCParam)*MAX_NUM_COMPONENT); }
    
      void                        getWpAcDcParam( const WPACDCParam *&wp ) const;
      void                        initWpAcDcParam();
    
      void                        clearSubstreamSizes( )                                 { return m_substreamSizes.clear();                              }
      uint32_t                        getNumberOfSubstreamSizes( )                           { return (uint32_t) m_substreamSizes.size();                        }
      void                        addSubstreamSize( uint32_t size )                          { m_substreamSizes.push_back(size);                             }
      uint32_t                        getSubstreamSize( uint32_t idx )                           { CHECK(idx>=getNumberOfSubstreamSizes(),"Invalid index"); return m_substreamSizes[idx]; }
    
      void                        setCabacInitFlag( bool val )                           { m_cabacInitFlag = val;                                        } //!< set CABAC initial flag
      bool                        getCabacInitFlag()                               const { return m_cabacInitFlag;                                       } //!< get CABAC initial flag
    
    
    #if JVET_O0105_ICT
      void                        setJointCbCrSignFlag( bool b )                         { m_jointCbCrSignFlag = b; }
      bool                        getJointCbCrSignFlag()                           const { return m_jointCbCrSignFlag; }
    #endif
    
    
      void                        setLFCrossSliceBoundaryFlag( bool   val )              { m_LFCrossSliceBoundaryFlag = val;                             }
      bool                        getLFCrossSliceBoundaryFlag()                    const { return m_LFCrossSliceBoundaryFlag;                            }
    
      void                        setEnableTMVPFlag( bool   b )                          { m_enableTMVPFlag = b;                                         }
      bool                        getEnableTMVPFlag() const                              { return m_enableTMVPFlag;                                      }
    
      void                        setEncCABACTableIdx( SliceType idx )                   { m_encCABACTableIdx = idx;                                     }
      SliceType                   getEncCABACTableIdx() const                            { return m_encCABACTableIdx;                                    }
    
    
      void                        setSliceQpBase( int i )                                { m_iSliceQpBase = i;                                           }
      int                         getSliceQpBase()                                 const { return m_iSliceQpBase;                                        }
    
      void                        setDefaultClpRng( const SPS& sps );
      const ClpRngs&              clpRngs()                                         const { return m_clpRngs;}
      const ClpRng&               clpRng( ComponentID id)                           const { return m_clpRngs.comp[id];}
      ClpRngs&                    getClpRngs()                                            { return m_clpRngs;}
      unsigned                    getMinPictureDistance()                           const ;
      void startProcessingTimer();
      void stopProcessingTimer();
      void resetProcessingTime()       { m_dProcessingTime = m_iProcessingStartTime = 0; }
      double getProcessingTime() const { return m_dProcessingTime; }
    
    
      void                        resetTileGroupAlfEnabledFlag() { memset(m_tileGroupAlfEnabledFlag, 0, sizeof(m_tileGroupAlfEnabledFlag)); }
      bool                        getTileGroupAlfEnabledFlag(ComponentID compId) const { return m_tileGroupAlfEnabledFlag[compId]; }
      void                        setTileGroupAlfEnabledFlag(ComponentID compId, bool b) { m_tileGroupAlfEnabledFlag[compId] = b; }
      int                         getTileGroupNumAps() const { return m_tileGroupNumAps; }
      void                        setTileGroupNumAps(int i) { m_tileGroupNumAps = i; }
      int                         getTileGroupApsIdChroma() const { return m_tileGroupChromaApsId; }
      void                        setTileGroupApsIdChroma(int i) { m_tileGroupChromaApsId = i; }
      std::vector<int32_t>        getTileGroupApsIdLuma() const { return m_tileGroupLumaApsId; }
    
      void                        setAlfAPSs(std::vector<int> ApsIDs)
    
      {
        m_tileGroupLumaApsId.resize(m_tileGroupNumAps);
        for (int i = 0; i < m_tileGroupNumAps; i++)
        {
          m_tileGroupLumaApsId[i] = ApsIDs[i];
        }
      }
    
      void                        setDisableSATDForRD(bool b) { m_disableSATDForRd = b; }
      bool                        getDisableSATDForRD() { return m_disableSATDForRd; }
    
    protected:
      Picture*              xGetRefPic        (PicList& rcListPic, int poc);
      Picture*              xGetLongTermRefPic(PicList& rcListPic, int poc, bool pocHasMsb);
    };// END CLASS DEFINITION Slice
    
    void calculateParameterSetChangedFlag(bool &bChanged, const std::vector<uint8_t> *pOldData, const std::vector<uint8_t> *pNewData);
    
    template <class T> class ParameterSetMap
    {
    public:
      template <class Tm>
      struct MapData
      {
        bool                  bChanged;
        std::vector<uint8_t>   *pNaluData; // Can be null
        Tm*                   parameterSet;
      };
    
      ParameterSetMap(int maxId)
      :m_maxId (maxId)
      ,m_lastActiveParameterSet(NULL)
    
    
      ~ParameterSetMap()
      {
        for (typename std::map<int,MapData<T> >::iterator i = m_paramsetMap.begin(); i!= m_paramsetMap.end(); i++)
        {
          delete (*i).second.pNaluData;
          delete (*i).second.parameterSet;
        }
        delete m_lastActiveParameterSet; m_lastActiveParameterSet = NULL;
      }
    
      T *allocatePS(const int psId)
      {
        CHECK( psId >= m_maxId, "Invalid PS id" );
        if ( m_paramsetMap.find(psId) == m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged = true;
          m_paramsetMap[psId].pNaluData=0;
          m_paramsetMap[psId].parameterSet = new T;
          setID(m_paramsetMap[psId].parameterSet, psId);
        }
        return m_paramsetMap[psId].parameterSet;
      }
    
    
      void storePS(int psId, T *ps, const std::vector<uint8_t> *pNaluData)
      {
        CHECK( psId >= m_maxId, "Invalid PS id" );
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          MapData<T> &mapData=m_paramsetMap[psId];
    
          // work out changed flag
          calculateParameterSetChangedFlag(mapData.bChanged, mapData.pNaluData, pNaluData);
    
          if( ! mapData.bChanged )
          {
            // just keep the old one
            delete ps;
            return;
          }
    
    
          if (find(m_activePsId.begin(), m_activePsId.end(), psId) != m_activePsId.end())
    
          {
            std::swap( m_paramsetMap[psId].parameterSet, m_lastActiveParameterSet );
          }
          delete m_paramsetMap[psId].pNaluData;
          delete m_paramsetMap[psId].parameterSet;
    
          m_paramsetMap[psId].parameterSet = ps;
        }
        else
        {
          m_paramsetMap[psId].parameterSet = ps;
          m_paramsetMap[psId].bChanged = false;
        }
        if (pNaluData != 0)
        {
          m_paramsetMap[psId].pNaluData=new std::vector<uint8_t>;
          *(m_paramsetMap[psId].pNaluData) = *pNaluData;
        }
        else
        {
          m_paramsetMap[psId].pNaluData=0;
        }
      }
    
      void setChangedFlag(int psId, bool bChanged=true)
      {
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged=bChanged;
        }
      }
    
      void clearChangedFlag(int psId)
      {
        if ( m_paramsetMap.find(psId) != m_paramsetMap.end() )
        {
          m_paramsetMap[psId].bChanged=false;
        }
      }
    
      bool getChangedFlag(int psId) const
      {
        const typename std::map<int,MapData<T> >::const_iterator constit=m_paramsetMap.find(psId);
        if ( constit != m_paramsetMap.end() )
        {
          return constit->second.bChanged;
        }
        return false;
      }
    
      T* getPS(int psId)
      {
        typename std::map<int,MapData<T> >::iterator it=m_paramsetMap.find(psId);
        return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet;
      }
    
      const T* getPS(int psId) const
      {
        typename std::map<int,MapData<T> >::const_iterator it=m_paramsetMap.find(psId);
        return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet;
      }
    
      T* getFirstPS()
      {
        return (m_paramsetMap.begin() == m_paramsetMap.end() ) ? NULL : m_paramsetMap.begin()->second.parameterSet;
      }
    
    
      void setActive(int psId) { m_activePsId.push_back(psId); }
      void clear() { m_activePsId.clear(); }
    
    
    private:
      std::map<int,MapData<T> > m_paramsetMap;
      int                       m_maxId;
    
      T*                        m_lastActiveParameterSet;
      static void setID(T* parameterSet, const int psId);
    };
    
    class ParameterSetManager
    {
    public:
                     ParameterSetManager();
      virtual        ~ParameterSetManager();
    
    
    
      void           storeDPS(DPS *dps, const std::vector<uint8_t> &naluData)    { m_dpsMap.storePS( dps->getDecodingParameterSetId(), dps, &naluData); };
      //! get pointer to existing video parameter set
      DPS*           getDPS(int dpsId)                                           { return m_dpsMap.getPS(dpsId); };