diff --git a/examples/display_audio_photo/main/app_disp_fs.c b/examples/display_audio_photo/main/app_disp_fs.c index 3fb672c83..f7af772a8 100644 --- a/examples/display_audio_photo/main/app_disp_fs.c +++ b/examples/display_audio_photo/main/app_disp_fs.c @@ -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 */ @@ -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 @@ -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 */ @@ -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); diff --git a/examples/display_audio_photo/main/idf_component.yml b/examples/display_audio_photo/main/idf_component.yml index 698d16131..0b903c6c8 100644 --- a/examples/display_audio_photo/main/idf_component.yml +++ b/examples/display_audio_photo/main/idf_component.yml @@ -4,4 +4,4 @@ dependencies: bsp_selector: version: '*' override_path: ../../../components/bsp_selector - esp_jpeg: '*' + esp_new_jpeg: '^1'