/* frequency domain inverse DCAC prediction */ Void predDCACDec(CWMImageStrCodec * pSC) { const COLORFORMAT cf = pSC->m_param.cfColorFormat; const Int iChannels = (cf == YUV_420 || cf == YUV_422) ? 1 : (Int) pSC->m_param.cNumChannels; CWMIMBInfo *pMBInfo = &(pSC->MBInfo); size_t mbX = pSC->cColumn;// mbY = pSC->cRow; Int iDCACPredMode = getDCACPredMode(pSC, mbX); Int iDCPredMode = (iDCACPredMode & 0x3); Int iADPredMode = (iDCACPredMode & 0xC); PixelI * pOrg, * pRef; Int ii; for(ii = 0; ii < iChannels; ii ++){ pOrg = pMBInfo->iBlockDC[ii];//[dcBlkIdx + (i >> 4)]; // current DC block /* DC prediction */ if(iDCPredMode == 1){ // predict DC from top pOrg[0] += pSC->PredInfoPrevRow[ii][mbX].iDC; } else if(iDCPredMode == 0){ // predict DC from left pOrg[0] += (pSC->PredInfo[ii] + mbX - 1)->iDC; } else if(iDCPredMode == 2){// predict DC from top&left pOrg[0] += ((pSC->PredInfo[ii] + mbX - 1)->iDC + (pSC->PredInfoPrevRow[ii] + mbX)->iDC) >> 1; } /* AD prediction */ if(iADPredMode == 4){// predict AD from top pRef = (pSC->PredInfoPrevRow[ii] + mbX)->piAD; pOrg[4] += pRef[3], pOrg[8] += pRef[4], pOrg[12] += pRef[5]; } else if(iADPredMode == 0){// predict AD from left pRef = (pSC->PredInfo[ii] + mbX - 1)->piAD; pOrg[1] += pRef[0], pOrg[2] += pRef[1], pOrg[3] += pRef[2]; } }
/* frequency domain prediction */ Void predMacroblockEnc(CWMImageStrCodec * pSC) { const COLORFORMAT cf = pSC->m_param.cfColorFormat; const Int iChannels = (cf == YUV_420 || cf == YUV_422) ? 1 : (Int) pSC->m_param.cNumChannels; size_t mbX = pSC->cColumn - 1, mbY = pSC->cRow - 1; CWMIMBInfo *pMBInfo = &(pSC->MBInfo); Int iDCACPredMode = getDCACPredMode(pSC, mbX); Int iDCPredMode = (iDCACPredMode & 0x3); Int iADPredMode = (iDCACPredMode & 0xC); Int iACPredMode = getACPredMode(pMBInfo, cf); PixelI * pOrg, * pRef; Int i, j, k; pMBInfo->iOrientation = 2 - iACPredMode; /* keep necessary info for future prediction */ updatePredInfo(pSC, pMBInfo, mbX, cf); for(i = 0; i < iChannels; i ++){ pOrg = pMBInfo->iBlockDC[i]; // current DC block /* DC prediction */ if(iDCPredMode == 1){ // predict DC from top pOrg[0] -= (pSC->PredInfoPrevRow[i] + mbX)->iDC; } else if(iDCPredMode == 0){ // predict DC from left pOrg[0] -= (pSC->PredInfo[i] + mbX - 1)->iDC; } else if(iDCPredMode == 2){// predict DC from top&left pOrg[0] -= ((pSC->PredInfo[i] + mbX - 1)->iDC + (pSC->PredInfoPrevRow[i] + mbX)->iDC) >> 1; } /* AD prediction */ if(iADPredMode == 4){// predict AD from top pRef = (pSC->PredInfoPrevRow[i] + mbX)->piAD; pOrg[4] -= pRef[3], pOrg[8] -= pRef[4], pOrg[12] -= pRef[5]; } else if(iADPredMode == 0){// predict AD from left pRef = (pSC->PredInfo[i] + mbX - 1)->piAD; pOrg[1] -= pRef[0], pOrg[2] -= pRef[1], pOrg[3] -= pRef[2]; } pOrg = pSC->pPlane[i]; /* AC prediction */ if(iACPredMode == 1){ // predict from top for(k = 0; k <= 192; k += 64){ /* inside macroblock, in reverse order */ for(j = 48; j > 0; j -= 16){ pOrg[k + j + 10] -= pOrg[k + j + 10 - 16]; pOrg[k + j + 2] -= pOrg[k + j + 2 - 16]; pOrg[k + j + 9] -= pOrg[k + j + 9 - 16]; } } } else if(iACPredMode == 0){ // predict from left for(k = 0; k < 64; k += 16){ /* inside macroblock, in reverse order */ for(j = 192; j > 0; j -= 64){ pOrg[k + j + 5] -= pOrg[k + j + 5 - 64]; pOrg[k + j + 1] -= pOrg[k + j + 1 - 64]; pOrg[k + j + 6] -= pOrg[k + j + 6 - 64]; } } } }