feat(cam): support format conversion function

This commit is contained in:
gaoxu
2025-10-20 14:21:34 +08:00
committed by BOT
parent f7ddaefdc5
commit de3e6d22e3
14 changed files with 256 additions and 3 deletions
@@ -52,6 +52,7 @@ static esp_err_t s_ctlr_csi_stop(esp_cam_ctlr_handle_t handle);
static esp_err_t s_csi_ctlr_disable(esp_cam_ctlr_handle_t ctlr);
static esp_err_t s_ctlr_csi_receive(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, uint32_t timeout_ms);
static void *s_csi_ctlr_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps);
static esp_err_t s_csi_ctlr_format_conversion(esp_cam_ctlr_t *handle, const cam_ctlr_format_conv_config_t *config);
static esp_err_t s_csi_claim_controller(csi_controller_t *controller)
{
@@ -223,6 +224,7 @@ esp_err_t esp_cam_new_csi_ctlr(const esp_cam_ctlr_csi_config_t *config, esp_cam_
ctlr->base.get_internal_buffer = s_csi_ctlr_get_internal_buffer;
ctlr->base.get_buffer_len = s_csi_ctlr_get_buffer_length;
ctlr->base.alloc_buffer = s_csi_ctlr_alloc_buffer;
ctlr->base.format_conversion = s_csi_ctlr_format_conversion;
*ret_handle = &(ctlr->base);
@@ -540,3 +542,10 @@ static void *s_csi_ctlr_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32
return buffer;
}
static esp_err_t s_csi_ctlr_format_conversion(esp_cam_ctlr_t *handle, const cam_ctlr_format_conv_config_t *config)
{
ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
// CSI controller doesn't support format conversion yet
return ESP_ERR_NOT_SUPPORTED;
}
@@ -765,6 +765,31 @@ static void *esp_cam_ctlr_dvp_cam_alloc_buffer(esp_cam_ctlr_t *handle, size_t si
return buffer;
}
/**
* @brief Configure format conversion
*
* @param cam_handle Camera controller handle
* @param src_format Source format
* @param dst_format Destination format
* @return ESP_OK on success, ESP_FAIL on failure
*/
esp_err_t esp_cam_ctlr_dvp_format_conversion(esp_cam_ctlr_handle_t cam_handle,
const cam_ctlr_format_conv_config_t *config)
{
if (cam_handle == NULL) {
return ESP_ERR_INVALID_ARG;
}
esp_cam_ctlr_dvp_cam_t *ctlr = (esp_cam_ctlr_dvp_cam_t *)cam_handle;
ESP_LOGD(TAG, "Configure format conversion: %d -> %d", config->src_format, config->dst_format);
// Configure color format conversion
cam_hal_color_format_convert(&ctlr->hal, config);
return ESP_OK;
}
/**
* @brief New ESP CAM DVP controller
*
@@ -855,6 +880,7 @@ esp_err_t esp_cam_new_dvp_ctlr(const esp_cam_ctlr_dvp_config_t *config, esp_cam_
ctlr->base.get_internal_buffer = esp_cam_ctlr_dvp_cam_get_internal_buffer;
ctlr->base.get_buffer_len = esp_cam_ctlr_get_dvp_cam_frame_buffer_len;
ctlr->base.alloc_buffer = esp_cam_ctlr_dvp_cam_alloc_buffer;
ctlr->base.format_conversion = esp_cam_ctlr_dvp_format_conversion;
*ret_handle = &ctlr->base;
+10
View File
@@ -99,3 +99,13 @@ void *esp_cam_ctlr_alloc_buffer(esp_cam_ctlr_handle_t handle, size_t size, uint3
return handle->alloc_buffer(handle, size, buf_caps);
}
esp_err_t esp_cam_ctlr_format_conversion(esp_cam_ctlr_handle_t handle,
const cam_ctlr_format_conv_config_t *conv_cfg)
{
ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
ESP_RETURN_ON_FALSE(conv_cfg, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null conv_cfg");
ESP_RETURN_ON_FALSE(handle->format_conversion, ESP_ERR_NOT_SUPPORTED, TAG, "format conversion function not supported");
return handle->format_conversion(handle, conv_cfg);
}
@@ -11,6 +11,7 @@
#include "esp_err.h"
#include "esp_heap_caps.h"
#include "esp_cam_ctlr_types.h"
#include "hal/cam_ctlr_types.h"
#ifdef __cplusplus
extern "C" {
@@ -150,6 +151,20 @@ esp_err_t esp_cam_ctlr_get_frame_buffer_len(esp_cam_ctlr_handle_t handle, size_t
*/
void *esp_cam_ctlr_alloc_buffer(esp_cam_ctlr_handle_t handle, size_t size, uint32_t buf_caps);
/**
* @brief Configure format conversion
*
* @param[in] handle ESP CAM controller handle
* @param[in] conv_cfg Color conversion configuration, contains source and destination formats
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG: Invalid argument
* - ESP_ERR_NOT_SUPPORTED: Format conversion not supported by this controller
*/
esp_err_t esp_cam_ctlr_format_conversion(esp_cam_ctlr_handle_t handle,
const cam_ctlr_format_conv_config_t *conv_cfg);
#ifdef __cplusplus
}
#endif
@@ -8,6 +8,7 @@
#include <stdbool.h>
#include "esp_err.h"
#include "esp_cam_ctlr_types.h"
#include "hal/cam_ctlr_types.h"
#ifdef __cplusplus
extern "C" {
@@ -146,6 +147,19 @@ struct esp_cam_ctlr_t {
*/
void *(*alloc_buffer)(esp_cam_ctlr_t *, size_t, uint32_t);
/**
* @brief Configure format conversion
*
* @param[in] esp_cam_ctlr_t * ESP CAM controller handle
* @param[in] const cam_ctlr_format_conv_config_t * Color conversion configuration
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG: Invalid argument
* - ESP_ERR_NOT_SUPPORTED: Format conversion not supported by this controller
*/
esp_err_t (*format_conversion)(esp_cam_ctlr_t *, const cam_ctlr_format_conv_config_t *);
void *user_data; ///< User data
};
@@ -80,6 +80,7 @@ static esp_err_t s_isp_dvp_stop(esp_cam_ctlr_handle_t handle);
static esp_err_t s_isp_dvp_receive(esp_cam_ctlr_handle_t handle, esp_cam_ctlr_trans_t *trans, uint32_t timeout_ms);
static bool s_dvp_dma_trans_done_callback(dw_gdma_channel_handle_t chan, const dw_gdma_trans_done_event_data_t *event_data, void *user_data);
static void *s_isp_dvp_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_t buf_caps);
static esp_err_t s_isp_dvp_format_conversion(esp_cam_ctlr_t *handle, const cam_ctlr_format_conv_config_t *config);
esp_err_t esp_cam_new_isp_dvp_ctlr(isp_proc_handle_t isp_proc, const esp_cam_ctlr_isp_dvp_cfg_t *ctlr_config, esp_cam_ctlr_handle_t *ret_handle)
{
@@ -191,6 +192,7 @@ esp_err_t esp_cam_new_isp_dvp_ctlr(isp_proc_handle_t isp_proc, const esp_cam_ctl
cam_ctlr->get_internal_buffer = s_isp_dvp_get_frame_buffer;
cam_ctlr->get_buffer_len = s_isp_dvp_get_frame_buffer_length;
cam_ctlr->alloc_buffer = s_isp_dvp_alloc_buffer;
cam_ctlr->format_conversion = s_isp_dvp_format_conversion;
*ret_handle = cam_ctlr;
return ESP_OK;
@@ -589,3 +591,10 @@ static void *s_isp_dvp_alloc_buffer(esp_cam_ctlr_t *handle, size_t size, uint32_
return buffer;
}
static esp_err_t s_isp_dvp_format_conversion(esp_cam_ctlr_t *handle, const cam_ctlr_format_conv_config_t *config)
{
ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
// ISP DVP controller doesn't support format conversion yet
return ESP_ERR_NOT_SUPPORTED;
}