AVStreamCamera
2025-02-19
21
0
AVStreamCamera是基于KS框架弄的一个虚拟相机。
当然,对于USB虚拟相机,之前搞了很多个了。都在USB中文网上有相关的技术文档。
AVStream本人的理解是其MINI端口驱动分为三个层次:
- 设备 - KSDEVICE_DESCRIPTOR
- Filter - KSFILTER_DESCRIPTOR
- Pin - KSPIN_DESCRIPTOR_EX
- Node
- Interfaces
- connection
其三种类型分别向框架其对应的描述符(工厂),最终由系统创建其对应的实例。
AVStreamCamera的工作流程
学习驱动代码的关键点就是理解代码流程及回调的功能。
对于一个AVStream相机的打开流程如下:
Create CCaptureFilter
//以下是支持的几种格式分辨率分别校验的过程
CCapturePin::IntersectHandler STATUS_BUFFER_OVERFLOW 3
CCapturePin::IntersectHandler STATUS_SUCCESS 5
CCapturePin::IntersectHandler STATUS_BUFFER_OVERFLOW 3
CCapturePin::IntersectHandler STATUS_SUCCESS 5
CCapturePin::IntersectHandler STATUS_BUFFER_OVERFLOW 3
CCapturePin::IntersectHandler STATUS_SUCCESS 5
CCapturePin::IntersectHandler STATUS_BUFFER_OVERFLOW 3
CCapturePin::IntersectHandler STATUS_SUCCESS 5
//打开相机时,指定的格式
CCapturePin::DispatchSetFormat OldFormat=0000000000000000 Status=0
CCapturePin::DispatchCreate
Create CCapturePin
FromState:KSSTATE_STOP ------> ToState:KSSTATE_ACQUIRE
FromState:KSSTATE_ACQUIRE ------> ToState:KSSTATE_PAUSE
FromState:KSSTATE_PAUSE ------> ToState:KSSTATE_RUN
CCapturePin::Process 0
CCapturePin::Process 1
CCapturePin::CompleteMappings 0
CCapturePin::Process 2
CCapturePin::CompleteMappings 1
...
CCapturePin::SetState(FromState:KSSTATE_RUN ------> ToState:KSSTATE_PAUSE)
CCapturePin::SetState(FromState:KSSTATE_PAUSE ------> ToState:KSSTATE_ACQUIRE)
CCapturePin::SetState(FromState:KSSTATE_ACQUIRE ------> ToState:KSSTATE_STOP)
Cleanup CCapturePin
~CCapturePin
Cleanup CCaptureFilter
从日志来看:
- Filter层面
- 使用软件打开相机时,才会创建Filter
- 调用IntersectHandler进行格式枚举及协商
- DispatchSetFormat 格式确认
- Pin层面
- 创建数据流Pin
- 调用CCapturePin::SetState,Pin工作状态变换
- 调用CCapturePin::Process获数据传输