summaryrefslogtreecommitdiff
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)
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
305static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) 311static bool read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len)