From e5ae44fe8287c6a5f91c8f9dfced7cb661f0d79b Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 28 Apr 2021 10:50:08 +0200 Subject: [PATCH] Tidy up some error handling a little. --- src/lib/exceptions.h | 8 ++++++++ src/lib/ffmpeg.cc | 7 ++++--- src/lib/ffmpeg_image_proxy.cc | 20 ++++++++++++-------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index c64f561a8..8bce0c8ab 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -44,6 +44,14 @@ public: explicit DecodeError (std::string s) : std::runtime_error (s) {} + + explicit DecodeError (std::string function, std::string caller) + : std::runtime_error (String::compose("%1 failed in %2", function, caller)) + {} + + explicit DecodeError (std::string function, std::string caller, int error) + : std::runtime_error (String::compose("%1 failed in %2 (%3)", function, caller, error)) + {} }; class CryptoError : public std::runtime_error diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index 7bb17f9bf..3de5da275 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -192,7 +192,7 @@ FFmpeg::setup_general () _frame = av_frame_alloc (); if (_frame == 0) { - throw DecodeError (N_("could not allocate frame")); + throw std::bad_alloc (); } } @@ -225,8 +225,9 @@ DCPOMATIC_DISABLE_WARNINGS /* Enable following of links in files */ av_dict_set_int (&options, "enable_drefs", 1, 0); - if (avcodec_open2 (context, codec, &options) < 0) { - throw DecodeError (N_("could not open decoder")); + int r = avcodec_open2 (context, codec, &options); + if (r < 0) { + throw DecodeError (N_("avcodec_open2"), N_("FFmpeg::setup_decoders"), r); } } else { dcpomatic_log->log (String::compose ("No codec found for stream %1", i), LogEntry::TYPE_WARNING); diff --git a/src/lib/ffmpeg_image_proxy.cc b/src/lib/ffmpeg_image_proxy.cc index d082a8ef7..5e3b725cf 100644 --- a/src/lib/ffmpeg_image_proxy.cc +++ b/src/lib/ffmpeg_image_proxy.cc @@ -124,6 +124,8 @@ DCPOMATIC_DISABLE_WARNINGS ImageProxy::Result FFmpegImageProxy::image (optional) const { + auto constexpr name_for_errors = "FFmpegImageProxy::image"; + boost::mutex::scoped_lock lm (_mutex); if (_image) { @@ -162,34 +164,36 @@ FFmpegImageProxy::image (optional) const } } - if (avformat_find_stream_info(format_context, 0) < 0) { - throw DecodeError (_("could not find stream information")); + int r = avformat_find_stream_info(format_context, 0); + if (r < 0) { + throw DecodeError (N_("avcodec_find_stream_info"), name_for_errors, r); } DCPOMATIC_ASSERT (format_context->nb_streams == 1); AVFrame* frame = av_frame_alloc (); if (!frame) { - throw DecodeError (N_("could not allocate frame")); + std::bad_alloc (); } AVCodecContext* codec_context = format_context->streams[0]->codec; AVCodec* codec = avcodec_find_decoder (codec_context->codec_id); DCPOMATIC_ASSERT (codec); - if (avcodec_open2 (codec_context, codec, 0) < 0) { - throw DecodeError (N_("could not open decoder")); + r = avcodec_open2 (codec_context, codec, 0); + if (r < 0) { + throw DecodeError (N_("avcodec_open2"), name_for_errors, r); } AVPacket packet; - int r = av_read_frame (format_context, &packet); + r = av_read_frame (format_context, &packet); if (r < 0) { - throw DecodeError (N_("could not read frame")); + throw DecodeError (N_("av_read_frame"), name_for_errors, r); } int frame_finished; if (avcodec_decode_video2(codec_context, frame, &frame_finished, &packet) < 0 || !frame_finished) { - throw DecodeError (N_("could not decode video")); + throw DecodeError (N_("avcodec_decode_video2"), name_for_errors, r); } AVPixelFormat const pix_fmt = static_cast(frame->format); -- 2.30.2