summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mov.c
diff options
context:
space:
mode:
authoratmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-24 02:25:41 +0000
committeratmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-24 02:25:41 +0000
commit086814f29412aac40b43a35e807a76090f2f500c (patch)
tree896534f281478e6821b6bfd2a47b52f037fb3b21 /libmpdemux/demux_mov.c
parent52457a7c61c17b7d098df8b7c6cf0c24aec782ad (diff)
downloadmpv-086814f29412aac40b43a35e807a76090f2f500c.tar.bz2
mpv-086814f29412aac40b43a35e807a76090f2f500c.tar.xz
Improved MP4 parsing (finally)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5302 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_mov.c')
-rw-r--r--libmpdemux/demux_mov.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index 8433f33116..b698faa5f0 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -30,6 +30,7 @@
#include "bswap.h"
#include "qtpalette.h"
+#include "parse_mp4.h" // MP3 specific stuff
#ifdef HAVE_ZLIB
#include <zlib.h>
@@ -40,8 +41,14 @@
#define BE_16(x) (be2me_16(*(unsigned short *)(x)))
#define BE_32(x) (be2me_32(*(unsigned int *)(x)))
+#ifndef WORDS_BIGENDIAN
#define char2short(x,y) ((x[y]<<8)|x[y+1])
#define char2int(x,y) ((x[y]<<24)|(x[y+1]<<16)|(x[y+2]<<8)|x[y+3])
+#else
+#warning Check the implementation of char2short and char2int on BIGENDIAN!!!
+#define char2short(x,y) (x[y]|(x[y+1]<<8))
+#define char2int(x,y) (x[y]|(x[y+1]<<8)|(x[y+2]<<16)|(x[y+3]<<24))
+#endif
typedef struct {
unsigned int pts; // duration
@@ -671,7 +678,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
trak->durmap[0].num, trak->timescale/trak->durmap[0].dur,
char2short(trak->stdata,24)/trak->durmap[0].dur);*/
sh->samplerate=char2short(trak->stdata,24);
- if((sh->samplerate < 8000) && trak->durmap) {
+ if((sh->samplerate < 7000) && trak->durmap) {
switch(char2short(trak->stdata,24)/trak->durmap[0].dur) {
// TODO: add more cases.
case 31:
@@ -696,13 +703,26 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak
if((trak->stdata[9]==0) && trak->stdata_len >= 36) { // version 0 with extra atoms
int atom_len = char2int(trak->stdata,28);
switch(char2int(trak->stdata,32)) { // atom type
- case MOV_FOURCC('e','s','d','s'):
+ case MOV_FOURCC('e','s','d','s'): {
+ esds_t *esds;
mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: Found MPEG4 audio Elementary Stream Descriptor atom (%d)!\n", atom_len);
- if(atom_len >= 28)
- mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio compressed datarate: %dkbit/s\n",
- char2int(trak->stdata,62)/1000);
- sh->i_bps=char2int(trak->stdata,62)/8;
- break;
+ if(atom_len >= 8) {
+ if(!mp4_parse_esds(&trak->stdata[36], atom_len-8, esds)) {
+
+ sh->i_bps = esds->avgBitrate/8;
+
+ // dump away the codec specific configuration for the AAC decoder
+ sh->codecdata_len = esds->decoderConfigLen;
+ sh->codecdata = (unsigned char *)malloc(sh->codecdata_len);
+ memcpy(sh->codecdata, esds->decoderConfig, sh->codecdata_len);
+ }
+#if 0
+ { FILE* f=fopen("esds.dat","wb");
+ fwrite(&trak->stdata[36],atom_len-8,1,f);
+ fclose(f); }
+#endif
+ }
+ } break;
default:
mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: Found unknown audio atom %c%c%c%c (%d)!\n",
trak->stdata[32],trak->stdata[33],trak->stdata[34],trak->stdata[35],