summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorBłażej Szczygieł2024-01-29 20:06:52 +0100
committerBłażej Szczygieł2024-01-29 20:06:52 +0100
commitb48cab3a282bc2015c0718ea06553d4a8918b015 (patch)
tree669ae344605eb45b47907b072d26d91ef947a034
parent88450c359f56ca068ec09636a39be7f3bf8e5ad6 (diff)
downloadaur-b48cab3a282bc2015c0718ea06553d4a8918b015.tar.gz
Apply fed57c8cf746812bdc93704af7d0ebcfa69a5156
-rw-r--r--.SRCINFO6
-rw-r--r--41da371d47099cd486c748887826489456ee20ab.patch356
-rw-r--r--PKGBUILD8
-rw-r--r--fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch214
4 files changed, 221 insertions, 363 deletions
diff --git a/.SRCINFO b/.SRCINFO
index c7c37093509d..f56e9387625e 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = qmplay2
pkgdesc = QMPlay2 is a video and audio player which can play most formats and codecs
pkgver = 23.10.22
- pkgrel = 2
+ pkgrel = 3
url = https://github.com/zaps166/QMPlay2
arch = i686
arch = x86_64
@@ -37,8 +37,8 @@ pkgbase = qmplay2
optdepends = pulseaudio: PulseAudio support
optdepends = game_music_emu-kode54-git: Better chiptune support (less bugs in sound, AUR package)
source = https://github.com/zaps166/QMPlay2/releases/download/23.10.22/QMPlay2-src-23.10.22.tar.xz
- source = 41da371d47099cd486c748887826489456ee20ab.patch
+ source = fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch
sha256sums = d81c5a81a8839ac441eb7466eb16931aab92f71fd784a3b3e1d709272c4237cf
- sha256sums = b76d770764166499d43b5f63944286160401d5c2dd405d6d5f8f981615deb531
+ sha256sums = d746e7750e08833f0d9daa7b998f18e51f7edd1d97be65b08dadc7088b5f1468
pkgname = qmplay2
diff --git a/41da371d47099cd486c748887826489456ee20ab.patch b/41da371d47099cd486c748887826489456ee20ab.patch
deleted file mode 100644
index 8b2f68daa023..000000000000
--- a/41da371d47099cd486c748887826489456ee20ab.patch
+++ /dev/null
@@ -1,356 +0,0 @@
-From 41da371d47099cd486c748887826489456ee20ab Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <mumei6102@gmail.com>
-Date: Sun, 3 Dec 2023 00:08:35 +0100
-Subject: [PATCH] Use new FFT API for FFmpeg >= 6.1
-
-Use new API when compiling with FFmpeg >= 6.1, because FFmpeg 6.1 has
-a bug in old API wrapper which leads to QMPlay2 crash.
----
- src/modules/AudioFilters/Equalizer.cpp | 32 ++-----
- src/modules/AudioFilters/Equalizer.hpp | 10 +-
- src/modules/Visualizations/FFTSpectrum.cpp | 27 ++----
- src/modules/Visualizations/FFTSpectrum.hpp | 8 +-
- src/qmplay2/CMakeLists.txt | 1 +
- src/qmplay2/FFT.hpp | 104 +++++++++++++++++++++
- 6 files changed, 130 insertions(+), 52 deletions(-)
- create mode 100644 src/qmplay2/FFT.hpp
-
-diff --git a/src/modules/AudioFilters/Equalizer.cpp b/src/modules/AudioFilters/Equalizer.cpp
-index 7b51b090e..21cf8eec3 100644
---- a/src/modules/AudioFilters/Equalizer.cpp
-+++ b/src/modules/AudioFilters/Equalizer.cpp
-@@ -18,20 +18,8 @@
-
- #include <Equalizer.hpp>
-
--extern "C"
--{
-- #include <libavutil/mem.h>
-- #include <libavcodec/avfft.h>
--}
--
- #include <cmath>
-
--static inline void fft_calc(FFTContext *fft_ctx, FFTComplex *cplx)
--{
-- av_fft_permute(fft_ctx, cplx);
-- av_fft_calc(fft_ctx, cplx);
--}
--
- static inline float cosI(const float y1, const float y2, float p)
- {
- p = (1.0f - cos(p * static_cast<float>(M_PI))) / 2.0f;
-@@ -178,7 +166,7 @@ double Equalizer::filter(QByteArray &data, bool flush)
- else
- m_input[c].clear();
-
-- fft_calc(m_fftIn, m_complex);
-+ m_fftIn.calc(m_complex);
- for (int i = 0; i < fftSizeDiv2; ++i)
- {
- const float coeff = m_f[i] * m_preamp;
-@@ -187,7 +175,7 @@ double Equalizer::filter(QByteArray &data, bool flush)
- m_complex[fftSize - 1 - i].re *= coeff;
- m_complex[fftSize - 1 - i].im *= coeff;
- }
-- fft_calc(m_fftOut, m_complex);
-+ m_fftOut.calc(m_complex);
-
- if (m_lastSamples[c].empty())
- {
-@@ -212,14 +200,12 @@ double Equalizer::filter(QByteArray &data, bool flush)
- void Equalizer::alloc(bool b)
- {
- QMutexLocker locker(&m_mutex);
-- if (!b && (m_fftIn || m_fftOut))
-+ if (!b && (m_fftIn.isValid() || m_fftOut.isValid()))
- {
- m_canFilter = false;
- m_fftNBits = m_fftSize = 0;
-- av_fft_end(m_fftIn);
-- av_fft_end(m_fftOut);
-- m_fftIn = nullptr;
-- m_fftOut = nullptr;
-+ m_fftIn.finish();
-+ m_fftOut.finish();
- av_free(m_complex);
- m_complex = nullptr;
- m_input.clear();
-@@ -233,13 +219,13 @@ void Equalizer::alloc(bool b)
- }
- else if (b)
- {
-- if (!m_fftIn || !m_fftOut)
-+ if (!m_fftIn.isValid() || !m_fftOut.isValid())
- {
- m_fftNBits = sets().getInt("Equalizer/nbits");
- m_fftSize = 1 << m_fftNBits;
-- m_fftIn = av_fft_init(m_fftNBits, false);
-- m_fftOut = av_fft_init(m_fftNBits, true);
-- m_complex = (FFTComplex *)av_malloc(m_fftSize * sizeof(FFTComplex));
-+ m_fftIn.init(m_fftNBits, false);
-+ m_fftOut.init(m_fftNBits, true);
-+ m_complex = FFT::allocComplex(m_fftSize);
- m_input.resize(m_chn);
- m_lastSamples.resize(m_chn);
- m_windF.resize(m_fftSize);
-diff --git a/src/modules/AudioFilters/Equalizer.hpp b/src/modules/AudioFilters/Equalizer.hpp
-index 963cf6513..48777933c 100644
---- a/src/modules/AudioFilters/Equalizer.hpp
-+++ b/src/modules/AudioFilters/Equalizer.hpp
-@@ -19,12 +19,10 @@
- #pragma once
-
- #include <AudioFilter.hpp>
-+#include <FFT.hpp>
-
- #include <vector>
-
--struct FFTContext;
--struct FFTComplex;
--
- class Equalizer final : public AudioFilter
- {
- public:
-@@ -63,9 +61,9 @@ class Equalizer final : public AudioFilter
- #else
- mutable QMutex m_mutex;
- #endif
-- FFTContext *m_fftIn = nullptr;
-- FFTContext *m_fftOut = nullptr;
-- FFTComplex *m_complex = nullptr;
-+ FFT m_fftIn;
-+ FFT m_fftOut;
-+ FFT::Complex *m_complex = nullptr;
- std::vector<std::vector<float>> m_input, m_lastSamples;
- std::vector<float> m_windF, m_f;
- float m_preamp = 0.0f;
-diff --git a/src/modules/Visualizations/FFTSpectrum.cpp b/src/modules/Visualizations/FFTSpectrum.cpp
-index 0fdbb8958..de401e169 100644
---- a/src/modules/Visualizations/FFTSpectrum.cpp
-+++ b/src/modules/Visualizations/FFTSpectrum.cpp
-@@ -23,15 +23,9 @@
- #include <QPainterPath>
- #include <qevent.h>
-
--extern "C"
--{
-- #include <libavutil/mem.h>
-- #include <libavcodec/avfft.h>
--}
--
- #include <cmath>
-
--static inline void fltmix(FFTComplex *dest, const float *winFunc, const float *src, const int size, const uchar chn)
-+static inline void fltmix(FFT::Complex *dest, const float *winFunc, const float *src, const int size, const uchar chn)
- {
- for (int i = 0, j = 0; i < size; i += chn)
- {
-@@ -144,7 +138,7 @@ void FFTSpectrumW::stop()
- /**/
-
- FFTSpectrum::FFTSpectrum(Module &module) :
-- w(*this), fft_ctx(nullptr), tmpData(nullptr), tmpDataSize(0), tmpDataPos(0), m_linearScale(false)
-+ w(*this), tmpDataSize(0), tmpDataPos(0), m_linearScale(false)
- {
- SetModule(module);
- }
-@@ -156,17 +150,15 @@ void FFTSpectrum::soundBuffer(const bool enable)
- if (arrSize != tmpDataSize)
- {
- tmpDataPos = 0;
-- av_free(tmpData);
-- tmpData = nullptr;
-+ FFT::freeComplex(m_complex);
- m_winFunc.clear();
- w.spectrumData.clear();
- w.lastData.clear();
-- av_fft_end(fft_ctx);
-- fft_ctx = nullptr;
-+ m_fft.finish();
- if ((tmpDataSize = arrSize))
- {
-- fft_ctx = av_fft_init(w.fftSize, false);
-- tmpData = (FFTComplex *)av_malloc(tmpDataSize * sizeof(FFTComplex));
-+ m_fft.init(w.fftSize, false);
-+ m_complex = FFT::allocComplex(tmpDataSize);
- m_winFunc.resize(tmpDataSize);
- for (int i = 0; i < tmpDataSize; ++i)
- m_winFunc[i] = 0.5f - 0.5f * cos(2.0f * static_cast<float>(M_PI) * i / (tmpDataSize - 1));
-@@ -240,18 +232,17 @@ void FFTSpectrum::sendSoundData(const QByteArray &data)
- const int size = qMin((data.size() - newDataPos) / (int)sizeof(float), (tmpDataSize - tmpDataPos) * w.chn);
- if (!size)
- break;
-- fltmix(tmpData + tmpDataPos, m_winFunc.data() + tmpDataPos, (const float *)(data.constData() + newDataPos), size, w.chn);
-+ fltmix(m_complex + tmpDataPos, m_winFunc.data() + tmpDataPos, (const float *)(data.constData() + newDataPos), size, w.chn);
- newDataPos += size * sizeof(float);
- tmpDataPos += size / w.chn;
- if (tmpDataPos == tmpDataSize)
- {
-- av_fft_permute(fft_ctx, tmpData);
-- av_fft_calc(fft_ctx, tmpData);
-+ m_fft.calc(m_complex);
- tmpDataPos /= 2;
- float *spectrumData = w.spectrumData.data();
- for (int i = 0; i < tmpDataPos; ++i)
- {
-- spectrumData[i] = sqrt(tmpData[i].re * tmpData[i].re + tmpData[i].im * tmpData[i].im) / tmpDataPos;
-+ spectrumData[i] = sqrt(m_complex[i].re * m_complex[i].re + m_complex[i].im * m_complex[i].im) / tmpDataPos;
- if (m_linearScale)
- spectrumData[i] *= 2.0f;
- else
-diff --git a/src/modules/Visualizations/FFTSpectrum.hpp b/src/modules/Visualizations/FFTSpectrum.hpp
-index bd69e6bb5..9cd3e4768 100644
---- a/src/modules/Visualizations/FFTSpectrum.hpp
-+++ b/src/modules/Visualizations/FFTSpectrum.hpp
-@@ -20,6 +20,7 @@
-
- #include <QMPlay2Extensions.hpp>
- #include <VisWidget.hpp>
-+#include <FFT.hpp>
-
- #include <QCoreApplication>
- #include <QLinearGradient>
-@@ -52,9 +53,6 @@ class FFTSpectrumW final : public VisWidget
-
- /**/
-
--struct FFTContext;
--struct FFTComplex;
--
- class FFTSpectrum final : public QMPlay2Extensions
- {
- public:
-@@ -76,8 +74,8 @@ class FFTSpectrum final : public QMPlay2Extensions
-
- FFTSpectrumW w;
-
-- FFTContext *fft_ctx;
-- FFTComplex *tmpData;
-+ FFT m_fft;
-+ FFT::Complex *m_complex = nullptr;
- std::vector<float> m_winFunc;
- int tmpDataSize, tmpDataPos;
- bool m_linearScale;
-diff --git a/src/qmplay2/CMakeLists.txt b/src/qmplay2/CMakeLists.txt
-index babb2d03a..1793f50fa 100644
---- a/src/qmplay2/CMakeLists.txt
-+++ b/src/qmplay2/CMakeLists.txt
-@@ -50,6 +50,7 @@ set(QMPLAY2_HDR
- VideoOutputCommon.hpp
- HWDecContext.hpp
- GPUInstance.hpp
-+ FFT.hpp
- )
-
- set(QMPLAY2_SRC
-diff --git a/src/qmplay2/FFT.hpp b/src/qmplay2/FFT.hpp
-new file mode 100644
-index 000000000..b175fbd87
---- /dev/null
-+++ b/src/qmplay2/FFT.hpp
-@@ -0,0 +1,104 @@
-+#pragma once
-+
-+extern "C"
-+{
-+ #include <libavutil/version.h>
-+ #include <libavutil/mem.h>
-+ #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 29, 100)
-+ # include <libavutil/tx.h>
-+ #else
-+ # include <libavcodec/avfft.h>
-+ #endif
-+}
-+
-+class FFT
-+{
-+public:
-+ struct Complex
-+ {
-+ float re, im;
-+ };
-+
-+ static inline Complex *allocComplex(int n);
-+ static inline void freeComplex(Complex *&complex);
-+
-+public:
-+ inline FFT() = default;
-+ inline ~FFT();
-+
-+ inline bool isValid() const;
-+
-+ inline void init(int nbits, int inverse);
-+ inline void calc(Complex *complex);
-+ inline void finish();
-+
-+private:
-+#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 29, 100)
-+ AVTXContext *m_ctx = nullptr;
-+ av_tx_fn m_fn = nullptr;
-+#else
-+ FFTContext *m_ctx = nullptr;
-+#endif
-+};
-+
-+/* Inline implementation */
-+
-+FFT::Complex *FFT::allocComplex(int n)
-+{
-+ return reinterpret_cast<Complex *>(av_malloc(n * sizeof(Complex)));
-+}
-+void FFT::freeComplex(Complex *&complex)
-+{
-+ av_freep(&complex);
-+}
-+
-+FFT::~FFT()
-+{
-+ finish();
-+}
-+
-+bool FFT::isValid() const
-+{
-+ return static_cast<bool>(m_ctx);
-+}
-+
-+#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 29, 100)
-+void FFT::init(int nbits, int inverse)
-+{
-+ finish();
-+
-+ const float scale = 1.0f;
-+ av_tx_init(&m_ctx, &m_fn, AV_TX_FLOAT_FFT, inverse, 1 << nbits, &scale, AV_TX_INPLACE);
-+}
-+void FFT::calc(Complex *complex)
-+{
-+ if (m_ctx && m_fn)
-+ {
-+ m_fn(m_ctx, complex, complex, sizeof(Complex));
-+ }
-+}
-+void FFT::finish()
-+{
-+ av_tx_uninit(&m_ctx);
-+}
-+#else
-+void FFT::init(int nbits, int inverse)
-+{
-+ finish();
-+
-+ m_ctx = av_fft_init(nbits, inverse);
-+}
-+void FFT::calc(Complex *complex)
-+{
-+ if (m_ctx)
-+ {
-+ av_fft_permute(m_ctx, reinterpret_cast<FFTComplex *>(complex));
-+ av_fft_calc(m_ctx, reinterpret_cast<FFTComplex *>(complex));
-+ }
-+}
-+void FFT::finish()
-+{
-+ av_fft_end(m_ctx);
-+ m_ctx = nullptr;
-+}
-+#endif
diff --git a/PKGBUILD b/PKGBUILD
index 759098bfb76b..67f45bd2da8a 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -2,7 +2,7 @@
pkgname=qmplay2
pkgver=23.10.22
-pkgrel=2
+pkgrel=3
pkgdesc='QMPlay2 is a video and audio player which can play most formats and codecs'
arch=('i686' 'x86_64' 'armv7h' 'armv6h' 'aarch64')
url='https://github.com/zaps166/QMPlay2'
@@ -12,17 +12,17 @@ optdepends=('pulseaudio: PulseAudio support'
'game_music_emu-kode54-git: Better chiptune support (less bugs in sound, AUR package)')
makedepends=('ninja' 'clang' 'pkg-config' 'qt5-tools' 'cmake' 'fakeroot' 'patch')
source=("https://github.com/zaps166/QMPlay2/releases/download/${pkgver}/QMPlay2-src-${pkgver}.tar.xz"
- "41da371d47099cd486c748887826489456ee20ab.patch"
+ "fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch"
)
sha256sums=(d81c5a81a8839ac441eb7466eb16931aab92f71fd784a3b3e1d709272c4237cf
- b76d770764166499d43b5f63944286160401d5c2dd405d6d5f8f981615deb531
+ d746e7750e08833f0d9daa7b998f18e51f7edd1d97be65b08dadc7088b5f1468
)
prepare()
{
mkdir -p $srcdir/QMPlay2-build
cd $srcdir/QMPlay2-src-${pkgver}
- patch -p1 < $srcdir/41da371d47099cd486c748887826489456ee20ab.patch
+ patch -p1 < $srcdir/fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch
}
build()
diff --git a/fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch b/fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch
new file mode 100644
index 000000000000..0a7b0fafacc3
--- /dev/null
+++ b/fed57c8cf746812bdc93704af7d0ebcfa69a5156.patch
@@ -0,0 +1,214 @@
+From fed57c8cf746812bdc93704af7d0ebcfa69a5156 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <mumei6102@gmail.com>
+Date: Mon, 29 Jan 2024 20:00:41 +0100
+Subject: [PATCH] TagLib: Add support for 2.0, remove support for 1.9 and 1.10
+
+Closes #680
+---
+ README.md | 2 +-
+ src/gui/TagEditor.cpp | 78 ++++++++-----------------------------------
+ 2 files changed, 15 insertions(+), 65 deletions(-)
+
+diff --git a/README.md b/README.md
+index 81b72f9e6..34025d084 100644
+--- a/README.md
++++ b/README.md
+@@ -198,7 +198,7 @@ For CMake build be sure that you have CMake 3.9 or higher.
+ - libavdevice - for FFmpeg module only, optional (enabled on Linux as default),
+
+ #### Important:
+-- TagLib >= 1.9,
++- TagLib >= 1.11,
+ - libass - for OSD and non-graphical subtitles.
+
+ #### For modules (some of them can be automatically disabled if not found):
+diff --git a/src/gui/TagEditor.cpp b/src/gui/TagEditor.cpp
+index d1f101b7d..55756cd60 100644
+--- a/src/gui/TagEditor.cpp
++++ b/src/gui/TagEditor.cpp
+@@ -21,19 +21,12 @@
+ #include <Functions.hpp>
+ #include <Main.hpp>
+
+-#define TAGLIB_VERSION ((TAGLIB_MAJOR_VERSION << 8) | TAGLIB_MINOR_VERSION)
+-#define TAGLIB1B (TAGLIB_VERSION >= 0x10B)
+-
+ #ifdef TAGLIB_FULL_INCLUDE_PATH
+ #include <taglib/taglib.h>
+ #else
+ #include <taglib.h>
+ #endif
+
+-#if TAGLIB_VERSION < 0x109
+- #error Taglib 1.9 or newer is needed!
+-#endif
+-
+ #ifdef TAGLIB_FULL_INCLUDE_PATH
+ #include <taglib/trueaudiofile.h>
+ #include <taglib/oggflacfile.h>
+@@ -54,6 +47,7 @@
+ #include <taglib/itfile.h>
+ #include <taglib/xmfile.h>
+ #include <taglib/opusfile.h>
++ #include <taglib/attachedpictureframe.h>
+ #else
+ #include <trueaudiofile.h>
+ #include <oggflacfile.h>
+@@ -74,6 +68,7 @@
+ #include <itfile.h>
+ #include <xmfile.h>
+ #include <opusfile.h>
++ #include <attachedpictureframe.h>
+ #endif
+ using namespace TagLib;
+
+@@ -136,17 +131,9 @@ static void removeXiphComment(Ogg::XiphComment *xiphComment)
+ {
+ if (xiphComment)
+ {
+-#if TAGLIB1B
+ xiphComment->removeAllPictures();
+ xiphComment->removeAllFields();
+-#else
+- const Ogg::FieldListMap &fieldListMap = xiphComment->fieldListMap();
+- for (Ogg::FieldListMap::ConstIterator it = fieldListMap.begin(); it != fieldListMap.end(); ++it)
+- {
+- if (xiphComment->contains(it->first))
+- xiphComment->removeField(it->first);
+- }
+-#endif
++
+ }
+ }
+
+@@ -312,10 +299,10 @@ bool TagEditor::open(const QString &fileName)
+ }
+ else if (instanceOf(file, MP4::File))
+ {
+- MP4::ItemListMap &itemListMap = ((MP4::File &)file).tag()->itemListMap();
+- MP4::ItemListMap::ConstIterator it = itemListMap.find("covr");
++ auto &&itemMap = ((MP4::File &)file).tag()->itemMap();
++ auto it = itemMap.find("covr");
+ pictureB->setEnabled(true);
+- if (it != itemListMap.end())
++ if (it != itemMap.end())
+ {
+ MP4::CoverArtList coverArtList = it->second.toCoverArtList();
+ if (!coverArtList.isEmpty())
+@@ -355,25 +342,12 @@ bool TagEditor::open(const QString &fileName)
+ {
+ FLAC::Picture *flacPicture = nullptr;
+ pictureB->setEnabled(true);
+-#if TAGLIB1B
+ const List<FLAC::Picture *> pictures = xiphComment->pictureList();
+ if (!pictures.isEmpty())
+ {
+ flacPicture = pictures[0];
+ hasTags = true;
+ }
+-#else
+- const Ogg::FieldListMap &fieldListMap = xiphComment->fieldListMap();
+- Ogg::FieldListMap::ConstIterator it = fieldListMap.find("METADATA_BLOCK_PICTURE");
+- FLAC::Picture tmpFlacPicture;
+- if (it != fieldListMap.end() && !it->second.isEmpty())
+- {
+- /* OGG picture and FLAC picture are the same except OGG picture is encoded into Base64 */
+- const QByteArray pict_frame_decoded = QByteArray::fromBase64(it->second.front().toCString());
+- if (tmpFlacPicture.parse(ByteVector(pict_frame_decoded.data(), pict_frame_decoded.size())))
+- flacPicture = &tmpFlacPicture;
+- }
+-#endif
+ if (flacPicture)
+ {
+ pictureMimeType = flacPicture->mimeType().toCString();
+@@ -489,12 +463,12 @@ bool TagEditor::save()
+ }
+ else if (instanceOf(file, MP4::File))
+ {
+- MP4::ItemListMap &itemListMap = ((MP4::File &)file).tag()->itemListMap();
+- if (itemListMap.contains("covr"))
+- itemListMap.erase("covr");
++ auto &itemMap = const_cast<MP4::ItemMap &>(((MP4::File &)file).tag()->itemMap());
++ if (itemMap.contains("covr"))
++ itemMap.erase("covr");
+ if (hasPicture)
+ {
+- MP4::CoverArt::Format format = (MP4::CoverArt::Format)0;
++ auto format = MP4::CoverArt::Format::Unknown;
+ if (pictureMimeType == "image/jpeg")
+ format = MP4::CoverArt::JPEG;
+ else if (pictureMimeType == "image/png")
+@@ -503,11 +477,11 @@ bool TagEditor::save()
+ format = MP4::CoverArt::BMP;
+ else if (pictureMimeType == "image/gif")
+ format = MP4::CoverArt::GIF;
+- if (format)
++ if (format != MP4::CoverArt::Format::Unknown)
+ {
+ MP4::CoverArtList coverArtList;
+ coverArtList.append(MP4::CoverArt(format, *picture));
+- itemListMap.insert("covr", coverArtList);
++ itemMap.insert("covr", coverArtList);
+ }
+ }
+ mustSave = true;
+@@ -525,19 +499,9 @@ bool TagEditor::save()
+ flacPicture->setType(FLAC::Picture::FrontCover);
+ flacPicture->setData(*picture);
+ }
+-#if TAGLIB1B
+ xiphComment->removeAllPictures();
+ if (flacPicture)
+ xiphComment->addPicture(flacPicture);
+-#else
+- xiphComment->removeField("METADATA_BLOCK_PICTURE");
+- if (flacPicture)
+- {
+- const ByteVector pict_data = flacPicture->render();
+- xiphComment->addField("METADATA_BLOCK_PICTURE", QByteArray::fromRawData(pict_data.data(), pict_data.size()).toBase64().data());
+- delete flacPicture;
+- }
+-#endif
+ mustSave = true;
+ }
+ }
+@@ -557,7 +521,7 @@ bool TagEditor::save()
+ else if (instanceOf(file, APE::File))
+ ((APE::File &)file).strip();
+ else if (instanceOf(file, MP4::File))
+- ((MP4::File &)file).tag()->itemListMap().clear();
++ const_cast<MP4::ItemMap &>(((MP4::File &)file).tag()->itemMap()).clear();
+ else if (instanceOf(file, ASF::File))
+ ((ASF::File &)file).tag()->attributeListMap().clear();
+ else if (isOgg(file))
+@@ -591,7 +555,7 @@ bool TagEditor::save()
+ else if (instanceOf(file, XM::File))
+ modTag = ((XM::File &)file).tag();
+ if (modTag)
+- modTag->setTrackerName(String::null);
++ modTag->setTrackerName(String());
+ }
+ }
+
+@@ -601,21 +565,7 @@ bool TagEditor::save()
+ FLAC::File &flacF = (FLAC::File &)file;
+ if (flacF.hasID3v1Tag() || flacF.hasID3v2Tag())
+ {
+-#if TAGLIB1B
+ flacF.strip(FLAC::File::ID3v1 | FLAC::File::ID3v2);
+-#else
+- #ifdef Q_OS_WIN
+- const FileName fName = file.name(); //Class with "std::string"
+- #else
+- const QByteArray fName = file.name(); //Raw pointer, so copy it
+- #endif
+- result = fRef->save();
+- delete fRef;
+- fRef = nullptr;
+- if (result)
+- result = MPEG::File(fName, false).save(MPEG::File::NoTags);
+- mustSave = false;
+-#endif
+ }
+ }
+