add h264 lossless, ru po upd, add ydiff, ffmpeg cmdl/xfer fixes, build upgrades,...
[goodguy/history.git] / cinelerra-5.1 / guicast / bccmodels.C
1 /*
2  * This library is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU Lesser General Public License as published
4  * by the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This library is distributed in the hope that it will be useful, but
8  * WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  * Lesser General Public License for more details.
11  *
12  * You should have received a copy of the GNU Lesser General Public
13  * License along with this library; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
15  * USA
16  */
17
18
19
20 #include "bccmodels.h"
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 int BC_CModels::is_planar(int colormodel)
26 {
27         switch(colormodel) {
28         case BC_YUV420P:
29         case BC_YUV420PI:
30         case BC_YUV422P:
31         case BC_YUV444P:
32         case BC_YUV411P:
33         case BC_YUV410P:
34         case BC_RGB_FLOATP:
35         case BC_RGBA_FLOATP:  return 1;
36         }
37         return 0;
38 }
39
40 int BC_CModels::components(int colormodel)
41 {
42         switch(colormodel) {
43         case BC_A8:           return 1;
44         case BC_A16:          return 1;
45         case BC_A_FLOAT:      return 1;
46         case BC_RGB888:       return 3;
47         case BC_RGBA8888:     return 4;
48         case BC_RGB161616:    return 3;
49         case BC_RGBA16161616: return 4;
50         case BC_YUV888:       return 3;
51         case BC_YUVA8888:     return 4;
52         case BC_YUV161616:    return 3;
53         case BC_YUVA16161616: return 4;
54         case BC_AYUV16161616: return 4;
55         case BC_YUV101010:    return 3;
56         case BC_RGB_FLOAT:    return 3;
57         case BC_RGBA_FLOAT:   return 4;
58         case BC_RGB_FLOATP:   return 3;
59         case BC_RGBA_FLOATP:  return 4;
60         }
61         return 0;
62 }
63
64 int BC_CModels::calculate_pixelsize(int colormodel)
65 {
66         switch(colormodel) {
67         case BC_A8:           return 1;
68         case BC_A16:          return 2;
69         case BC_A_FLOAT:      return 4;
70         case BC_TRANSPARENCY: return 1;
71         case BC_COMPRESSED:   return 1;
72         case BC_RGB8:         return 1;
73         case BC_RGB565:       return 2;
74         case BC_BGR565:       return 2;
75         case BC_BGR888:       return 3;
76         case BC_BGR8888:      return 4;
77 // Working bitmaps are packed to simplify processing
78         case BC_RGB888:       return 3;
79         case BC_ARGB8888:     return 4;
80         case BC_ABGR8888:     return 4;
81         case BC_RGBA8888:     return 4;
82         case BC_RGB161616:    return 6;
83         case BC_RGBA16161616: return 8;
84         case BC_YUV888:       return 3;
85         case BC_YUVA8888:     return 4;
86         case BC_YUV161616:    return 6;
87         case BC_YUVA16161616: return 8;
88         case BC_AYUV16161616: return 8;
89         case BC_YUV101010:    return 4;
90         case BC_VYU888:       return 3;
91         case BC_UYVA8888:     return 4;
92         case BC_RGB_FLOAT:    return 12;
93         case BC_RGBA_FLOAT:   return 16;
94 // Planar
95         case BC_YUV420P:      return 1;
96         case BC_YUV420PI:     return 1;
97         case BC_YUV422P:      return 1;
98         case BC_YUV444P:      return 1;
99         case BC_YUV422:       return 2;
100         case BC_UVY422:       return 2;
101         case BC_YUV411P:      return 1;
102         case BC_YUV410P:      return 1;
103         case BC_RGB_FLOATP:   return 4;
104         case BC_RGBA_FLOATP:  return 4;
105         }
106         return 0;
107 }
108
109 int BC_CModels::calculate_max(int colormodel)
110 {
111         switch(colormodel) {
112 // Working bitmaps are packed to simplify processing
113         case BC_A8:           return 0xff;
114         case BC_A16:          return 0xffff;
115         case BC_A_FLOAT:      return 1;
116         case BC_RGB888:       return 0xff;
117         case BC_RGBA8888:     return 0xff;
118         case BC_RGB161616:    return 0xffff;
119         case BC_RGBA16161616: return 0xffff;
120         case BC_YUV888:       return 0xff;
121         case BC_YUVA8888:     return 0xff;
122         case BC_YUV161616:    return 0xffff;
123         case BC_YUVA16161616: return 0xffff;
124         case BC_AYUV16161616: return 0xffff;
125         case BC_RGB_FLOAT:    return 1;
126         case BC_RGBA_FLOAT:   return 1;
127         case BC_RGB_FLOATP:   return 1;
128         case BC_RGBA_FLOATP:  return 1;
129         }
130         return 0;
131 }
132
133 int BC_CModels::calculate_datasize(int w, int h, int bytes_per_line, int color_model)
134 {
135         switch(color_model) {
136         case BC_YUV410P: return w * h + w * h / 8 + 4;
137         case BC_YUV420P:
138         case BC_YUV420PI:
139         case BC_YUV411P: return w * h + w * h / 2 + 4;
140         case BC_YUV422P: return w * h * 2 + 4;
141         case BC_YUV444P: return w * h * 3 + 4;
142         case BC_RGB_FLOATP: return w * h * 3 * sizeof(float) + 4;
143         case BC_RGBA_FLOATP: return w * h * 4 * sizeof(float) + 4;
144         }
145         if( bytes_per_line < 0 )
146                 bytes_per_line = w * calculate_pixelsize(color_model);
147         return h * bytes_per_line + 4;
148 }
149
150 int BC_CModels::bc_to_x(int color_model)
151 {
152         switch(color_model) {
153         case BC_YUV420P: return FOURCC_YV12;
154         case BC_YUV422:  return FOURCC_YUV2;
155         case BC_UVY422:  return FOURCC_UYVY;
156         }
157         return -1;
158 }
159
160 void BC_CModels::to_text(char *string, int cmodel)
161 {
162         switch(cmodel) {
163         case BC_RGB888:       strcpy(string, "RGB-8 Bit");   break;
164         case BC_RGBA8888:     strcpy(string, "RGBA-8 Bit");  break;
165         case BC_RGB161616:    strcpy(string, "RGB-16 Bit");  break;
166         case BC_RGBA16161616: strcpy(string, "RGBA-16 Bit"); break;
167         case BC_YUV888:       strcpy(string, "YUV-8 Bit");   break;
168         case BC_YUVA8888:     strcpy(string, "YUVA-8 Bit");  break;
169         case BC_YUV161616:    strcpy(string, "YUV-16 Bit");  break;
170         case BC_YUVA16161616: strcpy(string, "YUVA-16 Bit"); break;
171         case BC_AYUV16161616: strcpy(string, "AYUV-16 Bit"); break;
172         case BC_RGB_FLOAT:    strcpy(string, "RGB-FLOAT");   break;
173         case BC_RGBA_FLOAT:   strcpy(string, "RGBA-FLOAT");  break;
174         case BC_RGB_FLOATP:   strcpy(string, "RGB-FLOATP");  break;
175         case BC_RGBA_FLOATP:  strcpy(string, "RGBA-FLOATP"); break;
176         default: strcpy(string, "RGB-8 Bit"); break;
177         }
178 }
179
180 int BC_CModels::from_text(const char *text)
181 {
182         if(!strcasecmp(text, "RGB-8 Bit"))   return BC_RGB888;
183         if(!strcasecmp(text, "RGBA-8 Bit"))  return BC_RGBA8888;
184         if(!strcasecmp(text, "RGB-16 Bit"))  return BC_RGB161616;
185         if(!strcasecmp(text, "RGBA-16 Bit")) return BC_RGBA16161616;
186         if(!strcasecmp(text, "RGB-FLOAT"))   return BC_RGB_FLOAT;
187         if(!strcasecmp(text, "RGBA-FLOAT"))  return BC_RGBA_FLOAT;
188         if(!strcasecmp(text, "RGB-FLOATP"))  return BC_RGB_FLOATP;
189         if(!strcasecmp(text, "RGBA-FLOATP")) return BC_RGBA_FLOATP;
190         if(!strcasecmp(text, "YUV-8 Bit"))   return BC_YUV888;
191         if(!strcasecmp(text, "YUVA-8 Bit"))  return BC_YUVA8888;
192         if(!strcasecmp(text, "YUV-16 Bit"))  return BC_YUV161616;
193         if(!strcasecmp(text, "YUVA-16 Bit")) return BC_YUVA16161616;
194         if(!strcasecmp(text, "AYUV-16 Bit")) return BC_AYUV16161616;
195         return BC_RGB888;
196 }
197
198 int BC_CModels::has_alpha(int colormodel)
199 {
200
201         switch(colormodel) {
202         case BC_RGBA8888:
203         case BC_ARGB8888:
204         case BC_ABGR8888:
205         case BC_RGBA16161616:
206         case BC_YUVA8888:
207         case BC_YUVA16161616:
208         case BC_UYVA8888:
209         case BC_RGBA_FLOAT:
210         case BC_RGBA_FLOATP:
211                 return 1;
212         }
213         return 0;
214 }
215
216 int BC_CModels::is_float(int colormodel)
217 {
218         switch(colormodel) {
219         case BC_RGB_FLOAT:
220         case BC_RGBA_FLOAT:
221         case BC_RGB_FLOATP:
222         case BC_RGBA_FLOATP:
223                 return 1;
224         }
225         return 0;
226 }
227
228 int BC_CModels::is_yuv(int colormodel)
229 {
230
231         switch(colormodel) {
232         case BC_YUV888:
233         case BC_YUVA8888:
234         case BC_YUV161616:
235         case BC_YUVA16161616:
236         case BC_AYUV16161616:
237         case BC_YUV422:
238         case BC_UVY422:
239         case BC_YUV101010:
240         case BC_VYU888:
241         case BC_UYVA8888:
242         case BC_YUV420P:
243         case BC_YUV420PI:
244         case BC_YUV422P:
245         case BC_YUV444P:
246         case BC_YUV411P:
247         case BC_YUV410P:
248                 return 1;
249         }
250         return 0;
251 }
252
253