Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 53 additions & 16 deletions examples/display_audio_photo/main/app_disp_fs.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand All @@ -22,7 +22,7 @@
#include "bsp/esp-bsp.h"
#include "lvgl.h"
#include "app_disp_fs.h"
#include "jpeg_decoder.h"
#include "esp_jpeg_dec.h"

/* SPIFFS mount root */
#define FS_MNT_PATH BSP_SPIFFS_MOUNT_POINT
Expand Down Expand Up @@ -175,7 +175,7 @@ void app_audio_init(void)
void app_disp_fs_init(void)
{
file_buffer_size = BSP_LCD_H_RES * BSP_LCD_V_RES * sizeof(lv_color_t);
file_buffer = heap_caps_calloc(file_buffer_size, 1, MALLOC_CAP_DEFAULT);
file_buffer = jpeg_calloc_align(file_buffer_size, 16);
assert(file_buffer);

/* Initialize root path */
Expand Down Expand Up @@ -271,25 +271,62 @@ static void show_window(const char *path, app_file_type_t type)
} else if (fs_img) {
ESP_LOGI(TAG, "Decoding JPEG image...");
/* JPEG decode */
esp_jpeg_image_cfg_t jpeg_cfg = {
.indata = (uint8_t *)file_buf,
.indata_size = filesize,
jpeg_dec_handle_t jpeg_dec = NULL;
jpeg_dec_header_info_t out_info;
jpeg_dec_io_t jpeg_io = {
.inbuf = (uint8_t *)file_buf,
.inbuf_len = (int)filesize,
.outbuf = file_buffer,
.outbuf_size = file_buffer_size,
.out_format = JPEG_IMAGE_FORMAT_RGB565,
.out_scale = JPEG_IMAGE_SCALE_0,
.flags = {
};
jpeg_dec_config_t config = DEFAULT_JPEG_DEC_CONFIG();
config.output_type = JPEG_PIXEL_FORMAT_RGB565_LE;
#if CONFIG_LV_COLOR_16_SWAP
.swap_color_bytes = 1,
config.output_type = JPEG_PIXEL_FORMAT_RGB565_BE;
#endif
}
};
esp_jpeg_image_output_t outimg;
esp_jpeg_decode(&jpeg_cfg, &outimg);

lv_canvas_set_buffer(fs_img, file_buffer, outimg.width, outimg.height, LV_COLOR_FORMAT_RGB565);
jpeg_error_t ret = jpeg_dec_open(&config, &jpeg_dec);
if (ret != JPEG_ERR_OK) {
ESP_LOGE(TAG, "JPEG decoder open failed: %d", ret);
lv_label_set_text(label, "JPEG decoder open failed!");
goto jpeg_decode_cleanup;
}

ret = jpeg_dec_parse_header(jpeg_dec, &jpeg_io, &out_info);
if (ret != JPEG_ERR_OK) {
ESP_LOGE(TAG, "JPEG header parse failed: %d", ret);
lv_label_set_text(label, "JPEG header parse failed!");
goto jpeg_decode_cleanup;
}

int outbuf_len = 0;
ret = jpeg_dec_get_outbuf_len(jpeg_dec, &outbuf_len);
if (ret != JPEG_ERR_OK || outbuf_len <= 0) {
ESP_LOGE(TAG, "JPEG out buffer size failed: %d", ret);
lv_label_set_text(label, "JPEG buffer size error!");
goto jpeg_decode_cleanup;
}

if ((size_t)outbuf_len > file_buffer_size) {
ESP_LOGE(TAG, "JPEG buffer too small: need %d, have %u", outbuf_len, (unsigned)file_buffer_size);
lv_label_set_text(label, "JPEG image too large!");
goto jpeg_decode_cleanup;
}

ret = jpeg_dec_process(jpeg_dec, &jpeg_io);
if (ret != JPEG_ERR_OK) {
ESP_LOGE(TAG, "JPEG decode failed: %d", ret);
lv_label_set_text(label, "JPEG decode failed!");
goto jpeg_decode_cleanup;
}

lv_canvas_set_buffer(fs_img, file_buffer, out_info.width, out_info.height, LV_COLOR_FORMAT_RGB565);
lv_obj_center(fs_img);
lv_obj_invalidate(fs_img);

jpeg_decode_cleanup:
if (jpeg_dec) {
jpeg_dec_close(jpeg_dec);
}
}

close(f);
Expand Down
2 changes: 1 addition & 1 deletion examples/display_audio_photo/main/idf_component.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ dependencies:
bsp_selector:
version: '*'
override_path: ../../../components/bsp_selector
esp_jpeg: '*'
esp_new_jpeg: '^1'
Loading