OMX_S32 armMedianOf3 ( OMX_S32 fEntry, OMX_S32 sEntry, OMX_S32 tEntry ) { OMX_S32 a, b, c; a = armMin (fEntry, sEntry); b = armMax (fEntry, sEntry); c = armMin (b, tEntry); return (armMax (a, c)); }
OMXResult omxVCM4P2_TransRecBlockCoef_intra( const OMX_U8 *pSrc, OMX_S16 * pDst, OMX_U8 * pRec, OMX_S16 *pPredBufRow, OMX_S16 *pPredBufCol, OMX_S16 * pPreACPredict, OMX_INT *pSumErr, OMX_INT blockIndex, OMX_U8 curQp, const OMX_U8 *pQpBuf, OMX_INT srcStep, OMX_INT dstStep, OMX_INT shortVideoHeader ) { /* 64 elements are needed but to align it to 16 bytes need 8 more elements of padding */ OMX_S16 tempBuf1[79], tempBuf2[79]; OMX_S16 tempBuf3[79]; OMX_S16 *pTempBuf1, *pTempBuf2,*pTempBuf3; OMXVCM4P2VideoComponent videoComp; OMX_U8 flag; OMX_INT x, y, count, predDir; OMX_INT predQP, ACPredFlag; /* Aligning the local buffers */ pTempBuf1 = armAlignTo16Bytes(tempBuf1); pTempBuf2 = armAlignTo16Bytes(tempBuf2); pTempBuf3 = armAlignTo16Bytes(tempBuf3); /* Argument error checks */ armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pRec == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(!armIs8ByteAligned(pSrc), OMX_Sts_BadArgErr); armRetArgErrIf(!armIs8ByteAligned(pRec), OMX_Sts_BadArgErr); armRetArgErrIf(!armIs16ByteAligned(pDst), OMX_Sts_BadArgErr); armRetArgErrIf(pPredBufRow == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pPredBufCol == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pPreACPredict == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pSumErr == NULL, OMX_Sts_BadArgErr); armRetArgErrIf(pQpBuf == NULL, OMX_Sts_BadArgErr); armRetArgErrIf((srcStep <= 0) || (dstStep <= 0) || (dstStep & 7) || (srcStep & 7) , OMX_Sts_BadArgErr); armRetArgErrIf((blockIndex < 0) || (blockIndex > 9), OMX_Sts_BadArgErr); armRetArgErrIf((curQp <= 0) || (curQp >=32), OMX_Sts_BadArgErr); /* Setting the videoComp */ if (blockIndex <= 3) { videoComp = OMX_VC_LUMINANCE; } else { videoComp = OMX_VC_CHROMINANCE; } /* Converting from 2-d to 1-d buffer */ for (y = 0, count = 0; y < 8; y++) { for(x= 0; x < 8; x++, count++) { pTempBuf1[count] = pSrc[(y*srcStep) + x]; } } omxVCM4P2_DCT8x8blk (pTempBuf1, pTempBuf2); omxVCM4P2_QuantIntra_I( pTempBuf2, curQp, blockIndex, shortVideoHeader); /* Converting from 1-D to 2-D buffer */ for (y = 0, count = 0; y < 8; y++) { for(x = 0; x < 8; x++, count++) { /* storing tempbuf2 to tempbuf1 */ pTempBuf1[count] = pTempBuf2[count]; pDst[(y*dstStep) + x] = pTempBuf2[count]; } } /* AC and DC prediction */ armVCM4P2_SetPredDir( blockIndex, pPredBufRow, pPredBufCol, &predDir, &predQP, pQpBuf); armRetDataErrIf(((predQP <= 0) || (predQP >= 32)), OMX_Sts_BadArgErr); flag = 1; if (*pSumErr < 0) { ACPredFlag = 0; } else { ACPredFlag = 1; } armVCM4P2_ACDCPredict( pTempBuf2, pPreACPredict, pPredBufRow, pPredBufCol, curQp, predQP, predDir, ACPredFlag, videoComp, flag, pSumErr); /* Reconstructing the texture data */ omxVCM4P2_QuantInvIntra_I( pTempBuf1, curQp, videoComp, shortVideoHeader); omxVCM4P2_IDCT8x8blk (pTempBuf1, pTempBuf3); for(count = 0; count < 64; count++) { pRec[count] = armMax(0,pTempBuf3[count]); } return OMX_Sts_NoErr; }