4 #include "funcprotos.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
*))
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
*))
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;
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
);
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
)
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
))
135 codec_base
->delete_vcodec(vtrack
);
136 codec_base
->priv
= 0;
144 int quicktime_find_acodec(quicktime_audio_map_t
*atrack
)
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
))
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
)
169 codec_base
->delete_acodec(atrack
);
170 codec_base
->priv
= 0;
178 char* quicktime_acodec_title(char *fourcc
)
182 quicktime_audio_map_t
*atrack
=
183 (quicktime_audio_map_t
*)calloc(1, sizeof(quicktime_audio_map_t
));
184 quicktime_codec_t
*codec_base
=
186 (quicktime_codec_t
*)calloc(1, sizeof(quicktime_codec_t
));
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
;
201 //printf("quicktime_acodec_title 4\n");
202 codec_base
->delete_acodec(atrack
);
203 //printf("quicktime_acodec_title 5\n");
214 char* quicktime_vcodec_title(char *fourcc
)
219 quicktime_video_map_t
*vtrack
=
220 (quicktime_video_map_t
*)calloc(1, sizeof(quicktime_video_map_t
));
221 quicktime_codec_t
*codec_base
=
223 (quicktime_codec_t
*)calloc(1, sizeof(quicktime_codec_t
));
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
;
237 codec_base
->delete_vcodec(vtrack
);