aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/old/mkv_extractor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/old/mkv_extractor.c')
-rw-r--r--src/plugins/old/mkv_extractor.c144
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 */
99static size_t 103static size_t
100VINTparse (const unsigned char *buffer, size_t start, size_t end, 104VINTparse (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 */
140static unsigned int 146static unsigned int
141elementRead (const unsigned char *buffer, size_t start, size_t end, 147elementRead (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
179static float 186static float
180getFloat (const unsigned char *buffer, size_t start, size_t size) 187getFloat (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
197static const unsigned int MKV_Parse_list[] = { 204
205static 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 }
407EXIT: 415EXIT:
408 return ret; 416 return ret;