Merge svn changes up to r30529
[mplayer/kovensky.git] / libmpdemux / demux_mkv.c
blob67e26a07307209c23fc08272dc15e4b179a38b90
1 /*
2 * Matroska demuxer
3 * Copyright (C) 2004 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.
7 * This file is part of MPlayer.
9 * MPlayer is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * MPlayer is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "config.h"
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <ctype.h>
29 #include <inttypes.h>
30 #include <stdbool.h>
32 #include "talloc.h"
33 #include "options.h"
34 #include "stream/stream.h"
35 #include "demuxer.h"
36 #include "stheader.h"
37 #include "ebml.h"
38 #include "matroska.h"
40 #include "mp_msg.h"
41 #include "help_mp.h"
43 #include "vobsub.h"
44 #include "subreader.h"
45 #include "libvo/sub.h"
47 #include "ass_mp.h"
49 #include "libavutil/common.h"
51 #ifdef CONFIG_QTX_CODECS
52 #include "loader/qtx/qtxsdk/components.h"
53 #endif
55 #if CONFIG_ZLIB
56 #include <zlib.h>
57 #endif
59 #include "libavutil/lzo.h"
60 #include "ffmpeg_files/intreadwrite.h"
61 #include "libavutil/avstring.h"
63 static const unsigned char sipr_swaps[38][2] = {
64 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
65 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
66 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
67 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
68 {77,80}
71 // Map flavour to bytes per second
72 #define SIPR_FLAVORS 4
73 #define ATRC_FLAVORS 8
74 #define COOK_FLAVORS 34
75 static const int sipr_fl2bps[SIPR_FLAVORS] = { 813, 1062, 625, 2000 };
76 static const int atrc_fl2bps[ATRC_FLAVORS] =
77 { 8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100 };
78 static const int cook_fl2bps[COOK_FLAVORS] = {
79 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
80 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
81 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
82 12016, 16408, 22911, 33506
85 typedef struct mkv_content_encoding {
86 uint64_t order, type, scope;
87 uint64_t comp_algo;
88 uint8_t *comp_settings;
89 int comp_settings_len;
90 } mkv_content_encoding_t;
92 typedef struct mkv_track {
93 int tnum;
94 char *name;
96 char *codec_id;
97 int ms_compat;
98 char *language;
100 int type;
102 uint32_t v_width, v_height, v_dwidth, v_dheight;
103 double v_frate;
105 uint32_t a_formattag;
106 uint32_t a_channels, a_bps;
107 float a_sfreq;
109 double default_duration;
111 int default_track;
113 unsigned char *private_data;
114 unsigned int private_size;
116 /* stuff for realmedia */
117 int realmedia;
118 int64_t rv_kf_base;
119 int rv_kf_pts;
120 double rv_pts; /* previous video timestamp */
121 double ra_pts; /* previous audio timestamp */
123 /** realaudio descrambling */
124 int sub_packet_size; ///< sub packet size, per stream
125 int sub_packet_h; ///< number of coded frames per block
126 int coded_framesize; ///< coded frame size, per stream
127 int audiopk_size; ///< audio packet size
128 unsigned char *audio_buf; ///< place to store reordered audio data
129 double *audio_timestamp; ///< timestamp for each audio packet
130 int sub_packet_cnt; ///< number of subpacket already received
131 int audio_filepos; ///< file position of first audio packet in block
133 /* stuff for quicktime */
134 int fix_i_bps;
135 double qt_last_a_pts;
137 int subtitle_type;
139 /* The timecodes of video frames might have to be reordered if they're
140 in display order (the timecodes, not the frames themselves!). In this
141 case demux packets have to be cached with the help of these variables. */
142 int reorder_timecodes;
143 demux_packet_t **cached_dps;
144 int num_cached_dps, num_allocated_dps;
145 double max_pts;
147 /* generic content encoding support */
148 mkv_content_encoding_t *encodings;
149 int num_encodings;
151 /* For VobSubs and SSA/ASS */
152 sh_sub_t *sh_sub;
153 } mkv_track_t;
155 typedef struct mkv_index {
156 int tnum;
157 uint64_t timecode, filepos;
158 } mkv_index_t;
160 typedef struct mkv_demuxer {
161 off_t segment_start;
163 double duration, last_pts;
164 uint64_t last_filepos;
166 mkv_track_t **tracks;
167 int num_tracks;
169 uint64_t tc_scale, cluster_tc;
171 uint64_t cluster_start;
172 uint64_t cluster_size;
173 uint64_t blockgroup_size;
175 mkv_index_t *indexes;
176 int num_indexes;
178 off_t *parsed_pos;
179 int num_parsed_pos;
180 bool parsed_info;
181 bool parsed_tracks;
182 bool parsed_tags;
183 bool parsed_chapters;
184 bool parsed_attachments;
186 struct cluster_pos {
187 uint64_t filepos;
188 uint64_t timecode;
189 } *cluster_positions;
190 int num_cluster_pos;
192 int64_t skip_to_timecode;
193 int v_skip_to_keyframe, a_skip_to_keyframe;
195 int last_aid;
196 int audio_tracks[MAX_A_STREAMS];
197 } mkv_demuxer_t;
199 #define REALHEADER_SIZE 16
200 #define RVPROPERTIES_SIZE 34
201 #define RAPROPERTIES4_SIZE 56
202 #define RAPROPERTIES5_SIZE 70
205 * \brief ensures there is space for at least one additional element
206 * \param array array to grow
207 * \param nelem current number of elements in array
208 * \param elsize size of one array element
210 static void *grow_array(void *array, int nelem, size_t elsize)
212 if (!(nelem & 31))
213 array = realloc(array, (nelem + 32) * elsize);
214 return array;
217 static bool is_parsed_header(struct mkv_demuxer *mkv_d, off_t pos)
219 int low = 0;
220 int high = mkv_d->num_parsed_pos;
221 while (high > low + 1) {
222 int mid = high + low >> 1;
223 if (mkv_d->parsed_pos[mid] > pos)
224 high = mid;
225 else
226 low = mid;
228 if (mkv_d->num_parsed_pos && mkv_d->parsed_pos[low] == pos)
229 return true;
230 if (!(mkv_d->num_parsed_pos & 31))
231 mkv_d->parsed_pos = talloc_realloc(mkv_d, mkv_d->parsed_pos, off_t,
232 mkv_d->num_parsed_pos + 32);
233 mkv_d->num_parsed_pos++;
234 for (int i = mkv_d->num_parsed_pos - 1; i > low; i--)
235 mkv_d->parsed_pos[i] = mkv_d->parsed_pos[i - 1];
236 mkv_d->parsed_pos[low] = pos;
237 return false;
240 static mkv_track_t *demux_mkv_find_track_by_num(mkv_demuxer_t *d, int n,
241 int type)
243 int i, id;
245 for (i = 0, id = 0; i < d->num_tracks; i++)
246 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
247 if (id++ == n)
248 return d->tracks[i];
250 return NULL;
253 static void add_cluster_position(mkv_demuxer_t *mkv_d, uint64_t filepos,
254 uint64_t timecode)
256 if (mkv_d->indexes)
257 return;
259 int n = mkv_d->num_cluster_pos;
260 if (n > 0 && mkv_d->cluster_positions[n-1].filepos >= filepos)
261 return;
263 mkv_d->cluster_positions =
264 grow_array(mkv_d->cluster_positions, mkv_d->num_cluster_pos,
265 sizeof(*mkv_d->cluster_positions));
266 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = (struct cluster_pos){
267 .filepos = filepos,
268 .timecode = timecode,
273 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
274 static int aac_get_sample_rate_index(uint32_t sample_rate)
276 static const int srates[] = {
277 92017, 75132, 55426, 46009, 37566, 27713,
278 23004, 18783, 13856, 11502, 9391, 0
280 int i = 0;
281 while (sample_rate < srates[i])
282 i++;
283 return i;
286 /** \brief Free cached demux packets
288 * Reordering the timecodes requires caching of demux packets. This function
289 * frees all these cached packets and the memory for the cached pointers
290 * itself.
292 * \param demuxer The demuxer for which the cache is to be freed.
294 static void free_cached_dps(demuxer_t *demuxer)
296 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
297 mkv_track_t *track;
298 int i, k;
300 for (k = 0; k < mkv_d->num_tracks; k++) {
301 track = mkv_d->tracks[k];
302 for (i = 0; i < track->num_cached_dps; i++)
303 free_demux_packet(track->cached_dps[i]);
304 free(track->cached_dps);
305 track->cached_dps = NULL;
306 track->num_cached_dps = 0;
307 track->num_allocated_dps = 0;
308 track->max_pts = 0;
312 static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
313 uint8_t **dest, uint32_t *size, uint32_t type)
315 uint8_t *orig_src = src;
317 *dest = src;
319 for (int i = 0; i < track->num_encodings; i++) {
320 struct mkv_content_encoding *enc = track->encodings + i;
321 if (!(enc->scope & type))
322 continue;
324 if (src != *dest && src != orig_src)
325 free(src);
326 src = *dest; // output from last iteration is new source
328 if (enc->comp_algo == 0) {
329 #if CONFIG_ZLIB
330 /* zlib encoded track */
332 if (*size == 0)
333 continue;
335 z_stream zstream;
337 zstream.zalloc = (alloc_func) 0;
338 zstream.zfree = (free_func) 0;
339 zstream.opaque = (voidpf) 0;
340 if (inflateInit(&zstream) != Z_OK) {
341 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
342 "[mkv] zlib initialization failed.\n");
343 goto error;
345 zstream.next_in = (Bytef *) src;
346 zstream.avail_in = *size;
348 *dest = NULL;
349 zstream.avail_out = *size;
350 int result;
351 do {
352 *size += 4000;
353 *dest = realloc(*dest, *size);
354 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
355 result = inflate(&zstream, Z_NO_FLUSH);
356 if (result != Z_OK && result != Z_STREAM_END) {
357 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
358 "[mkv] zlib decompression failed.\n");
359 free(*dest);
360 *dest = NULL;
361 inflateEnd(&zstream);
362 goto error;
364 zstream.avail_out += 4000;
365 } while (zstream.avail_out == 4000 && zstream.avail_in != 0
366 && result != Z_STREAM_END);
368 *size = zstream.total_out;
369 inflateEnd(&zstream);
370 #endif
371 } else if (enc->comp_algo == 2) {
372 /* lzo encoded track */
373 int dstlen = *size * 3;
375 *dest = NULL;
376 while (1) {
377 int srclen = *size;
378 if (dstlen > SIZE_MAX - AV_LZO_OUTPUT_PADDING)
379 goto lzo_fail;
380 *dest = realloc(*dest, dstlen + AV_LZO_OUTPUT_PADDING);
381 int result = av_lzo1x_decode(*dest, &dstlen, src, &srclen);
382 if (result == 0)
383 break;
384 if (!(result & AV_LZO_OUTPUT_FULL)) {
385 lzo_fail:
386 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
387 "[mkv] lzo decompression failed.\n");
388 free(*dest);
389 *dest = NULL;
390 goto error;
392 mp_msg(MSGT_DEMUX, MSGL_DBG2,
393 "[mkv] lzo decompression buffer too small.\n");
394 dstlen *= 2;
396 *size = dstlen;
397 } else if (enc->comp_algo == 3) {
398 *dest = malloc(*size + enc->comp_settings_len);
399 memcpy(*dest, enc->comp_settings, enc->comp_settings_len);
400 memcpy(*dest + enc->comp_settings_len, src, *size);
401 *size += enc->comp_settings_len;
405 error:
406 if (src != *dest && src != orig_src)
407 free(src);
411 static int demux_mkv_read_info(demuxer_t *demuxer)
413 mkv_demuxer_t *mkv_d = demuxer->priv;
414 stream_t *s = demuxer->stream;
416 mkv_d->tc_scale = 1000000;
417 mkv_d->duration = 0;
419 struct ebml_info info = {};
420 struct ebml_parse_ctx parse_ctx = {};
421 if (ebml_read_element(s, &parse_ctx, &info, &ebml_info_desc) < 0)
422 return 1;
423 if (info.n_timecode_scale) {
424 mkv_d->tc_scale = info.timecode_scale;
425 mp_msg(MSGT_DEMUX, MSGL_V,
426 "[mkv] | + timecode scale: %" PRIu64 "\n", mkv_d->tc_scale);
428 if (info.n_duration) {
429 mkv_d->duration = info.duration * mkv_d->tc_scale / 1e9;
430 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
431 mkv_d->duration);
433 if (info.n_segment_uid) {
434 int len = info.segment_uid.len;
435 if (len != sizeof(demuxer->matroska_data.segment_uid)) {
436 mp_msg(MSGT_DEMUX, MSGL_INFO,
437 "[mkv] segment uid invalid length %d\n", len);
438 } else {
439 memcpy(demuxer->matroska_data.segment_uid, info.segment_uid.start,
440 len);
441 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + segment uid");
442 for (int i = 0; i < len; i++)
443 mp_msg(MSGT_DEMUX, MSGL_V, " %02x",
444 demuxer->matroska_data.segment_uid[i]);
445 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
448 talloc_free(parse_ctx.talloc_ctx);
449 return 0;
452 static void parse_trackencodings(struct demuxer *demuxer,
453 struct mkv_track *track,
454 struct ebml_content_encodings *encodings)
456 // initial allocation to be a non-NULL context before realloc
457 mkv_content_encoding_t *ce = talloc_size(track, 1);
459 for (int n_enc = 0; n_enc < encodings->n_content_encoding; n_enc++) {
460 struct ebml_content_encoding *enc = encodings->content_encoding + n_enc;
461 struct mkv_content_encoding e = {};
462 e.order = enc->content_encoding_order;
463 if (enc->n_content_encoding_scope)
464 e.scope = enc->content_encoding_scope;
465 else
466 e.scope = 1;
467 e.type = enc->content_encoding_type;
469 if (enc->n_content_compression) {
470 struct ebml_content_compression *z = &enc->content_compression;
471 e.comp_algo = z->content_comp_algo;
472 if (z->n_content_comp_settings) {
473 int sz = z->content_comp_settings.len;
474 e.comp_settings = talloc_size(ce, sz);
475 memcpy(e.comp_settings, z->content_comp_settings.start, sz);
476 e.comp_settings_len = sz;
480 if (e.type == 1) {
481 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track "
482 "number %u has been encrypted and "
483 "decryption has not yet been\n"
484 "[mkv] implemented. Skipping track.\n",
485 track->tnum);
486 } else if (e.type != 0) {
487 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
488 "[mkv] Unknown content encoding type for "
489 "track %u. Skipping track.\n",
490 track->tnum);
491 } else if (e.comp_algo != 0 && e.comp_algo != 2 && e.comp_algo != 3) {
492 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
493 "[mkv] Track %u has been compressed with "
494 "an unknown/unsupported compression\n"
495 "[mkv] algorithm (%" PRIu64 "). Skipping track.\n",
496 track->tnum, e.comp_algo);
498 #if !CONFIG_ZLIB
499 else if (e.comp_algo == 0) {
500 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
501 "[mkv] Track %u was compressed with zlib "
502 "but mplayer has not been compiled\n"
503 "[mkv] with support for zlib compression. "
504 "Skipping track.\n",
505 track->tnum);
507 #endif
508 int i;
509 for (i = 0; i < n_enc; i++)
510 if (e.order >= ce[i].order)
511 break;
512 ce = talloc_realloc_size(track, ce, (n_enc + 1) * sizeof(*ce));
513 memmove(ce + i + 1, ce + i, (n_enc - i) * sizeof(*ce));
514 memcpy(ce + i, &e, sizeof(e));
517 track->encodings = ce;
518 track->num_encodings = encodings->n_content_encoding;
521 static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track,
522 struct ebml_audio *audio)
524 if (audio->n_sampling_frequency) {
525 track->a_sfreq = audio->sampling_frequency;
526 mp_msg(MSGT_DEMUX, MSGL_V,
527 "[mkv] | + Sampling frequency: %f\n", track->a_sfreq);
528 } else
529 track->a_sfreq = 8000;
530 if (audio->n_bit_depth) {
531 track->a_bps = audio->bit_depth;
532 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
533 track->a_bps);
535 if (audio->n_channels) {
536 track->a_channels = audio->channels;
537 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
538 track->a_channels);
539 } else
540 track->a_channels = 1;
543 static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track,
544 struct ebml_video *video)
546 if (video->n_frame_rate) {
547 track->v_frate = video->frame_rate;
548 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
549 track->v_frate);
550 if (track->v_frate > 0)
551 track->default_duration = 1 / track->v_frate;
553 if (video->n_display_width) {
554 track->v_dwidth = video->display_width;
555 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
556 track->v_dwidth);
558 if (video->n_display_height) {
559 track->v_dheight = video->display_height;
560 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
561 track->v_dheight);
563 if (video->n_pixel_width) {
564 track->v_width = video->pixel_width;
565 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
566 track->v_width);
568 if (video->n_pixel_height) {
569 track->v_height = video->pixel_height;
570 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
571 track->v_height);
576 * \brief free any data associated with given track
577 * \param track track of which to free data
579 static void demux_mkv_free_trackentry(mkv_track_t *track)
581 free(track->audio_buf);
582 free(track->audio_timestamp);
583 talloc_free(track);
586 static void parse_trackentry(struct demuxer *demuxer,
587 struct ebml_track_entry *entry)
589 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
590 struct mkv_track *track = talloc_zero_size(NULL, sizeof(*track));
592 track->tnum = entry->track_number;
593 if (track->tnum)
594 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
595 track->tnum);
596 else
597 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing track number!\n");
599 if (entry->n_name) {
600 track->name = talloc_strndup(track, entry->name.start,
601 entry->name.len);
602 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
603 track->name);
606 track->type = entry->track_type;
607 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
608 switch (track->type) {
609 case MATROSKA_TRACK_AUDIO:
610 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
611 break;
612 case MATROSKA_TRACK_VIDEO:
613 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
614 break;
615 case MATROSKA_TRACK_SUBTITLE:
616 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
617 break;
618 default:
619 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
620 break;
623 if (entry->n_audio) {
624 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
625 parse_trackaudio(demuxer, track, &entry->audio);
628 if (entry->n_video) {
629 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
630 parse_trackvideo(demuxer, track, &entry->video);
633 if (entry->n_codec_id) {
634 track->codec_id = talloc_strndup(track, entry->codec_id.start,
635 entry->codec_id.len);
636 if (!strcmp(track->codec_id, MKV_V_MSCOMP)
637 || !strcmp(track->codec_id, MKV_A_ACM))
638 track->ms_compat = 1;
639 else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
640 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB;
641 else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
642 || !strcmp(track->codec_id, MKV_S_TEXTASS)
643 || !strcmp(track->codec_id, MKV_S_SSA)
644 || !strcmp(track->codec_id, MKV_S_ASS)) {
645 track->subtitle_type = MATROSKA_SUBTYPE_SSA;
646 } else if (!strcmp(track->codec_id, MKV_S_TEXTASCII))
647 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
648 if (!strcmp(track->codec_id, MKV_S_TEXTUTF8)) {
649 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
651 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
652 track->codec_id);
653 } else
654 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing codec ID!\n");
656 if (entry->n_codec_private) {
657 int len = entry->codec_private.len;
658 track->private_data = talloc_size(track, len + AV_LZO_INPUT_PADDING);
659 memcpy(track->private_data, entry->codec_private.start, len);
660 track->private_size = len;
661 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length %u\n",
662 track->private_size);
665 if (entry->n_language) {
666 track->language = talloc_strndup(track, entry->language.start,
667 entry->language.len);
668 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
669 track->language);
670 } else
671 track->language = talloc_strdup(track, "eng");
673 if (entry->n_flag_default) {
674 track->default_track = entry->flag_default;
675 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
676 track->default_track);
677 } else
678 track->default_track = 1;
680 if (entry->n_default_duration) {
681 track->default_duration = entry->default_duration / 1e9;
682 if (entry->default_duration == 0)
683 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
684 else {
685 if (!track->v_frate)
686 track->v_frate = 1e9 / entry->default_duration;
687 mp_msg(MSGT_DEMUX, MSGL_V,
688 "[mkv] | + Default duration: %.3fms ( = %.3f fps)\n",
689 entry->default_duration / 1000000.0, track->v_frate);
693 if (entry->n_content_encodings)
694 parse_trackencodings(demuxer, track, &entry->content_encodings);
696 mkv_d->tracks[mkv_d->num_tracks++] = track;
699 static int demux_mkv_read_tracks(demuxer_t *demuxer)
701 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
702 stream_t *s = demuxer->stream;
704 struct ebml_tracks tracks = {};
705 struct ebml_parse_ctx parse_ctx = {};
706 if (ebml_read_element(s, &parse_ctx, &tracks, &ebml_tracks_desc) < 0)
707 return 1;
709 mkv_d->tracks = talloc_size(mkv_d,
710 tracks.n_track_entry * sizeof(*mkv_d->tracks));
711 for (int i = 0; i < tracks.n_track_entry; i++) {
712 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
713 parse_trackentry(demuxer, &tracks.track_entry[i]);
715 talloc_free(parse_ctx.talloc_ctx);
716 return 0;
719 static int demux_mkv_read_cues(demuxer_t *demuxer)
721 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
722 stream_t *s = demuxer->stream;
724 if (index_mode == 0 || index_mode == 2) {
725 ebml_read_skip(s, NULL);
726 return 0;
729 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
730 struct ebml_cues cues = {};
731 struct ebml_parse_ctx parse_ctx = {};
732 if (ebml_read_element(s, &parse_ctx, &cues, &ebml_cues_desc) < 0)
733 goto out;
734 for (int i = 0; i < cues.n_cue_point; i++) {
735 struct ebml_cue_point *cuepoint = &cues.cue_point[i];
736 if (cuepoint->n_cue_time != 1 || !cuepoint->n_cue_track_positions) {
737 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed CuePoint element\n");
738 continue;
740 uint64_t time = cuepoint->cue_time;
741 for (int i = 0; i < cuepoint->n_cue_track_positions; i++) {
742 struct ebml_cue_track_positions *trackpos =
743 &cuepoint->cue_track_positions[i];
744 uint64_t track = trackpos->cue_track;
745 uint64_t pos = trackpos->cue_cluster_position;
746 mkv_d->indexes =
747 grow_array(mkv_d->indexes, mkv_d->num_indexes,
748 sizeof(mkv_index_t));
749 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
750 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
751 mkv_d->indexes[mkv_d->num_indexes].filepos =
752 mkv_d->segment_start + pos;
753 mp_msg(MSGT_DEMUX, MSGL_DBG2,
754 "[mkv] |+ found cue point for track %" PRIu64
755 ": timecode %" PRIu64 ", filepos: %" PRIu64 "\n", track,
756 time, mkv_d->segment_start + pos);
757 mkv_d->num_indexes++;
761 out:
762 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
763 talloc_free(parse_ctx.talloc_ctx);
764 return 0;
767 static int demux_mkv_read_chapters(struct demuxer *demuxer)
769 struct MPOpts *opts = demuxer->opts;
770 stream_t *s = demuxer->stream;
772 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
773 struct ebml_chapters file_chapters = {};
774 struct ebml_parse_ctx parse_ctx = {};
775 if (ebml_read_element(s, &parse_ctx, &file_chapters,
776 &ebml_chapters_desc) < 0)
777 goto out;
779 int selected_edition = 0;
780 int num_editions = file_chapters.n_edition_entry;
781 struct ebml_edition_entry *editions = file_chapters.edition_entry;
782 if (opts->edition_id >= 0 && opts->edition_id < num_editions) {
783 selected_edition = opts->edition_id;
784 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] User-specified edition: %d\n",
785 selected_edition);
786 } else
787 for (int i = 0; i < num_editions; i++)
788 if (editions[i].edition_flag_default) {
789 selected_edition = i;
790 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition: %d\n", i);
791 break;
793 struct matroska_chapter *m_chapters = NULL;
794 if (editions[selected_edition].edition_flag_ordered) {
795 int count = editions[selected_edition].n_chapter_atom;
796 m_chapters = talloc_array_ptrtype(demuxer, m_chapters, count);
797 demuxer->matroska_data.ordered_chapters = m_chapters;
798 demuxer->matroska_data.num_ordered_chapters = count;
801 for (int idx = 0; idx < num_editions; idx++) {
802 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New edition %d\n", idx);
803 int warn_level = idx == selected_edition ? MSGL_WARN : MSGL_V;
804 if (editions[idx].n_edition_flag_default)
805 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition flag: %"PRIu64
806 "\n", editions[idx].edition_flag_default);
807 if (editions[idx].n_edition_flag_ordered)
808 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Ordered chapter flag: %"PRIu64
809 "\n", editions[idx].edition_flag_ordered);
810 for (int i = 0; i < editions[idx].n_chapter_atom; i++) {
811 struct ebml_chapter_atom *ca = editions[idx].chapter_atom + i;
812 struct matroska_chapter chapter = { };
813 struct bstr name = { "(unnamed)", 9 };
815 if (!ca->n_chapter_time_start)
816 mp_msg(MSGT_DEMUX, warn_level,
817 "[mkv] Chapter lacks start time\n");
818 chapter.start = ca->chapter_time_start / 1000000;
819 chapter.end = ca->chapter_time_end / 1000000;
821 if (ca->n_chapter_display) {
822 if (ca->n_chapter_display > 1)
823 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Multiple chapter "
824 "names not supported, picking first\n");
825 if (!ca->chapter_display[0].n_chap_string)
826 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Malformed chapter "
827 "name entry\n");
828 else
829 name = ca->chapter_display[0].chap_string;
832 if (ca->n_chapter_segment_uid) {
833 chapter.has_segment_uid = true;
834 int len = ca->chapter_segment_uid.len;
835 if (len != sizeof(chapter.segment_uid))
836 mp_msg(MSGT_DEMUX, warn_level,
837 "[mkv] Chapter segment uid bad length %d\n", len);
838 else if (ca->n_chapter_segment_edition_uid) {
839 mp_tmsg(MSGT_DEMUX, warn_level, "[mkv] Warning: "
840 "unsupported edition recursion in chapter; "
841 "will skip on playback!\n");
842 } else {
843 memcpy(chapter.segment_uid, ca->chapter_segment_uid.start,
844 len);
845 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter segment uid ");
846 for (int i = 0; i < len; i++)
847 mp_msg(MSGT_DEMUX, MSGL_V, "%02x ",
848 chapter.segment_uid[i]);
849 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
853 mp_msg(MSGT_DEMUX, MSGL_V,
854 "[mkv] Chapter %u from %02d:%02d:%02d.%03d "
855 "to %02d:%02d:%02d.%03d, %.*s\n", idx,
856 (int) (chapter.start / 60 / 60 / 1000),
857 (int) ((chapter.start / 60 / 1000) % 60),
858 (int) ((chapter.start / 1000) % 60),
859 (int) (chapter.start % 1000),
860 (int) (chapter.end / 60 / 60 / 1000),
861 (int) ((chapter.end / 60 / 1000) % 60),
862 (int) ((chapter.end / 1000) % 60),
863 (int) (chapter.end % 1000),
864 name.len, name.start);
866 if (idx == selected_edition){
867 demuxer_add_chapter(demuxer, name.start, name.len,
868 chapter.start, chapter.end);
869 if (editions[idx].edition_flag_ordered) {
870 chapter.name = talloc_strndup(m_chapters, name.start,
871 name.len);
872 m_chapters[i] = chapter;
877 if (num_editions > 1)
878 mp_msg(MSGT_DEMUX, MSGL_INFO,
879 "[mkv] Found %d editions, will play #%d (first is 0).\n",
880 num_editions, selected_edition);
882 out:
883 talloc_free(parse_ctx.talloc_ctx);
884 mp_msg(MSGT_DEMUX, MSGL_V,
885 "[mkv] \\---- [ parsing chapters ] ---------\n");
886 return 0;
889 static int demux_mkv_read_tags(demuxer_t *demuxer)
891 ebml_read_skip(demuxer->stream, NULL);
892 return 0;
895 static int demux_mkv_read_attachments(demuxer_t *demuxer)
897 stream_t *s = demuxer->stream;
899 mp_msg(MSGT_DEMUX, MSGL_V,
900 "[mkv] /---- [ parsing attachments ] ---------\n");
902 struct ebml_attachments attachments = {};
903 struct ebml_parse_ctx parse_ctx = {};
904 if (ebml_read_element(s, &parse_ctx, &attachments,
905 &ebml_attachments_desc) < 0)
906 goto out;
908 for (int i = 0; i < attachments.n_attached_file; i++) {
909 struct ebml_attached_file *attachment = &attachments.attached_file[i];
910 if (!attachment->n_file_name || !attachment->n_file_mime_type
911 || !attachment->n_file_data) {
912 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed attachment\n");
913 continue;
915 struct bstr name = attachment->file_name;
916 struct bstr mime = attachment->file_mime_type;
917 char *data = attachment->file_data.start;
918 int data_size = attachment->file_data.len;
919 demuxer_add_attachment(demuxer, name.start, name.len, mime.start,
920 mime.len, data, data_size);
921 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Attachment: %.*s, %.*s, %u bytes\n",
922 name.len, name.start, mime.len, mime.start, data_size);
925 out:
926 talloc_free(parse_ctx.talloc_ctx);
927 mp_msg(MSGT_DEMUX, MSGL_V,
928 "[mkv] \\---- [ parsing attachments ] ---------\n");
929 return 0;
932 static int read_header_element(struct demuxer *demuxer, uint32_t id,
933 off_t at_filepos);
935 static int demux_mkv_read_seekhead(demuxer_t *demuxer)
937 struct mkv_demuxer *mkv_d = demuxer->priv;
938 struct stream *s = demuxer->stream;
939 int res = 0;
940 struct ebml_seek_head seekhead = {};
941 struct ebml_parse_ctx parse_ctx = {};
943 mp_msg(MSGT_DEMUX, MSGL_V,
944 "[mkv] /---- [ parsing seek head ] ---------\n");
945 if (ebml_read_element(s, &parse_ctx, &seekhead, &ebml_seek_head_desc) < 0) {
946 res = 1;
947 goto out;
949 /* off now holds the position of the next element after the seek head. */
950 off_t off = stream_tell(s);
951 for (int i = 0; i < seekhead.n_seek; i++) {
952 struct ebml_seek *seek = &seekhead.seek[i];
953 if (seek->n_seek_id != 1 || seek->n_seek_position != 1) {
954 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Invalid SeekHead entry\n");
955 continue;
957 uint64_t pos = seek->seek_position + mkv_d->segment_start;
958 if (pos >= demuxer->movi_end) {
959 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] SeekHead position beyond "
960 "end of file - incomplete file?\n");
961 continue;
963 read_header_element(demuxer, seek->seek_id, pos);
965 if (!stream_seek(s, off)) {
966 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Couldn't seek back after "
967 "SeekHead??\n");
968 res = 1;
970 out:
971 mp_msg(MSGT_DEMUX, MSGL_V,
972 "[mkv] \\---- [ parsing seek head ] ---------\n");
973 talloc_free(parse_ctx.talloc_ctx);
974 return res;
977 static bool seek_pos_id(struct stream *s, off_t pos, uint32_t id)
979 if (!stream_seek(s, pos)) {
980 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Failed to seek in file\n");
981 return false;
983 if (ebml_read_id(s, NULL) != id) {
984 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Expected element not found\n");
985 return false;
987 return true;
990 static int read_header_element(struct demuxer *demuxer, uint32_t id,
991 off_t at_filepos)
993 struct mkv_demuxer *mkv_d = demuxer->priv;
994 stream_t *s = demuxer->stream;
995 off_t pos = stream_tell(s) - 4;
997 switch(id) {
998 case MATROSKA_ID_INFO:
999 if (mkv_d->parsed_info)
1000 break;
1001 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1002 return -1;
1003 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
1004 mkv_d->parsed_info = true;
1005 return demux_mkv_read_info(demuxer) ? -1 : 1;
1007 case MATROSKA_ID_TRACKS:
1008 if (mkv_d->parsed_tracks)
1009 break;
1010 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1011 return -1;
1012 mkv_d->parsed_tracks = true;
1013 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
1014 return demux_mkv_read_tracks(demuxer) ? -1 : 1;
1016 case MATROSKA_ID_CUES:
1017 if (is_parsed_header(mkv_d, pos))
1018 break;
1019 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1020 return -1;
1021 return demux_mkv_read_cues(demuxer) ? -1 : 1;
1023 case MATROSKA_ID_TAGS:
1024 if (mkv_d->parsed_tags)
1025 break;
1026 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1027 return -1;
1028 mkv_d->parsed_tags = true;
1029 return demux_mkv_read_tags(demuxer) ? -1 : 1;
1031 case MATROSKA_ID_SEEKHEAD:
1032 if (is_parsed_header(mkv_d, pos))
1033 break;
1034 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1035 return -1;
1036 return demux_mkv_read_seekhead(demuxer) ? -1 : 1;
1038 case MATROSKA_ID_CHAPTERS:
1039 if (mkv_d->parsed_chapters)
1040 break;
1041 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1042 return -1;
1043 mkv_d->parsed_chapters = true;
1044 return demux_mkv_read_chapters(demuxer) ? -1 : 1;
1046 case MATROSKA_ID_ATTACHMENTS:
1047 if (mkv_d->parsed_attachments)
1048 break;
1049 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1050 return -1;
1051 mkv_d->parsed_attachments = true;
1052 return demux_mkv_read_attachments(demuxer) ? -1 : 1;
1054 default:
1055 if (!at_filepos)
1056 ebml_read_skip(s, NULL);
1057 return 0;
1059 if (!at_filepos)
1060 ebml_read_skip(s, NULL);
1061 return 1;
1066 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1067 int vid);
1068 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1069 int aid);
1070 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1071 int sid);
1073 static void display_create_tracks(demuxer_t *demuxer)
1075 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1076 int i, vid = 0, aid = 0, sid = 0;
1078 for (i = 0; i < mkv_d->num_tracks; i++) {
1079 char *type = "unknown", str[32];
1080 *str = '\0';
1081 switch (mkv_d->tracks[i]->type) {
1082 case MATROSKA_TRACK_VIDEO:
1083 type = "video";
1084 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid);
1085 if (mkv_d->tracks[i]->name)
1086 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", vid,
1087 mkv_d->tracks[i]->name);
1088 sprintf(str, "-vid %u", vid++);
1089 break;
1090 case MATROSKA_TRACK_AUDIO:
1091 type = "audio";
1092 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid);
1093 if (mkv_d->tracks[i]->name)
1094 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", aid,
1095 mkv_d->tracks[i]->name);
1096 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", aid,
1097 mkv_d->tracks[i]->language);
1098 sprintf(str, "-aid %u, -alang %.5s", aid++,
1099 mkv_d->tracks[i]->language);
1100 break;
1101 case MATROSKA_TRACK_SUBTITLE:
1102 type = "subtitles";
1103 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
1104 if (mkv_d->tracks[i]->name)
1105 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid,
1106 mkv_d->tracks[i]->name);
1107 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid,
1108 mkv_d->tracks[i]->language);
1109 sprintf(str, "-sid %u, -slang %.5s", sid++,
1110 mkv_d->tracks[i]->language);
1111 break;
1113 if (mkv_d->tracks[i]->name)
1114 mp_tmsg(MSGT_DEMUX, MSGL_INFO,
1115 "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1116 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1117 mkv_d->tracks[i]->name, str);
1118 else
1119 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
1120 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1121 str);
1125 typedef struct {
1126 char *id;
1127 int fourcc;
1128 int extradata;
1129 } videocodec_info_t;
1131 static const videocodec_info_t vinfo[] = {
1132 {MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0},
1133 {MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0},
1134 {MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1135 {MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1136 {MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1137 {MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1},
1138 {MKV_V_THEORA, mmioFOURCC('t', 'h', 'e', 'o'), 1},
1139 {NULL, 0, 0}
1142 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1143 int vid)
1145 struct MPOpts *opts = demuxer->opts;
1146 BITMAPINFOHEADER *bih;
1147 void *ImageDesc = NULL;
1148 sh_video_t *sh_v;
1150 if (track->ms_compat) { /* MS compatibility mode */
1151 BITMAPINFOHEADER *src;
1153 if (track->private_data == NULL
1154 || track->private_size < sizeof(BITMAPINFOHEADER))
1155 return 1;
1157 src = (BITMAPINFOHEADER *) track->private_data;
1158 bih = calloc(1, track->private_size);
1159 bih->biSize = le2me_32(src->biSize);
1160 bih->biWidth = le2me_32(src->biWidth);
1161 bih->biHeight = le2me_32(src->biHeight);
1162 bih->biPlanes = le2me_16(src->biPlanes);
1163 bih->biBitCount = le2me_16(src->biBitCount);
1164 bih->biCompression = le2me_32(src->biCompression);
1165 bih->biSizeImage = le2me_32(src->biSizeImage);
1166 bih->biXPelsPerMeter = le2me_32(src->biXPelsPerMeter);
1167 bih->biYPelsPerMeter = le2me_32(src->biYPelsPerMeter);
1168 bih->biClrUsed = le2me_32(src->biClrUsed);
1169 bih->biClrImportant = le2me_32(src->biClrImportant);
1170 memcpy((char *) bih + sizeof(BITMAPINFOHEADER),
1171 (char *) src + sizeof(BITMAPINFOHEADER),
1172 track->private_size - sizeof(BITMAPINFOHEADER));
1174 if (track->v_width == 0)
1175 track->v_width = bih->biWidth;
1176 if (track->v_height == 0)
1177 track->v_height = bih->biHeight;
1178 } else {
1179 bih = calloc(1, sizeof(BITMAPINFOHEADER));
1180 bih->biSize = sizeof(BITMAPINFOHEADER);
1181 bih->biWidth = track->v_width;
1182 bih->biHeight = track->v_height;
1183 bih->biBitCount = 24;
1184 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
1186 if (track->private_size >= RVPROPERTIES_SIZE
1187 && (!strcmp(track->codec_id, MKV_V_REALV10)
1188 || !strcmp(track->codec_id, MKV_V_REALV20)
1189 || !strcmp(track->codec_id, MKV_V_REALV30)
1190 || !strcmp(track->codec_id, MKV_V_REALV40))) {
1191 unsigned char *dst, *src;
1192 uint32_t type2;
1193 unsigned int cnt;
1195 src = (uint8_t *) track->private_data + RVPROPERTIES_SIZE;
1197 cnt = track->private_size - RVPROPERTIES_SIZE;
1198 bih = realloc(bih, sizeof(BITMAPINFOHEADER) + 8 + cnt);
1199 bih->biSize = 48 + cnt;
1200 bih->biPlanes = 1;
1201 type2 = AV_RB32(src - 4);
1202 if (type2 == 0x10003000 || type2 == 0x10003001)
1203 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
1204 else
1205 bih->biCompression =
1206 mmioFOURCC('R', 'V', track->codec_id[9], '0');
1207 dst = (unsigned char *) (bih + 1);
1208 // copy type1 and type2 info from rv properties
1209 memcpy(dst, src - 8, 8);
1210 stream_read(demuxer->stream, dst + 8, cnt);
1211 track->realmedia = 1;
1213 #ifdef CONFIG_QTX_CODECS
1214 } else if (track->private_size >= sizeof(ImageDescription)
1215 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) {
1216 ImageDescriptionPtr idesc;
1218 idesc = (ImageDescriptionPtr) track->private_data;
1219 idesc->idSize = be2me_32(idesc->idSize);
1220 idesc->cType = be2me_32(idesc->cType);
1221 idesc->version = be2me_16(idesc->version);
1222 idesc->revisionLevel = be2me_16(idesc->revisionLevel);
1223 idesc->vendor = be2me_32(idesc->vendor);
1224 idesc->temporalQuality = be2me_32(idesc->temporalQuality);
1225 idesc->spatialQuality = be2me_32(idesc->spatialQuality);
1226 idesc->width = be2me_16(idesc->width);
1227 idesc->height = be2me_16(idesc->height);
1228 idesc->hRes = be2me_32(idesc->hRes);
1229 idesc->vRes = be2me_32(idesc->vRes);
1230 idesc->dataSize = be2me_32(idesc->dataSize);
1231 idesc->frameCount = be2me_16(idesc->frameCount);
1232 idesc->depth = be2me_16(idesc->depth);
1233 idesc->clutID = be2me_16(idesc->clutID);
1234 bih->biPlanes = 1;
1235 bih->biCompression = idesc->cType;
1236 ImageDesc = idesc;
1237 #endif /* CONFIG_QTX_CODECS */
1239 } else {
1240 const videocodec_info_t *vi = vinfo;
1241 while (vi->id && strcmp(vi->id, track->codec_id))
1242 vi++;
1243 bih->biCompression = vi->fourcc;
1244 if (vi->extradata && track->private_data
1245 && (track->private_size > 0)) {
1246 bih->biSize += track->private_size;
1247 bih = realloc(bih, bih->biSize);
1248 memcpy(bih + 1, track->private_data, track->private_size);
1250 track->reorder_timecodes = opts->user_correct_pts == 0;
1251 if (!vi->id) {
1252 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported "
1253 "CodecID (%s) or missing/bad CodecPrivate\n"
1254 "[mkv] data (track %u).\n",
1255 track->codec_id, track->tnum);
1256 free(bih);
1257 return 1;
1262 sh_v = new_sh_video_vid(demuxer, track->tnum, vid);
1263 sh_v->bih = bih;
1264 sh_v->format = sh_v->bih->biCompression;
1265 if (track->v_frate == 0.0)
1266 track->v_frate = 25.0;
1267 sh_v->fps = track->v_frate;
1268 sh_v->frametime = 1 / track->v_frate;
1269 sh_v->aspect = 0;
1270 if (!track->realmedia) {
1271 sh_v->disp_w = track->v_width;
1272 sh_v->disp_h = track->v_height;
1273 if (track->v_dheight)
1274 sh_v->aspect = (double) track->v_dwidth / track->v_dheight;
1275 } else {
1276 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1277 // disp_w and disp_h from the RealVideo stream contents returned
1278 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1279 // the Matroska file then it has already been set to PixelWidth/Height
1280 // by check_track_information.
1281 sh_v->disp_w = track->v_dwidth;
1282 sh_v->disp_h = track->v_dheight;
1284 sh_v->ImageDesc = ImageDesc;
1285 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
1287 sh_v->ds = demuxer->video;
1288 return 0;
1291 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1292 int aid)
1294 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1295 sh_audio_t *sh_a = new_sh_audio_aid(demuxer, track->tnum, aid);
1296 if (!sh_a)
1297 return 1;
1298 mkv_d->audio_tracks[mkv_d->last_aid] = track->tnum;
1300 if (track->language && (strcmp(track->language, "und") != 0))
1301 sh_a->lang = strdup(track->language);
1302 sh_a->default_track = track->default_track;
1303 sh_a->ds = demuxer->audio;
1304 sh_a->wf = malloc(sizeof(WAVEFORMATEX));
1305 if (track->ms_compat && (track->private_size >= sizeof(WAVEFORMATEX))) {
1306 WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data;
1307 sh_a->wf = realloc(sh_a->wf, track->private_size);
1308 sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag);
1309 sh_a->wf->nChannels = le2me_16(wf->nChannels);
1310 sh_a->wf->nSamplesPerSec = le2me_32(wf->nSamplesPerSec);
1311 sh_a->wf->nAvgBytesPerSec = le2me_32(wf->nAvgBytesPerSec);
1312 sh_a->wf->nBlockAlign = le2me_16(wf->nBlockAlign);
1313 sh_a->wf->wBitsPerSample = le2me_16(wf->wBitsPerSample);
1314 sh_a->wf->cbSize = track->private_size - sizeof(WAVEFORMATEX);
1315 memcpy(sh_a->wf + 1, wf + 1,
1316 track->private_size - sizeof(WAVEFORMATEX));
1317 if (track->a_sfreq == 0.0)
1318 track->a_sfreq = sh_a->wf->nSamplesPerSec;
1319 if (track->a_channels == 0)
1320 track->a_channels = sh_a->wf->nChannels;
1321 if (track->a_bps == 0)
1322 track->a_bps = sh_a->wf->wBitsPerSample;
1323 track->a_formattag = sh_a->wf->wFormatTag;
1324 } else {
1325 memset(sh_a->wf, 0, sizeof(WAVEFORMATEX));
1326 if (!strcmp(track->codec_id, MKV_A_MP3)
1327 || !strcmp(track->codec_id, MKV_A_MP2))
1328 track->a_formattag = 0x0055;
1329 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
1330 track->a_formattag = 0x2000;
1331 else if (!strcmp(track->codec_id, MKV_A_DTS))
1332 track->a_formattag = 0x2001;
1333 else if (!strcmp(track->codec_id, MKV_A_PCM)
1334 || !strcmp(track->codec_id, MKV_A_PCM_BE))
1335 track->a_formattag = 0x0001;
1336 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN)
1337 || !strncmp(track->codec_id, MKV_A_AAC_2LC,
1338 strlen(MKV_A_AAC_2LC))
1339 || !strcmp(track->codec_id, MKV_A_AAC_2SSR)
1340 || !strcmp(track->codec_id, MKV_A_AAC_4MAIN)
1341 || !strncmp(track->codec_id, MKV_A_AAC_4LC,
1342 strlen(MKV_A_AAC_4LC))
1343 || !strcmp(track->codec_id, MKV_A_AAC_4SSR)
1344 || !strcmp(track->codec_id, MKV_A_AAC_4LTP)
1345 || !strcmp(track->codec_id, MKV_A_AAC))
1346 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
1347 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
1348 if (track->private_data == NULL)
1349 return 1;
1350 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's');
1351 } else if (!strcmp(track->codec_id, MKV_A_QDMC))
1352 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
1353 else if (!strcmp(track->codec_id, MKV_A_QDMC2))
1354 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
1355 else if (!strcmp(track->codec_id, MKV_A_WAVPACK))
1356 track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K');
1357 else if (!strcmp(track->codec_id, MKV_A_TRUEHD))
1358 track->a_formattag = mmioFOURCC('T', 'R', 'H', 'D');
1359 else if (!strcmp(track->codec_id, MKV_A_FLAC)) {
1360 if (track->private_data == NULL || track->private_size == 0) {
1361 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
1362 "[mkv] FLAC track does not contain valid headers.\n");
1363 return 1;
1365 track->a_formattag = mmioFOURCC('f', 'L', 'a', 'C');
1366 } else if (track->private_size >= RAPROPERTIES4_SIZE) {
1367 if (!strcmp(track->codec_id, MKV_A_REAL28))
1368 track->a_formattag = mmioFOURCC('2', '8', '_', '8');
1369 else if (!strcmp(track->codec_id, MKV_A_REALATRC))
1370 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
1371 else if (!strcmp(track->codec_id, MKV_A_REALCOOK))
1372 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
1373 else if (!strcmp(track->codec_id, MKV_A_REALDNET))
1374 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
1375 else if (!strcmp(track->codec_id, MKV_A_REALSIPR))
1376 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
1377 } else {
1378 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1379 "codec ID '%s' for track %u or missing/faulty\n[mkv] "
1380 "private codec data.\n", track->codec_id, track->tnum);
1381 free_sh_audio(demuxer, track->tnum);
1382 return 1;
1386 sh_a->format = track->a_formattag;
1387 sh_a->wf->wFormatTag = track->a_formattag;
1388 sh_a->channels = track->a_channels;
1389 sh_a->wf->nChannels = track->a_channels;
1390 sh_a->samplerate = (uint32_t) track->a_sfreq;
1391 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
1392 if (track->a_bps == 0) {
1393 sh_a->samplesize = 2;
1394 sh_a->wf->wBitsPerSample = 16;
1395 } else {
1396 sh_a->samplesize = track->a_bps / 8;
1397 sh_a->wf->wBitsPerSample = track->a_bps;
1399 if (track->a_formattag == 0x0055) { /* MP3 || MP2 */
1400 sh_a->wf->nAvgBytesPerSec = 16000;
1401 sh_a->wf->nBlockAlign = 1152;
1402 } else if ((track->a_formattag == 0x2000) /* AC3 */
1403 || (track->a_formattag == 0x2001)) { /* DTS */
1404 free(sh_a->wf);
1405 sh_a->wf = NULL;
1406 } else if (track->a_formattag == 0x0001) { /* PCM || PCM_BE */
1407 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
1408 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
1409 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
1410 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
1411 } else if (!strcmp(track->codec_id, MKV_A_QDMC)
1412 || !strcmp(track->codec_id, MKV_A_QDMC2)) {
1413 sh_a->wf->nAvgBytesPerSec = 16000;
1414 sh_a->wf->nBlockAlign = 1486;
1415 track->fix_i_bps = 1;
1416 track->qt_last_a_pts = 0.0;
1417 if (track->private_data != NULL) {
1418 sh_a->codecdata = malloc(track->private_size);
1419 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1420 sh_a->codecdata_len = track->private_size;
1422 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
1423 int profile, srate_idx;
1425 sh_a->wf->nAvgBytesPerSec = 16000;
1426 sh_a->wf->nBlockAlign = 1024;
1428 if (!strcmp(track->codec_id, MKV_A_AAC)
1429 && (NULL != track->private_data)) {
1430 sh_a->codecdata = malloc(track->private_size);
1431 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1432 sh_a->codecdata_len = track->private_size;
1433 return 0;
1436 /* Recreate the 'private data' */
1437 /* which faad2 uses in its initialization */
1438 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1439 if (!strncmp(&track->codec_id[12], "MAIN", 4))
1440 profile = 0;
1441 else if (!strncmp(&track->codec_id[12], "LC", 2))
1442 profile = 1;
1443 else if (!strncmp(&track->codec_id[12], "SSR", 3))
1444 profile = 2;
1445 else
1446 profile = 3;
1447 sh_a->codecdata = malloc(5);
1448 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xE) >> 1);
1449 sh_a->codecdata[1] =
1450 ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
1452 if (strstr(track->codec_id, "SBR") != NULL) {
1453 /* HE-AAC (aka SBR AAC) */
1454 sh_a->codecdata_len = 5;
1456 sh_a->samplerate *= 2;
1457 sh_a->wf->nSamplesPerSec *= 2;
1458 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1459 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
1460 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
1461 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
1462 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
1463 } else {
1464 sh_a->codecdata_len = 2;
1465 track->default_duration = 1024.0 / sh_a->samplerate;
1467 } else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) { /* VORBIS */
1468 sh_a->wf->cbSize = track->private_size;
1469 sh_a->wf = realloc(sh_a->wf, sizeof(WAVEFORMATEX) + sh_a->wf->cbSize);
1470 memcpy((unsigned char *) (sh_a->wf + 1), track->private_data,
1471 sh_a->wf->cbSize);
1472 } else if (track->private_size >= RAPROPERTIES4_SIZE
1473 && !strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
1474 /* Common initialization for all RealAudio codecs */
1475 unsigned char *src = track->private_data;
1476 int codecdata_length, version;
1477 int flavor;
1479 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
1481 version = AV_RB16(src + 4);
1482 flavor = AV_RB16(src + 22);
1483 track->coded_framesize = AV_RB32(src + 24);
1484 track->sub_packet_h = AV_RB16(src + 40);
1485 sh_a->wf->nBlockAlign = track->audiopk_size = AV_RB16(src + 42);
1486 track->sub_packet_size = AV_RB16(src + 44);
1487 if (version == 4) {
1488 src += RAPROPERTIES4_SIZE;
1489 src += src[0] + 1;
1490 src += src[0] + 1;
1491 } else
1492 src += RAPROPERTIES5_SIZE;
1494 src += 3;
1495 if (version == 5)
1496 src++;
1497 codecdata_length = AV_RB32(src);
1498 src += 4;
1499 sh_a->wf->cbSize = codecdata_length;
1500 sh_a->wf = realloc(sh_a->wf, sizeof(WAVEFORMATEX) + sh_a->wf->cbSize);
1501 memcpy(((char *) (sh_a->wf + 1)), src, codecdata_length);
1503 switch (track->a_formattag) {
1504 case mmioFOURCC('a', 't', 'r', 'c'):
1505 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[flavor];
1506 sh_a->wf->nBlockAlign = track->sub_packet_size;
1507 track->audio_buf =
1508 malloc(track->sub_packet_h * track->audiopk_size);
1509 track->audio_timestamp =
1510 malloc(track->sub_packet_h * sizeof(double));
1511 break;
1512 case mmioFOURCC('c', 'o', 'o', 'k'):
1513 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[flavor];
1514 sh_a->wf->nBlockAlign = track->sub_packet_size;
1515 track->audio_buf =
1516 malloc(track->sub_packet_h * track->audiopk_size);
1517 track->audio_timestamp =
1518 malloc(track->sub_packet_h * sizeof(double));
1519 break;
1520 case mmioFOURCC('s', 'i', 'p', 'r'):
1521 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[flavor];
1522 sh_a->wf->nBlockAlign = track->coded_framesize;
1523 track->audio_buf =
1524 malloc(track->sub_packet_h * track->audiopk_size);
1525 track->audio_timestamp =
1526 malloc(track->sub_packet_h * sizeof(double));
1527 break;
1528 case mmioFOURCC('2', '8', '_', '8'):
1529 sh_a->wf->nAvgBytesPerSec = 3600;
1530 sh_a->wf->nBlockAlign = track->coded_framesize;
1531 track->audio_buf =
1532 malloc(track->sub_packet_h * track->audiopk_size);
1533 track->audio_timestamp =
1534 malloc(track->sub_packet_h * sizeof(double));
1535 break;
1538 track->realmedia = 1;
1539 } else if (!strcmp(track->codec_id, MKV_A_FLAC)
1540 || (track->a_formattag == 0xf1ac)) {
1541 unsigned char *ptr;
1542 int size;
1543 free(sh_a->wf);
1544 sh_a->wf = NULL;
1546 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) {
1547 ptr = track->private_data;
1548 size = track->private_size;
1549 } else {
1550 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
1551 ptr = track->private_data + sizeof(WAVEFORMATEX);
1552 size = track->private_size - sizeof(WAVEFORMATEX);
1554 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
1555 || ptr[3] != 'C') {
1556 sh_a->codecdata = malloc(4);
1557 sh_a->codecdata_len = 4;
1558 memcpy(sh_a->codecdata, "fLaC", 4);
1559 } else {
1560 sh_a->codecdata = malloc(size);
1561 sh_a->codecdata_len = size;
1562 memcpy(sh_a->codecdata, ptr, size);
1564 } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */
1565 } else if (!track->ms_compat
1566 || (track->private_size < sizeof(WAVEFORMATEX))) {
1567 free_sh_audio(demuxer, track->tnum);
1568 return 1;
1571 return 0;
1574 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1575 int sid)
1577 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) {
1578 int size;
1579 uint8_t *buffer;
1580 sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
1581 track->sh_sub = sh;
1582 sh->type = 't';
1583 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
1584 sh->type = 'v';
1585 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
1586 sh->type = 'a';
1587 size = track->private_size;
1588 demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
1589 if (buffer && buffer != track->private_data) {
1590 free(track->private_data);
1591 track->private_data = buffer;
1592 track->private_size = size;
1594 sh->extradata = malloc(track->private_size);
1595 memcpy(sh->extradata, track->private_data, track->private_size);
1596 sh->extradata_len = track->private_size;
1597 if (track->language && (strcmp(track->language, "und") != 0))
1598 sh->lang = strdup(track->language);
1599 sh->default_track = track->default_track;
1600 } else {
1601 mp_tmsg(MSGT_DEMUX, MSGL_ERR,
1602 "[mkv] Subtitle type '%s' is not supported.\n",
1603 track->codec_id);
1604 return 1;
1607 return 0;
1610 static int demux_mkv_open(demuxer_t *demuxer)
1612 stream_t *s = demuxer->stream;
1613 mkv_demuxer_t *mkv_d;
1614 mkv_track_t *track;
1615 int i, cont = 0;
1617 stream_seek(s, s->start_pos);
1618 if (ebml_read_id(s, NULL) != EBML_ID_EBML)
1619 return 0;
1620 struct ebml_ebml ebml_master = {};
1621 struct ebml_parse_ctx parse_ctx = { .no_error_messages = true };
1622 if (ebml_read_element(s, &parse_ctx, &ebml_master, &ebml_ebml_desc) < 0)
1623 return 0;
1624 if (ebml_master.doc_type.len != 8 || strncmp(ebml_master.doc_type.start,
1625 "matroska", 8)) {
1626 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] no head found\n");
1627 talloc_free(parse_ctx.talloc_ctx);
1628 return 0;
1630 if (ebml_master.doc_type_read_version > 2) {
1631 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1632 "but we don't support format version %"PRIu64"\n",
1633 ebml_master.doc_type_read_version);
1634 talloc_free(parse_ctx.talloc_ctx);
1635 return 0;
1637 if ((ebml_master.n_ebml_read_version
1638 && ebml_master.ebml_read_version != EBML_VERSION)
1639 || (ebml_master.n_ebml_max_size_length
1640 && ebml_master.ebml_max_size_length > 8)
1641 || (ebml_master.n_ebml_max_id_length
1642 && ebml_master.ebml_max_id_length != 4)) {
1643 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1644 "but the header has bad parameters\n");
1645 talloc_free(parse_ctx.talloc_ctx);
1646 return 0;
1648 talloc_free(parse_ctx.talloc_ctx);
1650 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
1652 if (ebml_read_id(s, NULL) != MATROSKA_ID_SEGMENT) {
1653 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
1654 return 0;
1656 ebml_read_length(s, NULL); /* return bytes number until EOF */
1658 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
1660 mkv_d = talloc_zero(demuxer, struct mkv_demuxer);
1661 demuxer->priv = mkv_d;
1662 mkv_d->tc_scale = 1000000;
1663 mkv_d->segment_start = stream_tell(s);
1665 while (!cont) {
1666 uint32_t id = ebml_read_id(s, NULL);
1667 switch (id) {
1668 case MATROSKA_ID_CLUSTER:
1669 mp_msg(MSGT_DEMUX, MSGL_V,
1670 "[mkv] |+ found cluster, headers are "
1671 "parsed completely :)\n");
1672 stream_seek(s, stream_tell(s) - 4);
1673 cont = 1;
1674 break;
1676 default:
1677 cont = read_header_element(demuxer, id, 0) < 1;
1678 break;
1679 case EBML_ID_VOID:
1680 ebml_read_skip(s, NULL);
1681 break;
1685 display_create_tracks(demuxer);
1687 /* select video track */
1688 track = NULL;
1689 if (demuxer->video->id == -1) { /* automatically select a video track */
1690 /* search for a video track that has the 'default' flag set */
1691 for (i = 0; i < mkv_d->num_tracks; i++)
1692 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1693 && mkv_d->tracks[i]->default_track) {
1694 track = mkv_d->tracks[i];
1695 break;
1698 if (track == NULL)
1699 /* no track has the 'default' flag set */
1700 /* let's take the first video track */
1701 for (i = 0; i < mkv_d->num_tracks; i++)
1702 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO) {
1703 track = mkv_d->tracks[i];
1704 break;
1706 } else if (demuxer->video->id != -2) /* -2 = no video at all */
1707 track =
1708 demux_mkv_find_track_by_num(mkv_d, demuxer->video->id,
1709 MATROSKA_TRACK_VIDEO);
1711 if (track && demuxer->v_streams[track->tnum]) {
1712 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u.\n",
1713 track->tnum);
1714 demuxer->video->id = track->tnum;
1715 demuxer->video->sh = demuxer->v_streams[track->tnum];
1716 } else {
1717 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
1718 demuxer->video->id = -2;
1721 /* select audio track */
1722 track = NULL;
1723 if (track == NULL)
1724 /* search for an audio track that has the 'default' flag set */
1725 for (i = 0; i < mkv_d->num_tracks; i++)
1726 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1727 && mkv_d->tracks[i]->default_track) {
1728 track = mkv_d->tracks[i];
1729 break;
1732 if (track == NULL)
1733 /* no track has the 'default' flag set */
1734 /* let's take the first audio track */
1735 for (i = 0; i < mkv_d->num_tracks; i++)
1736 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO) {
1737 track = mkv_d->tracks[i];
1738 break;
1741 if (track && demuxer->a_streams[track->tnum]) {
1742 demuxer->audio->id = track->tnum;
1743 demuxer->audio->sh = demuxer->a_streams[track->tnum];
1744 } else {
1745 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
1746 demuxer->audio->id = -2;
1750 if (demuxer->audio->id != -2)
1751 for (i = 0; i < mkv_d->num_tracks; i++) {
1752 if (mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO)
1753 continue;
1754 if (demuxer->a_streams[track->tnum]) {
1755 mkv_d->last_aid++;
1756 if (mkv_d->last_aid == MAX_A_STREAMS)
1757 break;
1761 if (s->end_pos == 0 || (mkv_d->indexes == NULL && index_mode < 0))
1762 demuxer->seekable = 0;
1763 else {
1764 demuxer->movi_start = s->start_pos;
1765 demuxer->movi_end = s->end_pos;
1766 demuxer->seekable = 1;
1769 demuxer->accurate_seek = true;
1771 return DEMUXER_TYPE_MATROSKA;
1774 static void demux_close_mkv(demuxer_t *demuxer)
1776 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1778 if (mkv_d) {
1779 int i;
1780 free_cached_dps(demuxer);
1781 if (mkv_d->tracks) {
1782 for (i = 0; i < mkv_d->num_tracks; i++)
1783 demux_mkv_free_trackentry(mkv_d->tracks[i]);
1785 free(mkv_d->indexes);
1786 free(mkv_d->cluster_positions);
1790 static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
1791 uint8_t *laces,
1792 uint32_t **all_lace_sizes)
1794 uint32_t total = 0, *lace_size;
1795 uint8_t flags;
1796 int i;
1798 *all_lace_sizes = NULL;
1799 lace_size = NULL;
1800 /* lacing flags */
1801 flags = *buffer++;
1802 (*size)--;
1804 switch ((flags & 0x06) >> 1) {
1805 case 0: /* no lacing */
1806 *laces = 1;
1807 lace_size = calloc(*laces, sizeof(uint32_t));
1808 lace_size[0] = *size;
1809 break;
1811 case 1: /* xiph lacing */
1812 case 2: /* fixed-size lacing */
1813 case 3: /* EBML lacing */
1814 *laces = *buffer++;
1815 (*size)--;
1816 (*laces)++;
1817 lace_size = calloc(*laces, sizeof(uint32_t));
1819 switch ((flags & 0x06) >> 1) {
1820 case 1: /* xiph lacing */
1821 for (i = 0; i < *laces - 1; i++) {
1822 lace_size[i] = 0;
1823 do {
1824 lace_size[i] += *buffer;
1825 (*size)--;
1826 } while (*buffer++ == 0xFF);
1827 total += lace_size[i];
1829 lace_size[i] = *size - total;
1830 break;
1832 case 2: /* fixed-size lacing */
1833 for (i = 0; i < *laces; i++)
1834 lace_size[i] = *size / *laces;
1835 break;
1837 case 3:; /* EBML lacing */
1838 int l;
1839 uint64_t num = ebml_read_vlen_uint(buffer, &l);
1840 if (num == EBML_UINT_INVALID) {
1841 free(lace_size);
1842 return 1;
1844 buffer += l;
1845 *size -= l;
1847 total = lace_size[0] = num;
1848 for (i = 1; i < *laces - 1; i++) {
1849 int64_t snum;
1850 snum = ebml_read_vlen_int(buffer, &l);
1851 if (snum == EBML_INT_INVALID) {
1852 free(lace_size);
1853 return 1;
1855 buffer += l;
1856 *size -= l;
1857 lace_size[i] = lace_size[i - 1] + snum;
1858 total += lace_size[i];
1860 lace_size[i] = *size - total;
1861 break;
1863 break;
1865 *all_lace_sizes = lace_size;
1866 return 0;
1869 static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track,
1870 char *block, int64_t size,
1871 uint64_t block_duration, uint64_t timecode)
1873 demux_packet_t *dp;
1875 if (block_duration == 0) {
1876 mp_msg(MSGT_DEMUX, MSGL_WARN,
1877 "[mkv] Warning: No BlockDuration for subtitle track found.\n");
1878 return;
1881 sub_utf8 = 1;
1882 dp = new_demux_packet(size);
1883 memcpy(dp->buffer, block, size);
1884 dp->pts = timecode / 1000.0;
1885 dp->endpts = (timecode + block_duration) / 1000.0;
1886 ds_add_packet(demuxer->sub, dp);
1889 double real_fix_timestamp(unsigned char *buf, unsigned int timestamp,
1890 unsigned int format, int64_t *kf_base, int *kf_pts,
1891 double *pts);
1893 static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
1894 uint8_t *buffer, uint32_t size, int block_bref)
1896 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1897 demux_packet_t *dp;
1898 uint32_t timestamp = mkv_d->last_pts * 1000;
1900 dp = new_demux_packet(size);
1901 memcpy(dp->buffer, buffer, size);
1903 if (mkv_d->v_skip_to_keyframe) {
1904 dp->pts = mkv_d->last_pts;
1905 track->rv_kf_base = 0;
1906 track->rv_kf_pts = timestamp;
1907 } else
1908 dp->pts =
1909 real_fix_timestamp(dp->buffer, timestamp,
1910 ((sh_video_t *) demuxer->video->sh)->bih->
1911 biCompression, &track->rv_kf_base,
1912 &track->rv_kf_pts, NULL);
1913 dp->pos = demuxer->filepos;
1914 dp->flags = block_bref ? 0 : 0x10;
1916 ds_add_packet(demuxer->video, dp);
1919 static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
1920 uint8_t *buffer, uint32_t size, int block_bref)
1922 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1923 int sps = track->sub_packet_size;
1924 int sph = track->sub_packet_h;
1925 int cfs = track->coded_framesize;
1926 int w = track->audiopk_size;
1927 int spc = track->sub_packet_cnt;
1928 demux_packet_t *dp;
1929 int x;
1931 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8'))
1932 || (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k'))
1933 || (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c'))
1934 || (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) {
1935 // if(!block_bref)
1936 // spc = track->sub_packet_cnt = 0;
1937 switch (track->a_formattag) {
1938 case mmioFOURCC('2', '8', '_', '8'):
1939 for (x = 0; x < sph / 2; x++)
1940 memcpy(track->audio_buf + x * 2 * w + spc * cfs,
1941 buffer + cfs * x, cfs);
1942 break;
1943 case mmioFOURCC('c', 'o', 'o', 'k'):
1944 case mmioFOURCC('a', 't', 'r', 'c'):
1945 for (x = 0; x < w / sps; x++)
1946 memcpy(track->audio_buf +
1947 sps * (sph * x + ((sph + 1) / 2) * (spc & 1) +
1948 (spc >> 1)), buffer + sps * x, sps);
1949 break;
1950 case mmioFOURCC('s', 'i', 'p', 'r'):
1951 memcpy(track->audio_buf + spc * w, buffer, w);
1952 if (spc == sph - 1) {
1953 int n;
1954 int bs = sph * w * 2 / 96; // nibbles per subpacket
1955 // Perform reordering
1956 for (n = 0; n < 38; n++) {
1957 int j;
1958 int i = bs * sipr_swaps[n][0];
1959 int o = bs * sipr_swaps[n][1];
1960 // swap nibbles of block 'i' with 'o' TODO: optimize
1961 for (j = 0; j < bs; j++) {
1962 int x = (i & 1) ?
1963 (track->audio_buf[i >> 1] >> 4) :
1964 (track->audio_buf[i >> 1] & 0x0F);
1965 int y = (o & 1) ?
1966 (track->audio_buf[o >> 1] >> 4) :
1967 (track->audio_buf[o >> 1] & 0x0F);
1968 if (o & 1)
1969 track->audio_buf[o >> 1] =
1970 (track->audio_buf[o >> 1] & 0x0F) | (x << 4);
1971 else
1972 track->audio_buf[o >> 1] =
1973 (track->audio_buf[o >> 1] & 0xF0) | x;
1974 if (i & 1)
1975 track->audio_buf[i >> 1] =
1976 (track->audio_buf[i >> 1] & 0x0F) | (y << 4);
1977 else
1978 track->audio_buf[i >> 1] =
1979 (track->audio_buf[i >> 1] & 0xF0) | y;
1980 ++i;
1981 ++o;
1985 break;
1987 track->audio_timestamp[track->sub_packet_cnt] =
1988 (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
1989 track->ra_pts = mkv_d->last_pts;
1990 if (track->sub_packet_cnt == 0)
1991 track->audio_filepos = demuxer->filepos;
1992 if (++(track->sub_packet_cnt) == sph) {
1993 int apk_usize =
1994 ((WAVEFORMATEX *) ((sh_audio_t *) demuxer->audio->sh)->wf)->
1995 nBlockAlign;
1996 track->sub_packet_cnt = 0;
1997 // Release all the audio packets
1998 for (x = 0; x < sph * w / apk_usize; x++) {
1999 dp = new_demux_packet(apk_usize);
2000 memcpy(dp->buffer, track->audio_buf + x * apk_usize,
2001 apk_usize);
2002 /* Put timestamp only on packets that correspond to original
2003 * audio packets in file */
2004 dp->pts = (x * apk_usize % w) ? 0 :
2005 track->audio_timestamp[x * apk_usize / w];
2006 dp->pos = track->audio_filepos; // all equal
2007 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
2008 ds_add_packet(demuxer->audio, dp);
2011 } else { // Not a codec that require reordering
2012 dp = new_demux_packet(size);
2013 memcpy(dp->buffer, buffer, size);
2014 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
2015 dp->pts = 0;
2016 else
2017 dp->pts = mkv_d->last_pts;
2018 track->ra_pts = mkv_d->last_pts;
2020 dp->pos = demuxer->filepos;
2021 dp->flags = block_bref ? 0 : 0x10;
2022 ds_add_packet(demuxer->audio, dp);
2026 /** Reorder timecodes and add cached demux packets to the queues.
2028 * Timecode reordering is needed if a video track contains B frames that
2029 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2030 * MPlayer doesn't like timestamps in display order. This function adjusts
2031 * the timestamp of cached frames (which are exactly one I/P frame followed
2032 * by one or more B frames) so that they are in coding order again.
2034 * Example: The track with 25 FPS contains four frames with the timecodes
2035 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2036 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2037 * B at 80ms and B at 120ms.
2039 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2041 * \param demuxer The Matroska demuxer struct for this instance.
2042 * \param track The track structure whose cache should be handled.
2044 static void flush_cached_dps(demuxer_t *demuxer, mkv_track_t *track)
2046 int i, ok;
2048 if (track->num_cached_dps == 0)
2049 return;
2051 do {
2052 ok = 1;
2053 for (i = 1; i < track->num_cached_dps; i++)
2054 if (track->cached_dps[i - 1]->pts > track->cached_dps[i]->pts) {
2055 double tmp_pts = track->cached_dps[i - 1]->pts;
2056 track->cached_dps[i - 1]->pts = track->cached_dps[i]->pts;
2057 track->cached_dps[i]->pts = tmp_pts;
2058 ok = 0;
2060 } while (!ok);
2062 for (i = 0; i < track->num_cached_dps; i++)
2063 ds_add_packet(demuxer->video, track->cached_dps[i]);
2064 track->num_cached_dps = 0;
2067 /** Cache video frames if timecodes have to be reordered.
2069 * Timecode reordering is needed if a video track contains B frames that
2070 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2071 * This function takes in a Matroska block read from the file, allocates a
2072 * demux packet for it, fills in its values, allocates space for storing
2073 * pointers to the cached demux packets and adds the packet to it. If
2074 * the packet contains an I or a P frame then ::flush_cached_dps is called
2075 * in order to send the old cached frames downstream.
2077 * \param demuxer The Matroska demuxer struct for this instance.
2078 * \param track The packet is meant for this track.
2079 * \param buffer The actual frame contents.
2080 * \param size The frame size in bytes.
2081 * \param block_bref A relative timecode (backward reference). If it is \c 0
2082 * then the frame is an I frame.
2083 * \param block_fref A relative timecode (forward reference). If it is \c 0
2084 * then the frame is either an I frame or a P frame depending on the value
2085 * of \a block_bref. Otherwise it's a B frame.
2087 static void handle_video_bframes(demuxer_t *demuxer, mkv_track_t *track,
2088 uint8_t *buffer, uint32_t size,
2089 int block_bref, int block_fref)
2091 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2092 demux_packet_t *dp;
2094 dp = new_demux_packet(size);
2095 memcpy(dp->buffer, buffer, size);
2096 dp->pos = demuxer->filepos;
2097 dp->pts = mkv_d->last_pts;
2098 if ((track->num_cached_dps > 0) && (dp->pts < track->max_pts))
2099 block_fref = 1;
2100 if (block_fref == 0) /* I or P frame */
2101 flush_cached_dps(demuxer, track);
2102 if (block_bref != 0) /* I frame, don't cache it */
2103 dp->flags = 0x10;
2104 if ((track->num_cached_dps + 1) > track->num_allocated_dps) {
2105 track->cached_dps = (demux_packet_t **)
2106 realloc(track->cached_dps,
2107 (track->num_cached_dps + 10) * sizeof(demux_packet_t *));
2108 track->num_allocated_dps += 10;
2110 track->cached_dps[track->num_cached_dps] = dp;
2111 track->num_cached_dps++;
2112 if (dp->pts > track->max_pts)
2113 track->max_pts = dp->pts;
2116 static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
2117 uint64_t block_duration, int64_t block_bref,
2118 int64_t block_fref, uint8_t simpleblock)
2120 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2121 mkv_track_t *track = NULL;
2122 demux_stream_t *ds = NULL;
2123 uint64_t old_length;
2124 int64_t tc;
2125 uint32_t *lace_size;
2126 uint8_t laces, flags;
2127 int i, num, tmp, use_this_block = 1;
2128 double current_pts;
2129 int16_t time;
2131 /* first byte(s): track num */
2132 num = ebml_read_vlen_uint(block, &tmp);
2133 block += tmp;
2134 /* time (relative to cluster time) */
2135 time = block[0] << 8 | block[1];
2136 block += 2;
2137 length -= tmp + 2;
2138 old_length = length;
2139 flags = block[0];
2140 if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
2141 return 0;
2142 block += old_length - length;
2144 tc = (time * mkv_d->tc_scale + mkv_d->cluster_tc) / 1000000.0 + 0.5;
2145 if (tc < 0)
2146 tc = 0;
2147 current_pts = tc / 1000.0;
2149 for (i = 0; i < mkv_d->num_tracks; i++)
2150 if (mkv_d->tracks[i]->tnum == num) {
2151 track = mkv_d->tracks[i];
2152 break;
2154 if (track == NULL) {
2155 free(lace_size);
2156 return 1;
2158 if (num == demuxer->audio->id) {
2159 ds = demuxer->audio;
2161 if (mkv_d->a_skip_to_keyframe) {
2162 if (simpleblock) {
2163 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2164 use_this_block = 0;
2165 } else if (block_bref != 0)
2166 use_this_block = 0;
2167 } else if (mkv_d->v_skip_to_keyframe)
2168 use_this_block = 0;
2170 if (track->fix_i_bps && use_this_block) {
2171 sh_audio_t *sh = (sh_audio_t *) ds->sh;
2173 if (block_duration != 0) {
2174 sh->i_bps = length * 1000 / block_duration;
2175 track->fix_i_bps = 0;
2176 } else if (track->qt_last_a_pts == 0.0)
2177 track->qt_last_a_pts = current_pts;
2178 else if (track->qt_last_a_pts != current_pts) {
2179 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
2180 track->fix_i_bps = 0;
2183 } else if (tc < mkv_d->skip_to_timecode)
2184 use_this_block = 0;
2185 else if (num == demuxer->video->id) {
2186 ds = demuxer->video;
2187 if (mkv_d->v_skip_to_keyframe) {
2188 if (simpleblock) {
2189 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2190 use_this_block = 0;
2191 } else if (block_bref != 0 || block_fref != 0)
2192 use_this_block = 0;
2194 } else if (num == demuxer->sub->id) {
2195 ds = demuxer->sub;
2196 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) {
2197 uint8_t *buffer;
2198 int size = length;
2199 demux_mkv_decode(track, block, &buffer, &size, 1);
2200 handle_subtitles(demuxer, track, buffer, size, block_duration, tc);
2201 if (buffer != block)
2202 free(buffer);
2203 use_this_block = 0;
2205 } else
2206 use_this_block = 0;
2208 if (use_this_block) {
2209 mkv_d->last_pts = current_pts;
2210 mkv_d->last_filepos = demuxer->filepos;
2212 for (i = 0; i < laces; i++) {
2213 if (ds == demuxer->video && track->realmedia)
2214 handle_realvideo(demuxer, track, block, lace_size[i],
2215 block_bref);
2216 else if (ds == demuxer->audio && track->realmedia)
2217 handle_realaudio(demuxer, track, block, lace_size[i],
2218 block_bref);
2219 else if (ds == demuxer->video && track->reorder_timecodes)
2220 handle_video_bframes(demuxer, track, block, lace_size[i],
2221 block_bref, block_fref);
2222 else {
2223 int size = lace_size[i];
2224 demux_packet_t *dp;
2225 uint8_t *buffer;
2226 demux_mkv_decode(track, block, &buffer, &size, 1);
2227 if (buffer) {
2228 dp = new_demux_packet(size);
2229 memcpy(dp->buffer, buffer, size);
2230 if (buffer != block)
2231 free(buffer);
2232 dp->flags = (block_bref == 0
2233 && block_fref == 0) ? 0x10 : 0;
2234 /* If default_duration is 0, assume no pts value is known
2235 * for packets after the first one (rather than all pts
2236 * values being the same) */
2237 if (i == 0 || track->default_duration)
2238 dp->pts =
2239 mkv_d->last_pts + i * track->default_duration;
2240 ds_add_packet(ds, dp);
2243 block += lace_size[i];
2246 if (ds == demuxer->video) {
2247 mkv_d->v_skip_to_keyframe = 0;
2248 mkv_d->skip_to_timecode = 0;
2249 } else if (ds == demuxer->audio)
2250 mkv_d->a_skip_to_keyframe = 0;
2252 free(lace_size);
2253 return 1;
2256 free(lace_size);
2257 return 0;
2260 static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
2262 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2263 stream_t *s = demuxer->stream;
2264 uint64_t l;
2265 int il, tmp;
2267 while (1) {
2268 while (mkv_d->cluster_size > 0) {
2269 uint64_t block_duration = 0, block_length = 0;
2270 int64_t block_bref = 0, block_fref = 0;
2271 uint8_t *block = NULL;
2273 while (mkv_d->blockgroup_size > 0) {
2274 switch (ebml_read_id(s, &il)) {
2275 case MATROSKA_ID_BLOCKDURATION:
2276 block_duration = ebml_read_uint(s, &l);
2277 if (block_duration == EBML_UINT_INVALID) {
2278 free(block);
2279 return 0;
2281 block_duration =
2282 block_duration * mkv_d->tc_scale / 1000000.0 + 0.5;
2283 break;
2285 case MATROSKA_ID_BLOCK:
2286 block_length = ebml_read_length(s, &tmp);
2287 free(block);
2288 if (block_length > SIZE_MAX - AV_LZO_INPUT_PADDING)
2289 return 0;
2290 block = malloc(block_length + AV_LZO_INPUT_PADDING);
2291 demuxer->filepos = stream_tell(s);
2292 if (stream_read(s, block, block_length) !=
2293 (int) block_length) {
2294 free(block);
2295 return 0;
2297 l = tmp + block_length;
2298 break;
2300 case MATROSKA_ID_REFERENCEBLOCK:;
2301 int64_t num = ebml_read_int(s, &l);
2302 if (num == EBML_INT_INVALID) {
2303 free(block);
2304 return 0;
2306 if (num <= 0)
2307 block_bref = num;
2308 else
2309 block_fref = num;
2310 break;
2312 case EBML_ID_INVALID:
2313 free(block);
2314 return 0;
2316 default:
2317 ebml_read_skip(s, &l);
2318 break;
2320 mkv_d->blockgroup_size -= l + il;
2321 mkv_d->cluster_size -= l + il;
2324 if (block) {
2325 int res = handle_block(demuxer, block, block_length,
2326 block_duration, block_bref, block_fref,
2328 free(block);
2329 if (res < 0)
2330 return 0;
2331 if (res)
2332 return 1;
2335 if (mkv_d->cluster_size > 0) {
2336 switch (ebml_read_id(s, &il)) {
2337 case MATROSKA_ID_TIMECODE:;
2338 uint64_t num = ebml_read_uint(s, &l);
2339 if (num == EBML_UINT_INVALID)
2340 return 0;
2341 mkv_d->cluster_tc = num * mkv_d->tc_scale;
2342 add_cluster_position(mkv_d, mkv_d->cluster_start,
2343 mkv_d->cluster_tc);
2344 break;
2346 case MATROSKA_ID_BLOCKGROUP:
2347 mkv_d->blockgroup_size = ebml_read_length(s, &tmp);
2348 l = tmp;
2349 break;
2351 case MATROSKA_ID_SIMPLEBLOCK:;
2352 int res;
2353 block_length = ebml_read_length(s, &tmp);
2354 block = malloc(block_length);
2355 demuxer->filepos = stream_tell(s);
2356 if (stream_read(s, block, block_length) !=
2357 (int) block_length) {
2358 free(block);
2359 return 0;
2361 l = tmp + block_length;
2362 res = handle_block(demuxer, block, block_length,
2363 block_duration, block_bref,
2364 block_fref, 1);
2365 free(block);
2366 mkv_d->cluster_size -= l + il;
2367 if (res < 0)
2368 return 0;
2369 else if (res)
2370 return 1;
2371 else
2372 mkv_d->cluster_size += l + il;
2373 break;
2375 case EBML_ID_INVALID:
2376 return 0;
2378 default:
2379 ebml_read_skip(s, &l);
2380 break;
2382 mkv_d->cluster_size -= l + il;
2386 while (ebml_read_id(s, &il) != MATROSKA_ID_CLUSTER) {
2387 ebml_read_skip(s, NULL);
2388 if (s->eof)
2389 return 0;
2391 mkv_d->cluster_start = stream_tell(s) - il;
2392 mkv_d->cluster_size = ebml_read_length(s, NULL);
2395 return 0;
2398 static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
2399 float audio_delay, int flags)
2401 if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
2402 if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
2403 flags |= SEEK_BACKWARD;
2404 else
2405 flags |= SEEK_FORWARD;
2407 // Adjust the target a little bit to catch cases where the target position
2408 // specifies a keyframe with high, but not perfect, precision.
2409 rel_seek_secs += flags & SEEK_FORWARD ? -0.005 : 0.005;
2411 free_cached_dps(demuxer);
2412 if (!(flags & SEEK_FACTOR)) { /* time in secs */
2413 mkv_index_t *index = NULL;
2414 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2415 stream_t *s = demuxer->stream;
2416 int64_t target_timecode = 0, diff, min_diff = 0xFFFFFFFFFFFFFFFLL;
2417 int i;
2419 if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
2420 target_timecode = (int64_t) (mkv_d->last_pts * 1000.0);
2421 target_timecode += (int64_t) (rel_seek_secs * 1000.0);
2422 if (target_timecode < 0)
2423 target_timecode = 0;
2425 if (mkv_d->indexes == NULL) { /* no index was found */
2426 int64_t target_tc_ns = (int64_t) (rel_seek_secs * 1e9);
2427 if (target_tc_ns < 0)
2428 target_tc_ns = 0;
2429 uint64_t max_filepos = 0;
2430 int64_t max_tc = -1;
2431 int n = mkv_d->num_cluster_pos;
2432 if (n > 0) {
2433 max_filepos = mkv_d->cluster_positions[n - 1].filepos;
2434 max_tc = mkv_d->cluster_positions[n - 1].timecode;
2437 if (target_tc_ns > max_tc) {
2438 if ((off_t) max_filepos > stream_tell(s))
2439 stream_seek(s, max_filepos);
2440 else
2441 stream_seek(s, stream_tell(s) + mkv_d->cluster_size);
2442 /* parse all the clusters upto target_filepos */
2443 while (!s->eof) {
2444 uint64_t start = stream_tell(s);
2445 uint32_t type = ebml_read_id(s, NULL);
2446 uint64_t len = ebml_read_length(s, NULL);
2447 uint64_t end = stream_tell(s) + len;
2448 if (type == MATROSKA_ID_CLUSTER) {
2449 while (!s->eof && stream_tell(s) < end) {
2450 if (ebml_read_id(s, NULL)
2451 == MATROSKA_ID_TIMECODE) {
2452 uint64_t tc = ebml_read_uint(s, NULL);
2453 tc *= mkv_d->tc_scale;
2454 add_cluster_position(mkv_d, start, tc);
2455 if (tc >= target_tc_ns)
2456 goto enough_index;
2457 break;
2461 stream_seek(s, end);
2463 enough_index:
2464 if (s->eof)
2465 stream_reset(s);
2467 if (!mkv_d->num_cluster_pos) {
2468 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] no target for seek found\n");
2469 return;
2471 uint64_t cluster_pos = mkv_d->cluster_positions[0].filepos;
2472 /* Let's find the nearest cluster */
2473 for (i = 0; i < mkv_d->num_cluster_pos; i++) {
2474 diff = mkv_d->cluster_positions[i].timecode - target_tc_ns;
2475 if (flags & SEEK_BACKWARD && diff < 0 && -diff < min_diff) {
2476 cluster_pos = mkv_d->cluster_positions[i].filepos;
2477 min_diff = -diff;
2478 } else if (flags & SEEK_FORWARD
2479 && (diff < 0 ? -1 * diff : diff) < min_diff) {
2480 cluster_pos = mkv_d->cluster_positions[i].filepos;
2481 min_diff = diff < 0 ? -1 * diff : diff;
2484 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2485 stream_seek(s, cluster_pos);
2486 } else {
2487 int seek_id = (demuxer->video->id < 0) ?
2488 demuxer->audio->id : demuxer->video->id;
2490 /* let's find the entry in the indexes with the smallest */
2491 /* difference to the wanted timecode. */
2492 for (i = 0; i < mkv_d->num_indexes; i++)
2493 if (mkv_d->indexes[i].tnum == seek_id) {
2494 diff =
2495 target_timecode -
2496 (int64_t) (mkv_d->indexes[i].timecode *
2497 mkv_d->tc_scale / 1000000.0 + 0.5);
2499 if (flags & SEEK_BACKWARD) {
2500 // Seek backward: find the last index position
2501 // before target time
2502 if (diff < 0 || diff >= min_diff)
2503 continue;
2504 } else {
2505 // Seek forward: find the first index position
2506 // after target time. If no such index exists, find last
2507 // position between current position and target time.
2508 if (diff <= 0) {
2509 if (min_diff <= 0 && diff <= min_diff)
2510 continue;
2511 } else if (diff >=
2512 FFMIN(target_timecode - mkv_d->last_pts,
2513 min_diff))
2514 continue;
2516 min_diff = diff;
2517 index = mkv_d->indexes + i;
2520 if (index) { /* We've found an entry. */
2521 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2522 stream_seek(s, index->filepos);
2526 if (demuxer->video->id >= 0)
2527 mkv_d->v_skip_to_keyframe = 1;
2528 if (flags & SEEK_FORWARD)
2529 mkv_d->skip_to_timecode = target_timecode;
2530 else
2531 mkv_d->skip_to_timecode = index ? index->timecode : 0;
2532 mkv_d->a_skip_to_keyframe = 1;
2534 demux_mkv_fill_buffer(demuxer, NULL);
2535 } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
2536 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2537 else {
2538 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2539 stream_t *s = demuxer->stream;
2540 uint64_t target_filepos;
2541 mkv_index_t *index = NULL;
2542 int i;
2544 if (mkv_d->indexes == NULL) { /* not implemented without index */
2545 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2546 return;
2549 target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
2550 for (i = 0; i < mkv_d->num_indexes; i++)
2551 if (mkv_d->indexes[i].tnum == demuxer->video->id)
2552 if ((index == NULL)
2553 || ((mkv_d->indexes[i].filepos >= target_filepos)
2554 && ((index->filepos < target_filepos)
2555 || (mkv_d->indexes[i].filepos < index->filepos))))
2556 index = &mkv_d->indexes[i];
2558 if (!index)
2559 return;
2561 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2562 stream_seek(s, index->filepos);
2564 if (demuxer->video->id >= 0)
2565 mkv_d->v_skip_to_keyframe = 1;
2566 mkv_d->skip_to_timecode = index->timecode;
2567 mkv_d->a_skip_to_keyframe = 1;
2569 demux_mkv_fill_buffer(demuxer, NULL);
2573 static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
2575 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2577 switch (cmd) {
2578 case DEMUXER_CTRL_CORRECT_PTS:
2579 return DEMUXER_CTRL_OK;
2580 case DEMUXER_CTRL_GET_TIME_LENGTH:
2581 if (mkv_d->duration == 0)
2582 return DEMUXER_CTRL_DONTKNOW;
2584 *((double *) arg) = (double) mkv_d->duration;
2585 return DEMUXER_CTRL_OK;
2587 case DEMUXER_CTRL_GET_PERCENT_POS:
2588 if (mkv_d->duration == 0) {
2589 return DEMUXER_CTRL_DONTKNOW;
2592 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
2593 return DEMUXER_CTRL_OK;
2595 case DEMUXER_CTRL_SWITCH_AUDIO:
2596 if (demuxer->audio && demuxer->audio->sh) {
2597 sh_audio_t *sh = demuxer->a_streams[demuxer->audio->id];
2598 int aid = *(int *) arg;
2599 if (aid < 0)
2600 aid = (sh->aid + 1) % mkv_d->last_aid;
2601 if (aid != sh->aid) {
2602 mkv_track_t *track =
2603 demux_mkv_find_track_by_num(mkv_d, aid,
2604 MATROSKA_TRACK_AUDIO);
2605 if (track) {
2606 demuxer->audio->id = track->tnum;
2607 sh = demuxer->a_streams[demuxer->audio->id];
2608 ds_free_packs(demuxer->audio);
2611 *(int *) arg = sh->aid;
2612 } else
2613 *(int *) arg = -2;
2614 return DEMUXER_CTRL_OK;
2616 default:
2617 return DEMUXER_CTRL_NOTIMPL;
2621 const demuxer_desc_t demuxer_desc_matroska = {
2622 "Matroska demuxer",
2623 "mkv",
2624 "Matroska",
2625 "Aurelien Jacobs",
2627 DEMUXER_TYPE_MATROSKA,
2628 1, // safe autodetect
2629 demux_mkv_open,
2630 demux_mkv_fill_buffer,
2631 NULL,
2632 demux_close_mkv,
2633 demux_mkv_seek,
2634 demux_mkv_control