Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
V
VVCSoftware_VTM
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Custom Issue Tracker
Custom Issue Tracker
Labels
Merge Requests
14
Merge Requests
14
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
jvet
VVCSoftware_VTM
Commits
35a88f87
Commit
35a88f87
authored
Nov 06, 2018
by
Xiaozhong Xu
Committed by
Frank Bossen
Nov 06, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
L0293_CPR mode
parent
a5bbac4b
Changes
48
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
48 changed files
with
3393 additions
and
49 deletions
+3393
-49
cfg/encoder_intra_vtm.cfg
cfg/encoder_intra_vtm.cfg
+1
-0
cfg/encoder_lowdelay_P_vtm.cfg
cfg/encoder_lowdelay_P_vtm.cfg
+1
-0
cfg/encoder_lowdelay_vtm.cfg
cfg/encoder_lowdelay_vtm.cfg
+1
-0
cfg/encoder_randomaccess_vtm.cfg
cfg/encoder_randomaccess_vtm.cfg
+1
-0
source/App/EncoderApp/EncApp.cpp
source/App/EncoderApp/EncApp.cpp
+11
-0
source/App/EncoderApp/EncAppCfg.cpp
source/App/EncoderApp/EncAppCfg.cpp
+17
-0
source/App/EncoderApp/EncAppCfg.h
source/App/EncoderApp/EncAppCfg.h
+12
-0
source/Lib/CommonLib/CodingStructure.cpp
source/Lib/CommonLib/CodingStructure.cpp
+39
-0
source/Lib/CommonLib/CodingStructure.h
source/Lib/CommonLib/CodingStructure.h
+15
-0
source/Lib/CommonLib/Common.h
source/Lib/CommonLib/Common.h
+22
-0
source/Lib/CommonLib/CommonDef.h
source/Lib/CommonLib/CommonDef.h
+9
-0
source/Lib/CommonLib/ContextModelling.cpp
source/Lib/CommonLib/ContextModelling.cpp
+8
-1
source/Lib/CommonLib/CprHashMap.cpp
source/Lib/CommonLib/CprHashMap.cpp
+361
-0
source/Lib/CommonLib/CprHashMap.h
source/Lib/CommonLib/CprHashMap.h
+95
-0
source/Lib/CommonLib/InterPrediction.cpp
source/Lib/CommonLib/InterPrediction.cpp
+118
-6
source/Lib/CommonLib/InterPrediction.h
source/Lib/CommonLib/InterPrediction.h
+20
-1
source/Lib/CommonLib/LoopFilter.cpp
source/Lib/CommonLib/LoopFilter.cpp
+6
-0
source/Lib/CommonLib/MotionInfo.h
source/Lib/CommonLib/MotionInfo.h
+3
-0
source/Lib/CommonLib/Mv.h
source/Lib/CommonLib/Mv.h
+13
-0
source/Lib/CommonLib/Quant.cpp
source/Lib/CommonLib/Quant.cpp
+4
-2
source/Lib/CommonLib/RdCost.h
source/Lib/CommonLib/RdCost.h
+110
-0
source/Lib/CommonLib/Slice.cpp
source/Lib/CommonLib/Slice.cpp
+33
-0
source/Lib/CommonLib/Slice.h
source/Lib/CommonLib/Slice.h
+9
-0
source/Lib/CommonLib/TypeDef.h
source/Lib/CommonLib/TypeDef.h
+5
-0
source/Lib/CommonLib/Unit.cpp
source/Lib/CommonLib/Unit.cpp
+18
-0
source/Lib/CommonLib/Unit.h
source/Lib/CommonLib/Unit.h
+7
-1
source/Lib/CommonLib/UnitTools.cpp
source/Lib/CommonLib/UnitTools.cpp
+480
-19
source/Lib/CommonLib/UnitTools.h
source/Lib/CommonLib/UnitTools.h
+18
-2
source/Lib/CommonLib/x86/CprHashMapX86.h
source/Lib/CommonLib/x86/CprHashMapX86.h
+62
-0
source/Lib/CommonLib/x86/InitX86.cpp
source/Lib/CommonLib/x86/InitX86.cpp
+6
-2
source/Lib/CommonLib/x86/sse42/CprHashmap_sse42.cpp
source/Lib/CommonLib/x86/sse42/CprHashmap_sse42.cpp
+1
-0
source/Lib/DecoderLib/CABACReader.cpp
source/Lib/DecoderLib/CABACReader.cpp
+20
-0
source/Lib/DecoderLib/DecCu.cpp
source/Lib/DecoderLib/DecCu.cpp
+43
-0
source/Lib/DecoderLib/DecLib.cpp
source/Lib/DecoderLib/DecLib.cpp
+6
-0
source/Lib/DecoderLib/VLCReader.cpp
source/Lib/DecoderLib/VLCReader.cpp
+3
-0
source/Lib/EncoderLib/CABACWriter.cpp
source/Lib/EncoderLib/CABACWriter.cpp
+16
-0
source/Lib/EncoderLib/EncCfg.h
source/Lib/EncoderLib/EncCfg.h
+30
-0
source/Lib/EncoderLib/EncCu.cpp
source/Lib/EncoderLib/EncCu.cpp
+644
-7
source/Lib/EncoderLib/EncCu.h
source/Lib/EncoderLib/EncCu.h
+14
-3
source/Lib/EncoderLib/EncGOP.cpp
source/Lib/EncoderLib/EncGOP.cpp
+44
-0
source/Lib/EncoderLib/EncLib.cpp
source/Lib/EncoderLib/EncLib.cpp
+10
-0
source/Lib/EncoderLib/EncModeCtrl.cpp
source/Lib/EncoderLib/EncModeCtrl.cpp
+58
-0
source/Lib/EncoderLib/EncModeCtrl.h
source/Lib/EncoderLib/EncModeCtrl.h
+4
-0
source/Lib/EncoderLib/EncSlice.h
source/Lib/EncoderLib/EncSlice.h
+3
-0
source/Lib/EncoderLib/InterSearch.cpp
source/Lib/EncoderLib/InterSearch.cpp
+943
-1
source/Lib/EncoderLib/InterSearch.h
source/Lib/EncoderLib/InterSearch.h
+39
-4
source/Lib/EncoderLib/IntraSearch.cpp
source/Lib/EncoderLib/IntraSearch.cpp
+7
-0
source/Lib/EncoderLib/VLCWriter.cpp
source/Lib/EncoderLib/VLCWriter.cpp
+3
-0
No files found.
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
-