Mercurial > mplayer.hg
comparison mencoder.c @ 7604:32efb806436e
aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
author | arpi |
---|---|
date | Sat, 05 Oct 2002 22:55:45 +0000 |
parents | b645204ea527 |
children | ff6bcf692358 |
comparison
equal
deleted
inserted
replaced
7603:c89106306f5a | 7604:32efb806436e |
---|---|
43 | 43 |
44 #include "playtree.h" | 44 #include "playtree.h" |
45 | 45 |
46 #include "libvo/video_out.h" | 46 #include "libvo/video_out.h" |
47 | 47 |
48 #include "libao2/afmt.h" | |
49 | |
48 #include "libmpcodecs/mp_image.h" | 50 #include "libmpcodecs/mp_image.h" |
49 #include "libmpcodecs/dec_audio.h" | 51 #include "libmpcodecs/dec_audio.h" |
50 #include "libmpcodecs/dec_video.h" | 52 #include "libmpcodecs/dec_video.h" |
51 #include "libmpcodecs/vf.h" | 53 #include "libmpcodecs/vf.h" |
52 | 54 |
247 int size=0; | 249 int size=0; |
248 int at_eof=0; | 250 int at_eof=0; |
249 while(size<total && !at_eof){ | 251 while(size<total && !at_eof){ |
250 int len=total-size; | 252 int len=total-size; |
251 if(len>MAX_OUTBURST) len=MAX_OUTBURST; | 253 if(len>MAX_OUTBURST) len=MAX_OUTBURST; |
252 if(len>sh_audio->a_buffer_size) len=sh_audio->a_buffer_size; | 254 if(len>sh_audio->a_out_buffer_size) len=sh_audio->a_out_buffer_size; |
253 if(len>sh_audio->a_buffer_len){ | 255 if(len>sh_audio->a_out_buffer_len){ |
254 int ret=decode_audio(sh_audio, | 256 int ret=decode_audio(sh_audio, |
255 &sh_audio->a_buffer[sh_audio->a_buffer_len], | 257 &sh_audio->a_out_buffer[sh_audio->a_out_buffer_len], |
256 len-sh_audio->a_buffer_len, | 258 len-sh_audio->a_out_buffer_len, |
257 sh_audio->a_buffer_size-sh_audio->a_buffer_len); | 259 sh_audio->a_out_buffer_size-sh_audio->a_out_buffer_len); |
258 if(ret>0) sh_audio->a_buffer_len+=ret; else at_eof=1; | 260 if(ret>0) sh_audio->a_out_buffer_len+=ret; else at_eof=1; |
259 } | 261 } |
260 if(len>sh_audio->a_buffer_len) len=sh_audio->a_buffer_len; | 262 if(len>sh_audio->a_out_buffer_len) len=sh_audio->a_out_buffer_len; |
261 memcpy(buffer+size,sh_audio->a_buffer,len); | 263 memcpy(buffer+size,sh_audio->a_out_buffer,len); |
262 sh_audio->a_buffer_len-=len; size+=len; | 264 sh_audio->a_out_buffer_len-=len; size+=len; |
263 if(sh_audio->a_buffer_len>0) | 265 if(sh_audio->a_out_buffer_len>0) |
264 memcpy(sh_audio->a_buffer,&sh_audio->a_buffer[len],sh_audio->a_buffer_len); | 266 memcpy(sh_audio->a_out_buffer,&sh_audio->a_out_buffer[len],sh_audio->a_out_buffer_len); |
265 } | 267 } |
266 return size; | 268 return size; |
267 } | 269 } |
268 | 270 |
269 extern void me_register_options(m_config_t* cfg); | 271 extern void me_register_options(m_config_t* cfg); |
692 break; | 694 break; |
693 case ACODEC_PCM: | 695 case ACODEC_PCM: |
694 printf("CBR PCM audio selected\n"); | 696 printf("CBR PCM audio selected\n"); |
695 mux_a->h.dwSampleSize=2*sh_audio->channels; | 697 mux_a->h.dwSampleSize=2*sh_audio->channels; |
696 mux_a->h.dwScale=1; | 698 mux_a->h.dwScale=1; |
697 mux_a->h.dwRate=sh_audio->samplerate; | 699 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate; |
698 mux_a->wf=malloc(sizeof(WAVEFORMATEX)); | 700 mux_a->wf=malloc(sizeof(WAVEFORMATEX)); |
699 mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize; | 701 mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize; |
700 mux_a->wf->wFormatTag=0x1; // PCM | 702 mux_a->wf->wFormatTag=0x1; // PCM |
701 mux_a->wf->nChannels=sh_audio->channels; | 703 mux_a->wf->nChannels=audio_output_channels?audio_output_channels:sh_audio->channels; |
702 mux_a->wf->nSamplesPerSec=sh_audio->samplerate; | 704 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; |
703 mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; | 705 mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; |
704 mux_a->wf->wBitsPerSample=16; | 706 mux_a->wf->wBitsPerSample=16; |
705 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm | 707 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm |
708 // setup filter: | |
709 if(!init_audio_filters(sh_audio, | |
710 sh_audio->samplerate, | |
711 sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize, | |
712 mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels, | |
713 (mux_a->wf->wBitsPerSample==8)? AFMT_U8:AFMT_S16_LE, | |
714 mux_a->wf->wBitsPerSample/8, | |
715 16384, mux_a->wf->nAvgBytesPerSec)){ | |
716 mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n"); | |
717 } | |
706 break; | 718 break; |
707 case ACODEC_VBRMP3: | 719 case ACODEC_VBRMP3: |
708 printf("MP3 audio selected\n"); | 720 printf("MP3 audio selected\n"); |
709 mux_a->h.dwSampleSize=0; // VBR | 721 mux_a->h.dwSampleSize=0; // VBR |
710 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate; | 722 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate; |
711 mux_a->h.dwScale=(mux_a->h.dwRate<32000)?576:1152; // samples/frame | 723 mux_a->h.dwScale=(mux_a->h.dwRate<32000)?576:1152; // samples/frame |
712 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT)); | 724 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT)); |
713 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30 | 725 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30 |
714 mux_a->wf->wFormatTag=0x55; // MP3 | 726 mux_a->wf->wFormatTag=0x55; // MP3 |
715 mux_a->wf->nChannels= sh_audio->channels; | 727 mux_a->wf->nChannels= (lame_param_mode<0) ? sh_audio->channels : |
716 mux_a->wf->nSamplesPerSec=force_srate?force_srate:sh_audio->samplerate; | 728 ((lame_param_mode==3) ? 1 : 2); |
729 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate; | |
717 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME! | 730 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME! |
718 mux_a->wf->nBlockAlign=(mux_a->h.dwRate<32000)?576:1152; // required for l3codeca.acm + WMP 6.4 | 731 mux_a->wf->nBlockAlign=(mux_a->h.dwRate<32000)?576:1152; // required for l3codeca.acm + WMP 6.4 |
719 mux_a->wf->wBitsPerSample=0; //16; | 732 mux_a->wf->wBitsPerSample=0; //16; |
720 // from NaNdub: (requires for l3codeca.acm) | 733 // from NaNdub: (requires for l3codeca.acm) |
721 mux_a->wf->cbSize=12; | 734 mux_a->wf->cbSize=12; |
722 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1; | 735 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1; |
723 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2; | 736 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2; |
724 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=(mux_a->h.dwRate<32000)?576:1152; // ??? | 737 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=(mux_a->h.dwRate<32000)?576:1152; // ??? |
725 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1; | 738 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1; |
726 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0; | 739 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0; |
740 // setup filter: | |
741 if(!init_audio_filters(sh_audio, | |
742 sh_audio->samplerate, | |
743 sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize, | |
744 mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels, | |
745 AFMT_S16_LE, 2, | |
746 4608, mux_a->h.dwRate*mux_a->wf->nChannels*2)){ | |
747 mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n"); | |
748 } | |
727 break; | 749 break; |
728 } | 750 } |
729 | 751 |
730 if (verbose>1) print_wave_header(mux_a->wf); | 752 if (verbose>1) print_wave_header(mux_a->wf); |
731 | 753 |
746 #ifdef HAVE_MP3LAME | 768 #ifdef HAVE_MP3LAME |
747 case ACODEC_VBRMP3: | 769 case ACODEC_VBRMP3: |
748 | 770 |
749 lame=lame_init(); | 771 lame=lame_init(); |
750 lame_set_bWriteVbrTag(lame,0); | 772 lame_set_bWriteVbrTag(lame,0); |
751 lame_set_in_samplerate(lame,sh_audio->samplerate); | 773 lame_set_in_samplerate(lame,mux_a->wf->nSamplesPerSec); |
774 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame | |
752 lame_set_num_channels(lame,mux_a->wf->nChannels); | 775 lame_set_num_channels(lame,mux_a->wf->nChannels); |
753 lame_set_out_samplerate(lame,mux_a->wf->nSamplesPerSec); | 776 lame_set_out_samplerate(lame,mux_a->wf->nSamplesPerSec); |
754 lame_set_quality(lame,lame_param_algqual); // 0 = best q | 777 lame_set_quality(lame,lame_param_algqual); // 0 = best q |
755 if(lame_param_vbr){ // VBR: | 778 if(lame_param_vbr){ // VBR: |
756 lame_set_VBR(lame,lame_param_vbr); // vbr mode | 779 lame_set_VBR(lame,lame_param_vbr); // vbr mode |