1717#include <stdalign.h>
1818#include "esp_heap_caps.h"
1919#include "freertos/FreeRTOS.h"
20+ #include "freertos/task.h"
2021#include "ll_cam.h"
2122#include "cam_hal.h"
2223
@@ -262,6 +263,18 @@ static void cam_task(void *arg)
262263 & frame_buffer_event -> buf [frame_buffer_event -> len ],
263264 & cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
264265 cam_obj -> dma_half_buffer_size );
266+ } else {
267+ // stop if the next DMA copy would exceed the framebuffer slot
268+ // size, since we're called only after the copy occurs
269+ // This effectively reduces maximum usable frame buffer size
270+ // by one DMA operation, as we can't predict here, if the next
271+ // cam event will be a VSYNC
272+ if (cnt + 1 >= cam_obj -> frame_copy_cnt ) {
273+ ESP_CAMERA_ETS_PRINTF (DRAM_STR ("cam_hal: DMA overflow\r\n" ));
274+ ll_cam_stop (cam_obj );
275+ cam_obj -> state = CAM_STATE_IDLE ;
276+ continue ;
277+ }
265278 }
266279
267280 //Check for JPEG SOI in the first buffer. stop if not found
@@ -311,14 +324,6 @@ static void cam_task(void *arg)
311324 }
312325
313326 cnt ++ ;
314- // stop when too many DMA copies occur so the PSRAM
315- // framebuffer slot doesn't overflow from runaway transfers
316- if (cnt >= cam_obj -> frame_copy_cnt ) {
317- ESP_LOGE (TAG , "DMA overflow" );
318- ll_cam_stop (cam_obj );
319- cam_obj -> state = CAM_STATE_IDLE ;
320- continue ;
321- }
322327
323328 } else if (cam_event == CAM_VSYNC_EVENT ) {
324329 //DBG_PIN_SET(1);
@@ -416,6 +421,9 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
416421
417422 cam_obj -> dma_node_cnt = (cam_obj -> dma_buffer_size ) / cam_obj -> dma_node_buffer_size ; // Number of DMA nodes
418423 cam_obj -> frame_copy_cnt = cam_obj -> recv_size / cam_obj -> dma_half_buffer_size ; // Number of interrupted copies, ping-pong copy
424+ if (cam_obj -> psram_mode ) {
425+ cam_obj -> frame_copy_cnt ++ ;
426+ }
419427
420428 ESP_LOGI (TAG , "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d" ,
421429 (int ) cam_obj -> dma_buffer_size , (int ) cam_obj -> dma_half_buffer_size , (int ) cam_obj -> dma_node_buffer_size ,
@@ -434,6 +442,7 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
434442 if (cam_obj -> fb_size < cam_obj -> recv_size ) {
435443 fb_size = cam_obj -> recv_size ;
436444 }
445+ fb_size += cam_obj -> dma_half_buffer_size ;
437446 }
438447
439448 /* Allocate memory for frame buffer */
0 commit comments