鸿蒙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.pswp.cn/diannao/87899.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP的打印语句

文章目录 环境总结打印语句换行符括号数组(对象)和字符串之间的相互转换 打印语句echoprint括号print_rvar_dump 数组(对象)和字符串之间的转换json_encodejson_decodeimplodeexplode 环境 PHP 8.4.5 总结 如果不想看详细介绍&…

功率MOSFET的SOA曲线

功率MOSFET的SOA曲线 SOA区指的是MOSFET的安全工作区,英文表示为Safe Operating Area,是指MOSFET(金属氧化物半导体场效应晶体管)的安全操作范围。在线性模式运行的情况下,SOA特别有用。但开关模式下,一般…

Stacking集成BP神经网络/RF/SVM和遗传算法的煤炭配比优化

一、煤炭配比优化的问题本质与技术路线 煤炭配比需同时满足煤质指标(灰分、挥发分、热值)、燃烧特性(着火温度、燃尽指数)、经济成本等多目标优化。传统方法依赖经验公式,难以处理非线性关系: 核心难点&a…

Unity Shader开发-着色器变体(2)-定义着色器变体

一.定义着色器变体 定义一个着色器变体(Shader Variant)从概念和实现上讲,主要包括以下几个核心部分 1.使用预编译指令来声明变体关键字 关键字是驱动变体生成的“开关”。它们是简单的字符串标识符,用于在 Shader 代码中标记不…

sql server耗时模拟

REATE PROCEDURE SimulateDelay AS BEGINPRINT 开始耗时操作...;-- 模拟等待 5 秒WAITFOR DELAY 00:00:05;PRINT 耗时操作完成。; END 方法二:使用忙循环(不推荐,CPU 占用高) CREATE PROCEDURE SimulateBusyLoop AS BEGINDECLARE start DATETIME GETDAT…

Zookeeper的典型应用场景?

大家好,我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助; Zookeeper的典型应用场景? 超硬核AI学习资料,现在永久免费了! Zookeeper 是一个分布式协调服务,广泛应用于需要高可用性、分…

STM32F103_LL库+寄存器学习笔记12.3 - 串口DMA高效收发实战3:支持多实例化的版本

导言 《STM32F103_LL库寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率》基于上一个版本,进一步提升代码的模块化水平,支持多实例化。 如上所示,收发大量的数据,没有丢包。 项目地址&#xff1a…

跨平台的重构版Notepad++文本编辑器

跨平台 Notepad 替代方案 Notepad 是 Windows 平台上的流行文本编辑器,但其原生版本不支持跨平台。以下是功能相似且支持多平台的替代工具: Notepadqq(Linux/macOS/Windows) Notepadqq 是 Notepad 的开源跨平台版本&#xff0c…

意法STM32F103C8T6 单片机ARM Cortex-M3 国民MCU 电机控制到物联网专用

STM32F103C8T6 单片机全面解析 1. 产品定位 STM32F103C8T6 是意法半导体(ST)推出的 经典ARM Cortex-M3内核单片机,采用 LQFP48封装,以 高性能、丰富外设和超高性价比 成为嵌入式开发领域的"国民MCU"。 2. 核心功能特…

Sui 技术如何助力 Claynosaurz 成功推出 Popkins NFT

像 Claynosaurz 这样的品牌利用 Sui 推动链上创新的边界,展示了 Web3 如何结合互动娱乐并带来独特全新的体验。Claynosaurz 最近在 Sui 上推出的 Popkins NFT 系列及其大型抽奖活动,不仅在社区参与度上取得了成功,也有力地展示了 Sui 独特的技…

OpenCV CUDA模块设备层-----反正弦运算函数asin()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对一个 uchar 类型的像素值(范围 [0, 255]),先归一化到浮点范围 [0.0, 1.0],然后计算其反正弦值 …

PixiJS 中 HTMLText 富文本渲染问题探究与优化思考​

起因 在使用 PixiJS 进行富文本渲染开发过程中,遭遇 HTMLText 组件处理中文字体加载时出现显著卡顿现象。针对此问题,在开源社区提交 issue 并附上相关技术细节与运行表现,期望获得解决方案。 提issues 从 issue 反馈内容来看,项目…

五、Redis的IO模型

简介 在谈及Redis为什么快的时候,很多人都只能回答redis是基于内存,所以快。但他们往往不知道,决定redis快的因素,还有它的IO模型-Reactor模型。谈及Redis的IO模型之前,先补充一下IO模型的基础知识。 IO模型演化 1.堵塞…

Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比

下面从 API 定位、坐标体系、性能表现、面试常问点几个维度详细对比 Cesium、Three.js 与原生 WebGL 的绘制差异。 🧭 1. API 定位与典型应用 Cesium 聚焦全地球 GIS 场景,支持地形、影像、时空动态等地理信息功能,是专业级地图应用首选。 T…

单点登录(SSO)系统

设计一个 Java 单点登录(SSO)系统需要解决跨系统认证和会话共享问题。以下是核心设计和实现方案,包含关键组件和代码示例: 一、核心概念 认证中心 (Auth Center):中央身份验证服务令牌 (Token):用户身份凭…

《信息技术》科技核心期刊推荐

【科研必看】《信息技术》——科技核心期刊,助力你发表高影响力论文! 如果你是一位科研工作者、学者或者在校学生,正在为发表论文而努力,那么《信息技术》期刊无疑是你不可错过的选择!这本期刊以其卓越的学术影响力&am…

界面组件DevExpress WPF中文教程:Grid - 如何遍历节点?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

2D写实交互数字人:让AI形象拥有“真人温度“的技术革命

在人工智能技术日新月异的今天,数字人已不再是科幻电影中的概念,而是逐步渗透到我们日常生活的各个领域。然而,市场上大多数数字人产品仍停留在"能说会动"的初级阶段,缺乏真正的情感交互能力,这种"机械…

2025 年拓客系统排行榜

在数字化营销时代,拓客系统成为企业获取客户资源、提升销售效率的关键工具。以下为您盘点 2025 年表现出色的中文名字拓客系统,其中 微拓客 凭借强大功能脱颖而出,成为众多从业者的首选。 一、微拓客:精准拓客的全能王者 微拓客堪…

TikTok 矩阵如何快速涨粉

在社交媒体的广袤天地里,TikTok 以其强大的影响力和庞大的用户基础,成为众多创作者和品牌竞相角逐的舞台。构建 TikTok 矩阵,是扩大影响力、实现快速涨粉的有效策略。那么,究竟如何让 TikTok 矩阵快速涨粉呢?下面将为您…