From: Carl Hetherington Date: Tue, 30 Jun 2015 10:09:34 +0000 (+0100) Subject: Write FFmpeg log output to our log file. X-Git-Tag: v2.1.13~12 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=937240f9e360e434b36c418656ae6fe8cc6afea9;p=dcpomatic.git Write FFmpeg log output to our log file. --- diff --git a/ChangeLog b/ChangeLog index bcbcd9b13..d623af217 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-06-30 c.hetherington + + * Write FFmpeg messages of AV_LOG_WARNING and + below to the project's log file. + 2015-06-29 Carl Hetherington * Version 2.1.12 released. diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index f5d114e8f..63fe9c9d8 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington 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,26 +17,31 @@ */ -extern "C" { -#include -#include -#include -} #include "ffmpeg.h" #include "ffmpeg_content.h" +#include "film.h" #include "ffmpeg_audio_stream.h" #include "ffmpeg_subtitle_stream.h" #include "exceptions.h" #include "util.h" #include "raw_convert.h" +#include "log.h" +extern "C" { +#include +#include +#include +} +#include #include "i18n.h" using std::string; using std::cout; +using std::cerr; using boost::shared_ptr; boost::mutex FFmpeg::_mutex; +boost::weak_ptr FFmpeg::_ffmpeg_log; FFmpeg::FFmpeg (boost::shared_ptr c) : _ffmpeg_content (c) @@ -75,11 +80,37 @@ avio_seek_wrapper (void* data, int64_t offset, int whence) return reinterpret_cast(data)->avio_seek (offset, whence); } +void +FFmpeg::ffmpeg_log_callback (void* ptr, int level, const char* fmt, va_list vl) +{ + if (level > AV_LOG_WARNING) { + return; + } + + char line[1024]; + static int prefix = 0; + av_log_format_line (ptr, level, fmt, vl, line, sizeof (line), &prefix); + shared_ptr log = _ffmpeg_log.lock (); + if (log) { + string str (line); + boost::algorithm::trim (str); + log->log (String::compose ("FFmpeg: %1", str), Log::TYPE_GENERAL); + } else { + cerr << line; + } +} + void FFmpeg::setup_general () { av_register_all (); + /* This might not work too well in some cases of multiple FFmpeg decoders, + but it's probably good enough. + */ + _ffmpeg_log = _ffmpeg_content->film()->log (); + av_log_set_callback (FFmpeg::ffmpeg_log_callback); + _file_group.set_paths (_ffmpeg_content->paths ()); _avio_buffer = static_cast (wrapped_av_malloc (_avio_buffer_size)); _avio_context = avio_alloc_context (_avio_buffer, _avio_buffer_size, 0, this, avio_read_wrapper, 0, avio_seek_wrapper); diff --git a/src/lib/ffmpeg.h b/src/lib/ffmpeg.h index 4299edc28..9e9d5125a 100644 --- a/src/lib/ffmpeg.h +++ b/src/lib/ffmpeg.h @@ -26,19 +26,13 @@ extern "C" { #include "file_group.h" #include #include -#include -struct AVFilterGraph; -struct AVCodecContext; -struct AVFilterContext; struct AVFormatContext; struct AVFrame; -struct AVBufferContext; -struct AVCodec; -struct AVStream; struct AVIOContext; class FFmpegContent; +class Log; class FFmpeg { @@ -80,6 +74,9 @@ protected: private: void setup_general (); void setup_decoders (); + + static void ffmpeg_log_callback (void* ptr, int level, const char* fmt, va_list vl); + static boost::weak_ptr _ffmpeg_log; }; #endif diff --git a/src/lib/ffmpeg_examiner.h b/src/lib/ffmpeg_examiner.h index f2bdea0c2..f5ee95acf 100644 --- a/src/lib/ffmpeg_examiner.h +++ b/src/lib/ffmpeg_examiner.h @@ -21,6 +21,8 @@ #include "video_examiner.h" #include +class AVStream; + class FFmpegAudioStream; class FFmpegSubtitleStream;