From 937240f9e360e434b36c418656ae6fe8cc6afea9 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 30 Jun 2015 11:09:34 +0100 Subject: Write FFmpeg log output to our log file. --- src/lib/ffmpeg.cc | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'src/lib/ffmpeg.cc') 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); -- cgit v1.2.3