Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -15,6 +15,7 @@ find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core Gui) find_package(KF5 REQUIRED COMPONENTS KIO I18n Config) find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT SWSCALE) +find_package(Taglib) include_directories( ${CMAKE_CURRENT_BINARY_DIR} @@ -39,7 +40,7 @@ kconfig_add_kcfg_files(ffmpegthumbs_PART_SRCS ffmpegthumbnailersettings5.kcfgc) add_library(ffmpegthumbs MODULE ${ffmpegthumbs_PART_SRCS}) -target_link_libraries(ffmpegthumbs Qt5::Core Qt5::Gui KF5::KIOWidgets KF5::KIOCore KF5::I18n KF5::ConfigCore KF5::ConfigGui ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} ) +target_link_libraries(ffmpegthumbs Qt5::Core Qt5::Gui KF5::KIOWidgets KF5::KIOCore KF5::I18n KF5::ConfigCore KF5::ConfigGui ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} Taglib::Taglib ) install(FILES ffmpegthumbnailersettings5.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(TARGETS ffmpegthumbs DESTINATION ${PLUGIN_INSTALL_DIR}) Index: cmake/FindTaglib.cmake =================================================================== --- /dev/null +++ cmake/FindTaglib.cmake @@ -0,0 +1,90 @@ +#.rst: +# FindTaglib +#----------- +# +# Try to find the Taglib library. +# +# This will define the following variables: +# +# ``Taglib_FOUND`` +# True if the system has the taglib library of at least the minimum +# version specified by the version parameter to find_package() +# ``Taglib_INCLUDE_DIRS`` +# The taglib include dirs for use with target_include_directories +# ``Taglib_LIBRARIES`` +# The taglib libraries for use with target_link_libraries() +# ``Taglib_VERSION`` +# The version of taglib that was found +# +# If ``Taglib_FOUND is TRUE, it will also define the following imported +# target: +# +# ``Taglib::Taglib`` +# The Taglib library +# +# Since 5.72.0 +# +# SPDX-FileCopyrightText: 2006 Laurent Montel +# SPDX-FileCopyrightText: 2019 Heiko Becker +# SPDX-FileCopyrightText: 2020 Elvis Angelaccio +# SPDX-License-Identifier: BSD-3-Clause + +find_package(PkgConfig QUIET) + +pkg_search_module(PC_TAGLIB QUIET taglib) + +find_path(Taglib_INCLUDE_DIRS + NAMES tag.h + PATH_SUFFIXES taglib + HINTS ${PC_TAGLIB_INCLUDEDIR} +) + +find_library(Taglib_LIBRARIES + NAMES tag + HINTS ${PC_TAGLIB_LIBDIR} +) + +set(Taglib_VERSION ${PC_TAGLIB_VERSION}) + +if (Taglib_INCLUDE_DIRS AND NOT Taglib_VERSION) + if(EXISTS "${Taglib_INCLUDE_DIRS}/taglib.h") + file(READ "${Taglib_INCLUDE_DIRS}/taglib.h" TAGLIB_H) + + string(REGEX MATCH "#define TAGLIB_MAJOR_VERSION[ ]+[0-9]+" TAGLIB_MAJOR_VERSION_MATCH ${TAGLIB_H}) + string(REGEX MATCH "#define TAGLIB_MINOR_VERSION[ ]+[0-9]+" TAGLIB_MINOR_VERSION_MATCH ${TAGLIB_H}) + string(REGEX MATCH "#define TAGLIB_PATCH_VERSION[ ]+[0-9]+" TAGLIB_PATCH_VERSION_MATCH ${TAGLIB_H}) + + string(REGEX REPLACE ".*_MAJOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MAJOR_VERSION "${TAGLIB_MAJOR_VERSION_MATCH}") + string(REGEX REPLACE ".*_MINOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MINOR_VERSION "${TAGLIB_MINOR_VERSION_MATCH}") + string(REGEX REPLACE ".*_PATCH_VERSION[ ]+(.*)" "\\1" TAGLIB_PATCH_VERSION "${TAGLIB_PATCH_VERSION_MATCH}") + + set(Taglib_VERSION "${TAGLIB_MAJOR_VERSION}.${TAGLIB_MINOR_VERSION}.${TAGLIB_PATCH_VERSION}") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Taglib + FOUND_VAR + Taglib_FOUND + REQUIRED_VARS + Taglib_LIBRARIES + Taglib_INCLUDE_DIRS + VERSION_VAR + Taglib_VERSION +) + +if (Taglib_FOUND AND NOT TARGET Taglib::Taglib) + add_library(Taglib::Taglib UNKNOWN IMPORTED) + set_target_properties(Taglib::Taglib PROPERTIES + IMPORTED_LOCATION "${Taglib_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${Taglib_INCLUDE_DIRS}" + ) +endif() + +mark_as_advanced(Taglib_LIBRARIES Taglib_INCLUDE_DIRS) + +include(FeatureSummary) +set_package_properties(Taglib PROPERTIES + URL "https://taglib.org/" + DESCRIPTION "A library for reading and editing the meta-data of audio formats" +) Index: ffmpegthumbnailer.cpp =================================================================== --- ffmpegthumbnailer.cpp +++ ffmpegthumbnailer.cpp @@ -1,4 +1,5 @@ // Copyright (C) 2010 Dirk Vanden Boer +// Copyright (C) 2020 Heiko Schäfer // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,6 +18,8 @@ #include "ffmpegthumbnailer.h" #include "ffmpegthumbnailersettings5.h" +#include + #include #include #include @@ -44,6 +47,25 @@ bool FFMpegThumbnailer::create(const QString& path, int width, int /*height*/, QImage& img) { + QByteArray ba = path.toLocal8Bit(); + TagLib::MP4::File f(ba.data(), false); + + if (f.isValid()) { + + TagLib::MP4::Tag* tag = f.tag(); + TagLib::MP4::ItemListMap itemsListMap = tag->itemListMap(); + TagLib::MP4::Item coverItem = itemsListMap["covr"]; + TagLib::MP4::CoverArtList coverArtList = coverItem.toCoverArtList(); + + if (!coverArtList.isEmpty()) { + TagLib::MP4::CoverArt coverArt = coverArtList.front(); + img.loadFromData((const uchar *)coverArt.data().data(), + coverArt.data().size()); + + if (!img.isNull()) return true; + } + } + m_Thumbnailer.setThumbnailSize(width); // 20% seek inside the video to generate the preview m_Thumbnailer.setSeekPercentage(20); Index: ffmpegthumbnailer/filmstripfilter.h =================================================================== --- ffmpegthumbnailer/filmstripfilter.h +++ ffmpegthumbnailer/filmstripfilter.h @@ -26,7 +26,7 @@ { public: virtual ~FilmStripFilter() {} - virtual void process(VideoFrame& videoFrame); + virtual void process(VideoFrame& videoFrame) override; }; } Index: ffmpegthumbnailer/moviedecoder.cpp =================================================================== --- ffmpegthumbnailer/moviedecoder.cpp +++ ffmpegthumbnailer/moviedecoder.cpp @@ -250,8 +250,6 @@ av_frame_unref(m_pFrame); - int frameFinished = 0; - avcodec_send_packet(m_pVideoCodecContext, m_pPacket); int ret = avcodec_receive_frame(m_pVideoCodecContext, m_pFrame); if (ret == AVERROR(EAGAIN)) { Index: tests/CMakeLists.txt =================================================================== --- tests/CMakeLists.txt +++ tests/CMakeLists.txt @@ -20,7 +20,7 @@ add_executable(ffmpegthumbtest ${ffmpegthumbtest_SRCS} ) -target_link_libraries(ffmpegthumbtest Qt5::Core Qt5::Gui KF5::KIOWidgets KF5::KIOCore KF5::I18n KF5::ConfigCore KF5::ConfigGui ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES}) +target_link_libraries(ffmpegthumbtest Qt5::Core Qt5::Gui KF5::KIOWidgets KF5::KIOCore KF5::I18n KF5::ConfigCore KF5::ConfigGui ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} Taglib::Taglib)