changeset 14279:b4b202086260

Fix channels, sample rate and sample size for 3gp files Patch by Richard van der Hoff [ richardv at mxtelecom dot com ]
author rtognimp
date Wed, 29 Dec 2004 23:26:01 +0000
parents 17dd45302212
children 8631a3803289
files libmpdemux/demux_mov.c
diffstat 1 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mov.c	Wed Dec 29 23:23:46 2004 +0000
+++ b/libmpdemux/demux_mov.c	Wed Dec 29 23:26:01 2004 +0000
@@ -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);