Pergunta

Eu pretendo desenvolver uma ferramenta para manipulação de vídeo em tempo real usando C ++, Qt e OpenGL. sobreposição de vídeo não é uma opção desde shaders deve ser usado para o processamento de quadros. No momento eu imaginar uma sequência seguinte de passos:

  1. decodificação de vídeo (CPU)
  2. Preprocess-lo (opcional, CPU)
  3. Transer lo para a memória de vídeo (GPU usando DMA)
  4. Além disso processá-lo usando vértice e sombreamentos fragmento (GPU)
  5. Render-lo (GPU)

Eu estou procurando alguns conselhos gerais explicando que extensões ou técnicas podem ser usados ??aqui. Existe uma boa razão para usar Direct3D em vez disso?

Foi útil?

Solução

A primeira coisa, no PC não há nenhuma maneira explícita para usar DMA. O motorista pode usá-lo, ou pode usar outra coisa.

Em qualquer caso, a etapa 3 será "os dados de textura mudança na placa de vídeo". Em OpenGL que é PBO (Tampão Pixel Object) extensão ou boa glTexSubImage velho * função. Em D3D9 é LockRect na textura ou outras formas (por exemplo LockRect em uma textura do zero, em seguida, blit em uma textura GPU). Qualquer um desses poderia potencialmente utilizar DMA, mas você não pode ter certeza.

Em seguida, os dados estão em uma textura. Você pode torná-lo a uma tela com alguns shaders (por exemplo, fazendo a conversão YCbCr), ou tornar em outros textura (s) para fazer efeitos de processamento mais complexos (por exemplo desfocagem / glow /...).

Usando Direct3D é mais fácil no sentido de que não estão claramente definidos "formas Wast" de fazer coisas. Em OpenGL existem muito mais opções para fazer qualquer coisa, e você tem que descobrir alguma forma para fora os que são rápidos (por vezes os caminhos rápidos são diferentes em diferentes plataformas ou hardware).

Outras dicas

Se você é linux, motoristas recentes da NVIDIA da série 180.xx ter adicionado suporte para decodificação de vídeo por meio da API VDPAU (Video Decoding e Apresentação algo). Muitos grandes projectos têm integrado com a API incluindo o MPlayer, VLC, ffmpeg e mythtv. Eu não sei todos os detalhes, mas eles fornecem api para muitos codecs incluindo sub-operações comuns e manipulação bitstream.

Eu ficaria aqui antes de ir direto para o CUDA (que eu suponho VDPAU possa utilizar)

Para transferir os dados do quadro de CPU para GPU, você pode querer olhar para PBO s. Verifique este também.

Além disso, se você estiver usando shaders de qualquer maneira, você poderia aliviar a carga da CPU, fazendo transformações colorspace nos shaders de fragmentos (YCbCr para RGB).

O "processamento" e "renderização" passos geralmente são praticamente a mesma coisa, fazer coisas legais em shaders e misturá-la com framebuffer. Se você quiser misturar e combinar vídeos e efeitos diferentes, FBO s são úteis também.

Como alternativa, você pode olhar para alguns dos diferentes idiomas para a realização de programação de propósito GPU geral (GPGPU) como CUDA da NVIDIA ou Fluxo SDK da ATI. Dependendo do que você escolher, você pode limitar-se a uma marca de GPUs, no entanto. A razão para usar línguas seria trabalhar em um nível de abstração que está mais perto de programação normal, de alto nível, em vez de trabalhar com shaders.

Eu não tenho nenhuma experiência com o que você quer fazer, então não posso dizer se shaders são realmente mais adequado para o trabalho, mas é algo que você pode considerar a olhar para. Tem que ser dito que o algoritmo projeto ainda é um pouco diferente do que o código comum e é preciso algum esforço conseguir o jeito dele (eu só tenho trabalhado com CUDA, mas todos eles parecem usar abstrações semelhantes).

Suponho thaat se você tem uma quantidade razoável de experiência com trabalho shader pode não valer a pena o aborrecimento para você aprender uma nova plataforma.

Os seguintes passos devem fazê-lo:

  1. decodificação de vídeo para YUV

    Este é geralmente o que as libs decodificador fazer.

  2. Coloque OpenGL como uma textura

  3. converso YUV para RGB

    Desde que você não quer usar uma sobreposição, você tem que converter manualmente. Aqui é um exemplo usando shaders.

  4. colocar a textura convertida em um quad e tornar a tela

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top