Mercurial > libavformat.hg
comparison matroskadec.c @ 3642:842752a20c3c libavformat
matroskadec: use generic parser to parse tracks
author | aurel |
---|---|
date | Tue, 05 Aug 2008 00:40:31 +0000 |
parents | 2788411945cf |
children | 1dfa03e34d5b |
comparison
equal
deleted
inserted
replaced
3641:2788411945cf | 3642:842752a20c3c |
---|---|
86 uint64_t id_length; | 86 uint64_t id_length; |
87 char *doctype; | 87 char *doctype; |
88 uint64_t doctype_version; | 88 uint64_t doctype_version; |
89 } Ebml; | 89 } Ebml; |
90 | 90 |
91 typedef struct Track { | 91 typedef struct { |
92 MatroskaTrackType type; | 92 uint64_t algo; |
93 | 93 EbmlBin settings; |
94 /* Unique track number and track ID. stream_index is the index that | 94 } MatroskaTrackCompression; |
95 * the calling app uses for this track. */ | 95 |
96 uint32_t num; | 96 typedef struct { |
97 uint32_t uid; | 97 uint64_t scope; |
98 | 98 uint64_t type; |
99 char *name; | 99 MatroskaTrackCompression compression; |
100 char language[4]; | 100 } MatroskaTrackEncoding; |
101 | 101 |
102 char *codec_id; | 102 typedef struct { |
103 | 103 double frame_rate; |
104 unsigned char *codec_priv; | 104 uint64_t display_width; |
105 int codec_priv_size; | 105 uint64_t display_height; |
106 | 106 uint64_t pixel_width; |
107 uint64_t pixel_height; | |
108 uint64_t fourcc; | |
109 } MatroskaTrackVideo; | |
110 | |
111 typedef struct { | |
112 double samplerate; | |
113 double out_samplerate; | |
114 uint64_t bitdepth; | |
115 uint64_t channels; | |
116 | |
117 /* real audio header (extracted from extradata) */ | |
118 int coded_framesize; | |
119 int sub_packet_h; | |
120 int frame_size; | |
121 int sub_packet_size; | |
122 int sub_packet_cnt; | |
123 int pkt_cnt; | |
124 uint8_t *buf; | |
125 } MatroskaTrackAudio; | |
126 | |
127 typedef struct { | |
128 uint64_t num; | |
129 uint64_t type; | |
130 char *codec_id; | |
131 EbmlBin codec_priv; | |
132 char *language; | |
107 double time_scale; | 133 double time_scale; |
108 uint64_t default_duration; | 134 uint64_t default_duration; |
109 uint64_t flag_default; | 135 uint64_t flag_default; |
110 | 136 MatroskaTrackVideo video; |
111 int encoding_scope; | 137 MatroskaTrackAudio audio; |
112 MatroskaTrackEncodingCompAlgo encoding_algo; | 138 EbmlList encodings; |
113 uint8_t *encoding_settings; | |
114 int encoding_settings_len; | |
115 | 139 |
116 AVStream *stream; | 140 AVStream *stream; |
117 } MatroskaTrack; | 141 } MatroskaTrack; |
118 | |
119 typedef struct MatroskaVideoTrack { | |
120 MatroskaTrack track; | |
121 | |
122 int pixel_width; | |
123 int pixel_height; | |
124 int display_width; | |
125 int display_height; | |
126 | |
127 uint32_t fourcc; | |
128 | |
129 //.. | |
130 } MatroskaVideoTrack; | |
131 | |
132 typedef struct MatroskaAudioTrack { | |
133 MatroskaTrack track; | |
134 | |
135 int channels; | |
136 int bitdepth; | |
137 int internal_samplerate; | |
138 int samplerate; | |
139 int block_align; | |
140 | |
141 /* real audio header */ | |
142 int coded_framesize; | |
143 int sub_packet_h; | |
144 int frame_size; | |
145 int sub_packet_size; | |
146 int sub_packet_cnt; | |
147 int pkt_cnt; | |
148 uint8_t *buf; | |
149 //.. | |
150 } MatroskaAudioTrack; | |
151 | |
152 typedef struct MatroskaSubtitleTrack { | |
153 MatroskaTrack track; | |
154 //.. | |
155 } MatroskaSubtitleTrack; | |
156 | |
157 #define MAX_TRACK_SIZE (FFMAX3(sizeof(MatroskaVideoTrack), \ | |
158 sizeof(MatroskaAudioTrack), \ | |
159 sizeof(MatroskaSubtitleTrack))) | |
160 | 142 |
161 typedef struct { | 143 typedef struct { |
162 char *filename; | 144 char *filename; |
163 char *mime; | 145 char *mime; |
164 EbmlBin bin; | 146 EbmlBin bin; |
196 | 178 |
197 /* timescale in the file */ | 179 /* timescale in the file */ |
198 uint64_t time_scale; | 180 uint64_t time_scale; |
199 double duration; | 181 double duration; |
200 char *title; | 182 char *title; |
183 EbmlList tracks; | |
201 EbmlList attachments; | 184 EbmlList attachments; |
202 EbmlList chapters; | 185 EbmlList chapters; |
203 EbmlList index; | 186 EbmlList index; |
204 | 187 |
205 /* num_streams is the number of streams that av_new_stream() was called | 188 /* num_streams is the number of streams that av_new_stream() was called |
206 * for ( = that are available to the calling program). */ | 189 * for ( = that are available to the calling program). */ |
207 int num_tracks; | |
208 int num_streams; | 190 int num_streams; |
209 MatroskaTrack *tracks[MAX_STREAMS]; | |
210 | 191 |
211 /* cache for ID peeking */ | 192 /* cache for ID peeking */ |
212 uint32_t peek_id; | 193 uint32_t peek_id; |
213 | 194 |
214 /* byte position of the segment inside the stream */ | 195 /* byte position of the segment inside the stream */ |
257 { MATROSKA_ID_SEGMENTUID, EBML_NONE }, | 238 { MATROSKA_ID_SEGMENTUID, EBML_NONE }, |
258 { EBML_ID_VOID, EBML_NONE }, | 239 { EBML_ID_VOID, EBML_NONE }, |
259 { 0 } | 240 { 0 } |
260 }; | 241 }; |
261 | 242 |
243 static EbmlSyntax matroska_track_video[] = { | |
244 { MATROSKA_ID_VIDEOFRAMERATE, EBML_FLOAT,0, offsetof(MatroskaTrackVideo,frame_rate) }, | |
245 { MATROSKA_ID_VIDEODISPLAYWIDTH, EBML_UINT, 0, offsetof(MatroskaTrackVideo,display_width) }, | |
246 { MATROSKA_ID_VIDEODISPLAYHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo,display_height) }, | |
247 { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_width) }, | |
248 { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_height) }, | |
249 { MATROSKA_ID_VIDEOCOLORSPACE, EBML_UINT, 0, offsetof(MatroskaTrackVideo,fourcc) }, | |
250 { MATROSKA_ID_VIDEOFLAGINTERLACED,EBML_NONE }, | |
251 { MATROSKA_ID_VIDEOSTEREOMODE, EBML_NONE }, | |
252 { MATROSKA_ID_VIDEOASPECTRATIO, EBML_NONE }, | |
253 { EBML_ID_VOID, EBML_NONE }, | |
254 { 0 } | |
255 }; | |
256 | |
257 static EbmlSyntax matroska_track_audio[] = { | |
258 { MATROSKA_ID_AUDIOSAMPLINGFREQ, EBML_FLOAT,0, offsetof(MatroskaTrackAudio,samplerate), {.f=8000.0} }, | |
259 { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ,EBML_FLOAT,0,offsetof(MatroskaTrackAudio,out_samplerate) }, | |
260 { MATROSKA_ID_AUDIOBITDEPTH, EBML_UINT, 0, offsetof(MatroskaTrackAudio,bitdepth) }, | |
261 { MATROSKA_ID_AUDIOCHANNELS, EBML_UINT, 0, offsetof(MatroskaTrackAudio,channels), {.u=1} }, | |
262 { EBML_ID_VOID, EBML_NONE }, | |
263 { 0 } | |
264 }; | |
265 | |
266 static EbmlSyntax matroska_track_encoding_compression[] = { | |
267 { MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, offsetof(MatroskaTrackCompression,algo), {.u=0} }, | |
268 { MATROSKA_ID_ENCODINGCOMPSETTINGS,EBML_BIN, 0, offsetof(MatroskaTrackCompression,settings) }, | |
269 { EBML_ID_VOID, EBML_NONE }, | |
270 { 0 } | |
271 }; | |
272 | |
273 static EbmlSyntax matroska_track_encoding[] = { | |
274 { MATROSKA_ID_ENCODINGSCOPE, EBML_UINT, 0, offsetof(MatroskaTrackEncoding,scope), {.u=1} }, | |
275 { MATROSKA_ID_ENCODINGTYPE, EBML_UINT, 0, offsetof(MatroskaTrackEncoding,type), {.u=0} }, | |
276 { MATROSKA_ID_ENCODINGCOMPRESSION,EBML_NEST, 0, offsetof(MatroskaTrackEncoding,compression), {.n=matroska_track_encoding_compression} }, | |
277 { EBML_ID_VOID, EBML_NONE }, | |
278 { 0 } | |
279 }; | |
280 | |
281 static EbmlSyntax matroska_track_encodings[] = { | |
282 { MATROSKA_ID_TRACKCONTENTENCODING, EBML_NEST, sizeof(MatroskaTrackEncoding), offsetof(MatroskaTrack,encodings), {.n=matroska_track_encoding} }, | |
283 { EBML_ID_VOID, EBML_NONE }, | |
284 { 0 } | |
285 }; | |
286 | |
287 static EbmlSyntax matroska_track[] = { | |
288 { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, offsetof(MatroskaTrack,num) }, | |
289 { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack,type) }, | |
290 { MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack,codec_id) }, | |
291 { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, offsetof(MatroskaTrack,codec_priv) }, | |
292 { MATROSKA_ID_TRACKLANGUAGE, EBML_UTF8, 0, offsetof(MatroskaTrack,language), {.s="eng"} }, | |
293 { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) }, | |
294 { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} }, | |
295 { MATROSKA_ID_TRACKFLAGDEFAULT, EBML_UINT, 0, offsetof(MatroskaTrack,flag_default), {.u=1} }, | |
296 { MATROSKA_ID_TRACKVIDEO, EBML_NEST, 0, offsetof(MatroskaTrack,video), {.n=matroska_track_video} }, | |
297 { MATROSKA_ID_TRACKAUDIO, EBML_NEST, 0, offsetof(MatroskaTrack,audio), {.n=matroska_track_audio} }, | |
298 { MATROSKA_ID_TRACKCONTENTENCODINGS,EBML_NEST, 0, 0, {.n=matroska_track_encodings} }, | |
299 { MATROSKA_ID_TRACKUID, EBML_NONE }, | |
300 { MATROSKA_ID_TRACKNAME, EBML_NONE }, | |
301 { MATROSKA_ID_TRACKFLAGENABLED, EBML_NONE }, | |
302 { MATROSKA_ID_TRACKFLAGFORCED, EBML_NONE }, | |
303 { MATROSKA_ID_TRACKFLAGLACING, EBML_NONE }, | |
304 { MATROSKA_ID_CODECNAME, EBML_NONE }, | |
305 { MATROSKA_ID_CODECDECODEALL, EBML_NONE }, | |
306 { MATROSKA_ID_CODECINFOURL, EBML_NONE }, | |
307 { MATROSKA_ID_CODECDOWNLOADURL, EBML_NONE }, | |
308 { MATROSKA_ID_TRACKMINCACHE, EBML_NONE }, | |
309 { MATROSKA_ID_TRACKMAXCACHE, EBML_NONE }, | |
310 { EBML_ID_VOID, EBML_NONE }, | |
311 { 0 } | |
312 }; | |
313 | |
314 static EbmlSyntax matroska_tracks[] = { | |
315 { MATROSKA_ID_TRACKENTRY, EBML_NEST, sizeof(MatroskaTrack), offsetof(MatroskaDemuxContext,tracks), {.n=matroska_track} }, | |
316 { EBML_ID_VOID, EBML_NONE }, | |
317 { 0 } | |
318 }; | |
319 | |
262 static EbmlSyntax matroska_attachment[] = { | 320 static EbmlSyntax matroska_attachment[] = { |
263 { MATROSKA_ID_FILENAME, EBML_UTF8, 0, offsetof(MatroskaAttachement,filename) }, | 321 { MATROSKA_ID_FILENAME, EBML_UTF8, 0, offsetof(MatroskaAttachement,filename) }, |
264 { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, offsetof(MatroskaAttachement,mime) }, | 322 { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, offsetof(MatroskaAttachement,mime) }, |
265 { MATROSKA_ID_FILEDATA, EBML_BIN, 0, offsetof(MatroskaAttachement,bin) }, | 323 { MATROSKA_ID_FILEDATA, EBML_BIN, 0, offsetof(MatroskaAttachement,bin) }, |
266 { MATROSKA_ID_FILEUID, EBML_NONE }, | 324 { MATROSKA_ID_FILEUID, EBML_NONE }, |
824 | 882 |
825 static MatroskaTrack * | 883 static MatroskaTrack * |
826 matroska_find_track_by_num (MatroskaDemuxContext *matroska, | 884 matroska_find_track_by_num (MatroskaDemuxContext *matroska, |
827 int num) | 885 int num) |
828 { | 886 { |
887 MatroskaTrack *tracks = matroska->tracks.elem; | |
829 int i; | 888 int i; |
830 | 889 |
831 for (i = 0; i < matroska->num_tracks; i++) | 890 for (i=0; i < matroska->tracks.nb_elem; i++) |
832 if (matroska->tracks[i]->num == num) | 891 if (tracks[i].num == num) |
833 return matroska->tracks[i]; | 892 return &tracks[i]; |
834 | 893 |
835 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %d\n", num); | 894 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %d\n", num); |
836 return NULL; | 895 return NULL; |
837 } | 896 } |
838 | 897 |
1089 } | 1148 } |
1090 | 1149 |
1091 static int | 1150 static int |
1092 matroska_decode_buffer(uint8_t** buf, int* buf_size, MatroskaTrack *track) | 1151 matroska_decode_buffer(uint8_t** buf, int* buf_size, MatroskaTrack *track) |
1093 { | 1152 { |
1153 MatroskaTrackEncoding *encodings = track->encodings.elem; | |
1094 uint8_t* data = *buf; | 1154 uint8_t* data = *buf; |
1095 int isize = *buf_size; | 1155 int isize = *buf_size; |
1096 uint8_t* pkt_data = NULL; | 1156 uint8_t* pkt_data = NULL; |
1097 int pkt_size = isize; | 1157 int pkt_size = isize; |
1098 int result = 0; | 1158 int result = 0; |
1099 int olen; | 1159 int olen; |
1100 | 1160 |
1101 switch (track->encoding_algo) { | 1161 switch (encodings[0].compression.algo) { |
1102 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP: | 1162 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP: |
1103 return track->encoding_settings_len; | 1163 return encodings[0].compression.settings.size; |
1104 case MATROSKA_TRACK_ENCODING_COMP_LZO: | 1164 case MATROSKA_TRACK_ENCODING_COMP_LZO: |
1105 do { | 1165 do { |
1106 olen = pkt_size *= 3; | 1166 olen = pkt_size *= 3; |
1107 pkt_data = av_realloc(pkt_data, | 1167 pkt_data = av_realloc(pkt_data, |
1108 pkt_size+LZO_OUTPUT_PADDING); | 1168 pkt_size+LZO_OUTPUT_PADDING); |
1163 av_free(pkt_data); | 1223 av_free(pkt_data); |
1164 return -1; | 1224 return -1; |
1165 } | 1225 } |
1166 | 1226 |
1167 static int | 1227 static int |
1168 matroska_add_stream (MatroskaDemuxContext *matroska) | 1228 matroska_parse_tracks (MatroskaDemuxContext *matroska) |
1169 { | 1229 { |
1170 int res = 0; | 1230 MatroskaTrack *tracks; |
1171 uint32_t id; | 1231 int i, res; |
1172 MatroskaTrack *track; | 1232 |
1173 | 1233 res = ebml_parse(matroska, matroska_tracks, matroska, MATROSKA_ID_TRACKS, 0); |
1174 /* start with the master */ | 1234 |
1175 if ((res = ebml_read_master(matroska, &id)) < 0) | 1235 tracks = matroska->tracks.elem; |
1176 return res; | 1236 for (i=0; i<matroska->tracks.nb_elem; i++) { |
1177 | 1237 MatroskaTrack *track = &tracks[i]; |
1178 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing track, adding stream..,\n"); | 1238 EbmlList *encodings_list = &tracks->encodings; |
1179 | 1239 MatroskaTrackEncoding *encodings = encodings_list->elem; |
1180 /* Allocate a generic track. */ | 1240 |
1181 track = av_mallocz(MAX_TRACK_SIZE); | 1241 if (track->type != MATROSKA_TRACK_TYPE_VIDEO && |
1182 track->time_scale = 1.0; | 1242 track->type != MATROSKA_TRACK_TYPE_AUDIO && |
1183 strcpy(track->language, "eng"); | 1243 track->type != MATROSKA_TRACK_TYPE_SUBTITLE) { |
1184 | 1244 av_log(matroska->ctx, AV_LOG_INFO, |
1185 /* try reading the trackentry headers */ | 1245 "Unknown or unsupported track type %"PRIu64"\n", |
1186 while (res == 0) { | 1246 track->type); |
1187 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | 1247 continue; |
1188 res = AVERROR(EIO); | 1248 } |
1189 break; | 1249 |
1190 } else if (matroska->level_up > 0) { | 1250 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { |
1191 matroska->level_up--; | 1251 if (!track->default_duration) |
1192 break; | 1252 track->default_duration = 1000000000/track->video.frame_rate; |
1193 } | 1253 if (!track->video.display_width) |
1194 | 1254 track->video.display_width = track->video.pixel_width; |
1195 switch (id) { | 1255 if (!track->video.display_height) |
1196 /* track number (unique stream ID) */ | 1256 track->video.display_height = track->video.pixel_height; |
1197 case MATROSKA_ID_TRACKNUMBER: { | 1257 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { |
1198 uint64_t num; | 1258 if (!track->audio.out_samplerate) |
1199 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | 1259 track->audio.out_samplerate = track->audio.samplerate; |
1200 break; | 1260 } |
1201 track->num = num; | 1261 if (encodings_list->nb_elem > 1) { |
1202 break; | 1262 av_log(matroska->ctx, AV_LOG_ERROR, |
1203 } | 1263 "Multiple combined encodings no supported"); |
1204 | 1264 } else if (encodings_list->nb_elem == 1) { |
1205 /* track UID (unique identifier) */ | 1265 if (encodings[0].type || |
1206 case MATROSKA_ID_TRACKUID: { | 1266 (encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP && |
1207 uint64_t num; | |
1208 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1209 break; | |
1210 track->uid = num; | |
1211 break; | |
1212 } | |
1213 | |
1214 /* track type (video, audio, combined, subtitle, etc.) */ | |
1215 case MATROSKA_ID_TRACKTYPE: { | |
1216 uint64_t num; | |
1217 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1218 break; | |
1219 if (track->type && track->type != num) { | |
1220 av_log(matroska->ctx, AV_LOG_INFO, | |
1221 "More than one tracktype in an entry - skip\n"); | |
1222 break; | |
1223 } | |
1224 track->type = num; | |
1225 | |
1226 switch (track->type) { | |
1227 case MATROSKA_TRACK_TYPE_VIDEO: | |
1228 case MATROSKA_TRACK_TYPE_AUDIO: | |
1229 case MATROSKA_TRACK_TYPE_SUBTITLE: | |
1230 break; | |
1231 case MATROSKA_TRACK_TYPE_COMPLEX: | |
1232 case MATROSKA_TRACK_TYPE_LOGO: | |
1233 case MATROSKA_TRACK_TYPE_CONTROL: | |
1234 default: | |
1235 av_log(matroska->ctx, AV_LOG_INFO, | |
1236 "Unknown or unsupported track type 0x%x\n", | |
1237 track->type); | |
1238 track->type = MATROSKA_TRACK_TYPE_NONE; | |
1239 break; | |
1240 } | |
1241 break; | |
1242 } | |
1243 | |
1244 /* tracktype specific stuff for video */ | |
1245 case MATROSKA_ID_TRACKVIDEO: { | |
1246 MatroskaVideoTrack *videotrack; | |
1247 if (!track->type) | |
1248 track->type = MATROSKA_TRACK_TYPE_VIDEO; | |
1249 if (track->type != MATROSKA_TRACK_TYPE_VIDEO) { | |
1250 av_log(matroska->ctx, AV_LOG_INFO, | |
1251 "video data in non-video track - ignoring\n"); | |
1252 res = AVERROR_INVALIDDATA; | |
1253 break; | |
1254 } else if ((res = ebml_read_master(matroska, &id)) < 0) | |
1255 break; | |
1256 videotrack = (MatroskaVideoTrack *)track; | |
1257 | |
1258 while (res == 0) { | |
1259 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1260 res = AVERROR(EIO); | |
1261 break; | |
1262 } else if (matroska->level_up > 0) { | |
1263 matroska->level_up--; | |
1264 break; | |
1265 } | |
1266 | |
1267 switch (id) { | |
1268 /* fixme, this should be one-up, but I get it here */ | |
1269 case MATROSKA_ID_TRACKDEFAULTDURATION: { | |
1270 uint64_t num; | |
1271 if ((res = ebml_read_uint (matroska, &id, | |
1272 &num)) < 0) | |
1273 break; | |
1274 track->default_duration = num; | |
1275 break; | |
1276 } | |
1277 | |
1278 /* video framerate */ | |
1279 case MATROSKA_ID_VIDEOFRAMERATE: { | |
1280 double num; | |
1281 if ((res = ebml_read_float(matroska, &id, | |
1282 &num)) < 0) | |
1283 break; | |
1284 if (!track->default_duration) | |
1285 track->default_duration = 1000000000/num; | |
1286 break; | |
1287 } | |
1288 | |
1289 /* width of the size to display the video at */ | |
1290 case MATROSKA_ID_VIDEODISPLAYWIDTH: { | |
1291 uint64_t num; | |
1292 if ((res = ebml_read_uint(matroska, &id, | |
1293 &num)) < 0) | |
1294 break; | |
1295 videotrack->display_width = num; | |
1296 break; | |
1297 } | |
1298 | |
1299 /* height of the size to display the video at */ | |
1300 case MATROSKA_ID_VIDEODISPLAYHEIGHT: { | |
1301 uint64_t num; | |
1302 if ((res = ebml_read_uint(matroska, &id, | |
1303 &num)) < 0) | |
1304 break; | |
1305 videotrack->display_height = num; | |
1306 break; | |
1307 } | |
1308 | |
1309 /* width of the video in the file */ | |
1310 case MATROSKA_ID_VIDEOPIXELWIDTH: { | |
1311 uint64_t num; | |
1312 if ((res = ebml_read_uint(matroska, &id, | |
1313 &num)) < 0) | |
1314 break; | |
1315 videotrack->pixel_width = num; | |
1316 break; | |
1317 } | |
1318 | |
1319 /* height of the video in the file */ | |
1320 case MATROSKA_ID_VIDEOPIXELHEIGHT: { | |
1321 uint64_t num; | |
1322 if ((res = ebml_read_uint(matroska, &id, | |
1323 &num)) < 0) | |
1324 break; | |
1325 videotrack->pixel_height = num; | |
1326 break; | |
1327 } | |
1328 | |
1329 /* whether the video is interlaced */ | |
1330 case MATROSKA_ID_VIDEOFLAGINTERLACED: { | |
1331 uint64_t num; | |
1332 if ((res = ebml_read_uint(matroska, &id, | |
1333 &num)) < 0) | |
1334 break; | |
1335 break; | |
1336 } | |
1337 | |
1338 /* colorspace (only matters for raw video) | |
1339 * fourcc */ | |
1340 case MATROSKA_ID_VIDEOCOLORSPACE: { | |
1341 uint64_t num; | |
1342 if ((res = ebml_read_uint(matroska, &id, | |
1343 &num)) < 0) | |
1344 break; | |
1345 videotrack->fourcc = num; | |
1346 break; | |
1347 } | |
1348 | |
1349 default: | |
1350 av_log(matroska->ctx, AV_LOG_INFO, | |
1351 "Unknown video track header entry " | |
1352 "0x%x - ignoring\n", id); | |
1353 /* pass-through */ | |
1354 | |
1355 case MATROSKA_ID_VIDEOSTEREOMODE: | |
1356 case MATROSKA_ID_VIDEOASPECTRATIO: | |
1357 case EBML_ID_VOID: | |
1358 res = ebml_read_skip(matroska); | |
1359 break; | |
1360 } | |
1361 | |
1362 if (matroska->level_up) { | |
1363 matroska->level_up--; | |
1364 break; | |
1365 } | |
1366 } | |
1367 break; | |
1368 } | |
1369 | |
1370 /* tracktype specific stuff for audio */ | |
1371 case MATROSKA_ID_TRACKAUDIO: { | |
1372 MatroskaAudioTrack *audiotrack; | |
1373 if (!track->type) | |
1374 track->type = MATROSKA_TRACK_TYPE_AUDIO; | |
1375 if (track->type != MATROSKA_TRACK_TYPE_AUDIO) { | |
1376 av_log(matroska->ctx, AV_LOG_INFO, | |
1377 "audio data in non-audio track - ignoring\n"); | |
1378 res = AVERROR_INVALIDDATA; | |
1379 break; | |
1380 } else if ((res = ebml_read_master(matroska, &id)) < 0) | |
1381 break; | |
1382 audiotrack = (MatroskaAudioTrack *)track; | |
1383 audiotrack->channels = 1; | |
1384 audiotrack->samplerate = 8000; | |
1385 | |
1386 while (res == 0) { | |
1387 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1388 res = AVERROR(EIO); | |
1389 break; | |
1390 } else if (matroska->level_up > 0) { | |
1391 matroska->level_up--; | |
1392 break; | |
1393 } | |
1394 | |
1395 switch (id) { | |
1396 /* samplerate */ | |
1397 case MATROSKA_ID_AUDIOSAMPLINGFREQ: { | |
1398 double num; | |
1399 if ((res = ebml_read_float(matroska, &id, | |
1400 &num)) < 0) | |
1401 break; | |
1402 audiotrack->internal_samplerate = | |
1403 audiotrack->samplerate = num; | |
1404 break; | |
1405 } | |
1406 | |
1407 case MATROSKA_ID_AUDIOOUTSAMPLINGFREQ: { | |
1408 double num; | |
1409 if ((res = ebml_read_float(matroska, &id, | |
1410 &num)) < 0) | |
1411 break; | |
1412 audiotrack->samplerate = num; | |
1413 break; | |
1414 } | |
1415 | |
1416 /* bitdepth */ | |
1417 case MATROSKA_ID_AUDIOBITDEPTH: { | |
1418 uint64_t num; | |
1419 if ((res = ebml_read_uint(matroska, &id, | |
1420 &num)) < 0) | |
1421 break; | |
1422 audiotrack->bitdepth = num; | |
1423 break; | |
1424 } | |
1425 | |
1426 /* channels */ | |
1427 case MATROSKA_ID_AUDIOCHANNELS: { | |
1428 uint64_t num; | |
1429 if ((res = ebml_read_uint(matroska, &id, | |
1430 &num)) < 0) | |
1431 break; | |
1432 audiotrack->channels = num; | |
1433 break; | |
1434 } | |
1435 | |
1436 default: | |
1437 av_log(matroska->ctx, AV_LOG_INFO, | |
1438 "Unknown audio track header entry " | |
1439 "0x%x - ignoring\n", id); | |
1440 /* pass-through */ | |
1441 | |
1442 case EBML_ID_VOID: | |
1443 res = ebml_read_skip(matroska); | |
1444 break; | |
1445 } | |
1446 | |
1447 if (matroska->level_up) { | |
1448 matroska->level_up--; | |
1449 break; | |
1450 } | |
1451 } | |
1452 break; | |
1453 } | |
1454 | |
1455 /* codec identifier */ | |
1456 case MATROSKA_ID_CODECID: { | |
1457 char *text; | |
1458 if ((res = ebml_read_ascii(matroska, &id, &text)) < 0) | |
1459 break; | |
1460 track->codec_id = text; | |
1461 break; | |
1462 } | |
1463 | |
1464 /* codec private data */ | |
1465 case MATROSKA_ID_CODECPRIVATE: { | |
1466 uint8_t *data; | |
1467 int size; | |
1468 if ((res = ebml_read_binary(matroska, &id, &data, &size) < 0)) | |
1469 break; | |
1470 track->codec_priv = data; | |
1471 track->codec_priv_size = size; | |
1472 break; | |
1473 } | |
1474 | |
1475 /* name of this track */ | |
1476 case MATROSKA_ID_TRACKNAME: { | |
1477 char *text; | |
1478 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0) | |
1479 break; | |
1480 track->name = text; | |
1481 break; | |
1482 } | |
1483 | |
1484 /* language (matters for audio/subtitles, mostly) */ | |
1485 case MATROSKA_ID_TRACKLANGUAGE: { | |
1486 char *text, *end; | |
1487 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0) | |
1488 break; | |
1489 if ((end = strchr(text, '-'))) | |
1490 *end = '\0'; | |
1491 if (strlen(text) == 3) | |
1492 strcpy(track->language, text); | |
1493 av_free(text); | |
1494 break; | |
1495 } | |
1496 | |
1497 /* whether this is actually used */ | |
1498 case MATROSKA_ID_TRACKFLAGENABLED: { | |
1499 uint64_t num; | |
1500 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1501 break; | |
1502 break; | |
1503 } | |
1504 | |
1505 /* whether it's the default for this track type */ | |
1506 case MATROSKA_ID_TRACKFLAGDEFAULT: { | |
1507 uint64_t num; | |
1508 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1509 break; | |
1510 track->flag_default = num; | |
1511 break; | |
1512 } | |
1513 | |
1514 /* lacing (like MPEG, where blocks don't end/start on frame | |
1515 * boundaries) */ | |
1516 case MATROSKA_ID_TRACKFLAGLACING: { | |
1517 uint64_t num; | |
1518 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1519 break; | |
1520 break; | |
1521 } | |
1522 | |
1523 /* default length (in time) of one data block in this track */ | |
1524 case MATROSKA_ID_TRACKDEFAULTDURATION: { | |
1525 uint64_t num; | |
1526 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1527 break; | |
1528 track->default_duration = num; | |
1529 break; | |
1530 } | |
1531 | |
1532 case MATROSKA_ID_TRACKCONTENTENCODINGS: { | |
1533 if ((res = ebml_read_master(matroska, &id)) < 0) | |
1534 break; | |
1535 | |
1536 while (res == 0) { | |
1537 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1538 res = AVERROR(EIO); | |
1539 break; | |
1540 } else if (matroska->level_up > 0) { | |
1541 matroska->level_up--; | |
1542 break; | |
1543 } | |
1544 | |
1545 switch (id) { | |
1546 case MATROSKA_ID_TRACKCONTENTENCODING: { | |
1547 int encoding_scope = 1; | |
1548 if ((res = ebml_read_master(matroska, &id)) < 0) | |
1549 break; | |
1550 | |
1551 while (res == 0) { | |
1552 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1553 res = AVERROR(EIO); | |
1554 break; | |
1555 } else if (matroska->level_up > 0) { | |
1556 matroska->level_up--; | |
1557 break; | |
1558 } | |
1559 | |
1560 switch (id) { | |
1561 case MATROSKA_ID_ENCODINGSCOPE: { | |
1562 uint64_t num; | |
1563 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1564 break; | |
1565 encoding_scope = num; | |
1566 break; | |
1567 } | |
1568 | |
1569 case MATROSKA_ID_ENCODINGTYPE: { | |
1570 uint64_t num; | |
1571 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1572 break; | |
1573 if (num) | |
1574 av_log(matroska->ctx, AV_LOG_ERROR, | |
1575 "Unsupported encoding type"); | |
1576 break; | |
1577 } | |
1578 | |
1579 case MATROSKA_ID_ENCODINGCOMPRESSION: { | |
1580 if ((res = ebml_read_master(matroska, &id)) < 0) | |
1581 break; | |
1582 | |
1583 while (res == 0) { | |
1584 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1585 res = AVERROR(EIO); | |
1586 break; | |
1587 } else if (matroska->level_up > 0) { | |
1588 matroska->level_up--; | |
1589 break; | |
1590 } | |
1591 | |
1592 switch (id) { | |
1593 case MATROSKA_ID_ENCODINGCOMPALGO: { | |
1594 uint64_t num; | |
1595 if ((res = ebml_read_uint(matroska, &id, &num)) < 0) | |
1596 break; | |
1597 if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP && | |
1598 #ifdef CONFIG_ZLIB | 1267 #ifdef CONFIG_ZLIB |
1599 num != MATROSKA_TRACK_ENCODING_COMP_ZLIB && | 1268 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB && |
1600 #endif | 1269 #endif |
1601 #ifdef CONFIG_BZLIB | 1270 #ifdef CONFIG_BZLIB |
1602 num != MATROSKA_TRACK_ENCODING_COMP_BZLIB && | 1271 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB && |
1603 #endif | 1272 #endif |
1604 num != MATROSKA_TRACK_ENCODING_COMP_LZO) | 1273 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO)) { |
1605 av_log(matroska->ctx, AV_LOG_ERROR, | 1274 encodings[0].scope = 0; |
1606 "Unsupported compression algo\n"); | 1275 av_log(matroska->ctx, AV_LOG_ERROR, |
1607 track->encoding_algo = num; | 1276 "Unsupported encoding type"); |
1608 break; | 1277 } else if (track->codec_priv.size && encodings[0].scope&2) { |
1609 } | 1278 uint8_t *codec_priv = track->codec_priv.data; |
1610 | 1279 int offset = matroska_decode_buffer(&track->codec_priv.data, |
1611 case MATROSKA_ID_ENCODINGCOMPSETTINGS: { | 1280 &track->codec_priv.size, |
1612 uint8_t *data; | 1281 track); |
1613 int size; | 1282 if (offset < 0) { |
1614 if ((res = ebml_read_binary(matroska, &id, &data, &size) < 0)) | 1283 track->codec_priv.data = NULL; |
1615 break; | 1284 track->codec_priv.size = 0; |
1616 track->encoding_settings = data; | 1285 av_log(matroska->ctx, AV_LOG_ERROR, |
1617 track->encoding_settings_len = size; | 1286 "Failed to decode codec private data\n"); |
1618 break; | 1287 } else if (offset > 0) { |
1619 } | 1288 track->codec_priv.data = av_malloc(track->codec_priv.size + offset); |
1620 | 1289 memcpy(track->codec_priv.data, |
1621 default: | 1290 encodings[0].compression.settings.data, offset); |
1622 av_log(matroska->ctx, AV_LOG_INFO, | 1291 memcpy(track->codec_priv.data+offset, codec_priv, |
1623 "Unknown compression header entry " | 1292 track->codec_priv.size); |
1624 "0x%x - ignoring\n", id); | 1293 track->codec_priv.size += offset; |
1625 /* pass-through */ | |
1626 | |
1627 case EBML_ID_VOID: | |
1628 res = ebml_read_skip(matroska); | |
1629 break; | |
1630 } | |
1631 | |
1632 if (matroska->level_up) { | |
1633 matroska->level_up--; | |
1634 break; | |
1635 } | |
1636 } | |
1637 break; | |
1638 } | |
1639 | |
1640 default: | |
1641 av_log(matroska->ctx, AV_LOG_INFO, | |
1642 "Unknown content encoding header entry " | |
1643 "0x%x - ignoring\n", id); | |
1644 /* pass-through */ | |
1645 | |
1646 case EBML_ID_VOID: | |
1647 res = ebml_read_skip(matroska); | |
1648 break; | |
1649 } | |
1650 | |
1651 if (matroska->level_up) { | |
1652 matroska->level_up--; | |
1653 break; | |
1654 } | |
1655 } | |
1656 | |
1657 track->encoding_scope = encoding_scope; | |
1658 break; | |
1659 } | |
1660 | |
1661 default: | |
1662 av_log(matroska->ctx, AV_LOG_INFO, | |
1663 "Unknown content encodings header entry " | |
1664 "0x%x - ignoring\n", id); | |
1665 /* pass-through */ | |
1666 | |
1667 case EBML_ID_VOID: | |
1668 res = ebml_read_skip(matroska); | |
1669 break; | |
1670 } | |
1671 | |
1672 if (matroska->level_up) { | |
1673 matroska->level_up--; | |
1674 break; | |
1675 } | |
1676 } | 1294 } |
1677 break; | 1295 if (codec_priv != track->codec_priv.data) |
1678 } | 1296 av_free(codec_priv); |
1679 | 1297 } |
1680 case MATROSKA_ID_TRACKTIMECODESCALE: { | |
1681 double num; | |
1682 if ((res = ebml_read_float(matroska, &id, &num)) < 0) | |
1683 break; | |
1684 track->time_scale = num; | |
1685 break; | |
1686 } | |
1687 | |
1688 default: | |
1689 av_log(matroska->ctx, AV_LOG_INFO, | |
1690 "Unknown track header entry 0x%x - ignoring\n", id); | |
1691 /* pass-through */ | |
1692 | |
1693 case EBML_ID_VOID: | |
1694 /* we ignore these because they're nothing useful. */ | |
1695 case MATROSKA_ID_TRACKFLAGFORCED: | |
1696 case MATROSKA_ID_CODECNAME: | |
1697 case MATROSKA_ID_CODECDECODEALL: | |
1698 case MATROSKA_ID_CODECINFOURL: | |
1699 case MATROSKA_ID_CODECDOWNLOADURL: | |
1700 case MATROSKA_ID_TRACKMINCACHE: | |
1701 case MATROSKA_ID_TRACKMAXCACHE: | |
1702 res = ebml_read_skip(matroska); | |
1703 break; | |
1704 } | |
1705 | |
1706 if (matroska->level_up) { | |
1707 matroska->level_up--; | |
1708 break; | |
1709 } | |
1710 } | |
1711 | |
1712 if (track->codec_priv_size && track->encoding_scope & 2) { | |
1713 uint8_t *orig_priv = track->codec_priv; | |
1714 int offset = matroska_decode_buffer(&track->codec_priv, | |
1715 &track->codec_priv_size, track); | |
1716 if (offset > 0) { | |
1717 track->codec_priv = av_malloc(track->codec_priv_size + offset); | |
1718 memcpy(track->codec_priv, track->encoding_settings, offset); | |
1719 memcpy(track->codec_priv+offset, orig_priv, track->codec_priv_size); | |
1720 track->codec_priv_size += offset; | |
1721 av_free(orig_priv); | |
1722 } else if (!offset) { | |
1723 av_free(orig_priv); | |
1724 } else | |
1725 av_log(matroska->ctx, AV_LOG_ERROR, | |
1726 "Failed to decode codec private data\n"); | |
1727 } | |
1728 | |
1729 if (track->type && matroska->num_tracks < ARRAY_SIZE(matroska->tracks)) { | |
1730 matroska->tracks[matroska->num_tracks++] = track; | |
1731 } else { | |
1732 av_free(track); | |
1733 } | |
1734 return res; | |
1735 } | |
1736 | |
1737 static int | |
1738 matroska_parse_tracks (MatroskaDemuxContext *matroska) | |
1739 { | |
1740 int res = 0; | |
1741 uint32_t id; | |
1742 | |
1743 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing tracks...\n"); | |
1744 | |
1745 while (res == 0) { | |
1746 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
1747 res = AVERROR(EIO); | |
1748 break; | |
1749 } else if (matroska->level_up) { | |
1750 matroska->level_up--; | |
1751 break; | |
1752 } | |
1753 | |
1754 switch (id) { | |
1755 /* one track within the "all-tracks" header */ | |
1756 case MATROSKA_ID_TRACKENTRY: | |
1757 res = matroska_add_stream(matroska); | |
1758 break; | |
1759 | |
1760 default: | |
1761 av_log(matroska->ctx, AV_LOG_INFO, | |
1762 "Unknown entry 0x%x in track header\n", id); | |
1763 /* fall-through */ | |
1764 | |
1765 case EBML_ID_VOID: | |
1766 res = ebml_read_skip(matroska); | |
1767 break; | |
1768 } | |
1769 | |
1770 if (matroska->level_up) { | |
1771 matroska->level_up--; | |
1772 break; | |
1773 } | 1298 } |
1774 } | 1299 } |
1775 | 1300 |
1776 return res; | 1301 return res; |
1777 } | 1302 } |
2119 break; | 1644 break; |
2120 } | 1645 } |
2121 | 1646 |
2122 /* track info headers */ | 1647 /* track info headers */ |
2123 case MATROSKA_ID_TRACKS: { | 1648 case MATROSKA_ID_TRACKS: { |
2124 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2125 break; | |
2126 res = matroska_parse_tracks(matroska); | 1649 res = matroska_parse_tracks(matroska); |
2127 break; | 1650 break; |
2128 } | 1651 } |
2129 | 1652 |
2130 /* stream index */ | 1653 /* stream index */ |
2186 } | 1709 } |
2187 } | 1710 } |
2188 | 1711 |
2189 /* Have we found a cluster? */ | 1712 /* Have we found a cluster? */ |
2190 if (ebml_peek_id(matroska, NULL) == MATROSKA_ID_CLUSTER) { | 1713 if (ebml_peek_id(matroska, NULL) == MATROSKA_ID_CLUSTER) { |
1714 MatroskaTrack *tracks = matroska->tracks.elem; | |
2191 int i, j; | 1715 int i, j; |
2192 MatroskaTrack *track; | |
2193 AVStream *st; | 1716 AVStream *st; |
2194 | 1717 |
2195 for (i = 0; i < matroska->num_tracks; i++) { | 1718 for (i=0; i < matroska->tracks.nb_elem; i++) { |
1719 MatroskaTrack *track = &tracks[i]; | |
2196 enum CodecID codec_id = CODEC_ID_NONE; | 1720 enum CodecID codec_id = CODEC_ID_NONE; |
2197 uint8_t *extradata = NULL; | 1721 uint8_t *extradata = NULL; |
2198 int extradata_size = 0; | 1722 int extradata_size = 0; |
2199 int extradata_offset = 0; | 1723 int extradata_offset = 0; |
2200 track = matroska->tracks[i]; | |
2201 | 1724 |
2202 /* Apply some sanity checks. */ | 1725 /* Apply some sanity checks. */ |
2203 if (track->codec_id == NULL) | 1726 if (track->codec_id == NULL) |
2204 continue; | 1727 continue; |
2205 | 1728 |
2218 /* Set the FourCC from the CodecID. */ | 1741 /* Set the FourCC from the CodecID. */ |
2219 /* This is the MS compatibility mode which stores a | 1742 /* This is the MS compatibility mode which stores a |
2220 * BITMAPINFOHEADER in the CodecPrivate. */ | 1743 * BITMAPINFOHEADER in the CodecPrivate. */ |
2221 if (!strcmp(track->codec_id, | 1744 if (!strcmp(track->codec_id, |
2222 MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC) && | 1745 MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC) && |
2223 (track->codec_priv_size >= 40) && | 1746 (track->codec_priv.size >= 40) && |
2224 (track->codec_priv != NULL)) { | 1747 (track->codec_priv.data != NULL)) { |
2225 MatroskaVideoTrack *vtrack = (MatroskaVideoTrack *) track; | |
2226 | |
2227 /* Offset of biCompression. Stored in LE. */ | 1748 /* Offset of biCompression. Stored in LE. */ |
2228 vtrack->fourcc = AV_RL32(track->codec_priv + 16); | 1749 track->video.fourcc = AV_RL32(track->codec_priv.data + 16); |
2229 codec_id = codec_get_id(codec_bmp_tags, vtrack->fourcc); | 1750 codec_id = codec_get_id(codec_bmp_tags, track->video.fourcc); |
2230 | 1751 |
2231 } | 1752 } |
2232 | 1753 |
2233 /* This is the MS compatibility mode which stores a | 1754 /* This is the MS compatibility mode which stores a |
2234 * WAVEFORMATEX in the CodecPrivate. */ | 1755 * WAVEFORMATEX in the CodecPrivate. */ |
2235 else if (!strcmp(track->codec_id, | 1756 else if (!strcmp(track->codec_id, |
2236 MATROSKA_CODEC_ID_AUDIO_ACM) && | 1757 MATROSKA_CODEC_ID_AUDIO_ACM) && |
2237 (track->codec_priv_size >= 18) && | 1758 (track->codec_priv.size >= 18) && |
2238 (track->codec_priv != NULL)) { | 1759 (track->codec_priv.data != NULL)) { |
2239 uint16_t tag; | |
2240 | |
2241 /* Offset of wFormatTag. Stored in LE. */ | 1760 /* Offset of wFormatTag. Stored in LE. */ |
2242 tag = AV_RL16(track->codec_priv); | 1761 uint16_t tag = AV_RL16(track->codec_priv.data); |
2243 codec_id = codec_get_id(codec_wav_tags, tag); | 1762 codec_id = codec_get_id(codec_wav_tags, tag); |
2244 | 1763 |
2245 } | 1764 } |
2246 | 1765 |
2247 if (!strcmp(track->codec_id, "V_QUICKTIME") && | 1766 if (!strcmp(track->codec_id, "V_QUICKTIME") && |
2248 (track->codec_priv_size >= 86) && | 1767 (track->codec_priv.size >= 86) && |
2249 (track->codec_priv != NULL)) { | 1768 (track->codec_priv.data != NULL)) { |
2250 MatroskaVideoTrack *vtrack = (MatroskaVideoTrack *) track; | 1769 track->video.fourcc = AV_RL32(track->codec_priv.data); |
2251 | 1770 codec_id=codec_get_id(codec_movvideo_tags, track->video.fourcc); |
2252 vtrack->fourcc = AV_RL32(track->codec_priv); | 1771 } |
2253 codec_id = codec_get_id(codec_movvideo_tags, vtrack->fourcc); | 1772 |
2254 } | 1773 else if (codec_id == CODEC_ID_AAC && !track->codec_priv.size) { |
2255 | |
2256 else if (codec_id == CODEC_ID_AAC && !track->codec_priv_size) { | |
2257 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track; | |
2258 int profile = matroska_aac_profile(track->codec_id); | 1774 int profile = matroska_aac_profile(track->codec_id); |
2259 int sri = matroska_aac_sri(audiotrack->internal_samplerate); | 1775 int sri = matroska_aac_sri(track->audio.samplerate); |
2260 extradata = av_malloc(5); | 1776 extradata = av_malloc(5); |
2261 if (extradata == NULL) | 1777 if (extradata == NULL) |
2262 return AVERROR(ENOMEM); | 1778 return AVERROR(ENOMEM); |
2263 extradata[0] = (profile << 3) | ((sri&0x0E) >> 1); | 1779 extradata[0] = (profile << 3) | ((sri&0x0E) >> 1); |
2264 extradata[1] = ((sri&0x01) << 7) | (audiotrack->channels<<3); | 1780 extradata[1] = ((sri&0x01) << 7) | (track->audio.channels<<3); |
2265 if (strstr(track->codec_id, "SBR")) { | 1781 if (strstr(track->codec_id, "SBR")) { |
2266 sri = matroska_aac_sri(audiotrack->samplerate); | 1782 sri = matroska_aac_sri(track->audio.out_samplerate); |
2267 extradata[2] = 0x56; | 1783 extradata[2] = 0x56; |
2268 extradata[3] = 0xE5; | 1784 extradata[3] = 0xE5; |
2269 extradata[4] = 0x80 | (sri<<3); | 1785 extradata[4] = 0x80 | (sri<<3); |
2270 extradata_size = 5; | 1786 extradata_size = 5; |
2271 } else { | 1787 } else { |
2272 extradata_size = 2; | 1788 extradata_size = 2; |
2273 } | 1789 } |
2274 } | 1790 } |
2275 | 1791 |
2276 else if (codec_id == CODEC_ID_TTA) { | 1792 else if (codec_id == CODEC_ID_TTA) { |
2277 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track; | |
2278 ByteIOContext b; | 1793 ByteIOContext b; |
2279 extradata_size = 30; | 1794 extradata_size = 30; |
2280 extradata = av_mallocz(extradata_size); | 1795 extradata = av_mallocz(extradata_size); |
2281 if (extradata == NULL) | 1796 if (extradata == NULL) |
2282 return AVERROR(ENOMEM); | 1797 return AVERROR(ENOMEM); |
2283 init_put_byte(&b, extradata, extradata_size, 1, | 1798 init_put_byte(&b, extradata, extradata_size, 1, |
2284 NULL, NULL, NULL, NULL); | 1799 NULL, NULL, NULL, NULL); |
2285 put_buffer(&b, "TTA1", 4); | 1800 put_buffer(&b, "TTA1", 4); |
2286 put_le16(&b, 1); | 1801 put_le16(&b, 1); |
2287 put_le16(&b, audiotrack->channels); | 1802 put_le16(&b, track->audio.channels); |
2288 put_le16(&b, audiotrack->bitdepth); | 1803 put_le16(&b, track->audio.bitdepth); |
2289 put_le32(&b, audiotrack->samplerate); | 1804 put_le32(&b, track->audio.out_samplerate); |
2290 put_le32(&b, matroska->ctx->duration * audiotrack->samplerate); | 1805 put_le32(&b, matroska->ctx->duration * track->audio.out_samplerate); |
2291 } | 1806 } |
2292 | 1807 |
2293 else if (codec_id == CODEC_ID_RV10 || codec_id == CODEC_ID_RV20 || | 1808 else if (codec_id == CODEC_ID_RV10 || codec_id == CODEC_ID_RV20 || |
2294 codec_id == CODEC_ID_RV30 || codec_id == CODEC_ID_RV40) { | 1809 codec_id == CODEC_ID_RV30 || codec_id == CODEC_ID_RV40) { |
2295 extradata_offset = 26; | 1810 extradata_offset = 26; |
2296 track->codec_priv_size -= extradata_offset; | 1811 track->codec_priv.size -= extradata_offset; |
2297 } | 1812 } |
2298 | 1813 |
2299 else if (codec_id == CODEC_ID_RA_144) { | 1814 else if (codec_id == CODEC_ID_RA_144) { |
2300 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; | 1815 track->audio.out_samplerate = 8000; |
2301 audiotrack->samplerate = 8000; | 1816 track->audio.channels = 1; |
2302 audiotrack->channels = 1; | |
2303 } | 1817 } |
2304 | 1818 |
2305 else if (codec_id == CODEC_ID_RA_288 || | 1819 else if (codec_id == CODEC_ID_RA_288 || |
2306 codec_id == CODEC_ID_COOK || | 1820 codec_id == CODEC_ID_COOK || |
2307 codec_id == CODEC_ID_ATRAC3) { | 1821 codec_id == CODEC_ID_ATRAC3) { |
2308 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; | |
2309 ByteIOContext b; | 1822 ByteIOContext b; |
2310 | 1823 |
2311 init_put_byte(&b, track->codec_priv, track->codec_priv_size, 0, | 1824 init_put_byte(&b, track->codec_priv.data,track->codec_priv.size, |
2312 NULL, NULL, NULL, NULL); | 1825 0, NULL, NULL, NULL, NULL); |
2313 url_fskip(&b, 24); | 1826 url_fskip(&b, 24); |
2314 audiotrack->coded_framesize = get_be32(&b); | 1827 track->audio.coded_framesize = get_be32(&b); |
2315 url_fskip(&b, 12); | 1828 url_fskip(&b, 12); |
2316 audiotrack->sub_packet_h = get_be16(&b); | 1829 track->audio.sub_packet_h = get_be16(&b); |
2317 audiotrack->frame_size = get_be16(&b); | 1830 track->audio.frame_size = get_be16(&b); |
2318 audiotrack->sub_packet_size = get_be16(&b); | 1831 track->audio.sub_packet_size = get_be16(&b); |
2319 audiotrack->buf = av_malloc(audiotrack->frame_size * audiotrack->sub_packet_h); | 1832 track->audio.buf = av_malloc(track->audio.frame_size * track->audio.sub_packet_h); |
2320 if (codec_id == CODEC_ID_RA_288) { | 1833 if (codec_id == CODEC_ID_RA_288) { |
2321 audiotrack->block_align = audiotrack->coded_framesize; | 1834 st->codec->block_align = track->audio.coded_framesize; |
2322 track->codec_priv_size = 0; | 1835 track->codec_priv.size = 0; |
2323 } else { | 1836 } else { |
2324 audiotrack->block_align = audiotrack->sub_packet_size; | 1837 st->codec->block_align = track->audio.sub_packet_size; |
2325 extradata_offset = 78; | 1838 extradata_offset = 78; |
2326 track->codec_priv_size -= extradata_offset; | 1839 track->codec_priv.size -= extradata_offset; |
2327 } | 1840 } |
2328 } | 1841 } |
2329 | 1842 |
2330 if (codec_id == CODEC_ID_NONE) { | 1843 if (codec_id == CODEC_ID_NONE) { |
2331 av_log(matroska->ctx, AV_LOG_INFO, | 1844 av_log(matroska->ctx, AV_LOG_INFO, |
2348 track->default_duration, 1000000000, 30000); | 1861 track->default_duration, 1000000000, 30000); |
2349 | 1862 |
2350 if(extradata){ | 1863 if(extradata){ |
2351 st->codec->extradata = extradata; | 1864 st->codec->extradata = extradata; |
2352 st->codec->extradata_size = extradata_size; | 1865 st->codec->extradata_size = extradata_size; |
2353 } else if(track->codec_priv && track->codec_priv_size > 0){ | 1866 } else if(track->codec_priv.data && track->codec_priv.size > 0){ |
2354 st->codec->extradata = av_malloc(track->codec_priv_size); | 1867 st->codec->extradata = av_malloc(track->codec_priv.size); |
2355 if(st->codec->extradata == NULL) | 1868 if(st->codec->extradata == NULL) |
2356 return AVERROR(ENOMEM); | 1869 return AVERROR(ENOMEM); |
2357 st->codec->extradata_size = track->codec_priv_size; | 1870 st->codec->extradata_size = track->codec_priv.size; |
2358 memcpy(st->codec->extradata,track->codec_priv+extradata_offset, | 1871 memcpy(st->codec->extradata, |
2359 track->codec_priv_size); | 1872 track->codec_priv.data + extradata_offset, |
1873 track->codec_priv.size); | |
2360 } | 1874 } |
2361 | 1875 |
2362 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { | 1876 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { |
2363 MatroskaVideoTrack *videotrack = (MatroskaVideoTrack *)track; | |
2364 | |
2365 st->codec->codec_type = CODEC_TYPE_VIDEO; | 1877 st->codec->codec_type = CODEC_TYPE_VIDEO; |
2366 st->codec->codec_tag = videotrack->fourcc; | 1878 st->codec->codec_tag = track->video.fourcc; |
2367 st->codec->width = videotrack->pixel_width; | 1879 st->codec->width = track->video.pixel_width; |
2368 st->codec->height = videotrack->pixel_height; | 1880 st->codec->height = track->video.pixel_height; |
2369 if (videotrack->display_width == 0) | |
2370 videotrack->display_width= videotrack->pixel_width; | |
2371 if (videotrack->display_height == 0) | |
2372 videotrack->display_height= videotrack->pixel_height; | |
2373 av_reduce(&st->codec->sample_aspect_ratio.num, | 1881 av_reduce(&st->codec->sample_aspect_ratio.num, |
2374 &st->codec->sample_aspect_ratio.den, | 1882 &st->codec->sample_aspect_ratio.den, |
2375 st->codec->height * videotrack->display_width, | 1883 st->codec->height * track->video.display_width, |
2376 st->codec-> width * videotrack->display_height, | 1884 st->codec-> width * track->video.display_height, |
2377 255); | 1885 255); |
2378 st->need_parsing = AVSTREAM_PARSE_HEADERS; | 1886 st->need_parsing = AVSTREAM_PARSE_HEADERS; |
2379 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { | 1887 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { |
2380 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; | |
2381 | |
2382 st->codec->codec_type = CODEC_TYPE_AUDIO; | 1888 st->codec->codec_type = CODEC_TYPE_AUDIO; |
2383 st->codec->sample_rate = audiotrack->samplerate; | 1889 st->codec->sample_rate = track->audio.out_samplerate; |
2384 st->codec->channels = audiotrack->channels; | 1890 st->codec->channels = track->audio.channels; |
2385 st->codec->block_align = audiotrack->block_align; | |
2386 } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) { | 1891 } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) { |
2387 st->codec->codec_type = CODEC_TYPE_SUBTITLE; | 1892 st->codec->codec_type = CODEC_TYPE_SUBTITLE; |
2388 } | 1893 } |
2389 | 1894 |
2390 /* What do we do with private data? E.g. for Vorbis. */ | 1895 /* What do we do with private data? E.g. for Vorbis. */ |
2552 | 2057 |
2553 for (n = 0; n < laces; n++) { | 2058 for (n = 0; n < laces; n++) { |
2554 if (st->codec->codec_id == CODEC_ID_RA_288 || | 2059 if (st->codec->codec_id == CODEC_ID_RA_288 || |
2555 st->codec->codec_id == CODEC_ID_COOK || | 2060 st->codec->codec_id == CODEC_ID_COOK || |
2556 st->codec->codec_id == CODEC_ID_ATRAC3) { | 2061 st->codec->codec_id == CODEC_ID_ATRAC3) { |
2557 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; | |
2558 int a = st->codec->block_align; | 2062 int a = st->codec->block_align; |
2559 int sps = audiotrack->sub_packet_size; | 2063 int sps = track->audio.sub_packet_size; |
2560 int cfs = audiotrack->coded_framesize; | 2064 int cfs = track->audio.coded_framesize; |
2561 int h = audiotrack->sub_packet_h; | 2065 int h = track->audio.sub_packet_h; |
2562 int y = audiotrack->sub_packet_cnt; | 2066 int y = track->audio.sub_packet_cnt; |
2563 int w = audiotrack->frame_size; | 2067 int w = track->audio.frame_size; |
2564 int x; | 2068 int x; |
2565 | 2069 |
2566 if (!audiotrack->pkt_cnt) { | 2070 if (!track->audio.pkt_cnt) { |
2567 if (st->codec->codec_id == CODEC_ID_RA_288) | 2071 if (st->codec->codec_id == CODEC_ID_RA_288) |
2568 for (x=0; x<h/2; x++) | 2072 for (x=0; x<h/2; x++) |
2569 memcpy(audiotrack->buf+x*2*w+y*cfs, | 2073 memcpy(track->audio.buf+x*2*w+y*cfs, |
2570 data+x*cfs, cfs); | 2074 data+x*cfs, cfs); |
2571 else | 2075 else |
2572 for (x=0; x<w/sps; x++) | 2076 for (x=0; x<w/sps; x++) |
2573 memcpy(audiotrack->buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); | 2077 memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); |
2574 | 2078 |
2575 if (++audiotrack->sub_packet_cnt >= h) { | 2079 if (++track->audio.sub_packet_cnt >= h) { |
2576 audiotrack->sub_packet_cnt = 0; | 2080 track->audio.sub_packet_cnt = 0; |
2577 audiotrack->pkt_cnt = h*w / a; | 2081 track->audio.pkt_cnt = h*w / a; |
2578 } | 2082 } |
2579 } | 2083 } |
2580 while (audiotrack->pkt_cnt) { | 2084 while (track->audio.pkt_cnt) { |
2581 pkt = av_mallocz(sizeof(AVPacket)); | 2085 pkt = av_mallocz(sizeof(AVPacket)); |
2582 av_new_packet(pkt, a); | 2086 av_new_packet(pkt, a); |
2583 memcpy(pkt->data, audiotrack->buf | 2087 memcpy(pkt->data, track->audio.buf |
2584 + a * (h*w / a - audiotrack->pkt_cnt--), a); | 2088 + a * (h*w / a - track->audio.pkt_cnt--), a); |
2585 pkt->pos = pos; | 2089 pkt->pos = pos; |
2586 pkt->stream_index = st->index; | 2090 pkt->stream_index = st->index; |
2587 matroska_queue_packet(matroska, pkt); | 2091 matroska_queue_packet(matroska, pkt); |
2588 } | 2092 } |
2589 } else { | 2093 } else { |
2094 MatroskaTrackEncoding *encodings = track->encodings.elem; | |
2590 int offset = 0, pkt_size = lace_size[n]; | 2095 int offset = 0, pkt_size = lace_size[n]; |
2591 uint8_t *pkt_data = data; | 2096 uint8_t *pkt_data = data; |
2592 | 2097 |
2593 if (track->encoding_scope & 1) { | 2098 if (encodings && encodings->scope & 1) { |
2594 offset = matroska_decode_buffer(&pkt_data, &pkt_size, | 2099 offset = matroska_decode_buffer(&pkt_data, &pkt_size, |
2595 track); | 2100 track); |
2596 if (offset < 0) | 2101 if (offset < 0) |
2597 continue; | 2102 continue; |
2598 } | 2103 } |
2604 res = AVERROR(ENOMEM); | 2109 res = AVERROR(ENOMEM); |
2605 n = laces-1; | 2110 n = laces-1; |
2606 break; | 2111 break; |
2607 } | 2112 } |
2608 if (offset) | 2113 if (offset) |
2609 memcpy (pkt->data, track->encoding_settings, offset); | 2114 memcpy (pkt->data, encodings->compression.settings.data, offset); |
2610 memcpy (pkt->data+offset, pkt_data, pkt_size); | 2115 memcpy (pkt->data+offset, pkt_data, pkt_size); |
2611 | 2116 |
2612 if (pkt_data != data) | 2117 if (pkt_data != data) |
2613 av_free(pkt_data); | 2118 av_free(pkt_data); |
2614 | 2119 |
2855 | 2360 |
2856 static int | 2361 static int |
2857 matroska_read_close (AVFormatContext *s) | 2362 matroska_read_close (AVFormatContext *s) |
2858 { | 2363 { |
2859 MatroskaDemuxContext *matroska = s->priv_data; | 2364 MatroskaDemuxContext *matroska = s->priv_data; |
2365 MatroskaTrack *tracks = matroska->tracks.elem; | |
2860 int n = 0; | 2366 int n = 0; |
2861 | 2367 |
2862 matroska_clear_queue(matroska); | 2368 matroska_clear_queue(matroska); |
2863 | 2369 |
2864 for (n = 0; n < matroska->num_tracks; n++) { | 2370 for (n=0; n < matroska->tracks.nb_elem; n++) |
2865 MatroskaTrack *track = matroska->tracks[n]; | 2371 if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO) |
2866 av_free(track->codec_id); | 2372 av_free(tracks[n].audio.buf); |
2867 av_free(track->codec_priv); | 2373 ebml_free(matroska_tracks, matroska); |
2868 av_free(track->name); | |
2869 | |
2870 if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { | |
2871 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; | |
2872 av_free(audiotrack->buf); | |
2873 } | |
2874 | |
2875 av_free(track); | |
2876 } | |
2877 ebml_free(matroska_index, matroska); | 2374 ebml_free(matroska_index, matroska); |
2878 | 2375 |
2879 return 0; | 2376 return 0; |
2880 } | 2377 } |
2881 | 2378 |