From e11ec1b056303c5f1fc03bfb6dd2dedb297afff4 Mon Sep 17 00:00:00 2001 From: Xiang Li <xlxiangli@tencent.com> Date: Tue, 12 Nov 2019 12:17:14 +0100 Subject: [PATCH] Fix for #664: Mutiple slices/tiles --- source/Lib/CommonLib/LoopFilter.cpp | 12 ++++++++-- source/Lib/CommonLib/SampleAdaptiveOffset.cpp | 1 + source/Lib/CommonLib/Slice.cpp | 4 ++++ source/Lib/EncoderLib/EncCu.cpp | 2 ++ source/Lib/EncoderLib/InterSearch.cpp | 22 +++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/source/Lib/CommonLib/LoopFilter.cpp b/source/Lib/CommonLib/LoopFilter.cpp index a405cf1fc..64966452b 100644 --- a/source/Lib/CommonLib/LoopFilter.cpp +++ b/source/Lib/CommonLib/LoopFilter.cpp @@ -938,11 +938,19 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg // Derive neighboring PU index if (edgeDir == EDGE_VER) { - CHECK( !isAvailableLeft( cu, cuP, !slice.getLFCrossSliceBoundaryFlag(), !pps.getLoopFilterAcrossBricksEnabledFlag() ), "Neighbour not available" ); + if (!isAvailableLeft(cu, cuP, !slice.getLFCrossSliceBoundaryFlag(), !pps.getLoopFilterAcrossBricksEnabledFlag())) + { + m_aapucBS[edgeDir][uiBsAbsIdx] = uiBs = 0; + continue; + } } else // (iDir == EDGE_HOR) { - CHECK( !isAvailableAbove( cu, cuP, !slice.getLFCrossSliceBoundaryFlag(), !pps.getLoopFilterAcrossBricksEnabledFlag() ), "Neighbour not available" ); + if (!isAvailableAbove(cu, cuP, !slice.getLFCrossSliceBoundaryFlag(), !pps.getLoopFilterAcrossBricksEnabledFlag())) + { + m_aapucBS[edgeDir][uiBsAbsIdx] = uiBs = 0; + continue; + } } iQP = (cuP.qp + cuQ.qp + 1) >> 1; diff --git a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp index cacc1ce19..ee5d84fbb 100644 --- a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp +++ b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp @@ -112,6 +112,7 @@ const SAOBlkParam& SAOBlkParam::operator= (const SAOBlkParam& src) SampleAdaptiveOffset::SampleAdaptiveOffset() { + m_numberOfComponents = 0; } diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index f2daa629f..bb6481257 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -95,6 +95,10 @@ Slice::Slice() , m_nextSlice ( false ) , m_sliceBits ( 0 ) , m_bFinalized ( false ) +, m_sliceCurStartBrickIdx ( 0 ) +, m_sliceCurEndBrickIdx ( 0 ) +, m_sliceNumBricks ( 0 ) +, m_sliceIdx ( 0 ) , m_bTestWeightPred ( false ) , m_bTestWeightBiPred ( false ) , m_substreamSizes ( ) diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index db6c33275..414ec2e62 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -992,6 +992,7 @@ void EncCu::xCompressCU( CodingStructure*& tempCS, CodingStructure*& bestCS, Par #endif if (bestCS->cus.size() == 1) // no partition { + CHECK(bestCS->cus[0]->tileIdx != bestCS->picture->brickMap->getBrickIdxRsMap(bestCS->area.lumaPos()), "Wrong tile index!"); if (bestCS->cus[0]->predMode == MODE_PLT) { for (int i = compBegin; i < (compBegin + numComp); i++) @@ -2244,6 +2245,7 @@ void EncCu::xCheckRDCostHashInter( CodingStructure *&tempCS, CodingStructure *&b partitioner.setCUData(cu); cu.slice = tempCS->slice; + cu.tileIdx = tempCS->picture->brickMap->getBrickIdxRsMap(tempCS->area.lumaPos()); cu.skip = false; cu.predMode = MODE_INTER; cu.transQuantBypass = encTestMode.lossless; diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp index 8731e1839..bb6ed55e6 100644 --- a/source/Lib/EncoderLib/InterSearch.cpp +++ b/source/Lib/EncoderLib/InterSearch.cpp @@ -7803,6 +7803,28 @@ bool InterSearch::searchBv(PredictionUnit& pu, int xPos, int yPos, int width, in return false; } + unsigned curTileIdx = pu.cs->picture->brickMap->getBrickIdxRsMap(pu.lumaPos()); + unsigned refTileIdx = pu.cs->picture->brickMap->getBrickIdxRsMap(Position(refLeftX, refTopY)); + if (curTileIdx != refTileIdx) + { + return false; + } + refTileIdx = pu.cs->picture->brickMap->getBrickIdxRsMap(Position(refLeftX, refBottomY)); + if (curTileIdx != refTileIdx) + { + return false; + } + refTileIdx = pu.cs->picture->brickMap->getBrickIdxRsMap(Position(refRightX, refTopY)); + if (curTileIdx != refTileIdx) + { + return false; + } + refTileIdx = pu.cs->picture->brickMap->getBrickIdxRsMap(Position(refRightX, refBottomY)); + if (curTileIdx != refTileIdx) + { + return false; + } + // in the same CTU line int numLeftCTUs = (1 << ((7 - ctuSizeLog2) << 1)) - ((ctuSizeLog2 < 7) ? 1 : 0); if ((refRightX >> ctuSizeLog2 <= xPos >> ctuSizeLog2) && (refLeftX >> ctuSizeLog2 >= (xPos >> ctuSizeLog2) - numLeftCTUs)) -- GitLab