Seeking doesn't work well in M4A files with very few chunks due to
the seek method used (chunk based using the info in the 'stco' atom).
According to libm4a/demux.c the expected seek resolution using this
method is 1/4 to 1/2 seconds. However, ffmpeg generates files with a
1 megabyte chunk size, so the resolution is much worse than expected
on some files: around 30-40 seconds at 256kbps.
There was a bug with the seek position reported back to Rockbox: the
codec pretended it could seek exactly to the requested sample, but it
would only seek to the start of a chunk. This could leave the UI in a
confusing state because the real playback position was different from
what the elapsed time showed. Fix this by recalculating the reported
sample position using the chunk start.
To fix the low seek accuracy, use the table in the 'stsz' atom to skip
individual packets within a chunk. This is very accurate, but it takes
a lot of RAM to allocate the table. Currently the table is not allowed
to use more than half of the codec RAM, which should suffice for short
files on most targets. On files where the table is too large the codec
will fall back to the less accurate chunk-based seek method.
Change-Id: Ide38ea846c1cdd69691e9b1e1cd87eb0fa11cf78
These operations can only be used in limited circumstances and have
exactly one user. bufgettail especially seems of dubious value; how
often do you need to read N bytes from the end of a file without
changing the file position?
strip_tags() was the only function using them, to strip off ID3v1
and APE tags off the end of buffered tracks. This would save only
32-192 bytes per track -- if the container format uses APE/ID3v1.
It hardly seems worth the effort.
Change-Id: I8fc3c1408517eda6126e75e76d76daea904b50eb
Left shifts are not defined in C if they would cause signed overflow,
so these expressions get instrumented, which makes them unusable as
switch values and triggers compile errors when compiling with UBSan.
Change-Id: I0588d4be1e00ba1cfde0eac119ead368b20d10c9
decrease size hit of initializing asf by using a union
remove init from bytes LE conversion in metadata common
-- bad idea for performance
Change-Id: I4514adc125e5da2b99d9f913ba74afd5f1345822
fix bugs introduced in the switch over to using string_option
instead of if else strcmp trees,
embedded album art should work again
skin parser had an error for 'noborder' and 'nobar'
Change-Id: I957d81e5fa8467b33bbd93d63c4428c36100acca
didn't set the genre string to null on case entry
means read failure would leave genre string indeterminate
add explicit NULL & leave genre uninitialized
Change-Id: I1452a0b57985646c982ec80755d0df9d03745f1e
* direct use of memcpy() instead of ci->memcpy() in flac and mod
* uninitialized variable in mpegplayer
Change-Id: I2d08682d5f66c319780e69e3ff63d600c61d8f5a
Encountered a file with ~600K of ID3v1 headers.
Optimize the potential overhead by minimizing reverse seeks.
Change-Id: I972dbf1af1c36659f19c7ab4eed0b9149c642880
The old code would seek forward by the frame length, expecting to see a
frame header there, perform a validity check, and then seek back to the
current header.
Unfortunately this doesn't handle situations where there is extra padding
between the frames, leading us to potentially read garbage, causing the
validity tests to fail and rejecting the file outright.
Instead, keep track of the previous valid header/position, and if we find
"valid" headers in a row return the first after seeking back to it.
This change allows the file referenced in FS13299 to be properly parsed, but
further work is needed to get the file to be playable. (file reports itself
as layer 1, variable bit rate, variable sample rate!)
Change-Id: I85f61a6360cc041a172db4b7a6b5516e5b60ceee
As per multiple user requests:
https://forums.rockbox.org/index.php/topic,53319.msg
The acceptable size for id3v2 fields currently maxes out at
240 bytes on targets with more than 2MB of memory.
The comments field, especially for Podcasts, can sometimes
contain significantly more characters than Rockbox allows.
The limit for devices with more than 8MB of memory
is increased to 500 bytes for individual fields, and
to 1800 bytes for the buffer containing all fields.
Change-Id: I4593372229158756f102f67bcc4a43e64f632d58
Since that encompasses _all_ of our native targets in a post-archos world,
either replace it with #if (CONFIG_PLATFORM & PLATFORM_NATIVE) or
delete it altogher as appropriate.
Change-Id: I9128a456e850d5c96a9e05806aad3acd923f90c5
Some flac encoded files contain junk that our decoder
picked up
upstream has some sign and overflow fixes too
Change-Id: I5857b2fe56906a48f04944cdfee8fe2306f2c3fd
I think the assumption is that during playback, the DSP is already running
so it assumes PBE needs to be flushed before it is properly enabled.
Change-Id: I2bac3d02c80f97c8d9ce26a575175f6344a8e86a