2.5
[blender-staging.git] / source / blender / avi / intern / codecs.c
1 /**
2  * codecs.c
3  *
4  * This is external code. Identify and convert different avi-files.
5  *
6  * $Id$
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  */
33
34 #include "AVI_avi.h"
35 #include "avi_intern.h"
36
37 #include "avirgb.h"
38 #include "mjpeg.h"
39 #include "rgb32.h"
40
41 #ifdef HAVE_CONFIG_H
42 #include <config.h>
43 #endif
44
45 void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size) {
46   if (from == to)
47     return buffer;
48     
49   if (from != AVI_FORMAT_RGB24 &&
50       to != AVI_FORMAT_RGB24)
51     return avi_format_convert(movie, stream, 
52                               avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), 
53                               AVI_FORMAT_RGB24, to, size);
54   
55   switch (to) {
56   case AVI_FORMAT_RGB24:
57     switch (from) {
58     case AVI_FORMAT_AVI_RGB:
59       buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size);
60       break;
61     case AVI_FORMAT_MJPEG:
62       buffer = avi_converter_from_mjpeg (movie, stream, buffer, size);
63       break;
64     case AVI_FORMAT_RGB32:
65       buffer = avi_converter_from_rgb32 (movie, stream, buffer, size);
66       break;
67     default:
68       break;
69     }
70     break;
71   case AVI_FORMAT_AVI_RGB:
72     buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size);
73     break;
74   case AVI_FORMAT_MJPEG:
75     buffer = avi_converter_to_mjpeg (movie, stream, buffer, size);
76     break;
77   case AVI_FORMAT_RGB32:
78     buffer = avi_converter_to_rgb32 (movie, stream, buffer, size);
79     break;
80   default:
81     break;
82   }
83
84   return buffer;
85 }
86
87 int avi_get_data_id (AviFormat format, int stream) {
88   char fcc[5];
89
90   if (avi_get_format_type (format) == FCC("vids"))
91     sprintf (fcc,"%2.2ddc",stream);
92   else if (avi_get_format_type (format) == FCC("auds"))
93     sprintf (fcc,"%2.2ddc",stream);
94   else
95     return 0;
96
97   return FCC(fcc);
98 }
99
100 int avi_get_format_type (AviFormat format) {
101   switch (format) {
102   case AVI_FORMAT_RGB24:
103   case AVI_FORMAT_RGB32:
104   case AVI_FORMAT_AVI_RGB:
105   case AVI_FORMAT_MJPEG:
106     return FCC("vids");
107     break;
108   default:
109     return 0;
110     break;
111   }
112 }
113
114 int avi_get_format_fcc (AviFormat format) {
115   switch (format) {
116   case AVI_FORMAT_RGB24:
117   case AVI_FORMAT_RGB32:
118   case AVI_FORMAT_AVI_RGB:
119     return FCC("DIB ");
120     break;
121   case AVI_FORMAT_MJPEG:
122     return FCC("MJPG");
123     break;
124   default:
125     return 0;
126     break;
127   }
128 }
129
130 int avi_get_format_compression (AviFormat format) {
131   switch (format) {
132   case AVI_FORMAT_RGB24:
133   case AVI_FORMAT_RGB32:
134   case AVI_FORMAT_AVI_RGB:
135     return 0;
136     break;
137   case AVI_FORMAT_MJPEG:
138     return FCC("MJPG");
139     break;
140   default:
141     return 0;
142     break;
143   }
144 }