Showing the changes to codec/encoder/core/src/svc_encode_slice.cpp (1 of 4 files). Show all
Unified · Split
| @@ -137,6 +137,44 @@ void WelsSliceHeaderExtInit (sWelsEncCtx* pEncCtx, SDqLayer* pCurLayer, SSlice* · 136 unmodified lines | ||
| 137 | 137 | } |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | + | |
| 141 | +void UpdateMbNeighbor(SDqLayer* pCurDq, SMB* pMb, const int32_t kiMbWidth, uint16_t uiSliceIdc) { | |
| 142 | + uint32_t uiNeighborAvailFlag = 0; | |
| 143 | + const int32_t kiMbXY = pMb->iMbXY; | |
| 144 | + const int32_t kiMbX = pMb->iMbX; | |
| 145 | + const int32_t kiMbY = pMb->iMbY; | |
| 146 | + bool bLeft; | |
| 147 | + bool bTop; | |
| 148 | + bool bLeftTop; | |
| 149 | + bool bRightTop; | |
| 150 | + int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY; | |
| 151 | + | |
| 152 | + pMb->uiSliceIdc = uiSliceIdc; | |
| 153 | + iLeftXY = kiMbXY - 1; | |
| 154 | + iTopXY = kiMbXY - kiMbWidth; | |
| 155 | + iLeftTopXY = iTopXY - 1; | |
| 156 | + iRightTopXY = iTopXY + 1; | |
| 157 | + | |
| 158 | + bLeft = (kiMbX > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftXY)); | |
| 159 | + bTop = (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iTopXY)); | |
| 160 | + bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftTopXY)); | |
| 161 | + bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iRightTopXY)); | |
| 162 | + | |
| 163 | + if (bLeft) { | |
| 164 | + uiNeighborAvailFlag |= LEFT_MB_POS; | |
| 165 | + } | |
| 166 | + if (bTop) { | |
| 167 | + uiNeighborAvailFlag |= TOP_MB_POS; | |
| 168 | + } | |
| 169 | + if (bLeftTop) { | |
| 170 | + uiNeighborAvailFlag |= TOPLEFT_MB_POS; | |
| 171 | + } | |
| 172 | + if (bRightTop) { | |
| 173 | + uiNeighborAvailFlag |= TOPRIGHT_MB_POS; | |
| 174 | + } | |
| 175 | + pMb->uiNeighborAvail = (uint8_t)uiNeighborAvailFlag; | |
| 176 | +} | |
| 177 | + | |
| 140 | 178 | /* count MB types if enabled FRAME_INFO_OUTPUT*/ |
| 141 | 179 | #if defined(MB_TYPES_CHECK) |
| 142 | 180 | void WelsCountMbType (int32_t (*iMbCount)[18], const EWelsSliceType keSt, const SMB* kpMb) { |
| @@ -772,42 +810,7 @@ void UpdateMbNeighbourInfoForNextSlice (SDqLayer* pCurDq, · 629 unmodified lines | ||
| 772 | 810 | SMB* pMb = &pMbList[iIdx]; |
| 773 | 811 | |
| 774 | 812 | do { |
| 775 | − uint32_t uiNeighborAvailFlag = 0; | |
| 776 | − const int32_t kiMbXY = pMb->iMbXY; | |
| 777 | − const int32_t kiMbX = pMb->iMbX; | |
| 778 | − const int32_t kiMbY = pMb->iMbY; | |
| 779 | − bool bLeft; | |
| 780 | − bool bTop; | |
| 781 | − bool bLeftTop; | |
| 782 | − bool bRightTop; | |
| 783 | − int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY; | |
| 784 | − const uint16_t kuiSliceIdc = WelsMbToSliceIdc (pCurDq, kiMbXY); | |
| 785 | − | |
| 786 | − pMb->uiSliceIdc = kuiSliceIdc; | |
| 787 | − iLeftXY = kiMbXY - 1; | |
| 788 | − iTopXY = kiMbXY - kiMbWidth; | |
| 789 | − iLeftTopXY = iTopXY - 1; | |
| 790 | − iRightTopXY = iTopXY + 1; | |
| 791 | − | |
| 792 | − bLeft = (kiMbX > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftXY)); | |
| 793 | − bTop = (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iTopXY)); | |
| 794 | − bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftTopXY)); | |
| 795 | − bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iRightTopXY)); | |
| 796 | − | |
| 797 | − if (bLeft) { | |
| 798 | − uiNeighborAvailFlag |= LEFT_MB_POS; | |
| 799 | − } | |
| 800 | − if (bTop) { | |
| 801 | − uiNeighborAvailFlag |= TOP_MB_POS; | |
| 802 | − } | |
| 803 | − if (bLeftTop) { | |
| 804 | − uiNeighborAvailFlag |= TOPLEFT_MB_POS; | |
| 805 | − } | |
| 806 | − if (bRightTop) { | |
| 807 | − uiNeighborAvailFlag |= TOPRIGHT_MB_POS; | |
| 808 | − } | |
| 809 | − pMb->uiNeighborAvail = (uint8_t)uiNeighborAvailFlag; | |
| 810 | − | |
| 813 | + UpdateMbNeighbor(pCurDq, pMb, kiMbWidth, WelsMbToSliceIdc (pCurDq, pMb->iMbXY)); | |
| 811 | 814 | ++ pMb; |
| 812 | 815 | ++ iIdx; |
| 813 | 816 | } while ((iIdx < kiEndMbNeedUpdate) && |