📄 omxacaac_deinterleavespectrum_s32.c
字号:
/** * * File Name: omxACAAC_DeinterleaveSpectrum_S32.c * OpenMAX DL: v1.0.2 * Revision: 10586 * Date: Wednesday, March 5, 2008 * * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. * * * * Description: * This file contains module for De-Interleaving input data for short blocks for an AAC decoder * */#include "omxtypes.h"#include "armOMX.h"#include "omxAC.h"#include "armACAAC.h"#include "armCOMM.h"#include "armACAAC_Tables.h"/** * Function: omxACAAC_DeinterleaveSpectrum_S32 (3.2.3.5.1) * * Description: * Deinterleaves spectral coefficients for short block. Sets coefficients * above maxSfb equal to zero. * * Reference: [ISO14496-3], sub-clause 4.5.2.3.5 and Figures 4.22-4.24. * * Input Arguments: * * pSrc - pointer to source coefficients buffer. The coefficients are * interleaved by scalefactor window bands in each group. Buffer * length is 1024. pSrc must be 8-byte aligned. * numWinGrp - group number * pWinGrpLen - pointer to the number of windows in each group. Buffer * length is 8 * maxSfb -Max scalefactor bands number for the current block * samplingRateIndex - sampling rate index. Valid in [0, 11] * winLen - the data number in one window * * Output Arguments: * * pDst - pointer to the output of coefficients. Data sequence is ordered * in pDst[w*128+sfb*sfbWidth[sfb]+i]. Where w is window index, sfb * is scalefactor band index, sfbWidth is the scalefactor band * width table, i is the index within scalefactor band. Buffer * length is 1024. The pDst pointer must be aligned on an 8-byte * boundary. * * Return Value: * * OMX_Sts_NoErr - no error * OMX_Sts_BadArgErr - bad arguments * - at least one of the following pointers is NULL: * - pSrc, * - pDst, * - pWinGrpLen. * - either pSrc or pDst are not 8-byte aligned * - numWinGrp exceeds [1, 8] * - maxSfb exceeds [0, 51] * - samplingRateIndex exceeds [0, 11] * - winLen is not 128 * OMX_StsACAAC_MaxSfbErr - invalid maxSfb value in relation to numSwb * */ OMXResult omxACAAC_DeinterleaveSpectrum_S32( const OMX_S32 *pSrc, OMX_S32 *pDst, OMX_INT numWinGrp, const OMX_INT *pWinGrpLen, OMX_INT maxSfb, OMX_INT samplingRateIndex, OMX_INT winLen ){ const OMX_U16 *pOffsetTable; OMX_U16 width,numSwb; OMX_INT groupNum,sfbNum,winNum,coeffNum; OMX_S32 *pDstTemp; /* Argument Check */ armRetArgErrIf( pSrc == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( pDst == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( pWinGrpLen == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( (numWinGrp > 8) || (numWinGrp < 1), OMX_Sts_BadArgErr); armRetArgErrIf( (maxSfb > 51) || (maxSfb < 0) , OMX_Sts_BadArgErr); armRetArgErrIf( samplingRateIndex > 11 , OMX_Sts_BadArgErr); armRetArgErrIf( samplingRateIndex < 0 , OMX_Sts_BadArgErr); armRetArgErrIf( winLen != ARM_AAC_WIN_SHORT, OMX_Sts_BadArgErr); armRetArgErrIf( armNot8ByteAligned(pSrc), OMX_Sts_BadArgErr); armRetArgErrIf( armNot8ByteAligned(pDst), OMX_Sts_BadArgErr); /* Processing */ pOffsetTable = armACAAC_swbOffsetShortWindow[samplingRateIndex]; numSwb = armACAAC_numSwbShort[samplingRateIndex]; armRetArgErrIf( maxSfb > numSwb, OMX_StsACAAC_MaxSfbErr); for( groupNum = 0; groupNum < numWinGrp; groupNum++ ) { for( sfbNum = 0; sfbNum < maxSfb; sfbNum ++ ) { width = pOffsetTable[sfbNum + 1] - pOffsetTable[sfbNum]; pDstTemp = pDst; for( winNum = 0; winNum < pWinGrpLen[groupNum]; winNum++ ) { for( coeffNum = 0; coeffNum < width; coeffNum++ ) { *(pDstTemp + coeffNum) = *pSrc++; } pDstTemp += winLen; } pDst += width; } /*For coefficients above maxSfb*/ for(sfbNum = maxSfb ; sfbNum < numSwb ; sfbNum ++) { width = pOffsetTable[sfbNum + 1] - pOffsetTable[sfbNum]; pDstTemp = pDst; for( winNum = 0; winNum < pWinGrpLen[groupNum]; winNum++ ) { for( coeffNum = 0; coeffNum < width; coeffNum++ ) { pDstTemp[coeffNum] = 0; } pDstTemp += winLen; } pDst += width; } pDst += winLen*(pWinGrpLen[groupNum] - 1); } return OMX_Sts_NoErr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -