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

📄 decoder.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** 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 + -