bool QtVideoSinkDelegate::event(QEvent *event) { if (event->type() == (QEvent::Type)DeactivateEventType) { if (m_painter) { m_painter->cleanup(); destroyPainter(); } } return BaseDelegate::event(event); }
bool QtVideoSinkDelegate::event(QEvent *event) { switch((int) event->type()) { case BufferEventType: { BufferEvent *bufEvent = dynamic_cast<BufferEvent*>(event); Q_ASSERT(bufEvent); GST_TRACE_OBJECT(m_sink, "Received buffer %"GST_PTR_FORMAT, bufEvent->buffer); if (m_buffer) { //free the previous buffer gst_buffer_unref(m_buffer); m_buffer = NULL; } if (isActive()) { //schedule this frame for rendering m_buffer = gst_buffer_ref(bufEvent->buffer); if (bufEvent->formatDirty) { m_formatDirty = true; } update(); } return true; } case DeactivateEventType: { GST_LOG_OBJECT(m_sink, "Received deactivate event"); if (m_buffer) { gst_buffer_unref(m_buffer); m_buffer = NULL; } if (m_painter) { m_painter->cleanup(); destroyPainter(); } update(); return true; } default: return QObject::event(event); } }
QtVideoSinkDelegate::~QtVideoSinkDelegate() { Q_ASSERT(!isActive()); destroyPainter(); }
void QtVideoSinkDelegate::changePainter(const BufferFormat & format) { if (m_painter) { m_painter->cleanup(); if (G_UNLIKELY(!m_painter->supportsFormat(format.videoFormat()))) { destroyPainter(); } } QStack<PainterType> possiblePainters; if (GenericSurfacePainter::supportedPixelFormats().contains(format.videoFormat())) { possiblePainters.push(Generic); } #ifndef GST_QT_VIDEO_SINK_NO_OPENGL if (OpenGLSurfacePainter::supportedPixelFormats().contains(format.videoFormat())) { if (m_supportedPainters & ArbFp) { possiblePainters.push(ArbFp); } if (m_supportedPainters & Glsl) { possiblePainters.push(Glsl); } } #endif while (!possiblePainters.isEmpty()) { if (!m_painter) { PainterType type = possiblePainters.pop(); switch(type) { #ifndef GST_QT_VIDEO_SINK_NO_OPENGL case Glsl: GST_LOG_OBJECT(m_sink, "Creating GLSL painter"); m_painter = new GlslSurfacePainter; break; # ifndef QT_OPENGL_ES case ArbFp: GST_LOG_OBJECT(m_sink, "Creating ARB Fragment Shader painter"); m_painter = new ArbFpSurfacePainter; break; # endif #endif case Generic: GST_LOG_OBJECT(m_sink, "Creating Generic painter"); m_painter = new GenericSurfacePainter; break; default: Q_ASSERT(false); } } try { m_painter->init(format); return; } catch (const QString & error) { GST_ELEMENT_WARNING(m_sink, RESOURCE, FAILED, ("Failed to start painter"), ("%s", error.toUtf8().constData())); delete m_painter; m_painter = 0; } } GST_ELEMENT_ERROR(m_sink, RESOURCE, FAILED, ("Failed to create a painter for the given format"), (NULL)); }
QtVideoSinkDelegate::~QtVideoSinkDelegate() { destroyPainter(); }