ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VP_SDK / Examples / elinux / v4l_stage.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/Examples/elinux/v4l_stage.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/Examples/elinux/v4l_stage.c
new file mode 100644 (file)
index 0000000..18381fc
--- /dev/null
@@ -0,0 +1,256 @@
+#include <VP_Api/vp_api.h>
+#include <VP_Api/vp_api_error.h>
+#include <VP_Stages/vp_stages_configs.h>
+#include <VP_Stages/vp_stages_V4L2_i_camif.h>
+#include <VP_Stages/vp_stages_io_com.h>
+#include <VP_Os/vp_os_print.h>
+#include <VP_Os/vp_os_malloc.h>
+#include <VP_Os/vp_os_delay.h>
+#include <VP_Api/vp_api_thread_helper.h>
+#include <VP_Stages/vp_stages_io_file.h>
+#include <VLIB/Stages/vlib_stage_encode.h>
+#include <VP_Stages/blockline_to_buffer_stage.h>
+
+
+#include "Video/ov7720.h"
+#include "Video/cresyn.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+//#define ACQ_WIDTH 176
+//#define ACQ_HEIGHT 144
+
+#define ACQ_WIDTH 640
+#define ACQ_HEIGHT 480
+
+#define CRESYN_CAM
+//#define OV_CAM
+//#define BLOCK_MODE
+//#define BUFFER
+//#define ENCODE 
+//#define FILE_OUTPUT
+//#define ETHERNET_OUTPUT
+
+
+
+#define NB_STAGES_MAX 10
+
+
+static vp_stages_input_camif_config_t  ivc;
+static vlib_stage_encoding_config_t  vec;
+static vp_stages_output_file_config_t  ofc;
+static vp_stages_output_com_config_t   occ;
+static blockline_to_buffer_config_t bbc;
+
+static PIPELINE_HANDLE pipeline_handle;
+
+
+C_RESULT
+buffer_to_picture_close(int *cfg)
+{
+  return (SUCCESS);
+}
+
+const vp_api_stage_funcs_t V4L2_funcs =
+{
+  (vp_api_stage_handle_msg_t)vp_stages_input_camif_stage_handle_msg,
+  (vp_api_stage_open_t)vp_stages_input_camif_stage_open,
+  (vp_api_stage_transform_t)vp_stages_input_camif_stage_transform,
+  (vp_api_stage_close_t)vp_stages_input_camif_stage_close
+};
+
+//// COM
+vp_com_t* wired_com(void)
+{
+  static vp_com_t com = {
+    VP_COM_WIRED,
+    FALSE,
+    0,
+    { { 0 } },
+    NULL,
+    NULL,
+    0,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+
+  return &com;
+}
+
+vp_com_config_t* wired_config(void)
+{
+  static vp_com_wired_config_t config = {
+    "eth0",
+    "172.20.2.190",
+    "255.255.255.0",
+    "172.20.2.255"
+  };
+  return (vp_com_config_t*) &config;
+}
+
+vp_com_connection_t* wired_connection(void)
+{
+  static vp_com_wired_connection_t connection = {
+    0
+  };
+
+  return (vp_com_connection_t*) (void*) &connection;
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+  vp_api_picture_t  video_picture;
+  vp_api_picture_t  buffer_blockline;
+#ifdef BLOCK_MODE
+  vp_api_picture_t  video_blockline;
+#endif
+  vp_api_io_pipeline_t pipeline;
+  vp_api_io_data_t out;
+  vp_api_io_stage_t stages[NB_STAGES_MAX];
+
+  vp_os_memset(&ivc,0,sizeof(ivc));
+  vp_os_memset(&ofc,0,sizeof(ofc));
+  vp_os_memset(&occ,0,sizeof(occ));
+
+
+  // CAMIF config
+  ivc.camera = "/dev/video1";
+  ivc.i2c = "/dev/i2c-0";
+#ifdef OV_CAM
+  ivc.camera_configure = &camera_configure_ov77xx;
+#else
+#ifdef CRESYN_CAM
+  ivc.camera_configure = &camera_configure_cresyn;
+#else  
+#error no cam selected
+#endif
+#endif
+
+  ivc.resolution = VGA;
+  ivc.nb_buffers = 8;
+  ivc.format                              = V4L2_PIX_FMT_YUV420;
+  ivc.y_pad                               = 0;
+  ivc.c_pad                               = 0;
+  ivc.offset_delta                        = 0;
+#ifdef BLOCK_MODE
+  ivc.vp_api_blockline                    = &video_blockline;
+#endif
+  ivc.vp_api_picture                      = &video_picture;
+  ivc.use_chrominances                    = 1;
+  ivc.framerate                                  = 15;
+
+  // BUFFER
+#ifdef BLOCK_MODE
+  bbc.picture                    = &video_blockline;
+#endif
+
+  // ENCODER
+  vec.width                               = 320;
+  vec.height                              = 240;
+#ifdef BLOCK_MODE
+  vec.block_mode_enable                   = TRUE;
+#else
+  vec.block_mode_enable                   = FALSE;
+#endif
+  vec.picture                             = &video_picture;
+  // OUTPUT FILE config
+  ofc.name = "/tmp/out.yuv";
+  
+  // COM CONFIG
+  occ.com                            = wired_com();
+  occ.config                         = wired_config();
+  occ.connection                     = wired_connection();
+  occ.socket.type                    = VP_COM_SERVER;
+  occ.socket.protocol                = VP_COM_TCP;
+  occ.socket.port                    = 5555;
+  occ.buffer_size                    = 640*480*3/2;
+
+  // build pipeline
+  pipeline.nb_stages = 0;
+
+  stages[pipeline.nb_stages].type    = VP_API_INPUT_CAMIF;
+  stages[pipeline.nb_stages].cfg     = (void *)&ivc;
+  stages[pipeline.nb_stages++].funcs = V4L2_funcs;
+
+#ifdef BLOCK_MODE
+#ifdef BUFFER
+  stages[pipeline.nb_stages].type    = VP_API_INPUT_CAMIF;
+  stages[pipeline.nb_stages].cfg     = (void *)&bbc;
+  stages[pipeline.nb_stages++].funcs =  blockline_to_buffer_funcs;
+#endif
+#endif
+
+#ifdef ENCODE 
+  stages[pipeline.nb_stages].type    = VP_API_FILTER_ENCODER;
+  stages[pipeline.nb_stages].cfg     = (void*)&vec;
+  stages[pipeline.nb_stages++].funcs = vlib_encoding_funcs;
+#endif
+
+#ifdef FILE_OUTPUT
+  stages[pipeline.nb_stages].type    = VP_API_OUTPUT_FILE;
+  stages[pipeline.nb_stages].cfg     = (void *)&ofc;
+  stages[pipeline.nb_stages++].funcs = vp_stages_output_file_funcs;
+#endif
+
+#ifdef ETHERNET_OUTPUT
+  stages[pipeline.nb_stages].type    = VP_API_OUTPUT_SOCKET;
+  stages[pipeline.nb_stages].cfg     = (void *)&occ;
+  stages[pipeline.nb_stages++].funcs = vp_stages_output_com_funcs;
+#endif
+
+  pipeline.stages = &stages[0];
+
+  // launch pipelines
+  vp_api_open(&pipeline, &pipeline_handle);
+  
+  out.status = VP_API_STATUS_PROCESSING;
+
+  /////////////////////////////////////////////////////////////////////////////////////////
+  
+  uint16_t i = 0;
+
+  struct timeval time1,time2;
+
+  printf("Pipeline launched....\n");
+  gettimeofday(&time1,NULL);
+  while(SUCCEED(vp_api_run(&pipeline, &out)) && (out.status == VP_API_STATUS_PROCESSING))
+    {
+      i++;
+      //printf("image %d \n",i);
+      if (i>50)
+        break;
+      //vp_os_delay(20);
+    }   
+  /////////////////////////////////////////////////////////////////////////////////////////
+  gettimeofday(&time2,NULL);
+  int seconde = time2.tv_sec-time1.tv_sec;
+  int ms = time2.tv_usec-time1.tv_usec;
+  if (ms<0)
+  {
+     seconde--;
+     ms += 1000000;
+  }
+  ms = ms/1000;
+  float fps = ((float)i*1000)/(float)(seconde*1000+ms);
+  printf("temps ecoule : %d.%d / nombre image : %d average fps : %f\n",seconde,ms,i,fps);
+  vp_api_close(&pipeline, &pipeline_handle);
+
+  return EXIT_SUCCESS;
+}
+