From 2c6dfd06a68a84c214350ac8be84cabdf501fb33 Mon Sep 17 00:00:00 2001 From: "roman.artiukhin" Date: Wed, 30 Aug 2023 22:02:25 +0300 Subject: Codecs: mp4: Improve support for long files Reduce lookup_table (seek accuracy) till it fits on device Fixes FS#13049 Change-Id: I934de500a4383e17b82821afa2e0396a27061707 --- lib/rbcodec/codecs/libm4a/demux.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'lib/rbcodec/codecs/libm4a') 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); -- cgit v1.2.3