# HG changeset patch # User corey # Date 1136184982 0 # Node ID 4fea216307d215b4261dbf93e2e261a22f0a9252 # Parent a9782d8c562ffa582b5eb07f028ffa44b7863747 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 To: mplayer-dev-eng@mplayerhq.hu Date: Wed, 28 Dec 2005 23:42:46 -0800 Subject: [PATCH] (partially) support QuickTime sound atom version 2 diff -r a9782d8c562f -r 4fea216307d2 libmpdemux/demux_mov.c --- a/libmpdemux/demux_mov.c Mon Jan 02 02:02:57 2006 +0000 +++ b/libmpdemux/demux_mov.c Mon Jan 02 06:56:22 2006 +0000 @@ -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'): {