dual_mipi_min.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include "sp_vio.h"
  7. int main() {
  8. const int out_w = 1920;
  9. const int out_h = 1080;
  10. int widths[] = {out_w};
  11. int heights[] = {out_h};
  12. sp_sensors_parameters parms0;
  13. memset(&parms0, 0, sizeof(parms0));
  14. parms0.fps = -1;
  15. parms0.raw_width = 1920;
  16. parms0.raw_height = 1080;
  17. sp_sensors_parameters parms1;
  18. memset(&parms1, 0, sizeof(parms1));
  19. parms1.fps = -1;
  20. parms1.raw_width = 1920;
  21. parms1.raw_height = 1080;
  22. void *vio0 = sp_init_vio_module();
  23. void *vio1 = sp_init_vio_module();
  24. if (!vio0 || !vio1) {
  25. printf("[Error] sp_init_vio_module failed! vio0=%p vio1=%p\n", vio0, vio1);
  26. return -1;
  27. }
  28. // camera0: host0
  29. int ret0 = sp_open_camera_v2(vio0, 0, 0, 1, &parms0, widths, heights);
  30. printf("sp_open_camera_v2 cam0(host0) ret=%d\n", ret0);
  31. // camera1: host1
  32. int ret1 = sp_open_camera_v2(vio1, 0, 1, 1, &parms1, widths, heights);
  33. printf("sp_open_camera_v2 cam1(host1) ret=%d\n", ret1);
  34. if (ret0 != 0 || ret1 != 0) {
  35. printf("[Error] open failed: ret0=%d ret1=%d\n", ret0, ret1);
  36. if (vio0) {
  37. sp_vio_close(vio0);
  38. sp_release_vio_module(vio0);
  39. }
  40. if (vio1) {
  41. sp_vio_close(vio1);
  42. sp_release_vio_module(vio1);
  43. }
  44. return -2;
  45. }
  46. usleep(500 * 1000); // 等半秒让底层稳定
  47. int frame_size = out_w * out_h * 3 / 2; // NV12
  48. char *buf0 = (char *)malloc(frame_size);
  49. char *buf1 = (char *)malloc(frame_size);
  50. if (!buf0 || !buf1) {
  51. printf("[Error] malloc failed!\n");
  52. sp_vio_close(vio0);
  53. sp_vio_close(vio1);
  54. sp_release_vio_module(vio0);
  55. sp_release_vio_module(vio1);
  56. return -3;
  57. }
  58. memset(buf0, 0, frame_size);
  59. memset(buf1, 0, frame_size);
  60. int g0 = sp_vio_get_frame(vio0, buf0, out_w, out_h, 2000);
  61. int g1 = sp_vio_get_frame(vio1, buf1, out_w, out_h, 2000);
  62. printf("sp_vio_get_frame cam0 ret=%d\n", g0);
  63. printf("sp_vio_get_frame cam1 ret=%d\n", g1);
  64. if (g0 == 0) {
  65. FILE *fp0 = fopen("cam0_1920x1080_nv12.yuv", "wb");
  66. if (fp0) {
  67. fwrite(buf0, 1, frame_size, fp0);
  68. fclose(fp0);
  69. printf("saved cam0_1920x1080_nv12.yuv\n");
  70. }
  71. }
  72. if (g1 == 0) {
  73. FILE *fp1 = fopen("cam1_1920x1080_nv12.yuv", "wb");
  74. if (fp1) {
  75. fwrite(buf1, 1, frame_size, fp1);
  76. fclose(fp1);
  77. printf("saved cam1_1920x1080_nv12.yuv\n");
  78. }
  79. }
  80. free(buf0);
  81. free(buf1);
  82. sp_vio_close(vio0);
  83. sp_vio_close(vio1);
  84. sp_release_vio_module(vio0);
  85. sp_release_vio_module(vio1);
  86. printf("done\n");
  87. return 0;
  88. }