This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 56be0ab0509d766de292b2a7ffdbd3205eefcce9
Author: yuexinyi <[email protected]>
AuthorDate: Wed Jul 5 18:08:34 2023 +0800

    drivers/video: add capture arg to support multi instance
    
    Signed-off-by: yuexinyi <[email protected]>
---
 arch/arm/src/cxd56xx/cxd56_cisif.c | 22 +++++++++++++++-------
 arch/sim/src/sim/sim_camera.c      | 10 +++++++---
 drivers/video/video.c              | 10 ++++++----
 include/nuttx/video/imgdata.h      | 10 ++++++----
 4 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/arch/arm/src/cxd56xx/cxd56_cisif.c 
b/arch/arm/src/cxd56xx/cxd56_cisif.c
index c1d0da5e78..5d7007ad5f 100644
--- a/arch/arm/src/cxd56xx/cxd56_cisif.c
+++ b/arch/arm/src/cxd56xx/cxd56_cisif.c
@@ -175,6 +175,7 @@ static uint32_t g_cisif_time_stop;
 #endif
 
 static imgdata_capture_t g_cxd56_cisif_complete_capture;
+static void *g_cxd56_cisif_capture_arg;
 
 /****************************************************************************
  * Private Function Prototypes
@@ -216,7 +217,8 @@ static int cxd56_cisif_start_capture
               uint8_t nr_datafmt,
               imgdata_format_t *datafmt,
               imgdata_interval_t *interval,
-              imgdata_capture_t callback);
+              imgdata_capture_t callback,
+              void *arg);
 static int cxd56_cisif_stop_capture(struct imgdata_s *data);
 static int cxd56_cisif_validate_buf(struct imgdata_s *data,
                                     uint8_t *addr, uint32_t size);
@@ -373,7 +375,7 @@ static void cisif_callback_for_intlev(uint8_t code)
 
   /* Notify and get next addr */
 
-  g_cxd56_cisif_complete_capture(0, size, NULL);
+  g_cxd56_cisif_complete_capture(0, size, NULL, g_cxd56_cisif_capture_arg);
 
   g_jpgint_receive = false;
 
@@ -413,7 +415,8 @@ static void cisif_ycc_axi_trdn_int(uint8_t code)
   else
     {
       size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
-      g_cxd56_cisif_complete_capture(0, size, NULL);
+      g_cxd56_cisif_complete_capture(0, size, NULL,
+                                     g_cxd56_cisif_capture_arg);
       cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
     }
 }
@@ -463,7 +466,8 @@ static void cisif_jpg_axi_trdn_int(uint8_t code)
   else
     {
       size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
-      g_cxd56_cisif_complete_capture(0, size, NULL);
+      g_cxd56_cisif_complete_capture(0, size, NULL,
+                                     g_cxd56_cisif_capture_arg);
       cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
     }
 }
@@ -495,7 +499,8 @@ static void cisif_ycc_err_int(uint8_t code)
 #endif
 
   size = cisif_reg_read(CISIF_YCC_DSTRG_CONT);
-  g_cxd56_cisif_complete_capture(code, size, NULL);
+  g_cxd56_cisif_complete_capture(code, size, NULL,
+                                 g_cxd56_cisif_capture_arg);
   cisif_reg_write(CISIF_YCC_DREAD_CONT, 0);
   g_errint_receive = true;
 }
@@ -513,7 +518,8 @@ static void cisif_jpg_err_int(uint8_t code)
 #endif
 
   size = cisif_reg_read(CISIF_JPG_DSTRG_CONT);
-  g_cxd56_cisif_complete_capture(code, size, NULL);
+  g_cxd56_cisif_complete_capture(code, size, NULL,
+                                 g_cxd56_cisif_capture_arg);
   cisif_reg_write(CISIF_JPG_DREAD_CONT, 0);
   g_errint_receive = true;
 }
@@ -850,7 +856,8 @@ static int cxd56_cisif_start_capture
               uint8_t nr_fmt,
               imgdata_format_t *fmt,
               imgdata_interval_t *interval,
-              imgdata_capture_t callback)
+              imgdata_capture_t callback,
+              void *arg)
 {
   cisif_param_t param =
     {
@@ -924,6 +931,7 @@ static int cxd56_cisif_start_capture
     }
 
   g_cxd56_cisif_complete_capture = callback;
+  g_cxd56_cisif_capture_arg = arg;
 
   g_state = STATE_CAPTURE;
 
diff --git a/arch/sim/src/sim/sim_camera.c b/arch/sim/src/sim/sim_camera.c
index 7069793284..bfa543751b 100644
--- a/arch/sim/src/sim/sim_camera.c
+++ b/arch/sim/src/sim/sim_camera.c
@@ -44,6 +44,7 @@ typedef struct
   struct imgdata_s data;
   struct imgsensor_s sensor;
   imgdata_capture_t capture_cb;
+  void *capture_arg;
   uint32_t buf_size;
   uint8_t  *next_buf;
   struct timeval *next_ts;
@@ -86,7 +87,8 @@ static int sim_camera_data_start_capture(struct imgdata_s 
*data,
                                          uint8_t nr_datafmt,
                                          imgdata_format_t *datafmt,
                                          imgdata_interval_t *interval,
-                                         imgdata_capture_t callback);
+                                         imgdata_capture_t callback,
+                                         void *arg);
 static int sim_camera_data_stop_capture(struct imgdata_s *data);
 static int sim_camera_data_set_buf(struct imgdata_s *data,
                                    uint8_t *addr, uint32_t size);
@@ -289,7 +291,8 @@ static int sim_camera_data_start_capture(struct imgdata_s 
*data,
                                          uint8_t nr_datafmt,
                                          imgdata_format_t *datafmt,
                                          imgdata_interval_t *interval,
-                                         imgdata_capture_t callback)
+                                         imgdata_capture_t callback,
+                                         void *arg)
 {
   sim_camera_priv_t *priv = (sim_camera_priv_t *)data;
   int ret;
@@ -306,6 +309,7 @@ static int sim_camera_data_start_capture(struct imgdata_s 
*data,
     }
 
   priv->capture_cb = callback;
+  priv->capture_arg = arg;
   return host_video_start_capture(priv->vdev);
 }
 
@@ -344,7 +348,7 @@ void sim_camera_loop(void)
         {
           clock_gettime(CLOCK_MONOTONIC, &ts);
           TIMESPEC_TO_TIMEVAL(&tv, &ts);
-          priv->capture_cb(0, ret, &tv);
+          priv->capture_cb(0, ret, &tv, priv->capture_arg);
         }
     }
 }
diff --git a/drivers/video/video.c b/drivers/video/video.c
index bded458eb9..9ed2b9d01d 100644
--- a/drivers/video/video.c
+++ b/drivers/video/video.c
@@ -232,7 +232,8 @@ static int save_scene_param(FAR video_mng_t *vmng,
                             uint32_t id,
                             struct v4l2_ext_control *control);
 static int video_complete_capture(uint8_t err_code, uint32_t datasize,
-                                  FAR const struct timeval *ts);
+                                  FAR const struct timeval *ts,
+                                  FAR void *arg);
 static int validate_frame_setting(FAR video_mng_t *vmng,
                                   enum v4l2_buf_type type,
                                   uint8_t nr_fmt,
@@ -630,7 +631,7 @@ static int start_capture(FAR video_mng_t *vmng,
      IMGSENSOR_STREAM_TYPE_VIDEO : IMGSENSOR_STREAM_TYPE_STILL,
      nr_fmt, sf, &si);
   IMGDATA_START_CAPTURE(vmng->imgdata,
-     nr_fmt, df, &di, video_complete_capture);
+     nr_fmt, df, &di, video_complete_capture, vmng);
   IMGDATA_SET_BUF(vmng->imgdata, (FAR uint8_t *)bufaddr, bufsize);
   return OK;
 }
@@ -3376,9 +3377,10 @@ static int video_unregister(FAR video_mng_t *priv)
 /* Callback function which device driver call when capture has done. */
 
 static int video_complete_capture(uint8_t err_code, uint32_t datasize,
-                                  FAR const struct timeval *ts)
+                                  FAR const struct timeval *ts,
+                                  FAR void *arg)
 {
-  FAR video_mng_t      *vmng = (FAR video_mng_t *)g_video_handler;
+  FAR video_mng_t      *vmng = (FAR video_mng_t *)arg;
   FAR video_type_inf_t *type_inf;
   FAR vbuf_container_t *container = NULL;
   enum v4l2_buf_type buf_type;
diff --git a/include/nuttx/video/imgdata.h b/include/nuttx/video/imgdata.h
index c36290e6e9..3e5e3bbab3 100644
--- a/include/nuttx/video/imgdata.h
+++ b/include/nuttx/video/imgdata.h
@@ -57,9 +57,9 @@
 #define IMGDATA_VALIDATE_FRAME_SETTING(d, n, f, i) \
   ((d)->ops->validate_frame_setting ? \
    (d)->ops->validate_frame_setting(d, n, f, i) : -ENOTTY)
-#define IMGDATA_START_CAPTURE(d, n, f, i, c) \
+#define IMGDATA_START_CAPTURE(d, n, f, i, c, a) \
   ((d)->ops->start_capture ? \
-   (d)->ops->start_capture(d, n, f, i, c) : -ENOTTY)
+   (d)->ops->start_capture(d, n, f, i, c, a) : -ENOTTY)
 #define IMGDATA_STOP_CAPTURE(d) \
   ((d)->ops->stop_capture ? (d)->ops->stop_capture(d) : -ENOTTY)
 
@@ -83,7 +83,8 @@ typedef struct imgdata_interval_s
 } imgdata_interval_t;
 
 typedef int (*imgdata_capture_t)(uint8_t result, uint32_t size,
-                                 FAR const struct timeval *ts);
+                                 FAR const struct timeval *ts,
+                                 FAR void *arg);
 
 /* Structure for Data Control I/F */
 
@@ -104,7 +105,8 @@ struct imgdata_ops_s
                             uint8_t nr_datafmts,
                             FAR imgdata_format_t *datafmts,
                             FAR imgdata_interval_t *interval,
-                            FAR imgdata_capture_t callback);
+                            FAR imgdata_capture_t callback,
+                            FAR void *arg);
   CODE int (*stop_capture)(FAR struct imgdata_s *data);
 };
 

Reply via email to