Question

Je prévois de développer un outil de manipulation vidéo en temps réel utilisant C ++, Qt et OpenGL. La superposition vidéo n'est pas une option, car les shaders doivent être utilisés pour le traitement des images. Pour le moment, j'imagine une séquence d'étapes suivante:

  1. Décoder la vidéo (CPU)
  2. Prétraitez-le (facultatif, CPU)
  3. Transférez-le vers la mémoire vidéo (GPU utilisant DMA)
  4. Traitez-le ensuite à l'aide de vertex et fragment shaders (GPU)
  5. Render it (GPU)

Je cherche des conseils généraux expliquant quelles extensions ou techniques peuvent être utilisées ici. Existe-t-il une bonne raison d'utiliser Direct3D à la place?

Était-ce utile?

La solution

Tout d’abord, sur le PC, il n’existe aucun moyen explicite d’utiliser le DMA. Le pilote peut l’utiliser ou utiliser autre chose.

Dans tous les cas, l’étape 3 consistera à & modifier les données de texture sur la carte graphique &. Dans OpenGL, c’est l’extension PBO (Pixel Buffer Object) ou la bonne vieille fonction glTexSubImage *. Dans D3D9, il s’agit de LockRect sur la texture ou d’autres méthodes (par exemple, LockRect sur une texture à gratter, puis fondue en une texture GPU). N'importe lequel d'entre eux utiliserait potentiellement le DMA, mais vous ne pouvez en être sûr.

Ensuite, les données sont dans une texture. Vous pouvez l'afficher à l'écran avec certains shaders (par exemple, convertir YCbCr) ou dans une autre texture pour créer des effets de traitement plus complexes (par exemple, flou / lueur /...).

L’utilisation de Direct3D est plus facile dans la mesure où il existe clairement & "wastways &"; de faire des choses. Dans OpenGL, il y a beaucoup plus d'options pour faire quoi que ce soit, et vous devez trouver quelles sont les plus rapides (parfois, les raccourcis sont différents sur des plates-formes ou des matériels différents).

Autres conseils

Si vous êtes Linux, les pilotes récents de NVIDIA de la série 180.xx prennent désormais en charge le décodage vidéo via l’API VDPAU (quelque chose de décodage et de présentation vidéo). De nombreux projets majeurs ont été intégrés à l’API, notamment mplayer, vlc, ffmpeg et mythtv. Je ne connais pas tous les détails, mais ils fournissent une api pour de nombreux codecs, y compris les sous-opérations courantes et la manipulation de flux de bits.

Je regarderais ici avant d’aller directement à CUDA (que VDPAU pourrait utiliser)

Pour transférer les données de trame du cpu au gpu, vous pouvez consulter PBO s. Vérifiez cela également.

De plus, si vous utilisez des shaders de toute façon, vous pouvez alléger la charge du processeur en effectuant des transformations d’espace colorimétrique dans les shaders de fragments (YCbCr à RGB).

Le " traitement ultérieur " et " rendre " les étapes sont généralement à peu près identiques, faites des trucs sympas dans les shaders et mélangez-les au framebuffer. Si vous souhaitez combiner des vidéos et des effets différents, FBO s sont utiles aussi.

Vous pouvez également utiliser différents langages pour la programmation de GPU à usage général (GPGPU), tels que CUDA de NVIDIA ou Stream SDK d’ATI. En fonction de ce que vous choisissez, vous pouvez vous limiter à une seule marque de GPU. La raison d'utiliser ces langages serait de travailler à un niveau d'abstraction plus proche de la programmation normale de haut niveau au lieu de travailler avec des shaders.

Je n’ai aucune expérience de ce que vous voulez faire, donc je ne peux pas dire si les shaders conviennent mieux au travail mais c’est quelque chose que vous pouvez envisager de regarder. Il faut dire que la conception de l'algorithme est encore quelque peu différente du code ordinaire et qu'il faut un certain effort pour le comprendre (je n'ai travaillé qu'avec CUDA, mais ils semblent tous utiliser des abstractions similaires).

Je suppose que si vous avez une bonne expérience du travail des shader, il ne vaut peut-être pas la peine de vous apprendre une nouvelle plate-forme.

Les étapes suivantes devraient le faire:

  1. décoder la vidéo en YUV

    C’est généralement ce que font les bibliothèques du décodeur.

  2. Charger dans OpenGL sous forme de texture

  3. convertir YUV en RVB

    Puisque vous ne voulez pas utiliser de superposition, vous devez convertir manuellement. Ici est un exemple d'utilisation de shaders.

  4. place la texture convertie sur un quad et le rend à l'écran

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top