mirror of
https://github.com/mpv-player/mpv
synced 2025-02-14 10:57:32 +00:00
Fix channels, sample rate and sample size for 3gp files
Patch by Richard van der Hoff [ richardv at mxtelecom dot com ] git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14280 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
1aaf2bbabc
commit
dbbe18f450
@ -112,6 +112,8 @@ typedef struct {
|
||||
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 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
|
||||
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 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
|
||||
// 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 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
|
||||
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 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
|
||||
// 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 @@ if(trak->samplesize){
|
||||
// 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);
|
||||
|
Loading…
Reference in New Issue
Block a user