Commit 896d654b authored by Xiaozhong Xu's avatar Xiaozhong Xu Committed by Xiang Li

K0076_CPR code update

parent 1d1c0667
......@@ -2303,6 +2303,10 @@ void AdaptiveLoopFilter::xCUAdaptive( CodingStructure& cs, const PelUnitBuf &rec
for( auto &currCU : cs.traverseCUs( ctuArea, CH_L ) )
{
#if JVET_K0076_CPR_DT
if (currCU.chType != CH_L)
break;
#endif
const Position& cuPos = currCU.lumaPos();
const int qtDepth = currCU.qtDepth;
const unsigned qtSize = maxCUSize >> qtDepth;
......
......@@ -667,8 +667,11 @@ struct UnitBuf
void removeHighFreq ( const UnitBuf<T>& other, const bool bClip, const ClpRngs& clpRngs);
#if JEM_TOOLS
#if JVET_K0076_CPR_DT
void smoothWithRef(const UnitBuf<const T>& refBuf, const ClpRngs& clpRngs, const bool lumaCh = true, const bool chromaCh = true);
#else
void smoothWithRef ( const UnitBuf<const T>& refBuf, const ClpRngs& clpRngs );
#endif
#endif
UnitBuf< T> subBuf (const UnitArea& subArea);
const UnitBuf<const T> subBuf (const UnitArea& subArea) const;
......@@ -813,11 +816,21 @@ const UnitBuf<const T> UnitBuf<T>::subBuf( const UnitArea& subArea ) const
#if JEM_TOOLS
template<typename T>
#if JVET_K0076_CPR_DT
void UnitBuf<T>::smoothWithRef(const UnitBuf<const T>& refBuf, const ClpRngs& clpRngs, const bool lumaCh, const bool chromaCh)
#else
void UnitBuf<T>::smoothWithRef( const UnitBuf<const T>& refBuf, const ClpRngs& clpRngs )
#endif
{
for( int comp = 0; comp < bufs.size(); comp++ )
{
const ComponentID compID = ComponentID( comp );
#if JVET_K0076_CPR_DT
if (compID == COMPONENT_Y && !lumaCh)
continue;
if (compID != COMPONENT_Y && !chromaCh)
continue;
#endif
get( compID ).smoothWithRef( refBuf.get( compID ), clpRngs.comp[compID] );
}
}
......
......@@ -564,7 +564,13 @@ cTUTraverser CodingStructure::traverseTUs( const UnitArea& unit, const ChannelTy
void CodingStructure::allocateVectorsAtPicLevel()
{
const int twice = ( !pcv->ISingleTree && slice->isIntra() && pcv->chrFormat != CHROMA_400 ) ? 2 : 1;
const int twice = (
#if JVET_K0076_CPR_DT
(!pcv->ISingleTree && (slice->isIntra() || (this->slice->getNumRefIdx(REF_PIC_LIST_0) == 1 && this->slice->getNumRefIdx(REF_PIC_LIST_1) == 0 && this->slice->getRefPOC(REF_PIC_LIST_0, 0) == this->slice->getPOC())))
#else
!pcv->ISingleTree && slice->isIntra()
#endif
&& pcv->chrFormat != CHROMA_400 ) ? 2 : 1;
size_t allocSize = twice * unitScale[0].scale( area.blocks[0].size() ).area();
cus.reserve( allocSize );
......@@ -762,7 +768,11 @@ void CodingStructure::useSubStructure( const CodingStructure& subStruct, const C
if( cpyResi ) picture->getResiBuf( clippedArea ).copyFrom( subResiBuf );
if( cpyReco ) picture->getRecoBuf( clippedArea ).copyFrom( subRecoBuf );
#if JVET_K0076_CPR_DT
if (!subStruct.m_isTuEnc && (!slice->isIntra() && subStruct.chType != CHANNEL_TYPE_CHROMA))
#else
if( !subStruct.m_isTuEnc && !slice->isIntra() )
#endif
{
// copy motion buffer
MotionBuf ownMB = getMotionBuf ( clippedArea );
......@@ -1398,3 +1408,38 @@ const TransformUnit* CodingStructure::getTURestricted( const Position &pos, cons
}
}
#if JVET_K0076_CPR_DT
IbcLumaCoverage CodingStructure::getIbcLumaCoverage(const CompArea& chromaArea) const
{
CHECK(chType != CHANNEL_TYPE_CHROMA, "Error");
static const unsigned int unitArea = MIN_PU_SIZE * MIN_PU_SIZE;
CompArea lumaArea = CompArea(COMPONENT_Y, chromaArea.chromaFormat, chromaArea.lumaPos(), recalcSize(chromaArea.chromaFormat, CHANNEL_TYPE_CHROMA, CHANNEL_TYPE_LUMA, chromaArea.size()));
lumaArea = clipArea(lumaArea, picture->block(COMPONENT_Y));
const unsigned int fullArea = lumaArea.area();
unsigned int ibcArea = 0;
for (SizeType y = 0; y < lumaArea.height; y += MIN_PU_SIZE)
{
for (SizeType x = 0; x < lumaArea.width; x += MIN_PU_SIZE)
{
Position pos = lumaArea.offset(x, y);
if (picture->cs->getMotionInfo(pos).isInter) // need to change if inter slice allows dualtree
{
ibcArea += unitArea;
}
}
}
IbcLumaCoverage coverage = IBC_LUMA_COVERAGE_FULL;
if (ibcArea == 0)
{
coverage = IBC_LUMA_COVERAGE_NONE;
}
else if (ibcArea < fullArea)
{
coverage = IBC_LUMA_COVERAGE_PARTIAL;
}
return coverage;
}
#endif
\ No newline at end of file
......@@ -58,7 +58,15 @@ enum PictureType
PIC_ORG_RESI,
NUM_PIC_TYPES
};
#if JVET_K0076_CPR_DT
enum IbcLumaCoverage
{
IBC_LUMA_COVERAGE_FULL = 0,
IBC_LUMA_COVERAGE_PARTIAL,
IBC_LUMA_COVERAGE_NONE,
NUM_IBC_LUMA_COVERAGE,
};
#endif
extern XUCache g_globalUnitCache;
// ---------------------------------------------------------------------------
......@@ -150,7 +158,9 @@ public:
cCUTraverser traverseCUs(const UnitArea& _unit, const ChannelType _chType) const;
cPUTraverser traversePUs(const UnitArea& _unit, const ChannelType _chType) const;
cTUTraverser traverseTUs(const UnitArea& _unit, const ChannelType _chType) const;
#if JVET_K0076_CPR_DT
IbcLumaCoverage getIbcLumaCoverage(const CompArea& chromaArea) const;
#endif
// ---------------------------------------------------------------------------
// encoding search utilities
// ---------------------------------------------------------------------------
......
......@@ -122,7 +122,7 @@ namespace std
{
size_t operator()(const Position& value) const
{
return (((unsigned long long)value.x << 32) + value.y);
return (((uint64_t)value.x << 32) + value.y);
}
};
......@@ -131,7 +131,7 @@ namespace std
{
size_t operator()(const Size& value) const
{
return (((unsigned long long)value.width << 32) + value.height);
return (((uint64_t)value.width << 32) + value.height);
}
};
}
......
......@@ -40,7 +40,6 @@
#include "CommonLib/UnitTools.h"
#include "IbcHashMap.h"
#include <nmmintrin.h>
using namespace std;
......@@ -56,6 +55,14 @@ IbcHashMap::IbcHashMap()
m_picWidth = 0;
m_picHeight = 0;
m_pos2Hash = NULL;
m_computeCrc32c = xxComputeCrc32c16bit;
#if ENABLE_SIMD_OPT_CPR
#ifdef TARGET_SIMD_X86
initIbcHashMapX86();
#endif
#endif
}
IbcHashMap::~IbcHashMap()
......@@ -92,22 +99,105 @@ void IbcHashMap::destroy()
}
m_pos2Hash = NULL;
}
////////////////////////////////////////////////////////
// CRC32C calculation in C code, same results as SSE 4.2's implementation
static const uint32_t crc32Table[256] = {
0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L,
0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL,
0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL,
0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L,
0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL,
0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L,
0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L,
0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL,
0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L,
0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L,
0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L,
0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L,
0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L,
0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L,
0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L,
0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L,
0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL,
0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L,
0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L,
0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL,
0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L,
0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL,
0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL,
0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L,
0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L,
0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL,
0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL,
0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L,
0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL,
0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L,
0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L,
0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL,
0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
};
uint32_t IbcHashMap::xxComputeCrc32c16bit(uint32_t crc, const Pel pel)
{
const void *buf = &pel;
const uint8_t *p = (const uint8_t *)buf;
size_t size = 2;
while (size--)
{
crc = crc32Table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
}
return crc;
}
// CRC calculation in C code
////////////////////////////////////////////////////////
template<int maskBit>
unsigned int IbcHashMap::xxCalcBlockHash(const Pel* pel, const int stride, const int width, const int height, unsigned int crc)
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
crc = _mm_crc32_u16(crc, pel[x] >> maskBit);
crc = m_computeCrc32c(crc, pel[x]);
}
pel += stride;
}
return crc;
}
template<ChromaFormat chromaFormat, int maskBit>
template<ChromaFormat chromaFormat>
void IbcHashMap::xxBuildPicHashMap(const PelUnitBuf& pic)
{
const int chromaScalingX = getChannelTypeScaleX(CHANNEL_TYPE_CHROMA, chromaFormat);
......@@ -136,14 +226,14 @@ void IbcHashMap::xxBuildPicHashMap(const PelUnitBuf& pic)
unsigned int hashValue = 0x1FF;
// luma part
hashValue = xxCalcBlockHash<maskBit>(&pelY[pos.x], pic.Y().stride, MIN_PU_SIZE, MIN_PU_SIZE, hashValue);
hashValue = xxCalcBlockHash(&pelY[pos.x], pic.Y().stride, MIN_PU_SIZE, MIN_PU_SIZE, hashValue);
// chroma part
if (chromaFormat != CHROMA_400)
{
int chromaX = pos.x >> chromaScalingX;
hashValue = xxCalcBlockHash<maskBit>(&pelCb[chromaX], pic.Cb().stride, chromaMinBlkWidth, chromaMinBlkHeight, hashValue);
hashValue = xxCalcBlockHash<maskBit>(&pelCr[chromaX], pic.Cr().stride, chromaMinBlkWidth, chromaMinBlkHeight, hashValue);
hashValue = xxCalcBlockHash(&pelCb[chromaX], pic.Cb().stride, chromaMinBlkWidth, chromaMinBlkHeight, hashValue);
hashValue = xxCalcBlockHash(&pelCr[chromaX], pic.Cr().stride, chromaMinBlkWidth, chromaMinBlkHeight, hashValue);
}
// hash table
......@@ -160,16 +250,16 @@ void IbcHashMap::rebuildPicHashMap(const PelUnitBuf& pic)
switch (pic.chromaFormat)
{
case CHROMA_400:
xxBuildPicHashMap<CHROMA_400, 0>(pic);
xxBuildPicHashMap<CHROMA_400>(pic);
break;
case CHROMA_420:
xxBuildPicHashMap<CHROMA_420, 0>(pic);
xxBuildPicHashMap<CHROMA_420>(pic);
break;
case CHROMA_422:
xxBuildPicHashMap<CHROMA_422, 0>(pic);
xxBuildPicHashMap<CHROMA_422>(pic);
break;
case CHROMA_444:
xxBuildPicHashMap<CHROMA_444, 0>(pic);
xxBuildPicHashMap<CHROMA_444>(pic);
break;
default:
THROW("invalid chroma fomat");
......
......@@ -48,7 +48,6 @@
#include <unordered_map>
#include <vector>
//! \ingroup EncoderLib
//! \{
......@@ -64,13 +63,15 @@ private:
unsigned int** m_pos2Hash;
std::unordered_map<unsigned int, std::vector<Position>> m_hash2Pos;
template<int maskBit>
unsigned int xxCalcBlockHash(const Pel* pel, const int stride, const int width, const int height, unsigned int crc);
template<ChromaFormat chromaFormat, int maskBit>
template<ChromaFormat chromaFormat>
void xxBuildPicHashMap(const PelUnitBuf& pic);
static uint32_t xxComputeCrc32c16bit(uint32_t crc, const Pel pel);
public:
uint32_t (*m_computeCrc32c) (uint32_t crc, const Pel pel);
IbcHashMap();
virtual ~IbcHashMap();
......@@ -81,6 +82,12 @@ public:
bool ibcHashMatch(const Area& lumaArea, std::vector<Position>& cand, const CodingStructure& cs, const int maxCand, const int searchRange4SmallBlk);
int getHashHitRatio(const Area& lumaArea);
#ifdef TARGET_SIMD_X86
void initIbcHashMapX86();
template <X86_VEXT vext>
void _initIbcHashMapX86();
#endif
};
//! \}
......
......@@ -663,8 +663,38 @@ void InterPrediction::xSubPuMC( PredictionUnit& pu, PelUnitBuf& predBuf, const R
}
#endif
#if JVET_K0076_CPR_DT
void InterPrediction::xChromaMC(PredictionUnit &pu, PelUnitBuf& pcYuvPred)
{
// separated tree, chroma
const CompArea lumaArea = CompArea(COMPONENT_Y, pu.chromaFormat, pu.Cb().lumaPos(), recalcSize(pu.chromaFormat, CHANNEL_TYPE_CHROMA, CHANNEL_TYPE_LUMA, pu.Cb().size()));
PredictionUnit subPu;
subPu.cs = pu.cs;
subPu.cu = pu.cu;
Picture * refPic = pu.cu->slice->getPic();
for (int y = lumaArea.y; y < lumaArea.y + lumaArea.height; y += MIN_PU_SIZE)
{
for (int x = lumaArea.x; x < lumaArea.x + lumaArea.width; x += MIN_PU_SIZE)
{
const MotionInfo &curMi = pu.cs->picture->cs->getMotionInfo(Position{ x, y });
subPu.UnitArea::operator=(UnitArea(pu.chromaFormat, Area(x, y, MIN_PU_SIZE, MIN_PU_SIZE)));
PelUnitBuf subPredBuf = pcYuvPred.subBuf(UnitAreaRelative(pu, subPu));
xPredInterBlk(COMPONENT_Cb, subPu, refPic, curMi.mv[0], subPredBuf, false, pu.cu->slice->clpRng(COMPONENT_Cb), false, false, FRUC_MERGE_OFF, false);
xPredInterBlk(COMPONENT_Cr, subPu, refPic, curMi.mv[0], subPredBuf, false, pu.cu->slice->clpRng(COMPONENT_Cr), false, false, FRUC_MERGE_OFF, false);
}
}
}
#endif
#if JEM_TOOLS
void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi, const bool& bBIOApplied /*= false*/, const bool& bDMVRApplied /*= false*/ )
void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi, const bool& bBIOApplied /*= false*/, const bool& bDMVRApplied /*= false*/
#if JVET_K0076_CPR_DT
, const bool luma, const bool chroma
#endif
)
#else
void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi )
#endif
......@@ -702,7 +732,12 @@ void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList&
for( uint32_t comp = COMPONENT_Y; comp < pcYuvPred.bufs.size() && comp <= m_maxCompIDToPred; comp++ )
{
const ComponentID compID = ComponentID( comp );
#if JVET_K0076_CPR_DT
if (compID == COMPONENT_Y && !luma)
continue;
if (compID != COMPONENT_Y && !chroma)
continue;
#endif
#if JEM_TOOLS
if( pu.cu->affine )
{
......@@ -1811,8 +1846,29 @@ void InterPrediction::xWeightedAverage( const PredictionUnit& pu, const CPelUnit
}
}
void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBuf, const RefPicList &eRefPicList )
void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBuf, const RefPicList &eRefPicList
#if JVET_K0076_CPR_DT
, const bool luma, const bool chroma
#endif
)
{
#if JVET_K0076_CPR_DT
// dual tree handling for CPR as the only ref
if (!luma || !chroma)
{
if (!luma && chroma)
{
xChromaMC(pu, predBuf);
return;
}
else // (luma && !chroma)
{
xPredInterUni(pu, eRefPicList, predBuf, false, false, false, luma, chroma);
return;
}
}
// else, go with regular MC below
#endif
CodingStructure &cs = *pu.cs;
const PPS &pps = *cs.pps;
const SliceType sliceType = cs.slice->getSliceType();
......@@ -1859,14 +1915,22 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu
return;
}
void InterPrediction::motionCompensation( CodingUnit &cu, const RefPicList &eRefPicList )
void InterPrediction::motionCompensation( CodingUnit &cu, const RefPicList &eRefPicList
#if JVET_K0076_CPR_DT
, const bool luma, const bool chroma
#endif
)
{
for( auto &pu : CU::traversePUs( cu ) )
{
PelUnitBuf predBuf = cu.cs->getPredBuf( pu );
#if JEM_TOOLS
pu.mvRefine = true;
motionCompensation( pu, predBuf, eRefPicList );
motionCompensation( pu, predBuf, eRefPicList
#if JVET_K0076_CPR_DT
, luma, chroma
#endif
);
pu.mvRefine = false;
#else
motionCompensation( pu, predBuf, eRefPicList );
......@@ -1874,10 +1938,18 @@ void InterPrediction::motionCompensation( CodingUnit &cu, const RefPicList &eRef
}
}
void InterPrediction::motionCompensation( PredictionUnit &pu, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/ )
void InterPrediction::motionCompensation( PredictionUnit &pu, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/
#if JVET_K0076_CPR_DT
, const bool luma, const bool chroma
#endif
)
{
PelUnitBuf predBuf = pu.cs->getPredBuf( pu );
motionCompensation( pu, predBuf, eRefPicList );
motionCompensation( pu, predBuf, eRefPicList
#if JVET_K0076_CPR_DT
, luma, chroma
#endif
);
}
#if JEM_TOOLS
......
......@@ -217,7 +217,11 @@ protected:
#endif
#if JEM_TOOLS
void xPredInterUni ( const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi, const bool& bBIOApplied = false, const bool& bDMVRApplied = false );
void xPredInterUni ( const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi, const bool& bBIOApplied = false, const bool& bDMVRApplied = false
#if JVET_K0076_CPR_DT
, const bool luma = true, const bool chroma = true
#endif
);
void xPredInterBi ( PredictionUnit& pu, PelUnitBuf &pcYuvPred, bool obmc = false );
#else
void xPredInterUni ( const PredictionUnit& pu, const RefPicList& eRefPicList, PelUnitBuf& pcYuvPred, const bool& bi );
......@@ -262,7 +266,9 @@ protected:
#if JEM_TOOLS
void xSubBlockMotionCompensation( PredictionUnit &pu, PelUnitBuf &pcYuvPred );
#endif
#if JVET_K0076_CPR_DT
void xChromaMC ( PredictionUnit &pu, PelUnitBuf& pcYuvPred );
#endif
void destroy();
#if JEM_TOOLS
......@@ -355,9 +361,21 @@ public:
void init (RdCost* pcRdCost, ChromaFormat chromaFormatIDC);
// inter
void motionCompensation (PredictionUnit &pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X);
void motionCompensation (PredictionUnit &pu, const RefPicList &eRefPicList = REF_PIC_LIST_X);
void motionCompensation (CodingUnit &cu, const RefPicList &eRefPicList = REF_PIC_LIST_X);
void motionCompensation (PredictionUnit &pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X
#if JVET_K0076_CPR_DT
, const bool luma = true, const bool chroma = true
#endif
);
void motionCompensation (PredictionUnit &pu, const RefPicList &eRefPicList = REF_PIC_LIST_X
#if JVET_K0076_CPR_DT
, const bool luma = true, const bool chroma = true
#endif
);
void motionCompensation (CodingUnit &cu, const RefPicList &eRefPicList = REF_PIC_LIST_X
#if JVET_K0076_CPR_DT
, const bool luma = true, const bool chroma = true
#endif
);
#if JEM_TOOLS
void subBlockOBMC (CodingUnit &cu);
......
......@@ -454,8 +454,13 @@ unsigned LoopFilter::xGetBoundaryStrengthSingle ( const CodingUnit& cu, const De
const Slice& sliceQ = *cu.slice;
const Position& cuPosLuma = cu.lumaPos();
#if JVET_K0076_CPR_DT
int shiftHor = cu.Y().valid() ? 0 : ::getComponentScaleX(COMPONENT_Cb, cu.firstPU->chromaFormat);
int shiftVer = cu.Y().valid() ? 0 : ::getComponentScaleY(COMPONENT_Cb, cu.firstPU->chromaFormat);
const Position& posQ = Position{ localPos.x >> shiftHor, localPos.y >> shiftVer };
#else
const Position& posQ = localPos;
#endif
const Position posP = ( edgeDir == EDGE_VER ) ? posQ.offset( -1, 0 ) : posQ.offset( 0, -1 );
const bool sameCU = posP.x >= cuPosLuma.x && posP.y >= cuPosLuma.y;
......
......@@ -289,7 +289,7 @@ namespace std
{
size_t operator()(const Mv& value) const
{
return (((unsigned long long)value.hor << 32) + value.ver);
return (((uint64_t)value.hor << 32) + value.ver);
}
};
};
......
......@@ -209,7 +209,7 @@ public:
}
}
__inline Distortion getBvCostMultiplePreds(int x, int y, bool useIMV)
inline Distortion getBvCostMultiplePreds(int x, int y, bool useIMV)
{
return Distortion((m_dCost * getBitsMultiplePreds(x, y, useIMV)) / 65536.0);
}
......@@ -286,20 +286,20 @@ public:
}
}
unsigned int getIComponentBits(int iVal)
unsigned int getIComponentBits(int val)
{
if (!iVal) return 1;
if (!val) return 1;
unsigned int uiLength = 1;
unsigned int uiTemp = (iVal <= 0) ? (-iVal << 1) + 1 : (iVal << 1);
unsigned int length = 1;
unsigned int temp = (val <= 0) ? (-val << 1) + 1 : (val << 1);
while (1 != uiTemp)
while (1 != temp)
{
uiTemp >>= 1;
uiLength += 2;
temp >>= 1;
length += 2;
}
return uiLength;
return length;
}
#endif
......
......@@ -2723,7 +2723,12 @@ void calculateParameterSetChangedFlag(bool &bChanged, const std::vector<uint8_t>
uint32_t PreCalcValues::getValIdx( const Slice &slice, const ChannelType chType ) const
{
#if JVET_K0076_CPR_DT
return (slice.isIntra() || (slice.getNumRefIdx(REF_PIC_LIST_0) == 1 && slice.getNumRefIdx(REF_PIC_LIST_1) == 0 && slice.getRefPOC(REF_PIC_LIST_0, 0) == slice.getPOC()))
? (ISingleTree ? 0 : (chType << 1)) : 1;
#else
return slice.isIntra() ? ( ISingleTree ? 0 : ( chType << 1 ) ) : 1;
#endif
}
uint32_t PreCalcValues::getMaxBtDepth( const Slice &slice, const ChannelType chType ) const
......@@ -2738,7 +2743,12 @@ uint32_t PreCalcValues::getMinBtSize( const Slice &slice, const ChannelType chTy
uint32_t PreCalcValues::getMaxBtSize( const Slice &slice, const ChannelType chType ) const
{
#if JVET_K0076_CPR_DT
return (( !slice.isIntra() && !(slice.getNumRefIdx(REF_PIC_LIST_0) == 1 && slice.getNumRefIdx(REF_PIC_LIST_1) == 0 && slice.getRefPOC(REF_PIC_LIST_0, 0) == slice.getPOC()) )
|| isLuma(chType) || ISingleTree) ? slice.getMaxBTSize() : MAX_BT_SIZE_C;
#else
return ( !slice.isIntra() || isLuma( chType ) || ISingleTree ) ? slice.getMaxBTSize() : MAX_BT_SIZE_C;
#endif
}
uint32_t PreCalcValues::getMinTtSize( const Slice &slice, const ChannelType chType ) const
......
......@@ -51,6 +51,10 @@
#include <cassert>
#define JVET_K0076_CPR 1 // current picture referencing or intra block copy mode
#if JVET_K0076_CPR
#define JVET_K0076_CPR_DT 1 // dualItree support for CPR
#endif
#define JVET_K1000_SIMPLIFIED_EMT 1 // EMT with only DCT-2, DCT-8 and DST-7
......@@ -302,6 +306,9 @@
#if JVET_K0371_ALF