2013-10-03 17 views
17

Sto cercando un esempio di video di decodifica su Raspberry Pi direttamente, senza utilizzare OpenMAX.Decodifica video in Raspberry Pi senza usare OpenMAX?

Questo spiega i diversi strati di software multimediale:

Raspberry Pi Architecture

C'è un ulteriore livello che non è mostrato qui, il "MMAL" strato che è (credo) un wrapper Broadcom intorno OpenMAX . (In caso contrario, sarebbe un'alternativa OpenMAX, posta sopra il driver del kernel), ad esempio raspivid e raspistill sono scritti usando MMAL.

Desidero un esempio di decodifica video in cui l'input è raw H.264 e l'uscita è video in memoria o video sullo schermo. Voglio fare questo usando VCHIQ direttamente, non usando OpenMAX. (Principalmente per prestazioni e motivi di flessibilità)

Questo repository github: https://github.com/raspberrypi/userland/ contiene la sorgente per tutto mostrato sopra (arancione e caselle verdi; sorgente per VCHIQ sé, attuazione OpenMAX IL in cima VCHIQ, anche OpenGL e EGL implementazioni, ...). Quindi in teoria dovrebbe essere sufficiente per iniziare. Il problema è che non è ovvio come usarlo, anche se si è molto familiari con OpenMAX e con i framework multimediali in generale.

Ad esempio: vchiq_bulk_transmit() sembra essere la funzione che si userebbe per inviare video al decodificatore. Ma come inizializzare il primo argomento di tipo VCHIQ_SERVICE_HANDLE_T? Dove vanno i risultati, nel framebuffer o in un handle di risultati o ...?

EDIT La taglia può essere raccolto da uno fornendo un esempio di lavoro di decodifica video utilizzando vchiq, una procedura dettagliata API che mostra la sequenza di chiamata (anche se non un esempio di lavoro) o un puntatore alla documentazione sufficiente scrivere questo. Un esempio funzionante otterrà un abbondante extra bounty :)

+1

C'è un motivo particolare che non utilizza OpenMAX? – drahnr

+1

@drahnr: Voglio un'API in cui ottengo i miei dati decodificati immediatamente. OpenMAX IL ha un sacco di buffer, non ci sono particolari vincoli su ciò che un'implementazione può fare con loro, può potenzialmente bufferizzare più frame e non c'è modo nell'API di controllarlo. Ho visto implementazioni abbastanza lente nel restituire dati (il throughput è ancora alto, i dati sono solo in ritardo). ... Suppongo che se qualcuno volesse avere una possibilità di rispondere a questo che mostra come ottenere i frame decodificati usando OpenMAX in meno di 1/60 di secondo su RPi, andrebbe bene :) –

+0

Questo probabilmente non è quello che vuoi sentirlo, ma implementare un decodificatore H264 è molto impegnativo e non conosco una singola anima che la codificherebbe gratuitamente (anche se avessi piazzato una taglia da 500 rep). – karlphillip

risposta

2

Non ho un esempio funzionante, ma ho un walkthrough API. specie di ..

Link to the full source code

ho trovato la seguente funzione che dimostrare come si può chiamare 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); 

c'è una funzione per creare 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); 

Ma voi bisogno di un VCHI_INSTANCE_T che può essere inizializzato qui

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

Penso che openmax dia più prestazioni nell'elaborazione multimediale. È possibile confrontare le prestazioni per queste due alternative semplicemente eseguendo le rispettive pipeline per gstreamer. Per queste azioni non è necessaria la programmazione e puoi usare gst-launch per questo scopo. I plugin Openmax per gstreamer iniziano con il prefisso 'omx'. Operazioni di codifica e decodifica perfettamente in esecuzione con omx mentre la CPU principale non scarica. L'implementazione proprietaria per la codifica o la decodifica h264 è un problema molto difficile e senza l'utilizzo di librerie che è possibile utilizzare per molti anni.

+0

Xuch, grazie, penso che tu abbia frainteso la domanda, voglio decodificare usando l'accelerazione VideoCore ma senza passare attraverso il livello API OpenMAX, andando direttamente al livello inferiore, API VCHIQ. Il carico della CPU non è un problema. –