Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Remy Foray
VVCSoftware_VTM
Commits
35a88f87
Commit
35a88f87
authored
Nov 06, 2018
by
Xiaozhong Xu
Committed by
Frank Bossen
Nov 06, 2018
Browse files
L0293_CPR mode
parent
a5bbac4b
Changes
48
Hide whitespace changes
Inline
Side-by-side
cfg/encoder_intra_vtm.cfg
View file @
35a88f87
...
...
@@ -111,6 +111,7 @@ LMChroma : 1 # use CCLM only
DepQuant : 1
IMV : 2
ALF : 1
CPR : 0 # turned off in CTC
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_lowdelay_P_vtm.cfg
View file @
35a88f87
...
...
@@ -128,6 +128,7 @@ DepQuant : 1
IMV : 2
ALF : 1
MHIntra : 1
CPR : 0 # turned off in CTC
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_lowdelay_vtm.cfg
View file @
35a88f87
...
...
@@ -131,6 +131,7 @@ GBi : 1
GBiFast : 1
MHIntra : 1
Triangle : 1
CPR : 0 # turned off in CTC
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_randomaccess_vtm.cfg
View file @
35a88f87
...
...
@@ -146,6 +146,7 @@ GBiFast : 1
BIO : 1
MHIntra : 1
Triangle : 1
CPR : 0 # turned off in CTC
# Fast tools
PBIntraFast : 1
...
...
source/App/EncoderApp/EncApp.cpp
View file @
35a88f87
...
...
@@ -269,6 +269,17 @@ void EncApp::xInitLibCfg()
#if JVET_L0124_L0208_TRIANGLE
m_cEncLib
.
setUseTriangle
(
m_Triangle
);
#endif
#if JVET_L0293_CPR
m_cEncLib
.
setCPRMode
(
m_CPRMode
);
m_cEncLib
.
setCPRLocalSearchRangeX
(
m_CPRLocalSearchRangeX
);
m_cEncLib
.
setCPRLocalSearchRangeY
(
m_CPRLocalSearchRangeY
);
m_cEncLib
.
setCPRHashSearch
(
m_CPRHashSearch
);
m_cEncLib
.
setCPRHashSearchMaxCand
(
m_CPRHashSearchMaxCand
);
m_cEncLib
.
setCPRHashSearchRange4SmallBlk
(
m_CPRHashSearchRange4SmallBlk
);
m_cEncLib
.
setCPRFastMethod
(
m_CPRFastMethod
);
#endif
// ADD_NEW_TOOL : (encoder app) add setting of tool enabling flags and associated parameters here
m_cEncLib
.
setMaxCUWidth
(
m_QTBT
?
m_uiCTUSize
:
m_uiMaxCUWidth
);
...
...
source/App/EncoderApp/EncAppCfg.cpp
View file @
35a88f87
...
...
@@ -874,6 +874,17 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
#if JVET_L0124_L0208_TRIANGLE
(
"Triangle"
,
m_Triangle
,
false
,
"Enable triangular shape motion vector prediction (0:off, 1:on)"
)
#endif
#if JVET_L0293_CPR
(
"CPR"
,
m_CPRMode
,
0u
,
"CPRMode (0x1:enabled, 0x0:disabled) [default: disabled]"
)
(
"CPRLocalSearchRangeX"
,
m_CPRLocalSearchRangeX
,
128u
,
"Search range of CPR local search in x direction"
)
(
"CPRLocalSearchRangeY"
,
m_CPRLocalSearchRangeY
,
128u
,
"Search range of CPR local search in y direction"
)
(
"CPRHashSearch"
,
m_CPRHashSearch
,
1u
,
"Hash based CPR search"
)
(
"CPRHashSearchMaxCand"
,
m_CPRHashSearchMaxCand
,
256u
,
"Max candidates for hash based CPR search"
)
(
"CPRHashSearchRange4SmallBlk"
,
m_CPRHashSearchRange4SmallBlk
,
256u
,
"Small block search range in based CPR search"
)
(
"CPRFastMethod"
,
m_CPRFastMethod
,
6u
,
"Fast methods for CPR"
)
#endif
// ADD_NEW_TOOL : (encoder app) add parsing parameters here
(
"LCTUFast"
,
m_useFastLCTU
,
false
,
"Fast methods for large CTU"
)
...
...
@@ -1964,6 +1975,9 @@ bool EncAppCfg::xCheckParameter()
xConfirmPara
(
m_DisableMotionCompression
,
"Disable motion data compression only allowed with NEXT profile"
);
xConfirmPara
(
m_MTT
,
"Multi type tree is only allowed with NEXT profile"
);
xConfirmPara
(
m_ImvMode
,
"IMV is only allowed with NEXT profile"
);
#if JVET_L0293_CPR
xConfirmPara
(
m_CPRMode
,
"CPR Mode only allowed with NEXT profile"
);
#endif
xConfirmPara
(
m_useFastLCTU
,
"Fast large CTU can only be applied when encoding with NEXT profile"
);
xConfirmPara
(
m_EMT
,
"EMT only allowed with NEXT profile"
);
xConfirmPara
(
m_FastEMT
,
"EMT only allowed with NEXT profile"
);
...
...
@@ -3208,6 +3222,9 @@ void EncAppCfg::xPrintParameter()
msg
(
VERBOSE
,
"Triangle:%d "
,
m_Triangle
);
#endif
}
#if JVET_L0293_CPR
msg
(
VERBOSE
,
"CPR:%d "
,
m_CPRMode
);
#endif
// ADD_NEW_TOOL (add some output indicating the usage of tools)
msg
(
VERBOSE
,
"
\n
FAST TOOL CFG: "
);
...
...
source/App/EncoderApp/EncAppCfg.h
View file @
35a88f87
...
...
@@ -246,6 +246,18 @@ protected:
#if JVET_L0124_L0208_TRIANGLE
bool
m_Triangle
;
#endif
#if JVET_L0293_CPR
unsigned
m_CPRMode
;
unsigned
m_CPRLocalSearchRangeX
;
unsigned
m_CPRLocalSearchRangeY
;
unsigned
m_CPRHashSearch
;
unsigned
m_CPRHashSearchMaxCand
;
unsigned
m_CPRHashSearchRange4SmallBlk
;
unsigned
m_CPRFastMethod
;
#endif
// ADD_NEW_TOOL : (encoder app) add tool enabling flags and associated parameters here
unsigned
m_uiMaxCUWidth
;
///< max. CU width in pixel
...
...
source/Lib/CommonLib/CodingStructure.cpp
View file @
35a88f87
...
...
@@ -749,7 +749,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_L0293_CPR
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
);
...
...
@@ -1302,3 +1306,38 @@ const TransformUnit* CodingStructure::getTURestricted( const Position &pos, cons
}
}
#if JVET_L0293_CPR
CprLumaCoverage
CodingStructure
::
getCprLumaCoverage
(
const
CompArea
&
chromaArea
)
const
{
CHECK
(
chType
!=
CHANNEL_TYPE_CHROMA
,
"Error"
);
const
unsigned
int
unitAreaSubBlock
=
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
cprArea
=
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
{
cprArea
+=
unitAreaSubBlock
;
}
}
}
CprLumaCoverage
coverage
=
CPR_LUMA_COVERAGE_FULL
;
if
(
cprArea
==
0
)
{
coverage
=
CPR_LUMA_COVERAGE_NONE
;
}
else
if
(
cprArea
<
fullArea
)
{
coverage
=
CPR_LUMA_COVERAGE_PARTIAL
;
}
return
coverage
;
}
#endif
\ No newline at end of file
source/Lib/CommonLib/CodingStructure.h
View file @
35a88f87
...
...
@@ -58,6 +58,15 @@ enum PictureType
PIC_ORG_RESI
,
NUM_PIC_TYPES
};
#if JVET_L0293_CPR
enum
CprLumaCoverage
{
CPR_LUMA_COVERAGE_FULL
=
0
,
CPR_LUMA_COVERAGE_PARTIAL
,
CPR_LUMA_COVERAGE_NONE
,
NUM_CPR_LUMA_COVERAGE
,
};
#endif
extern
XUCache
g_globalUnitCache
;
// ---------------------------------------------------------------------------
...
...
@@ -76,6 +85,9 @@ public:
Slice
*
slice
;
UnitScale
unitScale
[
MAX_NUM_COMPONENT
];
#if JVET_L0293_CPR
ChannelType
chType
;
#endif
int
baseQP
;
int
prevQP
[
MAX_NUM_CHANNEL_TYPE
];
...
...
@@ -146,6 +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_L0293_CPR
CprLumaCoverage
getCprLumaCoverage
(
const
CompArea
&
chromaArea
)
const
;
#endif
// ---------------------------------------------------------------------------
// encoding search utilities
// ---------------------------------------------------------------------------
...
...
source/Lib/CommonLib/Common.h
View file @
35a88f87
...
...
@@ -114,6 +114,28 @@ struct UnitScale
Size
scale
(
const
Size
&
size
)
const
{
return
{
size
.
width
>>
posx
,
size
.
height
>>
posy
};
}
Area
scale
(
const
Area
&
_area
)
const
{
return
Area
(
scale
(
_area
.
pos
()
),
scale
(
_area
.
size
()
)
);
}
};
#if JVET_L0293_CPR
namespace
std
{
template
<
>
struct
hash
<
Position
>
:
public
unary_function
<
Position
,
uint64_t
>
{
uint64_t
operator
()(
const
Position
&
value
)
const
{
return
(((
uint64_t
)
value
.
x
<<
32
)
+
value
.
y
);
}
};
template
<
>
struct
hash
<
Size
>
:
public
unary_function
<
Size
,
uint64_t
>
{
uint64_t
operator
()(
const
Size
&
value
)
const
{
return
(((
uint64_t
)
value
.
width
<<
32
)
+
value
.
height
);
}
};
}
#endif
inline
size_t
rsAddr
(
const
Position
&
pos
,
const
uint32_t
stride
,
const
UnitScale
&
unitScale
)
{
return
(
size_t
)(
stride
>>
unitScale
.
posx
)
*
(
size_t
)(
pos
.
y
>>
unitScale
.
posy
)
+
(
size_t
)(
pos
.
x
>>
unitScale
.
posx
);
...
...
source/Lib/CommonLib/CommonDef.h
View file @
35a88f87
...
...
@@ -435,6 +435,15 @@ static const int TRIANGLE_MAX_NUM_SATD_CANDS = 3;
static
const
int
TRIANGLE_MIN_SIZE
=
8
*
8
;
#endif
#if JVET_L0293_CPR
static
const
int
CPR_MAX_CAND_SIZE
=
16
;
// max block size for cpr search
static
const
int
CPR_NUM_CANDIDATES
=
64
;
///< Maximum number of candidates to store/test
static
const
int
CHROMA_REFINEMENT_CANDIDATES
=
8
;
/// 8 candidates BV to choose from
static
const
int
CPR_FAST_METHOD_NOINTRA_CPRCBF0
=
0x01
;
static
const
int
CPR_FAST_METHOD_BUFFERBV
=
0X02
;
static
const
int
CPR_FAST_METHOD_ADAPTIVE_SEARCHRANGE
=
0X04
;
#endif
// ====================================================================================================================
// Macro functions
// ====================================================================================================================
...
...
source/Lib/CommonLib/ContextModelling.cpp
View file @
35a88f87
...
...
@@ -397,7 +397,14 @@ void MergeCtx::setMergeInfo( PredictionUnit& pu, int candIdx )
pu
.
mvpIdx
[
REF_PIC_LIST_1
]
=
NOT_VALID
;
pu
.
mvpNum
[
REF_PIC_LIST_0
]
=
NOT_VALID
;
pu
.
mvpNum
[
REF_PIC_LIST_1
]
=
NOT_VALID
;
#if JVET_L0293_CPR
if
(
interDirNeighbours
[
candIdx
]
==
1
&&
pu
.
cs
->
slice
->
getRefPic
(
REF_PIC_LIST_0
,
mvFieldNeighbours
[
candIdx
<<
1
].
refIdx
)
->
getPOC
()
==
pu
.
cs
->
slice
->
getPOC
())
{
pu
.
cu
->
cpr
=
true
;
pu
.
bv
=
pu
.
mv
[
REF_PIC_LIST_0
];
pu
.
bv
>>=
(
2
+
VCEG_AZ07_MV_ADD_PRECISION_BIT_FOR_STORE
);
// used for only integer resolution
}
#endif
#if JVET_L0646_GBI
pu
.
cu
->
GBiIdx
=
(
interDirNeighbours
[
candIdx
]
==
3
)
?
GBiIdx
[
candIdx
]
:
GBI_DEFAULT
;
#endif
...
...
source/Lib/CommonLib/CprHashMap.cpp
0 → 100644
View file @
35a88f87
/* The copyright in this software is being made available under the BSD
* License, included below. This software may be subject to other third party
* and contributor rights, including patent rights, and no such rights are
* granted under this license.
*
* Copyright (c) 2010-2018, ITU/ISO/IEC
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/** \file CprHashMap.cpp
\brief CPR hash map encoder class
*/
#include "CommonLib/dtrace_codingstruct.h"
#include "CommonLib/Picture.h"
#include "CommonLib/UnitTools.h"
#include "CprHashMap.h"
using
namespace
std
;
//! \ingroup CprHashMap
//! \{
// ====================================================================================================================
// Constructor / destructor / create / destroy
// ====================================================================================================================
CprHashMap
::
CprHashMap
()
{
m_picWidth
=
0
;
m_picHeight
=
0
;
m_pos2Hash
=
NULL
;
m_computeCrc32c
=
xxComputeCrc32c16bit
;
#if ENABLE_SIMD_OPT_CPR
#ifdef TARGET_SIMD_X86
initCprHashMapX86
();
#endif
#endif
}
CprHashMap
::~
CprHashMap
()
{
destroy
();
}
void
CprHashMap
::
init
(
const
int
picWidth
,
const
int
picHeight
)
{
if
(
picWidth
!=
m_picWidth
||
picHeight
!=
m_picHeight
)
{
destroy
();
}
m_picWidth
=
picWidth
;
m_picHeight
=
picHeight
;
m_pos2Hash
=
new
unsigned
int
*
[
m_picHeight
];
m_pos2Hash
[
0
]
=
new
unsigned
int
[
m_picWidth
*
m_picHeight
];
for
(
int
n
=
1
;
n
<
m_picHeight
;
n
++
)
{
m_pos2Hash
[
n
]
=
m_pos2Hash
[
n
-
1
]
+
m_picWidth
;
}
}
void
CprHashMap
::
destroy
()
{
if
(
m_pos2Hash
!=
NULL
)
{
if
(
m_pos2Hash
[
0
]
!=
NULL
)
{
delete
[]
m_pos2Hash
[
0
];
}
delete
[]
m_pos2Hash
;
}
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
CprHashMap
::
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
////////////////////////////////////////////////////////
unsigned
int
CprHashMap
::
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
=
m_computeCrc32c
(
crc
,
pel
[
x
]);
}
pel
+=
stride
;
}
return
crc
;
}
template
<
ChromaFormat
chromaFormat
>
void
CprHashMap
::
xxBuildPicHashMap
(
const
PelUnitBuf
&
pic
)
{
const
int
chromaScalingX
=
getChannelTypeScaleX
(
CHANNEL_TYPE_CHROMA
,
chromaFormat
);
const
int
chromaScalingY
=
getChannelTypeScaleY
(
CHANNEL_TYPE_CHROMA
,
chromaFormat
);
const
int
chromaMinBlkWidth
=
MIN_PU_SIZE
>>
chromaScalingX
;
const
int
chromaMinBlkHeight
=
MIN_PU_SIZE
>>
chromaScalingY
;
const
Pel
*
pelY
=
NULL
;
const
Pel
*
pelCb
=
NULL
;
const
Pel
*
pelCr
=
NULL
;
Position
pos
;
for
(
pos
.
y
=
0
;
pos
.
y
+
MIN_PU_SIZE
<=
pic
.
Y
().
height
;
pos
.
y
++
)
{
// row pointer
pelY
=
pic
.
Y
().
bufAt
(
0
,
pos
.
y
);
if
(
chromaFormat
!=
CHROMA_400
)
{
int
chromaY
=
pos
.
y
>>
chromaScalingY
;
pelCb
=
pic
.
Cb
().
bufAt
(
0
,
chromaY
);
pelCr
=
pic
.
Cr
().
bufAt
(
0
,
chromaY
);
}
for
(
pos
.
x
=
0
;
pos
.
x
+
MIN_PU_SIZE
<=
pic
.
Y
().
width
;
pos
.
x
++
)
{
// 0x1FF is just an initial value
unsigned
int
hashValue
=
0x1FF
;
// luma part
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
(
&
pelCb
[
chromaX
],
pic
.
Cb
().
stride
,
chromaMinBlkWidth
,
chromaMinBlkHeight
,
hashValue
);
hashValue
=
xxCalcBlockHash
(
&
pelCr
[
chromaX
],
pic
.
Cr
().
stride
,
chromaMinBlkWidth
,
chromaMinBlkHeight
,
hashValue
);
}
// hash table
m_hash2Pos
[
hashValue
].
push_back
(
pos
);
m_pos2Hash
[
pos
.
y
][
pos
.
x
]
=
hashValue
;
}
}
}
void
CprHashMap
::
rebuildPicHashMap
(
const
PelUnitBuf
&
pic
)
{
m_hash2Pos
.
clear
();
switch
(
pic
.
chromaFormat
)
{
case
CHROMA_400
:
xxBuildPicHashMap
<
CHROMA_400
>
(
pic
);
break
;
case
CHROMA_420
:
xxBuildPicHashMap
<
CHROMA_420
>
(
pic
);
break
;
case
CHROMA_422
:
xxBuildPicHashMap
<
CHROMA_422
>
(
pic
);
break
;
case
CHROMA_444
:
xxBuildPicHashMap
<
CHROMA_444
>
(
pic
);
break
;
default:
THROW
(
"invalid chroma fomat"
);
break
;
}
}
bool
CprHashMap
::
cprHashMatch
(
const
Area
&
lumaArea
,
std
::
vector
<
Position
>&
cand
,
const
CodingStructure
&
cs
,
const
int
maxCand
,
const
int
searchRange4SmallBlk
)
{
cand
.
clear
();
// find the block with least candidates
size_t
minSize
=
MAX_UINT
;
unsigned
int
targetHashOneBlock
=
0
;
for
(
SizeType
y
=
0
;
y
<
lumaArea
.
height
&&
minSize
>
1
;
y
+=
MIN_PU_SIZE
)
{
for
(
SizeType
x
=
0
;
x
<
lumaArea
.
width
&&
minSize
>
1
;
x
+=
MIN_PU_SIZE
)
{
unsigned
int
hash
=
m_pos2Hash
[
lumaArea
.
pos
().
y
+
y
][
lumaArea
.
pos
().
x
+
x
];
if
(
m_hash2Pos
[
hash
].
size
()
<
minSize
)
{
minSize
=
m_hash2Pos
[
hash
].
size
();
targetHashOneBlock
=
hash
;
}
}
}
if
(
m_hash2Pos
[
targetHashOneBlock
].
size
()
>
1
)
{
std
::
vector
<
Position
>&
candOneBlock
=
m_hash2Pos
[
targetHashOneBlock
];
// check whether whole block match
for
(
std
::
vector
<
Position
>::
iterator
refBlockPos
=
candOneBlock
.
begin
();
refBlockPos
!=
candOneBlock
.
end
();
refBlockPos
++
)
{
Position
bottomRight
=
refBlockPos
->
offset
(
lumaArea
.
width
-
1
,
lumaArea
.
height
-
1
);
bool
wholeBlockMatch
=
true
;
if
(
lumaArea
.
width
>
MIN_PU_SIZE
||
lumaArea
.
height
>
MIN_PU_SIZE
)
{
#if JVET_L0293_CPR
if
(
!
cs
.
isDecomp
(
bottomRight
,
cs
.
chType
)
||
bottomRight
.
x
>=
m_picWidth
||
bottomRight
.
y
>=
m_picHeight
)
#else
if
(
!
cs
.
isDecomp
(
bottomRight
,
CHANNEL_TYPE_LUMA
)
||
bottomRight
.
x
>=
m_picWidth
||
bottomRight
.
y
>=
m_picHeight
)
#endif
{
continue
;
}
for
(
SizeType
y
=
0
;
y
<
lumaArea
.
height
&&
wholeBlockMatch
;
y
+=
MIN_PU_SIZE
)
{
for
(
SizeType
x
=
0
;
x
<
lumaArea
.
width
&&
wholeBlockMatch
;
x
+=
MIN_PU_SIZE
)
{
// whether the reference block and current block has the same hash
wholeBlockMatch
&=
(
m_pos2Hash
[
lumaArea
.
pos
().
y
+
y
][
lumaArea
.
pos
().
x
+
x
]
==
m_pos2Hash
[
refBlockPos
->
y
+
y
][
refBlockPos
->
x
+
x
]);
}
}
}
else
{
#if JVET_L0293_CPR
if
(
abs
(
refBlockPos
->
x
-
lumaArea
.
x
)
>
searchRange4SmallBlk
||
abs
(
refBlockPos
->
y
-
lumaArea
.
y
)
>
searchRange4SmallBlk
||
!
cs
.
isDecomp
(
bottomRight
,
cs
.
chType
))
#else
if
(
abs
(
refBlockPos
->
x
-
lumaArea
.
x
)
>
searchRange4SmallBlk
||
abs
(
refBlockPos
->
y
-
lumaArea
.
y
)
>
searchRange4SmallBlk
||
!
cs
.
isDecomp
(
bottomRight
,
CHANNEL_TYPE_LUMA
))
#endif
{
continue
;
}
}
if
(
wholeBlockMatch
)
{
cand
.
push_back
(
*
refBlockPos
);
if
(
cand
.
size
()
>
maxCand
)
{