当前位置: 首页 > news >正文

鸿蒙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流程 ??

http://www.lqws.cn/news/457795.html

相关文章:

  • .docx 和 .doc 都是 Word 文档格式的区别
  • HCIP-华为VRP系统基础
  • Sentinel实现原理
  • 使用docker-compose安装kafka
  • 计算机——硬盘分区和格式化
  • C++11 GC Interface:从入门到精通
  • docker基础入门于应用的实践
  • 使用 OpenCV 和传统机器学习实现工业开关状态识别
  • RAG 升级之路:如何让问答机器人真正“智能”起来
  • iOS应用启动时间优化:通过多工具协作提升iOS App性能表现
  • 异常的处理
  • 云计算与5G:如何利用5G网络优化云平台的性能
  • 芋道源码 - 添加反向代理, 通过公网域名访问静态资源图片
  • 【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台
  • 日常运维问题汇总-16
  • 西门子S7通信协议抓包分析应用
  • Tomcat项目本地部署(Servlet为例)
  • 详解Redis的热点key问题
  • linux线程同步
  • Rust 项目文档生成之旅:cargo doc
  • 字符编码(UTF-8,16,32 和GBK和ASCLL码)
  • AI Agent开发与安全
  • 数据结构-顺序表-求基数乘积
  • 《Go语言圣经》类型断言应用:高效类型判断
  • I排序算法.go
  • 如何轻松将照片从 iPhone 传输到 Android?
  • 【八股消消乐】Elasticsearch优化—检索Labubu
  • NumPy玩转数据科学
  • Java 集合框架底层数据结构实现深度解析
  • 高效打印 PDF 文档:基础操作与自动打印(含C# .NET方案)