17

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

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

树莓派架构

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

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

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

例如:vchiq_bulk_transmit () 似乎是用于将视频发送到解码器的函数。但是如何初始化 type 的第一个参数VCHIQ_SERVICE_HANDLE_T呢?结果在哪里,在帧缓冲区中,或者在结果句柄中,或者......?

编辑可以通过提供使用 vchiq 的视频解码的工作示例、显示调用序列的 API 演练(即使不是工作示例)或指向足够文档的指针来收集赏金。一个工作示例将获得大量额外的赏金:)

4

2 回答 2

2

我没有一个工作示例,但我有一个 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

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);
于 2016-02-03T19:03:36.037 回答
0

我认为 openmax 在多媒体处理方面提供了更多的性能。您可以比较这两种选择的性能,只需为 gstreamer 运行各自的管道。对于这个不需要编程的动作,你可以使用 gst-launch 来达到这个目的。gstreamer 的 Openmax 插件以 'omx' 前缀开头。使用 omx 完美执行编码和解码操作,而主 CPU 没有负载。h264 编码或解码的专有实现是非常困难的问题,如果不使用库,您可以花费这么多年。

于 2014-01-11T15:44:18.603 回答