Mercurial > mplayer.hg
comparison libmpdemux/demux_mov.c @ 2543:a28b5e54f5a6
cbr audio fix
author | arpi |
---|---|
date | Mon, 29 Oct 2001 21:25:10 +0000 |
parents | 146854180531 |
children | fd48f0d813b6 |
comparison
equal
deleted
inserted
replaced
2542:146854180531 | 2543:a28b5e54f5a6 |
---|---|
422 case MOV_TRAK_AUDIO: { | 422 case MOV_TRAK_AUDIO: { |
423 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); | 423 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); |
424 sh->format=trak->fourcc; | 424 sh->format=trak->fourcc; |
425 mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d chans: %d\n",trak->stdata[19],trak->stdata[17]); | 425 mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d chans: %d\n",trak->stdata[19],trak->stdata[17]); |
426 mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s\n",&trak->fourcc); | 426 mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s\n",&trak->fourcc); |
427 #if 0 | |
428 { FILE* f=fopen("stdata.dat","wb"); | |
429 fwrite(trak->stdata,trak->stdata_len,1,f); | |
430 fclose(f); } | |
431 { FILE* f=fopen("tkdata.dat","wb"); | |
432 fwrite(trak->tkdata,trak->tkdata_len,1,f); | |
433 fclose(f); } | |
434 #endif | |
427 // Emulate WAVEFORMATEX struct: | 435 // Emulate WAVEFORMATEX struct: |
428 sh->wf=malloc(sizeof(WAVEFORMATEX)); | 436 sh->wf=malloc(sizeof(WAVEFORMATEX)); |
429 memset(sh->wf,0,sizeof(WAVEFORMATEX)); | 437 memset(sh->wf,0,sizeof(WAVEFORMATEX)); |
430 sh->wf->nChannels=trak->stdata[17]; | 438 sh->wf->nChannels=(trak->stdata[16]<<8)+trak->stdata[17]; |
431 sh->wf->wBitsPerSample=trak->stdata[19]; | 439 sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19]; |
432 sh->wf->nSamplesPerSec=trak->timescale; | 440 // sh->wf->nSamplesPerSec=trak->timescale; |
433 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*((sh->wf->wBitsPerSample+7)/8)*sh->wf->nSamplesPerSec; | 441 sh->wf->nSamplesPerSec=(trak->stdata[24]<<8)+trak->stdata[25]; |
442 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8; | |
434 // Selection: | 443 // Selection: |
435 if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){ | 444 if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){ |
436 // (auto)selected audio track: | 445 // (auto)selected audio track: |
437 demuxer->audio->id=priv->track_db; | 446 demuxer->audio->id=priv->track_db; |
438 demuxer->audio->sh=sh; sh->ds=demuxer->audio; | 447 demuxer->audio->sh=sh; sh->ds=demuxer->audio; |
695 // read chunk: | 704 // read chunk: |
696 int x; | 705 int x; |
697 if(trak->pos>=trak->chunks_size) return 0; // EOF | 706 if(trak->pos>=trak->chunks_size) return 0; // EOF |
698 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos); | 707 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos); |
699 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; | 708 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; |
700 x=trak->chunks[trak->pos].size*trak->samplesize; | 709 x=trak->chunks[trak->pos].size; |
701 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix | 710 // x=trak->chunks[trak->pos].size*trak->samplesize; |
711 if(trak->samplesize!=1) printf("WARNING! Samplesize=%d \n",trak->samplesize); | |
712 if(trak->stdata_len>=36){ | |
713 // extended stsd header - works for CBR MP3: | |
714 x/=(trak->stdata[30]<<8)+trak->stdata[31]; // samples/packet | |
715 // x*=(trak->stdata[34]<<8)+trak->stdata[35]; // bytes/packet | |
716 x*=(trak->stdata[38]<<8)+trak->stdata[39]; // bytes/frame | |
717 } else { | |
718 // works for ima4: -- we should find this info in mov headers! | |
719 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK ! | |
720 // x*=(trak->stdata[18]<<8)+trak->stdata[19];x/=8; // bits/sample | |
721 | |
722 } | |
702 ds_read_packet(ds,demuxer->stream,x,pts,trak->chunks[trak->pos].pos,0); | 723 ds_read_packet(ds,demuxer->stream,x,pts,trak->chunks[trak->pos].pos,0); |
703 if(ds==demuxer->audio) mp_msg(MSGT_DEMUX, MSGL_DBG2, "sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts); | 724 if(ds==demuxer->audio) mp_msg(MSGT_DEMUX, MSGL_DBG2, "sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts); |
704 } else { | 725 } else { |
705 // read sample: | 726 // read sample: |
706 if(trak->pos>=trak->samples_size) return 0; // EOF | 727 if(trak->pos>=trak->samples_size) return 0; // EOF |