Move allocation of imbuf from array to allocimbuf.
[blender.git] / source / blender / imbuf / intern / util.c
index fe138a71a4a4200f19bed77636ffa2d573f51a25..32100aa2288bc9ff033b5c45510d79f1e32349cb 100644 (file)
 
 #ifdef _WIN32
 #  include <io.h>
-#  define open _open
-#  define read _read
-#  define close _close
 #endif
 
 #include <stdlib.h>
 
+#include "BLI_utildefines.h"
 #include "BLI_path_util.h"
 #include "BLI_fileops.h"
-#include "BLI_utildefines.h"
 #include "BLI_string.h"
 
-#include "DNA_userdef_types.h"
 #include "BKE_global.h"
 
 #include "imbuf.h"
@@ -97,6 +93,16 @@ const char *imb_ext_image[] = {
 #endif
 #ifdef WITH_OPENEXR
        ".exr",
+#endif
+#ifdef WITH_OPENIMAGEIO
+       ".psd", ".pdd", ".psb",
+#endif
+       NULL
+};
+
+const char *imb_ext_image_filepath_only[] = {
+#ifdef WITH_OPENIMAGEIO
+       ".psd", ".pdd", ".psb",
 #endif
        NULL
 };
@@ -110,6 +116,19 @@ const char *imb_ext_image_qt[] = {
        NULL
 };
 
+#if 0  /* UNUSED */
+const char *imb_ext_movie_qt[] = {
+       ".avi",   
+       ".flc",   
+       ".dv",    
+       ".r3d",   
+       ".mov",   
+       ".movie", 
+       ".mv",
+       NULL
+};
+#endif
+
 const char *imb_ext_movie[] = {
        ".avi",
        ".flc",
@@ -121,10 +140,13 @@ const char *imb_ext_movie[] = {
        ".m2t",
        ".m2ts",
        ".mts",
+       ".ts",
        ".mv",
        ".avs",
        ".wmv",
        ".ogv",
+       ".ogg",
+       ".r3d",
        ".dv",
        ".mpeg",
        ".mpg",
@@ -135,6 +157,7 @@ const char *imb_ext_movie[] = {
        ".divx",
        ".xvid",
        ".mxf",
+       ".webm",
        NULL
 };
 
@@ -153,61 +176,64 @@ const char *imb_ext_audio[] = {
        ".aif",
        ".aiff",
        ".m4a",
+       ".mka",
        NULL
 };
 
-static int IMB_ispic_name(const char *name)
+int IMB_ispic_type(const char *name)
 {
+       /* increased from 32 to 64 because of the bitmaps header size */
+#define HEADER_SIZE 64
+
+       unsigned char buf[HEADER_SIZE];
        ImFileType *type;
-       struct stat st;
-       int fp, buf[10];
+       BLI_stat_t st;
+       int fp;
 
        if (UTIL_DEBUG) printf("IMB_ispic_name: loading %s\n", name);
        
-       if (stat(name, &st) == -1)
-               return FALSE;
+       if (BLI_stat(name, &st) == -1)
+               return false;
        if (((st.st_mode) & S_IFMT) != S_IFREG)
-               return FALSE;
+               return false;
 
-       if ((fp = BLI_open(name, O_BINARY | O_RDONLY, 0)) < 0)
-               return FALSE;
+       if ((fp = BLI_open(name, O_BINARY | O_RDONLY, 0)) == -1)
+               return false;
 
-       if (read(fp, buf, 32) != 32) {
+       memset(buf, 0, sizeof(buf));
+       if (read(fp, buf, HEADER_SIZE) <= 0) {
                close(fp);
-               return FALSE;
+               return false;
        }
 
        close(fp);
 
        /* XXX move this exception */
-       if ((BIG_LONG(buf[0]) & 0xfffffff0) == 0xffd8ffe0)
+       if ((BIG_LONG(((int *)buf)[0]) & 0xfffffff0) == 0xffd8ffe0)
                return JPG;
 
-       for (type = IMB_FILE_TYPES; type->is_a; type++)
-               if (type->is_a((uchar *)buf))
-                       return type->filetype;
-
-       return FALSE;
-}
-
-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)))
-               {
-                       return IMB_ispic_name(filename);
+       for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
+               if (type->is_a) {
+                       if (type->is_a(buf)) {
+                               return type->filetype;
+                       }
                }
-               else {
-                       return FALSE;
+               else if (type->is_a_filepath) {
+                       if (type->is_a_filepath(name)) {
+                               return type->filetype;
+                       }
                }
        }
-       else { /* no FILTERFILEEXTS */
-               return IMB_ispic_name(filename);
-       }
-}
 
+       return 0;
+
+#undef HEADER_SIZE
+}
 
+bool IMB_ispic(const char *name)
+{
+       return (IMB_ispic_type(name) != 0);
+}
 
 static int isavi(const char *name)
 {
@@ -215,7 +241,7 @@ static int isavi(const char *name)
        return AVI_is_avi(name);
 #else
        (void)name;
-       return FALSE;
+       return false;
 #endif
 }
 
@@ -229,15 +255,22 @@ static int isqtime(const char *name)
 #ifdef WITH_FFMPEG
 
 /* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wmissing-format-attribute"
+#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 (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
-               size_t n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, arg);
+               size_t n;
+               va_list args_cpy;
+
+               va_copy(args_cpy, arg);
+               n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, args_cpy);
+               va_end(args_cpy);
 
                /* strip trailing \n */
                ffmpeg_last_error[n - 1] = '\0';
@@ -249,7 +282,9 @@ static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_lis
        }
 }
 
-#pragma GCC diagnostic pop
+#ifdef __GNUC__
+#  pragma GCC diagnostic pop
+#endif
 
 void IMB_ffmpeg_init(void)
 {
@@ -258,6 +293,9 @@ void IMB_ffmpeg_init(void)
 
        ffmpeg_last_error[0] = '\0';
 
+       if (G.debug & G_DEBUG_FFMPEG)
+               av_log_set_level(AV_LOG_DEBUG);
+
        /* set own callback which could store last error to report to UI */
        av_log_set_callback(ffmpeg_log_callback);
 }
@@ -275,15 +313,9 @@ static int isffmpeg(const char *filename)
        AVCodec *pCodec;
        AVCodecContext *pCodecCtx;
 
-       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"))
+       if (BLI_testextensie_n(
+               filename,
+               ".swf", ".jpg", ".png", ".dds", ".tga", ".bmp", ".tif", ".exr", ".cin", ".wav", NULL))
        {
                return 0;
        }
@@ -293,9 +325,9 @@ 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");
-               av_close_input_file(pFormatCtx);
+       if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
+               if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: avformat_find_stream_info failed\n");
+               avformat_close_input(&pFormatCtx);
                return 0;
        }
 
@@ -314,7 +346,7 @@ static int isffmpeg(const char *filename)
                }
 
        if (videoStream == -1) {
-               av_close_input_file(pFormatCtx);
+               avformat_close_input(&pFormatCtx);
                return 0;
        }
 
@@ -323,17 +355,17 @@ static int isffmpeg(const char *filename)
        /* Find the decoder for the video stream */
        pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
        if (pCodec == NULL) {
-               av_close_input_file(pFormatCtx);
+               avformat_close_input(&pFormatCtx);
                return 0;
        }
 
-       if (avcodec_open(pCodecCtx, pCodec) < 0) {
-               av_close_input_file(pFormatCtx);
+       if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
+               avformat_close_input(&pFormatCtx);
                return 0;
        }
 
        avcodec_close(pCodecCtx);
-       av_close_input_file(pFormatCtx);
+       avformat_close_input(&pFormatCtx);
 
        return 1;
 }
@@ -355,7 +387,7 @@ static int isredcode(const char *filename)
 int imb_get_anim_type(const char *name)
 {
        int type;
-       struct stat st;
+       BLI_stat_t st;
 
        if (UTIL_DEBUG) printf("in getanimtype: %s\n", name);
 
@@ -399,42 +431,11 @@ int imb_get_anim_type(const char *name)
        return ANIM_NONE;
 }
  
-int IMB_isanim(const char *filename)
+bool IMB_isanim(const char *filename)
 {
        int type;
        
-       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"))
-                       {
-                               type = imb_get_anim_type(filename);
-                       }
-                       else {
-                               return(FALSE);
-                       }
-               }
-               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 {
-                               return(FALSE);
-                       }
-               }
-       }
-       else { /* no FILTERFILEEXTS */
-               type = imb_get_anim_type(filename);
-       }
+       type = imb_get_anim_type(filename);
        
        return (type && type != ANIM_SEQUENCE);
 }