Ticket #145: mplayer-amr.diff

File mplayer-amr.diff, 3.2 KB (added by richardv@…, 22 years ago)

3gp playback patch

  • libmpdemux/demux_mov.c

    RCS file: /cvs/mplayer/libmpdemux/demux_mov.c,v
    retrieving revision 1.1.1.1
    retrieving revision 1.2
    diff -u -r1.1.1.1 -r1.2
     
    112112    int duration;    // 0 = variable
    113113    int width,height; // for video
    114114    unsigned int fourcc;
     115    unsigned int nchannels;
     116    unsigned int samplebits; // 1 for bytes, 2 for shorts
    115117    //
    116118    int tkdata_len;  // track data
    117119    unsigned char* tkdata;
    … …  
    863865                sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
    864866                sh->format=trak->fourcc;
    865867
     868                switch( sh->format ) {
     869                    case 0x726D6173: /* samr */
     870                        /* amr narrowband */
     871                        trak->samplebits=sh->samplesize=1;
     872                        trak->nchannels=sh->channels=1;
     873                        sh->samplerate=8000;
     874                        break;
     875                       
     876                    case 0x62776173: /* sawb */
     877                        /* amr wideband */
     878                        trak->samplebits=sh->samplesize=1;
     879                        trak->nchannels=sh->channels=1;
     880                        sh->samplerate=16000;
     881                        break;
     882
     883                    default:
     884                       
    866885// assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit
    867886// XXX: 32bit fixed point numbers (intfp) are only 2 Byte!             
    868887// short values are usually one byte leftpadded by zero         
    … …  
    889908//      32  char[4]     atom type (fourc charater code -> esds)         
    890909//      36  char[]      atom data (len=size-8)
    891910
    892                 sh->samplesize=char2short(trak->stdata,18)/8;
    893                 sh->channels=char2short(trak->stdata,16);
     911                trak->samplebits=sh->samplesize=char2short(trak->stdata,18)/8;
     912                trak->nchannels=sh->channels=char2short(trak->stdata,16);
    894913                /*printf("MOV: timescale: %d samplerate: %d durmap: %d (%d) -> %d (%d)\n",
    895914                    trak->timescale, char2short(trak->stdata,24), trak->durmap[0].dur,
    896915                    trak->durmap[0].num, trak->timescale/trak->durmap[0].dur,
    … …  
    913932                      sh->samplerate = 44100;
    914933                  } 
    915934                } 
    916 
     935                }
    917936                mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d  chans: %d  rate: %d\n",
    918                     trak->stdata[19],trak->stdata[17],sh->samplerate);
     937                    sh->samplesize*8,sh->channels,sh->samplerate);
    919938
    920939                if(trak->stdata_len >= 44 && trak->stdata[9]>=1){
    921940                  mp_msg(MSGT_DEMUX,MSGL_V,"Audio header: samp/pack=%d bytes/pack=%d bytes/frame=%d bytes/samp=%d  \n",
    … …  
    9821001                // Emulate WAVEFORMATEX struct:
    9831002                sh->wf=malloc(sizeof(WAVEFORMATEX));
    9841003                memset(sh->wf,0,sizeof(WAVEFORMATEX));
    985                 sh->wf->nChannels=(trak->stdata[16]<<8)+trak->stdata[17];
     1004                sh->wf->nChannels=sh->channels;
    9861005                sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19];
    9871006                // sh->wf->nSamplesPerSec=trak->timescale;
    9881007                sh->wf->nSamplesPerSec=(trak->stdata[24]<<8)+trak->stdata[25];
    … …  
    16831702            // with missing stsd v1 header containing compression rate
    16841703            x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix  ! HACK !
    16851704        } else {
    1686             x*=(trak->stdata[16]<<8)+trak->stdata[17]; //channels
    1687             x*=(trak->stdata[18]<<8)+trak->stdata[19]; //bits/sample
    1688             x/=8;  // bits/sample
     1705            x*=trak->nchannels;
     1706            x*=trak->samplebits;
    16891707        }
    16901708      }
    16911709      mp_msg(MSGT_DEMUX, MSGL_DBG2, "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts);