[MPlayer-cvslog] CVS: main/libmpdemux demux_mov.c,1.134,1.135

Corey Hickey syncmail at mplayerhq.hu
Mon Jan 2 07:56:25 CET 2006


CVS change done by Corey Hickey

Update of /cvsroot/mplayer/main/libmpdemux
In directory mail:/var2/tmp/cvs-serv10682/libmpdemux

Modified Files:
	demux_mov.c 
Log Message:
Partial support for QuickTime sound atom version 2.

This doesn't add support for parsing the sound atom itself, but does
recognize the different offset at which the ESDS atom starts. Also,
this patch supports "3" in the channels field, which indicates
6-channel (5.1) audio. For more information, see this mail:

From: Corey Hickey <bugfood-ml at fatooh.org>
To: mplayer-dev-eng at mplayerhq.hu
Date: Wed, 28 Dec 2005 23:42:46 -0800
Subject: [PATCH] (partially) support QuickTime sound atom version 2



Index: demux_mov.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mov.c,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -r1.134 -r1.135
--- demux_mov.c	18 Nov 2005 14:39:18 -0000	1.134
+++ demux_mov.c	2 Jan 2006 06:56:22 -0000	1.135
@@ -616,6 +616,7 @@
 		   // ([int32_t size,int32_t type,some data ],repeat)
 		} my_stdata;		  
 #endif		
+		int version, adjust;
 		sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
 		sh->format=trak->fourcc;
 
@@ -663,8 +664,27 @@
 //      36  char[]  	atom data (len=size-8)
 
 // TODO: fix parsing for files using version 2.
+		version=char2short(trak->stdata,8);
+		if (version > 1)
+		  mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: version %d sound atom may not parse correctly!\n", version);
 		trak->samplebytes=sh->samplesize=char2short(trak->stdata,18)/8;
-		trak->nchannels=sh->channels=char2short(trak->stdata,16);
+
+		/* I can't find documentation, but so far this is the case. -Corey */
+		switch (char2short(trak->stdata,16)) {
+		  case 1:
+		    trak->nchannels = 1; break;
+		  case 2:
+		    trak->nchannels = 2; break;
+		  case 3:
+		    trak->nchannels = 6; break;
+		  default:
+		    mp_msg(MSGT_DEMUX, MSGL_WARN,
+			"MOV: unable to determine audio channels, assuming 2 (got %d)\n",
+			char2short(trak->stdata,16));
+		    trak->nchannels = 2;
+		}
+		sh->channels = trak->nchannels;
+
 		/*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,
@@ -720,10 +740,18 @@
 		  }
 		}
 
-		if ((trak->stdata[9] == 0 && trak->stdata_len >= 36) ||
-		    (trak->stdata[9] == 1 && trak->stdata_len >= 36 + 48)) {
-		    // version 0 with extra atoms
-        int adjust = (trak->stdata[9]==1)?48:0;
+		switch (version) {
+		  case 0:
+		    adjust =  0; break;
+		  case 1:
+		    adjust = 48; break;
+		  case 2:
+		    adjust = 68; break;
+		  default:
+		    mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: unknown sound atom version (%d); may not work!\n", version);
+		    adjust = 68;
+		}
+		if (trak->stdata_len >= 36 + adjust) {
 		    int atom_len = char2int(trak->stdata,28+adjust);
 		    switch(char2int(trak->stdata,32+adjust)) { // atom type
 		      case MOV_FOURCC('e','s','d','s'): {




More information about the MPlayer-cvslog mailing list