2013-10-03 6 views
17

Ich suche ein Beispiel für Video-Decodierung auf Raspberry Pi direkt, ohne OpenMAX zu verwenden.Video in Raspberry Pi decodieren, ohne OpenMAX zu verwenden?

Dies erklärt die verschiedenen Schichten von Multimedia-Software:

Raspberry Pi Architecture

Es kann eine zusätzliche Schicht, die die „MMAL“ angezeigt wird nicht Schicht in hier, das ist (glaube ich) ein Wrapper Broadcom um OpenMAX . (Wenn nicht, wäre es eine OpenMAX-Alternative, die über dem Kernel-Treiber sitzt) raspivid und raspistill zum Beispiel werden mit MMAL geschrieben.

Ich möchte ein Beispiel für Video-Dekodierungs, wo der Eingang roh H.264 ist, und der Ausgang ist entweder Video im internen Speicher oder Video auf dem Bildschirm. Ich möchte diese mit VCHIQ direkt zu tun, nicht OpenMAX verwenden. (Hauptsächlich aus Leistungs- und Flexibilitätsgründen)

Dieses GitHub-Repository: https://github.com/raspberrypi/userland/ enthält die Quelle für alles oben gezeigte (die orange und grünen Kästchen; Quelle für VCHIQ selbst, OpenMAX IL Implementierung auf VCHIQ, auch OpenGL und EGL Implementierungen, ...). In der Theorie sollte es also genug sein, um anzufangen. Das Problem ist, dass es nicht offensichtlich ist, wie man es benutzt, auch wenn man OpenMAX und Multimedia-Frameworks im Allgemeinen sehr gut kennt.

Zum Beispiel: vchiq_bulk_transmit() scheint die Funktion zu sein, dass man verwenden würde Video an den Decoder zu senden. Aber wie initialisiert man das erste Argument vom Typ VCHIQ_SERVICE_HANDLE_T? Wohin gehen die Ergebnisse, im Framebuffer oder in einem Ergebnis-Handle, oder ...?

EDIT der Bounty kann entweder durch Bereitstellen eines Arbeitsbeispiels von Videodekodierungs Verwendung vchiq, eine API Lösungsweg gesammelt werden, die die Aufrufsequenz zeigt (obwohl kein Ausführungsbeispiel) oder einen Zeiger auf eine ausreichende Dokumentation zu schreiben. Ein Arbeitsbeispiel wird eine saftige zusätzliche Prämie bekommen :)

+1

Gibt es einen besonderen Grund, OpenMAX nicht zu benutzen? – drahnr

+1

@drahnr: Ich möchte eine API, in der ich meine entschlüsselten Daten sofort bekomme. OpenMAX IL hat eine Reihe von Puffern, es gibt keine besonderen Einschränkungen für die Implementierung einer Implementierung, möglicherweise puffert es mehrere Frames und es gibt keine Möglichkeit, dies in der API zu kontrollieren. Ich habe Implementierungen gesehen, die ziemlich, ziemlich langsam Daten zurückgeben (der Durchsatz ist immer noch hoch, Daten werden nur verzögert). ... Ich nehme an, wenn jemand eine Antwort darauf haben wollte, die zeigt, wie man entschlüsselte Frames mit OpenMAX in weniger als 1/60s einer Sekunde auf RPi zurückbekommt, wäre das auch in Ordnung :) –

+0

Dies ist wahrscheinlich nicht was Sie wollen hören, aber die Implementierung eines H264-Decoders ist sehr schwierig und ich kenne keine einzige Seele, die das kostenlos programmieren würde (selbst wenn Sie eine 500-Mann-Prämie gesetzt hätten). – karlphillip

Antwort

2

Ich habe nicht ein funktionierendes Beispiel, aber ich habe eine API-Komplettlösung. Sortieren von ..

Link to the full source code

fand ich die folgende Funktion, die zeigen, wie Sie anrufen können 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); 

Es ist eine Funktion 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); 

Aber Sie erstellen brauche eine VCHI_INSTANCE_T, die hier initialisiert werden kann

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

Ich denke, OpenMAX mehr Leistung bei Multimedia-Verarbeitung gibt. Sie können die Leistung für diese beiden Alternativen einfach vergleichen, entsprechende Pipelines für gstreamer. Für diese Aktionen wird keine Programmierung benötigt und Sie können gst-launch für diesen Zweck verwenden. Openmax-Plugins für gstreamer beginnen mit dem Präfix 'omx'. Codier- und Decodieroperationen werden perfekt mit omx ausgeführt, während die Haupt-CPU nicht belastet wird. Proprietäre Implementierung für h264 Codierung oder Decodierung ist ein sehr schwieriges Problem und ohne Verwendung von Bibliotheken können Sie für diese viele Jahre ausgeben.

+0

Xuch, danke, ich glaube, Sie missverstehen die Frage, ich möchte mit VideoCore-Beschleunigung zu dekodieren, aber ohne durch OpenMAX-API-Ebene gehen, nur direkt auf die untere Ebene, VCHIQ API. CPU-Auslastung ist kein Problem. –