summaryrefslogtreecommitdiffstats
path: root/lib/rbcodec/codecs/libm4a/demux.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libm4a/demux.c')
-rw-r--r--lib/rbcodec/codecs/libm4a/demux.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/lib/rbcodec/codecs/libm4a/demux.c b/lib/rbcodec/codecs/libm4a/demux.c
index 11534da366..ae3c34fde4 100644
--- a/lib/rbcodec/codecs/libm4a/demux.c
+++ b/lib/rbcodec/codecs/libm4a/demux.c
@@ -468,9 +468,25 @@ static bool read_chunk_stco(qtmovie_t *qtmovie, size_t chunk_len)
numentries = stream_read_uint32(qtmovie->stream);
size_remaining -= 4;
-
- qtmovie->res->num_lookup_table = numentries;
- qtmovie->res->lookup_table = malloc(numentries * sizeof(*qtmovie->res->lookup_table));
+
+ uint8_t accuracy_divider = 1;
+ uint32_t fit_numentries = numentries;
+ while (true)
+ {
+ qtmovie->res->lookup_table = malloc(fit_numentries * sizeof(*qtmovie->res->lookup_table));
+
+ if (qtmovie->res->lookup_table)
+ {
+ break;
+ }
+ else
+ {
+ // we failed to alloc memory for lookup table, so reduce seek accuracy and try again
+ fit_numentries = numentries / ++accuracy_divider;
+ }
+ }
+ DEBUGF("lookup_table numentries %d, fit_numentries %d\n", numentries, fit_numentries);
+ qtmovie->res->num_lookup_table = fit_numentries;
if (!qtmovie->res->lookup_table)
{
@@ -518,11 +534,14 @@ static bool read_chunk_stco(qtmovie_t *qtmovie, size_t chunk_len)
frame += (new_first - old_first) * old_frame;
}
frame += (k - old_first) * old_frame;
-
- qtmovie->res->lookup_table[idx].sample = frame;
- qtmovie->res->lookup_table[idx].offset = offset;
- idx++;
-
+
+ if ((k-1) % accuracy_divider == 0)
+ {
+ qtmovie->res->lookup_table[idx].sample = frame;
+ qtmovie->res->lookup_table[idx].offset = offset;
+ idx++;
+ }
+
frame -= (k - old_first) * old_frame;
offset = stream_read_uint32(qtmovie->stream);