perf: drop per-image delay(50) on chapter build, retry getDimensions (#2434)

Co-authored-by: Erica Jensen <erica@mailershaven.com>
This commit is contained in:
hooligan333
2026-07-11 22:23:52 -04:00
committed by GitHub
co-authored by Erica Jensen
parent 6add0b91bc
commit e142e88ce7
@@ -537,14 +537,22 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char*
extractSuccess = self->epub->readItemContentsToStream(resolvedPath, cachedImageFile, 4096); extractSuccess = self->epub->readItemContentsToStream(resolvedPath, cachedImageFile, 4096);
cachedImageFile.flush(); cachedImageFile.flush();
cachedImageFile.close(); cachedImageFile.close();
delay(50); // Give SD card time to sync
} }
if (extractSuccess) { if (extractSuccess) {
// Get image dimensions // Get image dimensions, retrying to absorb SD-card sync latency on slow
// cards. Replaces a blanket delay(50) that cost ~50ms on every image, and
// closes the silent-drop bug where a single getDimensions failure was fatal.
ImageDimensions dims = {0, 0}; ImageDimensions dims = {0, 0};
ImageToFramebufferDecoder* decoder = ImageDecoderFactory::getDecoder(cachedImagePath); ImageToFramebufferDecoder* decoder = ImageDecoderFactory::getDecoder(cachedImagePath);
if (decoder && decoder->getDimensions(cachedImagePath, dims)) { bool gotDimensions = false;
for (int attempt = 0; attempt < 3 && !gotDimensions; attempt++) {
if (attempt > 0) {
delay(50); // Give a slow SD card time to finish syncing before retrying
}
gotDimensions = decoder && decoder->getDimensions(cachedImagePath, dims);
}
if (gotDimensions) {
LOG_DBG("EHP", "Image dimensions: %dx%d", dims.width, dims.height); LOG_DBG("EHP", "Image dimensions: %dx%d", dims.width, dims.height);
int displayWidth = 0; int displayWidth = 0;