From 45813d9661443c801b1d5cadc330d913d2350c44 Mon Sep 17 00:00:00 2001 From: "Martin T. H. Sandsmark" Date: Fri, 7 Aug 2020 16:24:09 +0200 Subject: [PATCH] register our own log handler for ffmpeg using QLoggingCategory --- CMakeLists.txt | 5 ++++- ffmpegthumbnailer.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 1 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0bffe70..14285e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ project(ffmpegthumbs) cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) set(QT_MIN_VERSION "5.2.0") -find_package(ECM 1.0.0 REQUIRED NO_MODULE) +find_package(ECM 5.14.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(FeatureSummary) @@ -11,6 +11,7 @@ include(WriteBasicConfigVersionFile) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) +include(ECMQtDeclareLoggingCategory) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core Gui) find_package(KF5 REQUIRED COMPONENTS KIO I18n Config) @@ -37,6 +38,8 @@ set( ffmpegthumbs_PART_SRCS ffmpegthumbnailer/videothumbnailer.cpp ) +ecm_qt_declare_logging_category(ffmpegthumbs_PART_SRCS HEADER ffmpegthumbs_debug.h IDENTIFIER ffmpegthumbs_LOG CATEGORY_NAME org.kde.kdemultimedia.ffmpegthumbs DEFAULT_SEVERITY Critical) + kconfig_add_kcfg_files(ffmpegthumbs_PART_SRCS ffmpegthumbnailersettings5.kcfgc) add_library(ffmpegthumbs MODULE ${ffmpegthumbs_PART_SRCS}) diff --git a/ffmpegthumbnailer.cpp b/ffmpegthumbnailer.cpp index 096831e..a15517d 100644 --- a/ffmpegthumbnailer.cpp +++ b/ffmpegthumbnailer.cpp @@ -17,6 +17,7 @@ #include "ffmpegthumbnailer.h" #include "ffmpegthumbnailersettings5.h" +#include "ffmpegthumbs_debug.h" #include @@ -24,10 +25,52 @@ #include #include +extern "C" { +#include +} + +namespace { +struct FFmpegLogHandler { + static void handleMessage(void *ptr, int level, const char *fmt, va_list vargs) { + Q_UNUSED(ptr); + + const QString message = QString::vasprintf(fmt, vargs); + + switch(level) { + case AV_LOG_PANIC: // ffmpeg will crash now + qCCritical(ffmpegthumbs_LOG) << message; + break; + case AV_LOG_FATAL: // fatal as in can't decode, not crash + case AV_LOG_ERROR: + case AV_LOG_WARNING: + qCWarning(ffmpegthumbs_LOG) << message; + break; + case AV_LOG_INFO: + qCInfo(ffmpegthumbs_LOG) << message; + break; + case AV_LOG_VERBOSE: + case AV_LOG_DEBUG: + qCDebug(ffmpegthumbs_LOG) << message; + break; + default: + qCWarning(ffmpegthumbs_LOG) << "unhandled log level" << level << message; + break; + } + } + + FFmpegLogHandler() { + av_log_set_callback(&FFmpegLogHandler::handleMessage); + } +}; +} //namespace + extern "C" { Q_DECL_EXPORT ThumbCreator *new_creator() { + // This is a threadsafe way to ensure that we only register it once + static FFmpegLogHandler handler; + return new FFMpegThumbnailer(); } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 688eb77..4fcdb78 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -15,6 +15,7 @@ set(ffmpegthumbtest_SRCS ffmpegthumbtest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpegthumbnailer/imagewriter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpegthumbnailer/videothumbnailer.cpp ) +ecm_qt_declare_logging_category(ffmpegthumbtest_SRCS HEADER ffmpegthumbs_debug.h IDENTIFIER ffmpegthumbs_LOG CATEGORY_NAME org.kde.kdemultimedia.ffmpegthumbs DEFAULT_SEVERITY Critical) kconfig_add_kcfg_files(ffmpegthumbtest_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpegthumbnailersettings5.kcfgc) -- GitLab