环境
- 树莓派 2 B+
- Debian Linux
- OpenMAX IL
用例
- OpenMAX 相机 视频采集
- 摄像头端口被禁用
- 渲染器/相机隧道已设置
- 所有组件状态设置为空闲
- 端口已启用
问题描述
第一个端口被启用到相机输入端口(端口#73),使用“OMX_CommandPortEnable”命令启用端口,与“OMX_CommandPortDisable”命令一样,相机组件预计会触发它的“OMX_CALLBACKTYPE:: EventHandler”事件处理程序具有“eEvent == OMX_EventCmdComplete”和“nData1 == OMX_CommandPortEnable”,但是,这永远不会发生,应用程序会无限等待端口启用。
问题分析
我将 std::condition_variable 与 std::mutex 结合使用以等待状态更改完成,因此,OMX_CALLBACKTYPE::EventHandler 更新条件变量并调用“notify_one()”,而调用者线程锁定 std::mutex 和等待设置条件变量,使用这种方法“OMX_CALLBACKTYPE::EventHandler”永远不会被调用(带有任何参数),并且程序永远锁定。
注意:当等待条件变量时,互斥锁被验证为不被拥有,这是通过验证 (0 == std::mutex::__owner) 来完成的。
但是,通过迭代调用 usleep 和 OMX_GetParameter(OMX_IndexParamPortDefinition) 轮询端口状态时,一切正常。
手头的问题
为什么在轮询它的值时会触发“OMX_CALLBACKTYPE::EventHandler”,而在使用 conditional_variable 时不会触发?对于 Windows,有 APC 和 Alertable 线程的概念,在 linux 中是否有任何等价物?一个可以解释上面提到的?