Commit cf9f65ef authored by Xiang Li's avatar Xiang Li
Browse files

Merge branch 'lainema/VVCSoftware_VTM-JVET-N0054'

parents 92a0bd99 c1f43fda
......@@ -1397,6 +1397,20 @@ and cr_qp_offset, that are transmitted in the PPS. Valid values are in
the range $[-12, 12]$.
\\
\Option{CbCrQpOffset (-cbcrqpofs)} &
\Default{-1} &
Global offset to apply to the luma QP to derive the QP for joint Cb-Cr
residual coding mode. This option corresponds to the value of cb_cr_qp_offset
transmitted in the PPS. Valid values are in the range $[-12, 12]$.
\\
\Option{CbCrQpOffsetDualTree} &
\Default{0} &
Tile group QP offset for joint Cb-Cr residual coding mode when separate luma and
chroma trees are used. This option corresponds to the value of tile_group_cb_cr_qp_offset
transmitted in the tile group header. Valid values are in the range $[-12, 12]$.
\\
\Option{LumaLevelToDeltaQPMode} &
\Default{0} &
Luma-level based Delta QP modulation.
......
......@@ -202,6 +202,10 @@ void EncApp::xInitLibCfg()
m_cEncLib.setChromaCrQpOffset ( m_crQpOffset );
m_cEncLib.setChromaCbQpOffsetDualTree ( m_cbQpOffsetDualTree );
m_cEncLib.setChromaCrQpOffsetDualTree ( m_crQpOffsetDualTree );
#if JVET_N0054_JOINT_CHROMA
m_cEncLib.setChromaCbCrQpOffset ( m_cbCrQpOffset );
m_cEncLib.setChromaCbCrQpOffsetDualTree ( m_cbCrQpOffsetDualTree );
#endif
#if ER_CHROMA_QP_WCG_PPS
m_cEncLib.setWCGChromaQpControl ( m_wcgChromaQpControl );
#endif
......
......@@ -979,6 +979,10 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
("CrQpOffset,-crqpofs", m_crQpOffset, 0, "Chroma Cr QP Offset")
("CbQpOffsetDualTree", m_cbQpOffsetDualTree, 0, "Chroma Cb QP Offset for dual tree")
("CrQpOffsetDualTree", m_crQpOffsetDualTree, 0, "Chroma Cr QP Offset for dual tree")
#if JVET_N0054_JOINT_CHROMA
("CbCrQpOffset,-cbcrqpofs", m_cbCrQpOffset, -1, "QP Offset for joint Cb-Cr mode")
("CbCrQpOffsetDualTree", m_cbCrQpOffsetDualTree, 0, "QP Offset for joint Cb-Cr mode in dual tree")
#endif
#if ER_CHROMA_QP_WCG_PPS
("WCGPPSEnable", m_wcgChromaQpControl.enabled, false, "1: Enable the WCG PPS chroma modulation scheme. 0 (default) disabled")
("WCGPPSCbQpScale", m_wcgChromaQpControl.chromaCbQpScale, 1.0, "WCG PPS Chroma Cb QP Scale")
......@@ -2243,6 +2247,12 @@ bool EncAppCfg::xCheckParameter()
xConfirmPara( m_cbQpOffsetDualTree > 12, "Max. Chroma Cb QP Offset for dual tree is 12" );
xConfirmPara( m_crQpOffsetDualTree < -12, "Min. Chroma Cr QP Offset for dual tree is -12" );
xConfirmPara( m_crQpOffsetDualTree > 12, "Max. Chroma Cr QP Offset for dual tree is 12" );
#if JVET_N0054_JOINT_CHROMA
xConfirmPara( m_cbCrQpOffset < -12, "Min. Joint Cb-Cr QP Offset is -12" );
xConfirmPara( m_cbCrQpOffset > 12, "Max. Joint Cb-Cr QP Offset is 12" );
xConfirmPara( m_cbCrQpOffsetDualTree < -12, "Min. Joint Cb-Cr QP Offset for dual tree is -12" );
xConfirmPara( m_cbCrQpOffsetDualTree > 12, "Max. Joint Cb-Cr QP Offset for dual tree is 12" );
#endif
xConfirmPara( m_iQPAdaptationRange <= 0, "QP Adaptation Range must be more than 0" );
if (m_iDecodingRefreshType == 2)
......
......@@ -203,6 +203,10 @@ protected:
int m_crQpOffset; ///< Chroma Cr QP Offset (0:default)
int m_cbQpOffsetDualTree; ///< Chroma Cb QP Offset for dual tree (overwrite m_cbQpOffset for dual tree)
int m_crQpOffsetDualTree; ///< Chroma Cr QP Offset for dual tree (overwrite m_crQpOffset for dual tree)
#if JVET_N0054_JOINT_CHROMA
int m_cbCrQpOffset; ///< QP Offset for joint Cb-Cr mode
int m_cbCrQpOffsetDualTree; ///< QP Offset for joint Cb-Cr mode (overwrite m_cbCrQpOffset for dual tree)
#endif
#if ER_CHROMA_QP_WCG_PPS
WCGChromaQPControl m_wcgChromaQpControl; ///< Wide-colour-gamut chroma QP control.
#endif
......
......@@ -116,6 +116,10 @@ struct AreaBuf : public Size
void copyClip ( const AreaBuf<const T> &src, const ClpRng& clpRng);
void subtract ( const AreaBuf<const T> &other );
#if JVET_N0054_JOINT_CHROMA
void copyAndNegate ( const AreaBuf<const T> &other );
void subtractAndHalve ( const AreaBuf<const T> &other );
#endif
void extendSingleBorderPel();
void extendBorderPel ( unsigned margin );
void addWeightedAvg ( const AreaBuf<const T> &other1, const AreaBuf<const T> &other2, const ClpRng& clpRng, const int8_t gbiIdx);
......@@ -360,6 +364,50 @@ void AreaBuf<T>::subtract( const AreaBuf<const T> &other )
#undef SUBS_INC
}
#if JVET_N0054_JOINT_CHROMA
template<typename T>
void AreaBuf<T>::copyAndNegate( const AreaBuf<const T> &other )
{
CHECK( width != other.width, "Incompatible size" );
CHECK( height != other.height, "Incompatible size" );
T* dest = buf;
const T* subs = other.buf;
#define SUBS_INC \
dest += stride; \
subs += other.stride; \
#define SUBS_OP( ADDR ) dest[ADDR] = -subs[ADDR]
SIZE_AWARE_PER_EL_OP( SUBS_OP, SUBS_INC );
#undef SUBS_OP
#undef SUBS_INC
}
template<typename T>
void AreaBuf<T>::subtractAndHalve( const AreaBuf<const T> &other )
{
CHECK( width != other.width, "Incompatible size" );
CHECK( height != other.height, "Incompatible size" );
T* dest = buf;
const T* subs = other.buf;
#define SUBS_INC \
dest += stride; \
subs += other.stride; \
#define SUBS_OP( ADDR ) dest[ADDR] = ( dest[ADDR] - subs[ADDR] ) / 2
SIZE_AWARE_PER_EL_OP( SUBS_OP, SUBS_INC );
#undef SUBS_OP
#undef SUBS_INC
}
#endif
template<typename T>
void AreaBuf<T>::copyClip( const AreaBuf<const T> &src, const ClpRng& clpRng )
{
......
......@@ -803,6 +803,16 @@ const CtxSet ContextSetCfg::IBCFlag = ContextSetCfg::addCtxSet
{ 5, 5, 8, },
});
#if JVET_N0054_JOINT_CHROMA
const CtxSet ContextSetCfg::JointCbCrFlag = ContextSetCfg::addCtxSet
({
{ CNU, },
{ CNU, },
{ CNU, },
{ DWS, },
});
#endif
const unsigned ContextSetCfg::NumberOfContexts = (unsigned)ContextSetCfg::sm_InitTables[0].size();
......
......@@ -252,6 +252,9 @@ public:
static const CtxSet SmvdFlag;
static const CtxSet IBCFlag;
static const CtxSet ISPMode;
#if JVET_N0054_JOINT_CHROMA
static const CtxSet JointCbCrFlag;
#endif
static const unsigned NumberOfContexts;
// combined sets for less complex copying
......
......@@ -103,8 +103,13 @@ QpParam::QpParam(const TransformUnit& tu, const ComponentID &compIDX, const int
if (isChroma(compID))
{
#if JVET_N0054_JOINT_CHROMA
chromaQpOffset += tu.cs->pps->getQpOffset ( tu.jointCbCr ? JOINT_CbCr : compID );
chromaQpOffset += tu.cs->slice->getSliceChromaQpDelta( tu.jointCbCr ? JOINT_CbCr : compID );
#else
chromaQpOffset += tu.cs->pps->getQpOffset( compID );
chromaQpOffset += tu.cs->slice->getSliceChromaQpDelta( compID );
#endif
chromaQpOffset += tu.cs->pps->getPpsRangeExtension().getChromaQpOffsetListEntry( tu.cu->chromaQpAdj ).u.offset[int( compID ) - 1];
}
......
......@@ -149,6 +149,9 @@ Slice::Slice()
m_lambdas [component] = 0.0;
m_iSliceChromaQpDelta[component] = 0;
}
#if JVET_N0054_JOINT_CHROMA
m_iSliceChromaQpDelta[JOINT_CbCr] = 0;
#endif
initEqualRef();
......@@ -208,6 +211,9 @@ void Slice::initSlice()
{
m_iSliceChromaQpDelta[component] = 0;
}
#if JVET_N0054_JOINT_CHROMA
m_iSliceChromaQpDelta[JOINT_CbCr] = 0;
#endif
m_maxNumMergeCand = MRG_MAX_NUM_CANDS;
m_maxNumAffineMergeCand = AFFINE_MRG_MAX_NUM_CANDS;
......@@ -776,6 +782,10 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll)
{
m_iSliceChromaQpDelta[component] = pSrc->m_iSliceChromaQpDelta[component];
}
#if JVET_N0054_JOINT_CHROMA
m_iSliceChromaQpDelta[JOINT_CbCr] = pSrc->m_iSliceChromaQpDelta[JOINT_CbCr];
#endif
for (i = 0; i < NUM_REF_PIC_LIST_01; i++)
{
for (j = 0; j < MAX_NUM_REF; j++)
......@@ -1900,6 +1910,9 @@ PPS::PPS()
, m_cuQpDeltaSubdiv (0)
, m_chromaCbQpOffset (0)
, m_chromaCrQpOffset (0)
#if JVET_N0054_JOINT_CHROMA
, m_chromaCbCrQpOffset (0)
#endif
, m_numRefIdxL0DefaultActive (1)
, m_numRefIdxL1DefaultActive (1)
, m_TransquantBypassEnabledFlag (false)
......
......@@ -1497,6 +1497,9 @@ private:
int m_chromaCbQpOffset;
int m_chromaCrQpOffset;
#if JVET_N0054_JOINT_CHROMA
int m_chromaCbCrQpOffset;
#endif
uint32_t m_numRefIdxL0DefaultActive;
uint32_t m_numRefIdxL1DefaultActive;
......@@ -1572,6 +1575,12 @@ public:
{
m_chromaCrQpOffset = i;
}
#if JVET_N0054_JOINT_CHROMA
else if (compID==JOINT_CbCr)
{
m_chromaCbCrQpOffset = i;
}
#endif
else
{
THROW( "Invalid chroma QP offset" );
......@@ -1579,7 +1588,11 @@ public:
}
int getQpOffset(ComponentID compID) const
{
#if JVET_N0054_JOINT_CHROMA
return (compID==COMPONENT_Y) ? 0 : (compID==COMPONENT_Cb ? m_chromaCbQpOffset : compID==COMPONENT_Cr ? m_chromaCrQpOffset : m_chromaCbCrQpOffset );
#else
return (compID==COMPONENT_Y) ? 0 : (compID==COMPONENT_Cb ? m_chromaCbQpOffset : m_chromaCrQpOffset );
#endif
}
void setNumRefIdxL0DefaultActive(uint32_t ui) { m_numRefIdxL0DefaultActive=ui; }
......@@ -1740,7 +1753,11 @@ private:
// Data
int m_iSliceQpDelta;
#if JVET_N0054_JOINT_CHROMA
int m_iSliceChromaQpDelta[MAX_NUM_COMPONENT+1];
#else
int m_iSliceChromaQpDelta[MAX_NUM_COMPONENT];
#endif
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];
......
......@@ -50,6 +50,8 @@
#include <assert.h>
#include <cassert>
#define JVET_N0054_JOINT_CHROMA 1 // Joint chroma residual coding mode
#define JVET_N0317_ADD_ZERO_BV 1
#define JVET_N0318_N0467_IBC_SIZE 1 // IBC flag dependent on CU size and disabling 128x128 IBC mode
......@@ -458,6 +460,9 @@ enum ComponentID
COMPONENT_Cb = 1,
COMPONENT_Cr = 2,
MAX_NUM_COMPONENT = 3,
#if JVET_N0054_JOINT_CHROMA
JOINT_CbCr = MAX_NUM_COMPONENT,
#endif
MAX_NUM_TBLOCKS = MAX_NUM_COMPONENT
};
......
......@@ -610,6 +610,9 @@ void TransformUnit::initData()
depth = 0;
mtsIdx = 0;
noResidual = false;
#if JVET_N0054_JOINT_CHROMA
jointCbCr = 0;
#endif
m_chromaResScaleInv = 0;
}
......@@ -645,6 +648,9 @@ TransformUnit& TransformUnit::operator=(const TransformUnit& other)
depth = other.depth;
mtsIdx = other.mtsIdx;
noResidual = other.noResidual;
#if JVET_N0054_JOINT_CHROMA
jointCbCr = other.jointCbCr;
#endif
return *this;
}
......@@ -666,6 +672,9 @@ void TransformUnit::copyComponentFrom(const TransformUnit& other, const Componen
depth = other.depth;
mtsIdx = isLuma( i ) ? other.mtsIdx : mtsIdx;
noResidual = other.noResidual;
#if JVET_N0054_JOINT_CHROMA
jointCbCr = isChroma( i ) ? other.jointCbCr : jointCbCr;
#endif
}
CoeffBuf TransformUnit::getCoeffs(const ComponentID id) { return CoeffBuf(m_coeffs[id], blocks[id]); }
......
......@@ -438,6 +438,9 @@ struct TransformUnit : public UnitArea
uint8_t depth;
uint8_t mtsIdx;
bool noResidual;
#if JVET_N0054_JOINT_CHROMA
uint8_t jointCbCr;
#endif
uint8_t cbf [ MAX_NUM_TBLOCKS ];
RDPCMMode rdpcm [ MAX_NUM_TBLOCKS ];
int8_t compAlpha [ MAX_NUM_TBLOCKS ];
......
......@@ -2404,11 +2404,30 @@ void CABACReader::cu_chroma_qp_offset( CodingUnit& cu )
// void residual_coding_subblock( coeffCtx )
//================================================================================
#if JVET_N0054_JOINT_CHROMA
void CABACReader::joint_cb_cr( TransformUnit& tu )
{
tu.jointCbCr = m_BinDecoder.decodeBin( Ctx::JointCbCrFlag( 0 ) );
}
#endif
void CABACReader::residual_coding( TransformUnit& tu, ComponentID compID )
{
const CodingUnit& cu = *tu.cu;
DTRACE( g_trace_ctx, D_SYNTAX, "residual_coding() etype=%d pos=(%d,%d) size=%dx%d predMode=%d\n", tu.blocks[compID].compID, tu.blocks[compID].x, tu.blocks[compID].y, tu.blocks[compID].width, tu.blocks[compID].height, cu.predMode );
#if JVET_N0054_JOINT_CHROMA
// Joint Cb-Cr residual mode is signalled if both Cb and Cr cbfs are true
if ( compID == COMPONENT_Cr && TU::getCbf( tu, COMPONENT_Cb ) )
{
joint_cb_cr( tu );
// No Cr residual in bitstream in joint Cb-Cr residual mode
if ( tu.jointCbCr )
return;
}
#endif
// parse transform skip and explicit rdpcm mode
mts_coding ( tu, compID );
explicit_rdpcm_mode( tu, compID );
......
......@@ -130,6 +130,9 @@ public:
void explicit_rdpcm_mode ( TransformUnit& tu, ComponentID compID );
int last_sig_coeff ( CoeffCodingContext& cctx, TransformUnit& tu, ComponentID compID );
void residual_coding_subblock ( CoeffCodingContext& cctx, TCoeff* coeff, const int stateTransTable, int& state );
#if JVET_N0054_JOINT_CHROMA
void joint_cb_cr ( TransformUnit& tu );
#endif
// cross component prediction (clause 7.3.8.12)
void cross_comp_pred ( TransformUnit& tu, ComponentID compID );
......
......@@ -222,6 +222,12 @@ void DecCu::xIntraRecBlk( TransformUnit& tu, const ComponentID compID )
const QpParam cQP( tu, compID );
#if JVET_N0054_JOINT_CHROMA
// Joint chroma residual mode: Cr uses negative of the signalled Cb residual
if ( tu.jointCbCr && compID == COMPONENT_Cr )
piResi.copyAndNegate( cs.getResiBuf( tu.blocks[COMPONENT_Cb] ) );
else
#endif
if( TU::getCbf( tu, compID ) )
{
m_pcTrQuant->invTransformNxN( tu, compID, piResi, cQP );
......@@ -235,6 +241,9 @@ void DecCu::xIntraRecBlk( TransformUnit& tu, const ComponentID compID )
flag = flag && (tu.blocks[compID].width*tu.blocks[compID].height > 4);
if (flag && TU::getCbf(tu, compID) && isChroma(compID) && slice.getReshapeInfo().getSliceReshapeChromaAdj())
{
#if JVET_N0054_JOINT_CHROMA
if ( !(tu.jointCbCr && compID == COMPONENT_Cr) ) // // Joint chroma residual mode: chroma scaling took place already when doing Cb
#endif
piResi.scaleSignal(tu.getChromaAdj(), 0, tu.cu->cs->slice->clpRng(compID));
}
if( isChroma(compID) && tu.compAlpha[compID] != 0 )
......@@ -537,6 +546,12 @@ void DecCu::xDecodeInterTU( TransformUnit & currTU, const ComponentID compID )
const QpParam cQP(currTU, compID);
#if JVET_N0054_JOINT_CHROMA
// Joint chroma residual mode: Cr uses negative of the signalled Cb residual
if ( currTU.jointCbCr && compID == COMPONENT_Cr )
resiBuf.copyAndNegate( cs.getResiBuf( currTU.blocks[COMPONENT_Cb] ) );
else
#endif
if( TU::getCbf( currTU, compID ) )
{
m_pcTrQuant->invTransformNxN( currTU, compID, resiBuf, cQP );
......@@ -550,6 +565,9 @@ void DecCu::xDecodeInterTU( TransformUnit & currTU, const ComponentID compID )
const Slice &slice = *cs.slice;
if ( slice.getReshapeInfo().getUseSliceReshaper() && m_pcReshape->getCTUFlag() && isChroma(compID) && TU::getCbf(currTU, compID) && slice.getReshapeInfo().getSliceReshapeChromaAdj() && currTU.blocks[compID].width*currTU.blocks[compID].height > 4 )
{
#if JVET_N0054_JOINT_CHROMA
if ( !(currTU.jointCbCr && compID == COMPONENT_Cr) ) // Joint chroma residual mode: chroma scaling took place already when doing Cb
#endif
resiBuf.scaleSignal(currTU.getChromaAdj(), 0, currTU.cu->cs->slice->clpRng(compID));
}
if( isChroma( compID ) && currTU.compAlpha[compID] != 0 )
......
......@@ -430,6 +430,13 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
CHECK( pcPPS->getQpOffset(COMPONENT_Cr) < -12, "Invalid Cr QP offset" );
CHECK( pcPPS->getQpOffset(COMPONENT_Cr) > 12, "Invalid Cr QP offset" );
#if JVET_N0054_JOINT_CHROMA
READ_SVLC( iCode, "pps_cb_cr_qp_offset");
pcPPS->setQpOffset(JOINT_CbCr, iCode);
CHECK( pcPPS->getQpOffset(JOINT_CbCr) < -12, "Invalid CbCr QP offset" );
CHECK( pcPPS->getQpOffset(JOINT_CbCr) > 12, "Invalid CbCr QP offset" );
#endif
CHECK(MAX_NUM_COMPONENT>3, "Invalid maximal number of components");
READ_FLAG( uiCode, "pps_slice_chroma_qp_offsets_present_flag" );
......@@ -1920,6 +1927,15 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para
CHECK( pcSlice->getSliceChromaQpDelta(COMPONENT_Cr) > 12, "Invalid chroma QP offset" );
CHECK( (pps->getQpOffset(COMPONENT_Cr) + pcSlice->getSliceChromaQpDelta(COMPONENT_Cr)) < -12, "Invalid chroma QP offset" );
CHECK( (pps->getQpOffset(COMPONENT_Cr) + pcSlice->getSliceChromaQpDelta(COMPONENT_Cr)) > 12, "Invalid chroma QP offset" );
#if JVET_N0054_JOINT_CHROMA
READ_SVLC( iCode, "slice_cb_cr_qp_offset" );
pcSlice->setSliceChromaQpDelta(JOINT_CbCr, iCode );
CHECK( pcSlice->getSliceChromaQpDelta(JOINT_CbCr) < -12, "Invalid chroma QP offset" );
CHECK( pcSlice->getSliceChromaQpDelta(JOINT_CbCr) > 12, "Invalid chroma QP offset" );
CHECK( (pps->getQpOffset(JOINT_CbCr) + pcSlice->getSliceChromaQpDelta(JOINT_CbCr)) < -12, "Invalid chroma QP offset" );
CHECK( (pps->getQpOffset(JOINT_CbCr) + pcSlice->getSliceChromaQpDelta(JOINT_CbCr)) > 12, "Invalid chroma QP offset" );
#endif
}
}
......
......@@ -2297,11 +2297,30 @@ void CABACWriter::cu_chroma_qp_offset( const CodingUnit& cu )
// void residual_coding_subblock( coeffCtx )
//================================================================================
#if JVET_N0054_JOINT_CHROMA
void CABACWriter::joint_cb_cr( const TransformUnit& tu )
{
m_BinEncoder.encodeBin( tu.jointCbCr ? 1 : 0, Ctx::JointCbCrFlag( 0 ) );
}
#endif
void CABACWriter::residual_coding( const TransformUnit& tu, ComponentID compID )
{
const CodingUnit& cu = *tu.cu;
DTRACE( g_trace_ctx, D_SYNTAX, "residual_coding() etype=%d pos=(%d,%d) size=%dx%d predMode=%d\n", tu.blocks[compID].compID, tu.blocks[compID].x, tu.blocks[compID].y, tu.blocks[compID].width, tu.blocks[compID].height, cu.predMode );
#if JVET_N0054_JOINT_CHROMA
// Joint Cb-Cr residual mode is signalled if both Cb and Cr cbfs are true
if ( compID == COMPONENT_Cr && TU::getCbf( tu, COMPONENT_Cb ) )
{
joint_cb_cr( tu );
// No Cr residual in bitstream in joint Cb-Cr residual mode
if ( tu.jointCbCr )
return;
}
#endif
// code transform skip and explicit rdpcm mode
mts_coding ( tu, compID );
explicit_rdpcm_mode( tu, compID );
......
......@@ -144,6 +144,9 @@ public:
void explicit_rdpcm_mode ( const TransformUnit& tu, ComponentID compID );
void last_sig_coeff ( CoeffCodingContext& cctx, const TransformUnit& tu, ComponentID compID );
void residual_coding_subblock ( CoeffCodingContext& cctx, const TCoeff* coeff, const int stateTransTable, int& state );
#if JVET_N0054_JOINT_CHROMA
void joint_cb_cr ( const TransformUnit& tu );
#endif
// cross component prediction (clause 7.3.8.12)
void cross_comp_pred ( const TransformUnit& tu, ComponentID compID );
......
......@@ -314,6 +314,10 @@ protected:
int m_chromaCrQpOffset; // Chroma Cr Qp Offset (0:default)
int m_chromaCbQpOffsetDualTree; // Chroma Cb QP Offset for dual tree
int m_chromaCrQpOffsetDualTree; // Chroma Cr Qp Offset for dual tree
#if JVET_N0054_JOINT_CHROMA
int m_chromaCbCrQpOffset; // QP Offset for the joint Cb-Cr mode
int m_chromaCbCrQpOffsetDualTree; // QP Offset for the joint Cb-Cr mode in dual tree
#endif
#if ER_CHROMA_QP_WCG_PPS
WCGChromaQPControl m_wcgChromaQpControl; ///< Wide-colour-gamut chroma QP control.
#endif
......@@ -863,6 +867,11 @@ public:
void setChromaCrQpOffsetDualTree ( int i ) { m_chromaCrQpOffsetDualTree = i; }
int getChromaCbQpOffsetDualTree () const { return m_chromaCbQpOffsetDualTree; }
int getChromaCrQpOffsetDualTree () const { return m_chromaCrQpOffsetDualTree; }
#if JVET_N0054_JOINT_CHROMA
void setChromaCbCrQpOffset ( int i ) { m_chromaCbCrQpOffset = i; }
void setChromaCbCrQpOffsetDualTree ( int i ) { m_chromaCbCrQpOffsetDualTree = i; }
int getChromaCbCrQpOffsetDualTree () const { return m_chromaCbCrQpOffsetDualTree; }
#endif
#if ER_CHROMA_QP_WCG_PPS
void setWCGChromaQpControl ( const WCGChromaQPControl &ctrl ) { m_wcgChromaQpControl = ctrl; }
const WCGChromaQPControl &getWCGChromaQPControl () const { return m_wcgChromaQpControl; }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment