在 Raspberry Pi 中解码视频而不使用 OpenMAX?

2024-03-30

我正在寻找在 Raspberry Pi 上解码视频的示例directly,不使用 OpenMAX。

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

还有一个此处未显示的附加层,即“MMAL https://github.com/raspberrypi/userland/blob/master/interface/mmal/mmal.h“层(我相信)是 OpenMAX 的 Broadcom 包装器。(如果不是,它将是 OpenMAX 的替代品,位于内核驱动程序之上)例如 raspivid 和 raspistill 是使用 MMAL 编写的。

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

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

例如:vchiq_批量_传输 https://github.com/raspberrypi/userland/blob/master/interface/vchiq_arm/vchiq_if.h() 似乎是用来将视频发送到解码器的函数。但是如何初始化类型的第一个参数VCHIQ_SERVICE_HANDLE_T?结果去了哪里,在帧缓冲区中,还是在结果句柄中,或者......?

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


我没有有效的示例,但我有 API 演练。有点..

完整源代码链接 http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c

我发现以下函数演示了如何调用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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Raspberry Pi 中解码视频而不使用 OpenMAX? 的相关文章

随机推荐