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