diff options
author | Magnus Holmgren <magnushol@gmail.com> | 2010-08-29 13:48:29 +0000 |
---|---|---|
committer | Magnus Holmgren <magnushol@gmail.com> | 2010-08-29 13:48:29 +0000 |
commit | 7c8a49dbff219624b764f392e33170befd38f3ab (patch) | |
tree | 586ab3f8b4684ded42d1f5315b95f1305add8252 /apps/codecs/libm4a | |
parent | 8aa175bc1fd303bccd491fc92689f29bdf439094 (diff) | |
download | rockbox-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
Diffstat (limited to 'apps/codecs/libm4a')
-rw-r--r-- | apps/codecs/libm4a/demux.c | 14 |
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) | |||
172 | int j; | 172 | int j; |
173 | uint32_t numentries; | 173 | uint32_t numentries; |
174 | size_t size_remaining = chunk_len - 8; | 174 | size_t size_remaining = chunk_len - 8; |
175 | bool got_codec_data = false; | ||
175 | 176 | ||
176 | /* version */ | 177 | /* version */ |
177 | stream_read_uint8(qtmovie->stream); | 178 | stream_read_uint8(qtmovie->stream); |
@@ -185,11 +186,11 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
185 | numentries = stream_read_uint32(qtmovie->stream); | 186 | numentries = stream_read_uint32(qtmovie->stream); |
186 | size_remaining -= 4; | 187 | size_remaining -= 4; |
187 | 188 | ||
188 | if (numentries != 1) | 189 | /* if (numentries != 1) |
189 | { | 190 | { |
190 | DEBUGF("only expecting one entry in sample description atom!\n"); | 191 | DEBUGF("only expecting one entry in sample description atom!\n"); |
191 | return false; | 192 | return false; |
192 | } | 193 | } */ |
193 | 194 | ||
194 | for (i = 0; i < numentries; i++) | 195 | for (i = 0; i < numentries; i++) |
195 | { | 196 | { |
@@ -250,6 +251,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
250 | entry_remaining, | 251 | entry_remaining, |
251 | ((char*)qtmovie->res->codecdata) + 12); | 252 | ((char*)qtmovie->res->codecdata) + 12); |
252 | entry_remaining -= entry_remaining; | 253 | entry_remaining -= entry_remaining; |
254 | got_codec_data = true; | ||
253 | 255 | ||
254 | if (entry_remaining) | 256 | if (entry_remaining) |
255 | stream_skip(qtmovie->stream, entry_remaining); | 257 | stream_skip(qtmovie->stream, entry_remaining); |
@@ -284,6 +286,7 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
284 | DEBUGF("curpos=%ld, j=%d - Skipping %ld bytes\n",qtmovie->stream->ci->curpos,j,j-qtmovie->stream->ci->curpos); | 286 | DEBUGF("curpos=%ld, j=%d - Skipping %ld bytes\n",qtmovie->stream->ci->curpos,j,j-qtmovie->stream->ci->curpos); |
285 | stream_skip(qtmovie->stream,j-qtmovie->stream->ci->curpos); | 287 | stream_skip(qtmovie->stream,j-qtmovie->stream->ci->curpos); |
286 | } | 288 | } |
289 | got_codec_data = true; | ||
287 | entry_remaining-=sub_chunk_len; | 290 | entry_remaining-=sub_chunk_len; |
288 | } else { | 291 | } else { |
289 | DEBUGF("Error reading esds\n"); | 292 | DEBUGF("Error reading esds\n"); |
@@ -293,13 +296,16 @@ static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) | |||
293 | DEBUGF("entry_remaining=%ld\n",(long)entry_remaining); | 296 | DEBUGF("entry_remaining=%ld\n",(long)entry_remaining); |
294 | stream_skip(qtmovie->stream,entry_remaining); | 297 | stream_skip(qtmovie->stream,entry_remaining); |
295 | 298 | ||
299 | } else if (qtmovie->res->format==MAKEFOURCC('f','r','e','e')) { | ||
300 | /* Skip "filler" atom */ | ||
301 | stream_skip(qtmovie->stream,entry_remaining); | ||
296 | } else { | 302 | } else { |
297 | DEBUGF("expecting 'alac' or 'mp4a' data format, got %c%c%c%c\n", | 303 | DEBUGF("expecting 'alac', 'mp4a' or 'free' data format, got %c%c%c%c\n", |
298 | SPLITFOURCC(qtmovie->res->format)); | 304 | SPLITFOURCC(qtmovie->res->format)); |
299 | return false; | 305 | return false; |
300 | } | 306 | } |
301 | } | 307 | } |
302 | return true; | 308 | return got_codec_data; |
303 | } | 309 | } |
304 | 310 | ||
305 | static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) | 311 | static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) |