简单查看流程,如有错误请指出。
CameraNativePreview.ets--> 这里开始进入uvc_camera库
(CameraDevice.ets/CameraManager.ets) --> CameraUtils.ets-->
-->CameraNativeMethods(index.d.ts文件,路径:
uvc_camera\src\main\cpp\types\libuvc_camera\index.d.ts)
-->camera_uvc.cpp-->(camera_factory_helper.h,camera->getUserStream())
其中camera->getUserStream()在ICameraDevice 中,是base类,有俩实现:
class CameraDeviceUsbImpl : public ICameraDevice
在camera_device_usb.h中,路径camera/usb,实现camera_device_usb.cpp
class CameraDeviceV4L2Impl : public ICameraDevice
在camera_device_v4l2.h中,路径camera/v4l2
这里分析camera_device_usb.cpp
-->CameraStreamUsbImpl(camera_stream_usb.cpp)-->(prepare_preview,do_preview):
prepare_preview-->(uvc_get_stream,uvc_get_frame_desc,这俩方法都指向stream.c,路径:
uvc_camera\src\main\cpp\libuvc\src\stream.c)
do_preview-->uvc_start_streaming-->stream.c-->uvc_start_streaming-->
(uvc_stream_open_ctrl,uvc_stream_start):
uvc_stream_open_ctrl-->(_uvc_get_stream_if,uvc_claim_if,uvc_stream_ctrl)
uvc_stream_start-->(uvc_find_frame_desc_stream,
libusb_fill_iso_transfer/libusb_fill_bulk_transfer,
pthread_create(&strmh->cb_thread, NULL, _uvc_user_caller, (void *)strmh);
libusb_submit_transfer)
-------------------------------------------------------------------------------------------------------------
这里根据红绿蓝三颜色分别分析:
一:
libusb_fill_iso_transfer-->_uvc_stream_callback-->(
_uvc_process_payload 或者
(pthread_cond_broadcast(&strmh->cb_cond);
pthread_mutex_unlock(&strmh->cb_mutex);))
这里根据LIBUSB_TRANSFER_XXX状态不同会走不同的路径,而libusb_fill_bulk_transfer和libusb_fill_iso_transfer一样都会走_uvc_stream_callback,路径一致
二:
pthread_create(&strmh->cb_thread, NULL, _uvc_user_caller, (void*)strmh
-->_uvc_user_caller--->(_uvc_populate_frame,
pthread_mutex_unlock(&strmh->cb_mutex);
strmh->user_cb(&strmh->frame, strmh->user_ptr);
)。
三:libusb_submit_transfer-->io.c-->libusb_submit_transfer
其中:_uvc_process_payload-->_uvc_swap_buffers
-->(pthread_cond_broadcast(&strmh->cb_cond);
pthread_mutex_unlock(&strmh->cb_mutex);)
数据是从linux_usbfs.c 中来的,从打开流到关闭流的整个过程,这里都会不停地打印:
op_submit_transfer:2
submit_bulk_transfer
handle_bulk_completion
op_submit_transfer:2
submit_bulk_transfer
_uvc_user_caller
而在获取参数的过程中:
就会开始不停地打印:
op_submit_transfer:0
submit_control_transfer
handle_control_completion
直到打开后突然就变成:
op_submit_transfer:2
submit_bulk_transfer
然后: _uvc_user_caller
而_uvc_user_caller方法见下:
do {
LOG_D("_uvc_user_caller");
pthread_mutex_lock(&strmh->cb_mutex);
while (strmh->running && last_seq == strmh->hold_seq) {
pthread_cond_wait(&strmh->cb_cond, &strmh->cb_mutex);
}
if (!strmh->running) {
pthread_mutex_unlock(&strmh->cb_mutex);
break;
}
last_seq = strmh->hold_seq;
_uvc_populate_frame(strmh);
pthread_mutex_unlock(&strmh->cb_mutex);
strmh->user_cb(&strmh->frame, strmh->user_ptr);
} while (1);
这里能否继续执行取决于&strmh->cb_cond,搜索&strmh->cb_cond发现多出调用了:
pthread_cond_broadcast(&strmh->cb_cond);
pthread_mutex_unlock(&strmh->cb_mutex);
如:_uvc_swap_buffers
_uvc_stream_callback
uvc_stream_stop
而在linux_usbfs.c中的执行是:
op_handle_events-->reap_for_handle-->r = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb);
-->handle_bulk_completion(itransfer, urb);-->usbi_mutex_unlock(&itransfer->lock);
或者是
op_submit_transfer-->submit_bulk_transfer-->ioctl(hpriv->fd, IOCTL_USBFS_SUBMITURB, urb);
然后通过itransfer的数据和状态变化,或者唤醒?调用_uvc_stream_callback ?? 这样就会和下面这段连接起来
而在stream.c中一般是通过:uvc_stream_start(开始执行一次)-->
_uvc_stream_callback
-->_uvc_process_payload
(_uvc_process_payload(strmh, transfer->buffer, transfer->actual_length);)-->
(
if (header_info & UVC_STREAM_EOF || strmh->got_bytes == strmh->cur_ctrl.dwMaxVideoFrameSize) {
//来交换缓冲区,表示已接收完整帧
_uvc_swap_buffers(strmh);
}
)
-->_uvc_swap_buffers
-->_uvc_user_caller
uvc_camera\src\main\cpp\libusb\os\linux_usbfs.c
这个包括了基本的usb操作
uvcCamera\uvc_camera\src\main\cpp\libusb\io.c
这个包括了io
uvc_camera\src\main\cpp\libuvc\src\stream.c
这里封装了基本的相机流操作
然后关于
pthread_cond_broadcast(&strmh->cb_cond)
pthread_mutex_unlock(&strmh->cb_mutex)
以及close流程 ??