File indexing completed on 2024-04-28 09:21:52

0001 /*
0002     SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "pwhelpers.h"
0008 #include "logging.h"
0009 
0010 QImage::Format SpaToQImageFormat(quint32 format)
0011 {
0012     switch (format) {
0013     case SPA_VIDEO_FORMAT_BGRx:
0014     case SPA_VIDEO_FORMAT_BGRA:
0015         return QImage::Format_RGBA8888_Premultiplied; // Handled in SpaBufferToQImage
0016     case SPA_VIDEO_FORMAT_ABGR:
0017     case SPA_VIDEO_FORMAT_xBGR:
0018         return QImage::Format_ARGB32; // Handled in SpaBufferToQImage
0019     case SPA_VIDEO_FORMAT_BGR:
0020         return QImage::Format_BGR888;
0021     case SPA_VIDEO_FORMAT_RGBx:
0022         return QImage::Format_RGBX8888;
0023     case SPA_VIDEO_FORMAT_RGB:
0024         return QImage::Format_RGB888;
0025     case SPA_VIDEO_FORMAT_RGBA:
0026         return QImage::Format_RGBA8888_Premultiplied;
0027     default:
0028         qCWarning(PIPEWIRE_LOGGING) << "cannot convert spa format to QImage" << format;
0029         return QImage::Format_RGB32;
0030     }
0031 }
0032 
0033 QImage PWHelpers::SpaBufferToQImage(const uchar *data, int width, int height, qsizetype bytesPerLine, spa_video_format format)
0034 {
0035     switch (format) {
0036     case SPA_VIDEO_FORMAT_BGRx:
0037     case SPA_VIDEO_FORMAT_BGRA:
0038     case SPA_VIDEO_FORMAT_xBGR:
0039     case SPA_VIDEO_FORMAT_ABGR: {
0040         // This is needed because QImage does not support BGRA
0041         // This is obviously a much slower path, it makes sense to avoid it as much as possible
0042         return QImage(data, width, height, bytesPerLine, SpaToQImageFormat(format)).rgbSwapped();
0043     }
0044     case SPA_VIDEO_FORMAT_BGR:
0045     case SPA_VIDEO_FORMAT_RGBx:
0046     case SPA_VIDEO_FORMAT_RGB:
0047     case SPA_VIDEO_FORMAT_RGBA:
0048     default:
0049         return QImage(data, width, height, bytesPerLine, SpaToQImageFormat(format));
0050     }
0051 }