📄 omxacmp3_requantizesfb_s32_i.c
字号:
/*** * 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 + -