00001 #include <stdio.h>
00002 #include <dirent.h>
00003 #include <dlfcn.h>
00004 #include "funcprotos.h"
00005 #include "quicktime.h"
00006
00007
00008 static int total_vcodecs = 0;
00009 static int total_acodecs = 0;
00010 static quicktime_codectable_t *vcodecs = NULL;
00011 static quicktime_codectable_t *acodecs = NULL;
00012
00013
00014
00015
00016 static int register_vcodec(void (*init_vcodec)(quicktime_video_map_t *))
00017 {
00018 total_vcodecs++;
00019 vcodecs = (quicktime_codectable_t *)realloc(vcodecs,
00020 total_vcodecs * sizeof(quicktime_codectable_t));
00021
00022 vcodecs[total_vcodecs - 1].init_vcodec = init_vcodec;
00023 return total_vcodecs - 1;
00024 }
00025
00026 static int register_acodec(void (*init_acodec)(quicktime_audio_map_t *))
00027 {
00028 total_acodecs++;
00029 acodecs = (quicktime_codectable_t *)realloc(acodecs,
00030 total_acodecs * sizeof(quicktime_codectable_t));
00031 acodecs[total_acodecs - 1].init_acodec = init_acodec;
00032 return total_acodecs - 1;
00033 }
00034
00035
00036
00037
00038 #include "ima4.h"
00039 #include "mp4a.h"
00040 #include "qtvorbis.h"
00041 #include "qtmp3.h"
00042 #include "rawaudio.h"
00043 #include "twos.h"
00044 #include "ulaw.h"
00045 #include "wma.h"
00046 #include "wmx2.h"
00047
00048 static void register_acodecs()
00049 {
00050 register_acodec(quicktime_init_codec_twos);
00051 register_acodec(quicktime_init_codec_rawaudio);
00052 register_acodec(quicktime_init_codec_ima4);
00053 register_acodec(quicktime_init_codec_mp4a);
00054 register_acodec(quicktime_init_codec_ulaw);
00055
00056 register_acodec(quicktime_init_codec_vorbis);
00057 register_acodec(quicktime_init_codec_mp3);
00058 register_acodec(quicktime_init_codec_wmx2);
00059 register_acodec(quicktime_init_codec_wmav1);
00060 register_acodec(quicktime_init_codec_wmav2);
00061 }
00062
00063
00064
00065
00066
00067 #include "qth264.h"
00068 #include "raw.h"
00069 #include "qtdv.h"
00070 #include "jpeg.h"
00071 #include "mpeg4.h"
00072 #include "qtpng.h"
00073 #include "rle.h"
00074 #include "v308.h"
00075 #include "v408.h"
00076 #include "v410.h"
00077 #include "yuv2.h"
00078 #include "yuv4.h"
00079 #include "yv12.h"
00080
00081 static void register_vcodecs()
00082 {
00083
00084 register_vcodec(quicktime_init_codec_raw);
00085
00086 register_vcodec(quicktime_init_codec_h264);
00087 register_vcodec(quicktime_init_codec_hv64);
00088 register_vcodec(quicktime_init_codec_divx);
00089 register_vcodec(quicktime_init_codec_hv60);
00090 register_vcodec(quicktime_init_codec_div5);
00091 register_vcodec(quicktime_init_codec_div3);
00092 register_vcodec(quicktime_init_codec_div3v2);
00093 register_vcodec(quicktime_init_codec_div3lower);
00094 register_vcodec(quicktime_init_codec_mp4v);
00095 register_vcodec(quicktime_init_codec_xvid);
00096 register_vcodec(quicktime_init_codec_svq1);
00097 register_vcodec(quicktime_init_codec_svq3);
00098 register_vcodec(quicktime_init_codec_h263);
00099 register_vcodec(quicktime_init_codec_dv);
00100 register_vcodec(quicktime_init_codec_dvsd);
00101 register_vcodec(quicktime_init_codec_dvcp);
00102
00103 register_vcodec(quicktime_init_codec_jpeg);
00104 register_vcodec(quicktime_init_codec_mjpa);
00105 register_vcodec(quicktime_init_codec_mjpg);
00106 register_vcodec(quicktime_init_codec_png);
00107 register_vcodec(quicktime_init_codec_rle);
00108
00109 register_vcodec(quicktime_init_codec_yuv2);
00110 register_vcodec(quicktime_init_codec_2vuy);
00111 register_vcodec(quicktime_init_codec_yuv4);
00112 register_vcodec(quicktime_init_codec_yv12);
00113 register_vcodec(quicktime_init_codec_v410);
00114 register_vcodec(quicktime_init_codec_v308);
00115 register_vcodec(quicktime_init_codec_v408);
00116 }
00117
00118
00119
00120
00121 int quicktime_find_vcodec(quicktime_video_map_t *vtrack)
00122 {
00123 int i;
00124 char *compressor = vtrack->track->mdia.minf.stbl.stsd.table[0].format;
00125 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
00126 if(!total_vcodecs) register_vcodecs();
00127
00128 for(i = 0; i < total_vcodecs; i++)
00129 {
00130 quicktime_codectable_t *table = &vcodecs[i];
00131 table->init_vcodec(vtrack);
00132 if(quicktime_match_32(compressor, codec_base->fourcc))
00133 {
00134 return 0;
00135 }
00136 else
00137 {
00138 codec_base->delete_vcodec(vtrack);
00139 codec_base->priv = 0;
00140 }
00141 }
00142
00143 return -1;
00144 }
00145
00146
00147 int quicktime_find_acodec(quicktime_audio_map_t *atrack)
00148 {
00149 int i;
00150 char *compressor = atrack->track->mdia.minf.stbl.stsd.table[0].format;
00151 int compression_id = atrack->track->mdia.minf.stbl.stsd.table[0].compression_id;
00152 quicktime_codec_t *codec_base = (quicktime_codec_t*)atrack->codec;
00153 int32_t compressor_int = *(int32_t*)compressor;
00154 if(!total_acodecs) register_acodecs();
00155
00156 for(i = 0; i < total_acodecs; i++)
00157 {
00158 quicktime_codectable_t *table = &acodecs[i];
00159 table->init_acodec(atrack);
00160
00161
00162 if(quicktime_match_32(compressor, codec_base->fourcc))
00163 return 0;
00164 else
00165
00166
00167 if((compressor[0] == 0 || compressor_int == codec_base->wav_id) &&
00168 codec_base->wav_id == compression_id)
00169 return 0;
00170 else
00171 {
00172 codec_base->delete_acodec(atrack);
00173 codec_base->priv = 0;
00174 }
00175 }
00176
00177 return -1;
00178 }
00179
00180
00181 char* quicktime_acodec_title(char *fourcc)
00182 {
00183 int i;
00184 char *result = 0;
00185 quicktime_audio_map_t *atrack =
00186 (quicktime_audio_map_t*)calloc(1, sizeof(quicktime_audio_map_t));
00187 quicktime_codec_t *codec_base =
00188 atrack->codec =
00189 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
00190 int done = 0;
00191 if(!total_acodecs) register_acodecs();
00192 for(i = 0; i < total_acodecs && !done; i++)
00193 {
00194
00195 quicktime_codectable_t *table = &acodecs[i];
00196
00197 table->init_acodec(atrack);
00198
00199 if(quicktime_match_32(fourcc, codec_base->fourcc))
00200 {
00201 result = codec_base->title;
00202 done = 1;
00203 }
00204
00205 codec_base->delete_acodec(atrack);
00206
00207 }
00208 free(codec_base);
00209 free(atrack);
00210
00211 if(!result)
00212 return fourcc;
00213 else
00214 return result;
00215 }
00216
00217 char* quicktime_vcodec_title(char *fourcc)
00218 {
00219 int i;
00220 char *result = 0;
00221
00222 quicktime_video_map_t *vtrack =
00223 (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t));
00224 quicktime_codec_t *codec_base =
00225 vtrack->codec =
00226 (quicktime_codec_t*)calloc(1, sizeof(quicktime_codec_t));
00227 int done = 0;
00228
00229
00230 if(!total_vcodecs) register_vcodecs();
00231 for(i = 0; i < total_vcodecs && !done; i++)
00232 {
00233 quicktime_codectable_t *table = &vcodecs[i];
00234 table->init_vcodec(vtrack);
00235 if(quicktime_match_32(fourcc, codec_base->fourcc))
00236 {
00237 result = codec_base->title;
00238 done = 1;
00239 }
00240 codec_base->delete_vcodec(vtrack);
00241 }
00242
00243
00244
00245 free(codec_base);
00246 free(vtrack);
00247
00248 if(!result)
00249 return fourcc;
00250 else
00251 return result;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260