📄 aac_enc_filterbank_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) 2004-2005 Intel Corporation. All Rights Reserved.//// Intel Integrated Performance Primitives AAC Encode 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 Integrated// Performance Primitives product previously accepted by you. Please refer// to the file ipplic.htm located in the root directory of your Intel 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 <math.h>#include <stdio.h>#include "aac_enc_filterbank_int.h"#include "ipps.h"#include "ippac.h"#include "aac_enc_wnd_tables_int.h"/****************************************************************************/AACStatus InitFilterbank_enc(sFilterbankBlock* pBlock){ int size, size_short, size_long; ippsZero_8u((Ipp8u*)pBlock, sizeof(sFilterbankBlock)); if (pBlock == NULL) return AAC_ALLOC; size = 0; if (ippsMDCTFwdInitAlloc_16s(&pBlock->p_mdct_fwd_long, N_LONG) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdInitAlloc_16s(&pBlock->p_mdct_fwd_short, N_SHORT) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdGetBufSize_16s(pBlock->p_mdct_fwd_long, &size_long) != ippStsOk) return AAC_ALLOC; if (ippsMDCTFwdGetBufSize_16s(pBlock->p_mdct_fwd_short, &size_short) != ippStsOk) return AAC_ALLOC; if (size < size_long) size = size_long; if (size < size_short) size = size_short; if (size != 0) { pBlock->p_buffer_fwd = ippsMalloc_8u(size); } pBlock->sin_short_wnd_table = SIN_enc_short; pBlock->sin_long_wnd_table = SIN_enc_long; pBlock->KBD_short_wnd_table = KBD_enc_short; pBlock->KBD_long_wnd_table = KBD_enc_long; return AAC_OK;}/****************************************************************************/void FreeFilterbank_enc(sFilterbankBlock* pBlock){ if (pBlock->p_mdct_fwd_long) ippsMDCTFwdFree_16s(pBlock->p_mdct_fwd_long); if (pBlock->p_mdct_fwd_short) ippsMDCTFwdFree_16s(pBlock->p_mdct_fwd_short); if (pBlock->p_buffer_fwd) ippsFree(pBlock->p_buffer_fwd);}/****************************************************************************/void Filterbank_enc(sFilterbankBlock* p_data, Ipp16s* p_in_samples_1st_part, Ipp16s* p_in_samples_2nd_part, int window_sequence, int window_shape, int prev_window_shape, Ipp16s* p_out_spectrum, int* mdct_scaleFactor){ Ipp16s mdct_in[N_LONG]; Ipp16s abs_mdct_in[N_LONG]; Ipp16s *window_table_long, *prev_window_table_long; Ipp16s *window_table_short, *prev_window_table_short; int scaleFactor; int i; if (0 == window_shape) { window_table_long = p_data->sin_long_wnd_table; window_table_short = p_data->sin_short_wnd_table; } else { window_table_long = p_data->KBD_long_wnd_table; window_table_short = p_data->KBD_short_wnd_table; } if (0 == prev_window_shape) { prev_window_table_long = p_data->sin_long_wnd_table; prev_window_table_short = p_data->sin_short_wnd_table; } else { prev_window_table_long = p_data->KBD_long_wnd_table; prev_window_table_short = p_data->KBD_short_wnd_table; } switch(window_sequence) { case ONLY_LONG_SEQUENCE: ippsMul_16s_Sfs(p_in_samples_1st_part, prev_window_table_long, mdct_in, N_LONG/2, 15); ippsMul_16s_Sfs(p_in_samples_2nd_part, &window_table_long[N_LONG/2], &mdct_in[N_LONG/2], N_LONG/2, 15); break; break; case LONG_START_SEQUENCE: ippsMul_16s_Sfs(p_in_samples_1st_part, prev_window_table_long, mdct_in, N_LONG/2, 15); ippsCopy_16s(p_in_samples_2nd_part, &mdct_in[1024], 1472-1024); ippsMul_16s_Sfs(&p_in_samples_2nd_part[1472-1024], &window_table_short[N_SHORT/2], &mdct_in[1472], 1600-1472, 15); ippsZero_8u((Ipp8u *)&mdct_in[1600],sizeof(Ipp16s)*(2048-1600)); break; case LONG_STOP_SEQUENCE: ippsZero_8u((Ipp8u *)mdct_in, sizeof(Ipp16s)*448); ippsMul_16s_Sfs(&p_in_samples_1st_part[448], prev_window_table_short, &mdct_in[448], 576-448, 15); ippsCopy_16s(&p_in_samples_1st_part[576], &mdct_in[576], 1024-576); ippsMul_16s_Sfs(p_in_samples_2nd_part, &window_table_long[N_LONG/2], &mdct_in[N_LONG/2], N_LONG/2, 15); break; case EIGHT_SHORT_SEQUENCE: /// W0 ippsMul_16s_Sfs(&p_in_samples_1st_part[448], prev_window_table_short, &mdct_in[0], N_SHORT/2, 15); ippsMul_16s_Sfs(&p_in_samples_1st_part[448+128], &window_table_short[N_SHORT/2], &mdct_in[N_SHORT/2], N_SHORT/2, 15); /// W1 ippsMul_16s_Sfs(&p_in_samples_1st_part[576], window_table_short, &mdct_in[N_SHORT], N_SHORT, 15); /// W2 ippsMul_16s_Sfs(&p_in_samples_1st_part[704], window_table_short, &mdct_in[2*N_SHORT], N_SHORT, 15); /// W3 ippsMul_16s_Sfs(&p_in_samples_1st_part[832], window_table_short, &mdct_in[3*N_SHORT], (3*N_SHORT)/4, 15); ippsMul_16s_Sfs(p_in_samples_2nd_part, &window_table_short[192], &mdct_in[3*N_SHORT+192], N_SHORT/4, 15); /// W4 ippsMul_16s_Sfs(&p_in_samples_1st_part[960], window_table_short, &mdct_in[4*N_SHORT], N_SHORT/4, 15); ippsMul_16s_Sfs(p_in_samples_2nd_part, &window_table_short[64], &mdct_in[4*N_SHORT+64], (3*N_SHORT)/4, 15); /// W5 ippsMul_16s_Sfs(&p_in_samples_2nd_part[64], window_table_short, &mdct_in[5*N_SHORT], N_SHORT, 15); /// W6 ippsMul_16s_Sfs(&p_in_samples_2nd_part[64+1*128], window_table_short, &mdct_in[6*N_SHORT], N_SHORT, 15); /// W7 ippsMul_16s_Sfs(&p_in_samples_2nd_part[64+2*128], window_table_short, &mdct_in[7*N_SHORT], N_SHORT, 15); break; default: break; } ippsAbs_16s(mdct_in, abs_mdct_in, N_LONG); if (window_sequence != EIGHT_SHORT_SEQUENCE) { Ipp32s sum; ippsSum_16s32s_Sfs(abs_mdct_in, N_LONG, &sum, 0); scaleFactor = 1; if (sum != 0) { if (sum > 32768) { while (sum > 32768) { sum >>= 1; scaleFactor++; } } else { while (sum <= 16384) { sum *= 2; scaleFactor--; } } } ippsMDCTFwd_16s_Sfs(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_long, scaleFactor, p_data->p_buffer_fwd); } else { Ipp32s sum; int tmp_scaleFactor; scaleFactor = -100; for (i = 0; i < 8; i ++) { ippsSum_16s32s_Sfs(abs_mdct_in + N_SHORT*i, N_SHORT, &sum, 0); tmp_scaleFactor = 1; if (sum != 0) { if (sum > 32768) { while (sum > 32768) { sum >>= 1; tmp_scaleFactor++; } } else { while (sum <= 16384) { sum *= 2; tmp_scaleFactor--; } } } if (tmp_scaleFactor > scaleFactor) scaleFactor = tmp_scaleFactor; } for (i = 0; i < 8; i ++) { ippsMDCTFwd_16s_Sfs(&mdct_in[N_SHORT*i], p_out_spectrum+i*(N_SHORT/2), p_data->p_mdct_fwd_short, scaleFactor, p_data->p_buffer_fwd); } } mdct_scaleFactor[0] = scaleFactor;}/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -