[Mplayer-cvslog] CVS: main/libmpdemux demux_mov.c,1.40,1.41

Atmosfear atmos4 at mplayer.dev.hu
Tue Mar 19 22:48:58 CET 2002


Update of /cvsroot/mplayer/main/libmpdemux
In directory mplayer:/var/tmp.root/cvs-serv31523/libmpdemux

Modified Files:
	demux_mov.c 
Log Message:
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header

Index: demux_mov.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mov.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- demux_mov.c	15 Mar 2002 15:57:57 -0000	1.40
+++ demux_mov.c	19 Mar 2002 21:48:55 -0000	1.41
@@ -562,9 +562,37 @@
 	    mov_build_index(trak);
 	    switch(trak->type){
 	    case MOV_TRAK_AUDIO: {
+#if 0				   
+		struct {
+		   int16_t version;		// 0 or 1 (version 1 is qt3.0+)
+		   int16_t revision;		// 0
+		   int32_t vendor_id;		// 0
+		   int16_t channels;		// 1 or 2  (Mono/Stereo)
+		   int16_t samplesize;		// 8 or 16 (8Bit/16Bit)	
+		   int16_t compression_id;	// if version 0 then 0
+		  				// if version 1 and vbr then -2 else 0
+		   int16_t packet_size;		// 0
+		   uint32_t sample_rate;	// samplerate (Hz)
+		   // qt3.0+ (version == 1)
+		   uint32_t samples_per_packet;	// 0 or num uncompressed samples in a packet
+		   				// if 0 below three values are also 0
+		   uint32_t bytes_per_packet;	// 0 or num compressed bytes for one channel
+		   uint32_t bytes_per_frame;	// 0 or num compressed bytes for all channels
+		   				// (channels * bytes_per_packet)
+		   uint32_t bytes_per_sample;	// 0 or size of uncompressed sample
+		   // if samples_per_packet and bytes_per_packet are constant (CBR)
+		   // then bytes_per_frame and bytes_per_sample must be 0 (else is VBR)
+		   // ---
+		   // optional additional atom-based fields
+		   // ([int32_t size,int32_t type,some data ],repeat)
+		} my_stdata;		  
+#endif		
 		sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
 		sh->format=trak->fourcc;
 
+// assumptions for below table: short is 16bit, int is 32bit		
+// short values are usually one byte leftpadded by zero		
+//   int values are usually two byte leftpadded by zero		
 //  stdata[]:
 //	8   short	version
 //	10  short	revision
@@ -579,8 +607,48 @@
 //	32  int		bytes_per_packet
 //	36  int		bytes_per_frame
 //	40  int		bytes_per_sample
+// my recoveries from .mp4 files with correct index (counting from 0):
+// it's always start with padding/real start		
+//    8/ 9  short	version	
+//   10/11  short	revision	
+//   12/14  int		vendor_id	
+//   16/17  short	channels
+//   18/19  short	samplesize
+//   20/21  short	compression_id		
+//   22/23  short	packet_size (XXX: this overlaps with sample_rate ?)		
+//   22/24  int		sample_rate		
+// esds atom:
+//   28/31  int		atom size (bytes of int size, int type and data)
+//   32/32  int		atom type (fourc charater code -> esds)		
+//   62/63  int  	compressed datarate (Bits)
 
-		mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d  chans: %d\n",trak->stdata[19],trak->stdata[17]);
+#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])
+
+		sh->samplesize=char2short(trak->stdata,18)/8;
+		sh->channels=char2short(trak->stdata,16);
+		sh->samplerate=char2short(trak->stdata,24);
+
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d  chans: %d\n",
+		    trak->stdata[19],trak->stdata[17]);
+		mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio sample rate: %d\n",
+		    char2short(trak->stdata,24));
+		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'):
+			mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: MP4 esds audio atom found (%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;
+		      default:
+			mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: unknown audio atom %c%c%c%c found (%d)!\n",
+			    trak->stdata[32],trak->stdata[33],trak->stdata[34],trak->stdata[35],
+			    atom_len);
+		    }
+		}  
 		mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s\n",&trak->fourcc);
 #if 0
 		{ FILE* f=fopen("stdata.dat","wb");




More information about the MPlayer-cvslog mailing list