2013-10-03 100 views
17

我正在尋找一個在不使用OpenMAX的情況下直接在Raspberry Pi上解碼視頻的示例。在不使用OpenMAX的情況下解碼Raspberry Pi中的視頻?

這解釋多媒體軟件的不同層:

Raspberry Pi Architecture

有未在這裏示出的附加層時,「MMAL」層,它是(我相信)博通包裝周圍的OpenMAX 。 (如果不是,它將是一個OpenMAX備選方案,位於內核驅動程序之上)例如raspivid和raspistill是使用MMAL編寫的。

我想要一個視頻解碼的例子,其中輸入是原始的H.264,輸出是內存中的視頻或屏幕上的視頻。我想這樣做直接使用VCHIQ,而不是使用OpenMAX。 (主要用於性能和靈活性的原因)

這github上存儲庫:https://github.com/raspberrypi/userland/包含上面顯示的所有內容源(橙色和綠色盒;源VCHIQ本身上VCHIQ,也OpenGL和EGL實現的頂部的OpenMAX IL實現中, ...)。所以從理論上講,它應該足以開始。問題在於,即使熟悉OpenMAX和一般多媒體框架,如何使用它也是非常不明顯的。

例如:vchiq_bulk_transmit()似乎是人們用來將視頻發送到解碼器的功能。但如何初始化類型VCHIQ_SERVICE_HANDLE_T的第一個參數?結果在哪裏,在幀緩衝區中,還是在結果句柄中,或...?

EDIT賞金可以通過使用vchiq中,API演練示出呼叫序列(即使不是一個工作示例)或指向足夠的文件寫這提供視頻解碼的一個工作實例來收集。一個工作的例子將得到一個沉重的額外賞金:)

+1

是否有沒有使用OpenMAX的特殊原因? – drahnr

+1

@drahnr:我想要一個可以立即獲取解碼數據的API。 OpenMAX IL有一堆緩衝區,對實現可能對它們做什麼沒有特別限制,它可能會緩衝多個幀,並且API中沒有辦法控制它。我已經看到相當慢的返回數據的實現(吞吐量仍然很高,數據只是延遲)。 ......我想,如果有人想要回答這個問題,那就說明如何使用OpenMAX在RPi上的1/60秒內獲得解碼幀,那也可以。:) –

+0

這可能不是什麼你希望聽到,但是實現H264解碼器是非常具有挑戰性的,我不知道有一個靈魂可以免費編碼(即使你已經放置了500次的補償)。 – karlphillip

回答

2

我沒有一個工作示例,但我有一個API演練。 排序的..

Link to the full source code

我發現下面的函數,演示如何調用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); 
0

我認爲openmax提供更多的多媒體處理性能。您可以比較這兩個選擇的性能,簡單地運行gstreamer的相應管道。對於此操作不需要編程,您可以使用gst-launch fot這個用途。 gstreamer的Openmax插件以'omx'前綴開頭。編碼和解碼操作在主CPU空載時用omx完美執行。 h264編碼或解碼的專有實現是非常困難的問題,並且無需使用您可以花費多年的庫。

+0

Xuch,謝謝你,我認爲你誤解了這個問題,我確實想使用VideoCore加速解碼,但不經過OpenMAX API層,直接進入底層VCHIQ API。 CPU負載不是問題。 –

相關問題