1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Magnus Holmgren 2010-08-29 13:48:29 +00:00
parent 8aa175bc1f
commit 7c8a49dbff

View file

@ -172,6 +172,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
int j; int j;
uint32_t numentries; uint32_t numentries;
size_t size_remaining = chunk_len - 8; size_t size_remaining = chunk_len - 8;
bool got_codec_data = false;
/* version */ /* version */
stream_read_uint8(qtmovie->stream); 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); numentries = stream_read_uint32(qtmovie->stream);
size_remaining -= 4; size_remaining -= 4;
if (numentries != 1) /* if (numentries != 1)
{ {
DEBUGF("only expecting one entry in sample description atom!\n"); DEBUGF("only expecting one entry in sample description atom!\n");
return false; return false;
} } */
for (i = 0; i < numentries; i++) for (i = 0; i < numentries; i++)
{ {
@ -250,6 +251,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
entry_remaining, entry_remaining,
((char*)qtmovie->res->codecdata) + 12); ((char*)qtmovie->res->codecdata) + 12);
entry_remaining -= entry_remaining; entry_remaining -= entry_remaining;
got_codec_data = true;
if (entry_remaining) if (entry_remaining)
stream_skip(qtmovie->stream, 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); 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); stream_skip(qtmovie->stream,j-qtmovie->stream->ci->curpos);
} }
got_codec_data = true;
entry_remaining-=sub_chunk_len; entry_remaining-=sub_chunk_len;
} else { } else {
DEBUGF("Error reading esds\n"); 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); DEBUGF("entry_remaining=%ld\n",(long)entry_remaining);
stream_skip(qtmovie->stream,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 { } 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)); SPLITFOURCC(qtmovie->res->format));
return false; return false;
} }
} }
return true; return got_codec_data;
} }
static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len)