Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
jvet
VVCSoftware_VTM
Commits
c7b58ece
Commit
c7b58ece
authored
Jan 31, 2019
by
Frank Bossen
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'JVET-M0246' into 'master'
JVET-M0246: adaptive MV precision for affine inter mode See merge request
!201
parents
68ecfe81
aa17a16a
Pipeline
#656
passed with stage
Changes
29
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
864 additions
and
50 deletions
+864
-50
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
+3
-0
source/App/EncoderApp/EncAppCfg.cpp
source/App/EncoderApp/EncAppCfg.cpp
+6
-0
source/App/EncoderApp/EncAppCfg.h
source/App/EncoderApp/EncAppCfg.h
+4
-1
source/Lib/CommonLib/CodingStructure.cpp
source/Lib/CommonLib/CodingStructure.cpp
+3
-0
source/Lib/CommonLib/CodingStructure.h
source/Lib/CommonLib/CodingStructure.h
+3
-1
source/Lib/CommonLib/Contexts.cpp
source/Lib/CommonLib/Contexts.cpp
+13
-0
source/Lib/CommonLib/Mv.h
source/Lib/CommonLib/Mv.h
+3
-0
source/Lib/CommonLib/Slice.cpp
source/Lib/CommonLib/Slice.cpp
+3
-0
source/Lib/CommonLib/Slice.h
source/Lib/CommonLib/Slice.h
+7
-0
source/Lib/CommonLib/TypeDef.h
source/Lib/CommonLib/TypeDef.h
+1
-0
source/Lib/CommonLib/UnitTools.cpp
source/Lib/CommonLib/UnitTools.cpp
+115
-15
source/Lib/CommonLib/UnitTools.h
source/Lib/CommonLib/UnitTools.h
+3
-0
source/Lib/DecoderLib/CABACReader.cpp
source/Lib/DecoderLib/CABACReader.cpp
+43
-1
source/Lib/DecoderLib/CABACReader.h
source/Lib/DecoderLib/CABACReader.h
+3
-0
source/Lib/DecoderLib/DecCu.cpp
source/Lib/DecoderLib/DecCu.cpp
+33
-0
source/Lib/DecoderLib/VLCReader.cpp
source/Lib/DecoderLib/VLCReader.cpp
+3
-1
source/Lib/EncoderLib/CABACWriter.cpp
source/Lib/EncoderLib/CABACWriter.cpp
+65
-1
source/Lib/EncoderLib/CABACWriter.h
source/Lib/EncoderLib/CABACWriter.h
+7
-1
source/Lib/EncoderLib/EncCfg.h
source/Lib/EncoderLib/EncCfg.h
+8
-1
source/Lib/EncoderLib/EncCu.cpp
source/Lib/EncoderLib/EncCu.cpp
+75
-0
source/Lib/EncoderLib/EncLib.cpp
source/Lib/EncoderLib/EncLib.cpp
+3
-0
source/Lib/EncoderLib/EncModeCtrl.cpp
source/Lib/EncoderLib/EncModeCtrl.cpp
+11
-1
source/Lib/EncoderLib/InterSearch.cpp
source/Lib/EncoderLib/InterSearch.cpp
+418
-24
source/Lib/EncoderLib/InterSearch.h
source/Lib/EncoderLib/InterSearch.h
+24
-2
source/Lib/EncoderLib/VLCWriter.cpp
source/Lib/EncoderLib/VLCWriter.cpp
+3
-1
No files found.
cfg/encoder_intra_vtm.cfg
View file @
c7b58ece
...
...
@@ -113,6 +113,7 @@ IMV : 2
ALF : 1
IBC : 0 # turned off in CTC
AllowDisFracMMVD : 1
AffineAmvr : 0
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_lowdelay_P_vtm.cfg
View file @
c7b58ece
...
...
@@ -130,6 +130,7 @@ ALF : 1
MHIntra : 1
IBC : 0 # turned off in CTC
AllowDisFracMMVD : 1
AffineAmvr : 0
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_lowdelay_vtm.cfg
View file @
c7b58ece
...
...
@@ -133,6 +133,7 @@ MHIntra : 1
Triangle : 1
IBC : 0 # turned off in CTC
AllowDisFracMMVD : 1
AffineAmvr : 0
# Fast tools
PBIntraFast : 1
...
...
cfg/encoder_randomaccess_vtm.cfg
View file @
c7b58ece
...
...
@@ -148,6 +148,7 @@ MHIntra : 1
Triangle : 1
IBC : 0 # turned off in CTC
AllowDisFracMMVD : 1
AffineAmvr : 1
# Fast tools
PBIntraFast : 1
...
...
source/App/EncoderApp/EncApp.cpp
View file @
c7b58ece
...
...
@@ -259,6 +259,9 @@ void EncApp::xInitLibCfg()
m_cEncLib
.
setUseTriangle
(
m_Triangle
);
#if JVET_M0255_FRACMMVD_SWITCH
m_cEncLib
.
setAllowDisFracMMVD
(
m_allowDisFracMMVD
);
#endif
#if JVET_M0246_AFFINE_AMVR
m_cEncLib
.
setUseAffineAmvr
(
m_AffineAmvr
);
#endif
m_cEncLib
.
setIBCMode
(
m_IBCMode
);
m_cEncLib
.
setIBCLocalSearchRangeX
(
m_IBCLocalSearchRangeX
);
...
...
source/App/EncoderApp/EncAppCfg.cpp
View file @
c7b58ece
...
...
@@ -866,6 +866,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
(
"Triangle"
,
m_Triangle
,
false
,
"Enable triangular shape motion vector prediction (0:off, 1:on)"
)
#if JVET_M0255_FRACMMVD_SWITCH
(
"AllowDisFracMMVD"
,
m_allowDisFracMMVD
,
false
,
"Disable fractional MVD in MMVD mode adaptively"
)
#endif
#if JVET_M0246_AFFINE_AMVR
(
"AffineAmvr"
,
m_AffineAmvr
,
false
,
"Eanble AMVR for affine inter mode"
)
#endif
(
"IBC"
,
m_IBCMode
,
0u
,
"IBCMode (0x1:enabled, 0x0:disabled) [default: disabled]"
)
(
"IBCLocalSearchRangeX"
,
m_IBCLocalSearchRangeX
,
128u
,
"Search range of IBC local search in x direction"
)
...
...
@@ -3149,6 +3152,9 @@ void EncAppCfg::xPrintParameter()
msg
(
VERBOSE
,
"Triangle:%d "
,
m_Triangle
);
#if JVET_M0255_FRACMMVD_SWITCH
msg
(
VERBOSE
,
"AllowDisFracMMVD:%d "
,
m_allowDisFracMMVD
);
#endif
#if JVET_M0246_AFFINE_AMVR
msg
(
VERBOSE
,
"AffineAmvr:%d "
,
m_AffineAmvr
);
#endif
}
msg
(
VERBOSE
,
"IBC:%d "
,
m_IBCMode
);
...
...
source/App/EncoderApp/EncAppCfg.h
View file @
c7b58ece
...
...
@@ -240,6 +240,9 @@ protected:
#if JVET_M0255_FRACMMVD_SWITCH
bool
m_allowDisFracMMVD
;
#endif
#if JVET_M0246_AFFINE_AMVR
bool
m_AffineAmvr
;
#endif
unsigned
m_IBCMode
;
unsigned
m_IBCLocalSearchRangeX
;
...
...
@@ -248,7 +251,7 @@ protected:
unsigned
m_IBCHashSearchMaxCand
;
unsigned
m_IBCHashSearchRange4SmallBlk
;
unsigned
m_IBCFastMethod
;
bool
m_wrapAround
;
unsigned
m_wrapAroundOffset
;
...
...
source/Lib/CommonLib/CodingStructure.cpp
View file @
c7b58ece
...
...
@@ -62,6 +62,9 @@ CodingStructure::CodingStructure(CUCache& cuCache, PUCache& puCache, TUCache& tu
:
area
()
,
picture
(
nullptr
)
,
parent
(
nullptr
)
#if JVET_M0246_AFFINE_AMVR
,
bestCS
(
nullptr
)
#endif
,
m_isTuEnc
(
false
)
,
m_cuCache
(
cuCache
)
,
m_puCache
(
puCache
)
...
...
source/Lib/CommonLib/CodingStructure.h
View file @
c7b58ece
...
...
@@ -79,7 +79,9 @@ public:
Picture
*
picture
;
CodingStructure
*
parent
;
#if JVET_M0246_AFFINE_AMVR
CodingStructure
*
bestCS
;
#endif
Slice
*
slice
;
UnitScale
unitScale
[
MAX_NUM_COMPONENT
];
...
...
source/Lib/CommonLib/Contexts.cpp
View file @
c7b58ece
...
...
@@ -1241,15 +1241,28 @@ const CtxSet ContextSetCfg::ChromaQpAdjIdc = ContextSetCfg::addCtxSet
const
CtxSet
ContextSetCfg
::
ImvFlag
=
ContextSetCfg
::
addCtxSet
({
#if JVET_M0453_CABAC_ENGINE
#if JVET_M0246_AFFINE_AMVR
{
227
,
214
,
230
,
195
,
227
,
214
,
},
{
213
,
229
,
230
,
166
,
213
,
229
,
},
{
CNU
,
CNU
,
CNU
,
CNU
,
CNU
,
CNU
,
},
{
1
,
4
,
4
,
5
,
1
,
4
,
},
#else
{
227
,
214
,
230
,
195
,},
{
213
,
229
,
230
,
166
,},
{
CNU
,
CNU
,
CNU
,
CNU
,},
{
1
,
4
,
4
,
5
,},
#endif
#else
#if BD_AFFINE_AMVR
{
212
,
214
,
230
,
182
,
212
,
214
},
{
212
,
214
,
230
,
182
,
212
,
214
},
{
CNU
,
CNU
,
CNU
,
CNU
,
CNU
,
CNU
},
#else
{
212
,
214
,
230
,
182
,
},
{
212
,
214
,
230
,
182
,
},
{
CNU
,
CNU
,
CNU
,
CNU
,
},
#endif
#endif
});
const
CtxSet
ContextSetCfg
::
ctbAlfFlag
=
...
...
source/Lib/CommonLib/Mv.h
View file @
c7b58ece
...
...
@@ -51,6 +51,9 @@ enum MvPrecision
{
MV_PRECISION_4PEL
=
0
,
// 4-pel
MV_PRECISION_INT
=
2
,
// 1-pel, shift 2 bits from 4-pel
#if JVET_M0246_AFFINE_AMVR
MV_PRECISION_HALF
=
3
,
// 1/2-pel
#endif
MV_PRECISION_QUARTER
=
4
,
// 1/4-pel (the precision of regular MV difference signaling), shift 4 bits from 4-pel
MV_PRECISION_INTERNAL
=
6
,
// 1/16-pel (the precision of internal MV), shift 6 bits from 4-pel
};
...
...
source/Lib/CommonLib/Slice.cpp
View file @
c7b58ece
...
...
@@ -1840,6 +1840,9 @@ SPS::SPS()
,
m_bNoLadfConstraintFlag
(
false
)
,
m_bNoDepQuantConstraintFlag
(
false
)
,
m_bNoSignDataHidingConstraintFlag
(
false
)
#if JVET_M0246_AFFINE_AMVR
,
m_affineAmvrEnabledFlag
(
false
)
#endif
#if HEVC_VPS
,
m_VPSId
(
0
)
#endif
...
...
source/Lib/CommonLib/Slice.h
View file @
c7b58ece
...
...
@@ -942,6 +942,9 @@ private:
bool
m_bNoDepQuantConstraintFlag
;
bool
m_bNoSignDataHidingConstraintFlag
;
#if JVET_M0246_AFFINE_AMVR
bool
m_affineAmvrEnabledFlag
;
#endif
#if HEVC_VPS
int
m_VPSId
;
#endif
...
...
@@ -1227,6 +1230,10 @@ public:
void
setUseStrongIntraSmoothing
(
bool
bVal
)
{
m_useStrongIntraSmoothing
=
bVal
;
}
bool
getUseStrongIntraSmoothing
()
const
{
return
m_useStrongIntraSmoothing
;
}
#endif
#if JVET_M0246_AFFINE_AMVR
void
setAffineAmvrEnabledFlag
(
bool
val
)
{
m_affineAmvrEnabledFlag
=
val
;
}
bool
getAffineAmvrEnabledFlag
()
const
{
return
m_affineAmvrEnabledFlag
;
}
#endif
bool
getVuiParametersPresentFlag
()
const
{
return
m_vuiParametersPresentFlag
;
}
void
setVuiParametersPresentFlag
(
bool
b
)
{
m_vuiParametersPresentFlag
=
b
;
}
...
...
source/Lib/CommonLib/TypeDef.h
View file @
c7b58ece
...
...
@@ -107,6 +107,7 @@ typedef std::pair<int, bool> TrMode;
typedef
std
::
pair
<
int
,
int
>
TrCost
;
#endif
#define JVET_M0246_AFFINE_AMVR 1
#define JVET_M0421_SPLIT_SIG 1
#define JVET_M0173_MOVE_GT2_TO_FIRST_PASS 1 // Moving the gtr2 flag to the first coding pass
...
...
source/Lib/CommonLib/UnitTools.cpp
View file @
c7b58ece
...
...
@@ -2104,14 +2104,36 @@ bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &r
}
xInheritedAffineMv
(
pu
,
neibPU
,
eRefPicListIndex
,
outputAffineMv
);
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
==
0
)
{
#endif
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
else
if
(
pu
.
cu
->
imv
==
2
)
{
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
}
#endif
affiAMVPInfo
.
mvCandLT
[
affiAMVPInfo
.
numCand
]
=
outputAffineMv
[
0
];
affiAMVPInfo
.
mvCandRT
[
affiAMVPInfo
.
numCand
]
=
outputAffineMv
[
1
];
if
(
pu
.
cu
->
affineType
==
AFFINEMODEL_6PARAM
)
{
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
==
0
)
{
#endif
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
else
if
(
pu
.
cu
->
imv
==
2
)
{
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
}
#endif
affiAMVPInfo
.
mvCandLB
[
affiAMVPInfo
.
numCand
]
=
outputAffineMv
[
2
];
}
affiAMVPInfo
.
numCand
++
;
...
...
@@ -2240,9 +2262,16 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
{
for
(
int
i
=
0
;
i
<
affiAMVPInfo
.
numCand
;
i
++
)
{
affiAMVPInfo
.
mvCandLT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandRT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandLB
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
!=
1
)
{
#endif
affiAMVPInfo
.
mvCandLT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandRT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandLB
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
#endif
}
return
;
}
...
...
@@ -2294,10 +2323,22 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
outputAffineMv
[
1
]
=
amvpInfo1
.
mvCand
[
0
];
outputAffineMv
[
2
]
=
amvpInfo2
.
mvCand
[
0
];
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
==
0
)
{
#endif
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
else
if
(
pu
.
cu
->
imv
==
2
)
{
outputAffineMv
[
0
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
outputAffineMv
[
1
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
outputAffineMv
[
2
].
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
}
#endif
if
(
cornerMVPattern
==
7
||
(
cornerMVPattern
==
3
&&
pu
.
cu
->
affineType
==
AFFINEMODEL_4PARAM
)
)
{
...
...
@@ -2372,7 +2413,18 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
if
(
(
C0Avail
&&
getColocatedMVP
(
pu
,
eRefPicList
,
posC0
,
cColMv
,
refIdxCol
))
||
getColocatedMVP
(
pu
,
eRefPicList
,
posC1
,
cColMv
,
refIdxCol
)
)
#endif
{
cColMv
.
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
==
0
)
{
#endif
cColMv
.
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
else
if
(
pu
.
cu
->
imv
==
2
)
{
cColMv
.
roundToPrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_INT
);
}
#endif
affiAMVPInfo
.
mvCandLT
[
affiAMVPInfo
.
numCand
]
=
cColMv
;
affiAMVPInfo
.
mvCandRT
[
affiAMVPInfo
.
numCand
]
=
cColMv
;
affiAMVPInfo
.
mvCandLB
[
affiAMVPInfo
.
numCand
]
=
cColMv
;
...
...
@@ -2395,9 +2447,16 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
for
(
int
i
=
0
;
i
<
affiAMVPInfo
.
numCand
;
i
++
)
{
affiAMVPInfo
.
mvCandLT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandRT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandLB
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
if
(
pu
.
cu
->
imv
!=
1
)
{
#endif
affiAMVPInfo
.
mvCandLT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandRT
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
affiAMVPInfo
.
mvCandLB
[
i
].
changePrecision
(
MV_PRECISION_INTERNAL
,
MV_PRECISION_QUARTER
);
#if JVET_M0246_AFFINE_AMVR
}
#endif
}
...
...
@@ -4367,6 +4426,47 @@ bool CU::hasSubCUNonZeroMVd( const CodingUnit& cu )
return
bNonZeroMvd
;
}
#if JVET_M0246_AFFINE_AMVR
bool
CU
::
hasSubCUNonZeroAffineMVd
(
const
CodingUnit
&
cu
)
{
bool
nonZeroAffineMvd
=
false
;
if
(
!
cu
.
affine
||
cu
.
firstPU
->
mergeFlag
)
{
return
false
;
}
for
(
const
auto
&
pu
:
CU
::
traversePUs
(
cu
)
)
{
if
(
(
!
pu
.
mergeFlag
)
&&
(
!
cu
.
skip
)
)
{
if
(
pu
.
interDir
!=
2
/* PRED_L1 */
)
{
for
(
int
i
=
0
;
i
<
(
cu
.
affineType
==
AFFINEMODEL_6PARAM
?
3
:
2
);
i
++
)
{
nonZeroAffineMvd
|=
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
i
].
getHor
()
!=
0
;
nonZeroAffineMvd
|=
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
i
].
getVer
()
!=
0
;
}
}
if
(
pu
.
interDir
!=
1
/* PRED_L0 */
)
{
if
(
!
pu
.
cu
->
cs
->
slice
->
getMvdL1ZeroFlag
()
||
pu
.
interDir
!=
3
/* PRED_BI */
)
{
for
(
int
i
=
0
;
i
<
(
cu
.
affineType
==
AFFINEMODEL_6PARAM
?
3
:
2
);
i
++
)
{
nonZeroAffineMvd
|=
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
i
].
getHor
()
!=
0
;
nonZeroAffineMvd
|=
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
i
].
getVer
()
!=
0
;
}
}
}
}
}
return
nonZeroAffineMvd
;
}
#endif
int
CU
::
getMaxNeighboriMVCandNum
(
const
CodingStructure
&
cs
,
const
Position
&
pos
)
{
const
int
numDefault
=
0
;
...
...
source/Lib/CommonLib/UnitTools.h
View file @
c7b58ece
...
...
@@ -92,6 +92,9 @@ namespace CU
cTUTraverser
traverseTUs
(
const
CodingUnit
&
cu
);
bool
hasSubCUNonZeroMVd
(
const
CodingUnit
&
cu
);
#if JVET_M0246_AFFINE_AMVR
bool
hasSubCUNonZeroAffineMVd
(
const
CodingUnit
&
cu
);
#endif
int
getMaxNeighboriMVCandNum
(
const
CodingStructure
&
cs
,
const
Position
&
pos
);
void
resetMVDandMV2Int
(
CodingUnit
&
cu
,
InterPrediction
*
interPred
);
...
...
source/Lib/DecoderLib/CABACReader.cpp
View file @
c7b58ece
...
...
@@ -979,6 +979,13 @@ void CABACReader::imv_mode( CodingUnit& cu, MergeCtx& mrgCtx )
return
;
}
#if JVET_M0246_AFFINE_AMVR
if
(
cu
.
affine
)
{
return
;
}
#endif
const
SPSNext
&
spsNext
=
cu
.
cs
->
sps
->
getSpsNext
();
unsigned
value
=
0
;
...
...
@@ -1000,6 +1007,39 @@ void CABACReader::imv_mode( CodingUnit& cu, MergeCtx& mrgCtx )
DTRACE
(
g_trace_ctx
,
D_SYNTAX
,
"imv_mode() IMVFlag=%d
\n
"
,
cu
.
imv
);
}
#if JVET_M0246_AFFINE_AMVR
void
CABACReader
::
affine_amvr_mode
(
CodingUnit
&
cu
,
MergeCtx
&
mrgCtx
)
{
RExt__DECODER_DEBUG_BIT_STATISTICS_CREATE_SET
(
STATS__CABAC_BITS__OTHER
);
const
SPS
*
sps
=
cu
.
slice
->
getSPS
();
if
(
!
sps
->
getAffineAmvrEnabledFlag
()
||
!
cu
.
affine
)
{
return
;
}
if
(
!
CU
::
hasSubCUNonZeroAffineMVd
(
cu
)
)
{
return
;
}
unsigned
value
=
0
;
value
=
m_BinDecoder
.
decodeBin
(
Ctx
::
ImvFlag
(
4
)
);
DTRACE
(
g_trace_ctx
,
D_SYNTAX
,
"affine_amvr_mode() value=%d ctx=%d
\n
"
,
value
,
4
);
if
(
value
)
{
value
=
m_BinDecoder
.
decodeBin
(
Ctx
::
ImvFlag
(
5
)
);
DTRACE
(
g_trace_ctx
,
D_SYNTAX
,
"affine_amvr_mode() value=%d ctx=%d
\n
"
,
value
,
5
);
value
++
;
}
cu
.
imv
=
value
;
DTRACE
(
g_trace_ctx
,
D_SYNTAX
,
"affine_amvr_mode() IMVFlag=%d
\n
"
,
cu
.
imv
);
}
#endif
void
CABACReader
::
pred_mode
(
CodingUnit
&
cu
)
{
RExt__DECODER_DEBUG_BIT_STATISTICS_CREATE_SET
(
STATS__CABAC_BITS__PRED_MODE
);
...
...
@@ -1057,7 +1097,9 @@ void CABACReader::cu_pred_data( CodingUnit &cu )
}
imv_mode
(
cu
,
mrgCtx
);
#if JVET_M0246_AFFINE_AMVR
affine_amvr_mode
(
cu
,
mrgCtx
);
#endif
cu_gbi_flag
(
cu
);
}
...
...
source/Lib/DecoderLib/CABACReader.h
View file @
c7b58ece
...
...
@@ -107,6 +107,9 @@ public:
void
merge_idx
(
PredictionUnit
&
pu
);
void
mmvd_merge_idx
(
PredictionUnit
&
pu
);
void
imv_mode
(
CodingUnit
&
cu
,
MergeCtx
&
mrgCtx
);
#if JVET_M0246_AFFINE_AMVR
void
affine_amvr_mode
(
CodingUnit
&
cu
,
MergeCtx
&
mrgCtx
);
#endif
void
inter_pred_idc
(
PredictionUnit
&
pu
);
void
ref_idx
(
PredictionUnit
&
pu
,
RefPicList
eRefList
);
void
mvp_flag
(
PredictionUnit
&
pu
,
RefPicList
eRefList
);
...
...
source/Lib/DecoderLib/DecCu.cpp
View file @
c7b58ece
...
...
@@ -583,7 +583,11 @@ void DecCu::xDeriveCUMV( CodingUnit &cu )
else
{
#if REUSE_CU_RESULTS
#if JVET_M0246_AFFINE_AMVR
if
(
cu
.
imv
&&
!
pu
.
cu
->
affine
&&
!
cu
.
cs
->
pcv
->
isEncoder
)
#else
if
(
cu
.
imv
&&
!
cu
.
cs
->
pcv
->
isEncoder
)
#endif
#else
if
(
cu
.
imv
)
#endif
...
...
@@ -608,7 +612,35 @@ void DecCu::xDeriveCUMV( CodingUnit &cu )
// Mv mv[3];
CHECK
(
pu
.
refIdx
[
eRefList
]
<
0
,
"Unexpected negative refIdx."
);
#if JVET_M0246_AFFINE_AMVR
Mv
tmpMvd
[
3
];
memcpy
(
tmpMvd
,
pu
.
mvdAffi
[
eRefList
],
3
*
sizeof
(
Mv
)
);
const
int
imvShift
=
(
!
cu
.
cs
->
pcv
->
isEncoder
&&
pu
.
cu
->
imv
==
2
)
?
MV_FRACTIONAL_BITS_DIFF
:
0
;
pu
.
mvdAffi
[
eRefList
][
0
]
<<=
imvShift
;
pu
.
mvdAffi
[
eRefList
][
1
]
<<=
imvShift
;
Mv
mvLT
=
affineAMVPInfo
.
mvCandLT
[
mvp_idx
]
+
pu
.
mvdAffi
[
eRefList
][
0
];
Mv
mvRT
=
affineAMVPInfo
.
mvCandRT
[
mvp_idx
]
+
pu
.
mvdAffi
[
eRefList
][
1
];
mvRT
+=
pu
.
mvdAffi
[
eRefList
][
0
];
if
(
pu
.
cu
->
imv
!=
1
)
{
mvLT
.
changePrecision
(
MV_PRECISION_QUARTER
,
MV_PRECISION_INTERNAL
);
mvRT
.
changePrecision
(
MV_PRECISION_QUARTER
,
MV_PRECISION_INTERNAL
);
}
Mv
mvLB
;
if
(
cu
.
affineType
==
AFFINEMODEL_6PARAM
)
{
pu
.
mvdAffi
[
eRefList
][
2
]
<<=
imvShift
;
mvLB
=
affineAMVPInfo
.
mvCandLB
[
mvp_idx
]
+
pu
.
mvdAffi
[
eRefList
][
2
];
mvLB
+=
pu
.
mvdAffi
[
eRefList
][
0
];
if
(
pu
.
cu
->
imv
!=
1
)
{
mvLB
.
changePrecision
(
MV_PRECISION_QUARTER
,
MV_PRECISION_INTERNAL
);
}
}
memcpy
(
pu
.
mvdAffi
[
eRefList
],
tmpMvd
,
3
*
sizeof
(
Mv
)
);
#else
Mv
mvLT
=
affineAMVPInfo
.
mvCandLT
[
mvp_idx
]
+
pu
.
mvdAffi
[
eRefList
][
0
];
Mv
mvRT
=
affineAMVPInfo
.
mvCandRT
[
mvp_idx
]
+
pu
.
mvdAffi
[
eRefList
][
1
];
mvRT
+=
pu
.
mvdAffi
[
eRefList
][
0
];
...
...
@@ -622,6 +654,7 @@ void DecCu::xDeriveCUMV( CodingUnit &cu )
mvLB
+=
pu
.
mvdAffi
[
eRefList
][
0
];
mvLB
.
changePrecision
(
MV_PRECISION_QUARTER
,
MV_PRECISION_INTERNAL
);
}
#endif
PU
::
setAllAffineMv
(
pu
,
mvLT
,
mvRT
,
mvLB
,
eRefList
);
}
}
...
...
source/Lib/DecoderLib/VLCReader.cpp
View file @
c7b58ece
...
...
@@ -1050,7 +1050,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
#if JVET_M0255_FRACMMVD_SWITCH
READ_FLAG
(
uiCode
,
"sps_fracmmvd_disabled_flag"
);
pcSPS
->
setDisFracMmvdEnabledFlag
(
uiCode
!=
0
);
#endif
#if JVET_M0246_AFFINE_AMVR
READ_FLAG
(
uiCode
,
"sps_affine_amvr_enabled_flag"
);
pcSPS
->
setAffineAmvrEnabledFlag
(
uiCode
!=
0
);
#endif
#if HEVC_USE_SCALING_LISTS
READ_FLAG
(
uiCode
,
"scaling_list_enabled_flag"
);
pcSPS
->
setScalingListFlag
(
uiCode
);
if
(
pcSPS
->
getScalingListFlag
())
...
...
source/Lib/EncoderLib/CABACWriter.cpp
View file @
c7b58ece
...
...
@@ -830,6 +830,9 @@ void CABACWriter::cu_pred_data( const CodingUnit& cu )
}
imv_mode
(
cu
);
#if JVET_M0246_AFFINE_AMVR
affine_amvr_mode
(
cu
);
#endif
cu_gbi_flag
(
cu
);
...
...
@@ -1326,6 +1329,9 @@ void CABACWriter::prediction_unit( const PredictionUnit& pu )
}
else
{
#if JVET_M0246_AFFINE_AMVR
int8_t
affineMvdShift
=
pu
.
cu
->
imv
?
(
pu
.
cu
->
imv
==
1
?
-
1
:
1
)
:
0
;
#endif
inter_pred_idc
(
pu
);
affine_flag
(
*
pu
.
cu
);
#if JVET_M0444_SMVD
...
...
@@ -1336,12 +1342,21 @@ void CABACWriter::prediction_unit( const PredictionUnit& pu )
ref_idx
(
pu
,
REF_PIC_LIST_0
);
if
(
pu
.
cu
->
affine
)
{
#if JVET_M0246_AFFINE_AMVR
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
0
],
affineMvdShift
);
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
1
],
affineMvdShift
);
if
(
pu
.
cu
->
affineType
==
AFFINEMODEL_6PARAM
)
{
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
2
],
affineMvdShift
);
}
#else
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
0
],
0
);
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
1
],
0
);
if
(
pu
.
cu
->
affineType
==
AFFINEMODEL_6PARAM
)
{
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_0
][
2
],
0
);
}
#endif
}
else
{
...
...
@@ -1360,12 +1375,21 @@ void CABACWriter::prediction_unit( const PredictionUnit& pu )
{
if
(
pu
.
cu
->
affine
)
{
#if JVET_M0246_AFFINE_AMVR
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
0
],
affineMvdShift
);
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
1
],
affineMvdShift
);
if
(
pu
.
cu
->
affineType
==
AFFINEMODEL_6PARAM
)
{
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
2
],
affineMvdShift
);
}
#else
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
0
],
0
);
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
1
],
0
);
if
(
pu
.
cu
->
affineType
==
AFFINEMODEL_6PARAM
)
{
mvd_coding
(
pu
.
mvdAffi
[
REF_PIC_LIST_1
][
2
],
0
);
}
#endif
}
else
{
...
...
@@ -1451,6 +1475,12 @@ void CABACWriter::imv_mode( const CodingUnit& cu )
{
return
;
}
#if JVET_M0246_AFFINE_AMVR
if
(
cu
.
affine
)
{
return
;
}
#endif
bool
bNonZeroMvd
=
CU
::
hasSubCUNonZeroMVd
(
cu
);