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
);
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
)
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
))
137 codec_base
->delete_vcodec(vtrack
);
138 codec_base
->priv
= 0;
146 int quicktime_find_acodec(quicktime_audio_map_t
*atrack
)
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
))
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
)
171 codec_base
->delete_acodec(atrack
);
172 codec_base
->priv
= 0;
180 char* quicktime_acodec_title(char *fourcc
)
184 quicktime_audio_map_t
*atrack
=
185 (quicktime_audio_map_t
*)calloc(1, sizeof(quicktime_audio_map_t
));
186 quicktime_codec_t
*codec_base
=
188 (quicktime_codec_t
*)calloc(1, sizeof(quicktime_codec_t
));
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
;
203 //printf("quicktime_acodec_title 4\n");
204 codec_base
->delete_acodec(atrack
);
205 //printf("quicktime_acodec_title 5\n");
216 char* quicktime_vcodec_title(char *fourcc
)
221 quicktime_video_map_t
*vtrack
=
222 (quicktime_video_map_t
*)calloc(1, sizeof(quicktime_video_map_t
));
223 quicktime_codec_t
*codec_base
=
225 (quicktime_codec_t
*)calloc(1, sizeof(quicktime_codec_t
));
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
;
239 codec_base
->delete_vcodec(vtrack
);