Mercurial > mplayer.hg
changeset 5342:c4cf81b3af71
imporetd from MPlayerXP, with small modification
author | arpi |
---|---|
date | Mon, 25 Mar 2002 21:23:06 +0000 |
parents | 6c1d264cc214 |
children | 3dd532400d44 |
files | libmpcodecs/dec_audio.c |
diffstat | 1 files changed, 131 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/dec_audio.c Mon Mar 25 21:23:06 2002 +0000 @@ -0,0 +1,131 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +extern int verbose; // defined in mplayer.c + +#include "stream.h" +#include "demuxer.h" + +#include "codec-cfg.h" +#include "stheader.h" + +#include "dec_audio.h" +#include "ad.h" +#include "../libao2/afmt.h" + +#ifdef USE_FAKE_MONO +int fakemono=0; +#endif +/* used for ac3surround decoder - set using -channels option */ +int audio_output_channels = 2; + +static ad_functions_t* mpadec; + +int init_audio(sh_audio_t *sh_audio) +{ + unsigned i; + for (i=0; mpcodecs_ad_drivers[i] != NULL; i++) + if(mpcodecs_ad_drivers[i]->info->id==sh_audio->codec->driver){ + mpadec=mpcodecs_ad_drivers[i]; break; + } + if(!mpadec){ + mp_msg(MSGT_DECAUDIO,MSGL_ERR,"Requested audio codec family [%s] (vfm=%d) not available (enable it at compile time!)\n", + sh_audio->codec->name, sh_audio->codec->driver); + return 0; // no such driver + } + + printf("Selecting Audio Decoder: [%s] %s\n",mpadec->info->short_name,mpadec->info->name); + + sh_audio->samplesize=2; +#ifdef WORDS_BIGENDIAN + sh_audio->sample_format=AFMT_S16_BE; +#else + sh_audio->sample_format=AFMT_S16_LE; +#endif + sh_audio->samplerate=0; + sh_audio->o_bps=0; + + sh_audio->a_buffer_size=0; + sh_audio->a_buffer=NULL; + + sh_audio->a_in_buffer_len=0; + + /* setup required min. in/out buffer size:*/ + sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ + + if(!mpadec->preinit(sh_audio)) + { + printf("ADecoder preinit failed :(\n"); + return 0; + } + +/* allocate audio out buffer: */ + sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/ + + mp_msg(MSGT_DECAUDIO,MSGL_V,"dec_audio: Allocating %d + %d = %d bytes for output buffer\n", + sh_audio->audio_out_minsize,MAX_OUTBURST,sh_audio->a_buffer_size); + + sh_audio->a_buffer=malloc(sh_audio->a_buffer_size); + if(!sh_audio->a_buffer){ + mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_CantAllocAudioBuf); + return 0; + } + memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); + sh_audio->a_buffer_len=0; + + if(!mpadec->init(sh_audio)){ + printf("ADecoder init failed :(\n"); + return 0; + } + sh_audio->inited=1; + + if(!sh_audio->channels || !sh_audio->samplerate){ + mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_UnknownAudio); + if(sh_audio->a_buffer) free(sh_audio->a_buffer); + sh_audio->a_buffer=NULL; + return 0; + } + + if(!sh_audio->o_bps) + sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; + return sh_audio->codec->driver; +} + +void uninit_audio(sh_audio_t *sh_audio) +{ + if(!sh_audio->inited) return; + mp_msg(MSGT_DECAUDIO,MSGL_V,"uninit audio: %d \n",sh_audio->codec->driver); + mpadec->uninit(sh_audio); + if(sh_audio->a_buffer) free(sh_audio->a_buffer); + sh_audio->a_buffer=NULL; + sh_audio->inited=0; +} + +int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) +{ + if(sh_audio->inited) + return mpadec->decode_audio(sh_audio,buf,minlen,maxlen); + else + return -1; +} + +void resync_audio_stream(sh_audio_t *sh_audio) +{ + if(!sh_audio->inited) return; + if(mpadec->control(sh_audio,ADCTRL_RESYNC_STREAM,NULL)==CONTROL_TRUE) return; + // default resync code: + sh_audio->a_in_buffer_len=0; // clear audio input buffer +} + +void skip_audio_frame(sh_audio_t *sh_audio) +{ + if(!sh_audio->inited) return; + if(mpadec->control(sh_audio,ADCTRL_SKIP_FRAME,NULL)==CONTROL_TRUE) return; + // default skip code: + ds_fill_buffer(sh_audio->ds); // skip block +}