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

Ale*_*x I 17 c video decode raspberry-pi openmax

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

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

覆盆子Pi架构

还有一个未在此处显示的附加层," MMAL "层(我相信)是围绕OpenMAX的Broadcom包装器.(如果没有,它将是一个OpenMAX替代品,位于内核驱动程序之上)例如,使用MMAL编写raspivid和raspistill.

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

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

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

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

Kha*_*d.K 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);
Run Code Online (Sandbox Code Playgroud)

有一个函数可以创建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);
Run Code Online (Sandbox Code Playgroud)

但你需要一个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);
Run Code Online (Sandbox Code Playgroud)