/*** FAAD - Freeware Advanced Audio Decoder** Copyright (C) 2002 M. Bakker** ** 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.**** $Id: decoder.c,v 1.51 2003/02/16 18:17:11 menno Exp $**/ #include "common.h"#include "structs.h" #include <stdlib.h>#include <string.h> #include "decoder.h"#include "mp4.h"#include "syntax.h"#include "specrec.h"#include "data.h"#include "tns.h"#include "pns.h"#include "is.h"#include "ms.h"#include "ic_predict.h"#include "lt_predict.h"#include "drc.h"#include "error.h"#include "output.h"#include "dither.h"#ifdef SSR_DEC#include "ssr.h"#include "ssr_fb.h"#endif #ifdef ANALYSISuint16_t dbg_count;#endif int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode){ return err_msg[errcode];} faacDecHandle FAADAPI faacDecOpen(){ uint8_t i; faacDecHandle hDecoder = NULL; if ((hDecoder = (faacDecHandle)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->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;#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 } hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); #if POW_TABLE_SIZE hDecoder->pow2_table = (real_t*)malloc(POW_TABLE_SIZE*sizeof(real_t)); build_tables(hDecoder->pow2_table);#endif return hDecoder;} faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder){ faacDecConfigurationPtr config = &(hDecoder->config); return config;} uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, faacDecConfigurationPtr config){ hDecoder->config.defObjectType = config->defObjectType; hDecoder->config.defSampleRate = config->defSampleRate; hDecoder->config.outputFormat = config->outputFormat; /* OK */ return 1;} 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; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; *samplerate = sample_rates[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.sf_index; hDecoder->object_type = adif.pce.object_type; *samplerate = sample_rates[hDecoder->sf_index]; *channels = adif.pce.channels; 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_frame(&adts, &ld); hDecoder->sf_index = adts.sf_index; hDecoder->object_type = adts.profile; *samplerate = sample_rates[hDecoder->sf_index]; *channels = (adts.channel_configuration > 6) ? 2 : adts.channel_configuration; } if (ld.error) return -1; faad_endbits(&ld); } hDecoder->channelConfiguration = *channels; /* 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; #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5);#endif 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; hDecoder->adif_header_present = 0; hDecoder->adts_header_present = 0; if((hDecoder == NULL) || (pBuffer == NULL) || (SizeOfDecoderSpecificInfo < 2) || (samplerate == NULL) || (channels == NULL)) { return -1; } /* decode the audio specific config */ rc = AudioSpecificConfig(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC); /* copy the relevant info to the decoder handle */ *samplerate = mp4ASC.samplingFrequency; *channels = mp4ASC.channelsConfiguration; hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex; hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; if (hDecoder->object_type < 5) hDecoder->object_type--; /* For AAC differs from MPEG-4 */ if (rc != 0) { return rc; } hDecoder->channelConfiguration = *channels; if (mp4ASC.frameLengthFlag) hDecoder->frameLength = 960; /* 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 #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5);#endif return 0;} int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, uint8_t channels){ /* Special object type defined for DRM */ hDecoder->config.defObjectType = DRM_ER_LC; hDecoder->config.defSampleRate = samplerate; hDecoder->aacSectionDataResilienceFlag = 1; /* VCB11 */ hDecoder->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ hDecoder->aacSpectralDataResilienceFlag = 1; /* HCR */ hDecoder->frameLength = 960; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; hDecoder->channelConfiguration = channels; /* must be done before frameLength is divided by 2 for LD */ hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5);#endif return 0;} void FAADAPI faacDecClose(faacDecHandle hDecoder){ uint8_t i; if (hDecoder == NULL) return; for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->time_out[i]) free(hDecoder->time_out[i]);#ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) free(hDecoder->ssr_overlap[i]); if (hDecoder->prev_fmd[i]) free(hDecoder->prev_fmd[i]);#endif#ifdef MAIN_DEC if (hDecoder->pred_stat[i]) free(hDecoder->pred_stat[i]);#endif#ifdef LTP_DEC if (hDecoder->lt_pred_stat[i]) free(hDecoder->lt_pred_stat[i]);#endif } #ifdef SSR_DEC if (hDecoder->object_type == SSR) ssr_filter_bank_end(hDecoder->fb); else#endif filter_bank_end(hDecoder->fb); drc_end(hDecoder->drc); #ifndef FIXED_POINT#if POW_TABLE_SIZE if (hDecoder->pow2_table) free(hDecoder->pow2_table);#endif#endif if (hDecoder->sample_buffer) free(hDecoder->sample_buffer); if (hDecoder) free(hDecoder);} void* FAADAPI faacDecDecode(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, uint8_t *buffer, uint32_t buffer_size){ int32_t i; uint8_t ch; adts_header adts; uint8_t channels = 0, ch_ele = 0; bitfile *ld = (bitfile*)malloc(sizeof(bitfile)); /* local copys of globals */ uint8_t sf_index = hDecoder->sf_index; uint8_t object_type = hDecoder->object_type; uint8_t channelConfiguration = hDecoder->channelConfiguration;#ifdef MAIN_DEC pred_state **pred_stat = hDecoder->pred_stat;#endif#ifdef LTP_DEC real_t **lt_pred_stat = hDecoder->lt_pred_stat;#endif#ifndef FIXED_POINT#if POW_TABLE_SIZE real_t *pow2_table = hDecoder->pow2_table;#else real_t *pow2_table = NULL;#endif#endif uint8_t *window_shape_prev = hDecoder->window_shape_prev; real_t **time_out = hDecoder->time_out;#ifdef SSR_DEC real_t **ssr_overlap = hDecoder->ssr_overlap; real_t **prev_fmd = hDecoder->prev_fmd;#endif fb_info *fb = hDecoder->fb; drc_info *drc = hDecoder->drc; uint8_t outputFormat = hDecoder->config.outputFormat;#ifdef LTP_DEC uint16_t *ltp_lag = hDecoder->ltp_lag;#endif program_config pce; element *syntax_elements[MAX_SYNTAX_ELEMENTS]; element **elements; int16_t *spec_data[MAX_CHANNELS]; real_t *spec_coef[MAX_CHANNELS]; uint16_t frame_len = hDecoder->frameLength; void *sample_buffer; memset(hInfo, 0, sizeof(faacDecFrameInfo)); /* initialize the bitstream */ faad_initbits(ld, buffer, buffer_size); #ifdef DRM if (object_type == DRM_ER_LC) { faad_getbits(ld, 8 DEBUGVAR(1,1,"faacDecDecode(): skip CRC")); }#endif if (hDecoder->adts_header_present) { if ((hInfo->error = adts_frame(&adts, ld)) > 0) goto error; /* MPEG2 does byte_alignment() here, * but ADTS header is always multiple of 8 bits in MPEG2 * so not needed to actually do it. */ } #ifdef ANALYSIS dbg_count = 0;#endif elements = syntax_elements; /* decode the complete bitstream */ elements = raw_data_block(hDecoder, hInfo, ld, syntax_elements, spec_data, spec_coef, &pce, drc); ch_ele = hDecoder->fr_ch_ele; channels = hDecoder->fr_channels; if (hInfo->error > 0) goto error; /* no more bit reading after this */ hInfo->bytesconsumed = bit2byte(faad_get_processed_bits(ld)); if (ld->error) { hInfo->error = 14; goto error; } faad_endbits(ld); if (ld) free(ld); ld = NULL; /* number of samples in this frame */ hInfo->samples = frame_len*channels; /* number of channels in this frame */ hInfo->channels = channels; /* samplerate */ hInfo->samplerate = sample_rates[hDecoder->sf_index]; /* check if frame has channel elements */ if (channels == 0) { hDecoder->frame++; return NULL; } if (hDecoder->sample_buffer == NULL) hDecoder->sample_buffer = malloc(frame_len*channels*sizeof(real_t)); sample_buffer = hDecoder->sample_buffer; /* noiseless coding is done, the rest of the tools come now */ for (ch = 0; ch < channels; ch++) { ic_stream *ics; /* find the syntax element to which this channel belongs */ for (i = 0; i < ch_ele; i++) { if (syntax_elements[i]->channel == ch) ics = &(syntax_elements[i]->ics1); else if (syntax_elements[i]->paired_channel == ch) ics = &(syntax_elements[i]->ics2); } /* inverse quantization */ inverse_quantization(spec_coef[ch], spec_data[ch], frame_len); /* apply scalefactors */#ifdef FIXED_POINT apply_scalefactors(ics, spec_coef[ch], frame_len);#else apply_scalefactors(ics, spec_coef[ch], pow2_table, frame_len);#endif /* deinterleave short block grouping */ if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) quant_to_spec(ics, spec_coef[ch], frame_len); } /* Because for ms, is and pns both channels spectral coefficients are needed we have to restart running through all channels here. */ for (ch = 0; ch < channels; ch++) { int16_t pch = -1; uint8_t right_channel; ic_stream *ics, *icsr; ltp_info *ltp; /* find the syntax element to which this channel belongs */ for (i = 0; i < ch_ele; i++) {Lines 1–500 of 712. Load more
/* ** FAAD - Freeware Advanced Audio Decoder ** Copyright (C) 2002 M. Bakker ** ** 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. ** ** $Id: decoder.c,v 1.51 2003/02/16 18:17:11 menno Exp $ **/ #include "common.h" #include "structs.h" #include <stdlib.h> #include <string.h> #include "decoder.h" #include "mp4.h" #include "syntax.h" #include "specrec.h" #include "data.h" #include "tns.h" #include "pns.h" #include "is.h" #include "ms.h" #include "ic_predict.h" #include "lt_predict.h" #include "drc.h" #include "error.h" #include "output.h" #include "dither.h" #ifdef SSR_DEC #include "ssr.h" #include "ssr_fb.h" #endif #ifdef ANALYSIS uint16_t dbg_count; #endif int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode) { return err_msg[errcode]; } faacDecHandle FAADAPI faacDecOpen() { uint8_t i; faacDecHandle hDecoder = NULL; if ((hDecoder = (faacDecHandle)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->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; #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 } hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); #if POW_TABLE_SIZE hDecoder->pow2_table = (real_t*)malloc(POW_TABLE_SIZE*sizeof(real_t)); build_tables(hDecoder->pow2_table); #endif return hDecoder; } faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder) { faacDecConfigurationPtr config = &(hDecoder->config); return config; } uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, faacDecConfigurationPtr config) { hDecoder->config.defObjectType = config->defObjectType; hDecoder->config.defSampleRate = config->defSampleRate; hDecoder->config.outputFormat = config->outputFormat; /* OK */ return 1; } 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; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; *samplerate = sample_rates[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.sf_index; hDecoder->object_type = adif.pce.object_type; *samplerate = sample_rates[hDecoder->sf_index]; *channels = adif.pce.channels; 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_frame(&adts, &ld); hDecoder->sf_index = adts.sf_index; hDecoder->object_type = adts.profile; *samplerate = sample_rates[hDecoder->sf_index]; *channels = (adts.channel_configuration > 6) ? 2 : adts.channel_configuration; } if (ld.error) return -1; faad_endbits(&ld); } hDecoder->channelConfiguration = *channels; /* 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; #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5); #endif 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; hDecoder->adif_header_present = 0; hDecoder->adts_header_present = 0; if((hDecoder == NULL) || (pBuffer == NULL) || (SizeOfDecoderSpecificInfo < 2) || (samplerate == NULL) || (channels == NULL)) { return -1; } /* decode the audio specific config */ rc = AudioSpecificConfig(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC); /* copy the relevant info to the decoder handle */ *samplerate = mp4ASC.samplingFrequency; *channels = mp4ASC.channelsConfiguration; hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex; hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; if (hDecoder->object_type < 5) hDecoder->object_type--; /* For AAC differs from MPEG-4 */ if (rc != 0) { return rc; } hDecoder->channelConfiguration = *channels; if (mp4ASC.frameLengthFlag) hDecoder->frameLength = 960; /* 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 #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5); #endif return 0; } int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, uint8_t channels) { /* Special object type defined for DRM */ hDecoder->config.defObjectType = DRM_ER_LC; hDecoder->config.defSampleRate = samplerate; hDecoder->aacSectionDataResilienceFlag = 1; /* VCB11 */ hDecoder->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ hDecoder->aacSpectralDataResilienceFlag = 1; /* HCR */ hDecoder->frameLength = 960; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; hDecoder->channelConfiguration = channels; /* must be done before frameLength is divided by 2 for LD */ hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifndef FIXED_POINT if (hDecoder->config.outputFormat >= 5) Init_Dither(16, hDecoder->config.outputFormat - 5); #endif return 0; } void FAADAPI faacDecClose(faacDecHandle hDecoder) { uint8_t i; if (hDecoder == NULL) return; for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->time_out[i]) free(hDecoder->time_out[i]); #ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) free(hDecoder->ssr_overlap[i]); if (hDecoder->prev_fmd[i]) free(hDecoder->prev_fmd[i]); #endif #ifdef MAIN_DEC if (hDecoder->pred_stat[i]) free(hDecoder->pred_stat[i]); #endif #ifdef LTP_DEC if (hDecoder->lt_pred_stat[i]) free(hDecoder->lt_pred_stat[i]); #endif } #ifdef SSR_DEC if (hDecoder->object_type == SSR) ssr_filter_bank_end(hDecoder->fb); else #endif filter_bank_end(hDecoder->fb); drc_end(hDecoder->drc); #ifndef FIXED_POINT #if POW_TABLE_SIZE if (hDecoder->pow2_table) free(hDecoder->pow2_table); #endif #endif if (hDecoder->sample_buffer) free(hDecoder->sample_buffer); if (hDecoder) free(hDecoder); } void* FAADAPI faacDecDecode(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, uint8_t *buffer, uint32_t buffer_size) { int32_t i; uint8_t ch; adts_header adts; uint8_t channels = 0, ch_ele = 0; bitfile *ld = (bitfile*)malloc(sizeof(bitfile)); /* local copys of globals */ uint8_t sf_index = hDecoder->sf_index; uint8_t object_type = hDecoder->object_type; uint8_t channelConfiguration = hDecoder->channelConfiguration; #ifdef MAIN_DEC pred_state **pred_stat = hDecoder->pred_stat; #endif #ifdef LTP_DEC real_t **lt_pred_stat = hDecoder->lt_pred_stat; #endif #ifndef FIXED_POINT #if POW_TABLE_SIZE real_t *pow2_table = hDecoder->pow2_table; #else real_t *pow2_table = NULL; #endif #endif uint8_t *window_shape_prev = hDecoder->window_shape_prev; real_t **time_out = hDecoder->time_out; #ifdef SSR_DEC real_t **ssr_overlap = hDecoder->ssr_overlap; real_t **prev_fmd = hDecoder->prev_fmd; #endif fb_info *fb = hDecoder->fb; drc_info *drc = hDecoder->drc; uint8_t outputFormat = hDecoder->config.outputFormat; #ifdef LTP_DEC uint16_t *ltp_lag = hDecoder->ltp_lag; #endif program_config pce; element *syntax_elements[MAX_SYNTAX_ELEMENTS]; element **elements; int16_t *spec_data[MAX_CHANNELS]; real_t *spec_coef[MAX_CHANNELS]; uint16_t frame_len = hDecoder->frameLength; void *sample_buffer; memset(hInfo, 0, sizeof(faacDecFrameInfo)); /* initialize the bitstream */ faad_initbits(ld, buffer, buffer_size); #ifdef DRM if (object_type == DRM_ER_LC) { faad_getbits(ld, 8 DEBUGVAR(1,1,"faacDecDecode(): skip CRC")); } #endif if (hDecoder->adts_header_present) { if ((hInfo->error = adts_frame(&adts, ld)) > 0) goto error; /* MPEG2 does byte_alignment() here, * but ADTS header is always multiple of 8 bits in MPEG2 * so not needed to actually do it. */ } #ifdef ANALYSIS dbg_count = 0; #endif elements = syntax_elements; /* decode the complete bitstream */ elements = raw_data_block(hDecoder, hInfo, ld, syntax_elements, spec_data, spec_coef, &pce, drc); ch_ele = hDecoder->fr_ch_ele; channels = hDecoder->fr_channels; if (hInfo->error > 0) goto error; /* no more bit reading after this */ hInfo->bytesconsumed = bit2byte(faad_get_processed_bits(ld)); if (ld->error) { hInfo->error = 14; goto error; } faad_endbits(ld); if (ld) free(ld); ld = NULL; /* number of samples in this frame */ hInfo->samples = frame_len*channels; /* number of channels in this frame */ hInfo->channels = channels; /* samplerate */ hInfo->samplerate = sample_rates[hDecoder->sf_index]; /* check if frame has channel elements */ if (channels == 0) { hDecoder->frame++; return NULL; } if (hDecoder->sample_buffer == NULL) hDecoder->sample_buffer = malloc(frame_len*channels*sizeof(real_t)); sample_buffer = hDecoder->sample_buffer; /* noiseless coding is done, the rest of the tools come now */ for (ch = 0; ch < channels; ch++) { ic_stream *ics; /* find the syntax element to which this channel belongs */ for (i = 0; i < ch_ele; i++) { if (syntax_elements[i]->channel == ch) ics = &(syntax_elements[i]->ics1); else if (syntax_elements[i]->paired_channel == ch) ics = &(syntax_elements[i]->ics2); } /* inverse quantization */ inverse_quantization(spec_coef[ch], spec_data[ch], frame_len); /* apply scalefactors */ #ifdef FIXED_POINT apply_scalefactors(ics, spec_coef[ch], frame_len); #else apply_scalefactors(ics, spec_coef[ch], pow2_table, frame_len); #endif /* deinterleave short block grouping */ if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) quant_to_spec(ics, spec_coef[ch], frame_len); } /* Because for ms, is and pns both channels spectral coefficients are needed we have to restart running through all channels here. */ for (ch = 0; ch < channels; ch++) { int16_t pch = -1; uint8_t right_channel; ic_stream *ics, *icsr; ltp_info *ltp; /* find the syntax element to which this channel belongs */ for (i = 0; i < ch_ele; i++) {