在不使用OpenMAX的情况下解码Raspberry Pi中的video?

我正在寻找一个直接在Raspberry Pi上解码video的例子,而不使用OpenMAX。

这解释了多媒体软件的不同层次:

覆盆子Pi架构

还有一个未在此处显示的附加层,“ MMAL ”层(我相信)是围绕OpenMAX的Broadcom包装器。 (如果不是,它将是一个OpenMAX备选方案,位于内核驱动程序之上)例如,使用MMAL编写raspivid和raspistill。

我想要一个video解码的例子,其中输入是原始H.264,输出是内存中的video或屏幕上的video。 我想直接使用VCHIQ ,而不是使用OpenMAX。 (主要是出于性能和灵活性的原因)

这个github存储库: https : //github.com/raspberrypi/userland/包含上面显示的所有内容的源(橙色和绿色框; VCHIQ本身的源代码,VCHIQ之上的OpenMAX IL实现,以及OpenGL和EGL实现,。 ..)。 所以在理论上它应该足以开始。 问题在于如何使用它是非常不明显的,即使一个人非常熟悉OpenMAX和一般的多媒体框架。

例如: vchiq_bulk_transmit ()似乎是用于将video发送到解码器的function。 但是如何初始化VCHIQ_SERVICE_HANDLE_T类型的第一个参数? 结果在哪里,在帧缓冲区中,或在结果句柄中,还是……?

编辑可以通过使用vchiq提供video解码的工作示例,显示调用序列的API演练(尽管不是一个工作示例)或指向足够的文档来编写它来收集赏金。 一个工作的例子将得到一个巨额额外的赏金:)

我没有一个有效的例子,但我有一个API演练。 有点..

链接到完整的源代码

我发现以下函数演示了如何调用vchiq_bulk_transmit

 int32_t vchi_bulk_queue_transmit(VCHI_SERVICE_HANDLE_T handle, void *data_src, uint32_t data_size, VCHI_FLAGS_T flags, void *bulk_handle) { SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle; .. status = vchiq_bulk_transmit(service->handle, data_src, data_size, bulk_handle, mode); .. return vchiq_status_to_vchi(status); } EXPORT_SYMBOL(vchi_bulk_queue_transmit); 

有一个创建VCHI_SERVICE_HANDLE_T的function

 int32_t vchi_service_create(VCHI_INSTANCE_T instance_handle, SERVICE_CREATION_T *setup, VCHI_SERVICE_HANDLE_T *handle) { VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle; SHIM_SERVICE_T *service = service_alloc(instance, setup); *handle = (VCHI_SERVICE_HANDLE_T)service; .. return (service != NULL) ? 0 : -1; } EXPORT_SYMBOL(vchi_service_create); 

但是你需要一个可以在这里初始化的VCHI_INSTANCE_T

 int32_t vchi_initialise(VCHI_INSTANCE_T *instance_handle) { VCHIQ_INSTANCE_T instance; VCHIQ_STATUS_T status; status = vchiq_initialise(&instance); *instance_handle = (VCHI_INSTANCE_T)instance; return vchiq_status_to_vchi(status); } EXPORT_SYMBOL(vchi_initialise); 

我认为openmax在多媒体处理方面提供了更多性能。 您可以比较两个替代方案的性能,简单地运行gstreamer的相应管道。 对于此操作不需要编程,您可以使用gst-launch fot这个目的。 用于gstreamer的Openmax插件以’omx’前缀开头。 当主CPU无负载时,编码和解码操作完全用omx执行。 h264编码或解码的专有实现是一个非常困难的问题,如果不使用库,您可以花费这么多年。