当前位置:   article > 正文

高通AIS获取视频流

高通ais

高通由于驱动模块位于QNX侧,所以高通本身实现了一套以hypervisor为基础的传输数据的模块。
AIS就是其中用于传输摄像头数据的接口。本文章基于sa8155p实现QCARCAM的数据。

QNX介绍

QNX是由加拿大的Quantum Software Systems公司创建的实时操作系统。该公司的创始人是Dan Dodge和Gordon Bell。1980年代初,他们开始研究实时操作系统,并于1982年创建了Quantum Software Systems公司。该公司的第一个产品是QNX操作系统。

QNX最初是用于数控机床和其他实时控制应用的,但很快就被应用在其他领域,如通讯设备、医疗设备、汽车电子等。

1999年,QNX被收购并成为黑莓的子公司。目前,QNX已经成为汽车电子市场的领先供应商,其操作系统被广泛应用于汽车的娱乐系统、驾驶员信息系统、车载通信等领域。

AIS介绍

高通AIS是高通公司的人工智能解决方案,它包括一系列的硬件和软件技术,用于在移动设备、物联网和汽车等领域中实现人工智能的应用。高通AIS的核心是高通骁龙移动平台上的人工智能引擎,它可以加速深度学习任务的执行,提高计算效率和节能效果。高通AIS还提供了一系列丰富的开发工具和样例代码,帮助开发者更快地构建人工智能应用。

SA8155P参数指标

  • CPU
    • Custom 64-bit Kryo octa-core CPU
    • 7nm FINFET with advanced power savings
    • SOC virtualization support
    • 384 KB L1 I/D + 1.875 MB L2 + 2 MB L3
    • 3 MB system cache
  • GPU
    • Adreno 640 GPU: OpenGL ES 3.x OpenCL 2.0 Full, Vulkan, RenderScript, 64-bit virtual addressing, plus hardware tessellation, geometry shaders, programmable blending, and decreased power consumption
    • High granularity for preemption with HW queues and doorbell features
  • DSP + NPU
    • Qualcomm® Hexagon™ 6 DSP with Hexagon Vector eXtensions (HVX)—Four instances
    • Neural Processing Engine (NPU) for machine learning acceleration

AIS结构

AIS结构图
ais侧用ais_client去获取视频数据流。

AIS获取数据过程

AIS获取过程

AIS对应获取接口

接口调用

API接口说明

qcarcam_ret_t qcarcam_initialize(qcarcam_init_t* p_init_params);
qcarcam初始化
qcarcam_ret_t qcarcam_query_inputs(qcarcam_input_t* p_inputs, unsigned int size, unsigned int* ret_size);
查询有效camera,驱动配置了多少个camera,并获取相机得基本属性
qcarcam_hndl_t qcarcam_open(qcarcam_input_desc_t desc);
打开camera,输入参数为camera_id,oms为0, dms为1
qcarcam_ret_t qcarcam_s_buffers(qcarcam_hndl_t hndl, qcarcam_buffers_t* p_buffers);
设置buffer参数,重要的是buffer缓冲个数不得少于2,建议个数设置为5
qcarcam_ret_t qcarcam_start(qcarcam_hndl_t hndl);
开启照相机
qcarcam_ret_t qcarcam_get_frame(qcarcam_hndl_t hndl, qcarcam_frame_info_t* p_frame_info, unsigned long long int timeout, unsigned int flags);
获取视频帧,默认超时时间设置为500000000
qcarcam_ret_t qcarcam_release_frame(qcarcam_hndl_t hndl, unsigned int idx);
释放帧数据,在获取帧数据拷贝后,一定要执行release操作
qcarcam_ret_t qcarcam_stop(qcarcam_hndl_t hndl);
停止获取摄像头视频帧
qcarcam_ret_t qcarcam_close(qcarcam_hndl_t hndl);
关闭摄像头
qcarcam_ret_t qcarcam_uninitialize(void);
释放ais资源

QNX和Android不同的设置共享内存的方式

qcarcam_s_buffers设置buffer的不同方式

Android侧共享内存

int ionDev = open("/dev/ion", O_RDONLY);

int aret                                   = alloc_ion_buffer(ionDev, ion_buf);

mQcarcamOutBufs.buffers[i].planes[0].p_buf = (void *)(uintptr_t)(ion_buf->fd);

mpQcarcamMmapBufs[i].size = mQcarcamOutBufs.buffers[i].planes[0].size;

mpQcarcamMmapBufs[i].ptr = mmap(NULL, mpQcarcamMmapBufs[i].size, PROT_READ | PROT_WRITE, MAP_SHARED, ion_buf->fd, 0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Android 侧需要通过读取/dev/ion指定文件获取文件的fd,再通过map映射关系来获取指针。

QNX侧共享内存

ion_bufs[i].ptr[0]  = pmem_malloc_ext_v2(mQcarcamOutBufs.buffers[i].planes[0].size + mQcarcamOutBufs.buffers[i].planes[1].size,

                                   PMEM_CAMERA_ID, PMEM_FLAGS_SHMEM | PMEM_FLAGS_PHYS_NON_CONTIG | PMEM_FLAGS_CACHE_NONE,

                                                 PMEM_ALIGNMENT_4K, 0, (pmem_handle_t *)&ion_bufs[i].mem_handle, NULL);

mQcarcamOutBufs.buffers[i].planes[0].p_buf = ion_bufs[i].mem_handle;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

区别于Android的方式,由于视频驱动位于QNX侧,所以QNX获取视频数据不需要通过V4l2结构来获取,直接可以通过pmen内存共享的方式获取

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/964127
推荐阅读
相关标签
  

闽ICP备14008679号