r936: Sane default sample zoom...
[cinelerra_cv/mob.git] / quicktime / plugin.c
blobc7d3fad8bf76d4d16ee006c340ab9c7b5d072fe6
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);
100 register_vcodec(quicktime_init_codec_dvcp);
102 register_vcodec(quicktime_init_codec_jpeg);
103 register_vcodec(quicktime_init_codec_mjpa);
104 register_vcodec(quicktime_init_codec_mjpg);
105 register_vcodec(quicktime_init_codec_png);
106 register_vcodec(quicktime_init_codec_rle);
108 register_vcodec(quicktime_init_codec_yuv2);
109 register_vcodec(quicktime_init_codec_2vuy);
110 register_vcodec(quicktime_init_codec_yuv4);
111 register_vcodec(quicktime_init_codec_yv12);
112 register_vcodec(quicktime_init_codec_v410);
113 register_vcodec(quicktime_init_codec_v308);
114 register_vcodec(quicktime_init_codec_v408);
120 int quicktime_find_vcodec(quicktime_video_map_t *vtrack)
122 int i;
123 char *compressor = vtrack->track->mdia.minf.stbl.stsd.table[0].format;
124 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
125 if(!total_vcodecs) register_vcodecs();
127 for(i = 0; i < total_vcodecs; i++)
129 quicktime_codectable_t *table = &vcodecs[i];
130 table->init_vcodec(vtrack);
131 if(quicktime_match_32(compressor, codec_base->fourcc))
133 return 0;
135 else
137 codec_base->delete_vcodec(vtrack);
138 codec_base->priv = 0;
142 return -1;
146 int quicktime_find_acodec(quicktime_audio_map_t *atrack)
148 int i;
149 char *compressor = atrack->track->mdia.minf.stbl.stsd.table[0].format;
150 int compression_id = atrack->track->mdia.minf.stbl.stsd.table[0].compression_id;
151 quicktime_codec_t *codec_base = (quicktime_codec_t*)atrack->codec;
152 int32_t compressor_int = *(int32_t*)compressor;
153 if(!total_acodecs) register_acodecs();
155 for(i = 0; i < total_acodecs; i++)
157 quicktime_codectable_t *table = &acodecs[i];
158 table->init_acodec(atrack);
160 // For writing and reading Quicktime
161 if(quicktime_match_32(compressor, codec_base->fourcc))
162 return 0;
163 else
164 // For reading AVI, sometimes the fourcc is 0 and the compression_id is used instead.
165 // Sometimes the compression_id is the fourcc.
166 if((compressor[0] == 0 || compressor_int == codec_base->wav_id) &&
167 codec_base->wav_id == compression_id)
168 return 0;
169 else
171 codec_base->delete_acodec(atrack);
172 codec_base->priv = 0;
176 return -1;
180 char* quicktime_acodec_title(char *fourcc)
182 int i;
183 char *result = 0;
184 quicktime_audio_map_t *atrack =
185 (quicktime_audio_map_t*)calloc(1, sizeof(quicktime_audio_map_t));
186 quicktime_codec_t *codec_base =
187 atrack->codec =
188 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
189 int done = 0;
190 if(!total_acodecs) register_acodecs();
191 for(i = 0; i < total_acodecs && !done; i++)
193 //printf("quicktime_acodec_title 1\n");
194 quicktime_codectable_t *table = &acodecs[i];
195 //printf("quicktime_acodec_title 2\n");
196 table->init_acodec(atrack);
197 //printf("quicktime_acodec_title 3\n");
198 if(quicktime_match_32(fourcc, codec_base->fourcc))
200 result = codec_base->title;
201 done = 1;
203 //printf("quicktime_acodec_title 4\n");
204 codec_base->delete_acodec(atrack);
205 //printf("quicktime_acodec_title 5\n");
207 free(codec_base);
208 free(atrack);
210 if(!result)
211 return fourcc;
212 else
213 return result;
216 char* quicktime_vcodec_title(char *fourcc)
218 int i;
219 char *result = 0;
221 quicktime_video_map_t *vtrack =
222 (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t));
223 quicktime_codec_t *codec_base =
224 vtrack->codec =
225 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
226 int done = 0;
229 if(!total_vcodecs) register_vcodecs();
230 for(i = 0; i < total_vcodecs && !done; i++)
232 quicktime_codectable_t *table = &vcodecs[i];
233 table->init_vcodec(vtrack);
234 if(quicktime_match_32(fourcc, codec_base->fourcc))
236 result = codec_base->title;
237 done = 1;
239 codec_base->delete_vcodec(vtrack);
244 free(codec_base);
245 free(vtrack);
247 if(!result)
248 return fourcc;
249 else
250 return result;