From 5aa0fc3b008e976a0d61a55814666229f2da47c8 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Fri, 1 Apr 2022 11:26:22 +0100 Subject: jpeg: provide a rough estimate of decoder memory overhead JPEG decoding requires additional space in the bitmap buffer beyond what is needed for the decoded pixel data. Provide a way to estimate how much overhead is needed. The actual overhead is sizeof(struct jpeg) + decode_buf_size, where the latter depends on the image size and JPEG encoding used. From my testing decode_buf_size is normally pretty small (under 5 KiB) but looking at the code it could be large in some cases, primarily with large images, so 32 KiB seems to be a decent compromise. Someone who knows better about JPEG should pick a better value if that's too big. Using a constant is obviously not the most accurate but it seems to be the simplest option for retrofitting to existing code. Change-Id: I573b0abb8ca2d79e43f185010487f07226edb793 --- apps/recorder/jpeg_load.c | 11 +++++++++++ apps/recorder/jpeg_load.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/apps/recorder/jpeg_load.c b/apps/recorder/jpeg_load.c index 9ab42b7a9f..5b287aff75 100644 --- a/apps/recorder/jpeg_load.c +++ b/apps/recorder/jpeg_load.c @@ -2228,4 +2228,15 @@ int read_jpeg_fd(int fd, } #endif +const size_t JPEG_DECODE_OVERHEAD = + /* Reserve an arbitrary amount for the decode buffer + * FIXME: Somebody who knows what they're doing should look at this */ + (32 * 1024) +#ifndef JPEG_FROM_MEM + /* Unless the struct jpeg is defined statically, we need to allocate + * it in the bitmap buffer as well */ + + sizeof(struct jpeg) +#endif + ; + /**************** end JPEG code ********************/ diff --git a/apps/recorder/jpeg_load.h b/apps/recorder/jpeg_load.h index 6ff96dabad..129b0fbf19 100644 --- a/apps/recorder/jpeg_load.h +++ b/apps/recorder/jpeg_load.h @@ -32,6 +32,13 @@ #ifndef _JPEG_LOAD_H #define _JPEG_LOAD_H +/* Approximate memory overhead required for JPEG decoding. This memory is + * taken from the bitmap buffer so you must ensure the buffer is big enough + * to contain all decoded pixel data plus decoder overhead, otherwise the + * image cannot be loaded. After the image is loaded this extra memory can + * be freed. */ +extern const size_t JPEG_DECODE_OVERHEAD; + int read_jpeg_file(const char* filename, struct bitmap *bm, int maxsize, -- cgit v1.2.3