diff options
author | atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-18 23:30:04 +0000 |
---|---|---|
committer | atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-18 23:30:04 +0000 |
commit | 6e63d3573d89a87d3223b3c4dd1ad0e52a0dbc23 (patch) | |
tree | 75e57f344dce2908bc436ddd0d79f969fae2aca9 /dec_audio.c | |
parent | 1bedf2f809cc2f92e5627706dabbb8735d551174 (diff) | |
download | mpv-6e63d3573d89a87d3223b3c4dd1ad0e52a0dbc23.tar.bz2 mpv-6e63d3573d89a87d3223b3c4dd1ad0e52a0dbc23.tar.xz |
Beta AAC decoding support, seeking totally broken yet, add philipps mpeg4 video in qt to ffmpeg4 although it's still buggy in decoding
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5191 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'dec_audio.c')
-rw-r--r-- | dec_audio.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/dec_audio.c b/dec_audio.c index c13134fa13..c92579c364 100644 --- a/dec_audio.c +++ b/dec_audio.c @@ -83,6 +83,18 @@ typedef struct ov_struct_st { } ov_struct_t; #endif +#ifdef HAVE_FAAD +#include <faad.h> +static faacDecHandle faac_hdec; +static faacDecFrameInfo faac_finfo; +static int faac_bytesconsumed = 0; +static unsigned char *faac_buffer; +/* configure maximum supported channels, * + * this is theoretically max. 64 chans */ +#define FAAD_MAX_CHANNELS 6 +#define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS) +#endif + #ifdef USE_LIBAVCODEC #ifdef USE_LIBAVCODEC_SO #include <libffmpeg/avcodec.h> @@ -388,6 +400,17 @@ case AFM_VORBIS: sh_audio->audio_out_minsize=1024*4; // 1024 samples/frame #endif break; +case AFM_AAC: + // AAC (MPEG2 Audio, MPEG4 Audio) +#ifndef HAVE_FAAD + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"Error: Cannot decode AAC data, because MPlayer was compiled without FAAD support\n"/*MSGTR_NoFAAD*/); + driver=0; +#else + mp_msg(MSGT_DECAUDIO,MSGL_V,"Using FAAD to decode AAC content!\n"/*MSGTR_UseFAAD*/); + // Samples per frame * channels per frame, this might not work with >2 chan AAC, need test samples! ::atmos + sh_audio->audio_out_minsize=2048*2; +#endif + break; case AFM_PCM: case AFM_DVDPCM: case AFM_ALAW: @@ -810,6 +833,66 @@ case AFM_VORBIS: { mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Init OK!\n"); } break; #endif + +#ifdef HAVE_FAAD +case AFM_AAC: { + unsigned long faac_samplerate, faac_channels; + faacDecConfigurationPtr faac_conf; + faac_hdec = faacDecOpen(); + +#if 0 + /* Set the default object type and samplerate */ + /* This is useful for RAW AAC files */ + faac_conf = faacDecGetCurrentConfiguration(faac_hdec); + if(sh_audio->samplerate) + faac_conf->defSampleRate = sh_audio->samplerate; + /* XXX: is outputFormat samplesize of compressed data or samplesize of + * decoded data, maybe upsampled? Also, FAAD support FLOAT output, + * how do we handle that (FAAD_FMT_FLOAT)? ::atmos + */ + if(sh_audio->samplesize) + switch(sh_audio->samplesize){ + case 1: // 8Bit + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: 8Bit samplesize not supported by FAAD, assuming 16Bit!\n"); + default: + case 2: // 16Bit + faac_conf->outputFormat = FAAD_FMT_16BIT; + break; + case 3: // 24Bit + faac_conf->outputFormat = FAAD_FMT_24BIT; + break; + case 4: // 32Bit + faac_conf->outputFormat = FAAD_FMT_32BIT; + break; + } + faac_conf->defObjectType = LTP; // => MAIN, LC, SSR, LTP available. + + faacDecSetConfiguration(faac_hdec, faac_conf); +#endif + + if(faac_buffer == NULL) + faac_buffer = (unsigned char*)malloc(FAAD_BUFFLEN); + memset(faac_buffer, 0, FAAD_BUFFLEN); + demux_read_data(sh_audio->ds, faac_buffer, FAAD_BUFFLEN); + + /* init the codec */ + if((faac_bytesconsumed = faacDecInit(faac_hdec, faac_buffer, &faac_samplerate, &faac_channels)) < 0) { + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to initialize the decoder!\n"); // XXX: deal with cleanup! + faacDecClose(faac_hdec); + free(faac_buffer); + faac_buffer = NULL; + driver = 0; + } else { + mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Decoder init done (%dBytes)!\n", faac_bytesconsumed); // XXX: remove or move to debug! + mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %dHz channels: %d\n", faac_samplerate, faac_channels); + sh_audio->channels = faac_channels; + sh_audio->samplerate = faac_samplerate; + sh_audio->i_bps = 128*1000/8; // XXX: HACK!!! There's currently no way to get bitrate from libfaad2! ::atmos + } + +} break; +#endif + #ifdef USE_LIBMAD case AFM_MAD: { @@ -974,6 +1057,50 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){ } } break; #endif + +#ifdef HAVE_FAAD + case AFM_AAC: { + int /*i,*/ k, j = 0; + void *faac_sample_buffer; + + len = 0; + while(len < minlen) { + /* update buffer */ + if (faac_bytesconsumed > 0) { + for (k = 0; k < (FAAD_BUFFLEN - faac_bytesconsumed); k++) + faac_buffer[k] = faac_buffer[k + faac_bytesconsumed]; + demux_read_data(sh_audio->ds, faac_buffer + (FAAD_BUFFLEN) - faac_bytesconsumed, faac_bytesconsumed); + faac_bytesconsumed = 0; + } + /*for (i = 0; i < 16; i++) + printf ("%02X ", faac_buffer[i]); + printf ("\n");*/ + do { + faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, faac_buffer+j); + /* update buffer index after faacDecDecode */ + faac_bytesconsumed += faac_finfo.bytesconsumed; + if(faac_finfo.error > 0) { + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Trying to resync!\n"); + j++; + } else + break; + } while(j < FAAD_BUFFLEN); + + + if(faac_finfo.error > 0) { + mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to decode frame: %s \n", + faacDecGetErrorMessage(faac_finfo.error)); + } else if (faac_finfo.samples == 0) + mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Decoded zero samples!\n"); + else { + mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Successfully decoded frame (%dBytes)!\n", faac_finfo.samples*faac_finfo.channels); + memcpy(buf+len,faac_sample_buffer, faac_finfo.samples*faac_finfo.channels); + len += faac_finfo.samples*faac_finfo.channels; + } + } + + } break; +#endif case AFM_PCM: // AVI PCM len=demux_read_data(sh_audio->ds,buf,minlen); break; @@ -1225,6 +1352,14 @@ void resync_audio_stream(sh_audio_t *sh_audio){ // if(verbose) printf(" OK!\n"); break; #endif +#ifdef HAVE_FAAD + case AFM_AAC: + //if(faac_buffer != NULL) + faac_bytesconsumed = 0; + memset(faac_buffer, 0, FAAD_BUFFLEN); + //demux_read_data(sh_audio->ds, faac_buffer, FAAD_BUFFLEN); + break; +#endif case AFM_A52: case AFM_ACM: case AFM_DSHOW: |