#ifndef GLWIDGET_H #define GLWIDGET_H #include #include #include #include // Cabeceras del Runtime de CUDA e Interoperabilidad CUDA-OpenGL #include #include extern "C" { // Estructuras de datos multimedia de FFmpeg (necesarias para el manejo del AVFrame) #include } 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