繁体   English   中英

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

[英]Decode video in Raspberry Pi without using 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演练(尽管不是一个工作示例)或指向足够的文档来编写它来收集赏金。 一个工作的例子将得到一个巨额额外的赏金:)

我没有一个有效的例子,但我有一个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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM