comparison mencoder.c @ 4370:18f73fb0380e

more audiocopy fixes (especially for .asf)
author arpi
date Sun, 27 Jan 2002 02:31:06 +0000
parents b768f17c6d36
children a7aa414b1bcf
comparison
equal deleted inserted replaced
4369:b768f17c6d36 4370:18f73fb0380e
764 force_fourcc[2], force_fourcc[3]); 764 force_fourcc[2], force_fourcc[3]);
765 printf("Forcing output fourcc to %x [%.4s]\n", 765 printf("Forcing output fourcc to %x [%.4s]\n",
766 mux_v->bih->biCompression, (char *)&mux_v->bih->biCompression); 766 mux_v->bih->biCompression, (char *)&mux_v->bih->biCompression);
767 } 767 }
768 768
769 if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf!
770
769 // ============= AUDIO =============== 771 // ============= AUDIO ===============
770 if(sh_audio){ 772 if(sh_audio){
771 773
772 mux_a=aviwrite_new_stream(muxer,AVIWRITE_TYPE_AUDIO); 774 mux_a=aviwrite_new_stream(muxer,AVIWRITE_TYPE_AUDIO);
773 775
778 780
779 mux_a->codec=out_audio_codec; 781 mux_a->codec=out_audio_codec;
780 782
781 switch(mux_a->codec){ 783 switch(mux_a->codec){
782 case ACODEC_COPY: 784 case ACODEC_COPY:
783 if(sh_audio->audio.dwScale){
784 mux_a->h.dwSampleSize=sh_audio->audio.dwSampleSize;
785 mux_a->h.dwScale=sh_audio->audio.dwScale;
786 mux_a->h.dwRate=sh_audio->audio.dwRate;
787 } else {
788 mux_a->h.dwSampleSize=1;
789 mux_a->h.dwScale=1;
790 mux_a->h.dwRate=sh_audio->i_bps;
791 }
792 if (sh_audio->wf){ 785 if (sh_audio->wf){
793 mux_a->wf=sh_audio->wf; 786 mux_a->wf=sh_audio->wf;
787 if(!sh_audio->i_bps) sh_audio->i_bps=mux_a->wf->nAvgBytesPerSec;
794 } else { 788 } else {
795 mux_a->wf = malloc(sizeof(WAVEFORMATEX)); 789 mux_a->wf = malloc(sizeof(WAVEFORMATEX));
796 mux_a->wf->nBlockAlign = mux_a->h.dwSampleSize; 790 mux_a->wf->nBlockAlign = 1; //mux_a->h.dwSampleSize;
797 mux_a->wf->wFormatTag = sh_audio->format; 791 mux_a->wf->wFormatTag = sh_audio->format;
798 mux_a->wf->nChannels = sh_audio->channels; 792 mux_a->wf->nChannels = sh_audio->channels;
799 mux_a->wf->nSamplesPerSec = sh_audio->samplerate; 793 mux_a->wf->nSamplesPerSec = sh_audio->samplerate;
800 mux_a->wf->nAvgBytesPerSec=sh_audio->i_bps; //mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; 794 mux_a->wf->nAvgBytesPerSec=sh_audio->i_bps; //mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec;
801 mux_a->wf->wBitsPerSample = 16; // FIXME 795 mux_a->wf->wBitsPerSample = 16; // FIXME
802 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm 796 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm
803 } 797 }
804 printf("audiocodec: framecopy (format=%x chans=%d rate=%d bits=%d)\n", 798 if(sh_audio->audio.dwScale){
799 mux_a->h.dwSampleSize=sh_audio->audio.dwSampleSize;
800 mux_a->h.dwScale=sh_audio->audio.dwScale;
801 mux_a->h.dwRate=sh_audio->audio.dwRate;
802 } else {
803 mux_a->h.dwSampleSize=mux_a->wf->nBlockAlign;
804 mux_a->h.dwScale=mux_a->h.dwSampleSize;
805 mux_a->h.dwRate=mux_a->wf->nAvgBytesPerSec;
806 }
807 printf("audiocodec: framecopy (format=%x chans=%d rate=%d bits=%d bps=%d sample=%d)\n",
805 mux_a->wf->wFormatTag, mux_a->wf->nChannels, mux_a->wf->nSamplesPerSec, 808 mux_a->wf->wFormatTag, mux_a->wf->nChannels, mux_a->wf->nSamplesPerSec,
806 mux_a->wf->wBitsPerSample); 809 mux_a->wf->wBitsPerSample, mux_a->wf->nAvgBytesPerSec, mux_a->h.dwSampleSize);
807 break; 810 break;
808 case ACODEC_PCM: 811 case ACODEC_PCM:
809 printf("CBR PCM audio selected\n"); 812 printf("CBR PCM audio selected\n");
810 mux_a->h.dwSampleSize=2*sh_audio->channels; 813 mux_a->h.dwSampleSize=2*sh_audio->channels;
811 mux_a->h.dwScale=1; 814 mux_a->h.dwScale=1;
1126 int len=0; 1129 int len=0;
1127 if(mux_a->h.dwSampleSize){ 1130 if(mux_a->h.dwSampleSize){
1128 // CBR - copy 0.5 sec of audio 1131 // CBR - copy 0.5 sec of audio
1129 switch(mux_a->codec){ 1132 switch(mux_a->codec){
1130 case ACODEC_COPY: // copy 1133 case ACODEC_COPY: // copy
1131 len=sh_audio->i_bps/2; 1134 len=mux_a->wf->nAvgBytesPerSec/2;
1132 len/=mux_a->h.dwSampleSize;if(len<1) len=1; 1135 len/=mux_a->h.dwSampleSize;if(len<1) len=1;
1133 len*=mux_a->h.dwSampleSize; 1136 len*=mux_a->h.dwSampleSize;
1134 len=demux_read_data(sh_audio->ds,mux_a->buffer,len); 1137 len=demux_read_data(sh_audio->ds,mux_a->buffer,len);
1135 break; 1138 break;
1136 case ACODEC_PCM: 1139 case ACODEC_PCM:
1358 // A-V sync! 1361 // A-V sync!
1359 if(pts_from_bps){ 1362 if(pts_from_bps){
1360 unsigned int samples=(sh_audio->audio.dwSampleSize)? 1363 unsigned int samples=(sh_audio->audio.dwSampleSize)?
1361 ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) : 1364 ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
1362 (d_audio->pack_no); // <- used for VBR audio 1365 (d_audio->pack_no); // <- used for VBR audio
1366 printf("samples=%d \n",samples);
1363 a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate; 1367 a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
1364 delay_corrected=1; 1368 delay_corrected=1;
1365 } else { 1369 } else {
1366 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) 1370 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
1367 a_pts=d_audio->pts; 1371 a_pts=d_audio->pts;