patch [#34103] use booleans for extensions testing.
[blender.git] / source / blender / imbuf / intern / util.c
index 9c5b39e180d487ccfd8c67a383006d3aa4605874..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"
@@ -78,6 +83,7 @@ const char *imb_ext_image[] = {
 #endif
 #ifdef WITH_OPENJPEG
        ".jp2",
+       ".j2c",
 #endif
 #ifdef WITH_HDR
        ".hdr",
@@ -92,7 +98,8 @@ const char *imb_ext_image[] = {
 #ifdef WITH_OPENEXR
        ".exr",
 #endif
-       NULL};
+       NULL
+};
 
 const char *imb_ext_image_qt[] = {
        ".gif",
@@ -100,7 +107,8 @@ const char *imb_ext_image_qt[] = {
        ".pct", ".pict",
        ".pntg",
        ".qtif",
-       NULL};
+       NULL
+};
 
 const char *imb_ext_movie[] = {
        ".avi",
@@ -127,7 +135,8 @@ const char *imb_ext_movie[] = {
        ".divx",
        ".xvid",
        ".mxf",
-       NULL};
+       NULL
+};
 
 /* sort of wrong being here... */
 const char *imb_ext_audio[] = {
@@ -144,7 +153,8 @@ const char *imb_ext_audio[] = {
        ".aif",
        ".aiff",
        ".m4a",
-       NULL};
+       NULL
+};
 
 static int IMB_ispic_name(const char *name)
 {
@@ -154,12 +164,12 @@ static int IMB_ispic_name(const char *name)
 
        if (UTIL_DEBUG) printf("IMB_ispic_name: loading %s\n", name);
        
-       if (stat(name,&st) == -1)
+       if (stat(name, &st) == -1)
                return FALSE;
        if (((st.st_mode) & S_IFMT) != S_IFREG)
                return FALSE;
 
-       if ((fp = BLI_open(name,O_BINARY|O_RDONLY, 0)) < 0)
+       if ((fp = BLI_open(name, O_BINARY | O_RDONLY, 0)) < 0)
                return FALSE;
 
        if (read(fp, buf, 32) != 32) {
@@ -173,8 +183,8 @@ static int IMB_ispic_name(const char *name)
        if ((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0)
                return JPG;
 
-       for (type=IMB_FILE_TYPES; type->is_a; type++)
-               if (type->is_a((uchar*)buf))
+       for (type = IMB_FILE_TYPES; type->is_a; type++)
+               if (type->is_a((uchar *)buf))
                        return type->filetype;
 
        return FALSE;
@@ -183,12 +193,12 @@ static int IMB_ispic_name(const char *name)
 int IMB_ispic(const char *filename)
 {
        if (U.uiflag & USER_FILTERFILEEXTS) {
-               if (    (BLI_testextensie_array(filename, imb_ext_image)) ||
-                       (G.have_quicktime && BLI_testextensie_array(filename, imb_ext_image_qt))
-               {
+               if ((BLI_testextensie_array(filename, imb_ext_image)) ||
+                   (G.have_quicktime && BLI_testextensie_array(filename, imb_ext_image_qt)))
+               {
                        return IMB_ispic_name(filename);
                }
-               else  {
+               else {
                        return FALSE;
                }
        }
@@ -199,74 +209,105 @@ int IMB_ispic(const char *filename)
 
 
 
-static int isavi (const char *name)
+static int isavi(const char *name)
 {
-       return AVI_is_avi (name);
+#ifdef WITH_AVI
+       return AVI_is_avi(name);
+#else
+       (void)name;
+       return FALSE;
+#endif
 }
 
 #ifdef WITH_QUICKTIME
-static int isqtime (const char *name)
+static int isqtime(const char *name)
 {
-       return anim_is_quicktime (name);
+       return anim_is_quicktime(name);
 }
 #endif
 
 #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);
 }
 
-static int isffmpeg (const char *filename)
+const char *IMB_ffmpeg_last_error(void)
 {
-       AVFormatContext *pFormatCtx;
+       return ffmpeg_last_error;
+}
+
+static int isffmpeg(const char *filename)
+{
+       AVFormatContext *pFormatCtx = NULL;
        unsigned int i;
        int videoStream;
        AVCodec *pCodec;
        AVCodecContext *pCodecCtx;
 
-       do_init_ffmpeg();
-
-       if ( BLI_testextensie(filename, ".swf") ||
-               BLI_testextensie(filename, ".jpg") ||
-               BLI_testextensie(filename, ".png") ||
-               BLI_testextensie(filename, ".dds") ||
-               BLI_testextensie(filename, ".tga") ||
-               BLI_testextensie(filename, ".bmp") ||
-               BLI_testextensie(filename, ".exr") ||
-               BLI_testextensie(filename, ".cin") ||
-               BLI_testextensie(filename, ".wav")) return 0;
+       if (BLI_testextensie(filename, ".swf") ||
+           BLI_testextensie(filename, ".jpg") ||
+           BLI_testextensie(filename, ".png") ||
+           BLI_testextensie(filename, ".dds") ||
+           BLI_testextensie(filename, ".tga") ||
+           BLI_testextensie(filename, ".bmp") ||
+           BLI_testextensie(filename, ".exr") ||
+           BLI_testextensie(filename, ".cin") ||
+           BLI_testextensie(filename, ".wav"))
+       {
+               return 0;
+       }
 
-       if (av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) {
+       if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
                if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_open_input_file failed\n");
                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;
        }
@@ -274,32 +315,32 @@ static int isffmpeg (const char *filename)
        if (UTIL_DEBUG) av_dump_format(pFormatCtx, 0, filename, 0);
 
 
-               /* Find the first video stream */
-       videoStream=-1;
-       for (i=0; i<pFormatCtx->nb_streams; i++)
+       /* Find the first video stream */
+       videoStream = -1;
+       for (i = 0; i < pFormatCtx->nb_streams; i++)
                if (pFormatCtx->streams[i] &&
-                  pFormatCtx->streams[i]->codec && 
-                 (pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO))
+                   pFormatCtx->streams[i]->codec &&
+                   (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
                {
-                       videoStream=i;
+                       videoStream = i;
                        break;
                }
 
-       if (videoStream==-1) {
+       if (videoStream == -1) {
                av_close_input_file(pFormatCtx);
                return 0;
        }
 
        pCodecCtx = pFormatCtx->streams[videoStream]->codec;
 
-               /* Find the decoder for the video stream */
-       pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
-       if (pCodec==NULL) {
+       /* Find the decoder for the video stream */
+       pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
+       if (pCodec == NULL) {
                av_close_input_file(pFormatCtx);
                return 0;
        }
 
-       if (avcodec_open(pCodecCtx, pCodec)<0) {
+       if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
                av_close_input_file(pFormatCtx);
                return 0;
        }
@@ -312,9 +353,9 @@ static int isffmpeg (const char *filename)
 #endif
 
 #ifdef WITH_REDCODE
-static int isredcode(const char * filename)
+static int isredcode(const char *filename)
 {
-       struct redcode_handle * h = redcode_open(filename);
+       struct redcode_handle *h = redcode_open(filename);
        if (!h) {
                return 0;
        }
@@ -324,7 +365,7 @@ static int isredcode(const char * filename)
 
 #endif
 
-int imb_get_anim_type(const char * name)
+int imb_get_anim_type(const char *name)
 {
        int type;
        struct stat st;
@@ -332,38 +373,43 @@ int imb_get_anim_type(const char * name)
        if (UTIL_DEBUG) printf("in getanimtype: %s\n", name);
 
 #ifndef _WIN32
-#      ifdef WITH_QUICKTIME
+#   ifdef WITH_QUICKTIME
        if (isqtime(name)) return (ANIM_QTIME);
-#      endif
-#      ifdef WITH_FFMPEG
+#   endif
+#   ifdef WITH_FFMPEG
        /* stat test below fails on large files > 4GB */
        if (isffmpeg(name)) return (ANIM_FFMPEG);
-#      endif
-       if (stat(name,&st) == -1) return(0);
+#   endif
+       if (BLI_stat(name, &st) == -1) return(0);
        if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
 
        if (isavi(name)) return (ANIM_AVI);
 
        if (ismovie(name)) return (ANIM_MOVIE);
 #else
-       if (stat(name,&st) == -1) return(0);
+       if (BLI_stat(name, &st) == -1) return(0);
        if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
 
        if (ismovie(name)) return (ANIM_MOVIE);
-#      ifdef WITH_QUICKTIME
+#   ifdef WITH_QUICKTIME
        if (isqtime(name)) return (ANIM_QTIME);
-#      endif
-#      ifdef WITH_FFMPEG
+#   endif
+#   ifdef WITH_FFMPEG
        if (isffmpeg(name)) return (ANIM_FFMPEG);
-#      endif
+#   endif
+
+
        if (isavi(name)) return (ANIM_AVI);
 #endif
 #ifdef WITH_REDCODE
        if (isredcode(name)) return (ANIM_REDCODE);
 #endif
        type = IMB_ispic(name);
-       if (type) return(ANIM_SEQUENCE);
-       return(0);
+       if (type) {
+               return ANIM_SEQUENCE;
+       }
+
+       return ANIM_NONE;
 }
  
 int IMB_isanim(const char *filename)
@@ -372,34 +418,36 @@ int IMB_isanim(const char *filename)
        
        if (U.uiflag & USER_FILTERFILEEXTS) {
                if (G.have_quicktime) {
-                       if (            BLI_testextensie(filename, ".avi")
-                               ||      BLI_testextensie(filename, ".flc")
-                               ||      BLI_testextensie(filename, ".dv")
-                               ||      BLI_testextensie(filename, ".r3d")
-                               ||      BLI_testextensie(filename, ".mov")
-                               ||      BLI_testextensie(filename, ".movie")
-                               ||      BLI_testextensie(filename, ".mv")) {
+                       if (BLI_testextensie(filename, ".avi")   ||
+                           BLI_testextensie(filename, ".flc")   ||
+                           BLI_testextensie(filename, ".dv")    ||
+                           BLI_testextensie(filename, ".r3d")   ||
+                           BLI_testextensie(filename, ".mov")   ||
+                           BLI_testextensie(filename, ".movie") ||
+                           BLI_testextensie(filename, ".mv"))
+                       {
                                type = imb_get_anim_type(filename);
                        }
                        else {
-                               return(FALSE);                  
+                               return(FALSE);
                        }
                }
-               else { // no quicktime
-                       if (            BLI_testextensie(filename, ".avi")
-                               ||      BLI_testextensie(filename, ".dv")
-                               ||      BLI_testextensie(filename, ".r3d")
-                               ||      BLI_testextensie(filename, ".mv")) {
+               else { /* no quicktime */
+                       if (BLI_testextensie(filename, ".avi") ||
+                           BLI_testextensie(filename, ".dv")  ||
+                           BLI_testextensie(filename, ".r3d") ||
+                           BLI_testextensie(filename, ".mv"))
+                       {
                                type = imb_get_anim_type(filename);
                        }
-                       else  {
+                       else {
                                return(FALSE);
                        }
                }
        }
-       else { // no FILTERFILEEXTS
+       else { /* no FILTERFILEEXTS */
                type = imb_get_anim_type(filename);
        }
        
-       return (type && type!=ANIM_SEQUENCE);
+       return (type && type != ANIM_SEQUENCE);
 }