From 863e2203fa69a4b5f17ef29a50510467d192fb44 Mon Sep 17 00:00:00 2001 From: Helge Norberg Date: Thu, 10 Nov 2016 11:45:31 +0100 Subject: [PATCH] [ffmpeg] Added missing contextual information when throwing ffmpeg exceptions --- modules/ffmpeg/ffmpeg_error.cpp | 202 ++++++++++++++++++++------------ 1 file changed, 127 insertions(+), 75 deletions(-) diff --git a/modules/ffmpeg/ffmpeg_error.cpp b/modules/ffmpeg/ffmpeg_error.cpp index de51f14f6..94100dea0 100644 --- a/modules/ffmpeg/ffmpeg_error.cpp +++ b/modules/ffmpeg/ffmpeg_error.cpp @@ -26,13 +26,13 @@ #pragma warning(disable: 4146) -extern "C" +extern "C" { #include } namespace caspar { namespace ffmpeg { - + std::string av_error_str(int errn) { char buf[256]; @@ -50,83 +50,135 @@ void throw_on_ffmpeg_error(int ret, const char* source, const char* func, const switch(ret) { case AVERROR_BSF_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_bsf_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + averror_bsf_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); case AVERROR_DECODER_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_decoder_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + averror_decoder_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); case AVERROR_DEMUXER_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_demuxer_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + averror_demuxer_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); case AVERROR_ENCODER_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_encoder_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_EOF: - ::boost::exception_detail::throw_exception_(averror_eof()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_EXIT: - ::boost::exception_detail::throw_exception_(averror_exit()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_FILTER_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_filter_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_MUXER_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_muxer_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_OPTION_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_option_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_PATCHWELCOME: - ::boost::exception_detail::throw_exception_(averror_patchwelcome()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); - case AVERROR_PROTOCOL_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_protocol_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + averror_encoder_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_EOF: + ::boost::exception_detail::throw_exception_( + averror_eof() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_EXIT: + ::boost::exception_detail::throw_exception_( + averror_exit() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_FILTER_NOT_FOUND: + ::boost::exception_detail::throw_exception_( + averror_filter_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_MUXER_NOT_FOUND: + ::boost::exception_detail::throw_exception_( + averror_muxer_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_OPTION_NOT_FOUND: + ::boost::exception_detail::throw_exception_( + averror_option_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_PATCHWELCOME: + ::boost::exception_detail::throw_exception_( + averror_patchwelcome() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); + case AVERROR_PROTOCOL_NOT_FOUND: + ::boost::exception_detail::throw_exception_( + averror_protocol_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); case AVERROR_STREAM_NOT_FOUND: - ::boost::exception_detail::throw_exception_(averror_stream_not_found()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + averror_stream_not_found() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); default: - ::boost::exception_detail::throw_exception_(ffmpeg_error()<< - msg_info(av_error_str(ret)) << - source_info(source) << - boost::errinfo_api_function(func) << - boost::errinfo_errno(AVUNERROR(ret)), local_func, file, line); + ::boost::exception_detail::throw_exception_( + ffmpeg_error() + << msg_info(av_error_str(ret)) + << source_info(source) + << boost::errinfo_api_function(func) + << boost::errinfo_errno(AVUNERROR(ret)) + << call_stack_info(caspar::get_call_stack()) + << context_info(get_context()), + local_func, file, line); } } @@ -135,4 +187,4 @@ void throw_on_ffmpeg_error(int ret, const std::wstring& source, const char* func throw_on_ffmpeg_error(ret, u8(source).c_str(), func, local_func, file, line); } -}} \ No newline at end of file +}} -- 2.39.2