80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
#ifndef GLWIDGET_H
|
|
#define GLWIDGET_H
|
|
|
|
#include <QOpenGLWidget>
|
|
#include <QOpenGLFunctions>
|
|
#include <QOpenGLShaderProgram>
|
|
#include <QMutex>
|
|
|
|
// Cabeceras del Runtime de CUDA e Interoperabilidad CUDA-OpenGL
|
|
#include <cuda_runtime.h>
|
|
#include <cuda_gl_interop.h>
|
|
|
|
extern "C" {
|
|
// Estructuras de datos multimedia de FFmpeg (necesarias para el manejo del AVFrame)
|
|
#include <libavcodec/avcodec.h>
|
|
}
|
|
|
|
class VideoDecoder;
|
|
|
|
/**
|
|
* @brief Clase Widget OpenGL dedicada a renderizar los fotogramas decodificados en la GPU.
|
|
* Utiliza interoperabilidad CUDA-GL para realizar copias directas de memoria VRAM a VRAM
|
|
* sin intervención de la memoria RAM del sistema (Zero-Copy).
|
|
*/
|
|
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
|
|
Q_OBJECT
|
|
public:
|
|
explicit GLWidget(QWidget *parent = nullptr);
|
|
~GLWidget() override;
|
|
|
|
// Vincula el decodificador de video y conecta las señales de reproducción
|
|
void setVideoDecoder(VideoDecoder *decoder);
|
|
|
|
// Limpia y desregistra los recursos de CUDA y OpenGL de la tarjeta gráfica
|
|
void clearVideo();
|
|
|
|
public slots:
|
|
// Slot encargado de forzar la repintada del widget al recibir un nuevo fotograma
|
|
void onFrameReady();
|
|
|
|
protected:
|
|
// Configuración inicial de OpenGL (compilación de shaders, buffers y texturas)
|
|
void initializeGL() override;
|
|
|
|
// Ajuste de proyección y Viewport al cambiar de tamaño la ventana
|
|
void resizeGL(int w, int h) override;
|
|
|
|
// Renderizado principal: realiza la copia CUDA VRAM-to-VRAM y dibuja el quad en pantalla
|
|
void paintGL() override;
|
|
|
|
private:
|
|
// Desregistra las texturas de OpenGL del contexto de CUDA para liberar recursos de la GPU
|
|
void cleanupCudaGL();
|
|
|
|
// Puntero al decodificador de video (para leer los fotogramas compartidos)
|
|
VideoDecoder *m_videoDecoder;
|
|
|
|
// Programa de Sombreado de OpenGL (Vertex + Fragment Shader compilados)
|
|
QOpenGLShaderProgram m_shaderProgram;
|
|
|
|
// Identificadores de texturas OpenGL: m_texY (Luminancia) y m_texUV (Crominancia)
|
|
GLuint m_texY;
|
|
GLuint m_texUV;
|
|
|
|
// Vertex Buffer Object (VBO) para el quad plano (triángulos) que llena la pantalla
|
|
GLuint m_vbo;
|
|
|
|
// Punteros de control para registrar y mapear las texturas de OpenGL en la API de CUDA
|
|
cudaGraphicsResource_t m_cudaResourceY;
|
|
cudaGraphicsResource_t m_cudaResourceUV;
|
|
|
|
// Contenedor local para clonar la referencia del fotograma decodificado
|
|
AVFrame *m_localFrame;
|
|
|
|
// Registra la resolución para la cual están alojadas las texturas actuales (detecta cambios en el video)
|
|
int m_allocatedWidth;
|
|
int m_allocatedHeight;
|
|
};
|
|
|
|
#endif // GLWIDGET_H
|