底层buffer状态机

系统通过五个状态队列实现帧缓冲区的全生命周期管理,各状态定义及转换逻辑如下:
FREE(空闲态)
功能描述 :管理初始可用缓冲区
初始化操作 :
场景运行时预分配所有 frame buffer 数组至该队列
记录 buffer 的内核虚拟地址及物理地址信息
数据结构 :frame buffer 结构体存储地址映射关系
REQUEST(请求态)
状态转换触发 :用户层调用 qbuf 接口
处理逻辑 :
解析用户传入的 frame buffer index 参数
校验目标 frame buffer 状态有效性
更新 buffer 元数据并置为 REQUEST 状态
将 buffer 移入 REQUEST 队列
PROCESS(处理态)
状态转换触发 :Frame Start 硬件中断
处理逻辑 :
从 REQUEST 队列提取首帧 buffer
置为 PROCESS 状态并压入处理队列
启动硬件模块数据处理
COMPLETE(完成态)
状态转换触发 :Frame End 硬件中断
处理逻辑 :
从 PROCESS 队列提取完成帧
置为 COMPLETE 状态并移入完成队列
生成帧元数据(时间戳、帧ID等)
USED(用户态)
状态转换触发 :用户调用 dqbuf 接口
处理逻辑 :
检测 COMPLETE 队列非空时触发状态转换
返回 frame buffer index 至用户空间
将 buffer 置为 USED 状态并移入用户队列
HAL层交互

初始化阶段
层级 | 操作内容 |
HAL 层 | 申请用户态 buffer 空间 |
驱动层 | 分配内核态 frame buffer |
协同操作 | 建立双向地址映射关系 |
帧获取阶段:

用户调用hb_vio_get_data接口,HAL通过dqbuf操作从驱动层获取包含帧识别信息,帧识别信息包含frame index,timestamp,frame id等帧信息,通过frame index,找到数组中的image结构体,并把相关的帧识别信息赋值到image结构体中,最后memcpy给用户;
帧释放阶段:

用户调用hb_vio_free_xxxbuf接口(每个模块都有对应的释放接口)传入需要释放的image信息,HAL通过获取image信息中的frame index识别标志,通过ioctl接口通知驱动层对应frame index的buffer使用完毕;
调试举例
常见调用获取帧失败,可通过logcat查看对应的buffer状态,并通过分析对应的buffer状态信息,可以定位问题的出错点:
通过出错通路的buffer状态可知,PYM1的输出buffer都在USED队列,说明底层buffer都被用户层拿走了,进而导致用户获取帧失败,需要用户查看自己的持有帧逻辑和归还逻辑;