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

📄 omxacmp3_requantizesfb_s32_i.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
📖 第 1 页 / 共 3 页
字号:
/*** * File Name:  omxACMP3_ReQuantizeSfb_S32_I.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 is used to Requantizes the decoded Huffman symbols*/#include <math.h>#include "omxtypes.h"#include "armOMX.h"#include "omxAC.h"#include "armCOMM.h"#include "armCOMM_Bitstream.h"#include "armAC.h"#include "armACMP3_CommonTables.h"/*** Function: armACMP3_Requant*/static OMXResult armACMP3_Requant (                                       OMX_S32 *pSrc,                                       OMX_F64 *pDst,                                       OMX_S8  *pScaleFactor,                                       OMX_INT *pNonZeroBound,                                           OMX_INT samplingFreq,                                        OMX_INT id,                                        OMX_INT globGain,                                        OMX_INT sfScale,                                        OMX_INT preFlag,                                        OMX_INT *pSubBlkGain,                                       OMX_INT winSwitch,                                        OMX_INT blockType,                                        OMX_INT mixedBlock,                                       OMXMP3ScaleFactorBandTableLong pSfbTableLong,                                       OMXMP3ScaleFactorBandTableShort pSfbTableShort){    OMX_F64     gain, short_gain[3];    OMX_F64     scale;    OMX_F64     sfmultiplier;    OMX_S32     Offset, i, j, sign;    OMX_S32     sfb, width, sflimit;    OMX_F64     mag;    OMX_U32     win;    OMX_S32     scalFactor;    OMX_S32     sfbLimit;    gain = (globGain - 210);    sfmultiplier = sfScale ? 1.0 : 0.5;    i = 0;    sfb = 0;    if (winSwitch == 1 && blockType == 2)    {                /* Mixed Block */        if (mixedBlock == 1)        {            /* Long Block */            Offset = (samplingFreq + 3 * id) * ARM_MP3_LONG_SFB_TABLE_SZ;            /* change sfbLimit on id*/            if(id !=0)            {                sfbLimit = 8;            }            else            {                sfbLimit = 6;            }            while ((sfb < sfbLimit) && (i < *pNonZeroBound))            {                scalFactor = *pScaleFactor++;                if(scalFactor < 0)                    scalFactor = -scalFactor;                scale = pow (2.0, (0.25 * gain) - (sfmultiplier *                     (preFlag * armACMP3_Pretab [sfb] + scalFactor)));                sflimit = pSfbTableLong [Offset + ++sfb];                for (; (i < sflimit) && (i < *pNonZeroBound); i++)                {                    /* get sign and abs magnitude */                    sign = (pSrc[i] < 0) ? 1 : 0;                    mag = (OMX_F64) (sign ? -pSrc[i] : pSrc[i]);                    pDst[i] = pow (mag, (4.0/3.0)) * scale;                    pDst[i] = sign ? -pDst[i] : pDst[i];                }            }            /* Reset sfb for Short Blocks */            sfb = 3;        }        /* Short block */        short_gain [0] = (gain - 8 * pSubBlkGain[0]) * 0.25;        short_gain [1] = (gain - 8 * pSubBlkGain[1]) * 0.25;        short_gain [2] = (gain - 8 * pSubBlkGain[2]) * 0.25;        Offset = (samplingFreq + 3 * id) * ARM_MP3_SHORT_SFB_TABLE_SZ;        while ((sfb < 13) && (i < *pNonZeroBound))        {            sflimit = pSfbTableShort [Offset + sfb + 1];            width = sflimit - pSfbTableShort [Offset + sfb];            sfb++;            for (win = 0; win < 3; win++)            {                scalFactor = *pScaleFactor++;                if(scalFactor < 0)                    scalFactor = -scalFactor;                scale = pow (2.0, short_gain [win] -                     sfmultiplier * scalFactor);                for (j = 0; (j < width) && (i < *pNonZeroBound); j++, i++)                {                    /* get sign and abs magnitude */                    sign = (pSrc[i] < 0) ? 1 : 0;                    mag = (OMX_F64) (sign ? -pSrc[i] : pSrc[i]);                    pDst[i] = pow (mag, (4.0/3.0)) * scale;                    pDst[i] = sign ? -pDst[i] : pDst[i];                }            }        }  /* Short block */    }    else    {        /* Long Block */        Offset = (samplingFreq + 3 * id) * ARM_MP3_LONG_SFB_TABLE_SZ;        while ((sfb < 23) && (i < *pNonZeroBound))        {            scalFactor = pScaleFactor [sfb];            if(scalFactor < 0)                scalFactor = -scalFactor;            scale = pow (2.0, (0.25 * gain) - (sfmultiplier *                 (preFlag * armACMP3_Pretab [sfb] + scalFactor)));            sflimit = pSfbTableLong [Offset + (++sfb)];            for (; (i < sflimit) && (i < *pNonZeroBound); i++)            {                /* get sign and abs magnitude */                sign = (pSrc[i] < 0) ? 1 : 0;                mag = (OMX_F64) (sign ? - pSrc[i] : pSrc[i]);                pDst[i] = pow (mag, (4.0/3.0)) * scale;                pDst[i] = sign ? -pDst[i] : pDst[i];            }        }    }    /* Fill remaining values pSrc the output buffer */    for (i = *pNonZeroBound; i < OMX_MP3_GRANULE_LEN; i++)    {        pDst[i] = 0.0;    }    return OMX_Sts_NoErr;}/* * Function: armACMP3_Stereoprocessing */static OMXResult armACMP3_Stereoprocessing (    OMX_F64 pSrc[][OMX_MP3_GRANULE_LEN],    OMX_F64 pDst[][OMX_MP3_GRANULE_LEN],    OMX_S8  *pScaleFactor,    OMX_INT *pNonZeroBound,    OMX_INT mode,     OMX_INT modeExt,     OMX_INT samplingFreq,     OMX_INT id,     OMX_INT winSwitch,     OMX_INT blockType,     OMX_INT mixedBlock,    OMX_INT sfCompress,    OMXMP3ScaleFactorBandTableLong pSfbTableLong,    OMXMP3ScaleFactorBandTableShort pSfbTableShort){    OMX_U32     IStereoFlag, MSStereoFlag;    OMX_S32     is_pos [OMX_MP3_GRANULE_LEN];    OMX_S8      *pRScaleFactor;    OMX_S32     Soff, Loff, sfBound, sfmax;    OMX_S32     frlimit, fr;    OMX_S32     i;    OMX_S32     sp, sfb, width;    OMX_F64     is_ratio;    OMX_U32     win;    OMX_S32     scalFactor;    OMX_S32     sfbLimit;    /* Initialise is_ratio (this prevents a compiler warning about variable used before initialisation. */    is_ratio=0.0;    /* set flags */    IStereoFlag = (mode == ARM_MP3_JOINT_STEREO_MODE) &&        (modeExt & 1);    MSStereoFlag = (mode == ARM_MP3_JOINT_STEREO_MODE) &&        (modeExt & 2);    if (pNonZeroBound [0] == 0 && pNonZeroBound [1] == 0)    {        return OMX_Sts_NoErr;            }    /* Initialize is_pos array */    for (i = 0; i < OMX_MP3_GRANULE_LEN; i ++)    {        is_pos [i] = -7;    }    if (mode != 3 && IStereoFlag)    {        pRScaleFactor = &pScaleFactor [OMX_MP3_SF_BUF_LEN];        if (winSwitch == 1 && blockType == 2)        {            /* Short or Mixed Block */            if (mixedBlock == 0)            {                /* Short Block */                Soff = (samplingFreq +                     3 * id) * ARM_MP3_SHORT_SFB_TABLE_SZ;                for (win = 0; win < 3; win++)                {                    for (sfb = 12, sfBound = 0; sfb >= 0; sfb--)                    {                        sp = pSfbTableShort [Soff + sfb];                        width =                             pSfbTableShort [Soff + sfb + 1] - sp;                        i = 3 * sp + (win + 1) * width - 1;                        for (fr = 0; fr < width; fr++, i--)                        {                            if (pSrc [1][i] != 0.0)                            {                                /* Got Last Non Zero value */                                sfBound = sfb + 1;                                sfb = -1;                                fr = width;                            }                        }                    }                    /* Fill remaining sfb with intensity pos */                    for (sfb = sfBound; sfb < 12; sfb++)                    {                        sp = pSfbTableShort [Soff + sfb];                        width =                             pSfbTableShort [Soff + sfb + 1] - sp;                        i = 3 * sp + win * width;                        for (fr = 0; fr < width; fr++)                        {                            scalFactor = pRScaleFactor[sfb * 3 + win];                            if(scalFactor >= 0)                            {                                                    is_pos [i + fr] = scalFactor;                            }                            if(id == 1 && scalFactor == 7)                            {                                is_pos [i + fr] = -scalFactor; /* Saving negative value indicationg illegal is_pos */                            }                            /* if MPEG1, intensity position is > 7 return error */                                armRetArgErrIf(id == 1 && is_pos [i + fr] > 7, OMX_Sts_BadArgErr)                        }                    }                    frlimit = pSfbTableShort [Soff + 13] -                         pSfbTableShort [Soff + 12];                    i = 3 * pSfbTableShort [Soff + 12] + win * frlimit;                    width = pSfbTableShort [Soff + 12] -                         pSfbTableShort [Soff + 11];                    sp = 3 * pSfbTableShort [Soff + 11] + width * win;                    for (fr = 0; fr < frlimit; fr++)                    {                        is_pos [i + fr] =                             is_pos [sp];                    }                } /* for window */            }            else            {                /* Mixed Block */                Soff = (samplingFreq +                     3 * id) * ARM_MP3_SHORT_SFB_TABLE_SZ;                Loff = (samplingFreq +                     3 * id) * ARM_MP3_LONG_SFB_TABLE_SZ;                sfmax = 0;                for (win = 0; win < 3; win++)                {                    for (sfb = 12,sfBound = 3; sfb > 2; sfb--)                    {                        sp = pSfbTableShort [Soff + sfb];                        width =                             pSfbTableShort [Soff + sfb + 1] - sp;                        i = 3 * sp + (win + 1) * width - 1;                        for (fr = 0; fr < width; fr++, i--)                        {                            if (pSrc [1][i] != 0.0)                            {                                /* Got Last Non Zero value */                                sfBound = sfb + 1;                                sfb = -1;                                fr = width;                            }                        }                    }

⌨️ 快捷键说明

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