diff --git a/gstreamer/x11renderer.cpp b/gstreamer/x11renderer.cpp
index 6ffb9ad2..28febc77 100644
--- a/gstreamer/x11renderer.cpp
+++ b/gstreamer/x11renderer.cpp
@@ -1,195 +1,197 @@
/* This file is part of the KDE project.
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 or 3 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library. If not, see .
*/
#include "x11renderer.h"
#include "videowidget.h"
#ifndef Q_WS_QWS
#include "backend.h"
#include "debug.h"
#include "mediaobject.h"
#include
#include
#include
#include
#include
#include
namespace Phonon
{
namespace Gstreamer
{
class OverlayWidget : public QWidget
{
public:
OverlayWidget(VideoWidget *videoWidget, X11Renderer *renderer)
: QWidget(videoWidget)
, m_videoWidget(videoWidget)
, m_renderer(renderer)
{
}
- void paintEvent(QPaintEvent *) {
+ void paintEvent(QPaintEvent *) override {
Phonon::State state = m_videoWidget->root() ? m_videoWidget->root()->state() : Phonon::LoadingState;
if (state == Phonon::PlayingState || state == Phonon::PausedState) {
m_renderer->windowExposed();
} else {
QPainter painter(this);
painter.fillRect(m_videoWidget->rect(), m_videoWidget->palette().background());
}
}
+ QPaintEngine *paintEngine() const override
+ {
+ return nullptr;
+ }
+
private:
VideoWidget *m_videoWidget;
X11Renderer *m_renderer;
};
X11Renderer::X11Renderer(VideoWidget *videoWidget)
: AbstractRenderer(videoWidget)
{
m_renderWidget = new OverlayWidget(videoWidget, this);
debug() << "Creating X11 overlay renderer";
QPalette palette;
palette.setColor(QPalette::Background, Qt::black);
videoWidget->setPalette(palette);
videoWidget->setAutoFillBackground(true);
m_renderWidget->setMouseTracking(true);
GstElement *videoSink = createVideoSink();
if (videoSink) {
setVideoSink(videoSink);
}
aspectRatioChanged(videoWidget->aspectRatio());
setOverlay();
}
X11Renderer::~X11Renderer()
{
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
m_renderWidget->setAttribute(Qt::WA_PaintOnScreen, false);
#endif
m_renderWidget->setAttribute(Qt::WA_NoSystemBackground, false);
delete m_renderWidget;
}
GstElement* X11Renderer::createVideoSink()
{
GstElement *videoSink = gst_element_factory_make("xvimagesink", NULL);
if (videoSink) {
// Check if the xv sink is usable
if (gst_element_set_state(videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) {
gst_object_unref(GST_OBJECT(videoSink));
videoSink = 0;
} else {
// Note that this should not really be necessary as these are
// default values, though under certain conditions values are retained
// even between application instances. (reproducible on 0.10.16/Gutsy)
g_object_set(G_OBJECT(videoSink), "brightness", 0, NULL);
g_object_set(G_OBJECT(videoSink), "contrast", 0, NULL);
g_object_set(G_OBJECT(videoSink), "hue", 0, NULL);
g_object_set(G_OBJECT(videoSink), "saturation", 0, NULL);
}
}
QByteArray tegraEnv = qgetenv("TEGRA_GST_OPENMAX");
if (!tegraEnv.isEmpty()) {
videoSink = gst_element_factory_make("nv_gl_videosink", NULL);
}
if (!videoSink) {
videoSink = gst_element_factory_make("ximagesink", NULL);
}
return videoSink;
}
void X11Renderer::aspectRatioChanged(Phonon::VideoWidget::AspectRatio)
{
if (m_renderWidget) {
m_renderWidget->setGeometry(videoWidget()->calculateDrawFrameRect());
}
}
void X11Renderer::scaleModeChanged(Phonon::VideoWidget::ScaleMode)
{
if (m_renderWidget) {
m_renderWidget->setGeometry(videoWidget()->calculateDrawFrameRect());
}
}
void X11Renderer::movieSizeChanged(const QSize &movieSize)
{
Q_UNUSED(movieSize);
if (m_renderWidget) {
m_renderWidget->setGeometry(videoWidget()->calculateDrawFrameRect());
}
}
bool X11Renderer::eventFilter(QEvent *e)
{
if (e->type() == QEvent::Show) {
// Setting these values ensures smooth resizing since it
// will prevent the system from clearing the background
m_renderWidget->setAttribute(Qt::WA_NoSystemBackground, true);
-#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
- // Leads to tons of warnings from QWidget::paintEngine on Qt 5
m_renderWidget->setAttribute(Qt::WA_PaintOnScreen, true);
-#endif
setOverlay();
} else if (e->type() == QEvent::Resize) {
// This is a workaround for missing background repaints
// when reducing window size
m_renderWidget->setGeometry(videoWidget()->calculateDrawFrameRect());
windowExposed();
}
return false;
}
void X11Renderer::handlePaint(QPaintEvent *)
{
QPainter painter(videoWidget());
painter.fillRect(videoWidget()->rect(), videoWidget()->palette().background());
}
void X11Renderer::setOverlay()
{
if (videoSink() && GST_IS_VIDEO_OVERLAY(videoSink())) {
WId windowId = m_renderWidget->winId();
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink()), windowId);
}
windowExposed();
m_overlaySet = true;
}
void X11Renderer::windowExposed()
{
// This can be invoked within a callchain in an arbitrary thread, so make
// sure we call syncX() from the main thread
QMetaObject::invokeMethod(videoWidget(), "syncX",
Qt::QueuedConnection);
if (videoSink() && GST_IS_VIDEO_OVERLAY(videoSink())) {
gst_video_overlay_expose(GST_VIDEO_OVERLAY(videoSink()));
}
}
}
} //namespace Phonon::Gstreamer
#endif // Q_WS_QWS
diff --git a/gstreamer/x11renderer.h b/gstreamer/x11renderer.h
index b47160a1..1f8f3a32 100644
--- a/gstreamer/x11renderer.h
+++ b/gstreamer/x11renderer.h
@@ -1,65 +1,65 @@
/* This file is part of the KDE project.
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 or 3 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library. If not, see .
*/
#ifndef Phonon_GSTREAMER_X11RENDERER_H
#define Phonon_GSTREAMER_X11RENDERER_H
#include "abstractrenderer.h"
#ifndef Q_WS_QWS
class QString;
namespace Phonon
{
namespace Gstreamer
{
class OverlayWidget;
class VideoWidget;
class X11Renderer : public AbstractRenderer
{
public:
X11Renderer(VideoWidget *videoWidget);
~X11Renderer();
void handlePaint(QPaintEvent *event);
void aspectRatioChanged(Phonon::VideoWidget::AspectRatio aspectRatio);
void scaleModeChanged(Phonon::VideoWidget::ScaleMode scaleMode);
void movieSizeChanged(const QSize &movieSize);
bool eventFilter(QEvent *);
bool paintsOnWidget() const {
return false;
}
bool overlaySet() const {
return m_overlaySet;
}
void setOverlay();
void windowExposed();
private:
GstElement *createVideoSink();
OverlayWidget *m_renderWidget;
- bool m_overlaySet;
+ bool m_overlaySet = false;
};
}
} //namespace Phonon::Gstreamer
#endif // Q_WS_QWS
#endif // Phonon_GSTREAMER_X11RENDERER_H