📄 aac_dec_api_int.c
字号:
/*
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright(c) 2003-2007 Intel Corporation. All Rights Reserved.
//
// Intel(R) Integrated Performance Primitives AAC Decode Sample for Windows*
//
// By downloading and installing this sample, you hereby agree that the
// accompanying Materials are being provided to you under the terms and
// conditions of the End User License Agreement for the Intel(R) Integrated
// Performance Primitives product previously accepted by you. Please refer
// to the file ippEULA.rtf or ippEULA.txt located in the root directory of your Intel(R) IPP
// product installation for more information.
//
// MPEG-4 and AAC are international standards promoted by ISO, IEC, ITU, ETSI
// and other organizations. Implementations of these standards, or the standard
// enabled platforms may require licenses from various entities, including
// Intel Corporation.
//
*/
#include <stdlib.h>
#include "aac_dec_int.h"
#include "aac_dec_decoding_int.h"
#include "aac_dec_own_int.h"
#include "aac_dec_huff_tables_int.h"
#include "sbr_huff_tabs.h"
#include "sbr_dec_api_int.h"
#include "sbr_dec_tabs_int.h"
/********************************************************************/
AACStatus aacidecReset(AACDec *state)
{
Ipp32s i;
if (!state)
return AAC_NULL_PTR;
state->com.decodedBytes = 0;
state->com.m_frame_number = 0;
state->com.m_index_1st = 0;
state->com.m_index_2nd = 1;
state->com.m_index_3rd = 2;
state->com.noiseState = 0;
state->com.SbrFlagPresent = 0;
/* set default params: (HQ, DWNSMPL_ON, SBR_ENABLE) */
//------------------------------------------------------------
if( HEAAC_PARAMS_UNDEF == state->com.ModeDecodeHEAACprofile){
state->com.ModeDecodeHEAACprofile = HEAAC_HQ_MODE;
}
if ( HEAAC_PARAMS_UNDEF == state->com.ModeDwnsmplHEAACprofile ) {
state->com.ModeDwnsmplHEAACprofile = HEAAC_DWNSMPL_ON;
}
if (SBR_UNDEF == state->com.m_flag_SBR_support_lev) {
state->com.m_flag_SBR_support_lev = SBR_ENABLE;
}
//------------------------------------------------------------
for (i = 0; i < CH_MAX + COUPL_CH_MAX; i++) {
ippsZero_16s(state->m_ltp_buf[i][0], 2048);
ippsZero_16s(state->m_ltp_buf[i][1], 2048);
ippsZero_16s(state->m_ltp_buf[i][2], 2048);
ippsZero_32s(state->m_prev_samples[i], 2048);
state->com.m_prev_win_shape[i] = 0;
}
return AAC_OK;
}
/********************************************************************/
AACStatus aacidecGetSize(Ipp32s *pStateSize)
{
Ipp32s i;
/* HE-AAC */
Ipp32s mStateSize;
Ipp32s pSize[12], mSize;
Ipp32s pSbrSize[10], mSbrSize;
Ipp32s mOneFilterSize, mFilterSize;
Ipp32s pOneFilterSize[7];
Ipp32s mSBRDecSize;
/* aligned size of AACDec */
mStateSize = __ALIGNED(sizeof(AACDec));
/* size of huffman_tables */
mSize = 0;
for (i = 0; i < 12; i++) {
if ((aacidec_vlcTypes[i] != 3) && (aacidec_vlcTypes[i] != 4)) {
if(ippsVLCDecodeGetSize_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
&(pSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
mSize += pSize[i];
}
} else {
if(ippsVLCDecodeUTupleGetSize_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
aacidec_vlcTuples[i],
aacidec_vlcShifts[i],
&(pSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
mSize += pSize[i];
}
}
}
/* size of sbrHuffTables */
mSbrSize = 0;
for (i = 0; i < 10; i++) {
if (ippsVLCDecodeGetSize_32s(vlcSbrBooks[i],
vlcSbrTableSizes[i],
vlcSbrSubTablesSizes[i],
vlcSbrNumSubTables[i],
&(pSbrSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSbrSize[i] = __ALIGNED(pSbrSize[i]);
mSbrSize += pSbrSize[i];
}
}
if (sbridecGetFilterSize(pOneFilterSize))
return AAC_ALLOC;
mOneFilterSize = pOneFilterSize[0] + pOneFilterSize[0];
mOneFilterSize += pOneFilterSize[1] + pOneFilterSize[1];
mFilterSize = __ALIGNED(mOneFilterSize * CH_MAX + SBR_MINSIZE_OF_WORK_BUFFER);
sbriDecoderGetSize(&mSBRDecSize);
pStateSize[0] = mStateSize + mSize + mSbrSize +
mFilterSize + mSBRDecSize;
return AAC_OK;
}
/********************************************************************/
AACStatus aacidecInit(AACDec *state)
{
Ipp32s i;
/* HE-AAC */
Ipp32s mStateSize;
Ipp32s pSize[12], mSize;
Ipp32s pSbrSize[10], mSbrSize;
Ipp8u *pMem;
Ipp32s mOneFilterSize, mFilterSize;
Ipp32s pOneFilterSize[2];
sSbrDecFilter* sbr_filter[CH_MAX];
sSBRBlock* sbrBlock[CH_MAX];
if (!state)
return AAC_NULL_PTR;
for (i = 0; i < CH_MAX; i++) {
sbr_filter[i] = &(state->sbr_filter[i]);
sbrBlock[i] = &(state->sbrBlock[i]);
}
/* aligned size of AACDec */
mStateSize = __ALIGNED(sizeof(AACDec));
/* size of huffman_tables */
mSize = 0;
for (i = 0; i < 12; i++) {
if ((aacidec_vlcTypes[i] != 3) && (aacidec_vlcTypes[i] != 4)) {
if(ippsVLCDecodeGetSize_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
&(pSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
mSize += pSize[i];
}
} else {
if(ippsVLCDecodeUTupleGetSize_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
aacidec_vlcTuples[i],
aacidec_vlcShifts[i],
&(pSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
mSize += pSize[i];
}
}
}
/* size of sbrHuffTables */
mSbrSize = 0;
for (i = 0; i < 10; i++) {
if (ippsVLCDecodeGetSize_32s(vlcSbrBooks[i],
vlcSbrTableSizes[i],
vlcSbrSubTablesSizes[i],
vlcSbrNumSubTables[i],
&(pSbrSize[i])) != ippStsOk) {
return AAC_ALLOC;
} else {
pSbrSize[i] = __ALIGNED(pSbrSize[i]);
mSbrSize += pSbrSize[i];
}
}
if (sbridecGetFilterSize(pOneFilterSize))
return AAC_ALLOC;
mOneFilterSize = pOneFilterSize[0] + pOneFilterSize[0];
mOneFilterSize += pOneFilterSize[1] + pOneFilterSize[1];
mFilterSize = __ALIGNED(mOneFilterSize * CH_MAX + SBR_MINSIZE_OF_WORK_BUFFER);
/* important: here HEAAC params must be UNDEF */
state->com.ModeDecodeHEAACprofile = HEAAC_PARAMS_UNDEF;
state->com.ModeDwnsmplHEAACprofile = HEAAC_PARAMS_UNDEF;
state->com.m_flag_SBR_support_lev = SBR_UNDEF;
aacidecReset(state);
state->com.FirstID3Search = 0;
state->com.id3_size = 0;
state->com.m_is_chmap_valid = 0;
state->com.m_is_pce_valid = 0;
state->com.m_sampling_frequency = 0;
state->com.m_sampling_frequency_index = 0;
state->com.m_channel_number = 1;
state->com.m_channel_number_save = 1;
state->com.m_channel_number_all = 0;
state->com.m_element_number = 0;
state->com.m_channel_config = 0;
state->com.m_frame_size = 1024;
state->com.adts_channel_configuration = -1;
state->com.m_audio_object_type = AOT_UNDEF;
for (i = 0; i < 16; i++) {
state->com.huffman_tables[i] = NULL;
}
for (i = 0; i < 10; i++) {
state->com.sbrHuffTables[i] = NULL;
}
state->pWorkBuffer = NULL;
pMem = (Ipp8u *)state + mStateSize;
for (i = 0; i < 12; i++) {
if ((aacidec_vlcTypes[i] != 3) && (aacidec_vlcTypes[i] != 4)) {
state->com.huffman_tables[i] = pMem;
if (ippsVLCDecodeInit_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
state->com.huffman_tables[i]) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
pMem += pSize[i];
}
} else {
state->com.huffman_tables[i] = pMem;
if (ippsVLCDecodeUTupleInit_32s(aacidec_vlcBooks[i],
aacidec_vlcTableSizes[i],
aacidec_vlcSubTablesSizes[i],
aacidec_vlcNumSubTables[i],
aacidec_vlcTuples[i],
aacidec_vlcShifts[i],
state->com.huffman_tables[i]) != ippStsOk) {
return AAC_ALLOC;
} else {
pSize[i] = __ALIGNED(pSize[i]);
pMem += pSize[i];
}
}
}
for (i = 0; i < 10; i++) {
state->com.sbrHuffTables[i] = (IppsVLCDecodeSpec_32s *)pMem;
if(ippsVLCDecodeInit_32s(vlcSbrBooks[i],
vlcSbrTableSizes[i],
vlcSbrSubTablesSizes[i],
vlcSbrNumSubTables[i],
state->com.sbrHuffTables[i]) != ippStsOk) {
return AAC_ALLOC;
} else {
pSbrSize[i] = __ALIGNED(pSbrSize[i]);
pMem += pSbrSize[i];
}
}
(state->com.m_sce).stream.p_huffman_tables = (void **)&(state->com.huffman_tables[0]);
(state->com.m_cpe).streams[0].p_huffman_tables = (void **)&(state->com.huffman_tables[0]);
(state->com.m_cpe).streams[1].p_huffman_tables = (void **)&(state->com.huffman_tables[0]);
(state->com.m_cce).stream.p_huffman_tables = (void **)&(state->com.huffman_tables[0]);
(state->com.m_lfe).stream.p_huffman_tables = (void **)&(state->com.huffman_tables[0]);
(state->com.m_sce).stream.vlcShifts = aacidec_vlcShifts;
(state->com.m_cpe).streams[0].vlcShifts = aacidec_vlcShifts;
(state->com.m_cpe).streams[1].vlcShifts = aacidec_vlcShifts;
(state->com.m_cce).stream.vlcShifts = aacidec_vlcShifts;
(state->com.m_lfe).stream.vlcShifts = aacidec_vlcShifts;
(state->com.m_sce).stream.vlcOffsets = aacidec_vlcOffsets;
(state->com.m_cpe).streams[0].vlcOffsets = aacidec_vlcOffsets;
(state->com.m_cpe).streams[1].vlcOffsets = aacidec_vlcOffsets;
(state->com.m_cce).stream.vlcOffsets = aacidec_vlcOffsets;
(state->com.m_lfe).stream.vlcOffsets = aacidec_vlcOffsets;
(state->com.m_sce).stream.vlcTypes = aacidec_vlcTypes;
(state->com.m_cpe).streams[0].vlcTypes = aacidec_vlcTypes;
(state->com.m_cpe).streams[1].vlcTypes = aacidec_vlcTypes;
(state->com.m_cce).stream.vlcTypes = aacidec_vlcTypes;
(state->com.m_lfe).stream.vlcTypes = aacidec_vlcTypes;
sbridecDrawMemMap(sbr_filter, pMem, pOneFilterSize);
state->pWorkBuffer = pMem + mOneFilterSize * CH_MAX;
if (sbridecInitFilter(state))
return AAC_ALLOC;
pMem += mFilterSize;
sbriInitDecoder(sbrBlock, pMem);
for (i = 0; i < CH_MAX; i++) {
ippsCopy_8u((const Ipp8u *)(state->com.sbrHuffTables),
(Ipp8u *)(state->sbrBlock[i].comState.sbrHuffTables), 10 * sizeof(void *));
}
return AAC_OK;
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -