Ignore FFmpeg warnings in a nicer way.
authorCarl Hetherington <cth@carlh.net>
Sun, 26 Jul 2020 00:27:12 +0000 (02:27 +0200)
committerCarl Hetherington <cth@carlh.net>
Sun, 26 Jul 2020 19:30:53 +0000 (21:30 +0200)
src/lib/ffmpeg.cc
src/lib/ffmpeg.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_examiner.cc
src/lib/ffmpeg_file_encoder.cc
src/lib/ffmpeg_image_proxy.cc
src/lib/util.cc
src/lib/video_filter_graph.cc

index 8eb19816c0828b44b1dfc82bc030f19d37378ea5..0802fa159822f43f7895e2a03bc40b3afe6b06e5 100644 (file)
@@ -70,9 +70,11 @@ FFmpeg::~FFmpeg ()
 {
        boost::mutex::scoped_lock lm (_mutex);
 
+DCPOMATIC_DISABLE_WARNINGS
        for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
                avcodec_close (_format_context->streams[i]->codec);
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        av_frame_free (&_frame);
        avformat_close_input (&_format_context);
@@ -146,6 +148,7 @@ FFmpeg::setup_general ()
 
        optional<int> video_stream_undefined_frame_rate;
 
+DCPOMATIC_DISABLE_WARNINGS
        for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
                AVStream* s = _format_context->streams[i];
                if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO && avcodec_find_decoder(s->codec->codec_id)) {
@@ -158,6 +161,7 @@ FFmpeg::setup_general ()
                        }
                }
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        /* Files from iTunes sometimes have two video streams, one with the avg_frame_rate.num and .den set
           to zero.  Only use such a stream if there is no alternative.
@@ -204,6 +208,7 @@ FFmpeg::setup_decoders ()
 {
        boost::mutex::scoped_lock lm (_mutex);
 
+DCPOMATIC_DISABLE_WARNINGS
        for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
                AVCodecContext* context = _format_context->streams[i]->codec;
 
@@ -230,8 +235,10 @@ FFmpeg::setup_decoders ()
                        dcpomatic_log->log (String::compose ("No codec found for stream %1", i), LogEntry::TYPE_WARNING);
                }
        }
+DCPOMATIC_ENABLE_WARNINGS
 }
 
+DCPOMATIC_DISABLE_WARNINGS
 AVCodecContext *
 FFmpeg::video_codec_context () const
 {
@@ -251,6 +258,7 @@ FFmpeg::subtitle_codec_context () const
 
        return _ffmpeg_content->subtitle_stream()->stream(_format_context)->codec;
 }
+DCPOMATIC_ENABLE_WARNINGS
 
 int
 FFmpeg::avio_read (uint8_t* buffer, int const amount)
index 10517055c26cf842619699a901bc561ff00a8fde..e6399c076655742f4438bb87676dad87f8e06781 100644 (file)
 
 #include "file_group.h"
 #include "ffmpeg_subtitle_period.h"
+#include "warnings.h"
+DCPOMATIC_DISABLE_WARNINGS
 extern "C" {
 #include <libavcodec/avcodec.h>
 }
+DCPOMATIC_ENABLE_WARNINGS
 #include <boost/shared_ptr.hpp>
 #include <boost/thread/mutex.hpp>
 
index cfaf0361b9ab79da14f4f4ae841a5bd8a243cf9d..04c97ed3ba4d6b98cb87b706ec7ae47dea44ca6d 100644 (file)
@@ -206,9 +206,11 @@ FFmpegDecoder::deinterleave_audio (shared_ptr<FFmpegAudioStream> stream) const
 {
        DCPOMATIC_ASSERT (bytes_per_audio_sample (stream));
 
+DCPOMATIC_DISABLE_WARNINGS
        int const size = av_samples_get_buffer_size (
                0, stream->stream(_format_context)->codec->channels, _frame->nb_samples, audio_sample_format (stream), 1
                );
+DCPOMATIC_ENABLE_WARNINGS
 
        /* XXX: can't we just use _frame->nb_samples directly here? */
        /* XXX: can't we use swr_convert() to do the format conversion? */
@@ -339,7 +341,9 @@ FFmpegDecoder::deinterleave_audio (shared_ptr<FFmpegAudioStream> stream) const
 AVSampleFormat
 FFmpegDecoder::audio_sample_format (shared_ptr<FFmpegAudioStream> stream) const
 {
+DCPOMATIC_DISABLE_WARNINGS
        return stream->stream (_format_context)->codec->sample_fmt;
+DCPOMATIC_ENABLE_WARNINGS
 }
 
 int
@@ -401,9 +405,11 @@ FFmpegDecoder::seek (ContentTime time, bool accurate)
                avcodec_flush_buffers (video_codec_context());
        }
 
+DCPOMATIC_DISABLE_WARNINGS
        BOOST_FOREACH (shared_ptr<FFmpegAudioStream> i, ffmpeg_content()->ffmpeg_audio_streams()) {
                avcodec_flush_buffers (i->stream(_format_context)->codec);
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        if (subtitle_codec_context ()) {
                avcodec_flush_buffers (subtitle_codec_context ());
@@ -434,6 +440,7 @@ FFmpegDecoder::decode_audio_packet ()
                return;
        }
 
+DCPOMATIC_DISABLE_WARNINGS
        while (copy_packet.size > 0) {
 
                int frame_finished;
@@ -493,6 +500,7 @@ FFmpegDecoder::decode_audio_packet ()
                                        to_string(_pts_offset)
                                        );
                        }
+DCPOMATIC_ENABLE_WARNINGS
 
                        /* Give this data provided there is some, and its time is sane */
                        if (ct >= ContentTime() && data->frames() > 0) {
@@ -511,9 +519,11 @@ FFmpegDecoder::decode_video_packet ()
        DCPOMATIC_ASSERT (_video_stream);
 
        int frame_finished;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_decode_video2 (video_codec_context(), _frame, &frame_finished, &_packet) < 0 || !frame_finished) {
                return false;
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        boost::mutex::scoped_lock lm (_filter_graphs_mutex);
 
index 3fb9a53e4618f49e6f4aedb82780e9f10de541b3..cc6a62ff68e180af2118e0e0a23c30e0a6392e52 100644 (file)
 
 */
 
+#include "ffmpeg_examiner.h"
+#include "ffmpeg_content.h"
+#include "job.h"
+#include "ffmpeg_audio_stream.h"
+#include "ffmpeg_subtitle_stream.h"
+#include "util.h"
+#include "warnings.h"
+DCPOMATIC_DISABLE_WARNINGS
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
@@ -26,12 +34,7 @@ extern "C" {
 #include <libavutil/eval.h>
 #include <libavutil/display.h>
 }
-#include "ffmpeg_examiner.h"
-#include "ffmpeg_content.h"
-#include "job.h"
-#include "ffmpeg_audio_stream.h"
-#include "ffmpeg_subtitle_stream.h"
-#include "util.h"
+DCPOMATIC_ENABLE_WARNINGS
 #include <boost/foreach.hpp>
 #include <iostream>
 
@@ -44,6 +47,7 @@ using boost::shared_ptr;
 using boost::optional;
 using namespace dcpomatic;
 
+
 /** @param job job that the examiner is operating in, or 0 */
 FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Job> job)
        : FFmpeg (c)
@@ -54,6 +58,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
 
        for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
                AVStream* s = _format_context->streams[i];
+DCPOMATIC_DISABLE_WARNINGS
                if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 
                        /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
@@ -119,6 +124,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
                }
 
                AVCodecContext* context = _format_context->streams[_packet.stream_index]->codec;
+DCPOMATIC_ENABLE_WARNINGS
 
                if (_video_stream && _packet.stream_index == _video_stream.get()) {
                        video_packet (context);
@@ -175,6 +181,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c, shared_ptr<Jo
 #endif
 }
 
+
 void
 FFmpegExaminer::video_packet (AVCodecContext* context)
 {
@@ -185,7 +192,9 @@ FFmpegExaminer::video_packet (AVCodecContext* context)
        }
 
        int frame_finished;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_decode_video2 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
+DCPOMATIC_ENABLE_WARNINGS
                if (!_first_video) {
                        _first_video = frame_time (_format_context->streams[_video_stream.get()]);
                }
@@ -197,6 +206,7 @@ FFmpegExaminer::video_packet (AVCodecContext* context)
        }
 }
 
+
 void
 FFmpegExaminer::audio_packet (AVCodecContext* context, shared_ptr<FFmpegAudioStream> stream)
 {
@@ -205,17 +215,22 @@ FFmpegExaminer::audio_packet (AVCodecContext* context, shared_ptr<FFmpegAudioStr
        }
 
        int frame_finished;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_decode_audio4 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
+DCPOMATIC_ENABLE_WARNINGS
                stream->first_audio = frame_time (stream->stream (_format_context));
        }
 }
 
+
 optional<ContentTime>
 FFmpegExaminer::frame_time (AVStream* s) const
 {
        optional<ContentTime> t;
 
+DCPOMATIC_DISABLE_WARNINGS
        int64_t const bet = av_frame_get_best_effort_timestamp (_frame);
+DCPOMATIC_ENABLE_WARNINGS
        if (bet != AV_NOPTS_VALUE) {
                t = ContentTime::from_seconds (bet * av_q2d (s->time_base));
        }
@@ -223,6 +238,7 @@ FFmpegExaminer::frame_time (AVStream* s) const
        return t;
 }
 
+
 optional<double>
 FFmpegExaminer::video_frame_rate () const
 {
index 44ef3f0726d6be3d5b71e0046b1389e8f4e7641d..f8bd14e760280392dead846d66178e997465b5a9 100644 (file)
@@ -113,11 +113,13 @@ FFmpegFileEncoder::FFmpegFileEncoder (
                throw runtime_error ("could not create FFmpeg output audio stream");
        }
 
+DCPOMATIC_DISABLE_WARNINGS
        _video_stream->id = _video_stream_index;
        _video_stream->codec = _video_codec_context;
 
        _audio_stream->id = _audio_stream_index;
        _audio_stream->codec = _audio_codec_context;
+DCPOMATIC_ENABLE_WARNINGS
 
        if (avcodec_open2 (_video_codec_context, _video_codec, &_video_options) < 0) {
                throw runtime_error ("could not open FFmpeg video codec");
@@ -239,7 +241,9 @@ FFmpegFileEncoder::flush ()
                packet.size = 0;
 
                int got_packet;
+DCPOMATIC_DISABLE_WARNINGS
                avcodec_encode_video2 (_video_codec_context, &packet, 0, &got_packet);
+DCPOMATIC_ENABLE_WARNINGS
                if (got_packet) {
                        packet.stream_index = 0;
                        av_interleaved_write_frame (_format_context, &packet);
@@ -252,7 +256,9 @@ FFmpegFileEncoder::flush ()
                packet.data = 0;
                packet.size = 0;
 
+DCPOMATIC_DISABLE_WARNINGS
                avcodec_encode_audio2 (_audio_codec_context, &packet, 0, &got_packet);
+DCPOMATIC_ENABLE_WARNINGS
                if (got_packet) {
                        packet.stream_index = 0;
                        av_interleaved_write_frame (_format_context, &packet);
@@ -307,9 +313,11 @@ FFmpegFileEncoder::video (shared_ptr<PlayerVideo> video, DCPTime time)
        packet.size = 0;
 
        int got_packet;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_encode_video2 (_video_codec_context, &packet, frame, &got_packet) < 0) {
                throw EncodeError ("FFmpeg video encode failed");
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        if (got_packet && packet.size) {
                packet.stream_index = _video_stream_index;
@@ -403,9 +411,11 @@ FFmpegFileEncoder::audio_frame (int size)
        packet.size = 0;
 
        int got_packet;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_encode_audio2 (_audio_codec_context, &packet, frame, &got_packet) < 0) {
                throw EncodeError ("FFmpeg audio encode failed");
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        if (got_packet && packet.size) {
                packet.stream_index = _audio_stream_index;
index b54e29d4492c4e3ee1933777f72e5b9e1f932a48..f2b72059b9a013f59bad2c66e7ad56baa1dc207d 100644 (file)
@@ -86,7 +86,7 @@ avio_seek_wrapper (void* data, int64_t offset, int whence)
 int
 FFmpegImageProxy::avio_read (uint8_t* buffer, int const amount)
 {
-       int const to_do = min(int64_t(amount), _data.size() - _pos);
+       int const to_do = min(static_cast<int64_t>(amount), static_cast<int64_t>(_data.size()) - _pos);
        if (to_do == 0) {
                return AVERROR_EOF;
        }
@@ -115,6 +115,7 @@ FFmpegImageProxy::avio_seek (int64_t const pos, int whence)
        return _pos;
 }
 
+DCPOMATIC_DISABLE_WARNINGS
 
 ImageProxy::Result
 FFmpegImageProxy::image (optional<dcp::Size>) const
@@ -199,6 +200,8 @@ FFmpegImageProxy::image (optional<dcp::Size>) const
        return Result (_image, 0);
 }
 
+DCPOMATIC_ENABLE_WARNINGS
+
 void
 FFmpegImageProxy::add_metadata (xmlpp::Node* node) const
 {
index 74951fc64e1ef9bb076e5959cdd43dddd140e25f..91a8ecb6e6e5c5e17f0647ea181e574bb97c26b6 100644 (file)
@@ -45,6 +45,7 @@
 #include "image.h"
 #include "text_decoder.h"
 #include "job_manager.h"
+#include "warnings.h"
 #include <dcp/decrypted_kdm.h>
 #include <dcp/locale_convert.h>
 #include <dcp/util.h>
@@ -356,8 +357,10 @@ dcpomatic_setup ()
        SetUnhandledExceptionFilter(exception_handler);
 #endif
 
+DCPOMATIC_DISABLE_WARNINGS
        av_register_all ();
        avfilter_register_all ();
+DCPOMATIC_ENABLE_WARNINGS
 
 #ifdef DCPOMATIC_OSX
        /* Add our library directory to the libltdl search path so that
index 6075500e9d9148f5af103e9f56f6034dbdc3ab58..9b297c87bf63549e6736b1134e168c650bd1c026 100644 (file)
 
 */
 
-#include "video_filter_graph.h"
-#include "image.h"
 #include "compose.hpp"
+#include "image.h"
+#include "video_filter_graph.h"
+#include "warnings.h"
 extern "C" {
 #include <libavfilter/buffersrc.h>
 #include <libavfilter/buffersink.h>
@@ -51,6 +52,7 @@ VideoFilterGraph::process (AVFrame* frame)
 {
        list<pair<shared_ptr<Image>, int64_t> > images;
 
+DCPOMATIC_DISABLE_WARNINGS
        if (_copy) {
                images.push_back (make_pair (shared_ptr<Image> (new Image (frame)), av_frame_get_best_effort_timestamp (frame)));
        } else {
@@ -68,6 +70,7 @@ VideoFilterGraph::process (AVFrame* frame)
                        av_frame_unref (_frame);
                }
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        return images;
 }