diff options
author | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-09-24 17:31:36 +0000 |
---|---|---|
committer | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-09-24 17:31:36 +0000 |
commit | e1ece5e2eb68c81b1645c9ff989c833c4d67dfd8 (patch) | |
tree | 8553b3a4ef8164d14ff1b4a3f67e57cfa1d8908a /libfaad2/decoder.c | |
parent | 2887bacbdb6bd320e4840fd230e92a59cc74b9ae (diff) | |
download | mpv-e1ece5e2eb68c81b1645c9ff989c833c4d67dfd8.tar.bz2 mpv-e1ece5e2eb68c81b1645c9ff989c833c4d67dfd8.tar.xz |
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
patch by adland <adland123 at yahoo dot com>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13454 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libfaad2/decoder.c')
-rw-r--r-- | libfaad2/decoder.c | 280 |
1 files changed, 169 insertions, 111 deletions
diff --git a/libfaad2/decoder.c b/libfaad2/decoder.c index 7470128a76..c2d534ac0f 100644 --- a/libfaad2/decoder.c +++ b/libfaad2/decoder.c @@ -23,7 +23,7 @@ ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** Initially modified for use with MPlayer by Arpad Gereöffy on 2003/08/30 -** $Id: decoder.c,v 1.3 2004/06/02 22:59:02 diego Exp $ +** $Id: decoder.c,v 1.4 2004/06/23 13:50:49 diego Exp $ ** detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ **/ @@ -52,14 +52,21 @@ uint16_t dbg_count; #endif -int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode) +/* static function declarations */ +static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, + uint8_t *buffer, uint32_t buffer_size, + void **sample_buffer, uint32_t sample_buffer_size); +static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo); + + +char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode) { if (errcode >= NUM_ERROR_MESSAGES) return NULL; return err_msg[errcode]; } -uint32_t FAADAPI faacDecGetCapabilities(void) +uint32_t NEAACDECAPI NeAACDecGetCapabilities(void) { uint32_t cap = 0; @@ -85,15 +92,15 @@ uint32_t FAADAPI faacDecGetCapabilities(void) return cap; } -faacDecHandle FAADAPI faacDecOpen(void) +NeAACDecHandle NEAACDECAPI NeAACDecOpen(void) { uint8_t i; - faacDecHandle hDecoder = NULL; + NeAACDecHandle hDecoder = NULL; - if ((hDecoder = (faacDecHandle)faad_malloc(sizeof(faacDecStruct))) == NULL) + if ((hDecoder = (NeAACDecHandle)faad_malloc(sizeof(NeAACDecStruct))) == NULL) return NULL; - memset(hDecoder, 0, sizeof(faacDecStruct)); + memset(hDecoder, 0, sizeof(NeAACDecStruct)); hDecoder->config.outputFormat = FAAD_FMT_16BIT; hDecoder->config.defObjectType = MAIN; @@ -150,11 +157,11 @@ faacDecHandle FAADAPI faacDecOpen(void) return hDecoder; } -faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder) +NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder) { if (hDecoder) { - faacDecConfigurationPtr config = &(hDecoder->config); + NeAACDecConfigurationPtr config = &(hDecoder->config); return config; } @@ -162,8 +169,8 @@ faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDe return NULL; } -uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, - faacDecConfigurationPtr config) +uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, + NeAACDecConfigurationPtr config) { if (hDecoder && config) { @@ -178,12 +185,18 @@ uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, hDecoder->config.defSampleRate = config->defSampleRate; /* check output format */ - if ((config->outputFormat < 1) || (config->outputFormat > 9)) +#ifdef FIXED_POINT + if ((config->outputFormat < 1) || (config->outputFormat > 4)) return 0; +#else + if ((config->outputFormat < 1) || (config->outputFormat > 5)) + return 0; +#endif hDecoder->config.outputFormat = config->outputFormat; if (config->downMatrix > 1) - hDecoder->config.downMatrix = config->downMatrix; + return 0; + hDecoder->config.downMatrix = config->downMatrix; /* OK */ return 1; @@ -192,9 +205,9 @@ uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, return 0; } -int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, - uint32_t buffer_size, - uint32_t *samplerate, uint8_t *channels) +int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, + uint32_t buffer_size, + uint32_t *samplerate, uint8_t *channels) { uint32_t bits = 0; bitfile ld; @@ -257,12 +270,23 @@ int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, } hDecoder->channelConfiguration = *channels; +#if (defined(PS_DEC) || defined(DRM_PS)) + /* check if we have a mono file */ + if (*channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + *channels = 2; + } +#endif + #ifdef SBR_DEC /* implicit signalling */ if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { *samplerate *= 2; hDecoder->forceUpSampling = 1; + } else if (*samplerate > 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { + hDecoder->downSampledSBR = 1; } #endif @@ -286,9 +310,9 @@ int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, } /* 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 NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer, + uint32_t SizeOfDecoderSpecificInfo, + uint32_t *samplerate, uint8_t *channels) { int8_t rc; mp4AudioSpecificConfig mp4ASC; @@ -318,6 +342,14 @@ int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, *channels = hDecoder->pce.channels; hDecoder->pce_set = 1; } +#if (defined(PS_DEC) || defined(DRM_PS)) + /* check if we have a mono file */ + if (*channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + *channels = 2; + } +#endif hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex; #ifdef ERROR_RESILIENCE @@ -327,13 +359,14 @@ int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, #endif #ifdef SBR_DEC hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; + hDecoder->downSampledSBR = mp4ASC.downSampledSBR; 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) + if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) { hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); } @@ -368,100 +401,48 @@ int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, } #ifdef DRM -int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, - uint8_t channels) +int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate, + uint8_t channels) { - uint8_t i; - if (hDecoder == NULL) return 1; /* error */ + NeAACDecClose(*hDecoder); + + *hDecoder = NeAACDecOpen(); + /* Special object type defined for DRM */ - hDecoder->config.defObjectType = DRM_ER_LC; + (*hDecoder)->config.defObjectType = DRM_ER_LC; - hDecoder->config.defSampleRate = samplerate; + (*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 */ + (*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; + (*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; + (*hDecoder)->channelConfiguration = 2; else - hDecoder->channelConfiguration = 1; + (*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; + (*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)->sbr_present_flag = 1; +#endif - hDecoder->fb = filter_bank_init(hDecoder->frameLength); + (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); return 0; } #endif -void FAADAPI faacDecClose(faacDecHandle hDecoder) +void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder) { uint8_t i; @@ -514,7 +495,7 @@ void FAADAPI faacDecClose(faacDecHandle hDecoder) if (hDecoder) faad_free(hDecoder); } -void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, int32_t frame) +void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame) { if (hDecoder) { @@ -525,7 +506,7 @@ void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, int32_t frame) } } -static void create_channel_config(faacDecHandle hDecoder, faacDecFrameInfo *hInfo) +static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo) { hInfo->num_front_channels = 0; hInfo->num_side_channels = 0; @@ -730,9 +711,31 @@ static void create_channel_config(faacDecHandle hDecoder, faacDecFrameInfo *hInf } } -void* FAADAPI faacDecDecode(faacDecHandle hDecoder, - faacDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size) +void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + uint8_t *buffer, uint32_t buffer_size) +{ + return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); +} + +void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + uint8_t *buffer, uint32_t buffer_size, + void **sample_buffer, uint32_t sample_buffer_size) +{ + if ((sample_buffer == NULL) || (sample_buffer_size == 0)) + { + hInfo->error = 27; + return NULL; + } + + return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, + sample_buffer, sample_buffer_size); +} + +static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, + uint8_t *buffer, uint32_t buffer_size, + void **sample_buffer2, uint32_t sample_buffer_size) { uint8_t channels = 0; uint8_t output_channels = 0; @@ -751,27 +754,49 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, return NULL; } +#if 0 + printf("%d\n", buffer_size*8); +#endif + frame_len = hDecoder->frameLength; - memset(hInfo, 0, sizeof(faacDecFrameInfo)); + memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); /* initialize the bitstream */ faad_initbits(&ld, buffer, buffer_size); +#if 0 + { + int i; + for (i = 0; i < ((buffer_size+3)>>2); i++) + { + uint8_t *buf; + uint32_t temp = 0; + buf = faad_getbitbuffer(&ld, 32); + //temp = getdword((void*)buf); + temp = *((uint32_t*)buf); + printf("0x%.8X\n", temp); + free(buf); + } + faad_endbits(&ld); + faad_initbits(&ld, buffer, buffer_size); + } +#endif + #ifdef DRM if (hDecoder->object_type == DRM_ER_LC) { /* We do not support stereo right now */ - if (hDecoder->channelConfiguration == 2) + if (0) //(hDecoder->channelConfiguration == 2) { hInfo->error = 8; // Throw CRC error goto error; } faad_getbits(&ld, 8 - DEBUGVAR(1,1,"faacDecDecode(): skip CRC")); + DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); } #endif @@ -831,7 +856,7 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, if (!hDecoder->adts_header_present && !hDecoder->adif_header_present) { - if (channels != hDecoder->channelConfiguration) + if (hDecoder->channelConfiguration == 0) hDecoder->channelConfiguration = channels; if (channels == 8) /* 7.1 */ @@ -848,6 +873,17 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, output_channels = channels; } +#if (defined(PS_DEC) || defined(DRM_PS)) + hDecoder->upMatrix = 0; + /* check if we have a mono file */ + if (output_channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + hDecoder->upMatrix = 1; + output_channels = 2; + } +#endif + /* Make a channel configuration based on either a PCE or a channelConfiguration */ create_channel_config(hDecoder, hInfo); @@ -885,17 +921,32 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, }; uint8_t stride = str[hDecoder->config.outputFormat-1]; #ifdef SBR_DEC - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || (hDecoder->forceUpSampling == 1)) + { stride = 2 * stride; + } #endif - if (hDecoder->sample_buffer) - faad_free(hDecoder->sample_buffer); - hDecoder->sample_buffer = NULL; - hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); + /* check if we want to use internal sample_buffer */ + if (sample_buffer_size == 0) + { + if (hDecoder->sample_buffer) + faad_free(hDecoder->sample_buffer); + hDecoder->sample_buffer = NULL; + hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); + } else if (sample_buffer_size < frame_len*output_channels*stride) { + /* provided sample buffer is not big enough */ + hInfo->error = 27; + return NULL; + } hDecoder->alloced_channels = output_channels; } - sample_buffer = hDecoder->sample_buffer; + if (sample_buffer_size == 0) + { + sample_buffer = hDecoder->sample_buffer; + } else { + sample_buffer = *sample_buffer2; + } #ifdef SBR_DEC if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) @@ -903,9 +954,12 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, uint8_t ele; /* this data is different when SBR is used or when the data is upsampled */ - frame_len *= 2; - hInfo->samples *= 2; - hInfo->samplerate *= 2; + if (!hDecoder->downSampledSBR) + { + frame_len *= 2; + hInfo->samples *= 2; + hInfo->samplerate *= 2; + } /* check if every element was provided with SBR data */ for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) @@ -925,6 +979,10 @@ void* FAADAPI faacDecDecode(faacDecHandle hDecoder, } else { hInfo->sbr = NO_SBR_UPSAMPLED; } + if (hDecoder->downSampledSBR) + { + hInfo->sbr = SBR_DOWNSAMPLED; + } } #endif |