capture.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "EventCode.h"
  4. #include "libaudioqueue.h"
  5. #include "libvideoqueue.h"
  6. #include "rvc_media_common.h"
  7. #include "cJSON.h"
  8. #ifdef RVC_OS_WIN
  9. #include <portaudio.h>
  10. #include "videoframework.h"
  11. #include "../../Other/win/sharequeue/share_queue_write.h"
  12. #else
  13. #include "videoutil.h"
  14. #include "imediadeviceinfo.h"
  15. #include "iaudiomgrinterface.h"
  16. #include "ivideocaptureinterface.h"
  17. #endif // RVC_OS_WIN
  18. #ifndef INT64_C
  19. #define INT64_C(c) (c##LL)
  20. #define UINT64_C(c) (c##UL)
  21. #endif
  22. #include <stdint.h>
  23. extern "C"{
  24. #include <libavutil/avutil.h>
  25. #include <libavcodec/avcodec.h>
  26. #include <libswscale/swscale.h>
  27. }
  28. #ifndef MAX_PATH
  29. #define MAX_PATH 260
  30. #endif
  31. #ifndef CAPTURE_FRAME_TIME
  32. #define CAPTURE_FRAME_TIME 20 // 20ms per frame
  33. #endif
  34. #ifndef CAPTURE_CLOCK
  35. #define CAPTURE_CLOCK 8000
  36. #endif
  37. #define CAMERA_BUG_THRESHOLD 6
  38. #define CAMERA_TIMEOUT 15
  39. #define CAMERA_MIN_TIMEOUT 5
  40. #define CAMERA_RESTARTNUM 6
  41. #ifndef RVC_MAX_DELAY_TIME
  42. #define RVC_MAX_DELAY_TIME 180
  43. #endif // !RVC_MAX_DELAY_TIME
  44. #ifndef RVC_CAM_INTERVAL_TIME
  45. #define RVC_CAM_INTERVAL_TIME 300
  46. #endif // !RVC_CAM_INTERVAL_TIME
  47. #ifndef AUDIO_BUG_THRESHOLD_TIME
  48. #define AUDIO_BUG_THRESHOLD_TIME 60
  49. #endif // !AUDIO_BUG_THRESHOLD_TIME
  50. #ifndef RVC_ENV_VIRTUALCAMERA
  51. #define RVC_ENV_VIRTUALCAMERA "RVC_ENV_Virtual_Camera"
  52. #endif
  53. #ifndef RVC_OPT_VIRTUALCAMERA
  54. #define RVC_OPT_VIRTUALCAMERA "RVC_OPT_Virtual_Camera"
  55. #endif
  56. namespace MediaController {
  57. typedef struct capture_t capture_t;
  58. typedef struct rvc_sales_audio_capture_s rvc_sales_audio_capture_t;
  59. typedef struct capture_config_s {
  60. int video_env_dev; // -1 means invalid
  61. int video_opt_dev; // -1 means invalid
  62. int video_env_rotate; // counter-clockwise degree, ignore currently
  63. int video_opt_rotate; // counter-clockwise degree
  64. int video_env_fps;
  65. int video_opt_fps;
  66. int video_env_brightness;
  67. int video_opt_brightness;
  68. CSimpleStringA strAudioIn;
  69. CSimpleStringA strAudioOut;
  70. CSimpleStringA strAudioState;
  71. CSimpleStringA strVideoEnv;
  72. CSimpleStringA strVideoOpt;
  73. volatile LONG *ref_env_capture_count;
  74. volatile LONG *ref_opt_capture_count;
  75. volatile LONG *ref_envopt_capture_count;
  76. unsigned int uintervaltime;
  77. #ifdef RVC_OS_LINUX
  78. pthread_mutex_t* env_mutex;
  79. pthread_mutex_t* opt_mutex;
  80. pthread_mutex_t* envopt_mutex;
  81. #endif
  82. }capture_config_t;
  83. typedef struct rvc_audio_capture_config_s {
  84. CSimpleStringA strAudioIn; //收音设备
  85. CSimpleStringA strAudioOut; //放音设备
  86. size_t audio_capture_samplerate;
  87. size_t audio_capture_period;
  88. }rvc_audio_capture_config_t;
  89. extern DeviceTypeEnum g_eDeviceType;
  90. typedef struct audio_capture_t {
  91. #ifdef RVC_OS_WIN
  92. PaStream* stream;
  93. #else
  94. IAudioMgr* paudiocap;
  95. char* paudio_buffer;
  96. size_t uaudiolen;
  97. #endif
  98. Clibaudioqueue *shm_queue;
  99. Clibaudioqueue *salesol_shm_queue;
  100. capture_t *parent;
  101. int iseriesnumber;
  102. }audio_capture_t;
  103. //音频采集结构体
  104. typedef struct rvc_audio_capture_s{
  105. #ifdef RVC_OS_WIN
  106. PaStream* stream;
  107. #else
  108. IAudioMgr* paudiocap;
  109. char* paudio_buffer;
  110. size_t uaudiolen;
  111. bool bputremote;
  112. #endif
  113. Clibaudioqueue *audio_shm_queue; // 音频包存储队列
  114. rvc_sales_audio_capture_t *parent;
  115. int iaudio_capture_samplerate; // 音频采样率,默认值为8K
  116. int iaudio_capture_peroid; // 音频采样率周期,默认20ms,每秒50个包
  117. int iseriesnumber; // 音频包序号
  118. }rvc_audio_capture_t;
  119. typedef struct video_capture_t {
  120. #ifdef RVC_OS_WIN
  121. videocap_t cap;
  122. share_queue original_shm_queue;
  123. #else
  124. IVideoCapture* pVideoCap;
  125. int virtual_device_fd;
  126. #endif
  127. Clibvideoqueue *snapshot_shm_queue;
  128. Clibvideoqueue *preview_shm_queue;
  129. Clibvideoqueue *rtp_shm_queue;
  130. capture_t *parent;
  131. int camera_type; // CAMERA_TYPE_xxx
  132. int frame_id;
  133. unsigned int ulastcaptime;
  134. struct SwsContext *preview_sws_ctx;
  135. struct SwsContext *rtp_sws_ctx;
  136. unsigned int ustarttime;
  137. #ifdef DEVOPS_ON_PRD
  138. #else
  139. #ifdef RVC_OS_WIN
  140. #else
  141. bool bsavephoto;
  142. char strsavedir[MAX_PATH];
  143. char strphotoname[MAX_PATH];
  144. int isaveinterval;
  145. #endif
  146. #endif
  147. }video_capture_t;
  148. struct capture_t{
  149. capture_config_t config;
  150. audio_capture_t *handfree_audio;
  151. video_capture_t *env_video;
  152. video_capture_t *opt_video;
  153. };
  154. struct rvc_sales_audio_capture_s{
  155. rvc_audio_capture_config_t rvc_audio_config;
  156. rvc_audio_capture_t *rvc_audio;
  157. };
  158. int capture_create(const capture_config_t *config, capture_t **p_cap, bool bstartaudio = true);
  159. ErrorCodeEnum capture_create(const capture_config_t *config,capture_t *cap,int nCamera);
  160. void capture_destroy(capture_t *cap);
  161. ErrorCodeEnum capture_start(capture_t *cap, bool bstartaudio = true);
  162. ErrorCodeEnum start_audio_capture(audio_capture_t *paudio);
  163. ErrorCodeEnum capture_start(capture_t *cap,int nCamera);
  164. void capture_stop(capture_t *cap);
  165. int capture_lib_init(int* ivideonum);
  166. int capture_detect_camera_bug(capture_t *cap, int *env_n, int *opt_n, bool bsinglecam);
  167. int capture_get_last_frametime(capture_t *cap, unsigned int* env_n, unsigned int* opt_n);
  168. int capture_get_last_audio_frametime(capture_t* cap, unsigned int* handfreein_n);
  169. int salesaudio_capture_create(rvc_audio_capture_config_t *config, rvc_sales_audio_capture_t **p_cap);
  170. void salesaudio_capture_destroy(rvc_sales_audio_capture_t *cap);
  171. ErrorCodeEnum salesrecord_audio_capture_start(rvc_sales_audio_capture_t *cap);
  172. void salesrecord_audio_capture_stop(rvc_sales_audio_capture_t *cap);
  173. void capture_lib_term();
  174. int capture_get_video_device_id(const char *dev_name);
  175. bool capture_adj_brightness(capture_t *cap,int nvalue, ErrorCodeEnum nCode);
  176. bool capture_set_autobrightness(capture_t *cap, ErrorCodeEnum nCode);
  177. int capture_get_brightness(capture_t *cap, ErrorCodeEnum nCode);
  178. int capture_get_camera_brightness(int* ibrightness, capture_t* cap, ErrorCodeEnum nCode, int icameraid);
  179. int capture_set_camera_brightness(int ibrightness, capture_t* cap, ErrorCodeEnum nCode, int icameraid);
  180. int stopcamera(capture_t *cap,int nCamera);
  181. void capture_destroy(capture_t *cap,int nCamera);
  182. //清空抓拍队列里的照片,摄像头故障时调用
  183. void capture_clearsnapshotvideo(capture_t *cap,int nCamera);
  184. int get_camera_exception_message(char* pBuffer, size_t uLen, CSimpleStringA strDeviceName, const char* strErrorMessage);
  185. int capture_get_audio_device_list(bool in_direction, CSimpleStringA& strdevicelist);
  186. int capture_get_video_device_list(CSimpleStringA& strdevicelist);
  187. int capture_get_env_rawbrightnessinfo(capture_t* cap, ErrorCodeEnum nCode, int* imin, int* imax);
  188. int capture_set_env_rawbrightness(capture_t* cap, ErrorCodeEnum nCode, int ibrightness);
  189. }