| 122 | } |
| 123 | |
| 124 | void DoAncErrorConSliceCopy (PECInputCtx pECCtx) { |
| 125 | int32_t iMbWidth = (int32_t) pECCtx->iMbWidth; |
| 126 | int32_t iMbHeight = (int32_t) pECCtx->iMbHeight; |
| 127 | PPicture pDstPic = &pECCtx->sAncPic; |
| 128 | PPicture pSrcPic = pECCtx->pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb; |
| 129 | if ((pECCtx->pCtx->pParam->eEcActiveIdc == ERROR_CON_SLICE_COPY) |
| 130 | && (pECCtx->pCtx->pCurDqLayer->sLayerInfo.sNalHeaderExt.bIdrFlag)) |
| 131 | pSrcPic = NULL; |
| 132 | |
| 133 | //uint8_t *pDstData[3], *pSrcData[3]; |
| 134 | bool* pMbCorrectlyDecodedFlag = pECCtx->pMbCorrectlyDecodedFlag; |
| 135 | |
| 136 | //Do slice copy late |
| 137 | int32_t iMbXyIndex, i; |
| 138 | uint8_t* pSrcData, *pDstData; |
| 139 | uint32_t iSrcStride = pECCtx->iLinesize[0]; |
| 140 | uint32_t iDstStride = pECCtx->iLinesize[0]; |
| 141 | for (int32_t iMbY = 0; iMbY < iMbHeight; ++iMbY) { |
| 142 | for (int32_t iMbX = 0; iMbX < iMbWidth; ++iMbX) { |
| 143 | iMbXyIndex = iMbY * iMbWidth + iMbX; |
| 144 | if (!pMbCorrectlyDecodedFlag[iMbXyIndex]) { |
| 145 | if (pSrcPic != NULL) { |
| 146 | //Y component |
| 147 | pDstData = pDstPic->pData[0] + iMbY * 16 * iDstStride + iMbX * 16; |
| 148 | pSrcData = pSrcPic->pData[0] + iMbY * 16 * iSrcStride + iMbX * 16; |
| 149 | for (i = 0; i < 16; ++i) { |
| 150 | memcpy (pDstData, pSrcData, 16); |
| 151 | pDstData += iDstStride; |
| 152 | pSrcData += iSrcStride; |
| 153 | } |
| 154 | //U component |
| 155 | pDstData = pDstPic->pData[1] + iMbY * 8 * iDstStride / 2 + iMbX * 8; |
| 156 | pSrcData = pSrcPic->pData[1] + iMbY * 8 * iSrcStride / 2 + iMbX * 8; |
| 157 | for (i = 0; i < 8; ++i) { |
| 158 | memcpy (pDstData, pSrcData, 8); |
| 159 | pDstData += iDstStride / 2; |
| 160 | pSrcData += iSrcStride / 2; |
| 161 | } |
| 162 | //V component |
| 163 | pDstData = pDstPic->pData[2] + iMbY * 8 * iDstStride / 2 + iMbX * 8; |
| 164 | pSrcData = pSrcPic->pData[2] + iMbY * 8 * iSrcStride / 2 + iMbX * 8; |
| 165 | for (i = 0; i < 8; ++i) { |
| 166 | memcpy (pDstData, pSrcData, 8); |
| 167 | pDstData += iDstStride / 2; |
| 168 | pSrcData += iSrcStride / 2; |
| 169 | } |
| 170 | } else { //pSrcPic == NULL |
| 171 | //Y component |
| 172 | pDstData = pDstPic->pData[0] + iMbY * 16 * iDstStride + iMbX * 16; |
| 173 | for (i = 0; i < 16; ++i) { |
| 174 | memset (pDstData, 128, 16); |
| 175 | pDstData += iDstStride; |
| 176 | } |
| 177 | //U component |
| 178 | pDstData = pDstPic->pData[1] + iMbY * 8 * iDstStride / 2 + iMbX * 8; |
| 179 | for (i = 0; i < 8; ++i) { |
| 180 | memset (pDstData, 128, 8); |
| 181 | pDstData += iDstStride / 2; |