patch [#34103] use booleans for extensions testing.
[blender.git] / source / blender / imbuf / intern / util.c
index 92c10a094d370baa17abc15f52be029e15bfb3c7..68d1c906a1faba246c2c1c78f048cc770c9b47b0 100644 (file)
 
 
 #ifdef _WIN32
-#include <io.h>
-#define open _open
-#define read _read
-#define close _close
+#  include <io.h>
+#  define open _open
+#  define read _read
+#  define close _close
 #endif
 
-#include "BLI_blenlib.h"
+#include <stdlib.h>
+
+#include "BLI_utildefines.h"
+#include "BLI_path_util.h"
 #include "BLI_fileops.h"
+#include "BLI_string.h"
 
 #include "DNA_userdef_types.h"
 #include "BKE_global.h"
@@ -79,6 +83,7 @@ const char *imb_ext_image[] = {
 #endif
 #ifdef WITH_OPENJPEG
        ".jp2",
+       ".j2c",
 #endif
 #ifdef WITH_HDR
        ".hdr",
@@ -206,7 +211,12 @@ int IMB_ispic(const char *filename)
 
 static int isavi(const char *name)
 {
+#ifdef WITH_AVI
        return AVI_is_avi(name);
+#else
+       (void)name;
+       return FALSE;
+#endif
 }
 
 #ifdef WITH_QUICKTIME
@@ -218,31 +228,56 @@ static int isqtime(const char *name)
 
 #ifdef WITH_FFMPEG
 
-void silence_log_ffmpeg(int quiet)
+#ifdef _MSC_VER
+#define va_copy(dst, src) ((dst) = (src))
+#endif
+
+/* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
+#ifdef __GNUC__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wmissing-format-attribute"
+#endif
+
+static char ffmpeg_last_error[1024];
+
+static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_list arg)
 {
-       if (quiet) {
-               av_log_set_level(AV_LOG_QUIET);
+       if (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
+               size_t n;
+               va_list arg2;
+
+               va_copy(arg2, arg);
+
+               n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, arg2);
+
+               /* strip trailing \n */
+               ffmpeg_last_error[n - 1] = '\0';
        }
-       else {
-               av_log_set_level(AV_LOG_DEBUG);
+
+       if (G.debug & G_DEBUG_FFMPEG) {
+               /* call default logger to print all message to console */
+               av_log_default_callback(ptr, level, format, arg);
        }
 }
 
-extern void do_init_ffmpeg(void);
-void do_init_ffmpeg(void)
+#ifdef __GNUC__
+#  pragma GCC diagnostic pop
+#endif
+
+void IMB_ffmpeg_init(void)
 {
-       static int ffmpeg_init = 0;
-       if (!ffmpeg_init) {
-               ffmpeg_init = 1;
-               av_register_all();
-               avdevice_register_all();
-               if ((G.debug & G_DEBUG_FFMPEG) == 0) {
-                       silence_log_ffmpeg(1);
-               }
-               else {
-                       silence_log_ffmpeg(0);
-               }
-       }
+       av_register_all();
+       avdevice_register_all();
+
+       ffmpeg_last_error[0] = '\0';
+
+       /* set own callback which could store last error to report to UI */
+       av_log_set_callback(ffmpeg_log_callback);
+}
+
+const char *IMB_ffmpeg_last_error(void)
+{
+       return ffmpeg_last_error;
 }
 
 static int isffmpeg(const char *filename)
@@ -253,8 +288,6 @@ static int isffmpeg(const char *filename)
        AVCodec *pCodec;
        AVCodecContext *pCodecCtx;
 
-       do_init_ffmpeg();
-
        if (BLI_testextensie(filename, ".swf") ||
            BLI_testextensie(filename, ".jpg") ||
            BLI_testextensie(filename, ".png") ||
@@ -273,8 +306,8 @@ static int isffmpeg(const char *filename)
                return 0;
        }
 
-       if (av_find_stream_info(pFormatCtx) < 0) {
-               if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_find_stream_info failed\n");
+       if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
+               if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: avformat_find_stream_info failed\n");
                av_close_input_file(pFormatCtx);
                return 0;
        }
@@ -307,7 +340,7 @@ static int isffmpeg(const char *filename)
                return 0;
        }
 
-       if (avcodec_open(pCodecCtx, pCodec) < 0) {
+       if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
                av_close_input_file(pFormatCtx);
                return 0;
        }
@@ -396,7 +429,7 @@ int IMB_isanim(const char *filename)
                                type = imb_get_anim_type(filename);
                        }
                        else {
-                               return(FALSE);                  
+                               return(FALSE);
                        }
                }
                else { /* no quicktime */