Unable to process buffer for display on LCD using lv_img_set_src

Description

I’m downloading a jpeg/png image from node.js server and saving it to a uint8_t buffer (image_buffer) on in esp32-s3 external RAM. I’d now like to pass this buffer to lv_img_set_src to display it on my LCD, but I keep getting the following core dump error messages:

Guru Meditation Error: Core 0 panic’ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x4210071b PS : 0x00060b30 A0 : 0x8204c19d A1 : 0x3fcf1460
0x4210071b: lv_fs_seek at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/misc/lv_fs.c:247
A2 : 0x00000000 A3 : 0x00000004 A4 : 0x00000000 A5 : 0x3fcf14a6
A6 : 0x000000ee A7 : 0x000000ff A8 : 0x00000001 A9 : 0x00000001
A10 : 0x3fca6298 A11 : 0x00000001 A12 : 0x000005a0 A13 : 0x00000040
A14 : 0xfffffdff A15 : 0x00000026 SAR : 0x00000020 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000004 LBEG : 0x40056fc5 LEND : 0x40056fe7 LCOUNT : 0xffffffff
0x40056fc5: memcpy in ROM
0x40056fe7: memcpy in ROM
Backtrace: 0x42100718:0x3fcf1460 0x4204c19a:0x3fcf1490 0x4204c3c5:0x3fcf14f0 0x4210036a:0x3fcf1510 0x42049c0f:0x3fcf1530 0x42049cb0:0x3fcf1590 0x4204fac9:0x3fcf15b0 0x4204ff6b:0x3fcf1640 0x420ff999:0x3fcf1670 0x4203e90a:0x3fcf1690 0x4203e9f6:0x3fcf16b0 0x42048f16:0x3fcf16f0 0x42048fcd:0x3fcf1730 0x42048f7f:0x3fcf1780 0x42048fcd:0x3fcf17c0 0x42049249:0x3fcf1810 0x4204944a:0x3fcf1830 0x42049511:0x3fcf18a0 0x420496d5:0x3fcf18d0 0x4204988e:0x3fcf18f0 0x4204e5d9:0x3fcf1920 0x4204e68a:0x3fcf1940 0x4200c4fe:0x3fcf1960 0x40386355:0x3fcf1980
0x42100718: lv_fs_seek at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/misc/lv_fs.c:246
0x4204c19a: lv_img_decoder_built_in_line_alpha at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/draw/lv_img_decoder.c:632
0x4204c3c5: lv_img_decoder_built_in_read_line at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/draw/lv_img_decoder.c:497
0x4210036a: lv_img_decoder_read_line at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/draw/lv_img_decoder.c:179 (discriminator 1)
0x42049c0f: decode_and_draw at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/draw/lv_draw_img.c:330
0x42049cb0: lv_draw_img at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/draw/lv_draw_img.c:80
0x4204fac9: draw_img at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/widgets/lv_img.c:670 (discriminator 2)
0x4204ff6b: lv_img_event at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/widgets/lv_img.c:514
0x420ff999: lv_obj_event_base at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_event.c:96
0x4203e90a: event_send_core at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_event.c:452
0x4203e9f6: lv_event_send at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_event.c:74
0x42048f16: lv_obj_redraw at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:148 (discriminator 3)
0x42048fcd: refr_obj at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:970
0x42048f7f: lv_obj_redraw at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:182 (discriminator 3)
0x42048fcd: refr_obj at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:970
0x42049249: refr_obj_and_children at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:854
0x4204944a: refr_area_part at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:789
0x42049511: refr_area at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:649
0x420496d5: refr_invalid_areas at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:616
0x4204988e: _lv_disp_refr_timer at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/core/lv_refr.c:324
0x4204e5d9: lv_timer_exec at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/misc/lv_timer.c:313 (discriminator 2)
0x4204e68a: lv_timer_handler at C:/Users/karun/ePuzzle/ezzle/esp_code/managed_components/lvgl__lvgl/src/misc/lv_timer.c:109
0x4200c4fe: lvgl_port_task at C:/Users/karun/ePuzzle/ezzle/esp_code/main/lvgl_port.c:481
0x40386355: vPortTaskWrapper at C:/Users/karun/ESP/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:162

My lv_conf.h has the following setting for memory:

#define LV_MEM_CUSTOM 1

Also, my sdkconfig has the following memory settings for LVGL:

CONFIG_LV_MEM_CUSTOM=y
CONFIG_LV_MEM_CUSTOM_INCLUDE="stdlib.h"
CONFIG_LV_MEM_BUF_MAX_NUM=16
# CONFIG_LV_MEMCPY_MEMSET_STD is not set
# end of Memory settings

What MCU/Processor/Board and compiler are you using?

ESP32-S3

What LVGL version are you using?

8.4

What do you want to achieve?

Make the image buffer appear on LCD without getting a core dump. I’m new to LVGL and have limited familiarity with C. Not sure how I need to modify my image_buffer array to make it work correctly with lv_img_set_src.

What have you tried so far?

Code to reproduce

Add a code snippet which can run in the simulator. It should contain only the relevant code that compiles without errors when separated from your main code base.

The code block(s) should be formatted like:

void display_img(uint8_t *img_buffer, int size){
    lv_obj_t *img1 = lv_img_create(lv_scr_act());
    lv_img_dsc_t newImg = {
        .header.always_zero = 0,
        .header.w = 480,
        .header.h = 480,
        .data_size = size,
        .header.cf = LV_IMG_CF_TRUE_COLOR,
        .data = img_buffer
    };
    lv_img_set_src(img1, &newImg);
    
    if (lvgl_port_lock(-1)) {
        lvgl_port_unlock();
    }
}

//This part of the code works perfectly fine.
main(){
    int content_length = esp_http_client_fetch_headers(client);
    uint8_t *image_buffer = (uint8_t *)calloc(content_length, sizeof(uint8_t));
    do {
        resp_length = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER);
        if (resp_length >= 0) {
            memcpy(image_buffer + cum_data_read, output_buffer, resp_length);
            cum_data_read += resp_length;
        } else {
            ESP_LOGE(TAG, "Failed to read response");
        }
    }
    while (resp_length > 0);
    display_img(image_buffer, content_length);
}

Screenshot and/or video

If possible, add screenshots and/or videos about the current state.