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