]> git.pld-linux.org Git - packages/ffmpegthumbnailer.git/commitdiff
- add updates from upstream repository, rel 2 master auto/th/ffmpegthumbnailer-2.2.2-2
authorJan Rękorajski <baggins@pld-linux.org>
Thu, 19 Oct 2023 23:30:57 +0000 (01:30 +0200)
committerJan Rękorajski <baggins@pld-linux.org>
Thu, 19 Oct 2023 23:30:57 +0000 (01:30 +0200)
ffmpegthumbnailer.spec
git.patch [new file with mode: 0644]

index de2825ba33574987d15af487a643e95265219e00..b5a883a0aef1f4578aedad4286d3e167c13a1afc 100644 (file)
@@ -6,13 +6,14 @@ Summary:      Lightweight video thumbnailer
 Summary(pl.UTF-8):     Lekki program do wykonywania miniaturek dla filmów
 Name:          ffmpegthumbnailer
 Version:       2.2.2
-Release:       1
+Release:       2
 License:       GPL v2
 Group:         Applications/Graphics
 #Source0Download: https://github.com/dirkvdb/ffmpegthumbnailer/releases
 Source0:       https://github.com/dirkvdb/ffmpegthumbnailer/releases/download/%{version}/%{name}-%{version}.tar.bz2
 # Source0-md5: ef466e64df666ba006c0b071eb48018e
 Patch0:                %{name}-pc.patch
+Patch1:                git.patch
 URL:           https://github.com/dirkvdb/ffmpegthumbnailer
 BuildRequires: cmake >= 3.5
 # libavcodec >= 52.26.0 libavformat libavutil libswscale
@@ -66,6 +67,7 @@ Statyczna biblioteka libffmpegthumbnailer.
 %prep
 %setup -q
 %patch0 -p1
+%patch1 -p1
 
 %build
 mkdir build
diff --git a/git.patch b/git.patch
new file mode 100644 (file)
index 0000000..55ac49b
--- /dev/null
+++ b/git.patch
@@ -0,0 +1,984 @@
+diff --git a/.travis.yml b/.travis.yml
+index 547f20a..9a2b0d2 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -48,7 +48,7 @@ matrix:
+       os: osx
+       env:
+         - BUILD_TYPE=Release
+-      osx_image: xcode9
++      osx_image: xcode12
+ before_install:
+   ############################################################################
+@@ -77,7 +77,7 @@ before_install:
+   ############################################################################
+   - |
+     if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
+-      CMAKE_URL="http://www.cmake.org/files/v3.5/cmake-3.5.2-Linux-x86_64.tar.gz"
++      CMAKE_URL="https://cmake.org/files/v3.12/cmake-3.12.3-Linux-x86_64.tar.gz"
+       mkdir -p ${DEPS_DIR}/cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C ${DEPS_DIR}/cmake
+       export PATH=${DEPS_DIR}/cmake/bin:${PATH}
+     fi
+@@ -86,16 +86,16 @@ before_install:
+   ############################################################################
+   - |
+     if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
+-      brew update
+-      brew install ffmpeg
++      HOMEBREW_NO_AUTO_UPDATE=1 brew install ffmpeg
++      brew upgrade cmake
+     fi
+ install:
+   - |
+     if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
+-      wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.bz2
+-      tar xf ffmpeg-3.1.3.tar.bz2
+-      cd ffmpeg-3.1.3 && ./configure --prefix=/${DEPS_DIR}/local --disable-static --enable-shared --disable-avdevice --disable-doc --disable-htmlpages --disable-manpages --disable-programs --disable-encoders --disable-muxers --enable-swscale --disable-yasm --enable-protocol=file --enable-protocol=http --enable-iconv  && make -j4 install
++      wget https://www.ffmpeg.org/releases/ffmpeg-4.4.tar.bz2
++      tar xf ffmpeg-4.4.tar.bz2
++      cd ffmpeg-4.4 && ./configure --prefix=/${DEPS_DIR}/local --disable-static --enable-shared --disable-avdevice --disable-doc --disable-htmlpages --disable-manpages --disable-programs --disable-encoders --disable-muxers --enable-swscale --disable-yasm --enable-protocol=file --enable-protocol=http --enable-iconv  && make -j4 install
+       cd ..
+     fi
+@@ -112,4 +112,4 @@ addons:
+     notification_email: dirk.vdb@gmail.com
+     build_command_prepend: "cmake ."
+     build_command: "make -j4"
+-    branch_pattern: coverity_scan
+\ No newline at end of file
++    branch_pattern: coverity_scan
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 671b93a..15bfa3f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 3.5)
++cmake_minimum_required(VERSION 3.12)
+ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+@@ -92,6 +92,15 @@ add_library(libffmpegthumbnailerobj OBJECT
+     libffmpegthumbnailer/filmstripfilter.cpp
+ )
++target_link_libraries(libffmpegthumbnailerobj
++    FFmpeg::avformat
++    FFmpeg::avcodec
++    FFmpeg::avutil
++    FFmpeg::avfilter
++    $<$<BOOL:${HAVE_JPEG}>:${JPEG_LIBRARIES}>
++    $<$<BOOL:${HAVE_PNG}>:PNG::PNG>
++)
++
+ # we use our own deprecated struct menbers, so disable the warning about it
+ set_source_files_properties(libffmpegthumbnailer/videothumbnailerc.cpp PROPERTIES COMPILE_FLAGS -Wno-deprecated-declarations)
+@@ -118,12 +127,7 @@ set (FFMPEGTHUMBNAILER_SOVERSION_AGE 1)
+ if (ENABLE_STATIC)
+     add_library(libffmpegthumbnailerstatic STATIC $<TARGET_OBJECTS:libffmpegthumbnailerobj>)
+     target_link_libraries(libffmpegthumbnailerstatic
+-        FFmpeg::avformat
+-        FFmpeg::avcodec
+-        FFmpeg::avutil
+-        FFmpeg::avfilter
+-        $<$<BOOL:${HAVE_JPEG}>:${JPEG_LIBRARIES}>
+-        $<$<BOOL:${HAVE_PNG}>:PNG::PNG>
++        libffmpegthumbnailerobj
+         $<$<BOOL:${ENABLE_GIO}>:${CMAKE_DL_LIBS}>
+     )
+@@ -140,16 +144,11 @@ endif ()
+ if (ENABLE_SHARED)
+     add_library(libffmpegthumbnailer SHARED $<TARGET_OBJECTS:libffmpegthumbnailerobj>)
+     target_link_libraries(libffmpegthumbnailer
+-        FFmpeg::avformat
+-        FFmpeg::avcodec
+-        FFmpeg::avutil
+-        FFmpeg::avfilter
+-        $<$<BOOL:${HAVE_JPEG}>:${JPEG_LIBRARIES}>
+-        $<$<BOOL:${HAVE_PNG}>:PNG::PNG>
++        libffmpegthumbnailerobj
+     )
+     set_target_properties(libffmpegthumbnailer PROPERTIES
+-        PREFIX ""
++        OUTPUT_NAME ffmpegthumbnailer
+         VERSION ${FFMPEGTHUMBNAILER_SOVERSION_CURRENT}.${FFMPEGTHUMBNAILER_SOVERSION_REVISION}.${FFMPEGTHUMBNAILER_SOVERSION_AGE}
+         SOVERSION ${FFMPEGTHUMBNAILER_SOVERSION_CURRENT}
+         PUBLIC_HEADER "${LIB_HDRS}"
+diff --git a/dist/ffmpegthumbnailer.thumbnailer b/dist/ffmpegthumbnailer.thumbnailer
+index b410c50..151d111 100644
+--- a/dist/ffmpegthumbnailer.thumbnailer
++++ b/dist/ffmpegthumbnailer.thumbnailer
+@@ -1,4 +1,4 @@
+ [Thumbnailer Entry]
+ TryExec=ffmpegthumbnailer
+ Exec=ffmpegthumbnailer -i %i -o %o -s %s -f
+-MimeType=video/jpeg;video/mp4;video/mpeg;video/quicktime;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-asx;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;video/x-flv;video/x-matroska;application/mxf;video/3gp;video/3gpp;video/dv;video/divx;video/fli;video/flv;video/mp2t;video/mp4v-es;video/msvideo;video/ogg;video/vivo;video/vnd.divx;video/vnd.mpegurl;video/vnd.rn-realvideo;application/vnd.rn-realmedia;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-m4v;video/x-mpeg;video/x-mpeg2;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg
++MimeType=video/jpeg;video/mp4;video/mpeg;video/quicktime;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-asx;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;video/x-flv;video/x-matroska;application/x-matroska;application/mxf;video/3gp;video/3gpp;video/dv;video/divx;video/fli;video/flv;video/mp2t;video/mp4v-es;video/msvideo;video/ogg;video/vivo;video/vnd.avi;video/vnd.divx;video/vnd.mpegurl;video/vnd.rn-realvideo;application/vnd.rn-realmedia;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-m4v;video/x-mpeg;video/x-mpeg2;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg
+diff --git a/kffmpegthumbnailer/.gitignore b/kffmpegthumbnailer/.gitignore
+new file mode 100644
+index 0000000..8fc25a5
+--- /dev/null
++++ b/kffmpegthumbnailer/.gitignore
+@@ -0,0 +1,7 @@
++*.cmake
++*.so
++Makefile
++prefix.sh
++CMakeCache.txt
++CMakeFiles
++*_autogen
+diff --git a/kffmpegthumbnailer/CMakeLists.txt b/kffmpegthumbnailer/CMakeLists.txt
+index 1f9963c..55c9f97 100644
+--- a/kffmpegthumbnailer/CMakeLists.txt
++++ b/kffmpegthumbnailer/CMakeLists.txt
+@@ -1,12 +1,21 @@
+ project(kffmpegthumbnailer)
+-find_package(KDE4 REQUIRED)
+-find_package(PkgConfig)
++cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
++set(QT_MIN_VERSION "5.2.0")
+-include(KDE4Defaults)
+-include(MacroOptionalAddSubdirectory)
++find_package(ECM 1.0.0 REQUIRED NO_MODULE)
++set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
++
++include(FeatureSummary)
++include(WriteBasicConfigVersionFile)
++include(KDEInstallDirs)
++include(KDECMakeSettings)
++include(KDECompilerSettings NO_POLICY_SCOPE)
+ include(FindPkgConfig)
++find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core Gui)
++find_package(KF5 REQUIRED COMPONENTS KIO I18n Config)
++
+ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "kffmpegthumbnailer video thumbnailer for kde")
+ set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
+ set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYRIGHT")
+@@ -20,19 +29,17 @@ set(CPACK_SOURCE_IGNORE_FILES "/out/;/.svn/;*~")
+ include(CPack)
+-pkg_check_modules(AVUTIL libavutil)
+-pkg_check_modules(AVFORMAT libavformat)
+-pkg_check_modules(AVCODEC libavcodec)
+-pkg_check_modules(SWSCALE libswscale)
+ pkg_check_modules(FFMPEG_THUMBNAILER libffmpegthumbnailer)
+-include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} ${AVUTIL_INCLUDES} ${AVFORMAT_INCLUDES} ${AVCODEC_INCLUDES} ${SWSCALE_INCLUDES} ${FFMPEG_THUMBNAILER_INCLUDES})
++include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDES} ${FFMPEG_THUMBNAILER_INCLUDES})
+ set(kffmpegthumbnailer_SRCS kffmpegthumbnailer.cpp)
+ string(REGEX REPLACE "-fno-exceptions " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+-kde4_add_plugin(kffmpegthumbnailer ${kffmpegthumbnailer_SRCS})
+-target_link_libraries(kffmpegthumbnailer ${KDE4_KIO_LIBS} ${AVUTIL_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} ${FFMPEG_THUMBNAILER_LIBRARIES})
++kconfig_add_kcfg_files(kffmpegthumbnailer_SRCS kffmpegthumbnailersettings5.kcfgc)
++add_library(kffmpegthumbnailer MODULE ${kffmpegthumbnailer_SRCS})
++target_link_libraries(kffmpegthumbnailer Qt5::Core Qt5::Gui KF5::KIOWidgets KF5::KIOCore KF5::ConfigCore KF5::ConfigGui ${FFMPEG_THUMBNAILER_LIBRARIES})
++install(FILES kffmpegthumbnailersettings5.kcfg DESTINATION ${KCFG_INSTALL_DIR})
+ install(TARGETS kffmpegthumbnailer DESTINATION ${PLUGIN_INSTALL_DIR})
+ install(FILES kffmpegthumbnailer.desktop DESTINATION ${SERVICES_INSTALL_DIR})
+diff --git a/kffmpegthumbnailer/Changelog b/kffmpegthumbnailer/Changelog
+index 31340e5..3c62f0f 100644
+--- a/kffmpegthumbnailer/Changelog
++++ b/kffmpegthumbnailer/Changelog
+@@ -1,5 +1,11 @@
+ KFFmpegThumbnailer
++version 1.2.0 (October 28, 2020)
++- Fixed builds for KDE 5
++- Added options menu, allowing to select preferred thumbnails
++- Added option to use cover pictures from media files
++- Removed deprecated frame generation code
++
+ version 1.1.0 (January 06, 2010)
+ - Updated to ffmpegthumbnailer 2.0.0 interface
+@@ -7,4 +13,4 @@ version 1.0.1 (December 28, 2009)
+ - Fixed thumbnails not being generated for filenames containing non-ascii characters (Thanks to fedux.c)
+ version 1.0.0 (December 24, 2009)
+-- Initial release
+\ No newline at end of file
++- Initial release
+diff --git a/kffmpegthumbnailer/kffmpegthumbnailer.cpp b/kffmpegthumbnailer/kffmpegthumbnailer.cpp
+index f30d4fb..aaf7b28 100644
+--- a/kffmpegthumbnailer/kffmpegthumbnailer.cpp
++++ b/kffmpegthumbnailer/kffmpegthumbnailer.cpp
+@@ -15,12 +15,19 @@
+ //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ #include "kffmpegthumbnailer.h"
++#include "kffmpegthumbnailersettings5.h"
++
++#include <limits>
+ #include <QImage>
++#include <QCheckBox>
++#include <QFormLayout>
++#include <QRegExpValidator>
++#include <QWidget>
+ extern "C"
+ {
+-    KDE_EXPORT ThumbCreator* new_creator()
++    Q_DECL_EXPORT ThumbCreator *new_creator()
+     {
+         return new KFFMpegThumbnailer();
+     }
+@@ -29,22 +36,52 @@ extern "C"
+ KFFMpegThumbnailer::KFFMpegThumbnailer()
+ {
+-    m_Thumbnailer.addFilter(&m_FilmStrip);
++    thumbCache.setMaxCost(KFFMpegThumbnailerSettings::cacheSize());
+ }
+ KFFMpegThumbnailer::~KFFMpegThumbnailer()
+ {
+ }
+-bool KFFMpegThumbnailer::create(const QString& path, int width, int /*heigth*/, QImage& img)
++bool KFFMpegThumbnailer::create(const QString& path, int width, int /*height*/, QImage& img)
+ {
++    int seqIdx = static_cast<int>(sequenceIndex());
++
++    const QList<int> seekPercentages = KFFMpegThumbnailerSettings::sequenceSeekPercentages();
++    const int numSeekPercentages = seekPercentages.size();
++
++    seqIdx %= numSeekPercentages;
++
++    const QString cacheKey = QString("%1$%2@%3").arg(path).arg(seqIdx).arg(width);
++
++    QImage* cachedImg = thumbCache[cacheKey];
++    if (cachedImg) {
++        img = *cachedImg;
++        return true;
++    }
++
+     try
+     {
+         std::vector<uint8_t> pixelBuffer;
+-        
+-        m_Thumbnailer.setThumbnailSize(width);    
++        KFFMpegThumbnailerSettings* settings = KFFMpegThumbnailerSettings::self();
++        settings->load();
++
++        if (settings->addFilmstrip())
++        {
++            m_Thumbnailer.addFilter(&m_FilmStrip);
++        }
++        else 
++        {
++            m_Thumbnailer.clearFilters();
++        }
++
++        m_Thumbnailer.setPreferEmbeddedMetadata(settings->useMetadataCovers());
++        m_Thumbnailer.setSmartFrameSelection(settings->useSmartSelection());
++        m_Thumbnailer.setSeekPercentage(seekPercentages[seqIdx]);
++
++        m_Thumbnailer.setThumbnailSize(width);
+         m_Thumbnailer.generateThumbnail(std::string(path.toUtf8()), Png, pixelBuffer);
+-        
++
+         if (!img.loadFromData(&pixelBuffer.front(), pixelBuffer.size(), "PNG"))
+         {
+             return false;
+@@ -54,12 +91,89 @@ bool KFFMpegThumbnailer::create(const QString& path, int width, int /*heigth*/,
+     {
+         return false;
+     }
+-    
++
++    const int cacheCost = static_cast<int>((img.sizeInBytes()+1023) / 1024);
++    thumbCache.insert(cacheKey, new QImage(img), cacheCost);
++
+     return true;
+ }
++float KFFMpegThumbnailer::sequenceIndexWraparoundPoint() const
++{
++    return static_cast<float>(KFFMpegThumbnailerSettings::sequenceSeekPercentages().size());
++}
++
+ ThumbCreator::Flags KFFMpegThumbnailer::flags() const
+ {
+-    return (Flags)(DrawFrame);
++    return static_cast<Flags>(None);
+ }
++QWidget *KFFMpegThumbnailer::createConfigurationWidget()
++{
++    QWidget* widget = new QWidget();
++    QFormLayout* formLayout = new QFormLayout(widget);
++
++    m_addFilmStripCheckBox = new QCheckBox("Embed filmstrip effect");
++    m_addFilmStripCheckBox->setChecked(KFFMpegThumbnailerSettings::addFilmstrip());
++    formLayout->addRow(m_addFilmStripCheckBox);
++
++    m_useMetadataCheckBox = new QCheckBox("Use metadata embedded cover pictures");
++    m_useMetadataCheckBox->setChecked(KFFMpegThumbnailerSettings::useMetadataCovers());
++    formLayout->addRow(m_useMetadataCheckBox);
++
++    m_useSmartSelectionCheckBox = new QCheckBox("Use smart (slower) frame selection");
++    m_useSmartSelectionCheckBox->setChecked(KFFMpegThumbnailerSettings::useSmartSelection());
++    formLayout->addRow(m_useSmartSelectionCheckBox);
++
++    QString seekPercentagesStr;
++    for (const int sp : KFFMpegThumbnailerSettings::sequenceSeekPercentages()) {
++        if (!seekPercentagesStr.isEmpty()) {
++            seekPercentagesStr.append(' ');
++        }
++        seekPercentagesStr.append(QString().setNum(sp));
++    }
++
++    m_sequenceSeekPercentagesLineEdit = new QLineEdit();
++    m_sequenceSeekPercentagesLineEdit->setText(seekPercentagesStr);
++    formLayout->addRow("Sequence seek percentages", m_sequenceSeekPercentagesLineEdit);
++
++    m_thumbCacheSizeSpinBox = new QSpinBox();
++    m_thumbCacheSizeSpinBox->setRange(0, std::numeric_limits<int>::max());
++    m_thumbCacheSizeSpinBox->setValue(KFFMpegThumbnailerSettings::cacheSize());
++    formLayout->addRow("Cache size (KiB)", m_thumbCacheSizeSpinBox);
++
++    return widget;
++}
++
++void KFFMpegThumbnailer::writeConfiguration(const QWidget* /*configurationWidget*/)
++{
++    KFFMpegThumbnailerSettings* settings = KFFMpegThumbnailerSettings::self();
++
++    settings->setAddFilmstrip(m_addFilmStripCheckBox->isChecked());
++    settings->setUseMetadataCovers(m_useMetadataCheckBox->isChecked());
++    settings->setUseSmartSelection(m_useSmartSelectionCheckBox->isChecked());
++
++    const QStringList seekPercentagesStrList = m_sequenceSeekPercentagesLineEdit->text()
++            .split(QRegExp("(\\s*,\\s*)|\\s+"), Qt::SkipEmptyParts);
++    QList<int> seekPercentages;
++    bool seekPercentagesValid = true;
++
++    for (const QString str : seekPercentagesStrList) {
++        const int sp = str.toInt(&seekPercentagesValid);
++
++        if (!seekPercentagesValid) {
++            break;
++        }
++
++        seekPercentages << sp;
++    }
++
++    if (seekPercentagesValid) {
++        settings->setSequenceSeekPercentages(seekPercentages);
++    }
++
++    settings->setCacheSize(m_thumbCacheSizeSpinBox->value());
++    thumbCache.setMaxCost(m_thumbCacheSizeSpinBox->value());
++
++    settings->save();
++}
+diff --git a/kffmpegthumbnailer/kffmpegthumbnailer.desktop b/kffmpegthumbnailer/kffmpegthumbnailer.desktop
+index 6b0515f..2ce9285 100644
+--- a/kffmpegthumbnailer/kffmpegthumbnailer.desktop
++++ b/kffmpegthumbnailer/kffmpegthumbnailer.desktop
+@@ -7,5 +7,7 @@ MimeType=video/*;application/x-flash-video;application/vnd.ms-asf;application/vn
+ X-KDE-Library=kffmpegthumbnailer
+ ServiceTypes=ThumbCreator
+ CacheThumbnail=true
+-ThumbnailerVersion=1
++HandleSequences=true
++ThumbnailerVersion=2
+ IgnoreMaximumSize=true
++Configurable=true
+diff --git a/kffmpegthumbnailer/kffmpegthumbnailer.h b/kffmpegthumbnailer/kffmpegthumbnailer.h
+index 88cddb1..1b63f54 100644
+--- a/kffmpegthumbnailer/kffmpegthumbnailer.h
++++ b/kffmpegthumbnailer/kffmpegthumbnailer.h
+@@ -18,23 +18,40 @@
+ #define KFFMPEG_THUMBNAILER_H
+ #include <QObject>
+-#include <kio/thumbcreator.h>
++#include <QCache>
++#include <QCheckBox>
++#include <QLineEdit>
++#include <QSpinBox>
++#include <kio/thumbsequencecreator.h>
+ #include <libffmpegthumbnailer/videothumbnailer.h>
+ #include <libffmpegthumbnailer/filmstripfilter.h>
+-class KFFMpegThumbnailer : public QObject, public ThumbCreator
++class KFFMpegThumbnailer : public QObject, public ThumbSequenceCreator
+ {
+     Q_OBJECT
++
++private:
++    typedef QCache<QString, QImage> ThumbCache;
++
+ public:
+     KFFMpegThumbnailer();
+     virtual ~KFFMpegThumbnailer();
+-    virtual bool create(const QString& path, int width, int heught, QImage& img);
+-    virtual Flags flags() const;
+-    
++    virtual bool create(const QString& path, int width, int height, QImage& img) override;
++    virtual float sequenceIndexWraparoundPoint() const;
++    virtual Flags flags() const override;
++    virtual QWidget* createConfigurationWidget() override;
++    virtual void writeConfiguration(const QWidget* configurationWidget) override;
++
+ private:
+     ffmpegthumbnailer::VideoThumbnailer    m_Thumbnailer;
+     ffmpegthumbnailer::FilmStripFilter     m_FilmStrip;
++    ThumbCache thumbCache;
++    QCheckBox*                             m_addFilmStripCheckBox;
++    QCheckBox*                             m_useMetadataCheckBox;
++    QCheckBox*                             m_useSmartSelectionCheckBox;
++    QLineEdit*                             m_sequenceSeekPercentagesLineEdit;
++    QSpinBox*                              m_thumbCacheSizeSpinBox;
+ };
+ #endif
+diff --git a/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfg b/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfg
+new file mode 100644
+index 0000000..77dfa68
+--- /dev/null
++++ b/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfg
+@@ -0,0 +1,29 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
++      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++      xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
++      http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
++    <kcfgfile name="kffmpegthumbsrc"/>
++    <group name="General">
++      <entry name="addFilmstrip" type="Bool">
++          <label>Embed filmstrip effect</label>
++          <default>false</default>
++      </entry>
++      <entry name="useMetadataCovers" type="Bool">
++          <label>Use metadata embedded cover pictures</label>
++          <default>true</default>
++      </entry>
++      <entry name="useSmartSelection" type="Bool">
++          <label>Use smart (slower) frame selection</label>
++          <default>false</default>
++      </entry>
++      <entry name="sequenceSeekPercentages" type="IntList">
++          <label>Sequence seek percentages</label>
++          <default>20,35,50,65,80</default>
++      </entry>
++      <entry name="cacheSize" type="UInt">
++          <label>Cache size (KiB)</label>
++          <default>51200</default>
++      </entry>
++    </group>
++</kcfg>
+diff --git a/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfgc b/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfgc
+new file mode 100644
+index 0000000..4cf6c59
+--- /dev/null
++++ b/kffmpegthumbnailer/kffmpegthumbnailersettings5.kcfgc
+@@ -0,0 +1,4 @@
++File=kffmpegthumbnailersettings5.kcfg
++ClassName=KFFMpegThumbnailerSettings
++Singleton=true
++Mutators=true
+diff --git a/libffmpegthumbnailer/filmstripfilter.cpp b/libffmpegthumbnailer/filmstripfilter.cpp
+index 93b77c8..621d4db 100644
+--- a/libffmpegthumbnailer/filmstripfilter.cpp
++++ b/libffmpegthumbnailer/filmstripfilter.cpp
+@@ -26,7 +26,7 @@ static const uint8_t* determineFilmStrip(uint32_t videoWidth, uint32_t& filmStri
+ {
+     if (videoWidth <= SMALLEST_FILM_STRIP_WIDTH * 2)
+     {
+-        return NULL;
++        return nullptr;
+     }
+     
+     if (videoWidth <= 96)
+diff --git a/libffmpegthumbnailer/histogram.h b/libffmpegthumbnailer/histogram.h
+index 2deca17..acade47 100644
+--- a/libffmpegthumbnailer/histogram.h
++++ b/libffmpegthumbnailer/histogram.h
+@@ -17,7 +17,7 @@
+ #ifndef HISTOGRAM_H
+ #define HISTOGRAM_H
+-#include <string.h>
++#include <array>
+ namespace ffmpegthumbnailer
+ {
+@@ -25,16 +25,9 @@ namespace ffmpegthumbnailer
+ template <typename T>
+ struct Histogram
+ {
+-    T r[256];
+-    T g[256];
+-    T b[256];
+-
+-    Histogram()
+-    {
+-        memset(r, 0, 256 * sizeof(T));
+-        memset(g, 0, 256 * sizeof(T));
+-        memset(b, 0, 256 * sizeof(T));
+-    }
++    std::array<T, 256> r{};
++    std::array<T, 256> g{};
++    std::array<T, 256> b{};
+ };
+ }
+diff --git a/libffmpegthumbnailer/imagetypes.h b/libffmpegthumbnailer/imagetypes.h
+index 1432c44..5bef6d6 100644
+--- a/libffmpegthumbnailer/imagetypes.h
++++ b/libffmpegthumbnailer/imagetypes.h
+@@ -22,7 +22,6 @@ typedef enum ThumbnailerImageTypeEnum
+     Png,
+     Jpeg,
+     Rgb,
+-    Unknown
+ } ThumbnailerImageType;
+ #endif
+diff --git a/libffmpegthumbnailer/imagewriter.h b/libffmpegthumbnailer/imagewriter.h
+index 7cb0653..1ab9e9f 100644
+--- a/libffmpegthumbnailer/imagewriter.h
++++ b/libffmpegthumbnailer/imagewriter.h
+@@ -26,11 +26,10 @@ namespace ffmpegthumbnailer
+ class ImageWriter
+ {
+ public:
+-    ImageWriter() {}
+-    virtual ~ImageWriter() {}
++   virtual ~ImageWriter() = default;
+-      virtual void setText(const std::string& key, const std::string& value) = 0;
+-      virtual void writeFrame(uint8_t** rgbData, int width, int height, int quality) = 0;
++   virtual void setText(const std::string& key, const std::string& value) = 0;
++   virtual void writeFrame(uint8_t** rgbData, int width, int height, int quality) = 0;
+ };
+ }
+diff --git a/libffmpegthumbnailer/jpegwriter.cpp b/libffmpegthumbnailer/jpegwriter.cpp
+index 7bee2a2..0be2b34 100644
+--- a/libffmpegthumbnailer/jpegwriter.cpp
++++ b/libffmpegthumbnailer/jpegwriter.cpp
+@@ -41,8 +41,8 @@ static void jpegDestroyDestination(j_compress_ptr pCompressionInfo);
+ JpegWriter::JpegWriter(const string& outputFile)
+ : ImageWriter()
+-, m_pFile(NULL)
+-, m_pBufferWriter(NULL)
++, m_pFile(nullptr)
++, m_pBufferWriter(nullptr)
+ {
+     init();
+       m_pFile = outputFile == "-" ? stdout : fopen(outputFile.c_str(), "wb");
+@@ -57,8 +57,8 @@ JpegWriter::JpegWriter(const string& outputFile)
+ JpegWriter::JpegWriter(std::vector<uint8_t>& outputBuffer)
+ : ImageWriter()
+-, m_pFile(NULL)
+-, m_pBufferWriter(NULL)
++, m_pFile(nullptr)
++, m_pBufferWriter(nullptr)
+ {
+     init();
+@@ -115,7 +115,7 @@ void JpegWriter::writeFrame(uint8_t** rgbData, int width, int height, int qualit
+ void jpegInitDestination(j_compress_ptr pCompressionInfo)
+ {
+-    BufferWriter* bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
++    auto bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
+     bufWriter->m_pDataBuffer = (uint8_t*)(*pCompressionInfo->mem->alloc_small) ((j_common_ptr) pCompressionInfo, JPOOL_IMAGE, JPEG_WORK_BUFFER_SIZE);
+     bufWriter->m_DestMgr.next_output_byte = bufWriter->m_pDataBuffer;
+@@ -124,7 +124,7 @@ void jpegInitDestination(j_compress_ptr pCompressionInfo)
+ boolean jpegFlushWorkBuffer(j_compress_ptr pCompressionInfo)
+ {
+-    BufferWriter* bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
++    auto bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
+     size_t prevSize = bufWriter->m_pDataSink->size();
+     bufWriter->m_pDataSink->resize(prevSize + JPEG_WORK_BUFFER_SIZE);
+@@ -139,7 +139,7 @@ boolean jpegFlushWorkBuffer(j_compress_ptr pCompressionInfo)
+ void jpegDestroyDestination(j_compress_ptr pCompressionInfo)
+ {
+-    BufferWriter* bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
++    auto bufWriter = reinterpret_cast<BufferWriter*>(pCompressionInfo->dest);
+     size_t datacount = JPEG_WORK_BUFFER_SIZE - bufWriter->m_DestMgr.free_in_buffer;
+     size_t prevSize = bufWriter->m_pDataSink->size();
+diff --git a/libffmpegthumbnailer/moviedecoder.cpp b/libffmpegthumbnailer/moviedecoder.cpp
+index 290e212..8f4b34d 100644
+--- a/libffmpegthumbnailer/moviedecoder.cpp
++++ b/libffmpegthumbnailer/moviedecoder.cpp
+@@ -41,11 +41,6 @@ using namespace std;
+ namespace ffmpegthumbnailer
+ {
+-struct SilenceLogLevel
+-{
+-    SilenceLogLevel() { av_log_set_level(AV_LOG_QUIET); }
+-};
+-
+ MovieDecoder::MovieDecoder(AVFormatContext* pavContext)
+ : m_VideoStream(-1)
+ , m_pFormatContext(pavContext)
+@@ -70,8 +65,6 @@ MovieDecoder::~MovieDecoder()
+ void MovieDecoder::initialize(const string& filename, bool preferEmbeddedMetadata)
+ {
+-    av_register_all();
+-    avcodec_register_all();
+     avformat_network_init();
+     string inputFile = filename == "-" ? "pipe:" : filename;
+@@ -97,8 +90,7 @@ void MovieDecoder::destroy()
+ {
+     if (m_pVideoCodecContext)
+     {
+-        avcodec_close(m_pVideoCodecContext);
+-        m_pVideoCodecContext = nullptr;
++        avcodec_free_context(&m_pVideoCodecContext);
+     }
+     if ((!m_FormatContextWasGiven) && m_pFormatContext)
+@@ -152,10 +144,10 @@ int32_t MovieDecoder::findPreferedVideoStream(bool preferEmbeddedMetadata)
+     for (unsigned int i = 0; i < m_pFormatContext->nb_streams; ++i)
+     {
+         AVStream *stream = m_pFormatContext->streams[i];
+-        auto ctx = m_pFormatContext->streams[i]->codec;
+-        if (ctx->codec_type == AVMEDIA_TYPE_VIDEO)
++        auto par = m_pFormatContext->streams[i]->codecpar;
++        if (par->codec_type == AVMEDIA_TYPE_VIDEO)
+         {
+-            if (!preferEmbeddedMetadata || !isStillImageCodec(ctx->codec_id))
++            if (!preferEmbeddedMetadata || !isStillImageCodec(par->codec_id))
+             {
+                 videoStreams.push_back(i);
+                 continue;
+@@ -203,8 +195,7 @@ void MovieDecoder::initializeVideo(bool preferEmbeddedMetadata)
+     }
+     m_pVideoStream = m_pFormatContext->streams[m_VideoStream];
+-    m_pVideoCodecContext = m_pVideoStream->codec;
+-    m_pVideoCodec = avcodec_find_decoder(m_pVideoCodecContext->codec_id);
++    m_pVideoCodec = avcodec_find_decoder(m_pVideoStream->codecpar->codec_id);
+     if (m_pVideoCodec == nullptr)
+     {
+@@ -214,6 +205,20 @@ void MovieDecoder::initializeVideo(bool preferEmbeddedMetadata)
+         throw logic_error("Video Codec not found");
+     }
++    m_pVideoCodecContext = avcodec_alloc_context3(m_pVideoCodec);
++
++    if (m_pVideoCodecContext == nullptr)
++    {
++        destroy();
++        throw logic_error("Could not allocate video codec context");
++    }
++
++    if (avcodec_parameters_to_context(m_pVideoCodecContext, m_pVideoStream->codecpar) < 0)
++    {
++        destroy();
++        throw logic_error("Could not configure video codec context");
++    }
++
+     m_pVideoCodecContext->workaround_bugs = 1;
+     if (avcodec_open2(m_pVideoCodecContext, m_pVideoCodec, nullptr) < 0)
+@@ -386,13 +391,6 @@ std::string MovieDecoder::createScaleString(const std::string& sizeString, bool
+ void MovieDecoder::initializeFilterGraph(const AVRational& timeBase, const std::string& size, bool maintainAspectRatio)
+ {
+-    static const AVPixelFormat pixelFormats[] = { AV_PIX_FMT_RGB24, AV_PIX_FMT_NONE };
+-
+-    auto del = [] (AVBufferSinkParams* p) { av_freep(p); };
+-    std::unique_ptr<AVBufferSinkParams, decltype(del)> buffersinkParams(av_buffersink_params_alloc(), del);
+-
+-    avfilter_register_all();
+-
+     m_pFilterGraph = avfilter_graph_alloc();
+     assert(m_pFilterGraph);
+@@ -404,10 +402,8 @@ void MovieDecoder::initializeFilterGraph(const AVRational& timeBase, const std::
+     checkRc(avfilter_graph_create_filter(&m_pFilterSource, avfilter_get_by_name("buffer"), "thumb_buffer", ss.str().c_str(), nullptr, m_pFilterGraph),
+             "Failed to create filter source");
+-    buffersinkParams->pixel_fmts = pixelFormats;
+-    checkRc(avfilter_graph_create_filter(&m_pFilterSink, avfilter_get_by_name("buffersink"), "thumb_buffersink", nullptr, buffersinkParams.get(), m_pFilterGraph),
++    checkRc(avfilter_graph_create_filter(&m_pFilterSink, avfilter_get_by_name("buffersink"), "thumb_buffersink", nullptr, nullptr, m_pFilterGraph),
+             "Failed to create filter sink");
+-    buffersinkParams.release();
+     AVFilterContext* yadifFilter = nullptr;
+     if (m_pFrame->interlaced_frame != 0)
+@@ -500,15 +496,15 @@ void MovieDecoder::seek(int timeInSeconds)
+     }
+     checkRc(av_seek_frame(m_pFormatContext, -1, timestamp, 0), "Seeking in video failed");
+-    avcodec_flush_buffers(m_pFormatContext->streams[m_VideoStream]->codec);
++    avcodec_flush_buffers(m_pVideoCodecContext);
+     int keyFrameAttempts = 0;
+-    bool gotFrame = 0;
++    bool gotFrame;
+     do
+     {
+         int count = 0;
+-        gotFrame = 0;
++        gotFrame = false;
+         while (!gotFrame && count < 20)
+         {
+@@ -552,17 +548,33 @@ bool MovieDecoder::decodeVideoPacket()
+         return false;
+     }
+-    av_frame_unref(m_pFrame);
+-
+-    int frameFinished;
++    int rc = avcodec_send_packet(m_pVideoCodecContext, m_pPacket);
++    if(rc == AVERROR(EAGAIN))
++    {
++        rc = 0;
++    }
+-    int bytesDecoded = avcodec_decode_video2(m_pVideoCodecContext, m_pFrame, &frameFinished, m_pPacket);
+-    if (bytesDecoded < 0)
++    if(rc == AVERROR_EOF)
++    {
++        return false;
++    }
++    else if(rc < 0)
+     {
+-        throw logic_error("Failed to decode video frame: bytesDecoded < 0");
++        throw logic_error("Failed to decode video frame: avcodec_send_packet() < 0");
+     }
+-    return frameFinished > 0;
++    rc = avcodec_receive_frame(m_pVideoCodecContext, m_pFrame);
++    switch(rc)
++    {
++        case 0:
++            return true;
++
++        case AVERROR(EAGAIN):
++            return false;
++
++        default:
++            throw logic_error("Failed to decode video frame: avcodec_receive_frame() < 0");
++    }
+ }
+ bool MovieDecoder::getVideoPacket()
+@@ -570,8 +582,6 @@ bool MovieDecoder::getVideoPacket()
+     bool framesAvailable = true;
+     bool frameDecoded = false;
+-    int attempts = 0;
+-
+     if (m_pPacket)
+     {
+         av_packet_unref(m_pPacket);
+@@ -580,6 +590,7 @@ bool MovieDecoder::getVideoPacket()
+     m_pPacket = new AVPacket();
++
+     while (framesAvailable && !frameDecoded)
+     {
+         framesAvailable = av_read_frame(m_pFormatContext, m_pPacket) >= 0;
+@@ -644,7 +655,7 @@ void MovieDecoder::checkRc(int ret, const std::string& message)
+ int32_t MovieDecoder::getStreamRotation()
+ {
+-    int32_t* matrix = reinterpret_cast<int32_t*>(av_stream_get_side_data(m_pVideoStream, AV_PKT_DATA_DISPLAYMATRIX, nullptr));
++    auto matrix = reinterpret_cast<int32_t*>(av_stream_get_side_data(m_pVideoStream, AV_PKT_DATA_DISPLAYMATRIX, nullptr));
+     if (matrix)
+     {
+         auto angle = lround(av_display_rotation_get(matrix));
+diff --git a/libffmpegthumbnailer/moviedecoder.h b/libffmpegthumbnailer/moviedecoder.h
+index 3ef5f12..fb6add2 100644
+--- a/libffmpegthumbnailer/moviedecoder.h
++++ b/libffmpegthumbnailer/moviedecoder.h
+@@ -78,7 +78,7 @@ private:
+     int                     m_VideoStream;\r
+     AVFormatContext*        m_pFormatContext;\r
+     AVCodecContext*         m_pVideoCodecContext;\r
+-    AVCodec*                m_pVideoCodec;\r
++    const AVCodec*          m_pVideoCodec;\r
+     AVFilterGraph*          m_pFilterGraph;\r
+     AVFilterContext*        m_pFilterSource;\r
+     AVFilterContext*        m_pFilterSink;\r
+diff --git a/libffmpegthumbnailer/pngwriter.cpp b/libffmpegthumbnailer/pngwriter.cpp
+index f44decd..21590eb 100644
+--- a/libffmpegthumbnailer/pngwriter.cpp
++++ b/libffmpegthumbnailer/pngwriter.cpp
+@@ -28,9 +28,9 @@ static void writeDataCallback(png_structp png_ptr, png_bytep data, png_size_t le
+ PngWriter::PngWriter(const string& outputFile)
+ : ImageWriter()
+-, m_FilePtr(NULL)
+-, m_PngPtr(NULL)
+-, m_InfoPtr(NULL)
++, m_FilePtr(nullptr)
++, m_PngPtr(nullptr)
++, m_InfoPtr(nullptr)
+ {
+     init();
+     m_FilePtr = outputFile == "-" ? stdout : fopen(outputFile.c_str(), "wb");
+@@ -45,12 +45,12 @@ PngWriter::PngWriter(const string& outputFile)
+ PngWriter::PngWriter(std::vector<uint8_t>& outputBuffer)
+ : ImageWriter()
+-, m_FilePtr(NULL)
+-, m_PngPtr(NULL)
+-, m_InfoPtr(NULL)
++, m_FilePtr(nullptr)
++, m_PngPtr(nullptr)
++, m_InfoPtr(nullptr)
+ {
+     init();
+-    png_set_write_fn(m_PngPtr, (png_voidp) &outputBuffer, writeDataCallback, NULL);
++    png_set_write_fn(m_PngPtr, (png_voidp)&outputBuffer, writeDataCallback, nullptr);
+ }
+ PngWriter::~PngWriter()
+@@ -64,7 +64,7 @@ PngWriter::~PngWriter()
+ void PngWriter::init()
+ {
+-    m_PngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
++    m_PngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+     if (!m_PngPtr)
+     {
+         throw logic_error("Failed to create png write structure");
+@@ -73,7 +73,7 @@ void PngWriter::init()
+     m_InfoPtr = png_create_info_struct(m_PngPtr);
+     if (!m_InfoPtr)
+     {
+-        png_destroy_write_struct(&m_PngPtr, (png_infopp) NULL);
++        png_destroy_write_struct(&m_PngPtr, (png_infopp) nullptr);
+         throw logic_error("Failed to create png info structure");
+     }
+ }
+@@ -101,7 +101,7 @@ void PngWriter::writeFrame(uint8_t** rgbData, int width, int height, int /*quali
+                  PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+     png_set_rows(m_PngPtr, m_InfoPtr, rgbData);
+-    png_write_png(m_PngPtr, m_InfoPtr, 0, NULL);
++    png_write_png(m_PngPtr, m_InfoPtr, 0, nullptr);
+ }
+ void writeDataCallback(png_structp png_ptr, png_bytep data, png_size_t length)
+diff --git a/libffmpegthumbnailer/rgbwriter.cpp b/libffmpegthumbnailer/rgbwriter.cpp
+index 22332cf..d6a83d6 100644
+--- a/libffmpegthumbnailer/rgbwriter.cpp
++++ b/libffmpegthumbnailer/rgbwriter.cpp
+@@ -57,7 +57,7 @@ void RgbWriter::setText(const string& /*key*/, const string& /*value*/)
+ void RgbWriter::writeFrame(uint8_t** rgbData, int width, int height, int /*quality*/)
+ {
+-    const size_t lineSize = static_cast<size_t>(width * 3);
++    const auto lineSize = static_cast<size_t>(width * 3);
+     if (m_FilePtr)
+     {
+diff --git a/libffmpegthumbnailer/videothumbnailer.cpp b/libffmpegthumbnailer/videothumbnailer.cpp
+index 8c3a0e1..9770f68 100644
+--- a/libffmpegthumbnailer/videothumbnailer.cpp
++++ b/libffmpegthumbnailer/videothumbnailer.cpp
+@@ -32,6 +32,7 @@
+ #include <stdexcept>
+ #include <cassert>
+ #include <cerrno>
++#include <cstring>
+ #include <memory>
+ #include <regex>
+ #include <algorithm>
+@@ -204,6 +205,7 @@ VideoFrameInfo VideoThumbnailer::generateThumbnail(const string& videoFile, Imag
+     applyFilters(videoFrame);
+     vector<uint8_t*> rowPointers;
++    rowPointers.reserve(videoFrame.height);
+     for (int i = 0; i < videoFrame.height; ++i)
+     {
+         rowPointers.push_back(&(videoFrame.frameData[i * videoFrame.lineSize]));
+@@ -378,13 +380,12 @@ void VideoThumbnailer::applyFilters(VideoFrame& frameData)
+ int VideoThumbnailer::getBestThumbnailIndex(vector<VideoFrame>& videoFrames, const vector<Histogram<int> >& histograms)
+ {
+     Histogram<float> avgHistogram;
+-    for (size_t i = 0; i < histograms.size(); ++i)
+-    {
++    for (auto&& histogram : histograms) {
+         for (int j = 0; j < 255; ++j)
+         {
+-            avgHistogram.r[j] += static_cast<float>(histograms[i].r[j]) / histograms.size();
+-            avgHistogram.g[j] += static_cast<float>(histograms[i].g[j]) / histograms.size();
+-            avgHistogram.b[j] += static_cast<float>(histograms[i].b[j]) / histograms.size();
++            avgHistogram.r[j] += static_cast<float>(histogram.r[j]) / histograms.size();
++            avgHistogram.g[j] += static_cast<float>(histogram.g[j]) / histograms.size();
++            avgHistogram.b[j] += static_cast<float>(histogram.b[j]) / histograms.size();
+         }
+     }
+diff --git a/libffmpegthumbnailer/videothumbnailerc.cpp b/libffmpegthumbnailer/videothumbnailerc.cpp
+index 1b2e049..7b0f54c 100644
+--- a/libffmpegthumbnailer/videothumbnailerc.cpp
++++ b/libffmpegthumbnailer/videothumbnailerc.cpp
+@@ -40,7 +40,7 @@ static void trace_message(video_thumbnailer* thumbnailer, ThumbnailerLogLevel lv
+ extern "C" video_thumbnailer* video_thumbnailer_create(void)
+ {
+-    video_thumbnailer* thumbnailer = new video_thumbnailer_struct();
++    auto thumbnailer = new video_thumbnailer_struct();
+     thumbnailer->thumbnail_size             = 128;
+     thumbnailer->seek_percentage            = 10;
+@@ -65,9 +65,9 @@ extern "C" void video_thumbnailer_destroy(video_thumbnailer* thumbnailer)
+ extern "C" image_data* video_thumbnailer_create_image_data(void)
+ {
+-    image_data* data        = new image_data();
++    auto data               = new image_data();
+-    data->image_data_ptr    = 0;
++    data->image_data_ptr    = nullptr;
+     data->image_data_size   = 0;
+     data->image_data_width  = 0;
+     data->image_data_height = 0;
+@@ -78,14 +78,14 @@ extern "C" image_data* video_thumbnailer_create_image_data(void)
+ extern "C" void video_thumbnailer_destroy_image_data(image_data* data)
+ {
+-    data->image_data_ptr    = 0;
++    data->image_data_ptr    = nullptr;
+     data->image_data_size   = 0;
+     data->image_data_width  = 0;
+     data->image_data_height = 0;
+-    std::vector<uint8_t>* dataVector = reinterpret_cast<std::vector<uint8_t>* >(data->internal_data);
++    auto dataVector = reinterpret_cast<std::vector<uint8_t>*>(data->internal_data);
+     delete dataVector;
+-    data->internal_data     = 0;
++    data->internal_data     = nullptr;
+     delete data;
+ }
This page took 0.17667 seconds and 4 git commands to generate.