diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 121ab4b34f6d0d9316e876b7f09be8853e9f6ddc..300c5a575dfed5dc06ee395766c3c1668fb38354 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -2048,6 +2048,7 @@ void CABACWriter::merge_idx( const PredictionUnit& pu ) { numCandminus1 = int(pu.cs->sps->getMaxNumMergeCand()) - 1; } + CHECK(pu.mergeIdx > numCandminus1, "mergeIdx out of range"); if (numCandminus1 > 0) { if (pu.mergeIdx == 0) @@ -2078,10 +2079,11 @@ void CABACWriter::mmvd_merge_idx(const PredictionUnit& pu) const int mvdStep = pu.mmvdMergeIdx.pos.step; const int mvdPosition = pu.mmvdMergeIdx.pos.position; + CHECK(mvdBaseIdx >= std::min<int>(pu.cs->sps->getMaxNumMergeCand(), MmvdIdx::BASE_MV_NUM), "MMVD base index out of range"); + if (pu.cs->sps->getMaxNumMergeCand() > 1) { static_assert(MmvdIdx::BASE_MV_NUM == 2, ""); - assert(mvdBaseIdx < 2); m_binEncoder.encodeBin(mvdBaseIdx, Ctx::MmvdMergeIdx()); } DTRACE(g_trace_ctx, D_SYNTAX, "base_mvp_idx() base_mvp_idx=%d\n", mvdBaseIdx); diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 2ef16d85d28fcf160ecab5a4030d6fcb59e5d302..fbb52e6fa3ee000fa8344b8443b46544b68fd66d 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -3015,12 +3015,11 @@ void EncCu::addMmvdCandsToPruningList(const MergeCtx& mergeCtx, const UnitArea& { pu->cu->mmvdSkip = true; pu->regularMergeFlag = true; - const int tempNum = (mergeCtx.numValidMergeCand > 1) ? MmvdIdx::ADD_NUM : MmvdIdx::ADD_NUM >> 1; - for (int mmvdMergeCand = 0; mmvdMergeCand < tempNum; mmvdMergeCand++) + for (int mmvdMergeCand = 0; mmvdMergeCand < MmvdIdx::ADD_NUM; mmvdMergeCand++) { MmvdIdx mmvdIdx; mmvdIdx.val = mmvdMergeCand; - if (mmvdIdx.pos.step >= m_pcEncCfg->getMmvdDisNum()) + if (mmvdIdx.pos.step >= m_pcEncCfg->getMmvdDisNum() || mmvdIdx.pos.baseIdx >= mergeCtx.numValidMergeCand) { continue; }