diff options
Diffstat (limited to 'src/plugins/old/mkv_extractor.c')
-rw-r--r-- | src/plugins/old/mkv_extractor.c | 144 |
1 files changed, 76 insertions, 68 deletions
diff --git a/src/plugins/old/mkv_extractor.c b/src/plugins/old/mkv_extractor.c index 9e2f1f9..ff052dc 100644 --- a/src/plugins/old/mkv_extractor.c +++ b/src/plugins/old/mkv_extractor.c | |||
@@ -18,17 +18,21 @@ | |||
18 | Boston, MA 02110-1301, USA. | 18 | Boston, MA 02110-1301, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * Made by Gabriel Peixoto | 22 | * Made by Gabriel Peixoto |
23 | * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin. | 23 | * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin. |
24 | * | 24 | * |
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include "platform.h" | 27 | #include "platform.h" |
28 | #include "extractor.h" | 28 | #include "extractor.h" |
29 | #include <stdint.h> | 29 | #include <stdint.h> |
30 | 30 | ||
31 | #define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "mkv", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto EXIT; } while (0) | 31 | #define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "mkv", t, \ |
32 | EXTRACTOR_METAFORMAT_UTF8, \ | ||
33 | "text/plain", s, strlen (s) \ | ||
34 | + 1))) goto EXIT; \ | ||
35 | } while (0) | ||
32 | 36 | ||
33 | /** | 37 | /** |
34 | * FIXME: document | 38 | * FIXME: document |
@@ -98,27 +102,29 @@ enum | |||
98 | */ | 102 | */ |
99 | static size_t | 103 | static size_t |
100 | VINTparse (const unsigned char *buffer, size_t start, size_t end, | 104 | VINTparse (const unsigned char *buffer, size_t start, size_t end, |
101 | int64_t * result, int flag) | 105 | int64_t *result, int flag) |
102 | { | 106 | { |
103 | static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 }; | 107 | static const unsigned char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, |
104 | static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1, 00 }; | 108 | 0x1 }; |
109 | static const unsigned char imask[8] = { 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1, | ||
110 | 00 }; | ||
105 | int vint_width; | 111 | int vint_width; |
106 | unsigned int c; | 112 | unsigned int c; |
107 | int64_t temp; | 113 | int64_t temp; |
108 | unsigned char tempc; | 114 | unsigned char tempc; |
109 | 115 | ||
110 | if (end - start < 2) | 116 | if (end - start < 2) |
111 | return 0; /*ops */ | 117 | return 0; /*ops */ |
112 | 118 | ||
113 | vint_width = 0; | 119 | vint_width = 0; |
114 | for (c = 0; c < 8; c++) | 120 | for (c = 0; c < 8; c++) |
115 | if (!(buffer[start] & mask[c])) | 121 | if (! (buffer[start] & mask[c])) |
116 | vint_width++; | 122 | vint_width++; |
117 | else | 123 | else |
118 | break; | 124 | break; |
119 | if ( (vint_width >= 8) || (vint_width + start + 1 >= end) ) | 125 | if ( (vint_width >= 8) || (vint_width + start + 1 >= end) ) |
120 | return 0; | 126 | return 0; |
121 | 127 | ||
122 | *result = 0; | 128 | *result = 0; |
123 | for (c = 0; c < vint_width; c++) | 129 | for (c = 0; c < vint_width; c++) |
124 | { | 130 | { |
@@ -139,7 +145,7 @@ VINTparse (const unsigned char *buffer, size_t start, size_t end, | |||
139 | */ | 145 | */ |
140 | static unsigned int | 146 | static unsigned int |
141 | elementRead (const unsigned char *buffer, size_t start, size_t end, | 147 | elementRead (const unsigned char *buffer, size_t start, size_t end, |
142 | uint32_t *id, int64_t * size) | 148 | uint32_t *id, int64_t *size) |
143 | { | 149 | { |
144 | int64_t tempID; | 150 | int64_t tempID; |
145 | int64_t tempsize; | 151 | int64_t tempsize; |
@@ -147,12 +153,12 @@ elementRead (const unsigned char *buffer, size_t start, size_t end, | |||
147 | size_t size_offset; | 153 | size_t size_offset; |
148 | 154 | ||
149 | tempID = 0; | 155 | tempID = 0; |
150 | 156 | ||
151 | id_offset = VINTparse (buffer, start, end, &tempID, 0); | 157 | id_offset = VINTparse (buffer, start, end, &tempID, 0); |
152 | if (!id_offset) | 158 | if (! id_offset) |
153 | return 0; | 159 | return 0; |
154 | size_offset = VINTparse (buffer, start + id_offset, end, &tempsize, 1); | 160 | size_offset = VINTparse (buffer, start + id_offset, end, &tempsize, 1); |
155 | if (!size_offset) | 161 | if (! size_offset) |
156 | return 0; | 162 | return 0; |
157 | *id = (uint32_t) tempID; | 163 | *id = (uint32_t) tempID; |
158 | *size = tempsize; | 164 | *size = tempsize; |
@@ -172,10 +178,11 @@ getInt (const unsigned char *buffer, size_t start, size_t size) | |||
172 | 178 | ||
173 | result = 0; | 179 | result = 0; |
174 | for (c = 1; c <= size; c++) | 180 | for (c = 1; c <= size; c++) |
175 | result += ((uint64_t)buffer[start + c - 1]) << (8 * (size - c)); | 181 | result += ((uint64_t) buffer[start + c - 1]) << (8 * (size - c)); |
176 | return result; | 182 | return result; |
177 | } | 183 | } |
178 | 184 | ||
185 | |||
179 | static float | 186 | static float |
180 | getFloat (const unsigned char *buffer, size_t start, size_t size) | 187 | getFloat (const unsigned char *buffer, size_t start, size_t size) |
181 | { | 188 | { |
@@ -194,7 +201,8 @@ getFloat (const unsigned char *buffer, size_t start, size_t size) | |||
194 | return 0.0; | 201 | return 0.0; |
195 | } | 202 | } |
196 | 203 | ||
197 | static const unsigned int MKV_Parse_list[] = { | 204 | |
205 | static const unsigned int MKV_Parse_list[] = { | ||
198 | /*Elements, containing requed information (sub-elements), see enum in mkv.h for values */ | 206 | /*Elements, containing requed information (sub-elements), see enum in mkv.h for values */ |
199 | MKVID_Segment, | 207 | MKVID_Segment, |
200 | MKVID_Info, | 208 | MKVID_Info, |
@@ -244,14 +252,14 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
244 | if (NULL == start) | 252 | if (NULL == start) |
245 | return 0; | 253 | return 0; |
246 | p = start - data; | 254 | p = start - data; |
247 | 255 | ||
248 | /*main loop*/ | 256 | /*main loop*/ |
249 | ret = 0; | 257 | ret = 0; |
250 | do | 258 | do |
251 | { | 259 | { |
252 | offs = elementRead (data, p, size, &eID, &eSize); | 260 | offs = elementRead (data, p, size, &eID, &eSize); |
253 | p += offs; | 261 | p += offs; |
254 | if (!offs || p >= size) | 262 | if (! offs || (p >= size)) |
255 | break; | 263 | break; |
256 | if (MKVID_EBML == eID) | 264 | if (MKVID_EBML == eID) |
257 | { | 265 | { |
@@ -262,8 +270,8 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
262 | if (! is_mkv) | 270 | if (! is_mkv) |
263 | return 0; | 271 | return 0; |
264 | for (c = 0; c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list); c++) | 272 | for (c = 0; c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list); c++) |
265 | if (MKV_Parse_list[c] == eID) | 273 | if (MKV_Parse_list[c] == eID) |
266 | break; | 274 | break; |
267 | if (c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list)) | 275 | if (c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list)) |
268 | continue; | 276 | continue; |
269 | 277 | ||
@@ -272,7 +280,7 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
272 | 280 | ||
273 | if ( (eSize == 4) || (eSize == 8) || (eSize == 1) || (eSize == 2)) | 281 | if ( (eSize == 4) || (eSize == 8) || (eSize == 1) || (eSize == 2)) |
274 | value = getInt (data, p, eSize); | 282 | value = getInt (data, p, eSize); |
275 | 283 | ||
276 | switch (eID) | 284 | switch (eID) |
277 | { | 285 | { |
278 | case MKVID_TrackType: /*detect a stream type (video/audio/text) */ | 286 | case MKVID_TrackType: /*detect a stream type (video/audio/text) */ |
@@ -286,9 +294,9 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
286 | have_audio = 1; | 294 | have_audio = 1; |
287 | break; | 295 | break; |
288 | case MKV_Track_subtitle: | 296 | case MKV_Track_subtitle: |
289 | break; | 297 | break; |
290 | case MKV_Track_subtitle_orig: | 298 | case MKV_Track_subtitle_orig: |
291 | break; | 299 | break; |
292 | } | 300 | } |
293 | break; | 301 | break; |
294 | case MKVID_DefaultDuration: | 302 | case MKVID_DefaultDuration: |
@@ -298,11 +306,11 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
298 | fps = 0; | 306 | fps = 0; |
299 | break; | 307 | break; |
300 | case MKVID_Language: | 308 | case MKVID_Language: |
301 | snprintf (buffer, | 309 | snprintf (buffer, |
302 | sizeof (buffer), | 310 | sizeof (buffer), |
303 | "%.*s", | 311 | "%.*s", |
304 | (int) eSize, | 312 | (int) eSize, |
305 | data + p); | 313 | data + p); |
306 | ADD (buffer, EXTRACTOR_METATYPE_LANGUAGE); | 314 | ADD (buffer, EXTRACTOR_METATYPE_LANGUAGE); |
307 | break; | 315 | break; |
308 | case MKVID_CodecName: | 316 | case MKVID_CodecName: |
@@ -340,10 +348,10 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
340 | if (eSize > MAX_STRING_SIZE) | 348 | if (eSize > MAX_STRING_SIZE) |
341 | break; | 349 | break; |
342 | snprintf (buffer, | 350 | snprintf (buffer, |
343 | sizeof (buffer), | 351 | sizeof (buffer), |
344 | "%.*s", | 352 | "%.*s", |
345 | (int) eSize, | 353 | (int) eSize, |
346 | (const char*) data + p); | 354 | (const char*) data + p); |
347 | ADD (buffer, EXTRACTOR_METATYPE_TITLE); | 355 | ADD (buffer, EXTRACTOR_METATYPE_TITLE); |
348 | break; | 356 | break; |
349 | default: | 357 | default: |
@@ -354,20 +362,20 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
354 | while (1); | 362 | while (1); |
355 | 363 | ||
356 | snprintf (buffer, | 364 | snprintf (buffer, |
357 | sizeof (buffer), | 365 | sizeof (buffer), |
358 | "%u s (%s%s%s)", | 366 | "%u s (%s%s%s)", |
359 | (unsigned int) (duration / 1e+9 * (float) timescale), | 367 | (unsigned int) (duration / 1e+9 * (float) timescale), |
360 | (have_audio ? "audio" : ""), | 368 | (have_audio ? "audio" : ""), |
361 | ((have_audio && have_video) ? "/" : ""), | 369 | ((have_audio && have_video) ? "/" : ""), |
362 | (have_video ? "video" : "")); | 370 | (have_video ? "video" : "")); |
363 | if ( (have_audio || have_video) && (duration >= 0.0) ) | 371 | if ( (have_audio || have_video) && (duration >= 0.0) ) |
364 | ADD (buffer, EXTRACTOR_METATYPE_DURATION); | 372 | ADD (buffer, EXTRACTOR_METATYPE_DURATION); |
365 | if ( (value_width != 0) && (value_height != 0) ) | 373 | if ( (value_width != 0) && (value_height != 0) ) |
366 | { | 374 | { |
367 | snprintf (buffer, | 375 | snprintf (buffer, |
368 | sizeof(buffer), | 376 | sizeof(buffer), |
369 | "%ux%u", | 377 | "%ux%u", |
370 | value_width, value_height); | 378 | value_width, value_height); |
371 | ADD (buffer, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS); | 379 | ADD (buffer, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS); |
372 | } | 380 | } |
373 | 381 | ||
@@ -375,34 +383,34 @@ EXTRACTOR_mkv_extract (const unsigned char *data, size_t size, | |||
375 | { | 383 | { |
376 | if ( (fps != 0) && (bit_depth != 0) ) | 384 | if ( (fps != 0) && (bit_depth != 0) ) |
377 | snprintf (buffer, | 385 | snprintf (buffer, |
378 | sizeof (buffer), | 386 | sizeof (buffer), |
379 | "%.*s (%u fps, %u bit)", | 387 | "%.*s (%u fps, %u bit)", |
380 | codec_strlen, | 388 | codec_strlen, |
381 | codec, | 389 | codec, |
382 | fps, | 390 | fps, |
383 | bit_depth); | 391 | bit_depth); |
384 | else if (fps != 0) | 392 | else if (fps != 0) |
385 | snprintf (buffer, | 393 | snprintf (buffer, |
386 | sizeof (buffer), | 394 | sizeof (buffer), |
387 | "%.*s (%u fps)", | 395 | "%.*s (%u fps)", |
388 | codec_strlen, | 396 | codec_strlen, |
389 | codec, | 397 | codec, |
390 | fps); | 398 | fps); |
391 | else if (bit_depth != 0) | 399 | else if (bit_depth != 0) |
392 | snprintf (buffer, | 400 | snprintf (buffer, |
393 | sizeof (buffer), | 401 | sizeof (buffer), |
394 | "%.*s (%u bit)", | 402 | "%.*s (%u bit)", |
395 | codec_strlen, | 403 | codec_strlen, |
396 | codec, | 404 | codec, |
397 | bit_depth); | 405 | bit_depth); |
398 | else | 406 | else |
399 | snprintf (buffer, | 407 | snprintf (buffer, |
400 | sizeof (buffer), | 408 | sizeof (buffer), |
401 | "%.*s", | 409 | "%.*s", |
402 | codec_strlen, | 410 | codec_strlen, |
403 | codec); | 411 | codec); |
404 | ADD (buffer, | 412 | ADD (buffer, |
405 | EXTRACTOR_METATYPE_FORMAT); | 413 | EXTRACTOR_METATYPE_FORMAT); |
406 | } | 414 | } |
407 | EXIT: | 415 | EXIT: |
408 | return ret; | 416 | return ret; |