Frage

unter Verwendung von C ++, Qt und OpenGL

Ich plane, ein Werkzeug für die Echtzeit-Video-Manipulation zu entwickeln. Video-Overlay ist keine Option, da Shadern für Frame-Verarbeitung verwendet werden soll. Im Moment stelle ich mir eine folgende Abfolge von Schritten:

  1. Decode Video (CPU)
  2. Preprocess es (optional, CPU)
  3. transer es in den Videospeicher (GPU mit DMA)
  4. weiter zu verarbeiten unter Verwendung von Vertex- und Fragment-Shader (GPU)
  5. Render es (GPU)

Ich interessiere mich für einige allgemeine Ratschläge explaning was extentions oder Technik können hier verwendet werden. Gibt es einen guten Grund, Direct3D anstatt zu benutzen?

War es hilfreich?

Lösung

Die erste, was auf dem PC gibt es keine explizite Weise DMA zu verwenden. Der Fahrer könnte verwenden Sie es, oder vielleicht etwas anderes verwenden.

In jedem Fall wird der Schritt 3 wird „change Texturdaten auf der Grafikkarte“ sein. In OpenGL, die PBO (Pixel Buffer Object) Erweiterung oder gute alte glTexSubImage * Funktion ist. In D3D9 ist es LockRect auf der Textur oder andere Weise (z LockRect auf einer neu Textur, dann blitten in eine GPU Textur). Jede dieser würde möglicherweise DMA verwenden, aber man kann nicht sicher sein.

Dann werden die Daten in einer Textur. Sie können mit einigen Shadern es auf einen Bildschirm übertragen (z YCbCr Umwandlung zu tun), oder machen in andere Textur (n) komplexere Verarbeitungseffekte (z Blur / Glow /...).

Mit Direct3D leichter in einem gewissen Sinne ist, dass es klar definiert sind „wast Wege“ Sachen zu tun. In OpenGL gibt es viel mehr Möglichkeiten, etwas zu tun, und Sie müssen irgendwie herausfinden, welche diejenigen schnell (manchmal die schnellen Pfade unterschiedlich sind auf verschiedenen Plattformen oder Hardware).

Andere Tipps

Wenn Sie Linux sind, NVIDIAs neuesten Treiber in der 180.xx-Serie haben die Unterstützung für Video-Decodierung über die VDPAU api hinzugefügt (Video-Decodierung und Präsentation etwas). Viele große Projekte wurden mit dem api einschließlich mplayer, vlc, ffmpeg und mythtv integriert. Ich weiß nicht, all die Besonderheiten, aber sie bieten api für viele Codecs einschließlich gemeinsamen Teiloperationen und Bitstream-Manipulation.

Ich würde hier vor direkt auf CUDA gehen (was ich davon ausgehen, VDPAU verwenden)

Für die Rahmendaten von der CPU auf gpu übertragen, möchten Sie vielleicht suchen, um diese auch.

Auch wenn Sie Shadern sowieso verwenden, könnten Sie die CPU entlasten durch Farbraumtransformationen in den Fragment-Shader (YCbCr zu RGB) zu tun.

Die „Weiterverarbeitung“ und „Rendering“ Schritte in der Regel ziemlich die gleiche Sache sind, coole Dinge in Shadern und mischen Sie sie auf Framebuffer. Wenn Sie möchten, Videos und verschiedene Effekte mischen und anzupassen, FBO s auch nützlich sind.

Als Alternative Sie auf einige der verschiedenen Sprachen für die Durchführung Allzweck-GPU-Programmierung (GPGPU) wie CUDA von NVIDIA oder Stream-SDK von ATI aussehen können. Je nachdem, welche Sie sich entscheiden, können Sie sich auf eine Marke von GPUs begrenzen, though. Der Grund für diese Sprachen verwenden wäre bei einer Abstraktionsebene zu arbeiten, die näher an normaler High-Level-Programmierung ist stattdessen mit Shadern zu arbeiten.

Ich habe keine Erfahrung mit dem, was Sie tun wollen, so kann ich nicht sagen, ob Shadern eigentlich besser geeignet für den Job ist, aber es ist etwas, das man bei der Suche berücksichtigen kann. Es muss gesagt werden, dass Algorithmus Design noch etwas anders als gewöhnlicher Code ist, und es dauert einige Mühe den Dreh raus zu bekommen (ich habe nur mit CUDA gearbeitet, aber sie scheinen alle ähnliche Abstraktionen zu verwenden).

Ich nehme an thaat, wenn Sie eine anständige Menge an Erfahrung mit Shader Arbeit haben es nicht der Mühe wert sein könnte für Sie eine neue Plattform zu lernen.

Die folgenden Schritte sollten es tun:

  1. dekodieren Video auf YUV

    Dies ist in der Regel, was die Decoder-Libs tun.

  2. Laden in OpenGL als Textur

  3. konvertieren YUV auf RGB

    Da Sie wollen ein Overlay nicht verwenden, müssen Sie manuell konvertieren. Hier ist ein Beispiel Shadern verwendet wird.

  4. Put-Textur auf einem Quad umgewandelt und übertragen auf Bildschirm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top