From: Carl Hetherington Date: Thu, 3 Jun 2021 18:40:16 +0000 (+0200) Subject: Ignore errors from avcodec_receive_frame when flushing video (#2035). X-Git-Tag: v2.15.154~6 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=ab3be5fa1893bf1756627e1646b065c41e69336a Ignore errors from avcodec_receive_frame when flushing video (#2035). The test fails if we don't do this; it doesn't really seem 100% convincing but we are already doing this for audio. --- diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index db88562ea..c5c41fdac 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -548,9 +548,13 @@ FFmpegDecoder::decode_and_process_video_packet (AVPacket* packet) } r = avcodec_receive_frame (context, _frame); - if (r == AVERROR(EAGAIN) || r == AVERROR_EOF) { - /* More input is required, or no more frames are coming */ + if (r == AVERROR(EAGAIN) || r == AVERROR_EOF || (r < 0 && !packet)) { + /* More input is required, no more frames are coming, or we are flushing and there was + * some error which we just want to ignore. + */ return false; + } else if (r < 0) { + throw DecodeError (N_("avcodec_receive_frame"), N_("FFmpeg::decode_and_process_video_packet"), r); } /* We assume we'll only get one frame here, which I think is safe */ diff --git a/test/ffmpeg_decoder_error_test.cc b/test/ffmpeg_decoder_error_test.cc new file mode 100644 index 000000000..b3e9e4293 --- /dev/null +++ b/test/ffmpeg_decoder_error_test.cc @@ -0,0 +1,48 @@ +/* + Copyright (C) 2021 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "lib/content.h" +#include "lib/content_factory.h" +#include "lib/dcpomatic_time.h" +#include "test.h" +#include + + +/** @defgroup regression Tests to make sure that old bugs do not reappear */ + +/** @file test/ffmpeg_decoder_erro_test.cc + * @brief Check some bugs in the FFmpegDecoder + * @ingroup regression + */ + + +BOOST_AUTO_TEST_CASE (check_exception_during_flush) +{ + auto content = content_factory(TestPaths::private_data() / "3d_thx_broadway_2010_lossless.m2ts").front(); + auto film = new_test_film2 ("check_exception_during_flush", { content }); + + content->set_trim_start (dcpomatic::ContentTime(2310308)); + content->set_trim_end (dcpomatic::ContentTime(116020)); + + make_and_verify_dcp (film); +} + + diff --git a/test/wscript b/test/wscript index 6ef9ac752..5774ffebf 100644 --- a/test/wscript +++ b/test/wscript @@ -73,6 +73,7 @@ def build(bld): ffmpeg_audio_only_test.cc ffmpeg_audio_test.cc ffmpeg_dcp_test.cc + ffmpeg_decoder_error_test.cc ffmpeg_decoder_seek_test.cc ffmpeg_decoder_sequential_test.cc ffmpeg_encoder_test.cc