UVC app流程图

简介

uvc_app实现了完整的uvc device的功能,包括配置、预览、切换、事件及指令响应等,通过采集摄像头的数据,通过MJPG编码或者H264编码通过ISOC模式传输。

使用方法

  • 使能uvcapp:make menuconfig,选择enable uvcapp或在buildroot对应产品defconfig中添加BR2_PACKAGEUVCAPP=y
  • 确认uvc_config.sh:确认usb设备配置,目前支持uvc和rndis复合。
  • 执行uvcconfig.sh,若需要使用复合设备如rndis,执行uvcconfig.sh rndis
  • 执行uvc_app默认将摄像头数据通过uvc传输

源码说明

  • 编译相关:/external/uvcapp/CMakeLists.txt、/buildroot/package/rockchip/uvcapp/Config.in uvc_app.mk

  • 入口:main.c

  • usb脚本配置相关:uvc_config.sh

  • process:camera初始化、PU处理、反初始化等处理

    • camera_control.cpp:camera线程处理实现
    • camerapucontrol.cpp:camera PU处理实现
  • 热拔插事件:uevent.c, uevent.h

  • uvc: uvc处理代码

    • 控制uvc,camera,编码线程的打开关闭:uvccontrol.c,uvccontrol.h
    • uvc编码传输处理:uvcencode.cpp,uvcencode.h
    • uvc主流程:uvc-gadget.c,uvc-gadget.h
    • uvc多节点操作,buffer管理:uvcvideo.cpp,uvcvideo.h
    • MJPG/H264编码:mpienc.c,mpienc.h
    • YUV格式转化:yuv.c,yuv.h
  • drm内存操作:drm.c,drm.h

代码demo目录:external/uvc_app
# uvc_app代码流程:
 
Main.c:main()   //初始化传入的长宽,运行模式flag等参数,申请buffer
    drm_open/drm_alloc/drm_handle_to_fd
->uvc_control_run(flags) //运行uvc控制接口,默认LOOP_ONCE,循环等待uvc驱动切换设置完成
 
    ->uvc_control.c:uevent_monitor_run //uvc事件监听线程启动,循环监听video4linux(v4l2)是否接入事件
        ->video_uevent //解析是否为add video接入事件,
            ->uvc_control_signal 识别到add video,通知uvc control线程,find_video设置为true;
    ->uvc_control_thread //创建并启动uvc control线程,循环判断uvc 是否连接
        ->check_uvc_video_id // 检测uvc 是否连接,通过循环读取cat /sys/class/video4linux/video%d/name,识别是否有名称带usb或gadget的uvc节点
        ->add_uvc_video //启动uvc连接
 
             ->uvc_video.cpp:uvc_video_id_add // 第一次进入初始化结构体uvc_video,启动uvc_gadget线程
                ->uvc_gadget_pthread_create //启动uvc_gadget线程
 
                    ->uvc-gadget.c:uvc_gadget_main //运行main,初始化uvc_device结构体,配置uvc各参数:名称 长宽 传输格式,速度,io模式配置等,打开uvc device,初始化event
                       ->uvc_open //ioctl控制驱动启动uvc设备 
                        ->uvc_events_init //根据传入fcc配置初始化uvc device相关event注册,接下来循环处理事件和数据
                        while循环
                        ->uvc_events_process //v4l2事件处理函数
                            ->uvc_events_process_setup //处理host请求的UVC_EVENT_SETUP事件
                            ->v4l2_stop_capturing
                            ->uvc_events_process_data -> uvc_events_process_control_data// 处理host请求的UVC_EVENT_DATA事件->像曝光、白平衡,亮度,对比度,等等
                            ->uvc_handle_streamon_event//处理host请求的UVC_EVENT_STREAMON事件,视频流传输启动
 
                                ->uvc_control.c:uvc_control_init //将获取的宽高信息等传入
                                    ->uvc_encode_init  
                                        ->mpi_enc.c:mpi_enc_cmd_config_mjpg //配置为MPP_VIDEO_CodingMJPEG编码类型,格式为MPP_FMT_YUV420SP( NV12、NV21)
                                        ->mpi_enc.c:mpi_enc_test_init
                                            ->test_ctx_init
                                            ->mpp_create //mpp接口
                                            ->mpp_init  /mpp接口
                                            ->test_mpp_setup// 编码配置与计算相关
                                            
 
                        ->uvc-gadget.c:uvc_video_process//在uvc 视频流开启的情况下,主要对v4l2 buffer队列的qbuffer和dqbuffer响应处理
 
->while(1) { ...
      uvc_read_camera_buffer  //循环将相机原始数据编码后信息写到uvc buffer队列
    }
    ->uvc_encode.cpp:uvc_encode_process  //按格式编码处理函数
        (->mpi_enc.c:mpi_enc_test_run // mjpeg格式下先调用该函数编码)
        ->uvc_video.cpp:uvc_buffer_write 
            ->_uvc_buffer_write//数据的格式转换部分
                ->uvc_buffer_push_back(&v->uvc->read, buffer);//将转换后的数据push到read队列,后续传输给host
 
 
代码简单流程分析到此,总结如下:uvc 模组端运行步骤:
    1.usb uvc与AP端需要连接并配置ready,代码可通过循环读取cat /sys/class/video4linux/video%d/name,识别是否有名称带usb或gadget的uvc节点;
    2.运行uvc_control_run,启动uvc_control线程来初始化uvc相关服务与事件监听处理接口;
    3.uvc_read_camera_buffer ,循环读取相机数据按设置格式编码转换后传入uvc buffer队列供host端处理。
 
三部同事整理的旧版video demo流程如下,与uvc_app主流程一致:
 
 
                                                                            
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Android 10上,应用程序可以使用UVC(USB Video Class)标准来打开摄像头。UVC是一种基于USB设备的视频通信标准,它允许应用程序与外部摄像头进行通信并接收视频流。下面是使用UVC打开摄像头的步骤: 1. 在AndroidManifest.xml文件中添加相应的权限。例如,添加相机权限:<uses-permission android:name="android.permission.CAMERA" /> 2. 在应用程序中使用摄像头API来检测是否有支持UVC的摄像头设备。可以使用USBManager类来获取连接的USB设备列表,并判断其中是否有UVC摄像头。 3. 如果有支持UVC的摄像头设备,则可以使用USBManager类打开该设备。使用openDevice()方法打开设备,然后使用claimInterface()方法请求访问USB接口。 4. 打开摄像头设备之后,可以使用相应的UVC命令来设置和控制摄像头的功能。例如,使用UVC命令来调整曝光、对焦、白平衡等设置。 5. 接下来,可以使用UVC摄像头的输出流来获取视频数据。可以使用USBManager的bulkTransfer()方法从USB设备接收视频数据流,并进行相应的处理和显示。 需要注意的是,在使用UVC打开摄像头时,需要保证设备具有UVC驱动程序的支持,并且摄像头设备已正确连接到Android设备的USB端口。此外,还需要注意权限的申请和正确的UVC命令的使用,以便能够正确地与UVC摄像头进行通信和控制。 总之,使用UVC打开摄像头可以为Android 10上的应用程序提供与外部摄像头的连接和视频数据传输功能,让应用程序能够更加灵活地处理和显示摄像头的图像数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值