12dfcc3a791fa79a8ced726d36949d4a2acec17f
[blender.git] / source / blender / imbuf / intern / util.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  * util.c
27  *
28  */
29
30 /** \file blender/imbuf/intern/util.c
31  *  \ingroup imbuf
32  */
33
34
35 #ifdef _WIN32
36 #  include <io.h>
37 #  define open _open
38 #  define read _read
39 #  define close _close
40 #endif
41
42 #include <stdlib.h>
43
44 #include "BLI_utildefines.h"
45 #include "BLI_path_util.h"
46 #include "BLI_fileops.h"
47 #include "BLI_string.h"
48
49 #include "BKE_global.h"
50
51 #include "imbuf.h"
52 #include "IMB_imbuf_types.h"
53 #include "IMB_imbuf.h"
54 #include "IMB_filetype.h"
55
56 #include "IMB_anim.h"
57
58 #ifdef WITH_QUICKTIME
59 #include "quicktime_import.h"
60 #endif
61
62 #ifdef WITH_FFMPEG
63 #include <libavcodec/avcodec.h>
64 #include <libavformat/avformat.h>
65 #include <libavdevice/avdevice.h>
66 #include <libavutil/log.h>
67
68 #include "ffmpeg_compat.h"
69
70 #endif
71
72 #define UTIL_DEBUG 0
73
74 const char *imb_ext_image[] = {
75         ".png",
76         ".tga",
77         ".bmp",
78         ".jpg", ".jpeg",
79         ".sgi", ".rgb", ".rgba",
80 #ifdef WITH_TIFF
81         ".tif", ".tiff", ".tx",
82 #endif
83 #ifdef WITH_OPENJPEG
84         ".jp2",
85         ".j2c",
86 #endif
87 #ifdef WITH_HDR
88         ".hdr",
89 #endif
90 #ifdef WITH_DDS
91         ".dds",
92 #endif
93 #ifdef WITH_CINEON
94         ".dpx",
95         ".cin",
96 #endif
97 #ifdef WITH_OPENEXR
98         ".exr",
99 #endif
100 #ifdef WITH_OPENIMAGEIO
101         ".psd", ".pdd", ".psb",
102 #endif
103         NULL
104 };
105
106 const char *imb_ext_image_filepath_only[] = {
107 #ifdef WITH_OPENIMAGEIO
108         ".psd", ".pdd", ".psb",
109 #endif
110         NULL
111 };
112
113 const char *imb_ext_image_qt[] = {
114         ".gif",
115         ".psd",
116         ".pct", ".pict",
117         ".pntg",
118         ".qtif",
119         NULL
120 };
121
122 const char *imb_ext_movie_qt[] = {
123         ".avi",   
124         ".flc",   
125         ".dv",    
126         ".r3d",   
127         ".mov",   
128         ".movie", 
129         ".mv",
130         NULL
131 };
132
133 const char *imb_ext_movie[] = {
134         ".avi",
135         ".flc",
136         ".mov",
137         ".movie",
138         ".mp4",
139         ".m4v",
140         ".m2v",
141         ".m2t",
142         ".m2ts",
143         ".mts",
144         ".ts",
145         ".mv",
146         ".avs",
147         ".wmv",
148         ".ogv",
149         ".ogg",
150         ".r3d",
151         ".dv",
152         ".mpeg",
153         ".mpg",
154         ".mpg2",
155         ".vob",
156         ".mkv",
157         ".flv",
158         ".divx",
159         ".xvid",
160         ".mxf",
161         ".webm",
162         NULL
163 };
164
165 /* sort of wrong being here... */
166 const char *imb_ext_audio[] = {
167         ".wav",
168         ".ogg",
169         ".oga",
170         ".mp3",
171         ".mp2",
172         ".ac3",
173         ".aac",
174         ".flac",
175         ".wma",
176         ".eac3",
177         ".aif",
178         ".aiff",
179         ".m4a",
180         NULL
181 };
182
183 int IMB_ispic(const char *name)
184 {
185         /* increased from 32 to 64 because of the bitmaps header size */
186 #define HEADER_SIZE 64
187
188         unsigned char buf[HEADER_SIZE];
189         ImFileType *type;
190         struct stat st;
191         int fp;
192
193         if (UTIL_DEBUG) printf("IMB_ispic_name: loading %s\n", name);
194         
195         if (BLI_stat(name, &st) == -1)
196                 return FALSE;
197         if (((st.st_mode) & S_IFMT) != S_IFREG)
198                 return FALSE;
199
200         if ((fp = BLI_open(name, O_BINARY | O_RDONLY, 0)) < 0)
201                 return FALSE;
202
203         memset(buf, 0, sizeof(buf));
204         if (read(fp, buf, HEADER_SIZE) <= 0) {
205                 close(fp);
206                 return FALSE;
207         }
208
209         close(fp);
210
211         /* XXX move this exception */
212         if ((BIG_LONG(((int *)buf)[0]) & 0xfffffff0) == 0xffd8ffe0)
213                 return JPG;
214
215         for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
216                 if (type->is_a) {
217                         if (type->is_a(buf)) {
218                                 return type->filetype;
219                         }
220                 }
221                 else if (type->is_a_filepath) {
222                         if (type->is_a_filepath(name)) {
223                                 return type->filetype;
224                         }
225                 }
226         }
227
228         return FALSE;
229
230 #undef HEADER_SIZE
231 }
232
233
234 static int isavi(const char *name)
235 {
236 #ifdef WITH_AVI
237         return AVI_is_avi(name);
238 #else
239         (void)name;
240         return FALSE;
241 #endif
242 }
243
244 #ifdef WITH_QUICKTIME
245 static int isqtime(const char *name)
246 {
247         return anim_is_quicktime(name);
248 }
249 #endif
250
251 #ifdef WITH_FFMPEG
252
253 #ifdef _MSC_VER
254 #define va_copy(dst, src) ((dst) = (src))
255 #endif
256
257 /* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
258 #ifdef __GNUC__
259 #  pragma GCC diagnostic push
260 #  pragma GCC diagnostic ignored "-Wmissing-format-attribute"
261 #endif
262
263 static char ffmpeg_last_error[1024];
264
265 static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_list arg)
266 {
267         if (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
268                 size_t n;
269                 va_list args_cpy;
270
271                 va_copy(args_cpy, arg);
272                 n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, args_cpy);
273                 va_end(args_cpy);
274
275                 /* strip trailing \n */
276                 ffmpeg_last_error[n - 1] = '\0';
277         }
278
279         if (G.debug & G_DEBUG_FFMPEG) {
280                 /* call default logger to print all message to console */
281                 av_log_default_callback(ptr, level, format, arg);
282         }
283 }
284
285 #ifdef __GNUC__
286 #  pragma GCC diagnostic pop
287 #endif
288
289 void IMB_ffmpeg_init(void)
290 {
291         av_register_all();
292         avdevice_register_all();
293
294         ffmpeg_last_error[0] = '\0';
295
296         if (G.debug & G_DEBUG_FFMPEG)
297                 av_log_set_level(AV_LOG_DEBUG);
298
299         /* set own callback which could store last error to report to UI */
300         av_log_set_callback(ffmpeg_log_callback);
301 }
302
303 const char *IMB_ffmpeg_last_error(void)
304 {
305         return ffmpeg_last_error;
306 }
307
308 static int isffmpeg(const char *filename)
309 {
310         AVFormatContext *pFormatCtx = NULL;
311         unsigned int i;
312         int videoStream;
313         AVCodec *pCodec;
314         AVCodecContext *pCodecCtx;
315
316         if (BLI_testextensie_n(
317                 filename,
318                 ".swf", ".jpg", ".png", ".dds", ".tga", ".bmp", ".tif", ".exr", ".cin", ".wav", NULL))
319         {
320                 return 0;
321         }
322
323         if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
324                 if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_open_input_file failed\n");
325                 return 0;
326         }
327
328         if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
329                 if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: avformat_find_stream_info failed\n");
330                 avformat_close_input(&pFormatCtx);
331                 return 0;
332         }
333
334         if (UTIL_DEBUG) av_dump_format(pFormatCtx, 0, filename, 0);
335
336
337         /* Find the first video stream */
338         videoStream = -1;
339         for (i = 0; i < pFormatCtx->nb_streams; i++)
340                 if (pFormatCtx->streams[i] &&
341                     pFormatCtx->streams[i]->codec &&
342                     (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
343                 {
344                         videoStream = i;
345                         break;
346                 }
347
348         if (videoStream == -1) {
349                 avformat_close_input(&pFormatCtx);
350                 return 0;
351         }
352
353         pCodecCtx = pFormatCtx->streams[videoStream]->codec;
354
355         /* Find the decoder for the video stream */
356         pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
357         if (pCodec == NULL) {
358                 avformat_close_input(&pFormatCtx);
359                 return 0;
360         }
361
362         if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
363                 avformat_close_input(&pFormatCtx);
364                 return 0;
365         }
366
367         avcodec_close(pCodecCtx);
368         avformat_close_input(&pFormatCtx);
369
370         return 1;
371 }
372 #endif
373
374 #ifdef WITH_REDCODE
375 static int isredcode(const char *filename)
376 {
377         struct redcode_handle *h = redcode_open(filename);
378         if (!h) {
379                 return 0;
380         }
381         redcode_close(h);
382         return 1;
383 }
384
385 #endif
386
387 int imb_get_anim_type(const char *name)
388 {
389         int type;
390         struct stat st;
391
392         if (UTIL_DEBUG) printf("in getanimtype: %s\n", name);
393
394 #ifndef _WIN32
395 #   ifdef WITH_QUICKTIME
396         if (isqtime(name)) return (ANIM_QTIME);
397 #   endif
398 #   ifdef WITH_FFMPEG
399         /* stat test below fails on large files > 4GB */
400         if (isffmpeg(name)) return (ANIM_FFMPEG);
401 #   endif
402         if (BLI_stat(name, &st) == -1) return(0);
403         if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
404
405         if (isavi(name)) return (ANIM_AVI);
406
407         if (ismovie(name)) return (ANIM_MOVIE);
408 #else
409         if (BLI_stat(name, &st) == -1) return(0);
410         if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
411
412         if (ismovie(name)) return (ANIM_MOVIE);
413 #   ifdef WITH_QUICKTIME
414         if (isqtime(name)) return (ANIM_QTIME);
415 #   endif
416 #   ifdef WITH_FFMPEG
417         if (isffmpeg(name)) return (ANIM_FFMPEG);
418 #   endif
419
420
421         if (isavi(name)) return (ANIM_AVI);
422 #endif
423 #ifdef WITH_REDCODE
424         if (isredcode(name)) return (ANIM_REDCODE);
425 #endif
426         type = IMB_ispic(name);
427         if (type) {
428                 return ANIM_SEQUENCE;
429         }
430
431         return ANIM_NONE;
432 }
433  
434 bool IMB_isanim(const char *filename)
435 {
436         int type;
437         
438         type = imb_get_anim_type(filename);
439         
440         return (type && type != ANIM_SEQUENCE);
441 }