mixer: fix lowering hw volume while muted
[mplayer.git] / libmpdemux / demux_mkv.c
blobd04758c1b59fbf4be526d53d8c1c789f0c217517
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 <stdlib.h>
25 #include <stdio.h>
26 #include <ctype.h>
27 #include <inttypes.h>
28 #include <stdbool.h>
30 #include <libavutil/common.h>
31 #include <libavutil/lzo.h>
32 #include <libavutil/intreadwrite.h>
33 #include <libavutil/avstring.h>
35 #include "config.h"
37 #if CONFIG_ZLIB
38 #include <zlib.h>
39 #endif
41 #include "talloc.h"
42 #include "options.h"
43 #include "bstr.h"
44 #include "stream/stream.h"
45 #include "demuxer.h"
46 #include "stheader.h"
47 #include "ebml.h"
48 #include "matroska.h"
49 #include "demux_real.h"
51 #include "mp_msg.h"
54 #ifdef CONFIG_QTX_CODECS
55 #include "loader/qtx/qtxsdk/components.h"
56 #endif
58 static const unsigned char sipr_swaps[38][2] = {
59 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
60 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
61 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
62 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
63 {77,80}
66 // Map flavour to bytes per second
67 #define SIPR_FLAVORS 4
68 #define ATRC_FLAVORS 8
69 #define COOK_FLAVORS 34
70 static const int sipr_fl2bps[SIPR_FLAVORS] = { 813, 1062, 625, 2000 };
71 static const int atrc_fl2bps[ATRC_FLAVORS] = {
72 8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100 };
73 static const int cook_fl2bps[COOK_FLAVORS] = {
74 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
75 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
76 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
77 12016, 16408, 22911, 33506
80 typedef struct mkv_content_encoding {
81 uint64_t order, type, scope;
82 uint64_t comp_algo;
83 uint8_t *comp_settings;
84 int comp_settings_len;
85 } mkv_content_encoding_t;
87 typedef struct mkv_track {
88 int tnum;
89 char *name;
90 int id; // -aid / -sid / -vid option value
92 char *codec_id;
93 int ms_compat;
94 char *language;
96 int type;
98 uint32_t v_width, v_height, v_dwidth, v_dheight;
99 double v_frate;
101 uint32_t a_formattag;
102 uint32_t a_channels, a_bps;
103 float a_sfreq;
104 float a_osfreq;
106 double default_duration;
108 int default_track;
110 unsigned char *private_data;
111 unsigned int private_size;
113 /* stuff for realmedia */
114 int realmedia;
115 int64_t rv_kf_base;
116 int rv_kf_pts;
117 double rv_pts; /* previous video timestamp */
118 double ra_pts; /* previous audio timestamp */
120 /** realaudio descrambling */
121 int sub_packet_size; ///< sub packet size, per stream
122 int sub_packet_h; ///< number of coded frames per block
123 int coded_framesize; ///< coded frame size, per stream
124 int audiopk_size; ///< audio packet size
125 unsigned char *audio_buf; ///< place to store reordered audio data
126 double *audio_timestamp; ///< timestamp for each audio packet
127 int sub_packet_cnt; ///< number of subpacket already received
128 int audio_filepos; ///< file position of first audio packet in block
130 /* stuff for quicktime */
131 int fix_i_bps;
132 double qt_last_a_pts;
134 int subtitle_type;
136 /* generic content encoding support */
137 mkv_content_encoding_t *encodings;
138 int num_encodings;
140 /* For VobSubs and SSA/ASS */
141 sh_sub_t *sh_sub;
142 } mkv_track_t;
144 typedef struct mkv_index {
145 int tnum;
146 uint64_t timecode, filepos;
147 } mkv_index_t;
149 typedef struct mkv_demuxer {
150 off_t segment_start;
152 double duration, last_pts;
153 uint64_t last_filepos;
155 mkv_track_t **tracks;
156 int num_tracks;
158 uint64_t tc_scale, cluster_tc;
160 uint64_t cluster_start;
161 uint64_t cluster_size;
162 uint64_t blockgroup_size;
164 mkv_index_t *indexes;
165 int num_indexes;
167 off_t *parsed_pos;
168 int num_parsed_pos;
169 bool parsed_info;
170 bool parsed_tracks;
171 bool parsed_tags;
172 bool parsed_chapters;
173 bool parsed_attachments;
175 struct cluster_pos {
176 uint64_t filepos;
177 uint64_t timecode;
178 } *cluster_positions;
179 int num_cluster_pos;
181 uint64_t skip_to_timecode;
182 int v_skip_to_keyframe, a_skip_to_keyframe;
184 int num_audio_tracks;
185 int num_video_tracks;
186 } mkv_demuxer_t;
188 #define REALHEADER_SIZE 16
189 #define RVPROPERTIES_SIZE 34
190 #define RAPROPERTIES4_SIZE 56
191 #define RAPROPERTIES5_SIZE 70
194 * \brief ensures there is space for at least one additional element
195 * \param array array to grow
196 * \param nelem current number of elements in array
197 * \param elsize size of one array element
199 static void *grow_array(void *array, int nelem, size_t elsize)
201 if (!(nelem & 31))
202 array = realloc(array, (nelem + 32) * elsize);
203 return array;
206 static bool is_parsed_header(struct mkv_demuxer *mkv_d, off_t pos)
208 int low = 0;
209 int high = mkv_d->num_parsed_pos;
210 while (high > low + 1) {
211 int mid = high + low >> 1;
212 if (mkv_d->parsed_pos[mid] > pos)
213 high = mid;
214 else
215 low = mid;
217 if (mkv_d->num_parsed_pos && mkv_d->parsed_pos[low] == pos)
218 return true;
219 if (!(mkv_d->num_parsed_pos & 31))
220 mkv_d->parsed_pos = talloc_realloc(mkv_d, mkv_d->parsed_pos, off_t,
221 mkv_d->num_parsed_pos + 32);
222 mkv_d->num_parsed_pos++;
223 for (int i = mkv_d->num_parsed_pos - 1; i > low; i--)
224 mkv_d->parsed_pos[i] = mkv_d->parsed_pos[i - 1];
225 mkv_d->parsed_pos[low] = pos;
226 return false;
229 static mkv_track_t *find_track_by_num(struct mkv_demuxer *d, int n, int type)
231 for (int i = 0; i < d->num_tracks; i++)
232 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
233 if (d->tracks[i]->id == n)
234 return d->tracks[i];
236 return NULL;
239 static void add_cluster_position(mkv_demuxer_t *mkv_d, uint64_t filepos,
240 uint64_t timecode)
242 if (mkv_d->indexes)
243 return;
245 int n = mkv_d->num_cluster_pos;
246 if (n > 0 && mkv_d->cluster_positions[n-1].filepos >= filepos)
247 return;
249 mkv_d->cluster_positions =
250 grow_array(mkv_d->cluster_positions, mkv_d->num_cluster_pos,
251 sizeof(*mkv_d->cluster_positions));
252 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = (struct cluster_pos){
253 .filepos = filepos,
254 .timecode = timecode,
259 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
260 static int aac_get_sample_rate_index(uint32_t sample_rate)
262 static const int srates[] = {
263 92017, 75132, 55426, 46009, 37566, 27713,
264 23004, 18783, 13856, 11502, 9391, 0
266 int i = 0;
267 while (sample_rate < srates[i])
268 i++;
269 return i;
272 static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
273 uint8_t **dest, uint32_t *size, uint32_t type)
275 uint8_t *orig_src = src;
277 *dest = src;
279 for (int i = 0; i < track->num_encodings; i++) {
280 struct mkv_content_encoding *enc = track->encodings + i;
281 if (!(enc->scope & type))
282 continue;
284 if (src != *dest && src != orig_src)
285 talloc_free(src);
286 src = *dest; // output from last iteration is new source
288 if (enc->comp_algo == 0) {
289 #if CONFIG_ZLIB
290 /* zlib encoded track */
292 if (*size == 0)
293 continue;
295 z_stream zstream;
297 zstream.zalloc = (alloc_func) 0;
298 zstream.zfree = (free_func) 0;
299 zstream.opaque = (voidpf) 0;
300 if (inflateInit(&zstream) != Z_OK) {
301 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
302 "[mkv] zlib initialization failed.\n");
303 goto error;
305 zstream.next_in = (Bytef *) src;
306 zstream.avail_in = *size;
308 *dest = NULL;
309 zstream.avail_out = *size;
310 int result;
311 do {
312 *size += 4000;
313 *dest = talloc_realloc_size(NULL, *dest, *size);
314 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
315 result = inflate(&zstream, Z_NO_FLUSH);
316 if (result != Z_OK && result != Z_STREAM_END) {
317 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
318 "[mkv] zlib decompression failed.\n");
319 talloc_free(*dest);
320 *dest = NULL;
321 inflateEnd(&zstream);
322 goto error;
324 zstream.avail_out += 4000;
325 } while (zstream.avail_out == 4000 && zstream.avail_in != 0
326 && result != Z_STREAM_END);
328 *size = zstream.total_out;
329 inflateEnd(&zstream);
330 #endif
331 } else if (enc->comp_algo == 2) {
332 /* lzo encoded track */
333 int out_avail;
334 int dstlen = *size * 3;
336 *dest = NULL;
337 while (1) {
338 int srclen = *size;
339 *dest = talloc_realloc_size(NULL, *dest,
340 dstlen + AV_LZO_OUTPUT_PADDING);
341 out_avail = dstlen;
342 int result = av_lzo1x_decode(*dest, &out_avail, src, &srclen);
343 if (result == 0)
344 break;
345 if (!(result & AV_LZO_OUTPUT_FULL)) {
346 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
347 "[mkv] lzo decompression failed.\n");
348 talloc_free(*dest);
349 *dest = NULL;
350 goto error;
352 mp_msg(MSGT_DEMUX, MSGL_DBG2,
353 "[mkv] lzo decompression buffer too small.\n");
354 dstlen *= 2;
356 *size = dstlen - out_avail;
357 } else if (enc->comp_algo == 3) {
358 *dest = talloc_size(NULL, *size + enc->comp_settings_len);
359 memcpy(*dest, enc->comp_settings, enc->comp_settings_len);
360 memcpy(*dest + enc->comp_settings_len, src, *size);
361 *size += enc->comp_settings_len;
365 error:
366 if (src != *dest && src != orig_src)
367 talloc_free(src);
371 static int demux_mkv_read_info(demuxer_t *demuxer)
373 mkv_demuxer_t *mkv_d = demuxer->priv;
374 stream_t *s = demuxer->stream;
375 int res = 0;
377 mkv_d->tc_scale = 1000000;
378 mkv_d->duration = 0;
380 struct ebml_info info = {};
381 struct ebml_parse_ctx parse_ctx = {};
382 if (ebml_read_element(s, &parse_ctx, &info, &ebml_info_desc) < 0)
383 return -1;
384 if (info.n_timecode_scale) {
385 mkv_d->tc_scale = info.timecode_scale;
386 mp_msg(MSGT_DEMUX, MSGL_V,
387 "[mkv] | + timecode scale: %" PRIu64 "\n", mkv_d->tc_scale);
389 if (info.n_duration) {
390 mkv_d->duration = info.duration * mkv_d->tc_scale / 1e9;
391 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
392 mkv_d->duration);
394 if (info.n_segment_uid) {
395 int len = info.segment_uid.len;
396 if (len != sizeof(demuxer->matroska_data.segment_uid)) {
397 mp_msg(MSGT_DEMUX, MSGL_INFO,
398 "[mkv] segment uid invalid length %d\n", len);
399 } else {
400 memcpy(demuxer->matroska_data.segment_uid, info.segment_uid.start,
401 len);
402 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + segment uid");
403 for (int i = 0; i < len; i++)
404 mp_msg(MSGT_DEMUX, MSGL_V, " %02x",
405 demuxer->matroska_data.segment_uid[i]);
406 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
409 if (demuxer->params && demuxer->params->matroska_wanted_uids) {
410 unsigned char (*uids)[16] = demuxer->params->matroska_wanted_uids;
411 if (!info.n_segment_uid)
412 uids = NULL;
413 for (int i = 0; i < MP_TALLOC_ELEMS(uids); i++) {
414 if (!memcmp(info.segment_uid.start, uids[i], 16))
415 goto out;
417 mp_tmsg(MSGT_DEMUX, MSGL_INFO,
418 "[mkv] This is not one of the wanted files. "
419 "Stopping attempt to open.\n");
420 res = -2;
422 out:
423 talloc_free(parse_ctx.talloc_ctx);
424 return res;
427 static void parse_trackencodings(struct demuxer *demuxer,
428 struct mkv_track *track,
429 struct ebml_content_encodings *encodings)
431 // initial allocation to be a non-NULL context before realloc
432 mkv_content_encoding_t *ce = talloc_size(track, 1);
434 for (int n_enc = 0; n_enc < encodings->n_content_encoding; n_enc++) {
435 struct ebml_content_encoding *enc = encodings->content_encoding + n_enc;
436 struct mkv_content_encoding e = {};
437 e.order = enc->content_encoding_order;
438 if (enc->n_content_encoding_scope)
439 e.scope = enc->content_encoding_scope;
440 else
441 e.scope = 1;
442 e.type = enc->content_encoding_type;
444 if (enc->n_content_compression) {
445 struct ebml_content_compression *z = &enc->content_compression;
446 e.comp_algo = z->content_comp_algo;
447 if (z->n_content_comp_settings) {
448 int sz = z->content_comp_settings.len;
449 e.comp_settings = talloc_size(ce, sz);
450 memcpy(e.comp_settings, z->content_comp_settings.start, sz);
451 e.comp_settings_len = sz;
455 if (e.type == 1) {
456 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track "
457 "number %u has been encrypted and "
458 "decryption has not yet been\n"
459 "[mkv] implemented. Skipping track.\n",
460 track->tnum);
461 } else if (e.type != 0) {
462 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
463 "[mkv] Unknown content encoding type for "
464 "track %u. Skipping track.\n",
465 track->tnum);
466 } else if (e.comp_algo != 0 && e.comp_algo != 2 && e.comp_algo != 3) {
467 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
468 "[mkv] Track %u has been compressed with "
469 "an unknown/unsupported compression\n"
470 "[mkv] algorithm (%" PRIu64 "). Skipping track.\n",
471 track->tnum, e.comp_algo);
473 #if !CONFIG_ZLIB
474 else if (e.comp_algo == 0) {
475 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
476 "[mkv] Track %u was compressed with zlib "
477 "but mplayer has not been compiled\n"
478 "[mkv] with support for zlib compression. "
479 "Skipping track.\n",
480 track->tnum);
482 #endif
483 int i;
484 for (i = 0; i < n_enc; i++)
485 if (e.order >= ce[i].order)
486 break;
487 ce = talloc_realloc_size(track, ce, (n_enc + 1) * sizeof(*ce));
488 memmove(ce + i + 1, ce + i, (n_enc - i) * sizeof(*ce));
489 memcpy(ce + i, &e, sizeof(e));
492 track->encodings = ce;
493 track->num_encodings = encodings->n_content_encoding;
496 static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track,
497 struct ebml_audio *audio)
499 if (audio->n_sampling_frequency) {
500 track->a_sfreq = audio->sampling_frequency;
501 mp_msg(MSGT_DEMUX, MSGL_V,
502 "[mkv] | + Sampling frequency: %f\n", track->a_sfreq);
503 } else
504 track->a_sfreq = 8000;
505 if (audio->n_output_sampling_frequency) {
506 track->a_osfreq = audio->output_sampling_frequency;
507 mp_msg(MSGT_DEMUX, MSGL_V,
508 "[mkv] | + Output sampling frequency: %f\n", track->a_osfreq);
509 } else
510 track->a_osfreq = track->a_sfreq;
511 if (audio->n_bit_depth) {
512 track->a_bps = audio->bit_depth;
513 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
514 track->a_bps);
516 if (audio->n_channels) {
517 track->a_channels = audio->channels;
518 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
519 track->a_channels);
520 } else
521 track->a_channels = 1;
524 static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track,
525 struct ebml_video *video)
527 if (video->n_frame_rate) {
528 track->v_frate = video->frame_rate;
529 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
530 track->v_frate);
531 if (track->v_frate > 0)
532 track->default_duration = 1 / track->v_frate;
534 if (video->n_display_width) {
535 track->v_dwidth = video->display_width;
536 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
537 track->v_dwidth);
539 if (video->n_display_height) {
540 track->v_dheight = video->display_height;
541 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
542 track->v_dheight);
544 if (video->n_pixel_width) {
545 track->v_width = video->pixel_width;
546 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
547 track->v_width);
549 if (video->n_pixel_height) {
550 track->v_height = video->pixel_height;
551 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
552 track->v_height);
557 * \brief free any data associated with given track
558 * \param track track of which to free data
560 static void demux_mkv_free_trackentry(mkv_track_t *track)
562 free(track->audio_buf);
563 free(track->audio_timestamp);
564 talloc_free(track);
567 static void parse_trackentry(struct demuxer *demuxer,
568 struct ebml_track_entry *entry)
570 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
571 struct mkv_track *track = talloc_zero_size(NULL, sizeof(*track));
573 track->tnum = entry->track_number;
574 if (track->tnum)
575 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
576 track->tnum);
577 else
578 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing track number!\n");
580 if (entry->n_name) {
581 track->name = talloc_strndup(track, entry->name.start,
582 entry->name.len);
583 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
584 track->name);
587 track->type = entry->track_type;
588 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
589 switch (track->type) {
590 case MATROSKA_TRACK_AUDIO:
591 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
592 break;
593 case MATROSKA_TRACK_VIDEO:
594 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
595 break;
596 case MATROSKA_TRACK_SUBTITLE:
597 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
598 break;
599 default:
600 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
601 break;
604 if (entry->n_audio) {
605 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
606 parse_trackaudio(demuxer, track, &entry->audio);
609 if (entry->n_video) {
610 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
611 parse_trackvideo(demuxer, track, &entry->video);
614 if (entry->n_codec_id) {
615 track->codec_id = talloc_strndup(track, entry->codec_id.start,
616 entry->codec_id.len);
617 if (!strcmp(track->codec_id, MKV_V_MSCOMP)
618 || !strcmp(track->codec_id, MKV_A_ACM))
619 track->ms_compat = 1;
620 else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
621 track->subtitle_type = 'v';
622 else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
623 || !strcmp(track->codec_id, MKV_S_TEXTASS)
624 || !strcmp(track->codec_id, MKV_S_SSA)
625 || !strcmp(track->codec_id, MKV_S_ASS))
626 track->subtitle_type = 'a';
627 else if (!strcmp(track->codec_id, MKV_S_TEXTASCII)
628 || !strcmp(track->codec_id, MKV_S_TEXTUTF8))
629 track->subtitle_type = 't';
630 else if (!strcmp(track->codec_id, MKV_S_PGS))
631 track->subtitle_type = 'p';
632 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
633 track->codec_id);
634 } else
635 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing codec ID!\n");
637 if (entry->n_codec_private) {
638 int len = entry->codec_private.len;
639 track->private_data = talloc_size(track, len + AV_LZO_INPUT_PADDING);
640 memcpy(track->private_data, entry->codec_private.start, len);
641 track->private_size = len;
642 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length %u\n",
643 track->private_size);
646 if (entry->n_language) {
647 track->language = talloc_strndup(track, entry->language.start,
648 entry->language.len);
649 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
650 track->language);
651 } else
652 track->language = talloc_strdup(track, "eng");
654 if (entry->n_flag_default) {
655 track->default_track = entry->flag_default;
656 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
657 track->default_track);
658 } else
659 track->default_track = 1;
661 if (entry->n_default_duration) {
662 track->default_duration = entry->default_duration / 1e9;
663 if (entry->default_duration == 0)
664 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
665 else {
666 if (!track->v_frate)
667 track->v_frate = 1e9 / entry->default_duration;
668 mp_msg(MSGT_DEMUX, MSGL_V,
669 "[mkv] | + Default duration: %.3fms ( = %.3f fps)\n",
670 entry->default_duration / 1000000.0, track->v_frate);
674 if (entry->n_content_encodings)
675 parse_trackencodings(demuxer, track, &entry->content_encodings);
677 mkv_d->tracks[mkv_d->num_tracks++] = track;
680 static int demux_mkv_read_tracks(demuxer_t *demuxer)
682 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
683 stream_t *s = demuxer->stream;
685 struct ebml_tracks tracks = {};
686 struct ebml_parse_ctx parse_ctx = {};
687 if (ebml_read_element(s, &parse_ctx, &tracks, &ebml_tracks_desc) < 0)
688 return -1;
690 mkv_d->tracks = talloc_size(mkv_d,
691 tracks.n_track_entry * sizeof(*mkv_d->tracks));
692 for (int i = 0; i < tracks.n_track_entry; i++) {
693 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
694 parse_trackentry(demuxer, &tracks.track_entry[i]);
696 talloc_free(parse_ctx.talloc_ctx);
697 return 0;
700 static int demux_mkv_read_cues(demuxer_t *demuxer)
702 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
703 stream_t *s = demuxer->stream;
705 if (index_mode == 0 || index_mode == 2) {
706 ebml_read_skip(s, NULL);
707 return 0;
710 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
711 struct ebml_cues cues = {};
712 struct ebml_parse_ctx parse_ctx = {};
713 if (ebml_read_element(s, &parse_ctx, &cues, &ebml_cues_desc) < 0)
714 return -1;
715 for (int i = 0; i < cues.n_cue_point; i++) {
716 struct ebml_cue_point *cuepoint = &cues.cue_point[i];
717 if (cuepoint->n_cue_time != 1 || !cuepoint->n_cue_track_positions) {
718 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed CuePoint element\n");
719 continue;
721 uint64_t time = cuepoint->cue_time;
722 for (int i = 0; i < cuepoint->n_cue_track_positions; i++) {
723 struct ebml_cue_track_positions *trackpos =
724 &cuepoint->cue_track_positions[i];
725 uint64_t track = trackpos->cue_track;
726 uint64_t pos = trackpos->cue_cluster_position;
727 mkv_d->indexes =
728 grow_array(mkv_d->indexes, mkv_d->num_indexes,
729 sizeof(mkv_index_t));
730 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
731 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
732 mkv_d->indexes[mkv_d->num_indexes].filepos =
733 mkv_d->segment_start + pos;
734 mp_msg(MSGT_DEMUX, MSGL_DBG2,
735 "[mkv] |+ found cue point for track %" PRIu64
736 ": timecode %" PRIu64 ", filepos: %" PRIu64 "\n", track,
737 time, mkv_d->segment_start + pos);
738 mkv_d->num_indexes++;
742 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
743 talloc_free(parse_ctx.talloc_ctx);
744 return 0;
747 static int demux_mkv_read_chapters(struct demuxer *demuxer)
749 struct MPOpts *opts = demuxer->opts;
750 stream_t *s = demuxer->stream;
752 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
753 struct ebml_chapters file_chapters = {};
754 struct ebml_parse_ctx parse_ctx = {};
755 if (ebml_read_element(s, &parse_ctx, &file_chapters,
756 &ebml_chapters_desc) < 0)
757 return -1;
759 int selected_edition = 0;
760 int num_editions = file_chapters.n_edition_entry;
761 struct ebml_edition_entry *editions = file_chapters.edition_entry;
762 if (opts->edition_id >= 0 && opts->edition_id < num_editions) {
763 selected_edition = opts->edition_id;
764 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] User-specified edition: %d\n",
765 selected_edition);
766 } else
767 for (int i = 0; i < num_editions; i++)
768 if (editions[i].edition_flag_default) {
769 selected_edition = i;
770 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition: %d\n", i);
771 break;
773 struct matroska_chapter *m_chapters = NULL;
774 if (editions[selected_edition].edition_flag_ordered) {
775 int count = editions[selected_edition].n_chapter_atom;
776 m_chapters = talloc_array_ptrtype(demuxer, m_chapters, count);
777 demuxer->matroska_data.ordered_chapters = m_chapters;
778 demuxer->matroska_data.num_ordered_chapters = count;
781 for (int idx = 0; idx < num_editions; idx++) {
782 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New edition %d\n", idx);
783 int warn_level = idx == selected_edition ? MSGL_WARN : MSGL_V;
784 if (editions[idx].n_edition_flag_default)
785 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition flag: %"PRIu64
786 "\n", editions[idx].edition_flag_default);
787 if (editions[idx].n_edition_flag_ordered)
788 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Ordered chapter flag: %"PRIu64
789 "\n", editions[idx].edition_flag_ordered);
790 for (int i = 0; i < editions[idx].n_chapter_atom; i++) {
791 struct ebml_chapter_atom *ca = editions[idx].chapter_atom + i;
792 struct matroska_chapter chapter = { };
793 struct bstr name = { "(unnamed)", 9 };
795 if (!ca->n_chapter_time_start)
796 mp_msg(MSGT_DEMUX, warn_level,
797 "[mkv] Chapter lacks start time\n");
798 chapter.start = ca->chapter_time_start;
799 chapter.end = ca->chapter_time_end;
801 if (ca->n_chapter_display) {
802 if (ca->n_chapter_display > 1)
803 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Multiple chapter "
804 "names not supported, picking first\n");
805 if (!ca->chapter_display[0].n_chap_string)
806 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Malformed chapter "
807 "name entry\n");
808 else
809 name = ca->chapter_display[0].chap_string;
812 if (ca->n_chapter_segment_uid) {
813 chapter.has_segment_uid = true;
814 int len = ca->chapter_segment_uid.len;
815 if (len != sizeof(chapter.segment_uid))
816 mp_msg(MSGT_DEMUX, warn_level,
817 "[mkv] Chapter segment uid bad length %d\n", len);
818 else if (ca->n_chapter_segment_edition_uid) {
819 mp_tmsg(MSGT_DEMUX, warn_level, "[mkv] Warning: "
820 "unsupported edition recursion in chapter; "
821 "will skip on playback!\n");
822 } else {
823 memcpy(chapter.segment_uid, ca->chapter_segment_uid.start,
824 len);
825 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter segment uid ");
826 for (int i = 0; i < len; i++)
827 mp_msg(MSGT_DEMUX, MSGL_V, "%02x ",
828 chapter.segment_uid[i]);
829 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
833 mp_msg(MSGT_DEMUX, MSGL_V,
834 "[mkv] Chapter %u from %02d:%02d:%02d.%03d "
835 "to %02d:%02d:%02d.%03d, %.*s\n", i,
836 (int) (chapter.start / 60 / 60 / 1000000000),
837 (int) ((chapter.start / 60 / 1000000000) % 60),
838 (int) ((chapter.start / 1000000000) % 60),
839 (int) (chapter.start % 1000000000),
840 (int) (chapter.end / 60 / 60 / 1000000000),
841 (int) ((chapter.end / 60 / 1000000000) % 60),
842 (int) ((chapter.end / 1000000000) % 60),
843 (int) (chapter.end % 1000000000),
844 BSTR_P(name));
846 if (idx == selected_edition){
847 demuxer_add_chapter(demuxer, name, chapter.start, chapter.end);
848 if (editions[idx].edition_flag_ordered) {
849 chapter.name = talloc_strndup(m_chapters, name.start,
850 name.len);
851 m_chapters[i] = chapter;
856 if (num_editions > 1)
857 mp_msg(MSGT_DEMUX, MSGL_INFO,
858 "[mkv] Found %d editions, will play #%d (first is 0).\n",
859 num_editions, selected_edition);
861 talloc_free(parse_ctx.talloc_ctx);
862 mp_msg(MSGT_DEMUX, MSGL_V,
863 "[mkv] \\---- [ parsing chapters ] ---------\n");
864 return 0;
867 static int demux_mkv_read_tags(demuxer_t *demuxer)
869 stream_t *s = demuxer->stream;
871 struct ebml_parse_ctx parse_ctx = {};
872 struct ebml_tags tags = {};
873 if (ebml_read_element(s, &parse_ctx, &tags, &ebml_tags_desc) < 0)
874 return -1;
876 for (int i = 0; i < tags.n_tag; i++) {
877 struct ebml_tag tag = tags.tag[i];
878 if (tag.targets.target_track_uid || tag.targets.target_edition_uid ||
879 tag.targets.target_chapter_uid || tag.targets.target_attachment_uid)
880 continue;
882 for (int j = 0; j < tag.n_simple_tag; j++)
883 demux_info_add_bstr(demuxer, tag.simple_tag[j].tag_name, tag.simple_tag[j].tag_string);
886 talloc_free(parse_ctx.talloc_ctx);
887 return 0;
890 static int demux_mkv_read_attachments(demuxer_t *demuxer)
892 stream_t *s = demuxer->stream;
894 mp_msg(MSGT_DEMUX, MSGL_V,
895 "[mkv] /---- [ parsing attachments ] ---------\n");
897 struct ebml_attachments attachments = {};
898 struct ebml_parse_ctx parse_ctx = {};
899 if (ebml_read_element(s, &parse_ctx, &attachments,
900 &ebml_attachments_desc) < 0)
901 return -1;
903 for (int i = 0; i < attachments.n_attached_file; i++) {
904 struct ebml_attached_file *attachment = &attachments.attached_file[i];
905 if (!attachment->n_file_name || !attachment->n_file_mime_type
906 || !attachment->n_file_data) {
907 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed attachment\n");
908 continue;
910 struct bstr name = attachment->file_name;
911 struct bstr mime = attachment->file_mime_type;
912 demuxer_add_attachment(demuxer, name, mime, attachment->file_data);
913 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Attachment: %.*s, %.*s, %zu bytes\n",
914 BSTR_P(name), BSTR_P(mime), attachment->file_data.len);
917 talloc_free(parse_ctx.talloc_ctx);
918 mp_msg(MSGT_DEMUX, MSGL_V,
919 "[mkv] \\---- [ parsing attachments ] ---------\n");
920 return 0;
923 static int read_header_element(struct demuxer *demuxer, uint32_t id,
924 off_t at_filepos);
926 static int demux_mkv_read_seekhead(demuxer_t *demuxer)
928 struct mkv_demuxer *mkv_d = demuxer->priv;
929 struct stream *s = demuxer->stream;
930 int res = 0;
931 struct ebml_seek_head seekhead = {};
932 struct ebml_parse_ctx parse_ctx = {};
934 mp_msg(MSGT_DEMUX, MSGL_V,
935 "[mkv] /---- [ parsing seek head ] ---------\n");
936 if (ebml_read_element(s, &parse_ctx, &seekhead, &ebml_seek_head_desc) < 0) {
937 res = -1;
938 goto out;
940 /* off now holds the position of the next element after the seek head. */
941 off_t off = stream_tell(s);
942 for (int i = 0; i < seekhead.n_seek; i++) {
943 struct ebml_seek *seek = &seekhead.seek[i];
944 if (seek->n_seek_id != 1 || seek->n_seek_position != 1) {
945 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Invalid SeekHead entry\n");
946 continue;
948 uint64_t pos = seek->seek_position + mkv_d->segment_start;
949 if (pos >= demuxer->movi_end) {
950 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] SeekHead position beyond "
951 "end of file - incomplete file?\n");
952 continue;
954 int r = read_header_element(demuxer, seek->seek_id, pos);
955 if (r <= -2) {
956 res = r;
957 goto out;
960 if (!stream_seek(s, off)) {
961 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Couldn't seek back after "
962 "SeekHead??\n");
963 res = -1;
965 out:
966 mp_msg(MSGT_DEMUX, MSGL_V,
967 "[mkv] \\---- [ parsing seek head ] ---------\n");
968 talloc_free(parse_ctx.talloc_ctx);
969 return res;
972 static bool seek_pos_id(struct stream *s, off_t pos, uint32_t id)
974 if (!stream_seek(s, pos)) {
975 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Failed to seek in file\n");
976 return false;
978 if (ebml_read_id(s, NULL) != id) {
979 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Expected element not found\n");
980 return false;
982 return true;
985 static int read_header_element(struct demuxer *demuxer, uint32_t id,
986 off_t at_filepos)
988 struct mkv_demuxer *mkv_d = demuxer->priv;
989 stream_t *s = demuxer->stream;
990 off_t pos = stream_tell(s) - 4;
991 int res = 1;
993 switch(id) {
994 case MATROSKA_ID_INFO:
995 if (mkv_d->parsed_info)
996 break;
997 if (at_filepos && !seek_pos_id(s, at_filepos, id))
998 return -1;
999 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
1000 mkv_d->parsed_info = true;
1001 return demux_mkv_read_info(demuxer);
1003 case MATROSKA_ID_TRACKS:
1004 if (mkv_d->parsed_tracks)
1005 break;
1006 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1007 return -1;
1008 mkv_d->parsed_tracks = true;
1009 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
1010 return demux_mkv_read_tracks(demuxer);
1012 case MATROSKA_ID_CUES:
1013 if (is_parsed_header(mkv_d, pos))
1014 break;
1015 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1016 return -1;
1017 return demux_mkv_read_cues(demuxer);
1019 case MATROSKA_ID_TAGS:
1020 if (mkv_d->parsed_tags)
1021 break;
1022 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1023 return -1;
1024 mkv_d->parsed_tags = true;
1025 return demux_mkv_read_tags(demuxer);
1027 case MATROSKA_ID_SEEKHEAD:
1028 if (is_parsed_header(mkv_d, pos))
1029 break;
1030 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1031 return -1;
1032 return demux_mkv_read_seekhead(demuxer);
1034 case MATROSKA_ID_CHAPTERS:
1035 if (mkv_d->parsed_chapters)
1036 break;
1037 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1038 return -1;
1039 mkv_d->parsed_chapters = true;
1040 return demux_mkv_read_chapters(demuxer);
1042 case MATROSKA_ID_ATTACHMENTS:
1043 if (mkv_d->parsed_attachments)
1044 break;
1045 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1046 return -1;
1047 mkv_d->parsed_attachments = true;
1048 return demux_mkv_read_attachments(demuxer);
1050 case EBML_ID_VOID:
1051 break;
1053 default:
1054 res = 2;
1056 if (!at_filepos)
1057 ebml_read_skip(s, NULL);
1058 return res;
1063 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1064 int vid);
1065 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1066 int aid);
1067 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1068 int sid);
1070 static void display_create_tracks(demuxer_t *demuxer)
1072 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1073 int i, vid = 0, aid = 0, sid = 0;
1075 for (i = 0; i < mkv_d->num_tracks; i++) {
1076 char *type = "unknown", str[32];
1077 *str = '\0';
1078 switch (mkv_d->tracks[i]->type) {
1079 case MATROSKA_TRACK_VIDEO:
1080 type = "video";
1081 mkv_d->tracks[i]->id = -1;
1082 if (vid == MAX_V_STREAMS)
1083 break;
1084 mkv_d->tracks[i]->id = vid;
1085 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid);
1086 if (mkv_d->tracks[i]->name)
1087 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", vid,
1088 mkv_d->tracks[i]->name);
1089 sprintf(str, "-vid %u", vid++);
1090 break;
1091 case MATROSKA_TRACK_AUDIO:
1092 type = "audio";
1093 mkv_d->tracks[i]->id = -1;
1094 if (aid == MAX_A_STREAMS)
1095 break;
1096 mkv_d->tracks[i]->id = aid;
1097 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid);
1098 if (mkv_d->tracks[i]->name)
1099 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", aid,
1100 mkv_d->tracks[i]->name);
1101 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", aid,
1102 mkv_d->tracks[i]->language);
1103 sprintf(str, "-aid %u, -alang %.5s", aid++,
1104 mkv_d->tracks[i]->language);
1105 break;
1106 case MATROSKA_TRACK_SUBTITLE:
1107 type = "subtitles";
1108 mkv_d->tracks[i]->id = -1;
1109 if (sid == MAX_S_STREAMS)
1110 break;
1111 mkv_d->tracks[i]->id = sid;
1112 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
1113 if (mkv_d->tracks[i]->name)
1114 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid,
1115 mkv_d->tracks[i]->name);
1116 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid,
1117 mkv_d->tracks[i]->language);
1118 sprintf(str, "-sid %u, -slang %.5s", sid++,
1119 mkv_d->tracks[i]->language);
1120 break;
1122 if (mkv_d->tracks[i]->name)
1123 mp_tmsg(MSGT_DEMUX, MSGL_INFO,
1124 "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1125 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1126 mkv_d->tracks[i]->name, str);
1127 else
1128 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
1129 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1130 str);
1132 mkv_d->num_audio_tracks = aid;
1133 mkv_d->num_video_tracks = vid;
1136 typedef struct {
1137 char *id;
1138 int fourcc;
1139 int extradata;
1140 } videocodec_info_t;
1142 static const videocodec_info_t vinfo[] = {
1143 {MKV_V_MJPEG, mmioFOURCC('m', 'j', 'p', 'g'), 1},
1144 {MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0},
1145 {MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0},
1146 {MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1147 {MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1148 {MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1149 {MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1},
1150 {MKV_V_THEORA, mmioFOURCC('t', 'h', 'e', 'o'), 1},
1151 {MKV_V_VP8, mmioFOURCC('V', 'P', '8', '0'), 0},
1152 {NULL, 0, 0}
1155 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1156 int vid)
1158 BITMAPINFOHEADER *bih;
1159 void *ImageDesc = NULL;
1160 sh_video_t *sh_v;
1162 if (track->ms_compat) { /* MS compatibility mode */
1163 BITMAPINFOHEADER *src;
1165 if (track->private_data == NULL
1166 || track->private_size < sizeof(*bih))
1167 return 1;
1169 src = (BITMAPINFOHEADER *) track->private_data;
1170 bih = calloc(1, track->private_size);
1171 bih->biSize = le2me_32(src->biSize);
1172 bih->biWidth = le2me_32(src->biWidth);
1173 bih->biHeight = le2me_32(src->biHeight);
1174 bih->biPlanes = le2me_16(src->biPlanes);
1175 bih->biBitCount = le2me_16(src->biBitCount);
1176 bih->biCompression = le2me_32(src->biCompression);
1177 bih->biSizeImage = le2me_32(src->biSizeImage);
1178 bih->biXPelsPerMeter = le2me_32(src->biXPelsPerMeter);
1179 bih->biYPelsPerMeter = le2me_32(src->biYPelsPerMeter);
1180 bih->biClrUsed = le2me_32(src->biClrUsed);
1181 bih->biClrImportant = le2me_32(src->biClrImportant);
1182 memcpy(bih + 1,
1183 src + 1,
1184 track->private_size - sizeof(*bih));
1186 if (track->v_width == 0)
1187 track->v_width = bih->biWidth;
1188 if (track->v_height == 0)
1189 track->v_height = bih->biHeight;
1190 } else {
1191 bih = calloc(1, sizeof(*bih));
1192 bih->biSize = sizeof(*bih);
1193 bih->biWidth = track->v_width;
1194 bih->biHeight = track->v_height;
1195 bih->biBitCount = 24;
1196 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
1198 if (track->private_size >= RVPROPERTIES_SIZE
1199 && (!strcmp(track->codec_id, MKV_V_REALV10)
1200 || !strcmp(track->codec_id, MKV_V_REALV20)
1201 || !strcmp(track->codec_id, MKV_V_REALV30)
1202 || !strcmp(track->codec_id, MKV_V_REALV40))) {
1203 unsigned char *dst, *src;
1204 uint32_t type2;
1205 unsigned int cnt;
1207 src = (uint8_t *) track->private_data + RVPROPERTIES_SIZE;
1209 cnt = track->private_size - RVPROPERTIES_SIZE;
1210 bih = realloc(bih, sizeof(*bih) + 8 + cnt);
1211 bih->biSize = 48 + cnt;
1212 bih->biPlanes = 1;
1213 type2 = AV_RB32(src - 4);
1214 if (type2 == 0x10003000 || type2 == 0x10003001)
1215 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
1216 else
1217 bih->biCompression =
1218 mmioFOURCC('R', 'V', track->codec_id[9], '0');
1219 dst = (unsigned char *) (bih + 1);
1220 // copy type1 and type2 info from rv properties
1221 memcpy(dst, src - 8, 8 + cnt);
1222 track->realmedia = 1;
1224 #ifdef CONFIG_QTX_CODECS
1225 } else if (track->private_size >= sizeof(ImageDescription)
1226 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) {
1227 ImageDescriptionPtr idesc;
1229 idesc = (ImageDescriptionPtr) track->private_data;
1230 idesc->idSize = be2me_32(idesc->idSize);
1231 idesc->cType = be2me_32(idesc->cType);
1232 idesc->version = be2me_16(idesc->version);
1233 idesc->revisionLevel = be2me_16(idesc->revisionLevel);
1234 idesc->vendor = be2me_32(idesc->vendor);
1235 idesc->temporalQuality = be2me_32(idesc->temporalQuality);
1236 idesc->spatialQuality = be2me_32(idesc->spatialQuality);
1237 idesc->width = be2me_16(idesc->width);
1238 idesc->height = be2me_16(idesc->height);
1239 idesc->hRes = be2me_32(idesc->hRes);
1240 idesc->vRes = be2me_32(idesc->vRes);
1241 idesc->dataSize = be2me_32(idesc->dataSize);
1242 idesc->frameCount = be2me_16(idesc->frameCount);
1243 idesc->depth = be2me_16(idesc->depth);
1244 idesc->clutID = be2me_16(idesc->clutID);
1245 bih->biPlanes = 1;
1246 bih->biCompression = idesc->cType;
1247 ImageDesc = idesc;
1248 #endif /* CONFIG_QTX_CODECS */
1250 } else {
1251 const videocodec_info_t *vi = vinfo;
1252 while (vi->id && strcmp(vi->id, track->codec_id))
1253 vi++;
1254 bih->biCompression = vi->fourcc;
1255 if (vi->extradata && track->private_data
1256 && (track->private_size > 0)) {
1257 bih->biSize += track->private_size;
1258 bih = realloc(bih, bih->biSize);
1259 memcpy(bih + 1, track->private_data, track->private_size);
1261 if (!vi->id) {
1262 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported "
1263 "CodecID (%s) or missing/bad CodecPrivate\n"
1264 "[mkv] data (track %u).\n",
1265 track->codec_id, track->tnum);
1266 free(bih);
1267 return 1;
1272 sh_v = new_sh_video(demuxer, vid);
1273 sh_v->title = talloc_strdup(sh_v, track->name);
1274 sh_v->bih = bih;
1275 sh_v->format = sh_v->bih->biCompression;
1276 if (track->v_frate == 0.0)
1277 track->v_frate = 25.0;
1278 sh_v->fps = track->v_frate;
1279 sh_v->frametime = 1 / track->v_frate;
1280 sh_v->aspect = 0;
1281 if (!track->realmedia) {
1282 sh_v->disp_w = track->v_width;
1283 sh_v->disp_h = track->v_height;
1284 if (track->v_dheight)
1285 sh_v->aspect = (double) track->v_dwidth / track->v_dheight;
1286 } else {
1287 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1288 // disp_w and disp_h from the RealVideo stream contents returned
1289 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1290 // the Matroska file then it has already been set to PixelWidth/Height
1291 // by check_track_information.
1292 sh_v->disp_w = track->v_dwidth;
1293 sh_v->disp_h = track->v_dheight;
1295 sh_v->ImageDesc = ImageDesc;
1296 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
1298 sh_v->ds = demuxer->video;
1299 return 0;
1302 static struct mkv_audio_tag {
1303 char *id; bool prefix; uint32_t formattag;
1304 } mkv_audio_tags[] = {
1305 { MKV_A_MP2, 0, 0x0055 },
1306 { MKV_A_MP3, 0, 0x0055 },
1307 { MKV_A_AC3, 1, 0x2000 },
1308 { MKV_A_EAC3, 1, mmioFOURCC('E', 'A', 'C', '3') },
1309 { MKV_A_DTS, 0, 0x2001 },
1310 { MKV_A_PCM, 0, 0x0001 },
1311 { MKV_A_PCM_BE, 0, 0x0001 },
1312 { MKV_A_AAC_2MAIN, 0, mmioFOURCC('M', 'P', '4', 'A') },
1313 { MKV_A_AAC_2LC, 1, mmioFOURCC('M', 'P', '4', 'A') },
1314 { MKV_A_AAC_2SSR, 0, mmioFOURCC('M', 'P', '4', 'A') },
1315 { MKV_A_AAC_4MAIN, 0, mmioFOURCC('M', 'P', '4', 'A') },
1316 { MKV_A_AAC_4LC, 1, mmioFOURCC('M', 'P', '4', 'A') },
1317 { MKV_A_AAC_4SSR, 0, mmioFOURCC('M', 'P', '4', 'A') },
1318 { MKV_A_AAC_4LTP, 0, mmioFOURCC('M', 'P', '4', 'A') },
1319 { MKV_A_AAC, 0, mmioFOURCC('M', 'P', '4', 'A') },
1320 { MKV_A_VORBIS, 0, mmioFOURCC('v', 'r', 'b', 's') },
1321 { MKV_A_QDMC, 0, mmioFOURCC('Q', 'D', 'M', 'C') },
1322 { MKV_A_QDMC2, 0, mmioFOURCC('Q', 'D', 'M', '2') },
1323 { MKV_A_WAVPACK, 0, mmioFOURCC('W', 'V', 'P', 'K') },
1324 { MKV_A_TRUEHD, 0, mmioFOURCC('T', 'R', 'H', 'D') },
1325 { MKV_A_FLAC, 0, mmioFOURCC('f', 'L', 'a', 'C') },
1326 { MKV_A_REAL28, 0, mmioFOURCC('2', '8', '_', '8') },
1327 { MKV_A_REALATRC, 0, mmioFOURCC('a', 't', 'r', 'c') },
1328 { MKV_A_REALCOOK, 0, mmioFOURCC('c', 'o', 'o', 'k') },
1329 { MKV_A_REALDNET, 0, mmioFOURCC('d', 'n', 'e', 't') },
1330 { MKV_A_REALSIPR, 0, mmioFOURCC('s', 'i', 'p', 'r') },
1331 { NULL },
1335 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1336 int aid)
1338 sh_audio_t *sh_a = new_sh_audio(demuxer, aid);
1339 if (!sh_a)
1340 return 1;
1342 if (track->language && (strcmp(track->language, "und") != 0))
1343 sh_a->lang = talloc_strdup(sh_a, track->language);
1344 sh_a->title = talloc_strdup(sh_a, track->name);
1345 sh_a->default_track = track->default_track;
1346 sh_a->ds = demuxer->audio;
1347 if (track->ms_compat) {
1348 if (track->private_size < sizeof(*sh_a->wf))
1349 goto error;
1350 WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data;
1351 sh_a->wf = calloc(1, track->private_size);
1352 sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag);
1353 sh_a->wf->nChannels = le2me_16(wf->nChannels);
1354 sh_a->wf->nSamplesPerSec = le2me_32(wf->nSamplesPerSec);
1355 sh_a->wf->nAvgBytesPerSec = le2me_32(wf->nAvgBytesPerSec);
1356 sh_a->wf->nBlockAlign = le2me_16(wf->nBlockAlign);
1357 sh_a->wf->wBitsPerSample = le2me_16(wf->wBitsPerSample);
1358 sh_a->wf->cbSize = track->private_size - sizeof(*sh_a->wf);
1359 memcpy(sh_a->wf + 1, wf + 1,
1360 track->private_size - sizeof(*sh_a->wf));
1361 if (track->a_sfreq == 0.0)
1362 track->a_sfreq = sh_a->wf->nSamplesPerSec;
1363 if (track->a_channels == 0)
1364 track->a_channels = sh_a->wf->nChannels;
1365 if (track->a_bps == 0)
1366 track->a_bps = sh_a->wf->wBitsPerSample;
1367 track->a_formattag = sh_a->wf->wFormatTag;
1368 } else {
1369 sh_a->wf = calloc(1, sizeof(*sh_a->wf));
1370 for (int i = 0; ; i++) {
1371 struct mkv_audio_tag *t = mkv_audio_tags + i;
1372 if (t->id == NULL)
1373 goto error;
1374 if (t->prefix) {
1375 if (!bstr_startswith0(bstr(track->codec_id), t->id))
1376 continue;
1377 } else {
1378 if (strcmp(track->codec_id, t->id))
1379 continue;
1381 track->a_formattag = t->formattag;
1382 break;
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->container_out_samplerate = track->a_osfreq;
1392 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
1393 if (track->a_bps == 0) {
1394 sh_a->samplesize = 2;
1395 sh_a->wf->wBitsPerSample = 16;
1396 } else {
1397 sh_a->samplesize = track->a_bps / 8;
1398 sh_a->wf->wBitsPerSample = track->a_bps;
1400 if (track->a_formattag == 0x0055) { /* MP3 || MP2 */
1401 sh_a->wf->nAvgBytesPerSec = 16000;
1402 sh_a->wf->nBlockAlign = 1152;
1403 } else if ((track->a_formattag == 0x2000) /* AC3 */
1404 || track->a_formattag == mmioFOURCC('E', 'A', 'C', '3')
1405 || (track->a_formattag == 0x2001)) { /* DTS */
1406 free(sh_a->wf);
1407 sh_a->wf = NULL;
1408 } else if (track->a_formattag == 0x0001) { /* PCM || PCM_BE */
1409 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
1410 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
1411 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
1412 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
1413 } else if (!strcmp(track->codec_id, MKV_A_QDMC)
1414 || !strcmp(track->codec_id, MKV_A_QDMC2)) {
1415 sh_a->wf->nAvgBytesPerSec = 16000;
1416 sh_a->wf->nBlockAlign = 1486;
1417 track->fix_i_bps = 1;
1418 track->qt_last_a_pts = 0.0;
1419 goto copy_private_data;
1420 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
1421 int profile, srate_idx;
1423 sh_a->wf->nAvgBytesPerSec = 16000;
1424 sh_a->wf->nBlockAlign = 1024;
1426 if (!strcmp(track->codec_id, MKV_A_AAC) && track->private_data)
1427 goto copy_private_data;
1429 /* Recreate the 'private data' */
1430 /* which faad2 uses in its initialization */
1431 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1432 if (!strncmp(&track->codec_id[12], "MAIN", 4))
1433 profile = 0;
1434 else if (!strncmp(&track->codec_id[12], "LC", 2))
1435 profile = 1;
1436 else if (!strncmp(&track->codec_id[12], "SSR", 3))
1437 profile = 2;
1438 else
1439 profile = 3;
1440 sh_a->codecdata = malloc(5);
1441 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xE) >> 1);
1442 sh_a->codecdata[1] =
1443 ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
1445 if (strstr(track->codec_id, "SBR") != NULL) {
1446 /* HE-AAC (aka SBR AAC) */
1447 sh_a->codecdata_len = 5;
1449 sh_a->samplerate *= 2;
1450 sh_a->wf->nSamplesPerSec *= 2;
1451 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1452 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
1453 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
1454 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
1455 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
1456 } else {
1457 sh_a->codecdata_len = 2;
1458 track->default_duration = 1024.0 / sh_a->samplerate;
1460 } else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) {
1461 /* VORBIS */
1462 if (track->private_size == 0 || track->ms_compat && !sh_a->wf->cbSize)
1463 goto error;
1464 if (!track->ms_compat) {
1465 sh_a->wf->cbSize = track->private_size;
1466 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1467 memcpy((unsigned char *) (sh_a->wf + 1), track->private_data,
1468 sh_a->wf->cbSize);
1470 } else if (!strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
1471 if (track->private_size < RAPROPERTIES4_SIZE)
1472 goto error;
1473 /* Common initialization for all RealAudio codecs */
1474 unsigned char *src = track->private_data;
1475 int codecdata_length, version;
1476 int flavor;
1478 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
1480 version = AV_RB16(src + 4);
1481 flavor = AV_RB16(src + 22);
1482 track->coded_framesize = AV_RB32(src + 24);
1483 track->sub_packet_h = AV_RB16(src + 40);
1484 sh_a->wf->nBlockAlign = track->audiopk_size = AV_RB16(src + 42);
1485 track->sub_packet_size = AV_RB16(src + 44);
1486 if (version == 4) {
1487 src += RAPROPERTIES4_SIZE;
1488 src += src[0] + 1;
1489 src += src[0] + 1;
1490 } else
1491 src += RAPROPERTIES5_SIZE;
1493 src += 3;
1494 if (version == 5)
1495 src++;
1496 codecdata_length = AV_RB32(src);
1497 src += 4;
1498 sh_a->wf->cbSize = codecdata_length;
1499 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1500 memcpy(((char *) (sh_a->wf + 1)), src, codecdata_length);
1502 switch (track->a_formattag) {
1503 case mmioFOURCC('a', 't', 'r', 'c'):
1504 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[flavor];
1505 sh_a->wf->nBlockAlign = track->sub_packet_size;
1506 goto audiobuf;
1507 case mmioFOURCC('c', 'o', 'o', 'k'):
1508 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[flavor];
1509 sh_a->wf->nBlockAlign = track->sub_packet_size;
1510 goto audiobuf;
1511 case mmioFOURCC('s', 'i', 'p', 'r'):
1512 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[flavor];
1513 sh_a->wf->nBlockAlign = track->coded_framesize;
1514 goto audiobuf;
1515 case mmioFOURCC('2', '8', '_', '8'):
1516 sh_a->wf->nAvgBytesPerSec = 3600;
1517 sh_a->wf->nBlockAlign = track->coded_framesize;
1518 audiobuf:
1519 track->audio_buf =
1520 malloc(track->sub_packet_h * track->audiopk_size);
1521 track->audio_timestamp =
1522 malloc(track->sub_packet_h * sizeof(double));
1523 break;
1526 track->realmedia = 1;
1527 } else if (!strcmp(track->codec_id, MKV_A_FLAC)
1528 || (track->a_formattag == 0xf1ac)) {
1529 unsigned char *ptr;
1530 int size;
1531 free(sh_a->wf);
1532 sh_a->wf = NULL;
1534 if (!track->ms_compat) {
1535 ptr = track->private_data;
1536 size = track->private_size;
1537 } else {
1538 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
1539 ptr = track->private_data + sizeof(*sh_a->wf);
1540 size = track->private_size - sizeof(*sh_a->wf);
1542 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
1543 || ptr[3] != 'C') {
1544 sh_a->codecdata = malloc(4);
1545 sh_a->codecdata_len = 4;
1546 memcpy(sh_a->codecdata, "fLaC", 4);
1547 } else {
1548 sh_a->codecdata = malloc(size);
1549 sh_a->codecdata_len = size;
1550 memcpy(sh_a->codecdata, ptr, size);
1552 } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') ||
1553 track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) {
1554 copy_private_data:
1555 if (!track->ms_compat && track->private_size) {
1556 sh_a->codecdata = malloc(track->private_size);
1557 sh_a->codecdata_len = track->private_size;
1558 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1560 } else if (!track->ms_compat) {
1561 goto error;
1564 return 0;
1566 error:
1567 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1568 "codec ID '%s' for track %u or missing/faulty\n[mkv] "
1569 "private codec data.\n", track->codec_id, track->tnum);
1570 free_sh_audio(demuxer, track->id);
1571 return 1;
1574 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1575 int sid)
1577 if (track->subtitle_type) {
1578 int size;
1579 uint8_t *buffer;
1580 sh_sub_t *sh = new_sh_sub(demuxer, sid);
1581 track->sh_sub = sh;
1582 sh->type = track->subtitle_type;
1583 size = track->private_size;
1584 demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
1585 if (buffer && buffer != track->private_data) {
1586 talloc_free(track->private_data);
1587 talloc_steal(track, buffer);
1588 track->private_data = buffer;
1589 track->private_size = size;
1591 sh->extradata = malloc(track->private_size);
1592 memcpy(sh->extradata, track->private_data, track->private_size);
1593 sh->extradata_len = track->private_size;
1594 if (track->language && (strcmp(track->language, "und") != 0))
1595 sh->lang = talloc_strdup(sh, track->language);
1596 sh->title = talloc_strdup(sh, track->name);
1597 sh->default_track = track->default_track;
1598 } else {
1599 mp_tmsg(MSGT_DEMUX, MSGL_ERR,
1600 "[mkv] Subtitle type '%s' is not supported.\n",
1601 track->codec_id);
1602 return 1;
1605 return 0;
1608 static void mkv_free(struct demuxer *demuxer)
1610 struct mkv_demuxer *mkv_d = demuxer->priv;
1611 if (!mkv_d)
1612 return;
1613 for (int i = 0; i < mkv_d->num_tracks; i++)
1614 demux_mkv_free_trackentry(mkv_d->tracks[i]);
1615 free(mkv_d->indexes);
1616 free(mkv_d->cluster_positions);
1619 static int demux_mkv_open(demuxer_t *demuxer)
1621 stream_t *s = demuxer->stream;
1622 mkv_demuxer_t *mkv_d;
1623 mkv_track_t *track;
1625 stream_seek(s, s->start_pos);
1626 if (ebml_read_id(s, NULL) != EBML_ID_EBML)
1627 return 0;
1628 struct ebml_ebml ebml_master = {};
1629 struct ebml_parse_ctx parse_ctx = { .no_error_messages = true };
1630 if (ebml_read_element(s, &parse_ctx, &ebml_master, &ebml_ebml_desc) < 0)
1631 return 0;
1632 if (ebml_master.doc_type.start == NULL) {
1633 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] File has EBML header but no doctype."
1634 " Assuming \"matroska\".\n");
1635 } else if (bstrcmp(ebml_master.doc_type, bstr("matroska")) != 0
1636 && bstrcmp(ebml_master.doc_type, bstr("webm")) != 0) {
1637 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] no head found\n");
1638 talloc_free(parse_ctx.talloc_ctx);
1639 return 0;
1641 if (ebml_master.doc_type_read_version > 2) {
1642 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1643 "but we don't support format version %"PRIu64"\n",
1644 ebml_master.doc_type_read_version);
1645 talloc_free(parse_ctx.talloc_ctx);
1646 return 0;
1648 if ((ebml_master.n_ebml_read_version
1649 && ebml_master.ebml_read_version != EBML_VERSION)
1650 || (ebml_master.n_ebml_max_size_length
1651 && ebml_master.ebml_max_size_length > 8)
1652 || (ebml_master.n_ebml_max_id_length
1653 && ebml_master.ebml_max_id_length != 4)) {
1654 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1655 "but the header has bad parameters\n");
1656 talloc_free(parse_ctx.talloc_ctx);
1657 return 0;
1659 talloc_free(parse_ctx.talloc_ctx);
1661 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
1663 if (ebml_read_id(s, NULL) != MATROSKA_ID_SEGMENT) {
1664 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
1665 return 0;
1667 ebml_read_length(s, NULL); /* return bytes number until EOF */
1669 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
1671 mkv_d = talloc_zero(demuxer, struct mkv_demuxer);
1672 demuxer->priv = mkv_d;
1673 mkv_d->tc_scale = 1000000;
1674 mkv_d->segment_start = stream_tell(s);
1676 while (1) {
1677 uint32_t id = ebml_read_id(s, NULL);
1678 if (s->eof) {
1679 mp_tmsg(MSGT_DEMUX, MSGL_ERR, "[mkv] Unexpected end of file\n");
1680 return 0;
1682 if (id == MATROSKA_ID_CLUSTER) {
1683 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cluster, headers are "
1684 "parsed completely :)\n");
1685 stream_seek(s, stream_tell(s) - 4);
1686 break;
1688 int res = read_header_element(demuxer, id, 0);
1689 if (res <= -2)
1690 return 0;
1691 if (res < 0)
1692 break;
1695 display_create_tracks(demuxer);
1697 /* select video track */
1698 track = NULL;
1699 if (demuxer->video->id == -1) { /* automatically select a video track */
1700 /* search for a video track that has the 'default' flag set */
1701 for (int i = 0; i < mkv_d->num_tracks; i++)
1702 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1703 && mkv_d->tracks[i]->default_track) {
1704 track = mkv_d->tracks[i];
1705 break;
1708 if (track == NULL)
1709 /* no track has the 'default' flag set */
1710 /* let's take the first video track */
1711 for (int i = 0; i < mkv_d->num_tracks; i++)
1712 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1713 && mkv_d->tracks[i]->id >= 0) {
1714 track = mkv_d->tracks[i];
1715 break;
1717 } else if (demuxer->video->id != -2) /* -2 = no video at all */
1718 track = find_track_by_num(mkv_d, demuxer->video->id,
1719 MATROSKA_TRACK_VIDEO);
1721 if (track && demuxer->v_streams[track->id]) {
1722 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u.\n",
1723 track->tnum);
1724 demuxer->video->id = track->id;
1725 demuxer->video->sh = demuxer->v_streams[track->id];
1726 } else {
1727 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
1728 demuxer->video->id = -2;
1731 demuxer->audio->id = -2; // wait for higher-level code to select track
1733 if (s->end_pos == 0)
1734 demuxer->seekable = 0;
1735 else {
1736 demuxer->movi_start = s->start_pos;
1737 demuxer->movi_end = s->end_pos;
1738 demuxer->seekable = 1;
1741 demuxer->accurate_seek = true;
1743 return DEMUXER_TYPE_MATROSKA;
1746 static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
1747 uint8_t *laces,
1748 uint32_t **all_lace_sizes)
1750 uint32_t total = 0;
1751 uint32_t *lace_size = NULL;
1752 uint8_t flags;
1753 int i;
1755 *all_lace_sizes = NULL;
1756 /* lacing flags */
1757 if (*size < 1)
1758 goto error;
1759 flags = *buffer++;
1760 (*size)--;
1762 switch ((flags & 0x06) >> 1) {
1763 case 0: /* no lacing */
1764 *laces = 1;
1765 lace_size = calloc(*laces, sizeof(uint32_t));
1766 lace_size[0] = *size;
1767 break;
1769 case 1: /* xiph lacing */
1770 case 2: /* fixed-size lacing */
1771 case 3: /* EBML lacing */
1772 if (*size < 1)
1773 goto error;
1774 *laces = *buffer++;
1775 (*size)--;
1776 (*laces)++;
1777 lace_size = calloc(*laces, sizeof(uint32_t));
1779 switch ((flags & 0x06) >> 1) {
1780 case 1: /* xiph lacing */
1781 for (i = 0; i < *laces - 1; i++) {
1782 lace_size[i] = 0;
1783 do {
1784 if (!*size)
1785 goto error;
1786 lace_size[i] += *buffer;
1787 (*size)--;
1788 } while (*buffer++ == 0xFF);
1789 if (lace_size[i] > *size - total || total > *size)
1790 goto error;
1791 total += lace_size[i];
1793 lace_size[i] = *size - total;
1794 break;
1796 case 2: /* fixed-size lacing */
1797 for (i = 0; i < *laces; i++)
1798 lace_size[i] = *size / *laces;
1799 break;
1801 case 3:; /* EBML lacing */
1802 int l;
1803 uint64_t num = ebml_read_vlen_uint(buffer, &l);
1804 if (num == EBML_UINT_INVALID)
1805 goto error;
1806 buffer += l;
1807 if (*size < l)
1808 goto error;
1809 *size -= l;
1810 if (num > *size)
1811 goto error;
1813 total = lace_size[0] = num;
1814 for (i = 1; i < *laces - 1; i++) {
1815 int64_t snum = ebml_read_vlen_int(buffer, &l);
1816 if (snum == EBML_INT_INVALID)
1817 goto error;
1818 buffer += l;
1819 if (*size < l)
1820 goto error;
1821 *size -= l;
1822 lace_size[i] = lace_size[i - 1] + snum;
1823 if (lace_size[i] > *size - total || total > *size)
1824 goto error;
1825 total += lace_size[i];
1827 lace_size[i] = *size - total;
1828 break;
1830 break;
1832 *all_lace_sizes = lace_size;
1833 return 0;
1835 error:
1836 free(lace_size);
1837 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Bad input [lacing]\n");
1838 return 1;
1841 static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
1842 uint8_t *buffer, uint32_t size, bool keyframe)
1844 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1845 demux_packet_t *dp;
1846 uint32_t timestamp = mkv_d->last_pts * 1000;
1848 dp = new_demux_packet(size);
1849 memcpy(dp->buffer, buffer, size);
1851 if (mkv_d->v_skip_to_keyframe) {
1852 dp->pts = mkv_d->last_pts;
1853 track->rv_kf_base = 0;
1854 track->rv_kf_pts = timestamp;
1855 } else
1856 dp->pts =
1857 real_fix_timestamp(dp->buffer, timestamp,
1858 ((sh_video_t *) demuxer->video->sh)->bih->
1859 biCompression, &track->rv_kf_base,
1860 &track->rv_kf_pts, NULL);
1861 dp->pos = demuxer->filepos;
1862 dp->keyframe = keyframe;
1864 ds_add_packet(demuxer->video, dp);
1867 static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
1868 uint8_t *buffer, uint32_t size, bool keyframe)
1870 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1871 int sps = track->sub_packet_size;
1872 int sph = track->sub_packet_h;
1873 int cfs = track->coded_framesize;
1874 int w = track->audiopk_size;
1875 int spc = track->sub_packet_cnt;
1876 demux_packet_t *dp;
1877 int x;
1879 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8'))
1880 || (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k'))
1881 || (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c'))
1882 || (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) {
1883 // if(!block_bref)
1884 // spc = track->sub_packet_cnt = 0;
1885 switch (track->a_formattag) {
1886 case mmioFOURCC('2', '8', '_', '8'):
1887 for (x = 0; x < sph / 2; x++)
1888 memcpy(track->audio_buf + x * 2 * w + spc * cfs,
1889 buffer + cfs * x, cfs);
1890 break;
1891 case mmioFOURCC('c', 'o', 'o', 'k'):
1892 case mmioFOURCC('a', 't', 'r', 'c'):
1893 for (x = 0; x < w / sps; x++)
1894 memcpy(track->audio_buf +
1895 sps * (sph * x + ((sph + 1) / 2) * (spc & 1) +
1896 (spc >> 1)), buffer + sps * x, sps);
1897 break;
1898 case mmioFOURCC('s', 'i', 'p', 'r'):
1899 memcpy(track->audio_buf + spc * w, buffer, w);
1900 if (spc == sph - 1) {
1901 int n;
1902 int bs = sph * w * 2 / 96; // nibbles per subpacket
1903 // Perform reordering
1904 for (n = 0; n < 38; n++) {
1905 int j;
1906 int i = bs * sipr_swaps[n][0];
1907 int o = bs * sipr_swaps[n][1];
1908 // swap nibbles of block 'i' with 'o' TODO: optimize
1909 for (j = 0; j < bs; j++) {
1910 int x = (i & 1) ?
1911 (track->audio_buf[i >> 1] >> 4) :
1912 (track->audio_buf[i >> 1] & 0x0F);
1913 int y = (o & 1) ?
1914 (track->audio_buf[o >> 1] >> 4) :
1915 (track->audio_buf[o >> 1] & 0x0F);
1916 if (o & 1)
1917 track->audio_buf[o >> 1] =
1918 (track->audio_buf[o >> 1] & 0x0F) | (x << 4);
1919 else
1920 track->audio_buf[o >> 1] =
1921 (track->audio_buf[o >> 1] & 0xF0) | x;
1922 if (i & 1)
1923 track->audio_buf[i >> 1] =
1924 (track->audio_buf[i >> 1] & 0x0F) | (y << 4);
1925 else
1926 track->audio_buf[i >> 1] =
1927 (track->audio_buf[i >> 1] & 0xF0) | y;
1928 ++i;
1929 ++o;
1933 break;
1935 track->audio_timestamp[track->sub_packet_cnt] =
1936 (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
1937 track->ra_pts = mkv_d->last_pts;
1938 if (track->sub_packet_cnt == 0)
1939 track->audio_filepos = demuxer->filepos;
1940 if (++(track->sub_packet_cnt) == sph) {
1941 int apk_usize =
1942 ((sh_audio_t *) demuxer->audio->sh)->wf->nBlockAlign;
1943 track->sub_packet_cnt = 0;
1944 // Release all the audio packets
1945 for (x = 0; x < sph * w / apk_usize; x++) {
1946 dp = new_demux_packet(apk_usize);
1947 memcpy(dp->buffer, track->audio_buf + x * apk_usize,
1948 apk_usize);
1949 /* Put timestamp only on packets that correspond to original
1950 * audio packets in file */
1951 dp->pts = (x * apk_usize % w) ? 0 :
1952 track->audio_timestamp[x * apk_usize / w];
1953 dp->pos = track->audio_filepos; // all equal
1954 dp->keyframe = !x; // Mark first packet as keyframe
1955 ds_add_packet(demuxer->audio, dp);
1958 } else { // Not a codec that require reordering
1959 dp = new_demux_packet(size);
1960 memcpy(dp->buffer, buffer, size);
1961 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
1962 dp->pts = 0;
1963 else
1964 dp->pts = mkv_d->last_pts;
1965 track->ra_pts = mkv_d->last_pts;
1967 dp->pos = demuxer->filepos;
1968 dp->keyframe = keyframe;
1969 ds_add_packet(demuxer->audio, dp);
1973 static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
1974 uint64_t block_duration, bool keyframe,
1975 bool simpleblock)
1977 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1978 mkv_track_t *track = NULL;
1979 demux_stream_t *ds = NULL;
1980 uint64_t old_length;
1981 uint64_t tc;
1982 uint32_t *lace_size;
1983 uint8_t laces, flags;
1984 int i, num, tmp, use_this_block = 1;
1985 double current_pts;
1986 int16_t time;
1988 /* first byte(s): track num */
1989 num = ebml_read_vlen_uint(block, &tmp);
1990 block += tmp;
1991 /* time (relative to cluster time) */
1992 time = block[0] << 8 | block[1];
1993 block += 2;
1994 length -= tmp + 2;
1995 old_length = length;
1996 flags = block[0];
1997 if (simpleblock)
1998 keyframe = flags & 0x80;
1999 if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
2000 return 0;
2001 block += old_length - length;
2003 tc = time * mkv_d->tc_scale + mkv_d->cluster_tc;
2004 current_pts = tc / 1e9;
2006 for (i = 0; i < mkv_d->num_tracks; i++)
2007 if (mkv_d->tracks[i]->tnum == num) {
2008 track = mkv_d->tracks[i];
2009 break;
2011 if (track == NULL) {
2012 free(lace_size);
2013 return 1;
2015 if (track->type == MATROSKA_TRACK_AUDIO
2016 && track->id == demuxer->audio->id) {
2017 ds = demuxer->audio;
2019 if (mkv_d->a_skip_to_keyframe)
2020 use_this_block = keyframe;
2021 if (mkv_d->v_skip_to_keyframe)
2022 use_this_block = 0;
2024 if (track->fix_i_bps && use_this_block) {
2025 sh_audio_t *sh = (sh_audio_t *) ds->sh;
2027 if (block_duration != 0) {
2028 sh->i_bps = length * 1e9 / block_duration;
2029 track->fix_i_bps = 0;
2030 } else if (track->qt_last_a_pts == 0.0)
2031 track->qt_last_a_pts = current_pts;
2032 else if (track->qt_last_a_pts != current_pts) {
2033 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
2034 track->fix_i_bps = 0;
2037 } else if (tc < mkv_d->skip_to_timecode)
2038 use_this_block = 0;
2039 else if (track->type == MATROSKA_TRACK_VIDEO
2040 && track->id == demuxer->video->id) {
2041 ds = demuxer->video;
2042 if (mkv_d->v_skip_to_keyframe)
2043 use_this_block = keyframe;
2044 } else if (track->type == MATROSKA_TRACK_SUBTITLE
2045 && track->id == demuxer->sub->id) {
2046 ds = demuxer->sub;
2047 if (laces > 1) {
2048 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Subtitles use Matroska "
2049 "lacing. This is abnormal and not supported.\n");
2050 use_this_block = 0;
2052 } else
2053 use_this_block = 0;
2055 if (use_this_block) {
2056 mkv_d->last_pts = current_pts;
2057 mkv_d->last_filepos = demuxer->filepos;
2059 for (i = 0; i < laces; i++) {
2060 if (ds == demuxer->video && track->realmedia)
2061 handle_realvideo(demuxer, track, block, lace_size[i],
2062 keyframe);
2063 else if (ds == demuxer->audio && track->realmedia)
2064 handle_realaudio(demuxer, track, block, lace_size[i],
2065 keyframe);
2066 else {
2067 int size = lace_size[i];
2068 demux_packet_t *dp;
2069 uint8_t *buffer;
2070 demux_mkv_decode(track, block, &buffer, &size, 1);
2071 if (buffer) {
2072 dp = new_demux_packet(size);
2073 memcpy(dp->buffer, buffer, size);
2074 if (buffer != block)
2075 talloc_free(buffer);
2076 dp->keyframe = keyframe;
2077 /* If default_duration is 0, assume no pts value is known
2078 * for packets after the first one (rather than all pts
2079 * values being the same) */
2080 if (i == 0 || track->default_duration)
2081 dp->pts =
2082 mkv_d->last_pts + i * track->default_duration;
2083 dp->duration = block_duration / 1e9;
2084 ds_add_packet(ds, dp);
2087 block += lace_size[i];
2090 if (ds == demuxer->video) {
2091 mkv_d->v_skip_to_keyframe = 0;
2092 mkv_d->skip_to_timecode = 0;
2093 } else if (ds == demuxer->audio)
2094 mkv_d->a_skip_to_keyframe = 0;
2096 free(lace_size);
2097 return 1;
2100 free(lace_size);
2101 return 0;
2104 static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
2106 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2107 stream_t *s = demuxer->stream;
2108 uint64_t l;
2109 int il, tmp;
2111 while (1) {
2112 while (mkv_d->cluster_size > 0) {
2113 uint64_t block_duration = 0, block_length = 0;
2114 bool keyframe = true;
2115 uint8_t *block = NULL;
2117 while (mkv_d->blockgroup_size > 0) {
2118 switch (ebml_read_id(s, &il)) {
2119 case MATROSKA_ID_BLOCKDURATION:
2120 block_duration = ebml_read_uint(s, &l);
2121 if (block_duration == EBML_UINT_INVALID) {
2122 free(block);
2123 return 0;
2125 block_duration *= mkv_d->tc_scale;
2126 break;
2128 case MATROSKA_ID_BLOCK:
2129 block_length = ebml_read_length(s, &tmp);
2130 free(block);
2131 if (block_length > 500000000)
2132 return 0;
2133 block = malloc(block_length + AV_LZO_INPUT_PADDING);
2134 demuxer->filepos = stream_tell(s);
2135 if (stream_read(s, block, block_length) !=
2136 (int) block_length) {
2137 free(block);
2138 return 0;
2140 l = tmp + block_length;
2141 break;
2143 case MATROSKA_ID_REFERENCEBLOCK:;
2144 int64_t num = ebml_read_int(s, &l);
2145 if (num == EBML_INT_INVALID) {
2146 free(block);
2147 return 0;
2149 if (num)
2150 keyframe = false;
2151 break;
2153 case EBML_ID_INVALID:
2154 free(block);
2155 return 0;
2157 default:
2158 ebml_read_skip(s, &l);
2159 break;
2161 mkv_d->blockgroup_size -= l + il;
2162 mkv_d->cluster_size -= l + il;
2165 if (block) {
2166 int res = handle_block(demuxer, block, block_length,
2167 block_duration, keyframe, false);
2168 free(block);
2169 if (res < 0)
2170 return 0;
2171 if (res)
2172 return 1;
2175 if (mkv_d->cluster_size > 0) {
2176 switch (ebml_read_id(s, &il)) {
2177 case MATROSKA_ID_TIMECODE:;
2178 uint64_t num = ebml_read_uint(s, &l);
2179 if (num == EBML_UINT_INVALID)
2180 return 0;
2181 mkv_d->cluster_tc = num * mkv_d->tc_scale;
2182 add_cluster_position(mkv_d, mkv_d->cluster_start,
2183 mkv_d->cluster_tc);
2184 break;
2186 case MATROSKA_ID_BLOCKGROUP:
2187 mkv_d->blockgroup_size = ebml_read_length(s, &tmp);
2188 l = tmp;
2189 break;
2191 case MATROSKA_ID_SIMPLEBLOCK:;
2192 int res;
2193 block_length = ebml_read_length(s, &tmp);
2194 if (block_length > 500000000)
2195 return 0;
2196 block = malloc(block_length);
2197 demuxer->filepos = stream_tell(s);
2198 if (stream_read(s, block, block_length) !=
2199 (int) block_length) {
2200 free(block);
2201 return 0;
2203 l = tmp + block_length;
2204 res = handle_block(demuxer, block, block_length,
2205 block_duration, false, true);
2206 free(block);
2207 mkv_d->cluster_size -= l + il;
2208 if (res < 0)
2209 return 0;
2210 else if (res)
2211 return 1;
2212 else
2213 mkv_d->cluster_size += l + il;
2214 break;
2216 case EBML_ID_INVALID:
2217 return 0;
2219 default:
2220 ebml_read_skip(s, &l);
2221 break;
2223 mkv_d->cluster_size -= l + il;
2227 while (ebml_read_id(s, &il) != MATROSKA_ID_CLUSTER) {
2228 ebml_read_skip(s, NULL);
2229 if (s->eof)
2230 return 0;
2232 mkv_d->cluster_start = stream_tell(s) - il;
2233 mkv_d->cluster_size = ebml_read_length(s, NULL);
2236 return 0;
2239 static int seek_creating_index(struct demuxer *demuxer, float rel_seek_secs,
2240 int flags)
2242 struct mkv_demuxer *mkv_d = demuxer->priv;
2243 struct stream *s = demuxer->stream;
2244 int64_t target_tc_ns = (int64_t) (rel_seek_secs * 1e9);
2245 if (target_tc_ns < 0)
2246 target_tc_ns = 0;
2247 uint64_t max_filepos = 0;
2248 int64_t max_tc = -1;
2249 int n = mkv_d->num_cluster_pos;
2250 if (n > 0) {
2251 max_filepos = mkv_d->cluster_positions[n - 1].filepos;
2252 max_tc = mkv_d->cluster_positions[n - 1].timecode;
2255 if (target_tc_ns > max_tc) {
2256 if ((off_t) max_filepos > stream_tell(s))
2257 stream_seek(s, max_filepos);
2258 else
2259 stream_seek(s, stream_tell(s) + mkv_d->cluster_size);
2260 /* parse all the clusters upto target_filepos */
2261 while (!s->eof) {
2262 uint64_t start = stream_tell(s);
2263 uint32_t type = ebml_read_id(s, NULL);
2264 uint64_t len = ebml_read_length(s, NULL);
2265 uint64_t end = stream_tell(s) + len;
2266 if (type == MATROSKA_ID_CLUSTER) {
2267 while (!s->eof && stream_tell(s) < end) {
2268 if (ebml_read_id(s, NULL) == MATROSKA_ID_TIMECODE) {
2269 uint64_t tc = ebml_read_uint(s, NULL);
2270 tc *= mkv_d->tc_scale;
2271 add_cluster_position(mkv_d, start, tc);
2272 if (tc >= target_tc_ns)
2273 goto enough_index;
2274 break;
2278 if (s->eof)
2279 break;
2280 stream_seek(s, end);
2282 enough_index:
2283 if (s->eof)
2284 stream_reset(s);
2286 if (!mkv_d->num_cluster_pos) {
2287 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] no target for seek found\n");
2288 return -1;
2290 uint64_t cluster_pos = mkv_d->cluster_positions[0].filepos;
2291 /* Let's find the nearest cluster */
2292 int64_t min_diff = 0xFFFFFFFFFFFFFFF;
2293 for (int i = 0; i < mkv_d->num_cluster_pos; i++) {
2294 int64_t diff = mkv_d->cluster_positions[i].timecode - target_tc_ns;
2295 if (flags & SEEK_BACKWARD && diff < 0 && -diff < min_diff) {
2296 cluster_pos = mkv_d->cluster_positions[i].filepos;
2297 min_diff = -diff;
2298 } else if (flags & SEEK_FORWARD
2299 && (diff < 0 ? -1 * diff : diff) < min_diff) {
2300 cluster_pos = mkv_d->cluster_positions[i].filepos;
2301 min_diff = diff < 0 ? -1 * diff : diff;
2304 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2305 stream_seek(s, cluster_pos);
2306 return 0;
2309 static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
2310 int64_t target_timecode, int flags)
2312 struct mkv_demuxer *mkv_d = demuxer->priv;
2313 struct mkv_index *index = NULL;
2315 /* Find the entry in the index closest to the target timecode in the
2316 * give direction. If there are no such entries - we're trying to seek
2317 * backward from a target time before the first entry or forward from a
2318 * target time after the last entry - then still seek to the first/last
2319 * entry if that's further in the direction wanted than mkv_d->last_pts.
2321 int64_t min_diff = target_timecode - (int64_t)(mkv_d->last_pts * 1e9 + 0.5);
2322 if (flags & SEEK_BACKWARD)
2323 min_diff = -min_diff;
2324 min_diff = FFMAX(min_diff, 1);
2325 for (int i = 0; i < mkv_d->num_indexes; i++)
2326 if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
2327 int64_t diff =
2328 target_timecode -
2329 (int64_t) (mkv_d->indexes[i].timecode * mkv_d->tc_scale);
2330 if (flags & SEEK_BACKWARD)
2331 diff = -diff;
2332 if (diff <= 0) {
2333 if (min_diff <= 0 && diff <= min_diff)
2334 continue;
2335 } else if (diff >= min_diff)
2336 continue;
2337 min_diff = diff;
2338 index = mkv_d->indexes + i;
2341 if (index) { /* We've found an entry. */
2342 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2343 stream_seek(demuxer->stream, index->filepos);
2345 return index;
2348 static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
2349 float audio_delay, int flags)
2351 mkv_demuxer_t *mkv_d = demuxer->priv;
2352 uint64_t v_tnum = -1;
2353 if (demuxer->video->id >= 0)
2354 v_tnum = find_track_by_num(mkv_d, demuxer->video->id,
2355 MATROSKA_TRACK_VIDEO)->tnum;
2356 uint64_t a_tnum = -1;
2357 if (demuxer->audio->id >= 0)
2358 a_tnum = find_track_by_num(mkv_d, demuxer->audio->id,
2359 MATROSKA_TRACK_AUDIO)->tnum;
2360 if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
2361 if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
2362 flags |= SEEK_BACKWARD;
2363 else
2364 flags |= SEEK_FORWARD;
2366 // Adjust the target a little bit to catch cases where the target position
2367 // specifies a keyframe with high, but not perfect, precision.
2368 rel_seek_secs += flags & SEEK_FORWARD ? -0.005 : 0.005;
2370 if (!(flags & SEEK_FACTOR)) { /* time in secs */
2371 mkv_index_t *index = NULL;
2373 if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
2374 rel_seek_secs += mkv_d->last_pts;
2375 rel_seek_secs = FFMAX(rel_seek_secs, 0);
2376 int64_t target_timecode = rel_seek_secs * 1e9 + 0.5;
2378 if (mkv_d->indexes == NULL) { /* no index was found */
2379 if (seek_creating_index(demuxer, rel_seek_secs, flags) < 0)
2380 return;
2381 } else {
2382 int seek_id = (demuxer->video->id < 0) ?
2383 a_tnum : v_tnum;
2384 index = seek_with_cues(demuxer, seek_id, target_timecode, flags);
2385 if (!index)
2386 index = seek_with_cues(demuxer, -1, target_timecode, flags);
2389 if (demuxer->video->id >= 0)
2390 mkv_d->v_skip_to_keyframe = 1;
2391 if (flags & SEEK_FORWARD)
2392 mkv_d->skip_to_timecode = target_timecode;
2393 else
2394 mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale
2395 : 0;
2396 mkv_d->a_skip_to_keyframe = 1;
2398 demux_mkv_fill_buffer(demuxer, NULL);
2399 } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
2400 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2401 else {
2402 stream_t *s = demuxer->stream;
2403 uint64_t target_filepos;
2404 mkv_index_t *index = NULL;
2405 int i;
2407 if (mkv_d->indexes == NULL) { /* not implemented without index */
2408 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2409 return;
2412 target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
2413 for (i = 0; i < mkv_d->num_indexes; i++)
2414 if (mkv_d->indexes[i].tnum == v_tnum)
2415 if ((index == NULL)
2416 || ((mkv_d->indexes[i].filepos >= target_filepos)
2417 && ((index->filepos < target_filepos)
2418 || (mkv_d->indexes[i].filepos < index->filepos))))
2419 index = &mkv_d->indexes[i];
2421 if (!index)
2422 return;
2424 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2425 stream_seek(s, index->filepos);
2427 if (demuxer->video->id >= 0)
2428 mkv_d->v_skip_to_keyframe = 1;
2429 mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale;
2430 mkv_d->a_skip_to_keyframe = 1;
2432 demux_mkv_fill_buffer(demuxer, NULL);
2436 static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
2438 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2440 switch (cmd) {
2441 case DEMUXER_CTRL_CORRECT_PTS:
2442 return DEMUXER_CTRL_OK;
2443 case DEMUXER_CTRL_GET_TIME_LENGTH:
2444 if (mkv_d->duration == 0)
2445 return DEMUXER_CTRL_DONTKNOW;
2447 *((double *) arg) = (double) mkv_d->duration;
2448 return DEMUXER_CTRL_OK;
2450 case DEMUXER_CTRL_GET_PERCENT_POS:
2451 if (mkv_d->duration == 0) {
2452 return DEMUXER_CTRL_DONTKNOW;
2455 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
2456 return DEMUXER_CTRL_OK;
2458 case DEMUXER_CTRL_SWITCH_AUDIO:;
2459 int new_aid = *(int *) arg;
2460 int current_aid = demuxer->audio->id;
2461 if (current_aid < 0)
2462 current_aid = -1;
2463 if (new_aid == -1) { // cycle to next
2464 new_aid = current_aid;
2465 while (1) {
2466 new_aid = (new_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
2467 if (new_aid == -1 || demuxer->a_streams[new_aid])
2468 break;
2471 if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks ||
2472 !demuxer->a_streams[new_aid])
2473 new_aid = -2;
2474 *(int *) arg = new_aid;
2475 if (current_aid != new_aid)
2476 ds_free_packs(demuxer->audio);
2477 demuxer->audio->id = new_aid;
2478 return DEMUXER_CTRL_OK;
2480 case DEMUXER_CTRL_SWITCH_VIDEO:;
2481 int new_vid = *(int *) arg;
2482 int current_vid = demuxer->video->id;
2483 if (current_vid < 0)
2484 current_vid = -1;
2485 if (new_vid == -1) { // cycle to next
2486 new_vid = current_vid;
2487 while (1) {
2488 new_vid = (new_vid + 2) % (mkv_d->num_video_tracks + 1) - 1;
2489 if (new_vid == -1 || demuxer->v_streams[new_vid])
2490 break;
2493 if (new_vid < 0 || new_vid >= mkv_d->num_video_tracks ||
2494 !demuxer->v_streams[new_vid])
2495 new_vid = -2;
2496 *(int *) arg = new_vid;
2497 if (current_vid != new_vid)
2498 ds_free_packs(demuxer->video);
2499 demuxer->video->id = new_vid;
2500 return DEMUXER_CTRL_OK;
2502 default:
2503 return DEMUXER_CTRL_NOTIMPL;
2507 const demuxer_desc_t demuxer_desc_matroska = {
2508 "Matroska demuxer",
2509 "mkv",
2510 "Matroska",
2511 "Aurelien Jacobs",
2513 DEMUXER_TYPE_MATROSKA,
2514 1, // safe autodetect
2515 demux_mkv_open,
2516 demux_mkv_fill_buffer,
2517 NULL,
2518 mkv_free,
2519 demux_mkv_seek,
2520 demux_mkv_control