Code cleanup: unused/warnings
[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 #if 0  /* UNUSED */
123 const char *imb_ext_movie_qt[] = {
124         ".avi",   
125         ".flc",   
126         ".dv",    
127         ".r3d",   
128         ".mov",   
129         ".movie", 
130         ".mv",
131         NULL
132 };
133 #endif
134
135 const char *imb_ext_movie[] = {
136         ".avi",
137         ".flc",
138         ".mov",
139         ".movie",
140         ".mp4",
141         ".m4v",
142         ".m2v",
143         ".m2t",
144         ".m2ts",
145         ".mts",
146         ".ts",
147         ".mv",
148         ".avs",
149         ".wmv",
150         ".ogv",
151         ".ogg",
152         ".r3d",
153         ".dv",
154         ".mpeg",
155         ".mpg",
156         ".mpg2",
157         ".vob",
158         ".mkv",
159         ".flv",
160         ".divx",
161         ".xvid",
162         ".mxf",
163         ".webm",
164         NULL
165 };
166
167 /* sort of wrong being here... */
168 const char *imb_ext_audio[] = {
169         ".wav",
170         ".ogg",
171         ".oga",
172         ".mp3",
173         ".mp2",
174         ".ac3",
175         ".aac",
176         ".flac",
177         ".wma",
178         ".eac3",
179         ".aif",
180         ".aiff",
181         ".m4a",
182         NULL
183 };
184
185 int IMB_ispic(const char *name)
186 {
187         /* increased from 32 to 64 because of the bitmaps header size */
188 #define HEADER_SIZE 64
189
190         unsigned char buf[HEADER_SIZE];
191         ImFileType *type;
192         struct stat st;
193         int fp;
194
195         if (UTIL_DEBUG) printf("IMB_ispic_name: loading %s\n", name);
196         
197         if (BLI_stat(name, &st) == -1)
198                 return FALSE;
199         if (((st.st_mode) & S_IFMT) != S_IFREG)
200                 return FALSE;
201
202         if ((fp = BLI_open(name, O_BINARY | O_RDONLY, 0)) < 0)
203                 return FALSE;
204
205         memset(buf, 0, sizeof(buf));
206         if (read(fp, buf, HEADER_SIZE) <= 0) {
207                 close(fp);
208                 return FALSE;
209         }
210
211         close(fp);
212
213         /* XXX move this exception */
214         if ((BIG_LONG(((int *)buf)[0]) & 0xfffffff0) == 0xffd8ffe0)
215                 return JPG;
216
217         for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
218                 if (type->is_a) {
219                         if (type->is_a(buf)) {
220                                 return type->filetype;
221                         }
222                 }
223                 else if (type->is_a_filepath) {
224                         if (type->is_a_filepath(name)) {
225                                 return type->filetype;
226                         }
227                 }
228         }
229
230         return FALSE;
231
232 #undef HEADER_SIZE
233 }
234
235
236 static int isavi(const char *name)
237 {
238 #ifdef WITH_AVI
239         return AVI_is_avi(name);
240 #else
241         (void)name;
242         return FALSE;
243 #endif
244 }
245
246 #ifdef WITH_QUICKTIME
247 static int isqtime(const char *name)
248 {
249         return anim_is_quicktime(name);
250 }
251 #endif
252
253 #ifdef WITH_FFMPEG
254
255 #ifdef _MSC_VER
256 #define va_copy(dst, src) ((dst) = (src))
257 #endif
258
259 /* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
260 #ifdef __GNUC__
261 #  pragma GCC diagnostic push
262 #  pragma GCC diagnostic ignored "-Wmissing-format-attribute"
263 #endif
264
265 static char ffmpeg_last_error[1024];
266
267 static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_list arg)
268 {
269         if (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
270                 size_t n;
271                 va_list args_cpy;
272
273                 va_copy(args_cpy, arg);
274                 n = BLI_vsnprintf(ffmpeg_last_error, sizeof(ffmpeg_last_error), format, args_cpy);
275                 va_end(args_cpy);
276
277                 /* strip trailing \n */
278                 ffmpeg_last_error[n - 1] = '\0';
279         }
280
281         if (G.debug & G_DEBUG_FFMPEG) {
282                 /* call default logger to print all message to console */
283                 av_log_default_callback(ptr, level, format, arg);
284         }
285 }
286
287 #ifdef __GNUC__
288 #  pragma GCC diagnostic pop
289 #endif
290
291 void IMB_ffmpeg_init(void)
292 {
293         av_register_all();
294         avdevice_register_all();
295
296         ffmpeg_last_error[0] = '\0';
297
298         if (G.debug & G_DEBUG_FFMPEG)
299                 av_log_set_level(AV_LOG_DEBUG);
300
301         /* set own callback which could store last error to report to UI */
302         av_log_set_callback(ffmpeg_log_callback);
303 }
304
305 const char *IMB_ffmpeg_last_error(void)
306 {
307         return ffmpeg_last_error;
308 }
309
310 static int isffmpeg(const char *filename)
311 {
312         AVFormatContext *pFormatCtx = NULL;
313         unsigned int i;
314         int videoStream;
315         AVCodec *pCodec;
316         AVCodecContext *pCodecCtx;
317
318         if (BLI_testextensie_n(
319                 filename,
320                 ".swf", ".jpg", ".png", ".dds", ".tga", ".bmp", ".tif", ".exr", ".cin", ".wav", NULL))
321         {
322                 return 0;
323         }
324
325         if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
326                 if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_open_input_file failed\n");
327                 return 0;
328         }
329
330         if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
331                 if (UTIL_DEBUG) fprintf(stderr, "isffmpeg: avformat_find_stream_info failed\n");
332                 avformat_close_input(&pFormatCtx);
333                 return 0;
334         }
335
336         if (UTIL_DEBUG) av_dump_format(pFormatCtx, 0, filename, 0);
337
338
339         /* Find the first video stream */
340         videoStream = -1;
341         for (i = 0; i < pFormatCtx->nb_streams; i++)
342                 if (pFormatCtx->streams[i] &&
343                     pFormatCtx->streams[i]->codec &&
344                     (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
345                 {
346                         videoStream = i;
347                         break;
348                 }
349
350         if (videoStream == -1) {
351                 avformat_close_input(&pFormatCtx);
352                 return 0;
353         }
354
355         pCodecCtx = pFormatCtx->streams[videoStream]->codec;
356
357         /* Find the decoder for the video stream */
358         pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
359         if (pCodec == NULL) {
360                 avformat_close_input(&pFormatCtx);
361                 return 0;
362         }
363
364         if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
365                 avformat_close_input(&pFormatCtx);
366                 return 0;
367         }
368
369         avcodec_close(pCodecCtx);
370         avformat_close_input(&pFormatCtx);
371
372         return 1;
373 }
374 #endif
375
376 #ifdef WITH_REDCODE
377 static int isredcode(const char *filename)
378 {
379         struct redcode_handle *h = redcode_open(filename);
380         if (!h) {
381                 return 0;
382         }
383         redcode_close(h);
384         return 1;
385 }
386
387 #endif
388
389 int imb_get_anim_type(const char *name)
390 {
391         int type;
392         struct stat st;
393
394         if (UTIL_DEBUG) printf("in getanimtype: %s\n", name);
395
396 #ifndef _WIN32
397 #   ifdef WITH_QUICKTIME
398         if (isqtime(name)) return (ANIM_QTIME);
399 #   endif
400 #   ifdef WITH_FFMPEG
401         /* stat test below fails on large files > 4GB */
402         if (isffmpeg(name)) return (ANIM_FFMPEG);
403 #   endif
404         if (BLI_stat(name, &st) == -1) return(0);
405         if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
406
407         if (isavi(name)) return (ANIM_AVI);
408
409         if (ismovie(name)) return (ANIM_MOVIE);
410 #else
411         if (BLI_stat(name, &st) == -1) return(0);
412         if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
413
414         if (ismovie(name)) return (ANIM_MOVIE);
415 #   ifdef WITH_QUICKTIME
416         if (isqtime(name)) return (ANIM_QTIME);
417 #   endif
418 #   ifdef WITH_FFMPEG
419         if (isffmpeg(name)) return (ANIM_FFMPEG);
420 #   endif
421
422
423         if (isavi(name)) return (ANIM_AVI);
424 #endif
425 #ifdef WITH_REDCODE
426         if (isredcode(name)) return (ANIM_REDCODE);
427 #endif
428         type = IMB_ispic(name);
429         if (type) {
430                 return ANIM_SEQUENCE;
431         }
432
433         return ANIM_NONE;
434 }
435  
436 bool IMB_isanim(const char *filename)
437 {
438         int type;
439         
440         type = imb_get_anim_type(filename);
441         
442         return (type && type != ANIM_SEQUENCE);
443 }