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

📄 omxvcm4p10_subandtransformqdqresidual.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  omxVCM4P10_SubAndTransformQDQResidual.c * OpenMAX DL: v1.0.2 * Revision:   10586 * Date:       Wednesday, March 5, 2008 *  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. *  *  * Description: * This function will calculate SAD for 4x4 blocks *  */#include "omxtypes.h"#include "armOMX.h"#include "omxVC.h"#include "armCOMM.h"#include "armVC.h"/** * Function:  omxVCM4P10_SubAndTransformQDQResidual   (6.3.5.8.1) * * Description: * This function subtracts the prediction signal from the original signal to  * produce the difference signal and then performs a 4x4 integer transform and  * quantization. The quantized transformed coefficients are stored as  * pDstQuantCoeff. This function can also output dequantized coefficients or  * unquantized DC coefficients optionally by setting the pointers  * pDstDeQuantCoeff, pDCCoeff.  * * Input Arguments: *    *   pSrcOrg - Pointer to original signal. 4-byte alignment required.  *   pSrcPred - Pointer to prediction signal. 4-byte alignment required.  *   iSrcOrgStep - Step of the original signal buffer; must be a multiple of  *            4.  *   iSrcPredStep - Step of the prediction signal buffer; must be a multiple  *            of 4.  *   pNumCoeff -Number of non-zero coefficients after quantization. If this  *            parameter is not required, it is set to NULL.  *   nThreshSAD - Zero-block early detection threshold. If this parameter is  *            not required, it is set to 0.  *   iQP - Quantization parameter; must be in the range [0,51].  *   bIntra - Indicates whether this is an INTRA block, either 1-INTRA or  *            0-INTER  * * Output Arguments: *    *   pDstQuantCoeff - Pointer to the quantized transformed coefficients.   *            8-byte alignment required.  *   pDstDeQuantCoeff - Pointer to the dequantized transformed coefficients  *            if this parameter is not equal to NULL.  8-byte alignment  *            required.  *   pDCCoeff - Pointer to the unquantized DC coefficient if this parameter  *            is not equal to NULL.  * * Return Value: *     *    OMX_Sts_NoErr - no error  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following  *              conditions are true:  *    -    at least one of the following pointers is NULL:  *            pSrcOrg, pSrcPred, pNumCoeff, pDstQuantCoeff,  *            pDstDeQuantCoeff, pDCCoeff  *    -    pSrcOrg is not aligned on a 4-byte boundary  *    -    pSrcPred is not aligned on a 4-byte boundary  *    -    iSrcOrgStep is not a multiple of 4  *    -    iSrcPredStep is not a multiple of 4  *    -    pDstQuantCoeff or pDstDeQuantCoeff is not aligned on an 8-byte boundary  * */ OMXResult omxVCM4P10_SubAndTransformQDQResidual (	 const OMX_U8*		pSrcOrg,	 const OMX_U8*		pSrcPred,	 OMX_U32		iSrcOrgStep,	 OMX_U32		iSrcPredStep,	 OMX_S16*	    pDstQuantCoeff,	 OMX_S16* 	    pDstDeQuantCoeff,	 OMX_S16*	    pDCCoeff,	 OMX_S8*		pNumCoeff,	 OMX_U32		nThreshSAD,	 OMX_U32		iQP,	 OMX_U8		    bIntra){    OMX_INT     i, j;    OMX_S8      NumCoeff = 0;    OMX_S16     Buf[16], m[16];    OMX_U32     QBits, QPper, QPmod, f;    OMX_S32     Value, MF, ThreshDC;    /* check for argument error */    armRetArgErrIf(pSrcOrg == NULL, OMX_Sts_BadArgErr)	armRetArgErrIf(pDstDeQuantCoeff == NULL, OMX_Sts_BadArgErr)	armRetArgErrIf(pNumCoeff == NULL, OMX_Sts_BadArgErr)	armRetArgErrIf(pDCCoeff == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(armNot4ByteAligned(pSrcOrg), OMX_Sts_BadArgErr)    armRetArgErrIf(pSrcPred == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(armNot4ByteAligned(pSrcPred), OMX_Sts_BadArgErr)    armRetArgErrIf(pDstQuantCoeff == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(armNot8ByteAligned(pDstQuantCoeff), OMX_Sts_BadArgErr)    armRetArgErrIf((pDstDeQuantCoeff != NULL) && 			armNot8ByteAligned(pDstDeQuantCoeff), OMX_Sts_BadArgErr)    armRetArgErrIf((bIntra != 0) && (bIntra != 1), OMX_Sts_BadArgErr)    armRetArgErrIf(iQP > 51, OMX_Sts_BadArgErr)    armRetArgErrIf(iSrcOrgStep == 0, OMX_Sts_BadArgErr)    armRetArgErrIf(iSrcPredStep == 0, OMX_Sts_BadArgErr)    armRetArgErrIf(iSrcOrgStep & 3, OMX_Sts_BadArgErr)    armRetArgErrIf(iSrcPredStep & 3, OMX_Sts_BadArgErr)    /*      * Zero-Block Early detection using nThreshSAD param      */    QPper = iQP / 6;    QPmod = iQP % 6;        QBits = 15 + QPper;        f = (1 << QBits) / (bIntra ? 3 : 6);        /* Do Zero-Block Early detection if enabled */    if (nThreshSAD)    {        ThreshDC = ((1 << QBits) - f) / armVCM4P10_MFMatrix[QPmod][0];        if (nThreshSAD < ThreshDC)        {            /* Set block to zero */            if (pDCCoeff != NULL)            {                *pDCCoeff = 0;            }            for (j = 0; j < 4; j++)            {                for (i = 0; i < 4; i++)                {                    pDstQuantCoeff [4 * j + i] = 0;                    if (pDstDeQuantCoeff != NULL)                    {                        pDstDeQuantCoeff [4 * j + i] = 0;                        }                                    }            }            if (pNumCoeff != NULL)            {                *pNumCoeff = 0;            }            return OMX_Sts_NoErr;        }    }   /* Calculate difference */    for (j = 0; j < 4; j++)    {        for (i = 0; i < 4; i++)        {            Buf [j * 4 + i] =                 pSrcOrg [j * iSrcOrgStep + i] - pSrcPred [j * iSrcPredStep + i];        }    }    /* Residual Transform */    armVCM4P10_FwdTransformResidual4x4 (m, Buf);    if (pDCCoeff != NULL)    {        /* Copy unquantized DC value into pointer */        *pDCCoeff = m[0];    }    /* Quantization */    for (j = 0; j < 4; j++)    {        for (i = 0; i < 4; i++)        {            MF = armVCM4P10_MFMatrix[QPmod][armVCM4P10_PosToVCol4x4[j * 4 + i]];            Value = armAbs(m[j * 4 + i]) * MF + f;            Value >>= QBits;            Value = m[j * 4 + i] < 0 ? -Value : Value;            Buf[4 * j + i] = pDstQuantCoeff [4 * j + i] = (OMX_S16)Value;            if ((pNumCoeff != NULL) && Value)            {                NumCoeff++;            }        }    }    /* Output number of non-zero Coeffs */    if (pNumCoeff != NULL)    {        *pNumCoeff = NumCoeff;    }        /* Residual Inv Transform */    if (pDstDeQuantCoeff != NULL)    {            /* Re Scale */        for (j = 0; j < 4; j++)        {            for (i = 0; i < 4; i++)            {                m [j * 4 + i]  = Buf [j * 4 + i] * (1 << QPper) *                    armVCM4P10_VMatrix[QPmod][armVCM4P10_PosToVCol4x4[j * 4 + i]];            }        }        armVCM4P10_TransformResidual4x4 (pDstDeQuantCoeff, m);            }            return OMX_Sts_NoErr;}/***************************************************************************** *                              END OF FILE *****************************************************************************/

⌨️ 快捷键说明

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