[neon/extras/qtav/Neon/release] debian/patches: patch in support for ffmpeg5 - github.com/cmguo/QtAV
Carlos De Maine
null at kde.org
Wed Jul 3 03:59:31 BST 2024
Git commit 3b04756294ee22e1d148609ad7091851644de755 by Carlos De Maine.
Committed on 03/07/2024 at 02:59.
Pushed by carlosdem into branch 'Neon/release'.
patch in support for ffmpeg5 - github.com/cmguo/QtAV
A +2149 -0 debian/patches/neon_ffmpeg5_support.diff
M +1 -0 debian/patches/series
https://invent.kde.org/neon/extras/qtav/-/commit/3b04756294ee22e1d148609ad7091851644de755
diff --git a/debian/patches/neon_ffmpeg5_support.diff b/debian/patches/neon_ffmpeg5_support.diff
new file mode 100644
index 0000000..7085c19
--- /dev/null
+++ b/debian/patches/neon_ffmpeg5_support.diff
@@ -0,0 +1,2149 @@
+diff --git a/.qmake.conf b/.qmake.conf
+index ef57faf62..d8ad71d96 100644
+--- a/.qmake.conf
++++ b/.qmake.conf
+@@ -10,5 +10,17 @@ CONFIG *= enable_new_dtags
+ # OSX10.6 is not supported in Qt5.4
+ macx:isEqual(QT_MAJOR_VERSION,5):greaterThan(QT_MINOR_VERSION, 3): CONFIG *= c++11
+ android: CONFIG*=c++11
++else: CONFIG*=c++17
+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.8
+ QMAKE_IOS_DEPLOYMENT_TARGET = 6.0
++
++CONFIG += no-cuda
++win32: {
++ INCLUDEPATH += $$PWD/../avbuild/sdk-mingw--gcc/include
++ LIBS += -L$$PWD/../avbuild/sdk-mingw--gcc/lib
++ CONFIG += no-d3d11va no-dxva
++}
++mac {
++ INCLUDEPATH += $$PWD/../avbuild/sdk-macOS10.7x86_64-clang/include
++ LIBS += -L$$PWD/../avbuild/sdk-macOS10.7x86_64-clang/lib
++}
+diff --git a/examples/examples.pro b/examples/examples.pro
+index 4a11c79ad..a5b950f92 100644
+--- a/examples/examples.pro
++++ b/examples/examples.pro
+@@ -8,13 +8,14 @@ SUBDIRS = common
+ sharedoutput \
+ simpletranscode \
+ simpleplayer \
+- player \
+ filters \
+ framereader \
+- videocapture \
++ videocapture
++lessThan(QT_MAJOR_VERSION,6): SUBDIRS += \
++ videowall \
+ videographicsitem \
+- videogroup \
+- videowall
++ player \
++ videogroup
+ contains(QT_CONFIG, opengl): SUBDIRS += \
+ shader \
+ glslfilter
+@@ -30,12 +31,12 @@ contains(QT_CONFIG, opengl): SUBDIRS += \
+ }
+
+ greaterThan(QT_MAJOR_VERSION, 4) {
+- isEqual(QT_MAJOR_VERSION,5):greaterThan(QT_MINOR_VERSION,3)|greaterThan(QT_MAJOR_VERSION,5) {
++ isEqual(QT_MAJOR_VERSION,5):greaterThan(QT_MINOR_VERSION,3) {
+ contains(QT_CONFIG, opengl):!winrt:!ios:!android: SUBDIRS += window
+ }
+ # qtHaveModule does not exist in Qt5.0
+ isEqual(QT_MINOR_VERSION, 0)|qtHaveModule(quick) {
+- SUBDIRS += QMLPlayer
++ lessThan(QT_MAJOR_VERSION,6): SUBDIRS += QMLPlayer
+ QMLPlayer.depends += common
+ sdk_build: SUBDIRS *= QMLPlayer/QMLPlayer_sdk.pro
+ }
+diff --git a/examples/videographicsitem/videoplayer.cpp b/examples/videographicsitem/videoplayer.cpp
+index ce705496c..f298ec350 100644
+--- a/examples/videographicsitem/videoplayer.cpp
++++ b/examples/videographicsitem/videoplayer.cpp
+@@ -23,6 +23,9 @@
+
+ #if !defined(QT_NO_OPENGL) && QT_VERSION < QT_VERSION_CHECK(6,0,0)
+ #include <QtOpenGL/QGLWidget>
++#elif !defined(QT_NO_OPENGL)
++#include <QtOpenGLWidgets/QOpenGLWidget>
++typedef QOpenGLWidget QGLWidget;
+ #endif
+
+ #include <QCheckBox>
+diff --git a/qml/QmlAV/QQuickItemRenderer.h b/qml/QmlAV/QQuickItemRenderer.h
+index 524bc396f..64f1dcfd8 100644
+--- a/qml/QmlAV/QQuickItemRenderer.h
++++ b/qml/QmlAV/QQuickItemRenderer.h
+@@ -97,8 +97,11 @@ class QQuickItemRenderer : public QQuickItem, public VideoRenderer
+ void backgroundColorChanged() Q_DECL_OVERRIDE;
+ protected:
+ bool event(QEvent *e) Q_DECL_OVERRIDE;
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+-
++#else
++ void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
++#endif
+ bool receiveFrame(const VideoFrame &frame) Q_DECL_OVERRIDE;
+ void drawFrame() Q_DECL_OVERRIDE;
+ // QQuickItem interface
+diff --git a/qml/QmlAV/QmlAVPlayer.h b/qml/QmlAV/QmlAVPlayer.h
+index 71513b298..2130f36a5 100644
+--- a/qml/QmlAV/QmlAVPlayer.h
++++ b/qml/QmlAV/QmlAVPlayer.h
+@@ -1,4 +1,4 @@
+-/******************************************************************************
++/******************************************************************************
+ QtAV: Multimedia framework based on Qt and FFmpeg
+ Copyright (C) 2012-2017 Wang Bin <wbsecg1 at gmail.com>
+
+@@ -357,13 +357,19 @@ private Q_SLOTS:
+ void applyChannelLayout();
+
+ private:
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
++typedef int list_size_t;
++#else
++typedef qsizetype list_size_t;
++#endif
++
+ static void af_append(QQmlListProperty<QuickAudioFilter> *property, QuickAudioFilter *value);
+- static int af_count(QQmlListProperty<QuickAudioFilter> *property);
+- static QuickAudioFilter *af_at(QQmlListProperty<QuickAudioFilter> *property, int index);
++ static list_size_t af_count(QQmlListProperty<QuickAudioFilter> *property);
++ static QuickAudioFilter *af_at(QQmlListProperty<QuickAudioFilter> *property, list_size_t index);
+ static void af_clear(QQmlListProperty<QuickAudioFilter> *property);
+ static void vf_append(QQmlListProperty<QuickVideoFilter> *property, QuickVideoFilter *value);
+- static int vf_count(QQmlListProperty<QuickVideoFilter> *property);
+- static QuickVideoFilter *vf_at(QQmlListProperty<QuickVideoFilter> *property, int index);
++ static list_size_t vf_count(QQmlListProperty<QuickVideoFilter> *property);
++ static QuickVideoFilter *vf_at(QQmlListProperty<QuickVideoFilter> *property, list_size_t index);
+ static void vf_clear(QQmlListProperty<QuickVideoFilter> *property);
+
+ Q_DISABLE_COPY(QmlAVPlayer)
+diff --git a/qml/QmlAV/QuickFBORenderer.h b/qml/QmlAV/QuickFBORenderer.h
+index f156c02bb..1226086a9 100644
+--- a/qml/QmlAV/QuickFBORenderer.h
++++ b/qml/QmlAV/QuickFBORenderer.h
+@@ -122,9 +122,14 @@ class QuickFBORenderer : public QQuickFramebufferObject, public VideoRenderer
+ bool onSetSaturation(qreal s) Q_DECL_OVERRIDE;
+ void updateRenderRect();
+
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
++typedef int list_size_t;
++#else
++typedef qsizetype list_size_t;
++#endif
+ static void vf_append(QQmlListProperty<QuickVideoFilter> *property, QuickVideoFilter *value);
+- static int vf_count(QQmlListProperty<QuickVideoFilter> *property);
+- static QuickVideoFilter *vf_at(QQmlListProperty<QuickVideoFilter> *property, int index);
++ static list_size_t vf_count(QQmlListProperty<QuickVideoFilter> *property);
++ static QuickVideoFilter *vf_at(QQmlListProperty<QuickVideoFilter> *property, list_size_t index);
+ static void vf_clear(QQmlListProperty<QuickVideoFilter> *property);
+ };
+ typedef QuickFBORenderer VideoRendererQuickFBO;
+diff --git a/qml/QmlAV/QuickSubtitleItem.h b/qml/QmlAV/QuickSubtitleItem.h
+index 250117c96..258163c35 100644
+--- a/qml/QmlAV/QuickSubtitleItem.h
++++ b/qml/QmlAV/QuickSubtitleItem.h
+@@ -54,7 +54,11 @@ class QuickSubtitleItem : public QQuickItem, public QuickSubtitleObserver
+ QRectF mapSubRect(const QRect& r, qreal w, qreal h);
+ virtual QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *data);
+ virtual bool event(QEvent *e);
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
++#else
++ virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry);
++#endif
+ private:
+ QuickSubtitle *m_sub;
+ QSGTexture* m_texture;
+diff --git a/qml/QmlAVPlayer.cpp b/qml/QmlAVPlayer.cpp
+index f1bc5a0e2..94d03513f 100644
+--- a/qml/QmlAVPlayer.cpp
++++ b/qml/QmlAVPlayer.cpp
+@@ -1,4 +1,4 @@
+-/******************************************************************************
++/******************************************************************************
+ QtAV: Multimedia framework based on Qt and FFmpeg
+ Copyright (C) 2012-2017 Wang Bin <wbsecg1 at gmail.com>
+
+@@ -538,13 +538,13 @@ void QmlAVPlayer::af_append(QQmlListProperty<QuickAudioFilter> *property, QuickA
+ self->mpPlayer->installFilter(value);
+ }
+
+-int QmlAVPlayer::af_count(QQmlListProperty<QuickAudioFilter> *property)
++QmlAVPlayer::list_size_t QmlAVPlayer::af_count(QQmlListProperty<QuickAudioFilter> *property)
+ {
+ QmlAVPlayer* self = static_cast<QmlAVPlayer*>(property->object);
+ return self->m_afilters.size();
+ }
+
+-QuickAudioFilter* QmlAVPlayer::af_at(QQmlListProperty<QuickAudioFilter> *property, int index)
++QuickAudioFilter* QmlAVPlayer::af_at(QQmlListProperty<QuickAudioFilter> *property, list_size_t index)
+ {
+ QmlAVPlayer* self = static_cast<QmlAVPlayer*>(property->object);
+ return self->m_afilters.at(index);
+@@ -569,13 +569,13 @@ void QmlAVPlayer::vf_append(QQmlListProperty<QuickVideoFilter> *property, QuickV
+ self->mpPlayer->installFilter(value);
+ }
+
+-int QmlAVPlayer::vf_count(QQmlListProperty<QuickVideoFilter> *property)
++QmlAVPlayer::list_size_t QmlAVPlayer::vf_count(QQmlListProperty<QuickVideoFilter> *property)
+ {
+ QmlAVPlayer* self = static_cast<QmlAVPlayer*>(property->object);
+ return self->m_vfilters.size();
+ }
+
+-QuickVideoFilter* QmlAVPlayer::vf_at(QQmlListProperty<QuickVideoFilter> *property, int index)
++QuickVideoFilter* QmlAVPlayer::vf_at(QQmlListProperty<QuickVideoFilter> *property, list_size_t index)
+ {
+ QmlAVPlayer* self = static_cast<QmlAVPlayer*>(property->object);
+ return self->m_vfilters.at(index);
+diff --git a/qml/QuickFBORenderer.cpp b/qml/QuickFBORenderer.cpp
+index 02177ebb1..42bc291bb 100644
+--- a/qml/QuickFBORenderer.cpp
++++ b/qml/QuickFBORenderer.cpp
+@@ -345,13 +345,13 @@ void QuickFBORenderer::vf_append(QQmlListProperty<QuickVideoFilter> *property, Q
+ self->installFilter(value);
+ }
+
+-int QuickFBORenderer::vf_count(QQmlListProperty<QuickVideoFilter> *property)
++QuickFBORenderer::list_size_t QuickFBORenderer::vf_count(QQmlListProperty<QuickVideoFilter> *property)
+ {
+ QuickFBORenderer* self = static_cast<QuickFBORenderer*>(property->object);
+ return self->d_func().filters.size();
+ }
+
+-QuickVideoFilter* QuickFBORenderer::vf_at(QQmlListProperty<QuickVideoFilter> *property, int index)
++QuickVideoFilter* QuickFBORenderer::vf_at(QQmlListProperty<QuickVideoFilter> *property, list_size_t index)
+ {
+ QuickFBORenderer* self = static_cast<QuickFBORenderer*>(property->object);
+ return self->d_func().filters.at(index);
+diff --git a/qml/QuickSubtitleItem.cpp b/qml/QuickSubtitleItem.cpp
+index cc25da61d..2d2fab55a 100644
+--- a/qml/QuickSubtitleItem.cpp
++++ b/qml/QuickSubtitleItem.cpp
+@@ -153,9 +153,22 @@ bool QuickSubtitleItem::event(QEvent *e)
+ return true;
+ }
+
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
++
+ void QuickSubtitleItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+ {
+ QQuickItem::geometryChanged(newGeometry, oldGeometry); //geometry will be updated
+ m_remap = true;
+ QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+ }
++
++#else
++
++void QuickSubtitleItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
++{
++ QQuickItem::geometryChange(newGeometry, oldGeometry); //geometry will be updated
++ m_remap = true;
++ QCoreApplication::postEvent(this, new QEvent(QEvent::User));
++}
++
++#endif
+diff --git a/qml/libQmlAV.pro b/qml/libQmlAV.pro
+index e07c3e8c9..73de6aa72 100644
+--- a/qml/libQmlAV.pro
++++ b/qml/libQmlAV.pro
+@@ -77,8 +77,6 @@ QMAKE_TARGET_PRODUCT = "QtAV QML"
+
+ SOURCES += \
+ plugin.cpp \
+- QQuickItemRenderer.cpp \
+- SGVideoNode.cpp \
+ QmlAVPlayer.cpp \
+ QuickFilter.cpp \
+ QuickSubtitle.cpp \
+@@ -91,14 +89,24 @@ HEADERS += \
+ QmlAV/QuickSubtitleItem.h \
+ QmlAV/QuickVideoPreview.h
+
++lessThan(QT_MAJOR_VERSION,6): {
++ SOURCES += \
++ QQuickItemRenderer.cpp \
++ SGVideoNode.cpp \
++}
++
+ SDK_HEADERS += \
+ QmlAV/Export.h \
+ QmlAV/MediaMetaData.h \
+- QmlAV/SGVideoNode.h \
+- QmlAV/QQuickItemRenderer.h \
+ QmlAV/QuickFilter.h \
+ QmlAV/QmlAVPlayer.h
+
++lessThan(QT_MAJOR_VERSION,6): {
++ SDK_HEADERS += \
++ QmlAV/SGVideoNode.h \
++ QmlAV/QQuickItemRenderer.h
++}
++
+ HEADERS *= \
+ $$SDK_HEADERS
+
+diff --git a/qml/plugin.cpp b/qml/plugin.cpp
+index 10734eeec..c4adebca0 100644
+--- a/qml/plugin.cpp
++++ b/qml/plugin.cpp
+@@ -51,7 +51,9 @@ class QtAVQmlPlugin : public QQmlExtensionPlugin
+ void registerTypes(const char *uri)
+ {
+ Q_ASSERT(QLatin1String(uri) == QLatin1String("QtAV"));
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ qmlRegisterType<QQuickItemRenderer>(uri, 1, 3, "VideoOutput");
++#endif
+ qmlRegisterType<QmlAVPlayer>(uri, 1, 3, "AVPlayer");
+ qmlRegisterType<QmlAVPlayer>(uri, 1, 3, "MediaPlayer");
+ qmlRegisterType<QuickSubtitle>(uri, 1, 4, "Subtitle");
+@@ -60,8 +62,8 @@ class QtAVQmlPlugin : public QQmlExtensionPlugin
+ #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
+ qmlRegisterType<QuickFBORenderer>(uri, 1, 5, "VideoOutput2");
+ #endif
+- qmlRegisterUncreatableType<VideoCapture>(uri, 1, 6, "VideoCapture", trUtf8("VideoCapture is provided by MediaPlayer"));
+- qmlRegisterType<MediaMetaData>();
++ qmlRegisterUncreatableType<VideoCapture>(uri, 1, 6, "VideoCapture", tr("VideoCapture is provided by MediaPlayer").toUtf8());
++ qmlRegisterType<MediaMetaData>(uri, 1, 5, "MediaMetaData");
+
+ // FIXME: if version is 2.x, some qtav types will be undefined, why?
+ // 1.7
+diff --git a/src/AVCompat.cpp b/src/AVCompat.cpp
+index befb3cd9f..cf113f038 100644
+--- a/src/AVCompat.cpp
++++ b/src/AVCompat.cpp
+@@ -391,7 +391,7 @@ const char *get_codec_long_name(enum AVCodecID id)
+ if (cd)
+ return cd->long_name;
+ av_log(NULL, AV_LOG_WARNING, "Codec 0x%x is not in the full list.\n", id);
+- AVCodec *codec = avcodec_find_decoder(id);
++ const AVCodec *codec = avcodec_find_decoder(id);
+ if (codec)
+ return codec->long_name;
+ codec = avcodec_find_encoder(id);
+diff --git a/src/AVDemuxer.cpp b/src/AVDemuxer.cpp
+index e81ef79fa..b8bd55e93 100644
+--- a/src/AVDemuxer.cpp
++++ b/src/AVDemuxer.cpp
+@@ -291,7 +291,7 @@ class AVDemuxer::Private
+ //copy the info, not parse the file when constructed, then need member vars
+ QString file;
+ QString file_orig;
+- AVInputFormat *input_format;
++ const AVInputFormat *input_format;
+ QString format_forced;
+ MediaIO *input;
+
+@@ -311,7 +311,11 @@ class AVDemuxer::Private
+ // wanted_stream is REQUIRED. e.g. always set -1 to indicate the default stream, -2 to disable
+ int stream, wanted_stream; // -1 default, selected by ff
+ int index, wanted_index; // index in a kind of streams
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx;
++#else
++ AVCodecParameters *avctx;
++#endif
+ } StreamInfo;
+ StreamInfo astream, vstream, sstream;
+
+@@ -432,6 +436,13 @@ const QStringList &AVDemuxer::supportedProtocols()
+ return protocols;
+ }
+
++static QMap<QString, AVInputFormat*> gCustomsFormats;
++
++void AVDemuxer::registerCustomFormat(const QString &format, AVInputFormat &input_format)
++{
++ gCustomsFormats[format] = &input_format;
++}
++
+ MediaStatus AVDemuxer::mediaStatus() const
+ {
+ return d->media_status;
+@@ -623,12 +634,14 @@ bool AVDemuxer::seek(qint64 pos)
+ if (upos <= startTime()) {
+ qDebug("************seek to beginning. started = false");
+ d->started = false; //???
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ if (d->astream.avctx)
+ d->astream.avctx->frame_number = 0;
+ if (d->vstream.avctx)
+ d->vstream.avctx->frame_number = 0; //TODO: why frame_number not changed after seek?
+ if (d->sstream.avctx)
+ d->sstream.avctx->frame_number = 0;
++#endif
+ }
+ return true;
+ }
+@@ -699,6 +712,8 @@ bool AVDemuxer::setMedia(const QString &fileName)
+ d->input = MediaIO::createForProtocol(scheme);
+ if (d->input) {
+ d->input->setUrl(d->file);
++ } else if (gCustomsFormats.contains(scheme)) {
++ d->format_forced = scheme;
+ }
+ }
+ return d->media_changed;
+@@ -795,7 +810,9 @@ bool AVDemuxer::load()
+ // check special dict keys
+ // d->format_forced can be set from AVFormatContext.format_whitelist
+ if (!d->format_forced.isEmpty()) {
+- d->input_format = av_find_input_format(d->format_forced.toUtf8().constData());
++ d->input_format = gCustomsFormats.value(d->format_forced);
++ if (d->input_format == nullptr)
++ d->input_format = av_find_input_format(d->format_forced.toUtf8().constData());
+ qDebug() << "force format: " << d->format_forced;
+ }
+ int ret = 0;
+@@ -1071,37 +1088,61 @@ QList<int> AVDemuxer::subtitleStreams() const
+ return d->subtitle_streams;
+ }
+
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext* AVDemuxer::audioCodecContext(int stream) const
++#else
++AVCodecParameters* AVDemuxer::audioCodecContext(int stream) const
++#endif
+ {
+ if (stream < 0)
+ return d->astream.avctx;
+ if (stream > (int)d->format_ctx->nb_streams)
+ return 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = d->format_ctx->streams[stream]->codec;
++#else
++ AVCodecParameters *avctx = d->format_ctx->streams[stream]->codecpar;
++#endif
+ if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
+ return avctx;
+ return 0;
+ }
+
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext* AVDemuxer::videoCodecContext(int stream) const
++#else
++AVCodecParameters* AVDemuxer::videoCodecContext(int stream) const
++#endif
+ {
+ if (stream < 0)
+ return d->vstream.avctx;
+ if (stream > (int)d->format_ctx->nb_streams)
+ return 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = d->format_ctx->streams[stream]->codec;
++#else
++ AVCodecParameters *avctx = d->format_ctx->streams[stream]->codecpar;
++#endif
+ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
+ return avctx;
+ return 0;
+ }
+
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext* AVDemuxer::subtitleCodecContext(int stream) const
++#else
++AVCodecParameters* AVDemuxer::subtitleCodecContext(int stream) const
++#endif
+ {
+ if (stream < 0)
+ return d->sstream.avctx;
+ if (stream > (int)d->format_ctx->nb_streams)
+ return 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = d->format_ctx->streams[stream]->codec;
++#else
++ AVCodecParameters *avctx = d->format_ctx->streams[stream]->codecpar;
++#endif
+ if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE)
+ return avctx;
+ return 0;
+@@ -1298,7 +1339,11 @@ bool AVDemuxer::Private::setStream(AVDemuxer::StreamType st, int streamValue)
+ // don't touch wanted index
+ si->stream = s;
+ si->wanted_stream = streamValue;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ si->avctx = format_ctx->streams[s]->codec;
++#else
++ si->avctx = format_ctx->streams[s]->codecpar;
++#endif
+ has_attached_pic = !!(format_ctx->streams[s]->disposition & AV_DISPOSITION_ATTACHED_PIC);
+ return true;
+ }
+@@ -1311,7 +1356,11 @@ bool AVDemuxer::Private::prepareStreams()
+ return false;
+ AVMediaType type = AVMEDIA_TYPE_UNKNOWN;
+ for (unsigned int i = 0; i < format_ctx->nb_streams; ++i) {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ type = format_ctx->streams[i]->codec->codec_type;
++#else
++ type = format_ctx->streams[i]->codecpar->codec_type;
++#endif
+ if (type == AVMEDIA_TYPE_VIDEO) {
+ video_streams.push_back(i);
+ } else if (type == AVMEDIA_TYPE_AUDIO) {
+diff --git a/src/AVMuxer.cpp b/src/AVMuxer.cpp
+index 8ee692cc0..39e2a9496 100644
+--- a/src/AVMuxer.cpp
++++ b/src/AVMuxer.cpp
+@@ -81,7 +81,7 @@ class AVMuxer::Private
+ //copy the info, not parse the file when constructed, then need member vars
+ QString file;
+ QString file_orig;
+- AVOutputFormat *format;
++ const AVOutputFormat *format;
+ QString format_forced;
+ MediaIO *io;
+
+@@ -94,7 +94,7 @@ class AVMuxer::Private
+
+ AVStream *AVMuxer::Private::addStream(AVFormatContext* ctx, const QString &codecName, AVCodecID codecId)
+ {
+- AVCodec *codec = NULL;
++ const AVCodec *codec = NULL;
+ if (!codecName.isEmpty()) {
+ codec = avcodec_find_encoder_by_name(codecName.toUtf8().constData());
+ if (!codec) {
+@@ -120,7 +120,8 @@ AVStream *AVMuxer::Private::addStream(AVFormatContext* ctx, const QString &codec
+ // set by avformat if unset
+ s->id = ctx->nb_streams - 1;
+ s->time_base = kTB;
+- AVCodecContext *c = s->codec;
++#if LIBAVCODEC_VERSION_MAJOR < 59
++ AVCodec *c = s->codec;
+ c->codec_id = codec->id;
+ // Using codec->time_base is deprecated, but needed for older lavf.
+ c->time_base = s->time_base;
+@@ -129,6 +130,7 @@ AVStream *AVMuxer::Private::addStream(AVFormatContext* ctx, const QString &codec
+ c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+ // expose avctx to encoder and set properties in encoder?
+ // list codecs for a given format in ui
++#endif
+ return s;
+ }
+
+@@ -137,16 +139,24 @@ bool AVMuxer::Private::prepareStreams()
+ audio_streams.clear();
+ video_streams.clear();
+ subtitle_streams.clear();
+- AVOutputFormat* fmt = format_ctx->oformat;
++ const AVOutputFormat* fmt = format_ctx->oformat;
+ if (venc) {
+ AVStream *s = addStream(format_ctx, venc->codecName(), fmt->video_codec);
+ if (s) {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *c = s->codec;
++#else
++ AVCodecParameters *c = s->codecpar;
++#endif
+ c->bit_rate = venc->bitRate();
+ c->width = venc->width();
+ c->height = venc->height();
+ /// MUST set after encoder is open to ensure format is valid and the same
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ c->pix_fmt = (AVPixelFormat)VideoFormat::pixelFormatToFFmpeg(venc->pixelFormat());
++#else
++ c->format = (AVPixelFormat)VideoFormat::pixelFormatToFFmpeg(venc->pixelFormat());
++#endif
+
+ // Set avg_frame_rate based on encoder frame_rate
+ s->avg_frame_rate = av_d2q(venc->frameRate(), venc->frameRate()*1001.0+2);
+@@ -157,11 +167,19 @@ bool AVMuxer::Private::prepareStreams()
+ if (aenc) {
+ AVStream *s = addStream(format_ctx, aenc->codecName(), fmt->audio_codec);
+ if (s) {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *c = s->codec;
++#else
++ AVCodecParameters *c = s->codecpar;
++#endif
+ c->bit_rate = aenc->bitRate();
+ /// MUST set after encoder is open to ensure format is valid and the same
+ c->sample_rate = aenc->audioFormat().sampleRate();
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ c->sample_fmt = (AVSampleFormat)aenc->audioFormat().sampleFormatFFmpeg();
++#else
++ c->format = (AVSampleFormat)aenc->audioFormat().sampleFormatFFmpeg();
++#endif
+ c->channel_layout = aenc->audioFormat().channelLayoutFFmpeg();
+ c->channels = aenc->audioFormat().channels();
+ c->bits_per_raw_sample = aenc->audioFormat().bytesPerSample()*8; // need??
+diff --git a/src/AVPlayerPrivate.cpp b/src/AVPlayerPrivate.cpp
+index 79eeff186..2c94fbc41 100644
+--- a/src/AVPlayerPrivate.cpp
++++ b/src/AVPlayerPrivate.cpp
+@@ -56,7 +56,11 @@ int computeNotifyPrecision(qint64 duration, qreal fps)
+ }
+ } // namespace Internal
+
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ static bool correct_audio_channels(AVCodecContext *ctx) {
++#else
++static bool correct_audio_channels(AVCodecParameters *ctx) {
++#endif
+ if (ctx->channels <= 0) {
+ if (ctx->channel_layout) {
+ ctx->channels = av_get_channel_layout_nb_channels(ctx->channel_layout);
+@@ -254,7 +258,11 @@ void AVPlayer::Private::initBaseStatistics()
+ updateNotifyInterval();
+ }
+
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ void AVPlayer::Private::initCommonStatistics(int s, Statistics::Common *st, AVCodecContext *avctx)
++#else
++void AVPlayer::Private::initCommonStatistics(int s, Statistics::Common *st, AVCodecParameters *avctx)
++#endif
+ {
+ AVFormatContext *fmt_ctx = demuxer.formatContext();
+ if (!fmt_ctx) {
+@@ -293,7 +301,11 @@ void AVPlayer::Private::initCommonStatistics(int s, Statistics::Common *st, AVCo
+
+ void AVPlayer::Private::initAudioStatistics(int s)
+ {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = demuxer.audioCodecContext();
++#else
++ AVCodecParameters *avctx = demuxer.audioCodecContext();
++#endif
+ statistics.audio = Statistics::Common();
+ statistics.audio_only = Statistics::AudioOnly();
+ if (!avctx)
+@@ -311,14 +323,22 @@ void AVPlayer::Private::initAudioStatistics(int s)
+ // nb_channels -1: will use av_get_channel_layout_nb_channels
+ av_get_channel_layout_string(cl, sizeof(cl), avctx->channels, avctx->channel_layout);
+ statistics.audio_only.channel_layout = QLatin1String(cl);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ statistics.audio_only.sample_fmt = QLatin1String(av_get_sample_fmt_name(avctx->sample_fmt));
++#else
++ statistics.audio_only.sample_fmt = QLatin1String(av_get_sample_fmt_name(static_cast<AVSampleFormat>(avctx->format)));
++#endif
+ statistics.audio_only.frame_size = avctx->frame_size;
+ statistics.audio_only.sample_rate = avctx->sample_rate;
+ }
+
+ void AVPlayer::Private::initVideoStatistics(int s)
+ {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = demuxer.videoCodecContext();
++#else
++ AVCodecParameters *avctx = demuxer.videoCodecContext();
++#endif
+ statistics.video = Statistics::Common();
+ statistics.video_only = Statistics::VideoOnly();
+ if (!avctx)
+@@ -329,10 +349,20 @@ void AVPlayer::Private::initVideoStatistics(int s)
+ statistics.video.decoder = vdec->name();
+ statistics.video.decoder_detail = vdec->description();
+ }
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ statistics.video_only.coded_height = avctx->coded_height;
+ statistics.video_only.coded_width = avctx->coded_width;
+ statistics.video_only.gop_size = avctx->gop_size;
+ statistics.video_only.pix_fmt = QLatin1String(av_get_pix_fmt_name(avctx->pix_fmt));
++#else
++ // FIXME we can't really get coded_height, coded_width and gop_size from Parameters
++ // At some point we should make an effort to get the real codec context; in the mean
++ // time, this should be close enough...
++ statistics.video_only.coded_height = avctx->height;
++ statistics.video_only.coded_width = avctx->width;
++ statistics.video_only.gop_size = 0;
++ statistics.video_only.pix_fmt = QLatin1String(av_get_pix_fmt_name(static_cast<AVPixelFormat>(avctx->format)));
++#endif
+ statistics.video_only.height = avctx->height;
+ statistics.video_only.width = avctx->width;
+ statistics.video_only.rotate = 0;
+@@ -359,7 +389,11 @@ bool AVPlayer::Private::setupAudioThread(AVPlayer *player)
+ athread->setDecoder(0);
+ athread->setOutput(0);
+ }
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = ademuxer->audioCodecContext();
++#else
++ AVCodecParameters *avctx = ademuxer->audioCodecContext();
++#endif
+ if (!avctx) {
+ // TODO: close ao? //TODO: check pulseaudio perapp control if closed
+ return false;
+@@ -389,7 +423,11 @@ bool AVPlayer::Private::setupAudioThread(AVPlayer *player)
+ correct_audio_channels(avctx);
+ AudioFormat af;
+ af.setSampleRate(avctx->sample_rate);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ af.setSampleFormatFFmpeg(avctx->sample_fmt);
++#else
++ af.setSampleFormatFFmpeg(avctx->format);
++#endif
+ af.setChannelLayoutFFmpeg(avctx->channel_layout);
+ if (!af.isValid()) {
+ qWarning("invalid audio format. audio stream will be disabled");
+@@ -471,7 +509,11 @@ QVariantList AVPlayer::Private::getTracksInfo(AVDemuxer *demuxer, AVDemuxer::Str
+ t[QStringLiteral("stream_index")] = QVariant(s);
+
+ AVStream *stream = demuxer->formatContext()->streams[s];
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *ctx = stream->codec;
++#else
++ AVCodecParameters *ctx = stream->codecpar;
++#endif
+ if (ctx) {
+ const AVCodecDescriptor* codec_desc = avcodec_descriptor_get(ctx->codec_id);
+ if (codec_desc)
+@@ -503,7 +545,11 @@ bool AVPlayer::Private::applySubtitleStream(int n, AVPlayer *player)
+ {
+ if (!demuxer.setStreamIndex(AVDemuxer::SubtitleStream, n))
+ return false;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *ctx = demuxer.subtitleCodecContext();
++#else
++ AVCodecParameters *ctx = demuxer.subtitleCodecContext();
++#endif
+ if (!ctx)
+ return false;
+ // FIXME: AVCodecDescriptor.name and AVCodec.name are different!
+@@ -523,7 +569,11 @@ bool AVPlayer::Private::tryApplyDecoderPriority(AVPlayer *player)
+ // TODO: add an option to apply the new decoder even if not available
+ qint64 pos = player->position();
+ VideoDecoder *vd = NULL;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = demuxer.videoCodecContext();
++#else
++ AVCodecParameters *avctx = demuxer.videoCodecContext();
++#endif
+ foreach(VideoDecoderId vid, vc_ids) {
+ qDebug("**********trying video decoder: %s...", VideoDecoder::name(vid));
+ vd = VideoDecoder::create(vid);
+@@ -571,7 +621,11 @@ bool AVPlayer::Private::setupVideoThread(AVPlayer *player)
+ vthread->packetQueue()->clear();
+ vthread->setDecoder(0);
+ }
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *avctx = demuxer.videoCodecContext();
++#else
++ AVCodecParameters *avctx = demuxer.videoCodecContext();
++#endif
+ if (!avctx) {
+ return false;
+ }
+diff --git a/src/AVPlayerPrivate.h b/src/AVPlayerPrivate.h
+index 77e45f06a..15f114490 100644
+--- a/src/AVPlayerPrivate.h
++++ b/src/AVPlayerPrivate.h
+@@ -29,6 +29,10 @@
+ #include "AVDemuxThread.h"
+ #include "utils/Logger.h"
+
++extern "C" {
++#include <libavcodec/avcodec.h>
++}
++
+ namespace QtAV {
+
+ static const qint64 kInvalidPosition = std::numeric_limits<qint64>::max();
+@@ -43,7 +47,11 @@ class AVPlayer::Private
+ void applyFrameRate();
+ void initStatistics();
+ void initBaseStatistics();
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ void initCommonStatistics(int s, Statistics::Common* st, AVCodecContext* avctx);
++#else
++ void initCommonStatistics(int s, Statistics::Common* st, AVCodecParameters* avctx);
++#endif
+ void initAudioStatistics(int s);
+ void initVideoStatistics(int s);
+ void initSubtitleStatistics(int s);
+diff --git a/src/AVThread.cpp b/src/AVThread.cpp
+index f8f6e89fb..7551ecba6 100644
+--- a/src/AVThread.cpp
++++ b/src/AVThread.cpp
+@@ -95,11 +95,11 @@ bool AVThread::installFilter(Filter *filter, int index, bool lock)
+ return true;
+ if (lock) {
+ QMutexLocker locker(&d.mutex);
+- if (p >= 0)
++ if (p >= 0 && p < d.filters.size())
+ d.filters.removeAt(p);
+ d.filters.insert(p, filter);
+ } else {
+- if (p >= 0)
++ if (p >= 0 && p < d.filters.size())
+ d.filters.removeAt(p);
+ d.filters.insert(p, filter);
+ }
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index 7781fd632..a0613862d 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -438,7 +438,10 @@ if(HAVE_OPENSL)
+ list(APPEND EXTRA_DEFS -DQTAV_HAVE_OPENSL=1)
+ list(APPEND EXTRA_LIBS OpenSLES)
+ endif()
+-check_library_exists(va vaInitialize "" HAVE_VAAPI)
++#check_library_exists(va vaInitialize "" HAVE_VAAPI)
++# FIXME does VAAPI still need special attention or does
++# ffmpeg 5.0 take care of it by itself?
++set(HAVE_VAAPI OFF)
+ if(HAVE_VAAPI)
+ list(APPEND SOURCES
+ vaapi/vaapi_helper.cpp
+@@ -449,7 +452,9 @@ if(HAVE_VAAPI)
+ list(APPEND EXTRA_LIBS va X11)
+ endif()
+
+-if(NOT APPLE)
++# FIXME at some point, this should be ported to ffmpeg 5.0
++# But for now... NaziVidia sucks anyway.
++if(NOT APPLE AND FALSE)
+ list(APPEND EXTRA_DEFS -DQTAV_HAVE_CUDA=1)
+ list(APPEND EXTRA_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/cuda)
+ list(APPEND SOURCES
+diff --git a/src/QtAV/AVDemuxer.h b/src/QtAV/AVDemuxer.h
+index 3b720f5d2..31da2d3cc 100644
+--- a/src/QtAV/AVDemuxer.h
++++ b/src/QtAV/AVDemuxer.h
+@@ -28,8 +28,13 @@
+ #include <QtCore/QObject>
+ #include <QtCore/QScopedPointer>
+
++extern "C" {
++#include <libavcodec/avcodec.h>
++}
++
+ struct AVFormatContext;
+ struct AVCodecContext;
++struct AVInputFormat;
+ QT_BEGIN_NAMESPACE
+ class QIODevice;
+ QT_END_NAMESPACE
+@@ -50,6 +55,7 @@ class Q_AV_EXPORT AVDemuxer : public QObject
+ static const QStringList& supportedExtensions();
+ /// Supported ffmpeg/libav input protocols(not complete). A static string list
+ static const QStringList& supportedProtocols();
++ static void registerCustomFormat(QString const & format, AVInputFormat & input_format);
+
+ AVDemuxer(QObject *parent = 0);
+ ~AVDemuxer();
+@@ -151,9 +157,15 @@ class Q_AV_EXPORT AVDemuxer : public QObject
+ int subtitleStream() const;
+ QList<int> subtitleStreams() const;
+ //codec. stream < 0: the stream going to play (or the stream set by setStreamIndex())
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext* audioCodecContext(int stream = -1) const;
+ AVCodecContext* videoCodecContext(int stream = -1) const;
+ AVCodecContext* subtitleCodecContext(int stream = -1) const;
++#else
++ AVCodecParameters* audioCodecContext(int stream = -1) const;
++ AVCodecParameters* videoCodecContext(int stream = -1) const;
++ AVCodecParameters* subtitleCodecContext(int stream = -1) const;
++#endif
+ /**
+ * @brief getInterruptTimeout return the interrupt timeout
+ */
+diff --git a/src/QtAV/private/AVDecoder_p.h b/src/QtAV/private/AVDecoder_p.h
+index 2382974e2..5e952ea84 100644
+--- a/src/QtAV/private/AVDecoder_p.h
++++ b/src/QtAV/private/AVDecoder_p.h
+@@ -78,7 +78,7 @@ class Q_AV_PRIVATE_EXPORT AVDecoderPrivate : public DPtrPrivate<AVDecoder>
+ {
+ public:
+ static const char* getProfileName(AVCodecID id, int profile) {
+- AVCodec *c = avcodec_find_decoder(id);
++ const AVCodec *c = avcodec_find_decoder(id);
+ if (!c)
+ return "Unknow";
+ return av_get_profile_name(c, profile);
+diff --git a/src/VideoFormat.cpp b/src/VideoFormat.cpp
+index b9c7b4f0a..5e7901f1d 100644
+--- a/src/VideoFormat.cpp
++++ b/src/VideoFormat.cpp
+@@ -702,7 +702,11 @@ bool VideoFormat::hasPalette() const
+
+ bool VideoFormat::isPseudoPaletted() const
+ {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ return (d->flags() & AV_PIX_FMT_FLAG_PSEUDOPAL) == AV_PIX_FMT_FLAG_PSEUDOPAL;
++#else
++ return hasPalette();
++#endif
+ }
+
+ bool VideoFormat::isBitStream() const
+diff --git a/src/VideoFrameExtractor.cpp b/src/VideoFrameExtractor.cpp
+index 60a1540f3..086d3fee9 100644
+--- a/src/VideoFrameExtractor.cpp
++++ b/src/VideoFrameExtractor.cpp
+@@ -192,7 +192,11 @@ class VideoFrameExtractorPrivate : public DPtrPrivate<VideoFrameExtractor>
+ if (!vd)
+ continue;
+ decoder.reset(vd);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *cctx = demuxer.videoCodecContext();
++#else
++ AVCodecParameters *cctx = demuxer.videoCodecContext();
++#endif
+ if (cctx) decoder->setCodecContext(demuxer.videoCodecContext());
+ if (!cctx || !decoder->open()) {
+ decoder.reset(0);
+diff --git a/src/codec/AVDecoder.cpp b/src/codec/AVDecoder.cpp
+index 440504d01..bc9cc278a 100644
+--- a/src/codec/AVDecoder.cpp
++++ b/src/codec/AVDecoder.cpp
+@@ -27,7 +27,7 @@
+
+ namespace QtAV {
+
+-static AVCodec* get_codec(const QString &name, const QString& hwa, AVCodecID cid)
++static const AVCodec* get_codec(const QString &name, const QString& hwa, AVCodecID cid)
+ {
+ QString fullname(name);
+ if (name.isEmpty()) {
+@@ -35,7 +35,7 @@ static AVCodec* get_codec(const QString &name, const QString& hwa, AVCodecID cid
+ return avcodec_find_decoder(cid);
+ fullname = QString("%1_%2").arg(avcodec_get_name(cid)).arg(hwa);
+ }
+- AVCodec *codec = avcodec_find_decoder_by_name(fullname.toUtf8().constData());
++ const AVCodec *codec = avcodec_find_decoder_by_name(fullname.toUtf8().constData());
+ if (codec)
+ return codec;
+ const AVCodecDescriptor* cd = avcodec_descriptor_get_by_name(fullname.toUtf8().constData());
+@@ -76,7 +76,7 @@ bool AVDecoder::open()
+ return false;
+ }
+ const QString hwa = property("hwaccel").toString();
+- AVCodec* codec = get_codec(codecName(), hwa, d.codec_ctx->codec_id);
++ const AVCodec* codec = get_codec(codecName(), hwa, d.codec_ctx->codec_id);
+ if (!codec) { // TODO: can be null for none-ffmpeg based decoders
+ QString es(tr("No codec could be found for '%1'"));
+ if (d.codec_name.isEmpty()) {
+@@ -153,6 +153,8 @@ void AVDecoder::flush()
+ avcodec_flush_buffers(d_func().codec_ctx);
+ }
+
++static QMap<AVCodecParameters*,AVCodecContext*> ccs;
++
+ /*
+ * do nothing if equal
+ * close the old one. the codec context can not be shared in more than 1 decoder.
+@@ -160,9 +162,17 @@ void AVDecoder::flush()
+ void AVDecoder::setCodecContext(void *codecCtx)
+ {
+ DPTR_D(AVDecoder);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AVCodecContext *ctx = (AVCodecContext*)codecCtx;
+- if (d.codec_ctx == ctx)
++ if (d.codec_ctx == codecCtx)
+ return;
++#else
++ AVCodecParameters *ctx = (AVCodecParameters*)codecCtx;
++ if(ccs.contains(ctx)) {
++ d.codec_ctx = ccs.value(ctx);
++ return;
++ }
++#endif
+ if (isOpen()) {
+ qWarning("Can not copy codec properties when it's open");
+ close(); //
+@@ -180,7 +190,12 @@ void AVDecoder::setCodecContext(void *codecCtx)
+ qWarning("avcodec_alloc_context3 failed");
+ return;
+ }
++ ccs.insert(ctx, d.codec_ctx);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AV_ENSURE_OK(avcodec_copy_context(d.codec_ctx, ctx));
++#else
++ AV_ENSURE_OK(avcodec_parameters_to_context(d.codec_ctx, ctx));
++#endif
+ }
+
+ //TODO: reset other parameters?
+diff --git a/src/codec/AVEncoder.cpp b/src/codec/AVEncoder.cpp
+index 455539c78..5be64db2b 100644
+--- a/src/codec/AVEncoder.cpp
++++ b/src/codec/AVEncoder.cpp
+@@ -146,7 +146,13 @@ void AVEncoder::copyAVCodecContext(void* ctx)
+ AVCodecContext* c = static_cast<AVCodecContext*>(ctx);
+ if (d.avctx) {
+ // dest should be avcodec_alloc_context3(NULL)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ AV_ENSURE_OK(avcodec_copy_context(d.avctx, c));
++#else
++ AVCodecParameters *par;
++ avcodec_parameters_from_context(par, c);
++ AV_ENSURE_OK(avcodec_parameters_to_context(d.avctx, par));
++#endif
+ d.is_open = false;
+ return;
+ }
+diff --git a/src/codec/audio/AudioDecoderFFmpeg.cpp b/src/codec/audio/AudioDecoderFFmpeg.cpp
+index d783588ae..3b8492236 100644
+--- a/src/codec/audio/AudioDecoderFFmpeg.cpp
++++ b/src/codec/audio/AudioDecoderFFmpeg.cpp
+@@ -100,10 +100,36 @@ bool AudioDecoderFFmpeg::decode(const Packet &packet)
+ av_init_packet(&eofpkt);
+ eofpkt.data = NULL;
+ eofpkt.size = 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ret = avcodec_decode_audio4(d.codec_ctx, d.frame, &got_frame_ptr, &eofpkt);
++#else
++ ret = avcodec_receive_frame(d.codec_ctx, d.frame);
++ if (ret == AVERROR(EAGAIN))
++ return false;
++ else if (ret < 0) {
++ qWarning("[AudioDecoder] %s", av_err2str(ret));
++ return false;
++ }
++ got_frame_ptr = (ret == 0);
++ ret = avcodec_send_packet(d.codec_ctx, &eofpkt);
++#endif
+ } else {
+ // const AVPacket*: ffmpeg >= 1.0. no libav
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ret = avcodec_decode_audio4(d.codec_ctx, d.frame, &got_frame_ptr, (AVPacket*)packet.asAVPacket());
++#else
++ ret = avcodec_receive_frame(d.codec_ctx, d.frame);
++ if (ret == AVERROR(EAGAIN))
++ ;
++ else if (ret < 0) {
++ qWarning("[AudioDecoder] %s", av_err2str(ret));
++ return false;
++ }
++ got_frame_ptr = (ret == 0);
++ ret = avcodec_send_packet(d.codec_ctx, (AVPacket*)packet.asAVPacket());
++ if (ret == 0)
++ ret = packet.data.size();
++#endif
+ }
+ d.undecoded_size = qMin(packet.data.size() - ret, packet.data.size());
+ if (ret == AVERROR(EAGAIN)) {
+@@ -145,7 +171,11 @@ AudioFrame AudioDecoderFFmpeg::frame()
+ f.setBytesPerLine(d.frame->linesize[0], 0); // for correct alignment
+ f.setSamplesPerChannel(d.frame->nb_samples);
+ // TODO: ffplay check AVFrame.pts, pkt_pts, last_pts+nb_samples. move to AudioFrame::from(AVFrame*)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ f.setTimestamp((double)d.frame->pkt_pts/1000.0);
++#else
++ f.setTimestamp((double)d.frame->pts/1000.0);
++#endif
+ f.setAudioResampler(d.resampler); // TODO: remove. it's not safe if frame is shared. use a pool or detach if ref >1
+ return f;
+ }
+diff --git a/src/codec/audio/AudioEncoderFFmpeg.cpp b/src/codec/audio/AudioEncoderFFmpeg.cpp
+index 3811e11a6..c338aae33 100644
+--- a/src/codec/audio/AudioEncoderFFmpeg.cpp
++++ b/src/codec/audio/AudioEncoderFFmpeg.cpp
+@@ -54,7 +54,9 @@ class AudioEncoderFFmpegPrivate Q_DECL_FINAL: public AudioEncoderPrivate
+ AudioEncoderFFmpegPrivate()
+ : AudioEncoderPrivate()
+ {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ avcodec_register_all();
++#endif
+ // NULL: codec-specific defaults won't be initialized, which may result in suboptimal default settings (this is important mainly for encoders, e.g. libx264).
+ avctx = avcodec_alloc_context3(NULL);
+ }
+@@ -68,11 +70,11 @@ bool AudioEncoderFFmpegPrivate::open()
+ {
+ if (codec_name.isEmpty()) {
+ // copy ctx from muxer by copyAVCodecContext
+- AVCodec *codec = avcodec_find_encoder(avctx->codec_id);
++ const AVCodec *codec = avcodec_find_encoder(avctx->codec_id);
+ AV_ENSURE_OK(avcodec_open2(avctx, codec, &dict), false);
+ return true;
+ }
+- AVCodec *codec = avcodec_find_encoder_by_name(codec_name.toUtf8().constData());
++ const AVCodec *codec = avcodec_find_encoder_by_name(codec_name.toUtf8().constData());
+ if (!codec) {
+ const AVCodecDescriptor* cd = avcodec_descriptor_get_by_name(codec_name.toUtf8().constData());
+ if (cd) {
+@@ -204,7 +206,13 @@ bool AudioEncoderFFmpeg::encode(const AudioFrame &frame)
+ pkt.data = (uint8_t*)d.buffer.constData(); //NULL
+ pkt.size = d.buffer.size(); //0
+ int got_packet = 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ int ret = avcodec_encode_audio2(d.avctx, &pkt, f, &got_packet);
++#else
++ int ret = avcodec_send_frame(d.avctx, f);
++ got_packet = (ret == 0);
++ ret = avcodec_receive_packet(d.avctx, &pkt);
++#endif
+ av_frame_free(&f);
+ if (ret < 0) {
+ //qWarning("error avcodec_encode_audio2: %s" ,av_err2str(ret));
+diff --git a/src/codec/video/VideoDecoderD3D11.cpp b/src/codec/video/VideoDecoderD3D11.cpp
+index 6c416fd36..628f79846 100644
+--- a/src/codec/video/VideoDecoderD3D11.cpp
++++ b/src/codec/video/VideoDecoderD3D11.cpp
+@@ -187,7 +187,7 @@ VideoFrame VideoDecoderD3D11::frame()
+ f.setBytesPerLine(fmt.bytesPerLine(d.width, i), i); //used by gl to compute texture size
+ }
+ f.setMetaData(QStringLiteral("surface_interop"), QVariant::fromValue(VideoSurfaceInteropPtr(interop)));
+- f.setTimestamp(d.frame->pkt_pts/1000.0);
++ f.setTimestamp(d.frame->pts/1000.0);
+ f.setDisplayAspectRatio(d.getDAR(d.frame));
+ return f;
+ }
+diff --git a/src/codec/video/VideoDecoderDXVA.cpp b/src/codec/video/VideoDecoderDXVA.cpp
+index 64b12f33d..48e3cef26 100644
+--- a/src/codec/video/VideoDecoderDXVA.cpp
++++ b/src/codec/video/VideoDecoderDXVA.cpp
+@@ -189,7 +189,7 @@ VideoFrame VideoDecoderDXVA::frame()
+ VideoFrame f(d.width, d.height, VideoFormat::Format_RGB32);
+ f.setBytesPerLine(d.width * 4); //used by gl to compute texture size
+ f.setMetaData(QStringLiteral("surface_interop"), QVariant::fromValue(VideoSurfaceInteropPtr(interop)));
+- f.setTimestamp(d.frame->pkt_pts/1000.0);
++ f.setTimestamp(d.frame->pts/1000.0);
+ f.setDisplayAspectRatio(d.getDAR(d.frame));
+ return f;
+ }
+diff --git a/src/codec/video/VideoDecoderFFmpegBase.cpp b/src/codec/video/VideoDecoderFFmpegBase.cpp
+index e344c5cbc..bc7cc41de 100644
+--- a/src/codec/video/VideoDecoderFFmpegBase.cpp
++++ b/src/codec/video/VideoDecoderFFmpegBase.cpp
+@@ -30,12 +30,21 @@ extern ColorRange colorRangeFromFFmpeg(AVColorRange cr);
+
+ static void SetColorDetailsByFFmpeg(VideoFrame *f, AVFrame* frame, AVCodecContext* codec_ctx)
+ {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ColorSpace cs = colorSpaceFromFFmpeg(av_frame_get_colorspace(frame));
+ if (cs == ColorSpace_Unknown)
++#else
++ ColorSpace
++#endif
+ cs = colorSpaceFromFFmpeg(codec_ctx->colorspace);
+ f->setColorSpace(cs);
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ColorRange cr = colorRangeFromFFmpeg(av_frame_get_color_range(frame));
+ if (cr == ColorRange_Unknown) {
++#else
++ ColorRange cr;
++ if (1) {
++#endif
+ // check yuvj format. TODO: deprecated, check only for old ffmpeg?
+ const AVPixelFormat pixfmt = (AVPixelFormat)frame->format;
+ switch (pixfmt) {
+@@ -125,14 +134,28 @@ bool VideoDecoderFFmpegBase::decode(const Packet &packet)
+ av_init_packet(&eofpkt);
+ eofpkt.data = NULL;
+ eofpkt.size = 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, &eofpkt);
++#else
++ ret = avcodec_receive_frame(d.codec_ctx, d.frame);
++ got_frame_ptr = (ret == 0);
++ ret = avcodec_send_packet(d.codec_ctx, &eofpkt);
++#endif
+ } else {
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, (AVPacket*)packet.asAVPacket());
++#else
++ ret = avcodec_receive_frame(d.codec_ctx, d.frame);
++ got_frame_ptr = (ret == 0);
++ ret = avcodec_send_packet(d.codec_ctx, (AVPacket*)packet.asAVPacket());
++ if (ret == 0)
++ ret = packet.data.size();
++#endif
+ }
+ //qDebug("pic_type=%c", av_get_picture_type_char(d.frame->pict_type));
+ d.undecoded_size = qMin(packet.data.size() - ret, packet.data.size());
+ if (ret < 0) {
+- //qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));
++ qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));
+ return false;
+ }
+ if (!got_frame_ptr) {
+@@ -159,7 +182,11 @@ VideoFrame VideoDecoderFFmpegBase::frame()
+ frame.setBits(d.frame->data);
+ frame.setBytesPerLine(d.frame->linesize);
+ // in s. TODO: what about AVFrame.pts? av_frame_get_best_effort_timestamp? move to VideoFrame::from(AVFrame*)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ frame.setTimestamp((double)d.frame->pkt_pts/1000.0);
++#else
++ frame.setTimestamp((double)d.frame->pts/1000.0);
++#endif
+ frame.setMetaData(QStringLiteral("avbuf"), QVariant::fromValue(AVFrameBuffersRef(new AVFrameBuffers(d.frame))));
+ d.updateColorDetails(&frame);
+ if (frame.format().hasPalette()) {
+diff --git a/src/codec/video/VideoDecoderFFmpegHW.cpp b/src/codec/video/VideoDecoderFFmpegHW.cpp
+index c17c8b28b..17d663e6b 100644
+--- a/src/codec/video/VideoDecoderFFmpegHW.cpp
++++ b/src/codec/video/VideoDecoderFFmpegHW.cpp
+@@ -328,7 +328,11 @@ VideoFrame VideoDecoderFFmpegHW::copyToFrame(const VideoFormat& fmt, int surface
+ // TODO: buffer pool and create VideoFrame when needed to avoid copy? also for other va
+ frame = frame.clone();
+ }
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ frame.setTimestamp(double(d.frame->pkt_pts)/1000.0);
++#else
++ frame.setTimestamp(double(d.frame->pts)/1000.0);
++#endif
+ frame.setDisplayAspectRatio(d.getDAR(d.frame));
+ d.updateColorDetails(&frame);
+ return frame;
+diff --git a/src/codec/video/VideoDecoderVAAPI.cpp b/src/codec/video/VideoDecoderVAAPI.cpp
+index a91caf92d..0c8ce0162 100644
+--- a/src/codec/video/VideoDecoderVAAPI.cpp
++++ b/src/codec/video/VideoDecoderVAAPI.cpp
+@@ -27,9 +27,11 @@
+ #include <QtCore/QMetaEnum>
+ #include <QtCore/QStringList>
+ #include <QtCore/QThread>
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ extern "C" {
+ #include <libavcodec/vaapi.h>
+ }
++#endif
+ #include "QtAV/private/AVCompat.h"
+ #include "QtAV/private/factory.h"
+ #include "vaapi/SurfaceInteropVAAPI.h"
+@@ -84,7 +86,7 @@ FACTORY_REGISTER(VideoDecoder, VAAPI, "VAAPI")
+
+ const char* getProfileName(AVCodecID id, int profile)
+ {
+- AVCodec *c = avcodec_find_decoder(id);
++ const AVCodec *c = avcodec_find_decoder(id);
+ if (!c)
+ return "Unknow";
+ return av_get_profile_name(c, profile);
+diff --git a/src/codec/video/VideoDecoderVideoToolbox.cpp b/src/codec/video/VideoDecoderVideoToolbox.cpp
+index bdf4fdc4e..75e5288f8 100755
+--- a/src/codec/video/VideoDecoderVideoToolbox.cpp
++++ b/src/codec/video/VideoDecoderVideoToolbox.cpp
+@@ -219,7 +219,7 @@ VideoFrame VideoDecoderVideoToolbox::frame()
+ f = VideoFrame(d.width, d.height, fmt);
+ f.setBytesPerLine(pitch);
+ // TODO: move to updateFrameInfo
+- f.setTimestamp(double(d.frame->pkt_pts)/1000.0);
++ f.setTimestamp(double(d.frame->pts)/1000.0);
+ f.setDisplayAspectRatio(d.getDAR(d.frame));
+ d.updateColorDetails(&f);
+ if (d.interop_res) { // zero_copy
+diff --git a/src/codec/video/VideoEncoderFFmpeg.cpp b/src/codec/video/VideoEncoderFFmpeg.cpp
+index c0c902cb0..a352c533c 100644
+--- a/src/codec/video/VideoEncoderFFmpeg.cpp
++++ b/src/codec/video/VideoEncoderFFmpeg.cpp
+@@ -116,11 +116,11 @@ bool VideoEncoderFFmpegPrivate::open()
+ nb_encoded = 0LL;
+ if (codec_name.isEmpty()) {
+ // copy ctx from muxer by copyAVCodecContext
+- AVCodec *codec = avcodec_find_encoder(avctx->codec_id);
++ const AVCodec *codec = avcodec_find_encoder(avctx->codec_id);
+ AV_ENSURE_OK(avcodec_open2(avctx, codec, &dict), false);
+ return true;
+ }
+- AVCodec *codec = avcodec_find_encoder_by_name(codec_name.toUtf8().constData());
++ const AVCodec *codec = avcodec_find_encoder_by_name(codec_name.toUtf8().constData());
+ if (!codec) {
+ const AVCodecDescriptor* cd = avcodec_descriptor_get_by_name(codec_name.toUtf8().constData());
+ if (cd) {
+@@ -247,7 +247,7 @@ bool VideoEncoderFFmpegPrivate::open()
+ applyOptionsForContext();
+ AV_ENSURE_OK(avcodec_open2(avctx, codec, &dict), false);
+ // from mpv ao_lavc
+- const int buffer_size = qMax<int>(qMax<int>(width*height*6+200, AV_INPUT_BUFFER_MIN_SIZE), sizeof(AVPicture));//??
++ const int buffer_size = qMax<int>(qMax<int>(width*height*6+200, AV_INPUT_BUFFER_MIN_SIZE), av_image_get_buffer_size(avctx->pix_fmt, avctx->width, avctx->height, 1));//??
+ buffer.resize(buffer_size);
+ return true;
+ }
+@@ -373,7 +373,13 @@ bool VideoEncoderFFmpeg::encode(const VideoFrame &frame)
+ pkt.data = (uint8_t*)d.buffer.constData();
+ pkt.size = d.buffer.size();
+ int got_packet = 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ int ret = avcodec_encode_video2(d.avctx, &pkt, f.data(), &got_packet);
++#else
++ int ret = avcodec_send_frame(d.avctx, f.data());
++ got_packet = (ret == 0);
++ ret = avcodec_receive_packet(d.avctx, &pkt);
++#endif
+ if (ret < 0) {
+ qWarning("error avcodec_encode_video2: %s" ,av_err2str(ret));
+ return false; //false
+diff --git a/src/compat/msvc/changelog.txt b/src/compat/msvc/changelog.txt
+deleted file mode 100644
+index e13b87e5c..000000000
+--- a/src/compat/msvc/changelog.txt
++++ /dev/null
+@@ -1,138 +0,0 @@
+-------------------------------------------------------------------------
+-r26 | 2009-10-02 13:36:47 +0400 | 2 lines
+-
+-[Issue 5] Change <stdint.h> to "stdint.h" to let compiler search for it in local directory.
+-
+-------------------------------------------------------------------------
+-r25 | 2009-09-17 23:46:49 +0400 | 2 lines
+-
+-[Issue 4] Fix incorrect int8_t behaviour if compiled with /J flag.
+-
+-------------------------------------------------------------------------
+-r24 | 2009-05-13 14:53:48 +0400 | 2 lines
+-
+-Forgot about #ifdef __cplusplus guard around 'extern "C"', so inclusion to C files has been broken.
+-
+-------------------------------------------------------------------------
+-r23 | 2009-05-12 01:27:45 +0400 | 3 lines
+-
+-[Issue 2] Always wrap <wchar��� with external "C" {}.
+-It turns out that not only Visual Studio 6 requires this, but also newer versions when compiling for ARM.
+-
+-------------------------------------------------------------------------
+-r22 | 2009-05-11 22:22:15 +0400 | 3 lines
+-
+-[Issue 3] Visual Studio 6 and Embedded Visual C++ 4 doesn't realize that, e.g. char has the same size as __int8 so we give up on __intX for them.
+-his should close Issue 3 in issue tracker.
+-
+-------------------------------------------------------------------------
+-r21 | 2008-07-17 09:47:22 +0400 | 4 lines
+-
+-Get rid of these compiler warnings when compiling for 32-bit:
+- warning C4311: 'type cast' : pointer truncation from 'void *' to 'uintptr_t'
+- warning C4312: 'type cast' : conversion from 'uintptr_t' to 'const void *' of greater size
+-
+-------------------------------------------------------------------------
+-r20 | 2007-10-09 16:54:27 +0400 | 2 lines
+-
+-Better C99 conformance: macros for format specifiers should only be included in C++ implementations if __STDC_FORMAT_MACROS is defined before <inttypes.h> is included.
+-
+-------------------------------------------------------------------------
+-r19 | 2007-07-04 02:14:40 +0400 | 3 lines
+-
+-Explicitly cast to appropriate type INT8_MIN, INT16_MIN, INT32_MIN and INT64_MIN constants.
+-Due to their unusual definition in Visual Studio headers (-_Ix_MAX-1) they are propagated to int and thus do not have expected type, causing VS6 strict compiler to claim about type inconsistency.
+-
+-------------------------------------------------------------------------
+-r18 | 2007-06-26 16:53:23 +0400 | 2 lines
+-
+-Better handling of (U)INTx_C macros - now they generate constants of exact width.
+-
+-------------------------------------------------------------------------
+-r17 | 2007-03-29 20:16:14 +0400 | 2 lines
+-
+-Fix typo: Miscrosoft -> Microsoft.
+-
+-------------------------------------------------------------------------
+-r16 | 2007-02-24 17:32:58 +0300 | 4 lines
+-
+-Remove <BaseTsd.h> include, as it is not present in Visual Studio 2005 Epxress Edition and required only for INT_PTR and UINT_PTR types.
+-
+-'intptr_t' and 'uintptr_t' types now defined explicitly with #ifdef _WIN64.
+-
+-------------------------------------------------------------------------
+-r15 | 2007-02-11 20:53:05 +0300 | 2 lines
+-
+-More correct fix for compilation under VS6.
+-
+-------------------------------------------------------------------------
+-r14 | 2007-02-11 20:04:32 +0300 | 2 lines
+-
+-Bugfix: fix compiling under VS6, when stdint.h enclosed in 'extern "C" {}'.
+-
+-------------------------------------------------------------------------
+-r13 | 2006-12-13 16:53:11 +0300 | 2 lines
+-
+-Make _inline modifier for imaxdiv default option. Use STATIC_IMAXDIV to make it static.
+-
+-------------------------------------------------------------------------
+-r12 | 2006-12-13 16:42:24 +0300 | 2 lines
+-
+-Error message changed: VC6 supported from now.
+-
+-------------------------------------------------------------------------
+-r11 | 2006-12-13 16:39:33 +0300 | 2 lines
+-
+-All (U)INT* types changed to (unsigned) __int*. This should make stdint.h compatible with VC6.
+-
+-------------------------------------------------------------------------
+-r10 | 2006-12-13 16:20:57 +0300 | 3 lines
+-
+-Added INLINE_IMAXDIV define switch.
+-If INLINE_IMAXDIV is defined imaxdiv() have static modifier. If not - it is _inline.
+-
+-------------------------------------------------------------------------
+-r9 | 2006-12-13 15:53:52 +0300 | 2 lines
+-
+-Error message for non-MSC compiler changed.
+-
+-------------------------------------------------------------------------
+-r8 | 2006-12-13 12:47:48 +0300 | 2 lines
+-
+-Added #ifndef for SIZE_MAX (it is defined in limits.h on MSVSC 8).
+-
+-------------------------------------------------------------------------
+-r7 | 2006-12-13 01:08:02 +0300 | 2 lines
+-
+-License chaged to BSD-derivative.
+-
+-------------------------------------------------------------------------
+-r6 | 2006-12-13 00:53:20 +0300 | 2 lines
+-
+-Added <wchar.h> include to avoid warnings when it is included after stdint.h.
+-
+-------------------------------------------------------------------------
+-r5 | 2006-12-12 00:58:05 +0300 | 2 lines
+-
+-BUGFIX: Definitions of INTPTR_MIN, INTPTR_MAX and UINTPTR_MAX for WIN32 and WIN64 was mixed up.
+-
+-------------------------------------------------------------------------
+-r4 | 2006-12-12 00:51:55 +0300 | 2 lines
+-
+-Rise #error if _MSC_VER is not defined. I.e. compiler other then Microsoft Visual C++ is used.
+-
+-------------------------------------------------------------------------
+-r3 | 2006-12-11 22:54:14 +0300 | 2 lines
+-
+-Added <limits.h> include to stdint.h.
+-
+-------------------------------------------------------------------------
+-r2 | 2006-12-11 21:39:27 +0300 | 2 lines
+-
+-Initial check in.
+-
+-------------------------------------------------------------------------
+-r1 | 2006-12-11 21:30:23 +0300 | 1 line
+-
+-Initial directory structure.
+-------------------------------------------------------------------------
+diff --git a/src/compat/msvc/inttypes.h b/src/compat/msvc/inttypes.h
+deleted file mode 100644
+index 4b3828a21..000000000
+--- a/src/compat/msvc/inttypes.h
++++ /dev/null
+@@ -1,305 +0,0 @@
+-// ISO C9x compliant inttypes.h for Microsoft Visual Studio
+-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
+-//
+-// Copyright (c) 2006 Alexander Chemeris
+-//
+-// Redistribution and use in source and binary forms, with or without
+-// modification, are permitted provided that the following conditions are met:
+-//
+-// 1. Redistributions of source code must retain the above copyright notice,
+-// this list of conditions and the following disclaimer.
+-//
+-// 2. Redistributions in binary form must reproduce the above copyright
+-// notice, this list of conditions and the following disclaimer in the
+-// documentation and/or other materials provided with the distribution.
+-//
+-// 3. The name of the author may be used to endorse or promote products
+-// derived from this software without specific prior written permission.
+-//
+-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-//
+-///////////////////////////////////////////////////////////////////////////////
+-
+-#ifndef _MSC_VER // [
+-#error "Use this header only with Microsoft Visual C++ compilers!"
+-#endif // _MSC_VER ]
+-
+-#ifndef _MSC_INTTYPES_H_ // [
+-#define _MSC_INTTYPES_H_
+-
+-#if _MSC_VER > 1000
+-#pragma once
+-#endif
+-
+-#include "stdint.h"
+-
+-// 7.8 Format conversion of integer types
+-
+-typedef struct {
+- intmax_t quot;
+- intmax_t rem;
+-} imaxdiv_t;
+-
+-// 7.8.1 Macros for format specifiers
+-
+-#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198
+-
+-// The fprintf macros for signed integers are:
+-#define PRId8 "d"
+-#define PRIi8 "i"
+-#define PRIdLEAST8 "d"
+-#define PRIiLEAST8 "i"
+-#define PRIdFAST8 "d"
+-#define PRIiFAST8 "i"
+-
+-#define PRId16 "hd"
+-#define PRIi16 "hi"
+-#define PRIdLEAST16 "hd"
+-#define PRIiLEAST16 "hi"
+-#define PRIdFAST16 "hd"
+-#define PRIiFAST16 "hi"
+-
+-#define PRId32 "I32d"
+-#define PRIi32 "I32i"
+-#define PRIdLEAST32 "I32d"
+-#define PRIiLEAST32 "I32i"
+-#define PRIdFAST32 "I32d"
+-#define PRIiFAST32 "I32i"
+-
+-#define PRId64 "I64d"
+-#define PRIi64 "I64i"
+-#define PRIdLEAST64 "I64d"
+-#define PRIiLEAST64 "I64i"
+-#define PRIdFAST64 "I64d"
+-#define PRIiFAST64 "I64i"
+-
+-#define PRIdMAX "I64d"
+-#define PRIiMAX "I64i"
+-
+-#define PRIdPTR "Id"
+-#define PRIiPTR "Ii"
+-
+-// The fprintf macros for unsigned integers are:
+-#define PRIo8 "o"
+-#define PRIu8 "u"
+-#define PRIx8 "x"
+-#define PRIX8 "X"
+-#define PRIoLEAST8 "o"
+-#define PRIuLEAST8 "u"
+-#define PRIxLEAST8 "x"
+-#define PRIXLEAST8 "X"
+-#define PRIoFAST8 "o"
+-#define PRIuFAST8 "u"
+-#define PRIxFAST8 "x"
+-#define PRIXFAST8 "X"
+-
+-#define PRIo16 "ho"
+-#define PRIu16 "hu"
+-#define PRIx16 "hx"
+-#define PRIX16 "hX"
+-#define PRIoLEAST16 "ho"
+-#define PRIuLEAST16 "hu"
+-#define PRIxLEAST16 "hx"
+-#define PRIXLEAST16 "hX"
+-#define PRIoFAST16 "ho"
+-#define PRIuFAST16 "hu"
+-#define PRIxFAST16 "hx"
+-#define PRIXFAST16 "hX"
+-
+-#define PRIo32 "I32o"
+-#define PRIu32 "I32u"
+-#define PRIx32 "I32x"
+-#define PRIX32 "I32X"
+-#define PRIoLEAST32 "I32o"
+-#define PRIuLEAST32 "I32u"
+-#define PRIxLEAST32 "I32x"
+-#define PRIXLEAST32 "I32X"
+-#define PRIoFAST32 "I32o"
+-#define PRIuFAST32 "I32u"
+-#define PRIxFAST32 "I32x"
+-#define PRIXFAST32 "I32X"
+-
+-#define PRIo64 "I64o"
+-#define PRIu64 "I64u"
+-#define PRIx64 "I64x"
+-#define PRIX64 "I64X"
+-#define PRIoLEAST64 "I64o"
+-#define PRIuLEAST64 "I64u"
+-#define PRIxLEAST64 "I64x"
+-#define PRIXLEAST64 "I64X"
+-#define PRIoFAST64 "I64o"
+-#define PRIuFAST64 "I64u"
+-#define PRIxFAST64 "I64x"
+-#define PRIXFAST64 "I64X"
+-
+-#define PRIoMAX "I64o"
+-#define PRIuMAX "I64u"
+-#define PRIxMAX "I64x"
+-#define PRIXMAX "I64X"
+-
+-#define PRIoPTR "Io"
+-#define PRIuPTR "Iu"
+-#define PRIxPTR "Ix"
+-#define PRIXPTR "IX"
+-
+-// The fscanf macros for signed integers are:
+-#define SCNd8 "d"
+-#define SCNi8 "i"
+-#define SCNdLEAST8 "d"
+-#define SCNiLEAST8 "i"
+-#define SCNdFAST8 "d"
+-#define SCNiFAST8 "i"
+-
+-#define SCNd16 "hd"
+-#define SCNi16 "hi"
+-#define SCNdLEAST16 "hd"
+-#define SCNiLEAST16 "hi"
+-#define SCNdFAST16 "hd"
+-#define SCNiFAST16 "hi"
+-
+-#define SCNd32 "ld"
+-#define SCNi32 "li"
+-#define SCNdLEAST32 "ld"
+-#define SCNiLEAST32 "li"
+-#define SCNdFAST32 "ld"
+-#define SCNiFAST32 "li"
+-
+-#define SCNd64 "I64d"
+-#define SCNi64 "I64i"
+-#define SCNdLEAST64 "I64d"
+-#define SCNiLEAST64 "I64i"
+-#define SCNdFAST64 "I64d"
+-#define SCNiFAST64 "I64i"
+-
+-#define SCNdMAX "I64d"
+-#define SCNiMAX "I64i"
+-
+-#ifdef _WIN64 // [
+-# define SCNdPTR "I64d"
+-# define SCNiPTR "I64i"
+-#else // _WIN64 ][
+-# define SCNdPTR "ld"
+-# define SCNiPTR "li"
+-#endif // _WIN64 ]
+-
+-// The fscanf macros for unsigned integers are:
+-#define SCNo8 "o"
+-#define SCNu8 "u"
+-#define SCNx8 "x"
+-#define SCNX8 "X"
+-#define SCNoLEAST8 "o"
+-#define SCNuLEAST8 "u"
+-#define SCNxLEAST8 "x"
+-#define SCNXLEAST8 "X"
+-#define SCNoFAST8 "o"
+-#define SCNuFAST8 "u"
+-#define SCNxFAST8 "x"
+-#define SCNXFAST8 "X"
+-
+-#define SCNo16 "ho"
+-#define SCNu16 "hu"
+-#define SCNx16 "hx"
+-#define SCNX16 "hX"
+-#define SCNoLEAST16 "ho"
+-#define SCNuLEAST16 "hu"
+-#define SCNxLEAST16 "hx"
+-#define SCNXLEAST16 "hX"
+-#define SCNoFAST16 "ho"
+-#define SCNuFAST16 "hu"
+-#define SCNxFAST16 "hx"
+-#define SCNXFAST16 "hX"
+-
+-#define SCNo32 "lo"
+-#define SCNu32 "lu"
+-#define SCNx32 "lx"
+-#define SCNX32 "lX"
+-#define SCNoLEAST32 "lo"
+-#define SCNuLEAST32 "lu"
+-#define SCNxLEAST32 "lx"
+-#define SCNXLEAST32 "lX"
+-#define SCNoFAST32 "lo"
+-#define SCNuFAST32 "lu"
+-#define SCNxFAST32 "lx"
+-#define SCNXFAST32 "lX"
+-
+-#define SCNo64 "I64o"
+-#define SCNu64 "I64u"
+-#define SCNx64 "I64x"
+-#define SCNX64 "I64X"
+-#define SCNoLEAST64 "I64o"
+-#define SCNuLEAST64 "I64u"
+-#define SCNxLEAST64 "I64x"
+-#define SCNXLEAST64 "I64X"
+-#define SCNoFAST64 "I64o"
+-#define SCNuFAST64 "I64u"
+-#define SCNxFAST64 "I64x"
+-#define SCNXFAST64 "I64X"
+-
+-#define SCNoMAX "I64o"
+-#define SCNuMAX "I64u"
+-#define SCNxMAX "I64x"
+-#define SCNXMAX "I64X"
+-
+-#ifdef _WIN64 // [
+-# define SCNoPTR "I64o"
+-# define SCNuPTR "I64u"
+-# define SCNxPTR "I64x"
+-# define SCNXPTR "I64X"
+-#else // _WIN64 ][
+-# define SCNoPTR "lo"
+-# define SCNuPTR "lu"
+-# define SCNxPTR "lx"
+-# define SCNXPTR "lX"
+-#endif // _WIN64 ]
+-
+-#endif // __STDC_FORMAT_MACROS ]
+-
+-// 7.8.2 Functions for greatest-width integer types
+-
+-// 7.8.2.1 The imaxabs function
+-#define imaxabs _abs64
+-
+-// 7.8.2.2 The imaxdiv function
+-
+-// This is modified version of div() function from Microsoft's div.c found
+-// in %MSVC.NET%\crt\src\div.c
+-#ifdef STATIC_IMAXDIV // [
+-static
+-#else // STATIC_IMAXDIV ][
+-_inline
+-#endif // STATIC_IMAXDIV ]
+-imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
+-{
+- imaxdiv_t result;
+-
+- result.quot = numer / denom;
+- result.rem = numer % denom;
+-
+- if (numer < 0 && result.rem > 0) {
+- // did division wrong; must fix up
+- ++result.quot;
+- result.rem -= denom;
+- }
+-
+- return result;
+-}
+-
+-// 7.8.2.3 The strtoimax and strtoumax functions
+-#define strtoimax _strtoi64
+-#define strtoumax _strtoui64
+-
+-// 7.8.2.4 The wcstoimax and wcstoumax functions
+-#define wcstoimax _wcstoi64
+-#define wcstoumax _wcstoui64
+-
+-
+-#endif // _MSC_INTTYPES_H_ ]
+diff --git a/src/compat/msvc/stdint.h b/src/compat/msvc/stdint.h
+deleted file mode 100644
+index d02608a59..000000000
+--- a/src/compat/msvc/stdint.h
++++ /dev/null
+@@ -1,247 +0,0 @@
+-// ISO C9x compliant stdint.h for Microsoft Visual Studio
+-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
+-//
+-// Copyright (c) 2006-2008 Alexander Chemeris
+-//
+-// Redistribution and use in source and binary forms, with or without
+-// modification, are permitted provided that the following conditions are met:
+-//
+-// 1. Redistributions of source code must retain the above copyright notice,
+-// this list of conditions and the following disclaimer.
+-//
+-// 2. Redistributions in binary form must reproduce the above copyright
+-// notice, this list of conditions and the following disclaimer in the
+-// documentation and/or other materials provided with the distribution.
+-//
+-// 3. The name of the author may be used to endorse or promote products
+-// derived from this software without specific prior written permission.
+-//
+-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-//
+-///////////////////////////////////////////////////////////////////////////////
+-
+-#ifndef _MSC_VER // [
+-#error "Use this header only with Microsoft Visual C++ compilers!"
+-#endif // _MSC_VER ]
+-
+-#ifndef _MSC_STDINT_H_ // [
+-#define _MSC_STDINT_H_
+-
+-#if _MSC_VER > 1000
+-#pragma once
+-#endif
+-
+-#include <limits.h>
+-
+-// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
+-// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
+-// or compiler give many errors like this:
+-// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-# include <wchar.h>
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-// Define _W64 macros to mark types changing their size, like intptr_t.
+-#ifndef _W64
+-# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+-# define _W64 __w64
+-# else
+-# define _W64
+-# endif
+-#endif
+-
+-
+-// 7.18.1 Integer types
+-
+-// 7.18.1.1 Exact-width integer types
+-
+-// Visual Studio 6 and Embedded Visual C++ 4 doesn't
+-// realize that, e.g. char has the same size as __int8
+-// so we give up on __intX for them.
+-#if (_MSC_VER < 1300)
+- typedef signed char int8_t;
+- typedef signed short int16_t;
+- typedef signed int int32_t;
+- typedef unsigned char uint8_t;
+- typedef unsigned short uint16_t;
+- typedef unsigned int uint32_t;
+-#else
+- typedef signed __int8 int8_t;
+- typedef signed __int16 int16_t;
+- typedef signed __int32 int32_t;
+- typedef unsigned __int8 uint8_t;
+- typedef unsigned __int16 uint16_t;
+- typedef unsigned __int32 uint32_t;
+-#endif
+-typedef signed __int64 int64_t;
+-typedef unsigned __int64 uint64_t;
+-
+-
+-// 7.18.1.2 Minimum-width integer types
+-typedef int8_t int_least8_t;
+-typedef int16_t int_least16_t;
+-typedef int32_t int_least32_t;
+-typedef int64_t int_least64_t;
+-typedef uint8_t uint_least8_t;
+-typedef uint16_t uint_least16_t;
+-typedef uint32_t uint_least32_t;
+-typedef uint64_t uint_least64_t;
+-
+-// 7.18.1.3 Fastest minimum-width integer types
+-typedef int8_t int_fast8_t;
+-typedef int16_t int_fast16_t;
+-typedef int32_t int_fast32_t;
+-typedef int64_t int_fast64_t;
+-typedef uint8_t uint_fast8_t;
+-typedef uint16_t uint_fast16_t;
+-typedef uint32_t uint_fast32_t;
+-typedef uint64_t uint_fast64_t;
+-
+-// 7.18.1.4 Integer types capable of holding object pointers
+-#ifdef _WIN64 // [
+- typedef signed __int64 intptr_t;
+- typedef unsigned __int64 uintptr_t;
+-#else // _WIN64 ][
+- typedef _W64 signed int intptr_t;
+- typedef _W64 unsigned int uintptr_t;
+-#endif // _WIN64 ]
+-
+-// 7.18.1.5 Greatest-width integer types
+-typedef int64_t intmax_t;
+-typedef uint64_t uintmax_t;
+-
+-
+-// 7.18.2 Limits of specified-width integer types
+-
+-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
+-
+-// 7.18.2.1 Limits of exact-width integer types
+-#define INT8_MIN ((int8_t)_I8_MIN)
+-#define INT8_MAX _I8_MAX
+-#define INT16_MIN ((int16_t)_I16_MIN)
+-#define INT16_MAX _I16_MAX
+-#define INT32_MIN ((int32_t)_I32_MIN)
+-#define INT32_MAX _I32_MAX
+-#define INT64_MIN ((int64_t)_I64_MIN)
+-#define INT64_MAX _I64_MAX
+-#define UINT8_MAX _UI8_MAX
+-#define UINT16_MAX _UI16_MAX
+-#define UINT32_MAX _UI32_MAX
+-#define UINT64_MAX _UI64_MAX
+-
+-// 7.18.2.2 Limits of minimum-width integer types
+-#define INT_LEAST8_MIN INT8_MIN
+-#define INT_LEAST8_MAX INT8_MAX
+-#define INT_LEAST16_MIN INT16_MIN
+-#define INT_LEAST16_MAX INT16_MAX
+-#define INT_LEAST32_MIN INT32_MIN
+-#define INT_LEAST32_MAX INT32_MAX
+-#define INT_LEAST64_MIN INT64_MIN
+-#define INT_LEAST64_MAX INT64_MAX
+-#define UINT_LEAST8_MAX UINT8_MAX
+-#define UINT_LEAST16_MAX UINT16_MAX
+-#define UINT_LEAST32_MAX UINT32_MAX
+-#define UINT_LEAST64_MAX UINT64_MAX
+-
+-// 7.18.2.3 Limits of fastest minimum-width integer types
+-#define INT_FAST8_MIN INT8_MIN
+-#define INT_FAST8_MAX INT8_MAX
+-#define INT_FAST16_MIN INT16_MIN
+-#define INT_FAST16_MAX INT16_MAX
+-#define INT_FAST32_MIN INT32_MIN
+-#define INT_FAST32_MAX INT32_MAX
+-#define INT_FAST64_MIN INT64_MIN
+-#define INT_FAST64_MAX INT64_MAX
+-#define UINT_FAST8_MAX UINT8_MAX
+-#define UINT_FAST16_MAX UINT16_MAX
+-#define UINT_FAST32_MAX UINT32_MAX
+-#define UINT_FAST64_MAX UINT64_MAX
+-
+-// 7.18.2.4 Limits of integer types capable of holding object pointers
+-#ifdef _WIN64 // [
+-# define INTPTR_MIN INT64_MIN
+-# define INTPTR_MAX INT64_MAX
+-# define UINTPTR_MAX UINT64_MAX
+-#else // _WIN64 ][
+-# define INTPTR_MIN INT32_MIN
+-# define INTPTR_MAX INT32_MAX
+-# define UINTPTR_MAX UINT32_MAX
+-#endif // _WIN64 ]
+-
+-// 7.18.2.5 Limits of greatest-width integer types
+-#define INTMAX_MIN INT64_MIN
+-#define INTMAX_MAX INT64_MAX
+-#define UINTMAX_MAX UINT64_MAX
+-
+-// 7.18.3 Limits of other integer types
+-
+-#ifdef _WIN64 // [
+-# define PTRDIFF_MIN _I64_MIN
+-# define PTRDIFF_MAX _I64_MAX
+-#else // _WIN64 ][
+-# define PTRDIFF_MIN _I32_MIN
+-# define PTRDIFF_MAX _I32_MAX
+-#endif // _WIN64 ]
+-
+-#define SIG_ATOMIC_MIN INT_MIN
+-#define SIG_ATOMIC_MAX INT_MAX
+-
+-#ifndef SIZE_MAX // [
+-# ifdef _WIN64 // [
+-# define SIZE_MAX _UI64_MAX
+-# else // _WIN64 ][
+-# define SIZE_MAX _UI32_MAX
+-# endif // _WIN64 ]
+-#endif // SIZE_MAX ]
+-
+-// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+-#ifndef WCHAR_MIN // [
+-# define WCHAR_MIN 0
+-#endif // WCHAR_MIN ]
+-#ifndef WCHAR_MAX // [
+-# define WCHAR_MAX _UI16_MAX
+-#endif // WCHAR_MAX ]
+-
+-#define WINT_MIN 0
+-#define WINT_MAX _UI16_MAX
+-
+-#endif // __STDC_LIMIT_MACROS ]
+-
+-
+-// 7.18.4 Limits of other integer types
+-
+-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
+-
+-// 7.18.4.1 Macros for minimum-width integer constants
+-
+-#define INT8_C(val) val##i8
+-#define INT16_C(val) val##i16
+-#define INT32_C(val) val##i32
+-#define INT64_C(val) val##i64
+-
+-#define UINT8_C(val) val##ui8
+-#define UINT16_C(val) val##ui16
+-#define UINT32_C(val) val##ui32
+-#define UINT64_C(val) val##ui64
+-
+-// 7.18.4.2 Macros for greatest-width integer constants
+-#define INTMAX_C INT64_C
+-#define UINTMAX_C UINT64_C
+-
+-#endif // __STDC_CONSTANT_MACROS ]
+-
+-
+-#endif // _MSC_STDINT_H_ ]
+diff --git a/src/filter/FilterManager.cpp b/src/filter/FilterManager.cpp
+index e4e0b02ee..8e2e897f0 100644
+--- a/src/filter/FilterManager.cpp
++++ b/src/filter/FilterManager.cpp
+@@ -69,7 +69,7 @@ bool FilterManager::insert(Filter *filter, QList<Filter *> &filters, int pos)
+ // already installed at desired position
+ if (p == index)
+ return false;
+- if (p >= 0)
++ if (p >= 0 && p < filters.size())
+ filters.removeAt(p);
+ filters.insert(p, filter);
+ return true;
+diff --git a/src/filter/LibAVFilter.cpp b/src/filter/LibAVFilter.cpp
+index 8993a91f7..d770ddc33 100644
+--- a/src/filter/LibAVFilter.cpp
++++ b/src/filter/LibAVFilter.cpp
+@@ -84,7 +84,9 @@ class LibAVFilter::Private
+ filter_graph = 0;
+ in_filter_ctx = 0;
+ out_filter_ctx = 0;
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ avfilter_register_all();
++#endif
+ #endif //QTAV_HAVE(AVFILTER)
+ }
+ ~Private() {
+@@ -204,7 +206,9 @@ QString LibAVFilter::filterDescription(const QString &filterName)
+ {
+ QString s;
+ #if QTAV_HAVE(AVFILTER)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ avfilter_register_all();
++#endif
+ const AVFilter *f = avfilter_get_by_name(filterName.toUtf8().constData());
+ if (!f)
+ return s;
+@@ -283,11 +287,18 @@ QStringList LibAVFilter::registeredFilters(int type)
+ {
+ QStringList filters;
+ #if QTAV_HAVE(AVFILTER)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ avfilter_register_all();
++#endif
+ const AVFilter* f = NULL;
+ AVFilterPad* fp = NULL; // no const in avfilter_pad_get_name() for ffmpeg<=1.2 libav<=9
+ #if AV_MODULE_CHECK(LIBAVFILTER, 3, 8, 0, 53, 100)
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ while ((f = avfilter_next(f))) {
++#else
++ void** ff = NULL;
++ while (f = av_filter_iterate(ff)) {
++#endif
+ #else
+ AVFilter** ff = NULL;
+ while ((ff = av_filter_next(ff)) && *ff) {
+diff --git a/src/libQtAV.pro b/src/libQtAV.pro
+index c6cbcc374..88524b39e 100644
+--- a/src/libQtAV.pro
++++ b/src/libQtAV.pro
+@@ -100,7 +100,16 @@ win32 {
+ !static:QMAKE_LFLAGS *= /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcmtd.lib #for msbuild vs2013
+ }
+ capi {
+-contains(QT_CONFIG, egl)|contains(QT_CONFIG, dynamicgl)|contains(QT_CONFIG, opengles2) {
++contains(QT_CONFIG, egl)|contains(QT_CONFIG, opengles2) {
++ CONFIG *= enable_egl
++ !ios {
++ winrt: DEFINES += CAPI_LINK_EGL #required by capi_egl.*
++ DEFINES += QTAV_HAVE_EGL_CAPI=1
++ HEADERS *= capi/egl_api.h
++ SOURCES *= capi/egl_api.cpp
++ }
++}
++lessThan(QT_MAJOR_VERSION,6): contains(QT_CONFIG, dynamicgl) {
+ CONFIG *= enable_egl
+ !ios {
+ winrt: DEFINES += CAPI_LINK_EGL #required by capi_egl.*
+@@ -244,7 +253,7 @@ config_pulseaudio {
+ DEFINES *= QTAV_HAVE_PULSEAUDIO=1
+ LIBS += -lpulse
+ }
+-CONFIG += config_cuda
++!no-cuda: CONFIG *= config_cuda
+ #CONFIG += config_cuda_link
+ config_cuda {
+ DEFINES += QTAV_HAVE_CUDA=1
+@@ -287,7 +296,7 @@ config_d3d11va {
+ }
+ winrt: LIBS *= -ld3d11
+ }
+-win32:!winrt {
++win32:!winrt:d3dva {
+ HEADERS += directx/SurfaceInteropD3D9.h
+ SOURCES += directx/SurfaceInteropD3D9.cpp
+ enable_egl {
+diff --git a/src/opengl/gl_api.cpp b/src/opengl/gl_api.cpp
+index 9caeba8b4..3186158fb 100644
+--- a/src/opengl/gl_api.cpp
++++ b/src/opengl/gl_api.cpp
+@@ -31,7 +31,7 @@ void* GetProcAddress_Qt(const char *name)
+ return 0;
+ void* p = (void*)QOpenGLContext::currentContext()->getProcAddress(QByteArray((const char*)name));
+ if (!p) {
+-#if defined(Q_OS_WIN) && defined(QT_OPENGL_DYNAMIC)
++#if defined(Q_OS_WIN) && defined(QT_OPENGL_DYNAMIC) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ HMODULE handle = (HMODULE)QOpenGLContext::openGLModuleHandle();
+ if (handle)
+ p = (void*)GetProcAddress(handle, name);
+diff --git a/src/subtitle/SubtitleProcessorFFmpeg.cpp b/src/subtitle/SubtitleProcessorFFmpeg.cpp
+index 8d4a94154..d2163e937 100644
+--- a/src/subtitle/SubtitleProcessorFFmpeg.cpp
++++ b/src/subtitle/SubtitleProcessorFFmpeg.cpp
+@@ -250,7 +250,7 @@ bool SubtitleProcessorFFmpeg::processHeader(const QByteArray &codec, const QByte
+ if (codec_ctx) {
+ avcodec_free_context(&codec_ctx);
+ }
+- AVCodec *c = avcodec_find_decoder_by_name(codec.constData());
++ const AVCodec *c = avcodec_find_decoder_by_name(codec.constData());
+ if (!c) {
+ qDebug("subtitle avcodec_descriptor_get_by_name %s", codec.constData());
+ const AVCodecDescriptor *desc = avcodec_descriptor_get_by_name(codec.constData());
+@@ -371,8 +371,15 @@ bool SubtitleProcessorFFmpeg::processSubtitle()
+ qWarning("no subtitle stream found");
+ return false;
+ }
++#if LIBAVCODEC_VERSION_MAJOR < 59
+ codec_ctx = m_reader.subtitleCodecContext();
+- AVCodec *dec = avcodec_find_decoder(codec_ctx->codec_id);
++ const AVCodec *dec = avcodec_find_decoder(codec_ctx->codec_id);
++#else
++ AVCodecParameters *par = m_reader.subtitleCodecContext();
++ const AVCodec *dec = avcodec_find_decoder(par->codec_id);
++ codec_ctx = avcodec_alloc_context3(dec);
++ avcodec_parameters_to_context(codec_ctx, par);
++#endif
+ const AVCodecDescriptor *dec_desc = avcodec_descriptor_get(codec_ctx->codec_id);
+ if (!dec) {
+ if (dec_desc)
+diff --git a/widgets/Direct2DRenderer.cpp b/widgets/Direct2DRenderer.cpp
+index 9e63febb4..13a60c620 100644
+--- a/widgets/Direct2DRenderer.cpp
++++ b/widgets/Direct2DRenderer.cpp
+@@ -55,7 +55,7 @@ class Direct2DRenderer : public QWidget, public VideoRenderer
+ Q_OBJECT
+ DPTR_DECLARE_PRIVATE(Direct2DRenderer)
+ public:
+- Direct2DRenderer(QWidget* parent = 0, Qt::WindowFlags f = 0);
++ Direct2DRenderer(QWidget* parent = 0, Qt::WindowFlags f = {});
+ VideoRendererId id() const Q_DECL_OVERRIDE;
+ bool isSupported(VideoFormat::PixelFormat pixfmt) const Q_DECL_OVERRIDE;
+
+diff --git a/widgets/GDIRenderer.cpp b/widgets/GDIRenderer.cpp
+index af20c869f..6e1507f7e 100644
+--- a/widgets/GDIRenderer.cpp
++++ b/widgets/GDIRenderer.cpp
+@@ -41,7 +41,7 @@ class GDIRenderer : public QWidget, public VideoRenderer
+ Q_OBJECT
+ DPTR_DECLARE_PRIVATE(GDIRenderer)
+ public:
+- GDIRenderer(QWidget* parent = 0, Qt::WindowFlags f = 0); //offscreen?
++ GDIRenderer(QWidget* parent = 0, Qt::WindowFlags f = {}); //offscreen?
+ VideoRendererId id() const Q_DECL_OVERRIDE;
+ bool isSupported(VideoFormat::PixelFormat pixfmt) const Q_DECL_OVERRIDE;
+ /* WA_PaintOnScreen: To render outside of Qt's paint system, e.g. If you require
+@@ -238,7 +238,11 @@ void GDIRenderer::drawBackground()
+ //HDC hdc = d.device_context;
+ Graphics g(d.device_context);
+ SolidBrush brush(Color(bc.alpha(), bc.red(), bc.green(), bc.blue())); //argb
++#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ const QVector<QRect> bg(bgRegion.rects());
++#else
++ const QVector<QRect> bg(bgRegion.begin(), bgRegion.end());
++#endif
+ foreach (const QRect& r, bg) {
+ g.FillRectangle(&brush, r.x(), r.y(), r.width(), r.height());
+ }
\ No newline at end of file
diff --git a/debian/patches/series b/debian/patches/series
index 431ab10..df8232b 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,3 +9,4 @@ qt-5.15.diff
#neon_qmlpl
master.diff
qmlplayer.diff
+neon_ffmpeg5_support.diff
More information about the Neon-commits
mailing list