]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/ffmpeg_error.h
2.0. Updated namespaces.
[casparcg] / modules / ffmpeg / ffmpeg_error.h
index c66f9e4b71994ff84f33e006f340ab2ca8f5a46d..017b13c75f5dd10d41ccca413e8d43c6b17f0874 100644 (file)
@@ -1,5 +1,7 @@
 #pragma once\r
 \r
+#include <common/exception/exceptions.h>\r
+\r
 #include <string>\r
 \r
 #pragma warning(push, 1)\r
@@ -11,7 +13,9 @@ extern "C"
 \r
 #pragma warning(pop)\r
 \r
-namespace caspar {\r
+namespace caspar { namespace ffmpeg {\r
+\r
+struct ffmpeg_error : virtual caspar_exception{};\r
 \r
 static std::string av_error_str(int errn)\r
 {\r
@@ -22,4 +26,34 @@ static std::string av_error_str(int errn)
        return std::string(buf);\r
 }\r
 \r
-}
\ No newline at end of file
+#define THROW_ON_ERROR(ret, source, func)                                                      \\r
+       if(ret < 0)                                                                                                             \\r
+       {                                                                                                                               \\r
+               BOOST_THROW_EXCEPTION(                                                                          \\r
+                       ffmpeg_error() <<                                                                               \\r
+                       msg_info(av_error_str(ret)) <<                                                  \\r
+                       source_info(narrow(source)) <<                                                  \\r
+                       boost::errinfo_api_function(func) <<                                    \\r
+                       boost::errinfo_errno(AVUNERROR(ret)));                                  \\r
+       }\r
+\r
+#define THROW_ON_ERROR_STR_(call) #call\r
+#define THROW_ON_ERROR_STR(call) THROW_ON_ERROR_STR_(call)\r
+\r
+#define THROW_ON_ERROR2(call, source)                                                                          \\r
+       [&]() -> int                                                                                                                    \\r
+       {                                                                                                                                               \\r
+               int ret = call;                                                                                                         \\r
+               if(ret < 0)                                                                                                                     \\r
+               {                                                                                                                                       \\r
+                       BOOST_THROW_EXCEPTION(                                                                                  \\r
+                               ffmpeg_error() <<                                                                                       \\r
+                               msg_info(av_error_str(ret)) <<                                                          \\r
+                               source_info(narrow(source)) <<                                                          \\r
+                               boost::errinfo_api_function(THROW_ON_ERROR_STR(call)) <<        \\r
+                               boost::errinfo_errno(AVUNERROR(ret)));                                          \\r
+               }                                                                                                                                       \\r
+               return ret;                                                                                                                     \\r
+       }();\r
+\r
+}}
\ No newline at end of file