summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-08 16:32:38 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-12 07:55:14 +0000
commitf62e7ba660b7214d609df30fe739e612584c1f32 (patch)
tree59b5e8ef2f06d17ec3822994f401b314846a4602 /src/multimedia
parentf8512bcafadef8d71244f78ce7f4bc88e06698f3 (diff)
Cleanup QImageEncoderSettings
Define a list of supported file formats, as with QMediaEncoderSettings. Implement support for detecting those on gstreamer. Remove the old interface in QCameraImageEncoderControl. Change-Id: Ic3d67dd19fe13336ba2017dc8055014274619ce6 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/camera/qcameraimagecapture.cpp19
-rw-r--r--src/multimedia/camera/qcameraimagecapture.h3
-rw-r--r--src/multimedia/controls/qimageencodercontrol.cpp12
-rw-r--r--src/multimedia/controls/qimageencodercontrol.h3
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp13
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h2
-rw-r--r--src/multimedia/platform/android/qandroidformatsinfo.cpp2
-rw-r--r--src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm13
-rw-r--r--src/multimedia/platform/darwin/qdarwinformatsinfo.mm3
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp13
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h3
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp57
-rw-r--r--src/multimedia/platform/qmediaplatformformatinfo_p.h4
-rw-r--r--src/multimedia/platform/qnx/camera/bbimageencodercontrol.cpp18
-rw-r--r--src/multimedia/platform/qnx/camera/bbimageencodercontrol_p.h3
-rw-r--r--src/multimedia/recording/qmediaencodersettings.cpp69
-rw-r--r--src/multimedia/recording/qmediaencodersettings.h17
17 files changed, 141 insertions, 113 deletions
diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp
index f8649b53f..9e6462efb 100644
--- a/src/multimedia/camera/qcameraimagecapture.cpp
+++ b/src/multimedia/camera/qcameraimagecapture.cpp
@@ -239,25 +239,6 @@ QString QCameraImageCapture::errorString() const
return d_func()->errorString;
}
-
-/*!
- Returns a list of supported image codecs.
-*/
-QStringList QCameraImageCapture::supportedImageCodecs() const
-{
- return d_func()->encoderControl ?
- d_func()->encoderControl->supportedImageCodecs() : QStringList();
-}
-
-/*!
- Returns a description of an image \a codec.
-*/
-QString QCameraImageCapture::imageCodecDescription(const QString &codec) const
-{
- return d_func()->encoderControl ?
- d_func()->encoderControl->imageCodecDescription(codec) : QString();
-}
-
/*!
Returns the image encoder settings being used.
diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h
index f46c4bc1e..4bb3ed89a 100644
--- a/src/multimedia/camera/qcameraimagecapture.h
+++ b/src/multimedia/camera/qcameraimagecapture.h
@@ -95,9 +95,6 @@ public:
bool isReadyForCapture() const;
- QStringList supportedImageCodecs() const;
- QString imageCodecDescription(const QString &codecName) const;
-
QImageEncoderSettings encodingSettings() const;
void setEncodingSettings(const QImageEncoderSettings& settings);
diff --git a/src/multimedia/controls/qimageencodercontrol.cpp b/src/multimedia/controls/qimageencodercontrol.cpp
index 793e91d73..9c21a1951 100644
--- a/src/multimedia/controls/qimageencodercontrol.cpp
+++ b/src/multimedia/controls/qimageencodercontrol.cpp
@@ -98,18 +98,6 @@ QImageEncoderControl::QImageEncoderControl(QObject *parent)
*/
/*!
- \fn QImageEncoderControl::supportedImageCodecs() const
-
- Returns a list of supported image codecs.
-*/
-
-/*!
- \fn QImageEncoderControl::imageCodecDescription(const QString &codec) const
-
- Returns a description of an image \a codec.
-*/
-
-/*!
\fn QImageEncoderControl::imageSettings() const
Returns the currently used image encoder settings.
diff --git a/src/multimedia/controls/qimageencodercontrol.h b/src/multimedia/controls/qimageencodercontrol.h
index 330186bb7..c67681305 100644
--- a/src/multimedia/controls/qimageencodercontrol.h
+++ b/src/multimedia/controls/qimageencodercontrol.h
@@ -58,9 +58,6 @@ class Q_MULTIMEDIA_EXPORT QImageEncoderControl : public QObject
Q_OBJECT
public:
- virtual QStringList supportedImageCodecs() const = 0;
- virtual QString imageCodecDescription(const QString &codec) const = 0;
-
virtual QImageEncoderSettings imageSettings() const = 0;
virtual void setImageSettings(const QImageEncoderSettings &settings) = 0;
diff --git a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
index 9ef5eb90e..7be520941 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
@@ -50,19 +50,6 @@ QAndroidImageEncoderControl::QAndroidImageEncoderControl(QAndroidCameraSession *
{
}
-QStringList QAndroidImageEncoderControl::supportedImageCodecs() const
-{
- return QStringList() << QLatin1String("jpeg");
-}
-
-QString QAndroidImageEncoderControl::imageCodecDescription(const QString &codecName) const
-{
- if (codecName == QLatin1String("jpeg"))
- return tr("JPEG image");
-
- return QString();
-}
-
QImageEncoderSettings QAndroidImageEncoderControl::imageSettings() const
{
return m_session->imageSettings();
diff --git a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
index a162171f9..19555879e 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
@@ -63,8 +63,6 @@ class QAndroidImageEncoderControl : public QImageEncoderControl
public:
explicit QAndroidImageEncoderControl(QAndroidCameraSession *session);
- QStringList supportedImageCodecs() const override;
- QString imageCodecDescription(const QString &codecName) const override;
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
diff --git a/src/multimedia/platform/android/qandroidformatsinfo.cpp b/src/multimedia/platform/android/qandroidformatsinfo.cpp
index 1faaca87b..c0cf72149 100644
--- a/src/multimedia/platform/android/qandroidformatsinfo.cpp
+++ b/src/multimedia/platform/android/qandroidformatsinfo.cpp
@@ -52,6 +52,8 @@ QAndroidFormatInfo::QAndroidFormatInfo()
{ QMediaFormat::VideoCodec::H264, QMediaFormat::VideoCodec::H265 } }
};
encoders = decoders;
+
+ imageFormats << QImageEncoderSettings::JPEG;
}
QAndroidFormatInfo::~QAndroidFormatInfo()
diff --git a/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm b/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
index 7b04e5f70..95508abe5 100644
--- a/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
@@ -59,19 +59,6 @@ AVFImageEncoderControl::AVFImageEncoderControl(AVFCameraService *service)
Q_ASSERT(service);
}
-QStringList AVFImageEncoderControl::supportedImageCodecs() const
-{
- return QStringList() << QLatin1String("jpeg");
-}
-
-QString AVFImageEncoderControl::imageCodecDescription(const QString &codecName) const
-{
- if (codecName == QLatin1String("jpeg"))
- return tr("JPEG image");
-
- return QString();
-}
-
QImageEncoderSettings AVFImageEncoderControl::requestedSettings() const
{
return m_settings;
diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
index 11a458dea..d168c5d45 100644
--- a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
+++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
@@ -162,6 +162,9 @@ QDarwinFormatInfo::QDarwinFormatInfo()
{} }
};
#endif
+
+ // ###
+ imageFormats << QImageEncoderSettings::JPEG;
}
QDarwinFormatInfo::~QDarwinFormatInfo()
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
index e5b2859d2..01b2dbb93 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
@@ -53,19 +53,6 @@ QGstreamerImageEncode::~QGstreamerImageEncode()
{
}
-QStringList QGstreamerImageEncode::supportedImageCodecs() const
-{
- return QStringList() << "jpeg";
-}
-
-QString QGstreamerImageEncode::imageCodecDescription(const QString &codecName) const
-{
- if (codecName == "jpeg")
- return tr("JPEG image encoder");
-
- return QString();
-}
-
QImageEncoderSettings QGstreamerImageEncode::imageSettings() const
{
return m_settings;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
index 89ace7d3c..d9b330f0e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
@@ -69,9 +69,6 @@ public:
QGstreamerImageEncode(QGstreamerCaptureSession *session);
virtual ~QGstreamerImageEncode();
- QStringList supportedImageCodecs() const override;
- QString imageCodecDescription(const QString &codecName) const override;
-
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp
index c185a563e..c01688535 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp
@@ -139,6 +139,25 @@ static QMediaFormat::FileFormat fileFormatForCaps(QGstStructure structure)
return QMediaFormat::UnspecifiedFormat;
}
+
+static QImageEncoderSettings::FileFormat imageFormatForCaps(QGstStructure structure)
+{
+ const char *name = structure.name();
+
+ if (!strcmp(name, "image/jpeg")) {
+ return QImageEncoderSettings::JPEG;
+ } else if (!strcmp(name, "image/png")) {
+ return QImageEncoderSettings::PNG;
+ } else if (!strcmp(name, "image/webp")) {
+ return QImageEncoderSettings::WebP;
+ } else if (!strcmp(name, "image/webp")) {
+ return QImageEncoderSettings::WebP;
+ } else if (!strcmp(name, "image/tiff")) {
+ return QImageEncoderSettings::Tiff;
+ }
+ return QImageEncoderSettings::UnspecifiedFormat;
+}
+
static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> getCodecsList(bool decode)
{
QList<QMediaFormat::AudioCodec> audio;
@@ -250,6 +269,42 @@ QList<QGstreamerFormatsInfo::CodecMap> QGstreamerFormatsInfo::getMuxerList(bool
return muxers;
}
+static QList<QImageEncoderSettings::FileFormat> getImageFormatList()
+{
+ QSet<QImageEncoderSettings::FileFormat> formats;
+
+ GList *elementList = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ENCODER,
+ GST_RANK_MARGINAL);
+
+ GList *element = elementList;
+ while (element) {
+ GstElementFactory *factory = (GstElementFactory *)element->data;
+ element = element->next;
+
+ const GList *padTemplates = gst_element_factory_get_static_pad_templates(factory);
+ while (padTemplates) {
+ GstStaticPadTemplate *padTemplate = (GstStaticPadTemplate *)padTemplates->data;
+ padTemplates = padTemplates->next;
+
+ if (padTemplate->direction == GST_PAD_SRC) {
+ QGstCaps caps = gst_static_caps_get(&padTemplate->static_caps);
+
+ for (int i = 0; i < caps.size(); i++) {
+ QGstStructure structure = caps.at(i);
+ auto f = imageFormatForCaps(structure);
+ if (f != QImageEncoderSettings::UnspecifiedFormat) {
+ qDebug() << structure.toString() << f;
+ formats.insert(f);
+ }
+ }
+ caps.unref();
+ }
+ }
+ }
+ gst_plugin_feature_list_free(elementList);
+ return formats.values();
+}
+
#if 0
static void dumpMuxers(const QList<QGstreamerFormatsInfo::CodecMap> &muxerList)
{
@@ -274,6 +329,8 @@ QGstreamerFormatsInfo::QGstreamerFormatsInfo()
codecs = getCodecsList(/*decode = */ false);
encoders = getMuxerList(/* demuxer = */false, codecs.first, codecs.second);
//dumpMuxers(encoders);
+
+ imageFormats = getImageFormatList();
}
QGstreamerFormatsInfo::~QGstreamerFormatsInfo()
diff --git a/src/multimedia/platform/qmediaplatformformatinfo_p.h b/src/multimedia/platform/qmediaplatformformatinfo_p.h
index 1cba1b086..05ea7b495 100644
--- a/src/multimedia/platform/qmediaplatformformatinfo_p.h
+++ b/src/multimedia/platform/qmediaplatformformatinfo_p.h
@@ -52,7 +52,7 @@
//
#include <private/qtmultimediaglobal_p.h>
-#include <qmediaformat.h>
+#include <qmediaencodersettings.h>
QT_BEGIN_NAMESPACE
@@ -75,6 +75,8 @@ public:
};
QList<CodecMap> encoders;
QList<CodecMap> decoders;
+
+ QList<QImageEncoderSettings::FileFormat> imageFormats;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qnx/camera/bbimageencodercontrol.cpp b/src/multimedia/platform/qnx/camera/bbimageencodercontrol.cpp
index 960accb02..65ebf2d63 100644
--- a/src/multimedia/platform/qnx/camera/bbimageencodercontrol.cpp
+++ b/src/multimedia/platform/qnx/camera/bbimageencodercontrol.cpp
@@ -48,24 +48,6 @@ BbImageEncoderControl::BbImageEncoderControl(BbCameraSession *session, QObject *
{
}
-QStringList BbImageEncoderControl::supportedImageCodecs() const
-{
- return QStringList() << QLatin1String("jpeg");
-}
-
-QString BbImageEncoderControl::imageCodecDescription(const QString &codecName) const
-{
- if (codecName == QLatin1String("jpeg"))
- return tr("JPEG image");
-
- return QString();
-}
-
-QList<QSize> BbImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const
-{
- return m_session->supportedResolutions(settings, continuous);
-}
-
QImageEncoderSettings BbImageEncoderControl::imageSettings() const
{
return m_session->imageSettings();
diff --git a/src/multimedia/platform/qnx/camera/bbimageencodercontrol_p.h b/src/multimedia/platform/qnx/camera/bbimageencodercontrol_p.h
index 2ace35b4f..f7e4d4445 100644
--- a/src/multimedia/platform/qnx/camera/bbimageencodercontrol_p.h
+++ b/src/multimedia/platform/qnx/camera/bbimageencodercontrol_p.h
@@ -62,9 +62,6 @@ class BbImageEncoderControl : public QImageEncoderControl
public:
explicit BbImageEncoderControl(BbCameraSession *session, QObject *parent = 0);
- QStringList supportedImageCodecs() const override;
- QString imageCodecDescription(const QString &codecName) const override;
- QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const override;
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
diff --git a/src/multimedia/recording/qmediaencodersettings.cpp b/src/multimedia/recording/qmediaencodersettings.cpp
index 68df20216..a1e3b1653 100644
--- a/src/multimedia/recording/qmediaencodersettings.cpp
+++ b/src/multimedia/recording/qmediaencodersettings.cpp
@@ -39,6 +39,8 @@
#include "qmediaencodersettings.h"
#include "qmediaformat.h"
+#include <private/qmediaplatformintegration_p.h>
+#include <private/qmediaplatformformatinfo_p.h>
QT_BEGIN_NAMESPACE
@@ -438,7 +440,7 @@ class QImageEncoderSettingsPrivate : public QSharedData
{
public:
bool isNull = true;
- QString codec;
+ QImageEncoderSettings::FileFormat format;
QSize resolution;
QMultimedia::EncodingQuality quality = QMultimedia::NormalQuality;
QVariantMap encodingOptions;
@@ -513,7 +515,7 @@ bool QImageEncoderSettings::operator==(const QImageEncoderSettings &other) const
return (d == other.d) ||
(d->isNull == other.d->isNull &&
d->quality == other.d->quality &&
- d->codec == other.d->codec &&
+ d->format == other.d->format &&
d->resolution == other.d->resolution &&
d->encodingOptions == other.d->encodingOptions);
@@ -542,21 +544,72 @@ bool QImageEncoderSettings::isNull() const
}
/*!
- Returns the image codec.
+ Returns the image format.
*/
-QString QImageEncoderSettings::codec() const
+QImageEncoderSettings::FileFormat QImageEncoderSettings::format() const
{
- return d->codec;
+ return d->format;
}
/*!
- Sets the image \a codec.
+ Sets the image \a format.
*/
-void QImageEncoderSettings::setCodec(const QString& codec)
+void QImageEncoderSettings::setFormat(QImageEncoderSettings::FileFormat format)
{
d->isNull = false;
- d->codec = codec;
+ d->format = format;
+}
+
+QList<QImageEncoderSettings::FileFormat> QImageEncoderSettings::supportedFormats()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->imageFormats;
+}
+
+QString QImageEncoderSettings::fileFormatName(QImageEncoderSettings::FileFormat f)
+{
+ const char *name = nullptr;
+ switch (f) {
+ case UnspecifiedFormat:
+ name = "Unspecified image format";
+ break;
+ case JPEG:
+ name = "JPEG";
+ break;
+ case PNG:
+ name = "PNG";
+ break;
+ case WebP:
+ name = "WebP";
+ break;
+ case Tiff:
+ name = "Tiff";
+ break;
+ }
+ return QString::fromUtf8(name);
+}
+
+QString QImageEncoderSettings::fileFormatDescription(QImageEncoderSettings::FileFormat f)
+{
+ const char *name = nullptr;
+ switch (f) {
+ case UnspecifiedFormat:
+ name = "Unspecified image format";
+ break;
+ case JPEG:
+ name = "JPEG";
+ break;
+ case PNG:
+ name = "PNG";
+ break;
+ case WebP:
+ name = "WebP";
+ break;
+ case Tiff:
+ name = "Tiff";
+ break;
+ }
+ return QString::fromUtf8(name);
}
/*!
diff --git a/src/multimedia/recording/qmediaencodersettings.h b/src/multimedia/recording/qmediaencodersettings.h
index b0a68af2d..6e8d35794 100644
--- a/src/multimedia/recording/qmediaencodersettings.h
+++ b/src/multimedia/recording/qmediaencodersettings.h
@@ -95,6 +95,15 @@ class QImageEncoderSettingsPrivate;
class Q_MULTIMEDIA_EXPORT QImageEncoderSettings
{
public:
+ enum FileFormat {
+ UnspecifiedFormat,
+ JPEG,
+ PNG,
+ WebP,
+ Tiff,
+ LastFileFormat = Tiff
+ };
+
QImageEncoderSettings();
QImageEncoderSettings(const QImageEncoderSettings& other);
@@ -106,8 +115,12 @@ public:
bool isNull() const;
- QString codec() const;
- void setCodec(const QString &);
+ FileFormat format() const;
+ void setFormat(FileFormat format);
+
+ static QList<FileFormat> supportedFormats();
+ static QString fileFormatName(FileFormat c);
+ static QString fileFormatDescription(FileFormat c);
QSize resolution() const;
void setResolution(const QSize &);