comparison libmpdemux/demux_mkv.c @ 11807:9a81d7b4c0b6

Added the new C based Matroska demuxer by Aurelien Jacobs.
author mosu
date Mon, 19 Jan 2004 19:16:10 +0000
parents
children c4bd86214a20
comparison
equal deleted inserted replaced
11806:4f14825fd446 11807:9a81d7b4c0b6
1 /*
2 * native Matroska demuxer
3 * Written by Aurelien Jacobs <aurel@gnuage.org>
4 * Based on the one written by Ronald Bultje for gstreamer
5 * and on demux_mkv.cpp from Moritz Bunkus.
6 * Licence: GPL
7 */
8
9 #include "config.h"
10 #ifdef HAVE_MATROSKA
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <ctype.h>
15
16 #include "stream.h"
17 #include "demuxer.h"
18 #include "stheader.h"
19 #include "ebml.h"
20 #include "matroska.h"
21 #include "bswap.h"
22
23 #include "../subreader.h"
24 #include "../libvo/sub.h"
25
26 #ifdef USE_QTX_CODECS
27 #include "qtx/qtxsdk/components.h"
28 #endif
29
30 #ifdef HAVE_ZLIB
31 #include <zlib.h>
32 #endif
33
34 #ifdef USE_LIBLZO
35 #include <lzo1x.h>
36 #else
37 #include "../libmpcodecs/native/minilzo.h"
38 #endif
39
40
41 typedef struct
42 {
43 uint32_t order, type, scope;
44 uint32_t comp_algo;
45 uint8_t *comp_settings;
46 int comp_settings_len;
47 } mkv_content_encoding_t;
48
49 typedef struct mkv_track
50 {
51 int tnum;
52
53 char *codec_id;
54 int ms_compat;
55 char *language;
56
57 int type;
58
59 uint32_t v_width, v_height, v_dwidth, v_dheight;
60 float v_frate;
61
62 uint32_t a_formattag;
63 uint32_t a_channels, a_bps;
64 float a_sfreq;
65
66 float default_duration;
67
68 int default_track;
69
70 void *private_data;
71 unsigned int private_size;
72
73 /* for vorbis audio */
74 unsigned char *headers[3];
75 uint32_t header_sizes[3];
76
77 /* stuff for realmedia */
78 int realmedia;
79 int rv_kf_base, rv_kf_pts;
80 float rv_pts; /* previous video timestamp */
81 float ra_pts; /* previous audio timestamp */
82
83 /* stuff for quicktime */
84 int fix_i_bps;
85 float qt_last_a_pts;
86
87 int subtitle_type;
88
89 /* generic content encoding support */
90 mkv_content_encoding_t *encodings;
91 int num_encodings;
92 } mkv_track_t;
93
94 typedef struct mkv_index
95 {
96 int tnum;
97 uint64_t timecode, filepos;
98 } mkv_index_t;
99
100 typedef struct mkv_chapter
101 {
102 uint64_t start, end;
103 } mkv_chapter_t;
104
105 typedef struct mkv_demuxer
106 {
107 off_t segment_start;
108
109 float duration, last_pts;
110 uint64_t last_filepos;
111
112 mkv_track_t **tracks;
113 int num_tracks;
114
115 uint64_t tc_scale, cluster_tc, first_tc;
116 int has_first_tc;
117
118 uint64_t clear_subs_at[SUB_MAX_TEXT];
119 subtitle subs;
120
121 uint64_t cluster_size;
122 uint64_t blockgroup_size;
123
124 mkv_index_t *indexes;
125 int num_indexes;
126
127 off_t *parsed_cues;
128 int parsed_cues_num;
129 off_t *parsed_seekhead;
130 int parsed_seekhead_num;
131
132 uint64_t *cluster_positions;
133 int num_cluster_pos;
134
135 int64_t skip_to_timecode;
136 int v_skip_to_keyframe, a_skip_to_keyframe;
137
138 mkv_chapter_t *chapters;
139 int num_chapters;
140 int64_t stop_timecode;
141 } mkv_demuxer_t;
142
143
144 #if __GNUC__ == 2
145 #pragma pack(2)
146 #else
147 #pragma pack(push,2)
148 #endif
149
150 typedef struct
151 {
152 uint32_t chunks; /* number of chunks */
153 uint32_t timestamp; /* timestamp from packet header */
154 uint32_t len; /* length of actual data */
155 uint32_t chunktab; /* offset to chunk offset array */
156 } dp_hdr_t;
157
158 typedef struct
159 {
160 uint32_t size;
161 uint32_t fourcc1;
162 uint32_t fourcc2;
163 uint16_t width;
164 uint16_t height;
165 uint16_t bpp;
166 uint32_t unknown1;
167 uint32_t fps;
168 uint32_t type1;
169 uint32_t type2;
170 } real_video_props_t;
171
172 typedef struct
173 {
174 uint32_t fourcc1; /* '.', 'r', 'a', 0xfd */
175 uint16_t version1; /* 4 or 5 */
176 uint16_t unknown1; /* 00 000 */
177 uint32_t fourcc2; /* .ra4 or .ra5 */
178 uint32_t unknown2; /* ??? */
179 uint16_t version2; /* 4 or 5 */
180 uint32_t header_size; /* == 0x4e */
181 uint16_t flavor; /* codec flavor id */
182 uint32_t coded_frame_size; /* coded frame size */
183 uint32_t unknown3; /* big number */
184 uint32_t unknown4; /* bigger number */
185 uint32_t unknown5; /* yet another number */
186 uint16_t sub_packet_h;
187 uint16_t frame_size;
188 uint16_t sub_packet_size;
189 uint16_t unknown6; /* 00 00 */
190 uint16_t sample_rate;
191 uint16_t unknown8; /* 0 */
192 uint16_t sample_size;
193 uint16_t channels;
194 } real_audio_v4_props_t;
195
196 typedef struct
197 {
198 uint32_t fourcc1; /* '.', 'r', 'a', 0xfd */
199 uint16_t version1; /* 4 or 5 */
200 uint16_t unknown1; /* 00 000 */
201 uint32_t fourcc2; /* .ra4 or .ra5 */
202 uint32_t unknown2; /* ??? */
203 uint16_t version2; /* 4 or 5 */
204 uint32_t header_size; /* == 0x4e */
205 uint16_t flavor; /* codec flavor id */
206 uint32_t coded_frame_size; /* coded frame size */
207 uint32_t unknown3; /* big number */
208 uint32_t unknown4; /* bigger number */
209 uint32_t unknown5; /* yet another number */
210 uint16_t sub_packet_h;
211 uint16_t frame_size;
212 uint16_t sub_packet_size;
213 uint16_t unknown6; /* 00 00 */
214 uint8_t unknown7[6]; /* 0, srate, 0 */
215 uint16_t sample_rate;
216 uint16_t unknown8; /* 0 */
217 uint16_t sample_size;
218 uint16_t channels;
219 uint32_t genr; /* "genr" */
220 uint32_t fourcc3; /* fourcc */
221 } real_audio_v5_props_t;
222
223
224 /* for e.g. "-slang ger" */
225 extern char *dvdsub_lang;
226 extern char *audio_lang;
227
228
229 static mkv_track_t *
230 demux_mkv_find_track_by_num (mkv_demuxer_t *d, int n, int type)
231 {
232 int i, id;
233
234 for (i=0, id=0; i < d->num_tracks; i++)
235 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
236 if (id++ == n)
237 return d->tracks[i];
238
239 return NULL;
240 }
241
242 static mkv_track_t *
243 demux_mkv_find_track_by_language (mkv_demuxer_t *d, char *language, int type)
244 {
245 int i;
246
247 for (i=0; i < d->num_tracks; i++)
248 if (d->tracks[i] != NULL && d->tracks[i]->language != NULL &&
249 d->tracks[i]->type == type && !strcmp(d->tracks[i]->language,language))
250 return d->tracks[i];
251
252 return NULL;
253 }
254
255 static void
256 add_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position)
257 {
258 int i = mkv_d->num_cluster_pos;
259
260 while (i--)
261 if (mkv_d->cluster_positions[i] == position)
262 return;
263
264 if (!mkv_d->cluster_positions)
265 mkv_d->cluster_positions = (uint64_t *) malloc (32 * sizeof (uint64_t));
266 else if (!(mkv_d->num_cluster_pos % 32))
267 mkv_d->cluster_positions = (uint64_t *) realloc(mkv_d->cluster_positions,
268 (mkv_d->num_cluster_pos+32)
269 * sizeof (uint64_t));
270 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position;
271 }
272
273
274 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
275 static int
276 aac_get_sample_rate_index (uint32_t sample_rate)
277 {
278 if (92017 <= sample_rate)
279 return 0;
280 else if (75132 <= sample_rate)
281 return 1;
282 else if (55426 <= sample_rate)
283 return 2;
284 else if (46009 <= sample_rate)
285 return 3;
286 else if (37566 <= sample_rate)
287 return 4;
288 else if (27713 <= sample_rate)
289 return 5;
290 else if (23004 <= sample_rate)
291 return 6;
292 else if (18783 <= sample_rate)
293 return 7;
294 else if (13856 <= sample_rate)
295 return 8;
296 else if (11502 <= sample_rate)
297 return 9;
298 else if (9391 <= sample_rate)
299 return 10;
300 else
301 return 11;
302 }
303
304
305 static int
306 demux_mkv_decode (mkv_track_t *track, uint8_t *src, uint8_t **dest,
307 uint32_t *size, uint32_t type)
308 {
309 int i, result;
310 int modified = 0;
311
312 *dest = src;
313 if (track->num_encodings <= 0)
314 return 0;
315
316 for (i=0; i<track->num_encodings; i++)
317 {
318 if (!(track->encodings[i].scope & type))
319 continue;
320
321 #ifdef HAVE_ZLIB
322 if (track->encodings[i].comp_algo == 0)
323 {
324 /* zlib encoded track */
325 z_stream zstream;
326
327 zstream.zalloc = (alloc_func) 0;
328 zstream.zfree = (free_func) 0;
329 zstream.opaque = (voidpf) 0;
330 if (inflateInit (&zstream) != Z_OK)
331 {
332 mp_msg (MSGT_DEMUX, MSGL_WARN,
333 "[mkv] zlib initialization failed.\n");
334 return modified;
335 }
336 zstream.next_in = (Bytef *) src;
337 zstream.avail_in = *size;
338
339 modified = 1;
340 *dest = (uint8_t *) malloc (*size);
341 zstream.avail_out = *size;
342 do {
343 *size += 4000;
344 *dest = (uint8_t *) realloc (*dest, *size);
345 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
346 result = inflate (&zstream, Z_NO_FLUSH);
347 if (result != Z_OK && result != Z_STREAM_END)
348 {
349 mp_msg (MSGT_DEMUX, MSGL_WARN,
350 "[mkv] zlib decompression failed.\n");
351 free(*dest);
352 *dest = NULL;
353 inflateEnd (&zstream);
354 return modified;
355 }
356 zstream.avail_out += 4000;
357 } while (zstream.avail_out == 4000 &&
358 zstream.avail_in != 0 && result != Z_STREAM_END);
359
360 *size = zstream.total_out;
361 inflateEnd (&zstream);
362 }
363 #endif
364 if (track->encodings[i].comp_algo == 2)
365 {
366 /* lzo encoded track */
367 int dstlen = *size * 3;
368
369 if (lzo_init () != LZO_E_OK)
370 {
371 mp_msg (MSGT_DEMUX, MSGL_WARN,
372 "[mkv] lzo initialization failed.\n");
373 return modified;
374 }
375
376 *dest = (uint8_t *) malloc (dstlen);
377 while (1)
378 {
379 result = lzo1x_decompress_safe (src, *size, *dest, &dstlen,
380 NULL);
381 if (result == LZO_E_OK)
382 break;
383 if (result != LZO_E_OUTPUT_OVERRUN)
384 {
385 mp_msg (MSGT_DEMUX, MSGL_WARN,
386 "[mkv] lzo decompression failed.\n");
387 return modified;
388 }
389 mp_msg (MSGT_DEMUX, MSGL_DBG2,
390 "[mkv] lzo decompression buffer too small.\n");
391 dstlen *= 2;
392 *dest = (uint8_t *) realloc (*dest, dstlen);
393 }
394 *size = dstlen;
395 }
396 }
397
398 return modified;
399 }
400
401
402 static int
403 demux_mkv_read_info (demuxer_t *demuxer)
404 {
405 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
406 stream_t *s = demuxer->stream;
407 uint64_t length, l;
408 int il;
409
410 length = ebml_read_length (s, NULL);
411 while (length > 0)
412 {
413 switch (ebml_read_id (s, &il))
414 {
415 case MATROSKA_ID_TIMECODESCALE:
416 {
417 uint64_t num = ebml_read_uint (s, &l);
418 if (num == EBML_UINT_INVALID)
419 return 1;
420 mkv_d->tc_scale = num;
421 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + timecode scale: %llu\n",
422 mkv_d->tc_scale);
423 break;
424 }
425
426 case MATROSKA_ID_DURATION:
427 {
428 long double num = ebml_read_float (s, &l);
429 if (num == EBML_FLOAT_INVALID)
430 return 1;
431 mkv_d->duration = num * mkv_d->tc_scale / 1000000000.0;
432 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
433 mkv_d->duration);
434 break;
435 }
436
437 default:
438 ebml_read_skip (s, &l);
439 break;
440 }
441 length -= l + il;
442 }
443 return 0;
444 }
445
446 static int
447 demux_mkv_read_trackencodings (demuxer_t *demuxer, mkv_track_t *track)
448 {
449 stream_t *s = demuxer->stream;
450 mkv_content_encoding_t *ce, e;
451 uint64_t len, length, l;
452 int il, n;
453
454 ce = (mkv_content_encoding_t *) malloc (sizeof (*ce));
455 n = 0;
456
457 len = length = ebml_read_length (s, &il);
458 len += il;
459 while (length > 0)
460 {
461 switch (ebml_read_id (s, &il))
462 {
463 case MATROSKA_ID_CONTENTENCODING:
464 {
465 uint64_t len;
466 int i;
467
468 memset (&e, 0, sizeof (e));
469 e.scope = 1;
470
471 len = ebml_read_length (s, &i);
472 l = len + i;
473
474 while (len > 0)
475 {
476 uint64_t num, l;
477 int il;
478
479 switch (ebml_read_id (s, &il))
480 {
481 case MATROSKA_ID_CONTENTENCODINGORDER:
482 num = ebml_read_uint (s, &l);
483 if (num == EBML_UINT_INVALID)
484 return 0;
485 e.order = num;
486 break;
487
488 case MATROSKA_ID_CONTENTENCODINGSCOPE:
489 num = ebml_read_uint (s, &l);
490 if (num == EBML_UINT_INVALID)
491 return 0;
492 e.scope = num;
493 break;
494
495 case MATROSKA_ID_CONTENTENCODINGTYPE:
496 num = ebml_read_uint (s, &l);
497 if (num == EBML_UINT_INVALID)
498 return 0;
499 e.type = num;
500 break;
501
502 case MATROSKA_ID_CONTENTCOMPRESSION:
503 {
504 uint64_t le;
505
506 le = ebml_read_length (s, &i);
507 l = le + i;
508
509 while (le > 0)
510 {
511 uint64_t l;
512 int il;
513
514 switch (ebml_read_id (s, &il))
515 {
516 case MATROSKA_ID_CONTENTCOMPALGO:
517 num = ebml_read_uint (s, &l);
518 if (num == EBML_UINT_INVALID)
519 return 0;
520 e.comp_algo = num;
521 break;
522
523 case MATROSKA_ID_CONTENTCOMPSETTINGS:
524 l = ebml_read_length (s, &i);
525 e.comp_settings = (uint8_t *) malloc (l);
526 stream_read (s, e.comp_settings, l);
527 e.comp_settings_len = l;
528 l += i;
529 break;
530
531 default:
532 ebml_read_skip (s, &l);
533 break;
534 }
535 le -= l + il;
536 }
537
538 if (e.type == 1)
539 {
540 mp_msg(MSGT_DEMUX, MSGL_WARN,
541 "[mkv] Track number %u has been encrypted "
542 "and decryption has not yet been implemented."
543 " Skipping track.\n", track->tnum);
544 }
545 else if (e.type != 0)
546 {
547 mp_msg(MSGT_DEMUX, MSGL_WARN,
548 "[mkv] Unknown content encoding type for "
549 "track %u. Skipping track.\n", track->tnum);
550 }
551
552 if (e.comp_algo != 0 && e.comp_algo != 2)
553 {
554 mp_msg (MSGT_DEMUX, MSGL_WARN,
555 "[mkv] Track %u has been compressed with an "
556 "unknown/unsupported compression algorithm "
557 "(%u). Skipping track.\n",
558 track->tnum, e.comp_algo);
559 }
560 #ifndef HAVE_ZLIB
561 else if (e.comp_algo == 0)
562 {
563 mp_msg (MSGT_DEMUX, MSGL_WARN,
564 "Track %u was compressed with zlib but "
565 "mplayer has not been compiled with support "
566 "for zlib compression. Skipping track.\n",
567 track->tnum);
568 }
569 #endif
570
571 break;
572 }
573
574 default:
575 ebml_read_skip (s, &l);
576 break;
577 }
578 len -= l + il;
579 }
580 for (i=0; i<n; i++)
581 if (e.order <= ce[i].order)
582 break;
583 ce = (mkv_content_encoding_t *) realloc (ce, (n+1) *sizeof (*ce));
584 memmove (ce+i+1, ce+i, (n-i) * sizeof (*ce));
585 memcpy (ce+i, &e, sizeof (e));
586 n++;
587 break;
588 }
589
590 default:
591 ebml_read_skip (s, &l);
592 break;
593 }
594
595 length -= l + il;
596 }
597
598 track->encodings = ce;
599 track->num_encodings = n;
600 return len;
601 }
602
603 static int
604 demux_mkv_read_trackaudio (demuxer_t *demuxer, mkv_track_t *track)
605 {
606 stream_t *s = demuxer->stream;
607 uint64_t len, length, l;
608 int il;
609
610 track->a_sfreq = 8000.0;
611 track->a_channels = 1;
612
613 len = length = ebml_read_length (s, &il);
614 len += il;
615 while (length > 0)
616 {
617 switch (ebml_read_id (s, &il))
618 {
619 case MATROSKA_ID_AUDIOSAMPLINGFREQ:
620 {
621 long double num = ebml_read_float (s, &l);
622 if (num == EBML_FLOAT_INVALID)
623 return 0;
624 track->a_sfreq = num;
625 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Sampling frequency: %f\n",
626 track->a_sfreq);
627 break;
628 }
629
630 case MATROSKA_ID_AUDIOBITDEPTH:
631 {
632 uint64_t num = ebml_read_uint (s, &l);
633 if (num == EBML_UINT_INVALID)
634 return 0;
635 track->a_bps = num;
636 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
637 track->a_bps);
638 break;
639 }
640
641 case MATROSKA_ID_AUDIOCHANNELS:
642 {
643 uint64_t num = ebml_read_uint (s, &l);
644 if (num == EBML_UINT_INVALID)
645 return 0;
646 track->a_channels = num;
647 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
648 track->a_channels);
649 break;
650 }
651
652 default:
653 ebml_read_skip (s, &l);
654 break;
655 }
656 length -= l + il;
657 }
658 return len;
659 }
660
661 static int
662 demux_mkv_read_trackvideo (demuxer_t *demuxer, mkv_track_t *track)
663 {
664 stream_t *s = demuxer->stream;
665 uint64_t len, length, l;
666 int il;
667
668 len = length = ebml_read_length (s, &il);
669 len += il;
670 while (length > 0)
671 {
672 switch (ebml_read_id (s, &il))
673 {
674 case MATROSKA_ID_VIDEOFRAMERATE:
675 {
676 long double num = ebml_read_float (s, &l);
677 if (num == EBML_FLOAT_INVALID)
678 return 0;
679 track->v_frate = num;
680 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
681 track->v_frate);
682 break;
683 }
684
685 case MATROSKA_ID_VIDEODISPLAYWIDTH:
686 {
687 uint64_t num = ebml_read_uint (s, &l);
688 if (num == EBML_UINT_INVALID)
689 return 0;
690 track->v_dwidth = num;
691 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
692 track->v_dwidth);
693 break;
694 }
695
696 case MATROSKA_ID_VIDEODISPLAYHEIGHT:
697 {
698 uint64_t num = ebml_read_uint (s, &l);
699 if (num == EBML_UINT_INVALID)
700 return 0;
701 track->v_dheight = num;
702 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
703 track->v_dheight);
704 break;
705 }
706
707 case MATROSKA_ID_VIDEOPIXELWIDTH:
708 {
709 uint64_t num = ebml_read_uint (s, &l);
710 if (num == EBML_UINT_INVALID)
711 return 0;
712 track->v_width = num;
713 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
714 track->v_width);
715 break;
716 }
717
718 case MATROSKA_ID_VIDEOPIXELHEIGHT:
719 {
720 uint64_t num = ebml_read_uint (s, &l);
721 if (num == EBML_UINT_INVALID)
722 return 0;
723 track->v_height = num;
724 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
725 track->v_height);
726 break;
727 }
728
729 default:
730 ebml_read_skip (s, &l);
731 break;
732 }
733 length -= l + il;
734 }
735 return len;
736 }
737
738 static int
739 demux_mkv_read_trackentry (demuxer_t *demuxer)
740 {
741 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
742 stream_t *s = demuxer->stream;
743 mkv_track_t *track;
744 uint64_t len, length, l;
745 int il;
746
747 track = (mkv_track_t *) malloc (sizeof (*track));
748 memset(track, 0, sizeof(*track));
749 /* set default values */
750 track->default_track = 1;
751 track->language = strdup("eng");
752
753 len = length = ebml_read_length (s, &il);
754 len += il;
755 while (length > 0)
756 {
757 switch (ebml_read_id (s, &il))
758 {
759 case MATROSKA_ID_TRACKNUMBER:
760 {
761 uint64_t num = ebml_read_uint (s, &l);
762 if (num == EBML_UINT_INVALID)
763 return 0;
764 track->tnum = num;
765 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
766 track->tnum);
767 break;
768 }
769
770 case MATROSKA_ID_TRACKTYPE:
771 {
772 uint64_t num = ebml_read_uint (s, &l);
773 if (num == EBML_UINT_INVALID)
774 return 0;
775 track->type = num;
776 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
777 switch (track->type)
778 {
779 case MATROSKA_TRACK_AUDIO:
780 mp_msg (MSGT_DEMUX, MSGL_V, "Audio\n");
781 break;
782 case MATROSKA_TRACK_VIDEO:
783 mp_msg (MSGT_DEMUX, MSGL_V, "Video\n");
784 break;
785 case MATROSKA_TRACK_SUBTITLE:
786 mp_msg (MSGT_DEMUX, MSGL_V, "Subtitle\n");
787 break;
788 default:
789 mp_msg (MSGT_DEMUX, MSGL_V, "unknown\n");
790 break;
791 }
792 break;
793 }
794
795 case MATROSKA_ID_TRACKAUDIO:
796 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
797 l = demux_mkv_read_trackaudio (demuxer, track);
798 if (l == 0)
799 return 0;
800 break;
801
802 case MATROSKA_ID_TRACKVIDEO:
803 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
804 l = demux_mkv_read_trackvideo (demuxer, track);
805 if (l == 0)
806 return 0;
807 break;
808
809 case MATROSKA_ID_CODECID:
810 track->codec_id = ebml_read_ascii (s, &l);
811 if (track->codec_id == NULL)
812 return 0;
813 if (!strcmp (track->codec_id, MKV_V_MSCOMP))
814 track->ms_compat = 1;
815 else if (!strcmp (track->codec_id, MKV_S_VOBSUB))
816 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB;
817 else if (!strcmp (track->codec_id, MKV_S_TEXTSSA)
818 || !strcmp (track->codec_id, MKV_S_TEXTASS)
819 || !strcmp (track->codec_id, MKV_S_SSA)
820 || !strcmp (track->codec_id, MKV_S_ASS))
821 {
822 track->subtitle_type = MATROSKA_SUBTYPE_SSA;
823 sub_utf8 = 1;
824 }
825 else if (!strcmp (track->codec_id, MKV_S_TEXTASCII))
826 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
827 if (!strcmp (track->codec_id, MKV_S_TEXTUTF8))
828 {
829 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
830 sub_utf8 = 1;
831 }
832 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
833 track->codec_id);
834 break;
835
836 case MATROSKA_ID_CODECPRIVATE:
837 {
838 int x;
839 uint64_t num = ebml_read_length (s, &x);
840 l = x + num;
841 track->private_data = malloc (num);
842 if (stream_read(s, track->private_data, num) != (int) num)
843 return 0;
844 track->private_size = num;
845 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length "
846 "%u\n", track->private_size);
847 break;
848 }
849
850 case MATROSKA_ID_TRACKLANGUAGE:
851 track->language = ebml_read_utf8 (s, &l);
852 if (track->language == NULL)
853 return 0;
854 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
855 track->language);
856 break;
857
858 case MATROSKA_ID_TRACKFLAGDEFAULT:
859 {
860 uint64_t num = ebml_read_uint (s, &l);
861 if (num == EBML_UINT_INVALID)
862 return 0;
863 track->default_track = num;
864 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
865 track->default_track);
866 break;
867 }
868
869 case MATROSKA_ID_TRACKDEFAULTDURATION:
870 {
871 uint64_t num = ebml_read_uint (s, &l);
872 if (num == EBML_UINT_INVALID)
873 return 0;
874 if (num == 0)
875 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
876 else
877 {
878 track->v_frate = 1000000000.0 / num;
879 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: "
880 "%.3fms ( = %.3f fps)\n",num/1000000.0,track->v_frate);
881 }
882 break;
883 }
884
885 case MATROSKA_ID_TRACKENCODINGS:
886 l = demux_mkv_read_trackencodings (demuxer, track);
887 if (l == 0)
888 return 0;
889 break;
890
891 default:
892 ebml_read_skip (s, &l);
893 break;
894 }
895 length -= l + il;
896 }
897
898 mkv_d->tracks[mkv_d->num_tracks++] = track;
899 return len;
900 }
901
902 static int
903 demux_mkv_read_tracks (demuxer_t *demuxer)
904 {
905 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
906 stream_t *s = demuxer->stream;
907 uint64_t length, l;
908 int il;
909
910 mkv_d->tracks = (mkv_track_t **) malloc (sizeof (*mkv_d->tracks));
911 mkv_d->num_tracks = 0;
912
913 length = ebml_read_length (s, NULL);
914 while (length > 0)
915 {
916 switch (ebml_read_id (s, &il))
917 {
918 case MATROSKA_ID_TRACKENTRY:
919 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
920 mkv_d->tracks = (mkv_track_t **) realloc (mkv_d->tracks,
921 (mkv_d->num_tracks+1)
922 *sizeof (*mkv_d->tracks));
923 l = demux_mkv_read_trackentry (demuxer);
924 if (l == 0)
925 return 1;
926 break;
927
928 default:
929 ebml_read_skip (s, &l);
930 break;
931 }
932 length -= l + il;
933 }
934 return 0;
935 }
936
937 static int
938 demux_mkv_read_cues (demuxer_t *demuxer)
939 {
940 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
941 stream_t *s = demuxer->stream;
942 uint64_t length, l, time, track, pos;
943 off_t off;
944 int i, il;
945
946 off = stream_tell (s);
947 for (i=0; i<mkv_d->parsed_cues_num; i++)
948 if (mkv_d->parsed_cues[i] == off)
949 {
950 ebml_read_skip (s, NULL);
951 return 0;
952 }
953 mkv_d->parsed_cues = (off_t *) realloc (mkv_d->parsed_cues,
954 (mkv_d->parsed_cues_num+1)
955 * sizeof (off_t));
956 mkv_d->parsed_cues[mkv_d->parsed_cues_num++] = off;
957
958 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
959 length = ebml_read_length (s, NULL);
960
961 while (length > 0)
962 {
963 time = track = pos = EBML_UINT_INVALID;
964
965 switch (ebml_read_id (s, &il))
966 {
967 case MATROSKA_ID_POINTENTRY:
968 {
969 uint64_t len;
970
971 len = ebml_read_length (s, &i);
972 l = len + i;
973
974 while (len > 0)
975 {
976 uint64_t l;
977 int il;
978
979 switch (ebml_read_id (s, &il))
980 {
981 case MATROSKA_ID_CUETIME:
982 time = ebml_read_uint (s, &l);
983 break;
984
985 case MATROSKA_ID_CUETRACKPOSITION:
986 {
987 uint64_t le;
988
989 le = ebml_read_length (s, &i);
990 l = le + i;
991
992 while (le > 0)
993 {
994 uint64_t l;
995 int il;
996
997 switch (ebml_read_id (s, &il))
998 {
999 case MATROSKA_ID_CUETRACK:
1000 track = ebml_read_uint (s, &l);
1001 break;
1002
1003 case MATROSKA_ID_CUECLUSTERPOSITION:
1004 pos = ebml_read_uint (s, &l);
1005 break;
1006
1007 default:
1008 ebml_read_skip (s, &l);
1009 break;
1010 }
1011 le -= l + il;
1012 }
1013 break;
1014 }
1015
1016 default:
1017 ebml_read_skip (s, &l);
1018 break;
1019 }
1020 len -= l + il;
1021 }
1022 break;
1023 }
1024
1025 default:
1026 ebml_read_skip (s, &l);
1027 break;
1028 }
1029
1030 length -= l + il;
1031
1032 if (time != EBML_UINT_INVALID && track != EBML_UINT_INVALID
1033 && pos != EBML_UINT_INVALID)
1034 {
1035 if (mkv_d->indexes == NULL)
1036 mkv_d->indexes = (mkv_index_t *) malloc (32*sizeof (mkv_index_t));
1037 else if (mkv_d->num_indexes % 32 == 0)
1038 mkv_d->indexes = (mkv_index_t *) realloc (mkv_d->indexes,
1039 (mkv_d->num_indexes+32)
1040 *sizeof (mkv_index_t));
1041 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
1042 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
1043 mkv_d->indexes[mkv_d->num_indexes].filepos =mkv_d->segment_start+pos;
1044 mp_msg (MSGT_DEMUX, MSGL_DBG2, "[mkv] |+ found cue point "
1045 "for track %llu: timecode %llu, filepos: %llu\n",
1046 track, time, mkv_d->segment_start + pos);
1047 mkv_d->num_indexes++;
1048 }
1049 }
1050
1051 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
1052 return 0;
1053 }
1054
1055 static int
1056 demux_mkv_read_chapters (demuxer_t *demuxer)
1057 {
1058 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1059 stream_t *s = demuxer->stream;
1060 uint64_t length, l;
1061 int il;
1062
1063 if (mkv_d->chapters)
1064 {
1065 ebml_read_skip (s, NULL);
1066 return 0;
1067 }
1068
1069 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
1070 length = ebml_read_length (s, NULL);
1071
1072 while (length > 0)
1073 {
1074 switch (ebml_read_id (s, &il))
1075 {
1076 case MATROSKA_ID_EDITIONENTRY:
1077 {
1078 uint64_t len;
1079 int i;
1080
1081 len = ebml_read_length (s, &i);
1082 l = len + i;
1083
1084 while (len > 0)
1085 {
1086 uint64_t l;
1087 int il;
1088
1089 switch (ebml_read_id (s, &il))
1090 {
1091 case MATROSKA_ID_CHAPTERATOM:
1092 {
1093 uint64_t len, start=0, end=0;
1094 int i;
1095
1096 len = ebml_read_length (s, &i);
1097 l = len + i;
1098
1099 if (mkv_d->chapters == NULL)
1100 mkv_d->chapters = malloc (32*sizeof(*mkv_d->chapters));
1101 else if (!(mkv_d->num_chapters % 32))
1102 mkv_d->chapters = realloc (mkv_d->chapters,
1103 (mkv_d->num_chapters + 32)
1104 * sizeof(*mkv_d->chapters));
1105
1106 while (len > 0)
1107 {
1108 uint64_t l;
1109 int il;
1110
1111 switch (ebml_read_id (s, &il))
1112 {
1113 case MATROSKA_ID_CHAPTERTIMESTART:
1114 start = ebml_read_uint (s, &l) / 1000000;
1115 break;
1116
1117 case MATROSKA_ID_CHAPTERTIMEEND:
1118 end = ebml_read_uint (s, &l) / 1000000;
1119 break;
1120
1121 default:
1122 ebml_read_skip (s, &l);
1123 break;
1124 }
1125 len -= l + il;
1126 }
1127
1128 mkv_d->chapters[mkv_d->num_chapters].start = start;
1129 mkv_d->chapters[mkv_d->num_chapters].end = end;
1130 mp_msg(MSGT_DEMUX, MSGL_V,
1131 "[mkv] Chapter %u from %02d:%02d:%02d."
1132 "%03d to %02d:%02d:%02d.%03d\n",
1133 ++mkv_d->num_chapters,
1134 (int) (start / 60 / 60 / 1000),
1135 (int) ((start / 60 / 1000) % 60),
1136 (int) ((start / 1000) % 60),
1137 (int) (start % 1000),
1138 (int) (end / 60 / 60 / 1000),
1139 (int) ((end / 60 / 1000) % 60),
1140 (int) ((end / 1000) % 60),
1141 (int) (end % 1000));
1142 break;
1143 }
1144
1145 default:
1146 ebml_read_skip (s, &l);
1147 break;
1148 }
1149 len -= l + il;
1150 }
1151 break;
1152 }
1153
1154 default:
1155 ebml_read_skip (s, &l);
1156 break;
1157 }
1158
1159 length -= l + il;
1160 }
1161
1162 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing chapters ] ---------\n");
1163 return 0;
1164 }
1165
1166 static int
1167 demux_mkv_read_tags (demuxer_t *demuxer)
1168 {
1169 ebml_read_skip (demuxer->stream, NULL);
1170 return 0;
1171 }
1172
1173 static int
1174 demux_mkv_read_seekhead (demuxer_t *demuxer)
1175 {
1176 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1177 stream_t *s = demuxer->stream;
1178 uint64_t length, l, seek_pos, saved_pos, num;
1179 uint32_t seek_id;
1180 int i, il, res = 0;
1181 off_t off;
1182
1183 off = stream_tell (s);
1184 for (i=0; i<mkv_d->parsed_seekhead_num; i++)
1185 if (mkv_d->parsed_seekhead[i] == off)
1186 {
1187 ebml_read_skip (s, NULL);
1188 return 0;
1189 }
1190 mkv_d->parsed_seekhead = (off_t *) realloc (mkv_d->parsed_seekhead,
1191 (mkv_d->parsed_seekhead_num+1)
1192 * sizeof (off_t));
1193 mkv_d->parsed_seekhead[mkv_d->parsed_seekhead_num++] = off;
1194
1195 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing seek head ] ---------\n");
1196 length = ebml_read_length (s, NULL);
1197 while (length > 0 && !res)
1198 {
1199
1200 seek_id = 0;
1201 seek_pos = EBML_UINT_INVALID;
1202
1203 switch (ebml_read_id (s, &il))
1204 {
1205 case MATROSKA_ID_SEEKENTRY:
1206 {
1207 uint64_t len;
1208
1209 len = ebml_read_length (s, &i);
1210 l = len + i;
1211
1212 while (len > 0)
1213 {
1214 uint64_t l;
1215 int il;
1216
1217 switch (ebml_read_id (s, &il))
1218 {
1219 case MATROSKA_ID_SEEKID:
1220 num = ebml_read_uint (s, &l);
1221 if (num != EBML_UINT_INVALID)
1222 seek_id = num;
1223 break;
1224
1225 case MATROSKA_ID_SEEKPOSITION:
1226 seek_pos = ebml_read_uint (s, &l);
1227 break;
1228
1229 default:
1230 ebml_read_skip (s, &l);
1231 break;
1232 }
1233 len -= l + il;
1234 }
1235
1236 break;
1237 }
1238
1239 default:
1240 ebml_read_skip (s, &l);
1241 break;
1242 }
1243 length -= l + il;
1244
1245 if (seek_id == 0 || seek_id == MATROSKA_ID_CLUSTER
1246 || seek_pos == EBML_UINT_INVALID)
1247 continue;
1248
1249 saved_pos = stream_tell (s);
1250 if (!stream_seek (s, mkv_d->segment_start + seek_pos))
1251 res = 1;
1252 else
1253 {
1254 if (ebml_read_id (s, &il) != seek_id)
1255 res = 1;
1256 else
1257 switch (seek_id)
1258 {
1259 case MATROSKA_ID_CUES:
1260 if (demux_mkv_read_cues (demuxer))
1261 res = 1;
1262 break;
1263
1264 case MATROSKA_ID_TAGS:
1265 if (demux_mkv_read_tags (demuxer))
1266 res = 1;
1267 break;
1268
1269 case MATROSKA_ID_SEEKHEAD:
1270 if (demux_mkv_read_seekhead (demuxer))
1271 res = 1;
1272 break;
1273
1274 case MATROSKA_ID_CHAPTERS:
1275 if (demux_mkv_read_chapters (demuxer))
1276 res = 1;
1277 break;
1278 }
1279 }
1280
1281 stream_seek (s, saved_pos);
1282 }
1283 if (length > 0)
1284 stream_seek (s, stream_tell (s) + length);
1285 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing seek head ] ---------\n");
1286 return res;
1287 }
1288
1289 static void
1290 display_tracks (mkv_demuxer_t *mkv_d)
1291 {
1292 int i, vid=0, aid=0, sid=0;
1293
1294 for (i=0; i<mkv_d->num_tracks; i++)
1295 {
1296 char *type = "unknown", str[32];
1297 *str = '\0';
1298 switch (mkv_d->tracks[i]->type)
1299 {
1300 case MATROSKA_TRACK_VIDEO:
1301 type = "video";
1302 sprintf (str, "-vid %u", vid++);
1303 break;
1304 case MATROSKA_TRACK_AUDIO:
1305 type = "audio";
1306 sprintf (str, "-aid %u, -alang %s",aid++,mkv_d->tracks[i]->language);
1307 break;
1308 case MATROSKA_TRACK_SUBTITLE:
1309 type = "sutitles";
1310 sprintf (str, "-sid %u, -slang %s",sid++,mkv_d->tracks[i]->language);
1311 break;
1312 }
1313 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
1314 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id, str);
1315 }
1316 }
1317
1318 static int
1319 demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track)
1320 {
1321 BITMAPINFOHEADER *bih;
1322 void *ImageDesc = NULL;
1323 sh_video_t *sh_v;
1324
1325 if (track->ms_compat) /* MS compatibility mode */
1326 {
1327 BITMAPINFOHEADER *src;
1328
1329 if (track->private_data == NULL
1330 || track->private_size < sizeof (BITMAPINFOHEADER))
1331 return 1;
1332
1333 src = (BITMAPINFOHEADER *) track->private_data;
1334 bih = (BITMAPINFOHEADER *) malloc (track->private_size);
1335 memset (bih, 0, track->private_size);
1336 bih->biSize = le2me_32 (src->biSize);
1337 bih->biWidth = le2me_32 (src->biWidth);
1338 bih->biHeight = le2me_32 (src->biHeight);
1339 bih->biPlanes = le2me_16 (src->biPlanes);
1340 bih->biBitCount = le2me_16 (src->biBitCount);
1341 bih->biCompression = le2me_32 (src->biCompression);
1342 bih->biSizeImage = le2me_32 (src->biSizeImage);
1343 bih->biXPelsPerMeter = le2me_32 (src->biXPelsPerMeter);
1344 bih->biYPelsPerMeter = le2me_32 (src->biYPelsPerMeter);
1345 bih->biClrUsed = le2me_32 (src->biClrUsed);
1346 bih->biClrImportant = le2me_32 (src->biClrImportant);
1347 memcpy((char *) bih + sizeof (BITMAPINFOHEADER),
1348 (char *) src + sizeof (BITMAPINFOHEADER),
1349 track->private_size - sizeof (BITMAPINFOHEADER));
1350
1351 if (track->v_width == 0)
1352 track->v_width = bih->biWidth;
1353 if (track->v_height == 0)
1354 track->v_height = bih->biHeight;
1355 }
1356 else
1357 {
1358 bih = (BITMAPINFOHEADER *) malloc (sizeof (BITMAPINFOHEADER));
1359 memset (bih, 0, sizeof (BITMAPINFOHEADER));
1360 bih->biSize = sizeof (BITMAPINFOHEADER);
1361 bih->biWidth = track->v_width;
1362 bih->biHeight = track->v_height;
1363 bih->biBitCount = 24;
1364 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8;
1365
1366 if (track->private_size >= sizeof (real_video_props_t)
1367 && (!strcmp (track->codec_id, MKV_V_REALV10)
1368 || !strcmp (track->codec_id, MKV_V_REALV20)
1369 || !strcmp (track->codec_id, MKV_V_REALV30)
1370 || !strcmp (track->codec_id, MKV_V_REALV40)))
1371 {
1372 unsigned char *dst, *src;
1373 real_video_props_t *rvp;
1374 uint32_t type2;
1375
1376 rvp = (real_video_props_t *) track->private_data;
1377 src = (unsigned char *) (rvp + 1);
1378
1379 bih = (BITMAPINFOHEADER *) realloc(bih,
1380 sizeof (BITMAPINFOHEADER)+12);
1381 bih->biSize = 48;
1382 bih->biPlanes = 1;
1383 type2 = be2me_32 (rvp->type2);
1384 if (type2 == 0x10003000 || type2 == 0x10003001)
1385 bih->biCompression=mmioFOURCC('R','V','1','3');
1386 else
1387 bih->biCompression=mmioFOURCC('R','V',track->codec_id[9],'0');
1388 dst = (unsigned char *) (bih + 1);
1389 ((unsigned int *) dst)[0] = be2me_32 (rvp->type1);
1390 ((unsigned int *) dst)[1] = type2;
1391
1392 if (bih->biCompression <= 0x30335652 && type2 >= 0x20200002)
1393 {
1394 /* read secondary WxH for the cmsg24[] (see vd_realvid.c) */
1395 ((unsigned short *)(bih+1))[4] = 4 * (unsigned short) src[0];
1396 ((unsigned short *)(bih+1))[5] = 4 * (unsigned short) src[1];
1397 }
1398 else
1399 memset(&dst[8], 0, 4);
1400 track->realmedia = 1;
1401
1402 #ifdef USE_QTX_CODECS
1403 }
1404 else if (track->private_size >= sizeof (ImageDescription)
1405 && !strcmp(track->codec_id, MKV_V_QUICKTIME))
1406 {
1407 ImageDescriptionPtr idesc;
1408
1409 idesc = (ImageDescriptionPtr) track->private_data;
1410 idesc->idSize = be2me_32 (idesc->idSize);
1411 idesc->cType = be2me_32 (idesc->cType);
1412 idesc->version = be2me_16 (idesc->version);
1413 idesc->revisionLevel = be2me_16 (idesc->revisionLevel);
1414 idesc->vendor = be2me_32 (idesc->vendor);
1415 idesc->temporalQuality = be2me_32 (idesc->temporalQuality);
1416 idesc->spatialQuality = be2me_32 (idesc->spatialQuality);
1417 idesc->width = be2me_16 (idesc->width);
1418 idesc->height = be2me_16 (idesc->height);
1419 idesc->hRes = be2me_32 (idesc->hRes);
1420 idesc->vRes = be2me_32 (idesc->vRes);
1421 idesc->dataSize = be2me_32 (idesc->dataSize);
1422 idesc->frameCount = be2me_16 (idesc->frameCount);
1423 idesc->depth = be2me_16 (idesc->depth);
1424 idesc->clutID = be2me_16 (idesc->clutID);
1425 bih->biPlanes = 1;
1426 bih->biCompression = idesc->cType;
1427 ImageDesc = idesc;
1428 #endif /* USE_QTX_CODECS */
1429
1430 }
1431 else
1432 {
1433 mp_msg (MSGT_DEMUX,MSGL_WARN,"[mkv] Unknown/unsupported CodecID "
1434 "(%s) or missing/bad CodecPrivate data (track %u).\n",
1435 track->codec_id, track->tnum);
1436 free(bih);
1437 return 1;
1438 }
1439 }
1440
1441 sh_v = new_sh_video (demuxer, track->tnum);
1442 sh_v->bih = bih;
1443 sh_v->format = sh_v->bih->biCompression;
1444 if (track->v_frate == 0.0)
1445 track->v_frate = 25.0;
1446 sh_v->fps = track->v_frate;
1447 sh_v->frametime = 1 / track->v_frate;
1448 if (!track->realmedia)
1449 {
1450 sh_v->disp_w = track->v_width;
1451 sh_v->disp_h = track->v_height;
1452 sh_v->aspect = (float)track->v_dwidth / (float)track->v_dheight;
1453 }
1454 else
1455 {
1456 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1457 // disp_w and disp_h from the RealVideo stream contents returned
1458 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1459 // the Matroska file then it has already been set to PixelWidth/Height
1460 // by check_track_information.
1461 sh_v->disp_w = track->v_dwidth;
1462 sh_v->disp_h = track->v_dheight;
1463 }
1464 sh_v->ImageDesc = ImageDesc;
1465 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
1466
1467 sh_v->ds = demuxer->video;
1468 return 0;
1469 }
1470
1471 static int
1472 demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track)
1473 {
1474 sh_audio_t *sh_a = new_sh_audio(demuxer, track->tnum);
1475 demux_packet_t *dp;
1476 int i;
1477
1478 sh_a->ds = demuxer->audio;
1479 sh_a->wf = (WAVEFORMATEX *) malloc (sizeof (WAVEFORMATEX));
1480 if (track->ms_compat)
1481 {
1482 memcpy(sh_a->wf, track->private_data, track->private_size);
1483 if (track->a_sfreq == 0.0)
1484 track->a_sfreq = le2me_32 (sh_a->wf->nSamplesPerSec);
1485 if (track->a_channels == 0)
1486 track->a_channels = le2me_16 (sh_a->wf->nChannels);
1487 if (track->a_bps == 0)
1488 track->a_bps = le2me_16 (sh_a->wf->wBitsPerSample);
1489 track->a_formattag = le2me_16 (sh_a->wf->wFormatTag);
1490 }
1491 else
1492 {
1493 memset(sh_a->wf, 0, sizeof (WAVEFORMATEX));
1494 if (!strcmp(track->codec_id, MKV_A_MP3) ||
1495 !strcmp(track->codec_id, MKV_A_MP2))
1496 track->a_formattag = 0x0055;
1497 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)) ||
1498 !strcmp(track->codec_id, MKV_A_DTS))
1499 track->a_formattag = 0x2000;
1500 else if (!strcmp(track->codec_id, MKV_A_PCM) ||
1501 !strcmp(track->codec_id, MKV_A_PCM_BE))
1502 track->a_formattag = 0x0001;
1503 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN) ||
1504 !strncmp(track->codec_id, MKV_A_AAC_2LC,
1505 strlen(MKV_A_AAC_2LC)) ||
1506 !strcmp(track->codec_id, MKV_A_AAC_2SSR) ||
1507 !strcmp(track->codec_id, MKV_A_AAC_4MAIN) ||
1508 !strncmp(track->codec_id, MKV_A_AAC_4LC,
1509 strlen(MKV_A_AAC_4LC)) ||
1510 !strcmp(track->codec_id, MKV_A_AAC_4SSR) ||
1511 !strcmp(track->codec_id, MKV_A_AAC_4LTP))
1512 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
1513 else if (!strcmp(track->codec_id, MKV_A_VORBIS))
1514 {
1515 unsigned char *c;
1516 uint32_t offset, length;
1517
1518 if (track->private_data == NULL)
1519 return 1;
1520
1521 c = (unsigned char *) track->private_data;
1522 if (*c != 2)
1523 {
1524 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
1525 "contain valid headers.\n");
1526 return 1;
1527 }
1528
1529 offset = 1;
1530 for (i=0; i < 2; i++)
1531 {
1532 length = 0;
1533 while (c[offset] == (unsigned char) 0xFF
1534 && length < track->private_size)
1535 {
1536 length += 255;
1537 offset++;
1538 }
1539 if (offset >= (track->private_size - 1))
1540 {
1541 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track "
1542 "does not contain valid headers.\n");
1543 return 1;
1544 }
1545 length += c[offset];
1546 offset++;
1547 track->header_sizes[i] = length;
1548 }
1549
1550 track->headers[0] = &c[offset];
1551 track->headers[1] = &c[offset + track->header_sizes[0]];
1552 track->headers[2] = &c[offset + track->header_sizes[0] +
1553 track->header_sizes[1]];
1554 track->header_sizes[2] = track->private_size - offset
1555 - track->header_sizes[0] - track->header_sizes[1];
1556
1557 track->a_formattag = 0xFFFE;
1558 }
1559 else if (!strcmp(track->codec_id, MKV_A_QDMC))
1560 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
1561 else if (!strcmp(track->codec_id, MKV_A_QDMC2))
1562 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
1563 else if (!strcmp(track->codec_id, MKV_A_FLAC))
1564 {
1565 if (track->private_data == NULL || track->private_size == 0)
1566 {
1567 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] FLAC track does not "
1568 "contain valid headers.\n");
1569 return 1;
1570 }
1571 track->a_formattag = mmioFOURCC ('f', 'L', 'a', 'C');
1572 }
1573 else if (track->private_size >= sizeof (real_audio_v4_props_t))
1574 {
1575 if (!strcmp(track->codec_id, MKV_A_REAL28))
1576 track->a_formattag = mmioFOURCC('2', '8', '_', '8');
1577 else if (!strcmp(track->codec_id, MKV_A_REALATRC))
1578 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
1579 else if (!strcmp(track->codec_id, MKV_A_REALCOOK))
1580 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
1581 else if (!strcmp(track->codec_id, MKV_A_REALDNET))
1582 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
1583 else if (!strcmp(track->codec_id, MKV_A_REALSIPR))
1584 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
1585 }
1586 else
1587 {
1588 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1589 "codec ID '%s' for track %u or missing/faulty private "
1590 "codec data.\n", track->codec_id, track->tnum);
1591 free_sh_audio (sh_a);
1592 return 1;
1593 }
1594 }
1595
1596 sh_a->format = track->a_formattag;
1597 sh_a->wf->wFormatTag = track->a_formattag;
1598 sh_a->channels = track->a_channels;
1599 sh_a->wf->nChannels = track->a_channels;
1600 sh_a->samplerate = (uint32_t) track->a_sfreq;
1601 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
1602 sh_a->samplesize = track->a_bps / 8;
1603 if (track->a_formattag == 0x0055) /* MP3 || MP2 */
1604 {
1605 sh_a->wf->nAvgBytesPerSec = 16000;
1606 sh_a->wf->nBlockAlign = 1152;
1607 sh_a->wf->wBitsPerSample = 0;
1608 sh_a->samplesize = 0;
1609 }
1610 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
1611 {
1612 sh_a->wf->nAvgBytesPerSec = 16000;
1613 sh_a->wf->nBlockAlign = 1536;
1614 sh_a->wf->wBitsPerSample = 0;
1615 sh_a->samplesize = 0;
1616 }
1617 else if (track->a_formattag == 0x0001) /* PCM || PCM_BE */
1618 {
1619 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate*2;
1620 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
1621 sh_a->wf->wBitsPerSample = track->a_bps;
1622 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
1623 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
1624 }
1625 else if (!strcmp(track->codec_id, MKV_A_QDMC) ||
1626 !strcmp(track->codec_id, MKV_A_QDMC2))
1627 {
1628 sh_a->wf->wBitsPerSample = track->a_bps;
1629 sh_a->wf->nAvgBytesPerSec = 16000;
1630 sh_a->wf->nBlockAlign = 1486;
1631 track->fix_i_bps = 1;
1632 track->qt_last_a_pts = 0.0;
1633 if (track->private_data != NULL)
1634 {
1635 sh_a->codecdata=(unsigned char *)malloc(track->private_size);
1636 memcpy (sh_a->codecdata, track->private_data,
1637 track->private_size);
1638 sh_a->codecdata_len = track->private_size;
1639 }
1640 }
1641 else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A'))
1642 {
1643 int profile, srate_idx;
1644
1645 sh_a->wf->nAvgBytesPerSec = 16000;
1646 sh_a->wf->nBlockAlign = 1024;
1647 sh_a->wf->wBitsPerSample = 0;
1648 sh_a->samplesize = 0;
1649
1650 /* Recreate the 'private data' */
1651 /* which faad2 uses in its initialization */
1652 srate_idx = aac_get_sample_rate_index (sh_a->samplerate);
1653 if (!strncmp (&track->codec_id[12], "MAIN", 4))
1654 profile = 0;
1655 else if (!strncmp (&track->codec_id[12], "LC", 2))
1656 profile = 1;
1657 else if (!strncmp (&track->codec_id[12], "SSR", 3))
1658 profile = 2;
1659 else
1660 profile = 3;
1661 sh_a->codecdata = (unsigned char *) malloc (5);
1662 sh_a->codecdata[0] = ((profile+1) << 3) | ((srate_idx&0xE) >> 1);
1663 sh_a->codecdata[1] = ((srate_idx&0x1)<<7)|(track->a_channels<<3);
1664
1665 if (strstr(track->codec_id, "SBR") != NULL)
1666 {
1667 /* HE-AAC (aka SBR AAC) */
1668 sh_a->codecdata_len = 5;
1669
1670 sh_a->samplerate *= 2;
1671 sh_a->wf->nSamplesPerSec *= 2;
1672 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1673 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
1674 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE&0x07)<<5) | 5;
1675 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
1676 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
1677 }
1678 else
1679 {
1680 sh_a->codecdata_len = 2;
1681 track->default_duration = 1024.0 / (float)sh_a->samplerate;
1682 }
1683 }
1684 else if (track->a_formattag == 0xFFFE) /* VORBIS */
1685 {
1686 for (i=0; i < 3; i++)
1687 {
1688 dp = new_demux_packet (track->header_sizes[i]);
1689 memcpy (dp->buffer,track->headers[i],track->header_sizes[i]);
1690 dp->pts = 0;
1691 dp->flags = 0;
1692 ds_add_packet (demuxer->audio, dp);
1693 }
1694 }
1695 else if (track->private_size >= sizeof(real_audio_v4_props_t)
1696 && !strncmp (track->codec_id, MKV_A_REALATRC, 7))
1697 {
1698 /* Common initialization for all RealAudio codecs */
1699 real_audio_v4_props_t *ra4p;
1700 real_audio_v5_props_t *ra5p;
1701 unsigned char *src;
1702 int codecdata_length, version;
1703
1704 ra4p = (real_audio_v4_props_t *) track->private_data;
1705 ra5p = (real_audio_v5_props_t *) track->private_data;
1706
1707 sh_a->wf->wBitsPerSample = sh_a->samplesize * 8;
1708 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
1709 sh_a->wf->nBlockAlign = be2me_16 (ra4p->frame_size);
1710
1711 version = be2me_16 (ra4p->version1);
1712
1713 if (version == 4)
1714 {
1715 src = (unsigned char *) (ra4p + 1);
1716 src += src[0] + 1;
1717 src += src[0] + 1;
1718 }
1719 else
1720 src = (unsigned char *) (ra5p + 1);
1721
1722 src += 3;
1723 if (version == 5)
1724 src++;
1725 codecdata_length = be2me_32 (*(uint32_t *)src);
1726 src += 4;
1727 sh_a->wf->cbSize = 10 + codecdata_length;
1728 sh_a->wf = (WAVEFORMATEX *) realloc (sh_a->wf,
1729 sizeof (WAVEFORMATEX) +
1730 sh_a->wf->cbSize);
1731 ((short *)(sh_a->wf + 1))[0] = be2me_16 (ra4p->sub_packet_size);
1732 ((short *)(sh_a->wf + 1))[1] = be2me_16 (ra4p->sub_packet_h);
1733 ((short *)(sh_a->wf + 1))[2] = be2me_16 (ra4p->flavor);
1734 ((short *)(sh_a->wf + 1))[3] = be2me_32 (ra4p->coded_frame_size);
1735 ((short *)(sh_a->wf + 1))[4] = codecdata_length;
1736 memcpy(((char *)(sh_a->wf + 1)) + 10, src, codecdata_length);
1737
1738 track->realmedia = 1;
1739 }
1740 else if (!strcmp(track->codec_id, MKV_A_FLAC) ||
1741 (track->a_formattag == 0xf1ac))
1742 {
1743 unsigned char *ptr;
1744 int size;
1745 free(sh_a->wf);
1746 sh_a->wf = NULL;
1747
1748 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C'))
1749 {
1750 ptr = (unsigned char *)track->private_data;
1751 size = track->private_size;
1752 }
1753 else
1754 {
1755 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
1756 ptr = (unsigned char *) track->private_data
1757 + sizeof (WAVEFORMATEX);
1758 size = track->private_size - sizeof (WAVEFORMATEX);
1759 }
1760 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' ||
1761 ptr[2] != 'a' || ptr[3] != 'C')
1762 {
1763 dp = new_demux_packet (4);
1764 memcpy (dp->buffer, "fLaC", 4);
1765 }
1766 else
1767 {
1768 dp = new_demux_packet (size);
1769 memcpy (dp->buffer, ptr, size);
1770 }
1771 dp->pts = 0;
1772 dp->flags = 0;
1773 ds_add_packet (demuxer->audio, dp);
1774 }
1775 else
1776 {
1777 free_sh_audio (sh_a);
1778 return 1;
1779 }
1780
1781 return 0;
1782 }
1783
1784 static int
1785 demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track)
1786 {
1787 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
1788 {
1789 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
1790 {
1791 int m, size = track->private_size;
1792 uint8_t *buffer;
1793 m = demux_mkv_decode (track,track->private_data,&buffer,&size,2);
1794 if (buffer && m)
1795 {
1796 free (track->private_data);
1797 track->private_data = buffer;
1798 }
1799 }
1800 }
1801 else
1802 {
1803 mp_msg (MSGT_DEMUX, MSGL_ERR, "[mkv] Subtitle type '%s' is not "
1804 "supported.\n", track->codec_id);
1805 return 1;
1806 }
1807
1808 return 0;
1809 }
1810
1811 void demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, int flags);
1812
1813 int
1814 demux_mkv_open (demuxer_t *demuxer)
1815 {
1816 stream_t *s = demuxer->stream;
1817 mkv_demuxer_t *mkv_d;
1818 mkv_track_t *track;
1819 int i, version, cont = 0;
1820 char *str;
1821
1822 #ifdef USE_ICONV
1823 subcp_open();
1824 #endif
1825
1826 stream_seek(s, s->start_pos);
1827 str = ebml_read_header (s, &version);
1828 if (str == NULL || strcmp (str, "matroska") || version > 1)
1829 {
1830 mp_msg (MSGT_DEMUX, MSGL_ERR, "[mkv] no head found\n");
1831 return 0;
1832 }
1833 free (str);
1834
1835 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
1836
1837 if (ebml_read_id (s, NULL) != MATROSKA_ID_SEGMENT)
1838 {
1839 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
1840 return 0;
1841 }
1842 ebml_read_length (s, NULL); /* return bytes number until EOF */
1843
1844 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
1845
1846 mkv_d = (mkv_demuxer_t *) malloc (sizeof (mkv_demuxer_t));
1847 memset (mkv_d, 0, sizeof(mkv_demuxer_t));
1848 demuxer->priv = mkv_d;
1849 mkv_d->tc_scale = 1000000;
1850 mkv_d->segment_start = stream_tell (s);
1851 mkv_d->parsed_cues = (off_t *) malloc (sizeof (off_t));
1852 mkv_d->parsed_seekhead = (off_t *) malloc (sizeof (off_t));
1853
1854 for (i=0; i < SUB_MAX_TEXT; i++)
1855 mkv_d->subs.text[i] = (char *) malloc (256);
1856
1857 while (!cont)
1858 {
1859 switch (ebml_read_id (s, NULL))
1860 {
1861 case MATROSKA_ID_INFO:
1862 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
1863 cont = demux_mkv_read_info (demuxer);
1864 break;
1865
1866 case MATROSKA_ID_TRACKS:
1867 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
1868 cont = demux_mkv_read_tracks (demuxer);
1869 break;
1870
1871 case MATROSKA_ID_CUES:
1872 cont = demux_mkv_read_cues (demuxer);
1873 break;
1874
1875 case MATROSKA_ID_TAGS:
1876 cont = demux_mkv_read_tags (demuxer);
1877 break;
1878
1879 case MATROSKA_ID_SEEKHEAD:
1880 cont = demux_mkv_read_seekhead (demuxer);
1881 break;
1882
1883 case MATROSKA_ID_CHAPTERS:
1884 cont = demux_mkv_read_chapters (demuxer);
1885 break;
1886
1887 case MATROSKA_ID_CLUSTER:
1888 {
1889 int p, l;
1890 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] |+ found cluster, headers are "
1891 "parsed completely :)\n");
1892 /* get the first cluster timecode */
1893 p = stream_tell(s);
1894 l = ebml_read_length (s, NULL);
1895 while (ebml_read_id (s, NULL) != MATROSKA_ID_CLUSTERTIMECODE)
1896 {
1897 ebml_read_skip (s, NULL);
1898 if (stream_tell (s) >= p + l)
1899 break;
1900 }
1901 if (stream_tell (s) < p + l)
1902 {
1903 uint64_t num = ebml_read_uint (s, NULL);
1904 if (num == EBML_UINT_INVALID)
1905 return 0;
1906 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0;
1907 mkv_d->has_first_tc = 1;
1908 }
1909 stream_seek (s, p - 4);
1910 cont = 1;
1911 break;
1912 }
1913
1914 default:
1915 cont = 1;
1916 case MATROSKA_ID_ATTACHMENTS:
1917 case EBML_ID_VOID:
1918 ebml_read_skip (s, NULL);
1919 break;
1920 }
1921 }
1922
1923 display_tracks (mkv_d);
1924
1925 /* select video track */
1926 track = NULL;
1927 if (demuxer->video->id == -1) /* automatically select a video track */
1928 {
1929 /* search for a video track that has the 'default' flag set */
1930 for (i=0; i<mkv_d->num_tracks; i++)
1931 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1932 && mkv_d->tracks[i]->default_track)
1933 {
1934 track = mkv_d->tracks[i];
1935 break;
1936 }
1937
1938 if (track == NULL)
1939 /* no track has the 'default' flag set */
1940 /* let's take the first video track */
1941 for (i=0; i<mkv_d->num_tracks; i++)
1942 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO)
1943 {
1944 track = mkv_d->tracks[i];
1945 break;
1946 }
1947 }
1948 else if (demuxer->video->id != -2) /* -2 = no video at all */
1949 track = demux_mkv_find_track_by_num (mkv_d, demuxer->video->id,
1950 MATROSKA_TRACK_VIDEO);
1951
1952 if (track)
1953 {
1954 for (i=0; i < mkv_d->num_tracks; i++)
1955 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO)
1956 {
1957 int def = (mkv_d->tracks[i] == track);
1958 if (demux_mkv_open_video (demuxer, mkv_d->tracks[i]) && def)
1959 demuxer->video->id = -2;
1960 else if (def)
1961 {
1962 mp_msg (MSGT_DEMUX, MSGL_INFO,
1963 "[mkv] Will play video track %u\n", track->tnum);
1964 demuxer->video->id = track->tnum;
1965 demuxer->video->sh = demuxer->v_streams[track->tnum];
1966 }
1967 }
1968 }
1969 else
1970 {
1971 mp_msg (MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
1972 demuxer->video->id = -2;
1973 }
1974
1975 /* select audio track */
1976 track = NULL;
1977 if (demuxer->audio->id == -1) /* automatically select an audio track */
1978 {
1979 /* check if the user specified an audio language */
1980 if (audio_lang != NULL)
1981 track = demux_mkv_find_track_by_language(mkv_d, audio_lang,
1982 MATROSKA_TRACK_AUDIO);
1983 if (track == NULL)
1984 /* no audio language specified, or language not found */
1985 /* search for an audio track that has the 'default' flag set */
1986 for (i=0; i < mkv_d->num_tracks; i++)
1987 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1988 && mkv_d->tracks[i]->default_track)
1989 {
1990 track = mkv_d->tracks[i];
1991 break;
1992 }
1993
1994 if (track == NULL)
1995 /* no track has the 'default' flag set */
1996 /* let's take the first audio track */
1997 for (i=0; i < mkv_d->num_tracks; i++)
1998 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO)
1999 {
2000 track = mkv_d->tracks[i];
2001 break;
2002 }
2003 }
2004 else if (demuxer->audio->id != -2) /* -2 = no audio at all */
2005 track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id,
2006 MATROSKA_TRACK_AUDIO);
2007
2008 if (track)
2009 {
2010 for (i=0; i < mkv_d->num_tracks; i++)
2011 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO)
2012 {
2013 int def = (mkv_d->tracks[i] == track);
2014 if (demux_mkv_open_audio (demuxer, mkv_d->tracks[i]) && def)
2015 demuxer->audio->id = -2;
2016 else if (def)
2017 {
2018 mp_msg (MSGT_DEMUX, MSGL_INFO,
2019 "[mkv] Will play audio track %u\n", track->tnum);
2020 demuxer->audio->id = track->tnum;
2021 demuxer->audio->sh = demuxer->a_streams[track->tnum];
2022 }
2023 }
2024 }
2025 else
2026 {
2027 mp_msg (MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
2028 demuxer->video->id = -2;
2029 }
2030
2031 /* DO NOT automatically select a subtitle track and behave like DVD */
2032 /* playback: only show subtitles if the user explicitely wants them. */
2033 track = NULL;
2034 if (demuxer->sub->id >= 0)
2035 track = demux_mkv_find_track_by_num (mkv_d, demuxer->sub->id,
2036 MATROSKA_TRACK_SUBTITLE);
2037 else if (dvdsub_lang != NULL)
2038 track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang,
2039 MATROSKA_TRACK_SUBTITLE);
2040
2041 for (i=0; i < mkv_d->num_tracks; i++)
2042 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_SUBTITLE)
2043 {
2044 int def = (mkv_d->tracks[i] == track);
2045 if (demux_mkv_open_sub (demuxer, mkv_d->tracks[i]) && def)
2046 demuxer->sub->id = -2;
2047 else if (def)
2048 {
2049 mp_msg (MSGT_DEMUX, MSGL_INFO,
2050 "[mkv] Will display subtitle track %u\n", track->tnum);
2051 demuxer->sub->id = track->tnum;
2052 }
2053 }
2054
2055 if (mkv_d->chapters)
2056 {
2057 for (i=0; i < (int)mkv_d->num_chapters; i++)
2058 {
2059 mkv_d->chapters[i].start -= mkv_d->first_tc;
2060 mkv_d->chapters[i].end -= mkv_d->first_tc;
2061 }
2062 if (dvd_last_chapter > 0 && dvd_last_chapter <= mkv_d->num_chapters)
2063 {
2064 if (mkv_d->chapters[dvd_last_chapter-1].end != 0)
2065 mkv_d->stop_timecode = mkv_d->chapters[dvd_last_chapter-1].end;
2066 else if (dvd_last_chapter + 1 <= mkv_d->num_chapters)
2067 mkv_d->stop_timecode = mkv_d->chapters[dvd_last_chapter].start;
2068 }
2069 }
2070
2071 if (s->end_pos == 0 || (mkv_d->indexes == NULL && index_mode < 0))
2072 demuxer->seekable = 0;
2073 else
2074 {
2075 demuxer->movi_start = s->start_pos;
2076 demuxer->movi_end = s->end_pos;
2077 demuxer->seekable = 1;
2078 if (mkv_d->chapters && dvd_chapter>1 && dvd_chapter<=mkv_d->num_chapters)
2079 {
2080 if (!mkv_d->has_first_tc)
2081 {
2082 mkv_d->first_tc = 0;
2083 mkv_d->has_first_tc = 1;
2084 }
2085 demux_mkv_seek (demuxer,
2086 mkv_d->chapters[dvd_chapter-1].start/1000.0, 1);
2087 }
2088 }
2089
2090 return 1;
2091 }
2092
2093 void
2094 demux_close_mkv (demuxer_t *demuxer)
2095 {
2096 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2097
2098 if (mkv_d)
2099 {
2100 int i;
2101 if (mkv_d->tracks)
2102 {
2103 for (i=0; i<mkv_d->num_tracks; i++)
2104 {
2105 if (mkv_d->tracks[i]->codec_id)
2106 free (mkv_d->tracks[i]->codec_id);
2107 if (mkv_d->tracks[i]->language)
2108 free (mkv_d->tracks[i]->language);
2109 if (mkv_d->tracks[i]->private_data)
2110 free (mkv_d->tracks[i]->private_data);
2111 }
2112 for (i=0; i < SUB_MAX_TEXT; i++)
2113 if (mkv_d->subs.text[i])
2114 free (mkv_d->subs.text[i]);
2115 free (mkv_d->tracks);
2116 }
2117 if (mkv_d->indexes)
2118 free (mkv_d->indexes);
2119 if (mkv_d->cluster_positions)
2120 free (mkv_d->cluster_positions);
2121 if (mkv_d->chapters)
2122 free (mkv_d->chapters);
2123 if (mkv_d->parsed_cues)
2124 free (mkv_d->parsed_cues);
2125 if (mkv_d->parsed_seekhead)
2126 free (mkv_d->parsed_seekhead);
2127 free (mkv_d);
2128 }
2129 }
2130
2131 static int
2132 demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
2133 uint8_t *laces, uint32_t *lace_size)
2134 {
2135 uint32_t total = 0;
2136 uint8_t flags;
2137 int i;
2138
2139 /* lacing flags */
2140 flags = *buffer++;
2141 (*size)--;
2142
2143 switch ((flags & 0x06) >> 1)
2144 {
2145 case 0: /* no lacing */
2146 *laces = 1;
2147 lace_size[0] = *size;
2148 break;
2149
2150 case 1: /* xiph lacing */
2151 case 2: /* fixed-size lacing */
2152 case 3: /* EBML lacing */
2153 *laces = *buffer++;
2154 (*size)--;
2155 if (++*laces > 8)
2156 return 1;
2157
2158 switch ((flags & 0x06) >> 1)
2159 {
2160 case 1: /* xiph lacing */
2161 for (i=0; i < *laces-1; i++)
2162 {
2163 lace_size[i] = 0;
2164 do
2165 {
2166 lace_size[i] += *buffer;
2167 (*size)--;
2168 } while (*buffer++ == 0xFF);
2169 total += lace_size[i];
2170 }
2171 lace_size[i] = *size - total;
2172 break;
2173
2174 case 2: /* fixed-size lacing */
2175 for (i=0; i < *laces; i++)
2176 lace_size[i] = *size / *laces;
2177 break;
2178
2179 case 3: /* EBML lacing */
2180 {
2181 int l;
2182 uint64_t num = ebml_read_vlen_uint (buffer, &l);
2183 if (num == EBML_UINT_INVALID)
2184 return 1;
2185 buffer += l;
2186 *size -= l;
2187
2188 total = lace_size[0] = num;
2189 for (i=1; i < *laces-1; i++)
2190 {
2191 int64_t snum;
2192 snum = ebml_read_vlen_int (buffer, &l);
2193 if (snum == EBML_INT_INVALID)
2194 return 1;
2195 buffer += l;
2196 *size -= l;
2197 lace_size[i] = lace_size[i-1] + snum;
2198 total += lace_size[i];
2199 }
2200 lace_size[i] = *size - total;
2201 break;
2202 }
2203 }
2204 break;
2205 }
2206 return 0;
2207 }
2208
2209 static void
2210 handle_subtitles(demuxer_t *demuxer, mkv_track_t *track, char *block,
2211 int64_t size, uint64_t block_duration, uint64_t timecode)
2212 {
2213 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2214 char *ptr1, *ptr2;
2215 int state, i;
2216
2217 if (block_duration == 0)
2218 {
2219 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: No BlockDuration "
2220 "for subtitle track found.\n");
2221 return;
2222 }
2223
2224 ptr1 = block;
2225 while ((*ptr1 == '\n' || *ptr1 == '\r') && ptr1 - block <= size)
2226 ptr1++;
2227
2228 if (mkv_d->subs.lines > SUB_MAX_TEXT - 2)
2229 {
2230 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: too many sublines "
2231 "to render, skipping\n");
2232 return;
2233 }
2234 ptr2 = mkv_d->subs.text[mkv_d->subs.lines];
2235 state = 0;
2236
2237 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
2238 {
2239 /* Find text section. */
2240 for (i=0; i < 8 && *ptr1 != '\0'; ptr1++)
2241 if (*ptr1 == ',')
2242 i++;
2243 if (*ptr1 == '\0') /* Broken line? */
2244 return;
2245
2246 /* Load text. */
2247 while (ptr1 - block < size)
2248 {
2249 if (*ptr1 == '{')
2250 state = 1;
2251 else if (*ptr1 == '}' && state == 1)
2252 state = 2;
2253
2254 if (state == 0)
2255 {
2256 *ptr2++ = *ptr1;
2257 if (ptr2 - mkv_d->subs.text[mkv_d->subs.lines] >= 255)
2258 break;
2259 }
2260 ptr1++;
2261
2262 /* Newline */
2263 if (*ptr1 == '\\' && ptr1+1-block < size && (*(ptr1+1)|0x20) == 'n')
2264 {
2265 mkv_d->clear_subs_at[mkv_d->subs.lines++]
2266 = timecode + block_duration;
2267 *ptr2 = '\0';
2268 ptr2 = mkv_d->subs.text[mkv_d->subs.lines];
2269 ptr1 += 2;
2270 }
2271
2272 if (state == 2)
2273 state = 0;
2274 }
2275 *ptr2 = '\0';
2276 }
2277 else
2278 {
2279 while (ptr1 - block != size)
2280 {
2281 if (*ptr1 == '\n' || *ptr1 == '\r')
2282 {
2283 if (state == 0) /* normal char --> newline */
2284 {
2285 if (mkv_d->subs.lines == SUB_MAX_TEXT - 1)
2286 break;
2287 *ptr2 = '\0';
2288 mkv_d->clear_subs_at[mkv_d->subs.lines++]
2289 = timecode + block_duration;
2290 ptr2 = mkv_d->subs.text[mkv_d->subs.lines];
2291 state = 1;
2292 }
2293 }
2294 else if (*ptr1 == '<') /* skip HTML tags */
2295 state = 2;
2296 else if (*ptr1 == '>')
2297 state = 0;
2298 else if (state != 2) /* normal character */
2299 {
2300 state = 0;
2301 if ((ptr2 - mkv_d->subs.text[mkv_d->subs.lines]) < 255)
2302 *ptr2++ = *ptr1;
2303 }
2304 ptr1++;
2305 }
2306 *ptr2 = '\0';
2307 }
2308 mkv_d->clear_subs_at[mkv_d->subs.lines++] = timecode + block_duration;
2309
2310 #ifdef USE_ICONV
2311 subcp_recode1 (&mkv_d->subs);
2312 #endif
2313 vo_sub = &mkv_d->subs;
2314 vo_osd_changed (OSDTYPE_SUBTITLE);
2315 }
2316
2317 static void
2318 clear_subtitles(demuxer_t *demuxer, uint64_t timecode)
2319 {
2320 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2321 int i, lines_cut = 0;
2322 char *tmp;
2323
2324 /* Clear the subtitles if they're obsolete now. */
2325 for (i=0; i < mkv_d->subs.lines; i++)
2326 {
2327 if (mkv_d->clear_subs_at[i] <= timecode)
2328 {
2329 tmp = mkv_d->subs.text[i];
2330 memmove (mkv_d->subs.text+i, mkv_d->subs.text+i+1,
2331 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->subs.text));
2332 memmove (mkv_d->clear_subs_at+i, mkv_d->clear_subs_at+i+1,
2333 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->clear_subs_at));
2334 mkv_d->subs.text[mkv_d->subs.lines--] = tmp;
2335 i--;
2336 lines_cut = 1;
2337 }
2338 }
2339 if (lines_cut)
2340 {
2341 vo_sub = &mkv_d->subs;
2342 vo_osd_changed (OSDTYPE_SUBTITLE);
2343 }
2344 }
2345
2346 // Taken from demux_real.c. Thanks to the original developpers :)
2347 #define SKIP_BITS(n) buffer <<= n
2348 #define SHOW_BITS(n) ((buffer) >> (32 - (n)))
2349
2350 static float real_fix_timestamp(mkv_track_t *track, unsigned char *s,
2351 int timestamp) {
2352 float v_pts;
2353 uint32_t buffer = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
2354 int kf = timestamp;
2355 int pict_type;
2356 int orig_kf;
2357
2358 if (!strcmp(track->codec_id, MKV_V_REALV30) ||
2359 !strcmp(track->codec_id, MKV_V_REALV40)) {
2360
2361 if (!strcmp(track->codec_id, MKV_V_REALV30)) {
2362 SKIP_BITS(3);
2363 pict_type = SHOW_BITS(2);
2364 SKIP_BITS(2 + 7);
2365 }else{
2366 SKIP_BITS(1);
2367 pict_type = SHOW_BITS(2);
2368 SKIP_BITS(2 + 7 + 3);
2369 }
2370 kf = SHOW_BITS(13); // kf= 2*SHOW_BITS(12);
2371 orig_kf = kf;
2372 if (pict_type <= 1) {
2373 // I frame, sync timestamps:
2374 track->rv_kf_base = timestamp - kf;
2375 mp_msg(MSGT_DEMUX, MSGL_V, "\nTS: base=%08X\n", track->rv_kf_base);
2376 kf = timestamp;
2377 } else {
2378 // P/B frame, merge timestamps:
2379 int tmp = timestamp - track->rv_kf_base;
2380 kf |= tmp & (~0x1fff); // combine with packet timestamp
2381 if (kf < (tmp - 4096)) // workaround wrap-around problems
2382 kf += 8192;
2383 else if (kf > (tmp + 4096))
2384 kf -= 8192;
2385 kf += track->rv_kf_base;
2386 }
2387 if (pict_type != 3) { // P || I frame -> swap timestamps
2388 int tmp = kf;
2389 kf = track->rv_kf_pts;
2390 track->rv_kf_pts = tmp;
2391 }
2392 mp_msg(MSGT_DEMUX, MSGL_V, "\nTS: %08X -> %08X (%04X) %d %02X %02X %02X "
2393 "%02X %5d\n", timestamp, kf, orig_kf, pict_type, s[0], s[1], s[2],
2394 s[3], kf - (int)(1000.0 * track->rv_pts));
2395 }
2396 v_pts = kf * 0.001f;
2397 track->rv_pts = v_pts;
2398
2399 return v_pts;
2400 }
2401
2402 static void
2403 handle_realvideo (demuxer_t *demuxer, mkv_track_t *track, uint8_t *buffer,
2404 uint32_t size, int block_bref)
2405 {
2406 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2407 demux_packet_t *dp;
2408 dp_hdr_t *hdr;
2409 uint8_t chunks;
2410 int isize;
2411
2412 chunks = *buffer++;
2413 isize = --size - (chunks+1)*8;
2414 dp = new_demux_packet (sizeof (*hdr) + size);
2415 memcpy (dp->buffer + sizeof(*hdr), buffer + (chunks+1)*8, isize);
2416 memcpy (dp->buffer + sizeof(*hdr) + isize, buffer, (chunks+1)*8);
2417
2418 hdr = (dp_hdr_t *) dp->buffer;
2419 hdr->len = isize;
2420 hdr->chunks = chunks;
2421 hdr->timestamp = mkv_d->last_pts * 1000;
2422 hdr->chunktab = sizeof(*hdr) + isize;
2423
2424 dp->len = sizeof(*hdr) + size;
2425 if (mkv_d->v_skip_to_keyframe)
2426 {
2427 dp->pts = mkv_d->last_pts;
2428 track->rv_kf_base = 0;
2429 track->rv_kf_pts = hdr->timestamp;
2430 }
2431 else
2432 dp->pts = real_fix_timestamp (track, dp->buffer + sizeof(*hdr),
2433 hdr->timestamp);
2434 dp->pos = demuxer->filepos;
2435 dp->flags = block_bref ? 0 : 0x10;
2436
2437 ds_add_packet(demuxer->video, dp);
2438 }
2439
2440 static void
2441 handle_realaudio (demuxer_t *demuxer, mkv_track_t *track, uint8_t *buffer,
2442 uint32_t size, int block_bref)
2443 {
2444 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2445 demux_packet_t *dp = new_demux_packet (size);
2446
2447 memcpy (dp->buffer, buffer, size);
2448 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
2449 dp->pts = 0;
2450 else
2451 dp->pts = mkv_d->last_pts;
2452 track->ra_pts = mkv_d->last_pts;
2453
2454 dp->pos = demuxer->filepos;
2455 dp->flags = block_bref ? 0 : 0x10;
2456 ds_add_packet (demuxer->audio, dp);
2457 }
2458
2459 static int
2460 handle_block (demuxer_t *demuxer, uint8_t *block, uint64_t length,
2461 uint64_t block_duration, int64_t block_bref)
2462 {
2463 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2464 mkv_track_t *track = NULL;
2465 demux_stream_t *ds = NULL;
2466 uint64_t old_length;
2467 int64_t tc;
2468 uint32_t lace_size[8];
2469 uint8_t laces;
2470 int i, num, tmp, use_this_block = 1;
2471 float current_pts;
2472 int16_t time;
2473
2474 /* first byte(s): track num */
2475 num = ebml_read_vlen_uint (block, &tmp);
2476 block += tmp;
2477 /* time (relative to cluster time) */
2478 time = be2me_16 (* (int16_t *) block);
2479 block += 2;
2480 length -= tmp + 2;
2481 old_length = length;
2482 demux_mkv_read_block_lacing (block, &length, &laces, lace_size);
2483 block += old_length - length;
2484
2485 tc = ((time*mkv_d->tc_scale+mkv_d->cluster_tc) /1000000.0 - mkv_d->first_tc);
2486 if (tc < 0)
2487 tc = 0;
2488 if (mkv_d->stop_timecode > 0 && tc > mkv_d->stop_timecode)
2489 return -1;
2490 current_pts = tc / 1000.0;
2491
2492 clear_subtitles(demuxer, tc);
2493
2494 for (i=0; i<mkv_d->num_tracks; i++)
2495 if (mkv_d->tracks[i]->tnum == num)
2496 track = mkv_d->tracks[i];
2497 if (num == demuxer->audio->id)
2498 {
2499 ds = demuxer->audio;
2500
2501 if (mkv_d->a_skip_to_keyframe && block_bref != 0)
2502 use_this_block = 0;
2503 else if (mkv_d->v_skip_to_keyframe)
2504 use_this_block = 0;
2505
2506 if (track->fix_i_bps && use_this_block)
2507 {
2508 sh_audio_t *sh = (sh_audio_t *) ds->sh;
2509
2510 if (block_duration != 0)
2511 {
2512 sh->i_bps = length * 1000 / block_duration;
2513 track->fix_i_bps = 0;
2514 }
2515 else if (track->qt_last_a_pts == 0.0)
2516 track->qt_last_a_pts = current_pts;
2517 else if(track->qt_last_a_pts != current_pts)
2518 {
2519 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
2520 track->fix_i_bps = 0;
2521 }
2522 }
2523 }
2524 else if (tc < mkv_d->skip_to_timecode)
2525 use_this_block = 0;
2526 else if (num == demuxer->video->id)
2527 {
2528 ds = demuxer->video;
2529 if (mkv_d->v_skip_to_keyframe && block_bref != 0)
2530 use_this_block = 0;
2531 }
2532 else if (num == demuxer->sub->id)
2533 {
2534 ds = demuxer->sub;
2535 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB)
2536 {
2537 if (!mkv_d->v_skip_to_keyframe)
2538 handle_subtitles (demuxer, track, block, length,
2539 block_duration, tc);
2540 use_this_block = 0;
2541 }
2542 }
2543 else
2544 use_this_block = 0;
2545
2546 if (use_this_block)
2547 {
2548 mkv_d->last_pts = ds->pts = current_pts;
2549 mkv_d->last_filepos = demuxer->filepos;
2550
2551 for (i=0; i < laces; i++)
2552 {
2553 if (ds == demuxer->video && track->realmedia)
2554 handle_realvideo (demuxer, track, block, lace_size[i], block_bref);
2555 else if (ds == demuxer->audio && track->realmedia)
2556 handle_realaudio (demuxer, track, block, lace_size[i], block_bref);
2557 else
2558 {
2559 int modified, size = lace_size[i];
2560 demux_packet_t *dp;
2561 uint8_t *buffer;
2562 modified = demux_mkv_decode (track, block, &buffer, &size, 1);
2563 if (buffer)
2564 {
2565 dp = new_demux_packet (size);
2566 memcpy (dp->buffer, buffer, size);
2567 if (modified)
2568 free (buffer);
2569 dp->flags = block_bref == 0 ? 1 : 0;
2570 dp->pts = mkv_d->last_pts + i * track->default_duration;
2571 ds_add_packet (ds, dp);
2572 }
2573 }
2574 block += lace_size[i];
2575 }
2576
2577 if (ds == demuxer->video)
2578 {
2579 mkv_d->v_skip_to_keyframe = 0;
2580 mkv_d->skip_to_timecode = 0;
2581 }
2582 else if (ds == demuxer->audio)
2583 mkv_d->a_skip_to_keyframe = 0;
2584
2585 return 1;
2586 }
2587
2588 return 0;
2589 }
2590
2591 int
2592 demux_mkv_fill_buffer (demuxer_t *demuxer)
2593 {
2594 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2595 stream_t *s = demuxer->stream;
2596 uint64_t l;
2597 int il, tmp;
2598
2599 while (1)
2600 {
2601 while (mkv_d->cluster_size > 0)
2602 {
2603 uint64_t block_duration = 0, block_length = 0;
2604 int64_t block_bref = 0;
2605 uint8_t *block = NULL;
2606
2607 while (mkv_d->blockgroup_size > 0)
2608 {
2609 switch (ebml_read_id (s, &il))
2610 {
2611 case MATROSKA_ID_BLOCKDURATION:
2612 {
2613 block_duration = ebml_read_uint (s, &l);
2614 if (block_duration == EBML_UINT_INVALID)
2615 return 0;
2616 break;
2617 }
2618
2619 case MATROSKA_ID_BLOCK:
2620 block_length = ebml_read_length (s, &tmp);
2621 block = (uint8_t *) malloc (block_length);
2622 demuxer->filepos = stream_tell (s);
2623 if (stream_read (s,block,block_length) != (int) block_length)
2624 return 0;
2625 l = tmp + block_length;
2626 break;
2627
2628 case MATROSKA_ID_REFERENCEBLOCK:
2629 {
2630 int64_t num = ebml_read_int (s, &l);
2631 if (num == EBML_INT_INVALID)
2632 return 0;
2633 if (num < 0)
2634 block_bref = num;
2635 break;
2636 }
2637
2638 default:
2639 ebml_read_skip (s, &l);
2640 break;
2641 }
2642 mkv_d->blockgroup_size -= l + il;
2643 mkv_d->cluster_size -= l + il;
2644 }
2645
2646 if (block)
2647 {
2648 int res = handle_block (demuxer, block, block_length,
2649 block_duration, block_bref);
2650 free (block);
2651 if (res < 0)
2652 return 0;
2653 if (res)
2654 return 1;
2655 }
2656
2657 if (mkv_d->cluster_size > 0)
2658 {
2659 switch (ebml_read_id (s, &il))
2660 {
2661 case MATROSKA_ID_CLUSTERTIMECODE:
2662 {
2663 uint64_t num = ebml_read_uint (s, &l);
2664 if (num == EBML_UINT_INVALID)
2665 return 0;
2666 if (!mkv_d->has_first_tc)
2667 {
2668 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0;
2669 mkv_d->has_first_tc = 1;
2670 }
2671 mkv_d->cluster_tc = num * mkv_d->tc_scale;
2672 break;
2673 }
2674
2675 case MATROSKA_ID_BLOCKGROUP:
2676 mkv_d->blockgroup_size = ebml_read_length (s, &tmp);
2677 l = tmp;
2678 break;
2679
2680 default:
2681 ebml_read_skip (s, &l);
2682 break;
2683 }
2684 mkv_d->cluster_size -= l + il;
2685 }
2686 }
2687
2688 if (ebml_read_id (s, &il) != MATROSKA_ID_CLUSTER)
2689 return 0;
2690 add_cluster_position(mkv_d, stream_tell(s)-il);
2691 mkv_d->cluster_size = ebml_read_length (s, NULL);
2692 }
2693
2694 return 0;
2695 }
2696
2697 void
2698 demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, int flags)
2699 {
2700 if (!(flags & 2)) /* time in secs */
2701 {
2702 void resync_audio_stream(sh_audio_t *sh_audio);
2703 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2704 stream_t *s = demuxer->stream;
2705 int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFL;
2706 int i;
2707
2708 if (!(flags & 1)) /* relative seek */
2709 target_timecode = (int64_t) (mkv_d->last_pts * 1000.0);
2710 target_timecode += (int64_t)(rel_seek_secs * 1000.0);
2711 if (target_timecode < 0)
2712 target_timecode = 0;
2713
2714 if (mkv_d->indexes == NULL) /* no index was found */
2715 {
2716 uint64_t target_filepos, cluster_pos, max_pos;
2717
2718 target_filepos = (uint64_t) (target_timecode * mkv_d->last_filepos
2719 / (mkv_d->last_pts * 1000.0));
2720
2721 max_pos = mkv_d->cluster_positions[mkv_d->num_cluster_pos-1];
2722 if (target_filepos > max_pos)
2723 {
2724 if ((off_t) max_pos > stream_tell (s))
2725 stream_seek (s, max_pos);
2726 else
2727 stream_seek (s, stream_tell (s) + mkv_d->cluster_size);
2728 /* parse all the clusters upto target_filepos */
2729 while (!s->eof && stream_tell(s) < (off_t) target_filepos)
2730 {
2731 switch (ebml_read_id (s, &i))
2732 {
2733 case MATROSKA_ID_CLUSTER:
2734 add_cluster_position(mkv_d, (uint64_t) stream_tell(s)-i);
2735 break;
2736
2737 case MATROSKA_ID_CUES:
2738 demux_mkv_read_cues (demuxer);
2739 break;
2740 }
2741 ebml_read_skip (s, NULL);
2742 }
2743 if (s->eof)
2744 stream_reset(s);
2745 }
2746
2747 if (mkv_d->indexes == NULL)
2748 {
2749 cluster_pos = mkv_d->cluster_positions[0];
2750 /* Let's find the nearest cluster */
2751 for (i=0; i < mkv_d->num_cluster_pos; i++)
2752 {
2753 diff = mkv_d->cluster_positions[i] - target_filepos;
2754 if (rel_seek_secs < 0 && diff < 0 && -diff < min_diff)
2755 {
2756 cluster_pos = mkv_d->cluster_positions[i];
2757 min_diff = -diff;
2758 }
2759 else if (rel_seek_secs > 0
2760 && (diff < 0 ? -1 * diff : diff) < min_diff)
2761 {
2762 cluster_pos = mkv_d->cluster_positions[i];
2763 min_diff = diff < 0 ? -1 * diff : diff;
2764 }
2765 }
2766 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2767 stream_seek (s, cluster_pos);
2768 }
2769 }
2770 else
2771 {
2772 mkv_index_t *index = NULL;
2773
2774 /* let's find the entry in the indexes with the smallest */
2775 /* difference to the wanted timecode. */
2776 for (i=0; i < mkv_d->num_indexes; i++)
2777 if (mkv_d->indexes[i].tnum == demuxer->video->id)
2778 {
2779 diff = target_timecode - (int64_t) mkv_d->indexes[i].timecode;
2780
2781 if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000)
2782 && diff >= 0 && diff < min_diff)
2783 {
2784 min_diff = diff;
2785 index = mkv_d->indexes + i;
2786 }
2787 else if (target_timecode > mkv_d->last_pts*1000
2788 && diff < 0 && -diff < min_diff)
2789 {
2790 min_diff = -diff;
2791 index = mkv_d->indexes + i;
2792 }
2793 }
2794
2795 if (index) /* We've found an entry. */
2796 {
2797 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2798 stream_seek (s, index->filepos);
2799 }
2800 }
2801
2802 if (demuxer->video->id >= 0)
2803 mkv_d->v_skip_to_keyframe = 1;
2804 if (rel_seek_secs > 0.0)
2805 mkv_d->skip_to_timecode = target_timecode;
2806 mkv_d->a_skip_to_keyframe = 1;
2807
2808 demux_mkv_fill_buffer(demuxer);
2809
2810 if(demuxer->audio->sh != NULL)
2811 resync_audio_stream((sh_audio_t *) demuxer->audio->sh);
2812 }
2813 else
2814 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2815 }
2816
2817 int
2818 demux_mkv_control (demuxer_t *demuxer, int cmd, void *arg)
2819 {
2820 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2821
2822 switch (cmd)
2823 {
2824 case DEMUXER_CTRL_GET_TIME_LENGTH:
2825 if (mkv_d->duration == 0)
2826 return DEMUXER_CTRL_DONTKNOW;
2827
2828 *((unsigned long *)arg) = (unsigned long)mkv_d->duration;
2829 return DEMUXER_CTRL_OK;
2830
2831 case DEMUXER_CTRL_GET_PERCENT_POS:
2832 if (mkv_d->duration == 0)
2833 {
2834 if (demuxer->movi_start == demuxer->movi_end)
2835 return DEMUXER_CTRL_DONTKNOW;
2836
2837 *((int *)arg) = (int)((demuxer->filepos - demuxer->movi_start) /
2838 ((demuxer->movi_end-demuxer->movi_start)/100));
2839 return DEMUXER_CTRL_OK;
2840 }
2841
2842 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
2843 return DEMUXER_CTRL_OK;
2844
2845 default:
2846 return DEMUXER_CTRL_NOTIMPL;
2847 }
2848 }
2849
2850 #endif /* HAVE_MATROSKA */