zero_copy_video_player/glwidget.h
2026-08-05 14:07:38 -03:00

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