]> git.sesse.net Git - casparcg/blob - modules/ffmpeg/ffmpeg_error.h
b50efee452d29724529a99c4d652ee4a097c9fc2
[casparcg] / modules / ffmpeg / ffmpeg_error.h
1 #pragma once\r
2 \r
3 #include <common/exception/exceptions.h>\r
4 \r
5 #include <string>\r
6 \r
7 #pragma warning(push, 1)\r
8 \r
9 extern "C" \r
10 {\r
11 #include <libavutil/error.h>\r
12 }\r
13 \r
14 #pragma warning(pop)\r
15 \r
16 namespace caspar {\r
17 \r
18 struct ffmpeg_error : virtual caspar_exception{};\r
19 \r
20 static std::string av_error_str(int errn)\r
21 {\r
22         char buf[256];\r
23         memset(buf, 0, 256);\r
24         if(av_strerror(errn, buf, 256) < 0)\r
25                 return "";\r
26         return std::string(buf);\r
27 }\r
28 \r
29 #define THROW_ON_ERROR(ret, source, func)                                                       \\r
30         if(ret < 0)                                                                                                             \\r
31         {                                                                                                                               \\r
32                 BOOST_THROW_EXCEPTION(                                                                          \\r
33                         ffmpeg_error() <<                                                                               \\r
34                         msg_info(av_error_str(ret)) <<                                                  \\r
35                         source_info(narrow(source)) <<                                                  \\r
36                         boost::errinfo_api_function(func) <<                                    \\r
37                         boost::errinfo_errno(AVUNERROR(ret)));                                  \\r
38         }\r
39 \r
40 #define THROW_ON_ERROR_STR_(call) #call\r
41 #define THROW_ON_ERROR_STR(call) THROW_ON_ERROR_STR_(call)\r
42 \r
43 #define THROW_ON_ERROR2(call, source)                                                                           \\r
44         [&]() -> int                                                                                                                    \\r
45         {                                                                                                                                               \\r
46                 int ret = call;                                                                                                         \\r
47                 if(ret < 0)                                                                                                                     \\r
48                 {                                                                                                                                       \\r
49                         BOOST_THROW_EXCEPTION(                                                                                  \\r
50                                 ffmpeg_error() <<                                                                                       \\r
51                                 msg_info(av_error_str(ret)) <<                                                          \\r
52                                 source_info(narrow(source)) <<                                                          \\r
53                                 boost::errinfo_api_function(THROW_ON_ERROR_STR(call)) <<        \\r
54                                 boost::errinfo_errno(AVUNERROR(ret)));                                          \\r
55                 }                                                                                                                                       \\r
56                 return ret;                                                                                                                     \\r
57         }();\r
58 \r
59 }