diff --git a/src/omv/boards/ARDUINO_GIGA/omv_boardconfig.h b/src/omv/boards/ARDUINO_GIGA/omv_boardconfig.h index af07201e4..c5cbd631e 100644 --- a/src/omv/boards/ARDUINO_GIGA/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_GIGA/omv_boardconfig.h @@ -201,6 +201,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_H9_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_H10_DCMI) diff --git a/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h b/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h index 43a6459cc..5e3dbe688 100644 --- a/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h @@ -198,6 +198,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM3_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK1Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_C6_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_C7_DCMI) diff --git a/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h index ea8526709..3961ce90e 100644 --- a/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h @@ -210,6 +210,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_H9_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_H10_DCMI) diff --git a/src/omv/boards/OPENMV1/omv_boardconfig.h b/src/omv/boards/OPENMV1/omv_boardconfig.h index 00f6ceaf0..baf3c766b 100644 --- a/src/omv/boards/OPENMV1/omv_boardconfig.h +++ b/src/omv/boards/OPENMV1/omv_boardconfig.h @@ -71,6 +71,7 @@ #define OMV_CSI_TIM_CHANNEL (TIM_CHANNEL_1) #define OMV_CSI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_RESET_PIN (GPIO_PIN_10) #define OMV_CSI_RESET_PORT (GPIOA) diff --git a/src/omv/boards/OPENMV2/omv_boardconfig.h b/src/omv/boards/OPENMV2/omv_boardconfig.h index fcb85e1ee..f9522508e 100644 --- a/src/omv/boards/OPENMV2/omv_boardconfig.h +++ b/src/omv/boards/OPENMV2/omv_boardconfig.h @@ -125,6 +125,7 @@ #define OMV_CSI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_C6_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_C7_DCMI) diff --git a/src/omv/boards/OPENMV3/omv_boardconfig.h b/src/omv/boards/OPENMV3/omv_boardconfig.h index f11f3bfd4..66689e9cd 100644 --- a/src/omv/boards/OPENMV3/omv_boardconfig.h +++ b/src/omv/boards/OPENMV3/omv_boardconfig.h @@ -124,6 +124,7 @@ #define OMV_CSI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_C6_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_C7_DCMI) diff --git a/src/omv/boards/OPENMV4/omv_boardconfig.h b/src/omv/boards/OPENMV4/omv_boardconfig.h index ec59bab16..63ab09188 100644 --- a/src/omv/boards/OPENMV4/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4/omv_boardconfig.h @@ -202,6 +202,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_C6_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_C7_DCMI) diff --git a/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h b/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h index 7e76bc0af..e6777ffe0 100644 --- a/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h @@ -227,6 +227,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_A9_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_A10_DCMI) diff --git a/src/omv/boards/OPENMVPT/omv_boardconfig.h b/src/omv/boards/OPENMVPT/omv_boardconfig.h index 47f3b4246..5317193bd 100644 --- a/src/omv/boards/OPENMVPT/omv_boardconfig.h +++ b/src/omv/boards/OPENMVPT/omv_boardconfig.h @@ -210,6 +210,7 @@ #define OMV_CSI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define OMV_CSI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() #define OMV_CSI_DMA_MEMCPY_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_C6_DCMI) #define OMV_CSI_D1_PIN (&omv_pin_C7_DCMI) diff --git a/src/omv/boards/OPENMV_RT1060/omv_boardconfig.h b/src/omv/boards/OPENMV_RT1060/omv_boardconfig.h index e8ae342fb..567cf00f5 100644 --- a/src/omv/boards/OPENMV_RT1060/omv_boardconfig.h +++ b/src/omv/boards/OPENMV_RT1060/omv_boardconfig.h @@ -204,6 +204,7 @@ #define OMV_CSI_XCLK_FREQUENCY (12000000) #define OMV_CSI_DMA_MEMCPY_ENABLE (1) #define OMV_CSI_HW_SWAP_ENABLE (1) +#define OMV_CSI_HW_CROP_ENABLE (1) #define OMV_CSI_D0_PIN (&omv_pin_DCMI_D0) #define OMV_CSI_D1_PIN (&omv_pin_DCMI_D1) diff --git a/src/omv/imlib/framebuffer.c b/src/omv/imlib/framebuffer.c index 9adf0f508..3e75f6cb2 100644 --- a/src/omv/imlib/framebuffer.c +++ b/src/omv/imlib/framebuffer.c @@ -245,15 +245,18 @@ uint32_t framebuffer_get_buffer_size() { // With only 1 vbuffer it's fine to allow the frame buffer size to change given fb_alloc(). size = framebuffer_raw_buffer_size(); } else { - // Whatever the raw size was when the number of buffers were set is locked in... + // Whatever the raw size was when the number of buffers were set is locked in. size = framebuffer->raw_buffer_size; } // Remove the size of the state header plus alignment padding. size -= sizeof(vbuffer_t); - // Do we have an estimate on the frame size with multiple buffers? If so, we can reduce the - // RAM each buffer takes up giving some space back to fb_alloc(). + #if (OMV_CSI_HW_CROP_ENABLE == 1) + // If the frame size is set, the memory for each buffer can be reduced, + // freeing up space for fb_alloc(). Note that this can only be done if + // the camera interface supports hardware cropping, i.e., the actual + // frame size will match the specified window size. if ((framebuffer->n_buffers != 1) && framebuffer->u && framebuffer->v) { // Typically a framebuffer will not need more than u*v*2 bytes. uint32_t size_guess = framebuffer->u * framebuffer->v * 2; @@ -262,6 +265,7 @@ uint32_t framebuffer_get_buffer_size() { // Limit the frame buffer size. size = IM_MIN(size, size_guess); } + #endif // Needs to be a multiple of FRAMEBUFFER_ALIGNMENT for DMA transfers... return FB_ALIGN_SIZE_ROUND_DOWN(size);