summaryrefslogtreecommitdiff
path: root/elements/gstqtvideosink/painters/genericsurfacepainter.cpp
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-14 11:21:31 +0200
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-18 18:07:55 +0200
commit7d9a800163a92cdbfcc38aa24591c8ad20a6bb19 (patch)
treedaf826cdb7c5476a6c56dbd9a7ecd3c9d7c3cf8d /elements/gstqtvideosink/painters/genericsurfacepainter.cpp
parentd46c146834c7fff787094e1b715c973a17998a27 (diff)
qtvideosink: Distribute classes into subdirectories for easier code navigation
Diffstat (limited to 'elements/gstqtvideosink/painters/genericsurfacepainter.cpp')
-rw-r--r--elements/gstqtvideosink/painters/genericsurfacepainter.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/elements/gstqtvideosink/painters/genericsurfacepainter.cpp b/elements/gstqtvideosink/painters/genericsurfacepainter.cpp
new file mode 100644
index 0000000..864ea18
--- /dev/null
+++ b/elements/gstqtvideosink/painters/genericsurfacepainter.cpp
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
+ Copyright (C) 2011-2012 Collabora Ltd. <info@collabora.com>
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License version 2.1
+ as published by the Free Software Foundation.
+
+ This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "genericsurfacepainter.h"
+#include <QPainter>
+
+GenericSurfacePainter::GenericSurfacePainter()
+ : m_imageFormat(QImage::Format_Invalid)
+{
+}
+
+//static
+QSet<GstVideoFormat> GenericSurfacePainter::supportedPixelFormats()
+{
+ return QSet<GstVideoFormat>()
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ << GST_VIDEO_FORMAT_ARGB
+ << GST_VIDEO_FORMAT_xRGB
+#else
+ << GST_VIDEO_FORMAT_BGRA
+ << GST_VIDEO_FORMAT_BGRx
+#endif
+ << GST_VIDEO_FORMAT_RGB
+ << GST_VIDEO_FORMAT_RGB16
+ ;
+}
+
+void GenericSurfacePainter::init(const BufferFormat &format)
+{
+ switch (format.videoFormat()) {
+ // QImage is shitty and reads integers instead of bytes,
+ // thus it is affected by the host's endianness
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ case GST_VIDEO_FORMAT_ARGB:
+#else
+ case GST_VIDEO_FORMAT_BGRA:
+#endif
+ m_imageFormat = QImage::Format_ARGB32;
+ break;
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ case GST_VIDEO_FORMAT_xRGB:
+#else
+ case GST_VIDEO_FORMAT_BGRx:
+#endif
+ m_imageFormat = QImage::Format_RGB32;
+ break;
+ //16-bit RGB formats use host's endianness in GStreamer
+ //FIXME-0.11 do endianness checks like above if semantics have changed
+ case GST_VIDEO_FORMAT_RGB16:
+ m_imageFormat = QImage::Format_RGB16;
+ break;
+ //This is not affected by endianness
+ case GST_VIDEO_FORMAT_RGB:
+ m_imageFormat = QImage::Format_RGB888;
+ break;
+ default:
+ throw QString("Unsupported format");
+ }
+}
+
+void GenericSurfacePainter::cleanup()
+{
+ m_imageFormat = QImage::Format_Invalid;
+}
+
+void GenericSurfacePainter::paint(quint8 *data,
+ const BufferFormat & frameFormat,
+ const QRectF & clipRect,
+ QPainter *painter,
+ const PaintAreas & areas)
+{
+ Q_ASSERT(m_imageFormat != QImage::Format_Invalid);
+
+ QImage image(
+ data,
+ frameFormat.frameSize().width(),
+ frameFormat.frameSize().height(),
+ frameFormat.bytesPerLine(),
+ m_imageFormat);
+
+ painter->fillRect(areas.blackArea1, Qt::black);
+ painter->drawImage(areas.videoArea, image, clipRect);
+ painter->fillRect(areas.blackArea2, Qt::black);
+}
+
+void GenericSurfacePainter::updateColors(int, int, int, int)
+{
+}