diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-06-03 20:40:16 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-06-03 20:40:16 +0200 |
| commit | ab3be5fa1893bf1756627e1646b065c41e69336a (patch) | |
| tree | e9a768d04b974dfa1889d2a2a270f0283fea239c | |
| parent | 56062a84cca360881bfa3bd2b2254d451223d775 (diff) | |
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.
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 8 | ||||
| -rw-r--r-- | test/ffmpeg_decoder_error_test.cc | 48 | ||||
| -rw-r--r-- | test/wscript | 1 |
3 files changed, 55 insertions, 2 deletions
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 <cth@carlh.net> + + 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 <http://www.gnu.org/licenses/>. + +*/ + + +#include "lib/content.h" +#include "lib/content_factory.h" +#include "lib/dcpomatic_time.h" +#include "test.h" +#include <boost/test/unit_test.hpp> + + +/** @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 |
