鴻蒙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
英文地址,請注明出處:http://en.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 矩陣快速漲粉呢?下面將為您…