From 7c8a49dbff219624b764f392e33170befd38f3ab Mon Sep 17 00:00:00 2001 From: Magnus Holmgren Date: Sun, 29 Aug 2010 13:48:29 +0000 Subject: [PATCH] Make M4A demuxer more flexible when handling the stsd atom. Allows file reported in the forum to play. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27938 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libm4a/demux.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/codecs/libm4a/demux.c b/apps/codecs/libm4a/demux.c index 9390f0a2bf..8fc90c8092 100644 --- a/apps/codecs/libm4a/demux.c +++ b/apps/codecs/libm4a/demux.c @@ -172,6 +172,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) int j; uint32_t numentries; size_t size_remaining = chunk_len - 8; + bool got_codec_data = false; /* version */ stream_read_uint8(qtmovie->stream); @@ -185,11 +186,11 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) numentries = stream_read_uint32(qtmovie->stream); size_remaining -= 4; - if (numentries != 1) + /* if (numentries != 1) { DEBUGF("only expecting one entry in sample description atom!\n"); return false; - } + } */ for (i = 0; i < numentries; i++) { @@ -250,6 +251,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) entry_remaining, ((char*)qtmovie->res->codecdata) + 12); entry_remaining -= entry_remaining; + got_codec_data = true; if (entry_remaining) stream_skip(qtmovie->stream, entry_remaining); @@ -284,6 +286,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) DEBUGF("curpos=%ld, j=%d - Skipping %ld bytes\n",qtmovie->stream->ci->curpos,j,j-qtmovie->stream->ci->curpos); stream_skip(qtmovie->stream,j-qtmovie->stream->ci->curpos); } + got_codec_data = true; entry_remaining-=sub_chunk_len; } else { DEBUGF("Error reading esds\n"); @@ -293,13 +296,16 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) DEBUGF("entry_remaining=%ld\n",(long)entry_remaining); stream_skip(qtmovie->stream,entry_remaining); + } else if (qtmovie->res->format==MAKEFOURCC('f','r','e','e')) { + /* Skip "filler" atom */ + stream_skip(qtmovie->stream,entry_remaining); } else { - DEBUGF("expecting 'alac' or 'mp4a' data format, got %c%c%c%c\n", + DEBUGF("expecting 'alac', 'mp4a' or 'free' data format, got %c%c%c%c\n", SPLITFOURCC(qtmovie->res->format)); return false; } } - return true; + return got_codec_data; } static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) -- 2.11.4.GIT