📄 decoder.c
字号:
/*** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com**** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.**** Any non-GPL usage of this software or parts of this software is strictly** forbidden.**** Commercial non-GPL licensing of this software is possible.** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.**** $Id: decoder.c,v 1.1 2006/02/23 14:38:10 kevin-fu Exp $**/#include "common.h"#include "structs.h"#include <stdlib.h>#include <string.h>#include "decoder.h"#include "mp4.h"#include "syntax.h"#include "error.h"#include "output.h"#include "filtbank.h"#include "drc.h"#ifdef SBR_DEC#include "sbr_dec.h"#include "sbr_syntax.h"#endif#ifdef SSR_DEC#include "ssr.h"#endif#ifdef ANALYSISuint16_t dbg_count;#endifint8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode){ if (errcode >= NUM_ERROR_MESSAGES) return NULL; return err_msg[errcode];}uint32_t FAADAPI faacDecGetCapabilities(void){ uint32_t cap = 0; /* can't do without it */ cap += LC_DEC_CAP;#ifdef MAIN_DEC cap += MAIN_DEC_CAP;#endif#ifdef LTP_DEC cap += LTP_DEC_CAP;#endif#ifdef LD_DEC cap += LD_DEC_CAP;#endif#ifdef ERROR_RESILIENCE cap += ERROR_RESILIENCE_CAP;#endif#ifdef FIXED_POINT cap += FIXED_POINT_CAP;#endif return cap;}faacDecHandle FAADAPI faacDecOpen(void){ uint8_t i; faacDecHandle hDecoder = NULL; if ((hDecoder = (faacDecHandle)faad_malloc(sizeof(faacDecStruct))) == NULL) return NULL; memset(hDecoder, 0, sizeof(faacDecStruct)); hDecoder->config.outputFormat = FAAD_FMT_16BIT; hDecoder->config.defObjectType = MAIN; hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ hDecoder->config.downMatrix = 0; hDecoder->adts_header_present = 0; hDecoder->adif_header_present = 0;#ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = 0; hDecoder->aacScalefactorDataResilienceFlag = 0; hDecoder->aacSpectralDataResilienceFlag = 0;#endif hDecoder->frameLength = 1024; hDecoder->frame = 0; hDecoder->sample_buffer = NULL; for (i = 0; i < MAX_CHANNELS; i++) { hDecoder->window_shape_prev[i] = 0; hDecoder->time_out[i] = NULL; hDecoder->fb_intermed[i] = NULL;#ifdef SSR_DEC hDecoder->ssr_overlap[i] = NULL; hDecoder->prev_fmd[i] = NULL;#endif#ifdef MAIN_DEC hDecoder->pred_stat[i] = NULL;#endif#ifdef LTP_DEC hDecoder->ltp_lag[i] = 0; hDecoder->lt_pred_stat[i] = NULL;#endif }#ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { hDecoder->sbr[i] = NULL; }#endif hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0));#ifdef USE_SSE if (cpu_has_sse()) { hDecoder->apply_sf_func = apply_scalefactors_sse; } else { hDecoder->apply_sf_func = apply_scalefactors; }#endif return hDecoder;}faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder){ if (hDecoder) { faacDecConfigurationPtr config = &(hDecoder->config); return config; } return NULL;}uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, faacDecConfigurationPtr config){ if (hDecoder && config) { /* check if we can decode this object type */ if (can_decode_ot(config->defObjectType) < 0) return 0; hDecoder->config.defObjectType = config->defObjectType; /* samplerate: anything but 0 should be possible */ if (config->defSampleRate == 0) return 0; hDecoder->config.defSampleRate = config->defSampleRate; /* check output format */ if ((config->outputFormat < 1) || (config->outputFormat > 9)) return 0; hDecoder->config.outputFormat = config->outputFormat; if (config->downMatrix > 1) hDecoder->config.downMatrix = config->downMatrix; /* OK */ return 1; } return 0;}int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, uint32_t buffer_size, uint32_t *samplerate, uint8_t *channels){ uint32_t bits = 0; bitfile ld; adif_header adif; adts_header adts; if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) return -1; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = 1; if (buffer != NULL) { faad_initbits(&ld, buffer, buffer_size); /* Check if an ADIF header is present */ if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') && (buffer[3] == 'F')) { hDecoder->adif_header_present = 1; get_adif_header(&adif, &ld); faad_byte_align(&ld); hDecoder->sf_index = adif.pce[0].sf_index; hDecoder->object_type = adif.pce[0].object_type + 1; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = adif.pce[0].channels; memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); hDecoder->pce_set = 1; bits = bit2byte(faad_get_processed_bits(&ld)); /* Check if an ADTS header is present */ } else if (faad_showbits(&ld, 12) == 0xfff) { hDecoder->adts_header_present = 1; adts.old_format = hDecoder->config.useOldADTSFormat; adts_frame(&adts, &ld); hDecoder->sf_index = adts.sf_index; hDecoder->object_type = adts.profile + 1; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = (adts.channel_configuration > 6) ? 2 : adts.channel_configuration; } if (ld.error) { faad_endbits(&ld); return -1; } faad_endbits(&ld); } hDecoder->channelConfiguration = *channels;#ifdef SBR_DEC /* implicit signalling */ if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { *samplerate *= 2; hDecoder->forceUpSampling = 1; }#endif /* must be done before frameLength is divided by 2 for LD */#ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else#endif hDecoder->fb = filter_bank_init(hDecoder->frameLength);#ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1;#endif if (can_decode_ot(hDecoder->object_type) < 0) return -1; return bits;}/* Init the library using a DecoderSpecificInfo */int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, uint32_t SizeOfDecoderSpecificInfo, uint32_t *samplerate, uint8_t *channels){ int8_t rc; mp4AudioSpecificConfig mp4ASC; if((hDecoder == NULL) || (pBuffer == NULL) || (SizeOfDecoderSpecificInfo < 2) || (samplerate == NULL) || (channels == NULL)) { return -1; } hDecoder->adif_header_present = 0; hDecoder->adts_header_present = 0; /* decode the audio specific config */ rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, &(hDecoder->pce)); /* copy the relevant info to the decoder handle */ *samplerate = mp4ASC.samplingFrequency; if (mp4ASC.channelsConfiguration) { *channels = mp4ASC.channelsConfiguration; } else { *channels = hDecoder->pce.channels; hDecoder->pce_set = 1; } hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex;#ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag;#endif#ifdef SBR_DEC hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; if (hDecoder->config.dontUpSampleImplicitSBR == 0) hDecoder->forceUpSampling = mp4ASC.forceUpSampling; else hDecoder->forceUpSampling = 0; /* AAC core decoder samplerate is 2 times as low */ if (hDecoder->sbr_present_flag == 1 || hDecoder->forceUpSampling == 1) { hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); }#endif if (rc != 0) { return rc; } hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; if (mp4ASC.frameLengthFlag)#ifdef ALLOW_SMALL_FRAMELENGTH hDecoder->frameLength = 960;#else return -1;#endif /* must be done before frameLength is divided by 2 for LD */#ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else#endif hDecoder->fb = filter_bank_init(hDecoder->frameLength);#ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1;#endif return 0;}#ifdef DRMint8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, uint8_t channels){ uint8_t i; if (hDecoder == NULL) return 1; /* error */ /* Special object type defined for DRM */ hDecoder->config.defObjectType = DRM_ER_LC; hDecoder->config.defSampleRate = samplerate;#ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM hDecoder->aacSectionDataResilienceFlag = 1; /* VCB11 */ hDecoder->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ hDecoder->aacSpectralDataResilienceFlag = 1; /* HCR */#endif hDecoder->frameLength = 960; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) hDecoder->channelConfiguration = 2; else hDecoder->channelConfiguration = 1;#ifdef SBR_DEC if (channels == DRMCH_SBR_LC_STEREO) hDecoder->lcstereo_flag = 1; else hDecoder->lcstereo_flag = 0; if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) hDecoder->sbr_present_flag = 0; else hDecoder->sbr_present_flag = 1; /* Reset sbr for new initialization */ sbrDecodeEnd(hDecoder->sbr[0]); hDecoder->sbr[0] = NULL;#endif if (hDecoder->fb) filter_bank_end(hDecoder->fb); hDecoder->fb = NULL; /* Take care of buffers */ if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); hDecoder->sample_buffer = NULL; hDecoder->alloced_channels = 0; for (i = 0; i < MAX_CHANNELS; i++) { hDecoder->window_shape_prev[i] = 0; if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); hDecoder->time_out[i] = NULL; if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); hDecoder->fb_intermed[i] = NULL;#ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); hDecoder->ssr_overlap[i] = NULL; if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); hDecoder->prev_fmd[i] = NULL;#endif#ifdef MAIN_DEC if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); hDecoder->pred_stat[i] = NULL;#endif#ifdef LTP_DEC hDecoder->ltp_lag[i] = 0; if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); hDecoder->lt_pred_stat[i] = NULL;#endif } for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) {#ifdef SBR_DEC if (hDecoder->sbr[i]) sbrDecodeEnd(hDecoder->sbr[i]); hDecoder->sbr_alloced[i] = 0;#endif hDecoder->element_alloced[i] = 0; hDecoder->element_output_channels[i] = 0; } hDecoder->fb = filter_bank_init(hDecoder->frameLength); return 0;}#endifvoid FAADAPI faacDecClose(faacDecHandle hDecoder){ uint8_t i; if (hDecoder == NULL) return;#ifdef PROFILE printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); printf("requant: %I64d cycles\n", hDecoder->requant_cycles); printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); printf("output: %I64d cycles\n", hDecoder->output_cycles);#endif for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]);#ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]);#endif#ifdef MAIN_DEC if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -