diff options
Diffstat (limited to 'apps/codecs/libm4a')
-rw-r--r-- | apps/codecs/libm4a/demux.c | 20 | ||||
-rw-r--r-- | apps/codecs/libm4a/m4a.c | 7 | ||||
-rw-r--r-- | apps/codecs/libm4a/m4a.h | 1 |
3 files changed, 18 insertions, 10 deletions
diff --git a/apps/codecs/libm4a/demux.c b/apps/codecs/libm4a/demux.c index 00fd3132aa..9f887b6b83 100644 --- a/apps/codecs/libm4a/demux.c +++ b/apps/codecs/libm4a/demux.c | |||
@@ -746,7 +746,10 @@ int qtmovie_read(stream_t *file, demux_res_t *demux_res) | |||
746 | chunk_len = stream_read_uint32(qtmovie.stream); | 746 | chunk_len = stream_read_uint32(qtmovie.stream); |
747 | if (stream_eof(qtmovie.stream)) | 747 | if (stream_eof(qtmovie.stream)) |
748 | { | 748 | { |
749 | return 0; | 749 | if(qtmovie.res->mdat_offset == 0 || qtmovie.res->format == 0) |
750 | return 0; | ||
751 | stream_seek(qtmovie.stream, qtmovie.res->mdat_offset); | ||
752 | return 1; | ||
750 | } | 753 | } |
751 | 754 | ||
752 | if (chunk_len == 1) | 755 | if (chunk_len == 1) |
@@ -767,20 +770,19 @@ int qtmovie_read(stream_t *file, demux_res_t *demux_res) | |||
767 | return 0; | 770 | return 0; |
768 | } | 771 | } |
769 | break; | 772 | break; |
770 | /* once we hit mdat we stop reading and return. | ||
771 | * this is on the assumption that there is no furhter interesting | ||
772 | * stuff in the stream. if there is stuff will fail (:()). | ||
773 | * But we need the read pointer to be at the mdat stuff | ||
774 | * for the decoder. And we don't want to rely on fseek/ftell, | ||
775 | * as they may not always be avilable */ | ||
776 | case MAKEFOURCC('m','d','a','t'): | 773 | case MAKEFOURCC('m','d','a','t'): |
777 | read_chunk_mdat(&qtmovie, chunk_len); | 774 | read_chunk_mdat(&qtmovie, chunk_len); |
778 | /* Keep track of start of stream in file - used for seeking */ | 775 | /* Keep track of start of stream in file - used for seeking */ |
779 | qtmovie.res->mdat_offset=stream_tell(qtmovie.stream); | 776 | qtmovie.res->mdat_offset=stream_tell(qtmovie.stream); |
780 | /* There can be empty mdats before the real one. If so, skip them */ | 777 | /* There can be empty mdats before the real one. If so, skip them */ |
781 | if (qtmovie.res->mdat_len > 0) { | 778 | if (qtmovie.res->mdat_len == 0) |
779 | break; | ||
780 | /* If we've already seen the format, assume there's nothing | ||
781 | interesting after the mdat chunk (the file is "streamable"). | ||
782 | This avoids having to seek, which might cause rebuffering. */ | ||
783 | if(qtmovie.res->format > 0) | ||
782 | return 1; | 784 | return 1; |
783 | } | 785 | stream_skip(qtmovie.stream, chunk_len - 8); |
784 | break; | 786 | break; |
785 | 787 | ||
786 | /* these following atoms can be skipped !!!! */ | 788 | /* these following atoms can be skipped !!!! */ |
diff --git a/apps/codecs/libm4a/m4a.c b/apps/codecs/libm4a/m4a.c index 92e619db35..42295e76ee 100644 --- a/apps/codecs/libm4a/m4a.c +++ b/apps/codecs/libm4a/m4a.c | |||
@@ -103,7 +103,12 @@ uint8_t stream_read_uint8(stream_t *stream) | |||
103 | 103 | ||
104 | void stream_skip(stream_t *stream, size_t skip) | 104 | void stream_skip(stream_t *stream, size_t skip) |
105 | { | 105 | { |
106 | stream->ci->advance_buffer(skip); | 106 | stream->ci->advance_buffer(skip); |
107 | } | ||
108 | |||
109 | void stream_seek(stream_t *stream, size_t offset) | ||
110 | { | ||
111 | stream->ci->seek_buffer(offset); | ||
107 | } | 112 | } |
108 | 113 | ||
109 | int stream_eof(stream_t *stream) | 114 | int stream_eof(stream_t *stream) |
diff --git a/apps/codecs/libm4a/m4a.h b/apps/codecs/libm4a/m4a.h index e2d4376d12..066f54b722 100644 --- a/apps/codecs/libm4a/m4a.h +++ b/apps/codecs/libm4a/m4a.h | |||
@@ -113,6 +113,7 @@ int8_t stream_read_int8(stream_t *stream); | |||
113 | uint8_t stream_read_uint8(stream_t *stream); | 113 | uint8_t stream_read_uint8(stream_t *stream); |
114 | 114 | ||
115 | void stream_skip(stream_t *stream, size_t skip); | 115 | void stream_skip(stream_t *stream, size_t skip); |
116 | void stream_seek(stream_t *stream, size_t offset); | ||
116 | 117 | ||
117 | int stream_eof(stream_t *stream); | 118 | int stream_eof(stream_t *stream); |
118 | 119 | ||