b42656ee9cae98bac8640c76689e289991cfddf4
[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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size) {
42   if (from == to)
43         return buffer;
44     
45   if (from != AVI_FORMAT_RGB24 &&
46           to != AVI_FORMAT_RGB24)
47         return avi_format_convert(movie, stream, 
48                                   avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), 
49                                   AVI_FORMAT_RGB24, to, size);
50   
51   switch (to) {
52   case AVI_FORMAT_RGB24:
53         switch (from) {
54         case AVI_FORMAT_AVI_RGB:
55           buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size);
56           break;
57         case AVI_FORMAT_MJPEG:
58           buffer = avi_converter_from_mjpeg (movie, stream, buffer, size);
59           break;
60         case AVI_FORMAT_RGB32:
61           buffer = avi_converter_from_rgb32 (movie, stream, buffer, size);
62           break;
63         default:
64           break;
65         }
66         break;
67   case AVI_FORMAT_AVI_RGB:
68         buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size);
69         break;
70   case AVI_FORMAT_MJPEG:
71         buffer = avi_converter_to_mjpeg (movie, stream, buffer, size);
72         break;
73   case AVI_FORMAT_RGB32:
74         buffer = avi_converter_to_rgb32 (movie, stream, buffer, size);
75         break;
76   default:
77         break;
78   }
79
80   return buffer;
81 }
82
83 int avi_get_data_id (AviFormat format, int stream) {
84   char fcc[5];
85
86   if (avi_get_format_type (format) == FCC("vids"))
87         sprintf (fcc,"%2.2ddc",stream);
88   else if (avi_get_format_type (format) == FCC("auds"))
89         sprintf (fcc,"%2.2ddc",stream);
90   else
91         return 0;
92
93   return FCC(fcc);
94 }
95
96 int avi_get_format_type (AviFormat format) {
97   switch (format) {
98   case AVI_FORMAT_RGB24:
99   case AVI_FORMAT_RGB32:
100   case AVI_FORMAT_AVI_RGB:
101   case AVI_FORMAT_MJPEG:
102         return FCC("vids");
103         break;
104   default:
105         return 0;
106         break;
107   }
108 }
109
110 int avi_get_format_fcc (AviFormat format) {
111   switch (format) {
112   case AVI_FORMAT_RGB24:
113   case AVI_FORMAT_RGB32:
114   case AVI_FORMAT_AVI_RGB:
115         return FCC("DIB ");
116         break;
117   case AVI_FORMAT_MJPEG:
118         return FCC("MJPG");
119         break;
120   default:
121         return 0;
122         break;
123   }
124 }
125
126 int avi_get_format_compression (AviFormat format) {
127   switch (format) {
128   case AVI_FORMAT_RGB24:
129   case AVI_FORMAT_RGB32:
130   case AVI_FORMAT_AVI_RGB:
131         return 0;
132         break;
133   case AVI_FORMAT_MJPEG:
134         return FCC("MJPG");
135         break;
136   default:
137         return 0;
138         break;
139   }
140 }