summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2010-08-29 13:48:29 +0000
committerMagnus Holmgren <magnushol@gmail.com>2010-08-29 13:48:29 +0000
commit7c8a49dbff219624b764f392e33170befd38f3ab (patch)
tree586ab3f8b4684ded42d1f5315b95f1305add8252
parent8aa175bc1fd303bccd491fc92689f29bdf439094 (diff)
downloadrockbox-7c8a49dbff219624b764f392e33170befd38f3ab.tar.gz
rockbox-7c8a49dbff219624b764f392e33170befd38f3ab.zip
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
-rw-r--r--apps/codecs/libm4a/demux.c14
1 files 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)