鸿蒙uvc预览

简单查看流程,如有错误请指出。

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_transferlibusb_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流程 ??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值