- HEVC
- PU can have at most one set of motion for each prediction direction
- JEM
- PU will be splitted by sub-PUs
- Adds 2 merge modes from sub-PUs, including ATMVP and STMVP. So, do not need to encode other mvs, just enlarge the number of merge candidates.
- each PU has multiple sets of motion information from multiple blocks using ATMVP(advanced temporal motion vector prediction)
- STMVP(spatial-temporal motion vector prediction), mvs of sub-PUs are derived recursively by using the temporal motion vector predictor and spatial neighboring mv
- ATMVP
- Fisrt, get motion source picture and corresponding block
- Second, get converted mv and reference indices from corresponding blocks(not very clear)
- STMVP
- For each sub-PU, first, get all the spatial(2) and temporal(1) mvs with scaling and retrieving; then, average all the mvs for each reference list, and this averaged mv is assigned as the mv of this sub-PU
- code
#define COM16_C806_VCEG_AZ10_SUB_PU_TMVP
- ATMVP
- abstain the temporal vector, to find the motion sourve picture and corresponding block -> check function:
get1stTvFromSpatialNeighbor
(use spatial neighboring[left/top/topleft/topright/leftbottom & refList0/refList1] mvs) - get the ATMVP merge candidate, with the given temporal vector -> check function:
getInterMergeSubPUTmvpCandidate
(1.use 1st temporal vector to derive the centor cu for all the refPics in all refList[do search till find the first available], 2. if the predMode of these centor cus is not equal to MODE_INTRA, derive the colMv using scale operations according to the distance between colPic & curPic with function ofderiveScaledMotionTemporalForOneDirection
->xGetDistScaleFactor
[colPicPoc, colPicRefPoc, curPicPoc, curPicPoc], 3. if the centor cu has motion, then the advanced TMVP candidate is considered, for each sub PU in current PU, we should derive its col-cu in the colPic, when the col-cu is not intraCU, then deriveScaledMotionTemporalForOneDirection for each sub PU)
- abstain the temporal vector, to find the motion sourve picture and corresponding block -> check function:
- if Enable ATMVP, then get the STMVP
- get extend temporal and spatial merge candidates with the function:
getInterMergeSubPURecursiveCandidate
(for each sub PU, get the extend left and top neighboring block mvs & temporal neighboring mvs, then, generate the STMVP for this sub PU with function:generateMvField
)
- get extend temporal and spatial merge candidates with the function: