[MPlayer-cvslog] CVS: main/libmpdemux demux_mov.c,1.111,1.112
Roberto Togni CVS
syncmail at mplayerhq.hu
Thu Dec 30 00:26:03 CET 2004
CVS change done by Roberto Togni CVS
Update of /cvsroot/mplayer/main/libmpdemux
In directory mail:/var2/tmp/cvs-serv15835/libmpdemux
Modified Files:
demux_mov.c
Log Message:
Fix channels, sample rate and sample size for 3gp files
Patch by Richard van der Hoff [ richardv at mxtelecom dot com ]
Index: demux_mov.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mov.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -r1.111 -r1.112
--- demux_mov.c 21 Dec 2004 12:27:38 -0000 1.111
+++ demux_mov.c 29 Dec 2004 23:26:01 -0000 1.112
@@ -112,6 +112,8 @@
int duration; // 0 = variable
int width,height; // for video
unsigned int fourcc;
+ unsigned int nchannels;
+ unsigned int samplebytes;
//
int tkdata_len; // track data
unsigned char* tkdata;
@@ -866,6 +868,23 @@
sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
sh->format=trak->fourcc;
+ switch( sh->format ) {
+ case 0x726D6173: /* samr */
+ /* amr narrowband */
+ trak->samplebytes=sh->samplesize=1;
+ trak->nchannels=sh->channels=1;
+ sh->samplerate=8000;
+ break;
+
+ case 0x62776173: /* sawb */
+ /* amr wideband */
+ trak->samplebytes=sh->samplesize=1;
+ trak->nchannels=sh->channels=1;
+ sh->samplerate=16000;
+ break;
+
+ default:
+
// assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit
// XXX: 32bit fixed point numbers (intfp) are only 2 Byte!
// short values are usually one byte leftpadded by zero
@@ -892,8 +911,8 @@
// 32 char[4] atom type (fourc charater code -> esds)
// 36 char[] atom data (len=size-8)
- sh->samplesize=char2short(trak->stdata,18)/8;
- sh->channels=char2short(trak->stdata,16);
+ trak->samplebytes=sh->samplesize=char2short(trak->stdata,18)/8;
+ trak->nchannels=sh->channels=char2short(trak->stdata,16);
/*printf("MOV: timescale: %d samplerate: %d durmap: %d (%d) -> %d (%d)\n",
trak->timescale, char2short(trak->stdata,24), trak->durmap[0].dur,
trak->durmap[0].num, trak->timescale/trak->durmap[0].dur,
@@ -916,9 +935,9 @@
sh->samplerate = 44100;
}
}
-
+ }
mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d chans: %d rate: %d\n",
- trak->stdata[19],trak->stdata[17],sh->samplerate);
+ sh->samplesize*8,sh->channels,sh->samplerate);
if(trak->stdata_len >= 44 && trak->stdata[9]>=1){
mp_msg(MSGT_DEMUX,MSGL_V,"Audio header: samp/pack=%d bytes/pack=%d bytes/frame=%d bytes/samp=%d \n",
@@ -985,7 +1004,7 @@
// Emulate WAVEFORMATEX struct:
sh->wf=malloc(sizeof(WAVEFORMATEX));
memset(sh->wf,0,sizeof(WAVEFORMATEX));
- sh->wf->nChannels=(trak->stdata[16]<<8)+trak->stdata[17];
+ sh->wf->nChannels=sh->channels;
sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19];
// sh->wf->nSamplesPerSec=trak->timescale;
sh->wf->nSamplesPerSec=(trak->stdata[24]<<8)+trak->stdata[25];
@@ -1748,9 +1767,8 @@
// with missing stsd v1 header containing compression rate
x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK !
} else {
- x*=(trak->stdata[16]<<8)+trak->stdata[17]; //channels
- x*=(trak->stdata[18]<<8)+trak->stdata[19]; //bits/sample
- x/=8; // bits/sample
+ x*=trak->nchannels;
+ x*=trak->samplebytes;
}
}
mp_msg(MSGT_DEMUX, MSGL_DBG2, "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts);
More information about the MPlayer-cvslog
mailing list