From 3053a8b7f248363d7f47c5718e1b292b7f974960 Mon Sep 17 00:00:00 2001 From: arpi Date: Sat, 5 Oct 2002 22:55:45 +0000 Subject: aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7605 b3059339-0415-0410-9bf9-f77b7e298cf2 --- mencoder.c | 57 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 17 deletions(-) (limited to 'mencoder.c') diff --git a/mencoder.c b/mencoder.c index d2ad95705c..ff283af118 100644 --- a/mencoder.c +++ b/mencoder.c @@ -45,6 +45,8 @@ static char* banner_text= #include "libvo/video_out.h" +#include "libao2/afmt.h" + #include "libmpcodecs/mp_image.h" #include "libmpcodecs/dec_audio.h" #include "libmpcodecs/dec_video.h" @@ -249,19 +251,19 @@ static int dec_audio(sh_audio_t *sh_audio,unsigned char* buffer,int total){ while(sizeMAX_OUTBURST) len=MAX_OUTBURST; - if(len>sh_audio->a_buffer_size) len=sh_audio->a_buffer_size; - if(len>sh_audio->a_buffer_len){ + if(len>sh_audio->a_out_buffer_size) len=sh_audio->a_out_buffer_size; + if(len>sh_audio->a_out_buffer_len){ int ret=decode_audio(sh_audio, - &sh_audio->a_buffer[sh_audio->a_buffer_len], - len-sh_audio->a_buffer_len, - sh_audio->a_buffer_size-sh_audio->a_buffer_len); - if(ret>0) sh_audio->a_buffer_len+=ret; else at_eof=1; + &sh_audio->a_out_buffer[sh_audio->a_out_buffer_len], + len-sh_audio->a_out_buffer_len, + sh_audio->a_out_buffer_size-sh_audio->a_out_buffer_len); + if(ret>0) sh_audio->a_out_buffer_len+=ret; else at_eof=1; } - if(len>sh_audio->a_buffer_len) len=sh_audio->a_buffer_len; - memcpy(buffer+size,sh_audio->a_buffer,len); - sh_audio->a_buffer_len-=len; size+=len; - if(sh_audio->a_buffer_len>0) - memcpy(sh_audio->a_buffer,&sh_audio->a_buffer[len],sh_audio->a_buffer_len); + if(len>sh_audio->a_out_buffer_len) len=sh_audio->a_out_buffer_len; + memcpy(buffer+size,sh_audio->a_out_buffer,len); + sh_audio->a_out_buffer_len-=len; size+=len; + if(sh_audio->a_out_buffer_len>0) + memcpy(sh_audio->a_out_buffer,&sh_audio->a_out_buffer[len],sh_audio->a_out_buffer_len); } return size; } @@ -694,15 +696,25 @@ case ACODEC_PCM: printf("CBR PCM audio selected\n"); mux_a->h.dwSampleSize=2*sh_audio->channels; mux_a->h.dwScale=1; - mux_a->h.dwRate=sh_audio->samplerate; + mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate; mux_a->wf=malloc(sizeof(WAVEFORMATEX)); mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize; mux_a->wf->wFormatTag=0x1; // PCM - mux_a->wf->nChannels=sh_audio->channels; - mux_a->wf->nSamplesPerSec=sh_audio->samplerate; + mux_a->wf->nChannels=audio_output_channels?audio_output_channels:sh_audio->channels; + mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; mux_a->wf->wBitsPerSample=16; mux_a->wf->cbSize=0; // FIXME for l3codeca.acm + // setup filter: + if(!init_audio_filters(sh_audio, + sh_audio->samplerate, + sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize, + mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels, + (mux_a->wf->wBitsPerSample==8)? AFMT_U8:AFMT_S16_LE, + mux_a->wf->wBitsPerSample/8, + 16384, mux_a->wf->nAvgBytesPerSec)){ + mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n"); + } break; case ACODEC_VBRMP3: printf("MP3 audio selected\n"); @@ -712,8 +724,9 @@ case ACODEC_VBRMP3: if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT)); mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30 mux_a->wf->wFormatTag=0x55; // MP3 - mux_a->wf->nChannels= sh_audio->channels; - mux_a->wf->nSamplesPerSec=force_srate?force_srate:sh_audio->samplerate; + mux_a->wf->nChannels= (lame_param_mode<0) ? sh_audio->channels : + ((lame_param_mode==3) ? 1 : 2); + mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME! mux_a->wf->nBlockAlign=(mux_a->h.dwRate<32000)?576:1152; // required for l3codeca.acm + WMP 6.4 mux_a->wf->wBitsPerSample=0; //16; @@ -724,6 +737,15 @@ case ACODEC_VBRMP3: ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=(mux_a->h.dwRate<32000)?576:1152; // ??? ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1; ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0; + // setup filter: + if(!init_audio_filters(sh_audio, + sh_audio->samplerate, + sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize, + mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels, + AFMT_S16_LE, 2, + 4608, mux_a->h.dwRate*mux_a->wf->nChannels*2)){ + mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n"); + } break; } @@ -748,7 +770,8 @@ case ACODEC_VBRMP3: lame=lame_init(); lame_set_bWriteVbrTag(lame,0); -lame_set_in_samplerate(lame,sh_audio->samplerate); +lame_set_in_samplerate(lame,mux_a->wf->nSamplesPerSec); +//lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame lame_set_num_channels(lame,mux_a->wf->nChannels); lame_set_out_samplerate(lame,mux_a->wf->nSamplesPerSec); lame_set_quality(lame,lame_param_algqual); // 0 = best q -- cgit v1.2.3