⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 armvcm4p2_acdcpredict.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  armVCM4P2_ACDCPredict.c * OpenMAX DL: v1.0.2 * Revision:   10586 * Date:       Wednesday, March 5, 2008 *  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. *  *  *  * Description: * Contains module for DC/AC coefficient prediction * */  #include "omxtypes.h"#include "armOMX.h"#include "armVC.h"#include "armCOMM.h"/** * Function: armVCM4P2_ACDCPredict * * Description: * Performs adaptive DC/AC coefficient prediction for an intra block. Prior * to the function call, prediction direction (predDir) should be selected * as specified in subclause 7.4.3.1 of ISO/IEC 14496-2. * * Remarks: * * Parameters: * [in] pSrcDst     pointer to the coefficient buffer which contains *                          the quantized coefficient residuals (PQF) of the *                          current block * [in] pPredBufRow pointer to the coefficient row buffer * [in] pPredBufCol pointer to the coefficient column buffer * [in] curQP       quantization parameter of the current block. curQP *                          may equal to predQP especially when the current *                          block and the predictor block are in the same *                          macroblock. * [in] predQP      quantization parameter of the predictor block * [in] predDir     indicates the prediction direction which takes one *                          of the following values: *                          OMX_VC_HORIZONTAL    predict horizontally *                          OMX_VC_VERTICAL      predict vertically * [in] ACPredFlag  a flag indicating if AC prediction should be *                          performed. It is equal to ac_pred_flag in the bit *                          stream syntax of MPEG-4 * [in] videoComp   video component type (luminance, chrominance or *                          alpha) of the current block * [in] flag        This flag defines the if one wants to use this functions to *                  calculate PQF (set 1, prediction) or QF (set 0, reconstruction) * [out]    pPreACPredict   pointer to the predicted coefficients buffer. *                          Filled ONLY if it is not NULL * [out]    pSrcDst     pointer to the coefficient buffer which contains *                          the quantized coefficients (QF) of the current *                          block * [out]    pPredBufRow pointer to the updated coefficient row buffer * [out]    pPredBufCol pointer to the updated coefficient column buffer * [out]    pSumErr     pointer to the updated sum of the difference *                      between predicted and unpredicted coefficients *                      If this is NULL, do not update * * Return Value: * Standard OMXResult result. See enumeration for possible result codes. * */OMXResult armVCM4P2_ACDCPredict(     OMX_S16 * pSrcDst,     OMX_S16 * pPreACPredict,     OMX_S16 * pPredBufRow,     OMX_S16 * pPredBufCol,     OMX_INT curQP,     OMX_INT predQP,     OMX_INT predDir,     OMX_INT ACPredFlag,     OMXVCM4P2VideoComponent videoComp,     OMX_U8 flag,     OMX_INT *pSumErr){    OMX_INT dcScaler, i;    OMX_S16 tempPred;    /* Argument error checks */    armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pPredBufRow == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pPredBufCol == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(curQP <= 0, OMX_Sts_BadArgErr);    armRetArgErrIf(predQP <= 0, OMX_Sts_BadArgErr);    armRetArgErrIf((predDir != 1) && (predDir != 2), OMX_Sts_BadArgErr);    armRetArgErrIf(!armIs4ByteAligned(pSrcDst), OMX_Sts_BadArgErr);    armRetArgErrIf(!armIs4ByteAligned(pPredBufRow), OMX_Sts_BadArgErr);    armRetArgErrIf(!armIs4ByteAligned(pPredBufCol), OMX_Sts_BadArgErr);        /* Set DC scaler value to avoid some compilers giving a warning. */    dcScaler=0;        /* Calculate the DC scaler value */    if (videoComp == OMX_VC_LUMINANCE)    {        if (curQP >= 1 && curQP <= 4)        {            dcScaler = 8;        }        else if (curQP >= 5 && curQP <= 8)        {            dcScaler = 2 * curQP;        }        else if (curQP >= 9 && curQP <= 24)        {            dcScaler = curQP + 8;        }        else        {            dcScaler = (2 * curQP) - 16;        }    }    else if (videoComp == OMX_VC_CHROMINANCE)    {        if (curQP >= 1 && curQP <= 4)        {            dcScaler = 8;        }        else if (curQP >= 5 && curQP <= 24)        {            dcScaler = (curQP + 13)/2;        }        else        {            dcScaler = curQP - 6;        }    }    if (pPreACPredict != NULL)    {        pPreACPredict[0] = predDir;    }    if (predDir == OMX_VC_VERTICAL)    {        /* F[0][0]//dc_scaler */        tempPred = armIntDivAwayFromZero(pPredBufRow[0], dcScaler);    }    else    {        /* F[0][0]//dc_scaler */        tempPred = armIntDivAwayFromZero(pPredBufCol[0], dcScaler);    }    /* Updating the DC value to the row and col buffer */    *(pPredBufRow - 8) = *pPredBufCol;    if (flag)    {        /* Cal and store F[0][0] into the col buffer */        *pPredBufCol = pSrcDst[0] * dcScaler;        /* PQF = QF - F[0][0]//dc_scaler */        pSrcDst[0] -= tempPred;    }    else    {        /* QF = PQF + F[0][0]//dc_scaler */        pSrcDst[0] += tempPred;                /* Saturate */        pSrcDst[0] = armClip (-2048, 2047, pSrcDst[0]);        /* Cal and store F[0][0] into the col buffer */        *pPredBufCol = pSrcDst[0] * dcScaler;    }    if (ACPredFlag == 1)    {        if (predDir == OMX_VC_VERTICAL)        {            for (i = 1; i < 8; i++)            {                tempPred = armIntDivAwayFromZero \                              (pPredBufRow[i] * predQP, curQP);                if (flag)                {                    /* Updating QF to the row buff */                    pPredBufRow[i] = pSrcDst[i];                    /*PQFX[v][0] = QFX[v][0] - (QFA[v][0] * QPA) // QPX */                    pSrcDst[i] -= tempPred;                    /* Sum of absolute values of AC prediction error, this can                    be used as a reference to choose whether to use                    AC prediction */                    *pSumErr += armAbs(pSrcDst[i]);                    /* pPreACPredict[1~7] store the error signal                    after AC prediction */                    pPreACPredict[i] = pSrcDst[i];                }                else                {                    /*QFX[v][0] = PQFX[v][0] + (QFA[v][0] * QPA) // QPX */                    pSrcDst[i] += tempPred;                                        /* Saturate */                    pSrcDst[i] = armClip (-2048, 2047, pSrcDst[i]);                                        /* Updating QF to the row buff */                    pPredBufRow[i] = pSrcDst[i];                }            }        }        else        {            for (i = 8; i < 64; i += 8)            {                tempPred = armIntDivAwayFromZero \                              (pPredBufCol[i>>3] * predQP, curQP);                if (flag)                {                    /* Updating QF to col buff */                    pPredBufCol[i>>3] = pSrcDst[i];                    /*PQFX[0][u] = QFX[0][u] - (QFA[0][u] * QPA) // QPX */                    pSrcDst[i] -= tempPred;                    /* Sum of absolute values of AC prediction error, this can                    be used as a reference to choose whether to use AC                    prediction */                    *pSumErr += armAbs(pSrcDst[i]);                    /* pPreACPredict[1~7] store the error signal                    after AC prediction */                    pPreACPredict[i>>3] = pSrcDst[i];                }                else                {                    /*QFX[0][u] = PQFX[0][u] + (QFA[0][u] * QPA) // QPX */                    pSrcDst[i] += tempPred;                                        /* Saturate */                    pSrcDst[i] = armClip (-2048, 2047, pSrcDst[i]);                                        /* Updating QF to col buff */                    pPredBufCol[i>>3] = pSrcDst[i];                }            }        }    }    return OMX_Sts_NoErr;}/*End of File*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -