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

📄 aac_dec_api_int.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
//
//                  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 + -