r793: Small API addon, so plugins can 'see' camera and projector automation
[cinelerra_cv/mob.git] / quicktime / plugin.c
blob557d40d4ce06267b7fb71e16aaff4194f54f955e
1 #include <stdio.h>
2 #include <dirent.h>
3 #include <dlfcn.h>
4 #include "funcprotos.h"
5 #include "quicktime.h"
8 static int total_vcodecs = 0;
9 static int total_acodecs = 0;
10 static quicktime_codectable_t *vcodecs = NULL;
11 static quicktime_codectable_t *acodecs = NULL;
16 static int register_vcodec(void (*init_vcodec)(quicktime_video_map_t *))
18 total_vcodecs++;
19 vcodecs = (quicktime_codectable_t *)realloc(vcodecs,
20 total_vcodecs * sizeof(quicktime_codectable_t));
22 vcodecs[total_vcodecs - 1].init_vcodec = init_vcodec;
23 return total_vcodecs - 1;
26 static int register_acodec(void (*init_acodec)(quicktime_audio_map_t *))
28 total_acodecs++;
29 acodecs = (quicktime_codectable_t *)realloc(acodecs,
30 total_acodecs * sizeof(quicktime_codectable_t));
31 acodecs[total_acodecs - 1].init_acodec = init_acodec;
32 return total_acodecs - 1;
38 #include "ima4.h"
39 #include "mp4a.h"
40 #include "qtvorbis.h"
41 #include "qtmp3.h"
42 #include "rawaudio.h"
43 #include "twos.h"
44 #include "ulaw.h"
45 #include "wma.h"
46 #include "wmx2.h"
48 static void register_acodecs()
50 register_acodec(quicktime_init_codec_twos);
51 register_acodec(quicktime_init_codec_rawaudio);
52 register_acodec(quicktime_init_codec_ima4);
53 register_acodec(quicktime_init_codec_mp4a);
54 register_acodec(quicktime_init_codec_ulaw);
56 register_acodec(quicktime_init_codec_vorbis);
57 register_acodec(quicktime_init_codec_mp3);
58 register_acodec(quicktime_init_codec_wmx2);
59 register_acodec(quicktime_init_codec_wmav1);
60 register_acodec(quicktime_init_codec_wmav2);
67 #include "qth264.h"
68 #include "raw.h"
69 #include "qtdv.h"
70 #include "jpeg.h"
71 #include "mpeg4.h"
72 #include "qtpng.h"
73 #include "rle.h"
74 #include "v308.h"
75 #include "v408.h"
76 #include "v410.h"
77 #include "yuv2.h"
78 #include "yuv4.h"
79 #include "yv12.h"
81 static void register_vcodecs()
84 register_vcodec(quicktime_init_codec_raw);
86 register_vcodec(quicktime_init_codec_h264);
87 register_vcodec(quicktime_init_codec_hv64);
88 register_vcodec(quicktime_init_codec_divx);
89 register_vcodec(quicktime_init_codec_hv60);
90 register_vcodec(quicktime_init_codec_div5);
91 register_vcodec(quicktime_init_codec_div3);
92 register_vcodec(quicktime_init_codec_div3lower);
93 register_vcodec(quicktime_init_codec_mp4v);
94 register_vcodec(quicktime_init_codec_xvid);
95 register_vcodec(quicktime_init_codec_svq1);
96 register_vcodec(quicktime_init_codec_svq3);
97 register_vcodec(quicktime_init_codec_h263);
98 register_vcodec(quicktime_init_codec_dv);
99 register_vcodec(quicktime_init_codec_dvsd);
101 register_vcodec(quicktime_init_codec_jpeg);
102 register_vcodec(quicktime_init_codec_mjpa);
103 register_vcodec(quicktime_init_codec_mjpg);
104 register_vcodec(quicktime_init_codec_png);
105 register_vcodec(quicktime_init_codec_rle);
107 register_vcodec(quicktime_init_codec_yuv2);
108 register_vcodec(quicktime_init_codec_yuv4);
109 register_vcodec(quicktime_init_codec_yv12);
110 register_vcodec(quicktime_init_codec_v410);
111 register_vcodec(quicktime_init_codec_v308);
112 register_vcodec(quicktime_init_codec_v408);
118 int quicktime_find_vcodec(quicktime_video_map_t *vtrack)
120 int i;
121 char *compressor = vtrack->track->mdia.minf.stbl.stsd.table[0].format;
122 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
123 if(!total_vcodecs) register_vcodecs();
125 for(i = 0; i < total_vcodecs; i++)
127 quicktime_codectable_t *table = &vcodecs[i];
128 table->init_vcodec(vtrack);
129 if(quicktime_match_32(compressor, codec_base->fourcc))
131 return 0;
133 else
135 codec_base->delete_vcodec(vtrack);
136 codec_base->priv = 0;
140 return -1;
144 int quicktime_find_acodec(quicktime_audio_map_t *atrack)
146 int i;
147 char *compressor = atrack->track->mdia.minf.stbl.stsd.table[0].format;
148 int compression_id = atrack->track->mdia.minf.stbl.stsd.table[0].compression_id;
149 quicktime_codec_t *codec_base = (quicktime_codec_t*)atrack->codec;
150 int32_t compressor_int = *(int32_t*)compressor;
151 if(!total_acodecs) register_acodecs();
153 for(i = 0; i < total_acodecs; i++)
155 quicktime_codectable_t *table = &acodecs[i];
156 table->init_acodec(atrack);
158 // For writing and reading Quicktime
159 if(quicktime_match_32(compressor, codec_base->fourcc))
160 return 0;
161 else
162 // For reading AVI, sometimes the fourcc is 0 and the compression_id is used instead.
163 // Sometimes the compression_id is the fourcc.
164 if((compressor[0] == 0 || compressor_int == codec_base->wav_id) &&
165 codec_base->wav_id == compression_id)
166 return 0;
167 else
169 codec_base->delete_acodec(atrack);
170 codec_base->priv = 0;
174 return -1;
178 char* quicktime_acodec_title(char *fourcc)
180 int i;
181 char *result = 0;
182 quicktime_audio_map_t *atrack =
183 (quicktime_audio_map_t*)calloc(1, sizeof(quicktime_audio_map_t));
184 quicktime_codec_t *codec_base =
185 atrack->codec =
186 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
187 int done = 0;
188 if(!total_acodecs) register_acodecs();
189 for(i = 0; i < total_acodecs && !done; i++)
191 //printf("quicktime_acodec_title 1\n");
192 quicktime_codectable_t *table = &acodecs[i];
193 //printf("quicktime_acodec_title 2\n");
194 table->init_acodec(atrack);
195 //printf("quicktime_acodec_title 3\n");
196 if(quicktime_match_32(fourcc, codec_base->fourcc))
198 result = codec_base->title;
199 done = 1;
201 //printf("quicktime_acodec_title 4\n");
202 codec_base->delete_acodec(atrack);
203 //printf("quicktime_acodec_title 5\n");
205 free(codec_base);
206 free(atrack);
208 if(!result)
209 return fourcc;
210 else
211 return result;
214 char* quicktime_vcodec_title(char *fourcc)
216 int i;
217 char *result = 0;
219 quicktime_video_map_t *vtrack =
220 (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t));
221 quicktime_codec_t *codec_base =
222 vtrack->codec =
223 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
224 int done = 0;
227 if(!total_vcodecs) register_vcodecs();
228 for(i = 0; i < total_vcodecs && !done; i++)
230 quicktime_codectable_t *table = &vcodecs[i];
231 table->init_vcodec(vtrack);
232 if(quicktime_match_32(fourcc, codec_base->fourcc))
234 result = codec_base->title;
235 done = 1;
237 codec_base->delete_vcodec(vtrack);
242 free(codec_base);
243 free(vtrack);
245 if(!result)
246 return fourcc;
247 else
248 return result;