| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* SPI Master example: jpeg decoder.
- This example code is in the Public Domain (or CC0 licensed, at your option.)
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- */
- /*
- The image used for the effect on the LCD in the SPI master example is stored in flash
- as a jpeg file. This file contains the decode_image routine, which uses the tiny JPEG
- decoder library to decode this JPEG into a format that can be sent to the display.
- Keep in mind that the decoder library cannot handle progressive files (will give
- ``Image decoder: jd_prepare failed (8)`` as an error) so make sure to save in the correct
- format if you want to use a different image file.
- */
- #include "decode_image.h"
- #include "jpeg_decoder.h"
- #include "esp_log.h"
- #include "esp_check.h"
- #include <string.h>
- #include "freertos/FreeRTOS.h"
- //Reference the binary-included jpeg file
- extern const uint8_t image_jpg_start[] asm("_binary_image_jpg_start");
- extern const uint8_t image_jpg_end[] asm("_binary_image_jpg_end");
- //Define the height and width of the jpeg file. Make sure this matches the actual jpeg
- //dimensions.
- const char *TAG = "ImageDec";
- //Decode the embedded image into pixel lines that can be used with the rest of the logic.
- esp_err_t decode_image(uint16_t **pixels)
- {
- *pixels = NULL;
- esp_err_t ret = ESP_OK;
- //Alocate pixel memory. Each line is an array of IMAGE_W 16-bit pixels; the `*pixels` array itself contains pointers to these lines.
- *pixels = calloc(IMAGE_H * IMAGE_W, sizeof(uint16_t));
- ESP_GOTO_ON_FALSE((*pixels), ESP_ERR_NO_MEM, err, TAG, "Error allocating memory for lines");
- //JPEG decode config
- esp_jpeg_image_cfg_t jpeg_cfg = {
- .indata = (uint8_t *)image_jpg_start,
- .indata_size = image_jpg_end - image_jpg_start,
- .outbuf = (uint8_t*)(*pixels),
- .outbuf_size = IMAGE_W * IMAGE_H * sizeof(uint16_t),
- .out_format = JPEG_IMAGE_FORMAT_RGB565,
- .out_scale = JPEG_IMAGE_SCALE_0,
- .flags = {
- .swap_color_bytes = 1,
- }
- };
- //JPEG decode
- esp_jpeg_image_output_t outimg;
- esp_jpeg_decode(&jpeg_cfg, &outimg);
- ESP_LOGI(TAG, "JPEG image decoded! Size of the decoded image is: %dpx x %dpx", outimg.width, outimg.height);
- return ret;
- err:
- //Something went wrong! Exit cleanly, de-allocating everything we allocated.
- if (*pixels != NULL) {
- free(*pixels);
- }
- return ret;
- }
|