navidrome/core/ffmpeg
Deluan e918b1278b fix(transcoding): tag the inserted mp3 frame as Info, not Xing
The frame inserted into piped mp3 transcodes carried a Xing tag with only a
frame count. Media3/ExoPlayer, which most Android clients use, builds a
XingSeeker from a Xing tag and reports it seekable only when a seek table is
present, so a cached or downloaded transcode became unseekable there. Without
any frame it would have used constant-bitrate seeking. An Info tag takes Media3
down its constant-bitrate path, now with the declared duration.

Info is also what ffmpeg and LAME write for a CBR file, which is what the
default mp3 profile produces. Checked against the decoders on hand: ffprobe
reports 20.010s either way, Firefox reports 19.998s at loadedmetadata either
way, and decoded audio is unchanged. Apple's AudioToolbox ignores Info frames,
including ffmpeg's own, so it sees the same stream it saw before this series.
2026-09-24 17:16:41 -04:00
..
ffmpeg.go refactor(transcoding): repair piped headers behind one patcher 2026-09-24 17:16:04 -04:00
ffmpeg_test.go fix(transcoding): tag the inserted mp3 frame as Info, not Xing 2026-09-24 17:16:41 -04:00
flac_streaminfo.go refactor(transcoding): repair piped headers behind one patcher 2026-09-24 17:16:04 -04:00
flac_streaminfo_test.go refactor(transcoding): repair piped headers behind one patcher 2026-09-24 17:16:04 -04:00
mp3_xing.go fix(transcoding): tag the inserted mp3 frame as Info, not Xing 2026-09-24 17:16:41 -04:00
mp3_xing_test.go fix(transcoding): tag the inserted mp3 frame as Info, not Xing 2026-09-24 17:16:41 -04:00
piped_header.go refactor(transcoding): repair piped headers behind one patcher 2026-09-24 17:16:04 -04:00