imlib/framebuffer: Support dynamic frame buffers.

Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
This commit is contained in:
iabdalkader 2025-05-18 16:38:27 +03:00
parent acc5edb0fc
commit 2913d78182
2 changed files with 27 additions and 14 deletions

View File

@ -42,26 +42,28 @@ extern char _jpeg_memory_end;
jpegbuffer_t *jpegbuffer = (jpegbuffer_t *) &_jpeg_memory_start;
void framebuffer_init0() {
// Save fb_enabled flag state
// Save enable flag.
int fb_enabled = jpegbuffer->enabled;
uint32_t fb_size = (char *) &_fb_memory_end - (char *) framebuffer->data;
// Clear framebuffers
memset(framebuffer, 0, sizeof(*framebuffer));
// Initialize frame buffer.
framebuffer_init_fb(framebuffer, fb_size, false);
// Initialize jpeg buffer.
memset(jpegbuffer, 0, sizeof(*jpegbuffer));
mutex_init0(&jpegbuffer->lock);
// Enable streaming.
framebuffer->streaming_enabled = true; // controlled by the OpenMV Cam.
// Set default quality
jpegbuffer->enabled = fb_enabled;
jpegbuffer->quality = ((OMV_JPEG_QUALITY_HIGH - OMV_JPEG_QUALITY_LOW) / 2) + OMV_JPEG_QUALITY_LOW;
}
// Set fb_enabled
jpegbuffer->enabled = fb_enabled; // controlled by the IDE.
void framebuffer_init_fb(framebuffer_t *fb, size_t size, bool dynamic) {
// Clear framebuffers
memset(fb, 0, sizeof(*fb));
// Setup buffering.
framebuffer_set_buffers(framebuffer, 1);
fb->raw_size = size;
fb->streaming_enabled = true;
fb->dynamic = dynamic;
framebuffer_set_buffers(fb, 1);
}
void framebuffer_init_image(framebuffer_t *fb, image_t *img) {
@ -283,8 +285,14 @@ int framebuffer_encoded_size(framebuffer_t *fb, image_t *img) {
// Returns the current frame buffer size, factoring in the space taken by fb_alloc.
static uint32_t framebuffer_max_buffer_size(framebuffer_t *fb) {
uint32_t fb_total_size = FB_ALIGN_SIZE_ROUND_DOWN((char *) &_fb_memory_end - (char *) fb->data);
uint32_t fb_total_size = FB_ALIGN_SIZE_ROUND_DOWN(fb->raw_size);
uint32_t fb_avail_size = FB_ALIGN_SIZE_ROUND_DOWN(fb_alloc_stack_pointer() - (char *) fb->data);
// No fb_alloc on dynamic FBs.
if (fb->dynamic) {
fb_avail_size = fb_total_size;
}
return IM_MIN(fb_total_size, fb_avail_size);
}

View File

@ -43,6 +43,7 @@ typedef struct framebuffer {
int32_t u, v;
PIXFORMAT_STRUCT;
int32_t streaming_enabled;
uint32_t raw_size;
uint32_t buff_size;
uint32_t n_buffers;
uint32_t frame_size;
@ -50,6 +51,7 @@ typedef struct framebuffer {
volatile int32_t tail;
bool check_head;
int32_t sampled_head;
bool dynamic;
OMV_ATTR_ALIGNED(uint8_t data[], FRAMEBUFFER_ALIGNMENT);
} framebuffer_t;
@ -108,6 +110,9 @@ uint32_t framebuffer_get_buffer_size(framebuffer_t *fb);
// Return the state of a buffer.
vbuffer_t *framebuffer_get_buffer(framebuffer_t *fb, int32_t index);
// Initializes a frame buffer instance.
void framebuffer_init_fb(framebuffer_t *fb, size_t size, bool dynamic);
// Initializes an image from the frame buffer.
void framebuffer_init_image(framebuffer_t *fb, image_t *img);