标签存档: JPEG

ESP32-S3 JPEG 实测:从解码库对比到 DMA 优化,最终撞上 SPI 上限

前言

之前做了 ESP32-S3 上常见 JPEG 解码库(Tjpg_Decoder、JPEGDEC、ESP_NEW_JPEG)的性能测试,最终结论是 ESP_NEW_JPEG 在此前测试中表现最强(见 ESP32-S3 + Arduino 各种 JPEG 解码库速度对比,到底哪个才是最快的?勘误:ESP_NEW_JPEG 更新到最新版后,所有分辨率都是最快的)。

但是上次是用的静态图片,每次解码都是同样图片数据,与真实使用场景会有差异,毕竟如果是使用 ESP32-S3 播放视频,每一帧的内容都是不一样的,解码时间也会有波动。

这次直接从视频里抽帧,模拟一下真实视频播放场景,看看在这个条件下能把 FPS 推到多高。

另外上次测试时也没有优化解码与传输步骤,理论上可以使用 DMA 实现 CPU 时间更有效的利用,这次也优化一下代码,对比看看效果。

那么这次测试在以下两个条件下,最终结果会如何?

  1. 图片数据使用真实视频抽帧,每帧内容不同,更接近播放场景;
  2. 加入 DMA 和 Block 合并策略,测试“解码”和“上屏”能否真正并行。

先说结论:在 240×240 + RGB565 + SPI 40MHz 的配置下,最终逼近链路上限,实测约 40

阅读全文 »

勘误:ESP_NEW_JPEG 更新到最新版后,所有分辨率都是最快的

前言

上篇文章(见 ESP32-S3 + Arduino 各种 JPEG 解码库速度对比,到底哪个才是最快的?)测试了三个 JPEG 解码库的性能,最终结论是 ESP_NEW_JPEG 在低分辨率遥遥领先,但到了 240x240 和 320x240,被 JPEGDEC 追平。

结果最近想测试 ESP_NEW_JPEG 的 block 解码方式,发现怎么找都找不到对应的 API,这才意识到——我用的库版本根本不对 😅。

问题出在哪里

esp32-jpeg-decoder-errata-2

上篇文章用的是 Arduino 生态里的封装库 ESP32_JPEG,这个库最后一次更新是三年前,是对 ESP_JPEG 早期版本的封装,早就停止维护了。

乐鑫官方真正在维护的最新版本是另一个仓库:esp-adf-libs/esp_new_jpeg,五个月前还在更新,block 解码、最新的 SIMD 优化都在这里。

两个库同名,但版本差距已经是三年了,之前完全踩坑了 😂。

更新库,重新测试

换成最新版 ESP_NEW_JPEG,测试环境与上次完全一致:

  • ESP32-S3-Zero,240MHz 双核
  • 测试图片:Lenna,160x80


阅读全文 »

ESP32-S3 + Arduino 各种 JPEG 解码库速度对比,到底哪个才是最快的?

前段时间做了个 ESP32-S3 串流小电视(见 桌面小电视新思路,ESP32-S3 + 12864 OLED 串流视频)的项目,最近准备试试显示彩色图片,这就需要持续显示 JPEG 图片来模拟视频播放。

在 Arduino 生态中找到了好几个解码库,虽然也有一些对比测试,还是想自己实测一下,看看具体的效果怎么样 😃。

起因

在串流进行视频播放时,需要视频的每一帧解码、上屏,如果需要达到 30 FPS 的刷新率,那么解码 + 上屏的时间要在 1000 / 30 = 33.333 ms 以内。在这种情况下,图片解码性能直接影响用户体验。

另外,ESP32-S3 有双核 + 更高主频 + PSRAM + SIMD 指令支持,理论上应该可以跑得更快,但是具体能快多少,不同库之间差距多大,都需要实测数据。

测试环境

硬件平台

  • 开发板: ESP32-S3-Zero 开发板
  • PSRAM: 2MB


阅读全文 »