vo_glamo: sub.h was moved to sub directory in c9026cb3210205b07e2e068467a18ee40f9259a3
[mplayer/glamo.git] / libmpdemux / demux_mkv.c
blob7432b59d46fd72eabad27ae6923c5b41a8128ccf
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 "bstr.h"
35 #include "stream/stream.h"
36 #include "demuxer.h"
37 #include "stheader.h"
38 #include "ebml.h"
39 #include "matroska.h"
40 #include "demux_real.h"
42 #include "mp_msg.h"
44 #include "sub/sub.h"
46 #include "libavutil/common.h"
48 #ifdef CONFIG_QTX_CODECS
49 #include "loader/qtx/qtxsdk/components.h"
50 #endif
52 #if CONFIG_ZLIB
53 #include <zlib.h>
54 #endif
56 #include "libavutil/lzo.h"
57 #include "ffmpeg_files/intreadwrite.h"
58 #include "libavutil/avstring.h"
60 static const unsigned char sipr_swaps[38][2] = {
61 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
62 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
63 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
64 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
65 {77,80}
68 // Map flavour to bytes per second
69 #define SIPR_FLAVORS 4
70 #define ATRC_FLAVORS 8
71 #define COOK_FLAVORS 34
72 static const int sipr_fl2bps[SIPR_FLAVORS] = { 813, 1062, 625, 2000 };
73 static const int atrc_fl2bps[ATRC_FLAVORS] = {
74 8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100 };
75 static const int cook_fl2bps[COOK_FLAVORS] = {
76 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
77 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
78 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
79 12016, 16408, 22911, 33506
82 typedef struct mkv_content_encoding {
83 uint64_t order, type, scope;
84 uint64_t comp_algo;
85 uint8_t *comp_settings;
86 int comp_settings_len;
87 } mkv_content_encoding_t;
89 typedef struct mkv_track {
90 int tnum;
91 char *name;
92 int id; // -aid / -sid / -vid option value
94 char *codec_id;
95 int ms_compat;
96 char *language;
98 int type;
100 uint32_t v_width, v_height, v_dwidth, v_dheight;
101 double v_frate;
103 uint32_t a_formattag;
104 uint32_t a_channels, a_bps;
105 float a_sfreq;
106 float a_osfreq;
108 double default_duration;
110 int default_track;
112 unsigned char *private_data;
113 unsigned int private_size;
115 /* stuff for realmedia */
116 int realmedia;
117 int64_t rv_kf_base;
118 int rv_kf_pts;
119 double rv_pts; /* previous video timestamp */
120 double ra_pts; /* previous audio timestamp */
122 /** realaudio descrambling */
123 int sub_packet_size; ///< sub packet size, per stream
124 int sub_packet_h; ///< number of coded frames per block
125 int coded_framesize; ///< coded frame size, per stream
126 int audiopk_size; ///< audio packet size
127 unsigned char *audio_buf; ///< place to store reordered audio data
128 double *audio_timestamp; ///< timestamp for each audio packet
129 int sub_packet_cnt; ///< number of subpacket already received
130 int audio_filepos; ///< file position of first audio packet in block
132 /* stuff for quicktime */
133 int fix_i_bps;
134 double qt_last_a_pts;
136 int subtitle_type;
138 /* generic content encoding support */
139 mkv_content_encoding_t *encodings;
140 int num_encodings;
142 /* For VobSubs and SSA/ASS */
143 sh_sub_t *sh_sub;
144 } mkv_track_t;
146 typedef struct mkv_index {
147 int tnum;
148 uint64_t timecode, filepos;
149 } mkv_index_t;
151 typedef struct mkv_demuxer {
152 off_t segment_start;
154 double duration, last_pts;
155 uint64_t last_filepos;
157 mkv_track_t **tracks;
158 int num_tracks;
160 uint64_t tc_scale, cluster_tc;
162 uint64_t cluster_start;
163 uint64_t cluster_size;
164 uint64_t blockgroup_size;
166 mkv_index_t *indexes;
167 int num_indexes;
169 off_t *parsed_pos;
170 int num_parsed_pos;
171 bool parsed_info;
172 bool parsed_tracks;
173 bool parsed_tags;
174 bool parsed_chapters;
175 bool parsed_attachments;
177 struct cluster_pos {
178 uint64_t filepos;
179 uint64_t timecode;
180 } *cluster_positions;
181 int num_cluster_pos;
183 uint64_t skip_to_timecode;
184 int v_skip_to_keyframe, a_skip_to_keyframe;
186 int num_audio_tracks;
187 } mkv_demuxer_t;
189 #define REALHEADER_SIZE 16
190 #define RVPROPERTIES_SIZE 34
191 #define RAPROPERTIES4_SIZE 56
192 #define RAPROPERTIES5_SIZE 70
195 * \brief ensures there is space for at least one additional element
196 * \param array array to grow
197 * \param nelem current number of elements in array
198 * \param elsize size of one array element
200 static void *grow_array(void *array, int nelem, size_t elsize)
202 if (!(nelem & 31))
203 array = realloc(array, (nelem + 32) * elsize);
204 return array;
207 static bool is_parsed_header(struct mkv_demuxer *mkv_d, off_t pos)
209 int low = 0;
210 int high = mkv_d->num_parsed_pos;
211 while (high > low + 1) {
212 int mid = high + low >> 1;
213 if (mkv_d->parsed_pos[mid] > pos)
214 high = mid;
215 else
216 low = mid;
218 if (mkv_d->num_parsed_pos && mkv_d->parsed_pos[low] == pos)
219 return true;
220 if (!(mkv_d->num_parsed_pos & 31))
221 mkv_d->parsed_pos = talloc_realloc(mkv_d, mkv_d->parsed_pos, off_t,
222 mkv_d->num_parsed_pos + 32);
223 mkv_d->num_parsed_pos++;
224 for (int i = mkv_d->num_parsed_pos - 1; i > low; i--)
225 mkv_d->parsed_pos[i] = mkv_d->parsed_pos[i - 1];
226 mkv_d->parsed_pos[low] = pos;
227 return false;
230 static mkv_track_t *find_track_by_num(struct mkv_demuxer *d, int n, int type)
232 for (int i = 0; i < d->num_tracks; i++)
233 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
234 if (d->tracks[i]->id == n)
235 return d->tracks[i];
237 return NULL;
240 static void add_cluster_position(mkv_demuxer_t *mkv_d, uint64_t filepos,
241 uint64_t timecode)
243 if (mkv_d->indexes)
244 return;
246 int n = mkv_d->num_cluster_pos;
247 if (n > 0 && mkv_d->cluster_positions[n-1].filepos >= filepos)
248 return;
250 mkv_d->cluster_positions =
251 grow_array(mkv_d->cluster_positions, mkv_d->num_cluster_pos,
252 sizeof(*mkv_d->cluster_positions));
253 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = (struct cluster_pos){
254 .filepos = filepos,
255 .timecode = timecode,
260 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
261 static int aac_get_sample_rate_index(uint32_t sample_rate)
263 static const int srates[] = {
264 92017, 75132, 55426, 46009, 37566, 27713,
265 23004, 18783, 13856, 11502, 9391, 0
267 int i = 0;
268 while (sample_rate < srates[i])
269 i++;
270 return i;
273 static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
274 uint8_t **dest, uint32_t *size, uint32_t type)
276 uint8_t *orig_src = src;
278 *dest = src;
280 for (int i = 0; i < track->num_encodings; i++) {
281 struct mkv_content_encoding *enc = track->encodings + i;
282 if (!(enc->scope & type))
283 continue;
285 if (src != *dest && src != orig_src)
286 talloc_free(src);
287 src = *dest; // output from last iteration is new source
289 if (enc->comp_algo == 0) {
290 #if CONFIG_ZLIB
291 /* zlib encoded track */
293 if (*size == 0)
294 continue;
296 z_stream zstream;
298 zstream.zalloc = (alloc_func) 0;
299 zstream.zfree = (free_func) 0;
300 zstream.opaque = (voidpf) 0;
301 if (inflateInit(&zstream) != Z_OK) {
302 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
303 "[mkv] zlib initialization failed.\n");
304 goto error;
306 zstream.next_in = (Bytef *) src;
307 zstream.avail_in = *size;
309 *dest = NULL;
310 zstream.avail_out = *size;
311 int result;
312 do {
313 *size += 4000;
314 *dest = talloc_realloc_size(NULL, *dest, *size);
315 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
316 result = inflate(&zstream, Z_NO_FLUSH);
317 if (result != Z_OK && result != Z_STREAM_END) {
318 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
319 "[mkv] zlib decompression failed.\n");
320 talloc_free(*dest);
321 *dest = NULL;
322 inflateEnd(&zstream);
323 goto error;
325 zstream.avail_out += 4000;
326 } while (zstream.avail_out == 4000 && zstream.avail_in != 0
327 && result != Z_STREAM_END);
329 *size = zstream.total_out;
330 inflateEnd(&zstream);
331 #endif
332 } else if (enc->comp_algo == 2) {
333 /* lzo encoded track */
334 int out_avail;
335 int dstlen = *size * 3;
337 *dest = NULL;
338 while (1) {
339 int srclen = *size;
340 *dest = talloc_realloc_size(NULL, *dest,
341 dstlen + AV_LZO_OUTPUT_PADDING);
342 out_avail = dstlen;
343 int result = av_lzo1x_decode(*dest, &out_avail, src, &srclen);
344 if (result == 0)
345 break;
346 if (!(result & AV_LZO_OUTPUT_FULL)) {
347 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
348 "[mkv] lzo decompression failed.\n");
349 talloc_free(*dest);
350 *dest = NULL;
351 goto error;
353 mp_msg(MSGT_DEMUX, MSGL_DBG2,
354 "[mkv] lzo decompression buffer too small.\n");
355 dstlen *= 2;
357 *size = dstlen - out_avail;
358 } else if (enc->comp_algo == 3) {
359 *dest = talloc_size(NULL, *size + enc->comp_settings_len);
360 memcpy(*dest, enc->comp_settings, enc->comp_settings_len);
361 memcpy(*dest + enc->comp_settings_len, src, *size);
362 *size += enc->comp_settings_len;
366 error:
367 if (src != *dest && src != orig_src)
368 talloc_free(src);
372 static int demux_mkv_read_info(demuxer_t *demuxer)
374 mkv_demuxer_t *mkv_d = demuxer->priv;
375 stream_t *s = demuxer->stream;
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 talloc_free(parse_ctx.talloc_ctx);
410 return 0;
413 static void parse_trackencodings(struct demuxer *demuxer,
414 struct mkv_track *track,
415 struct ebml_content_encodings *encodings)
417 // initial allocation to be a non-NULL context before realloc
418 mkv_content_encoding_t *ce = talloc_size(track, 1);
420 for (int n_enc = 0; n_enc < encodings->n_content_encoding; n_enc++) {
421 struct ebml_content_encoding *enc = encodings->content_encoding + n_enc;
422 struct mkv_content_encoding e = {};
423 e.order = enc->content_encoding_order;
424 if (enc->n_content_encoding_scope)
425 e.scope = enc->content_encoding_scope;
426 else
427 e.scope = 1;
428 e.type = enc->content_encoding_type;
430 if (enc->n_content_compression) {
431 struct ebml_content_compression *z = &enc->content_compression;
432 e.comp_algo = z->content_comp_algo;
433 if (z->n_content_comp_settings) {
434 int sz = z->content_comp_settings.len;
435 e.comp_settings = talloc_size(ce, sz);
436 memcpy(e.comp_settings, z->content_comp_settings.start, sz);
437 e.comp_settings_len = sz;
441 if (e.type == 1) {
442 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track "
443 "number %u has been encrypted and "
444 "decryption has not yet been\n"
445 "[mkv] implemented. Skipping track.\n",
446 track->tnum);
447 } else if (e.type != 0) {
448 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
449 "[mkv] Unknown content encoding type for "
450 "track %u. Skipping track.\n",
451 track->tnum);
452 } else if (e.comp_algo != 0 && e.comp_algo != 2 && e.comp_algo != 3) {
453 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
454 "[mkv] Track %u has been compressed with "
455 "an unknown/unsupported compression\n"
456 "[mkv] algorithm (%" PRIu64 "). Skipping track.\n",
457 track->tnum, e.comp_algo);
459 #if !CONFIG_ZLIB
460 else if (e.comp_algo == 0) {
461 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
462 "[mkv] Track %u was compressed with zlib "
463 "but mplayer has not been compiled\n"
464 "[mkv] with support for zlib compression. "
465 "Skipping track.\n",
466 track->tnum);
468 #endif
469 int i;
470 for (i = 0; i < n_enc; i++)
471 if (e.order >= ce[i].order)
472 break;
473 ce = talloc_realloc_size(track, ce, (n_enc + 1) * sizeof(*ce));
474 memmove(ce + i + 1, ce + i, (n_enc - i) * sizeof(*ce));
475 memcpy(ce + i, &e, sizeof(e));
478 track->encodings = ce;
479 track->num_encodings = encodings->n_content_encoding;
482 static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track,
483 struct ebml_audio *audio)
485 if (audio->n_sampling_frequency) {
486 track->a_sfreq = audio->sampling_frequency;
487 mp_msg(MSGT_DEMUX, MSGL_V,
488 "[mkv] | + Sampling frequency: %f\n", track->a_sfreq);
489 } else
490 track->a_sfreq = 8000;
491 if (audio->n_output_sampling_frequency) {
492 track->a_osfreq = audio->output_sampling_frequency;
493 mp_msg(MSGT_DEMUX, MSGL_V,
494 "[mkv] | + Output sampling frequency: %f\n", track->a_osfreq);
495 } else
496 track->a_osfreq = track->a_sfreq;
497 if (audio->n_bit_depth) {
498 track->a_bps = audio->bit_depth;
499 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
500 track->a_bps);
502 if (audio->n_channels) {
503 track->a_channels = audio->channels;
504 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
505 track->a_channels);
506 } else
507 track->a_channels = 1;
510 static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track,
511 struct ebml_video *video)
513 if (video->n_frame_rate) {
514 track->v_frate = video->frame_rate;
515 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
516 track->v_frate);
517 if (track->v_frate > 0)
518 track->default_duration = 1 / track->v_frate;
520 if (video->n_display_width) {
521 track->v_dwidth = video->display_width;
522 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
523 track->v_dwidth);
525 if (video->n_display_height) {
526 track->v_dheight = video->display_height;
527 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
528 track->v_dheight);
530 if (video->n_pixel_width) {
531 track->v_width = video->pixel_width;
532 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
533 track->v_width);
535 if (video->n_pixel_height) {
536 track->v_height = video->pixel_height;
537 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
538 track->v_height);
543 * \brief free any data associated with given track
544 * \param track track of which to free data
546 static void demux_mkv_free_trackentry(mkv_track_t *track)
548 free(track->audio_buf);
549 free(track->audio_timestamp);
550 talloc_free(track);
553 static void parse_trackentry(struct demuxer *demuxer,
554 struct ebml_track_entry *entry)
556 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
557 struct mkv_track *track = talloc_zero_size(NULL, sizeof(*track));
559 track->tnum = entry->track_number;
560 if (track->tnum)
561 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
562 track->tnum);
563 else
564 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing track number!\n");
566 if (entry->n_name) {
567 track->name = talloc_strndup(track, entry->name.start,
568 entry->name.len);
569 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
570 track->name);
573 track->type = entry->track_type;
574 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
575 switch (track->type) {
576 case MATROSKA_TRACK_AUDIO:
577 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
578 break;
579 case MATROSKA_TRACK_VIDEO:
580 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
581 break;
582 case MATROSKA_TRACK_SUBTITLE:
583 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
584 break;
585 default:
586 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
587 break;
590 if (entry->n_audio) {
591 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
592 parse_trackaudio(demuxer, track, &entry->audio);
595 if (entry->n_video) {
596 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
597 parse_trackvideo(demuxer, track, &entry->video);
600 if (entry->n_codec_id) {
601 track->codec_id = talloc_strndup(track, entry->codec_id.start,
602 entry->codec_id.len);
603 if (!strcmp(track->codec_id, MKV_V_MSCOMP)
604 || !strcmp(track->codec_id, MKV_A_ACM))
605 track->ms_compat = 1;
606 else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
607 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB;
608 else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
609 || !strcmp(track->codec_id, MKV_S_TEXTASS)
610 || !strcmp(track->codec_id, MKV_S_SSA)
611 || !strcmp(track->codec_id, MKV_S_ASS)) {
612 track->subtitle_type = MATROSKA_SUBTYPE_SSA;
613 } else if (!strcmp(track->codec_id, MKV_S_TEXTASCII))
614 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
615 if (!strcmp(track->codec_id, MKV_S_TEXTUTF8)) {
616 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
618 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
619 track->codec_id);
620 } else
621 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing codec ID!\n");
623 if (entry->n_codec_private) {
624 int len = entry->codec_private.len;
625 track->private_data = talloc_size(track, len + AV_LZO_INPUT_PADDING);
626 memcpy(track->private_data, entry->codec_private.start, len);
627 track->private_size = len;
628 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length %u\n",
629 track->private_size);
632 if (entry->n_language) {
633 track->language = talloc_strndup(track, entry->language.start,
634 entry->language.len);
635 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
636 track->language);
637 } else
638 track->language = talloc_strdup(track, "eng");
640 if (entry->n_flag_default) {
641 track->default_track = entry->flag_default;
642 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
643 track->default_track);
644 } else
645 track->default_track = 1;
647 if (entry->n_default_duration) {
648 track->default_duration = entry->default_duration / 1e9;
649 if (entry->default_duration == 0)
650 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
651 else {
652 if (!track->v_frate)
653 track->v_frate = 1e9 / entry->default_duration;
654 mp_msg(MSGT_DEMUX, MSGL_V,
655 "[mkv] | + Default duration: %.3fms ( = %.3f fps)\n",
656 entry->default_duration / 1000000.0, track->v_frate);
660 if (entry->n_content_encodings)
661 parse_trackencodings(demuxer, track, &entry->content_encodings);
663 mkv_d->tracks[mkv_d->num_tracks++] = track;
666 static int demux_mkv_read_tracks(demuxer_t *demuxer)
668 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
669 stream_t *s = demuxer->stream;
671 struct ebml_tracks tracks = {};
672 struct ebml_parse_ctx parse_ctx = {};
673 if (ebml_read_element(s, &parse_ctx, &tracks, &ebml_tracks_desc) < 0)
674 return 1;
676 mkv_d->tracks = talloc_size(mkv_d,
677 tracks.n_track_entry * sizeof(*mkv_d->tracks));
678 for (int i = 0; i < tracks.n_track_entry; i++) {
679 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
680 parse_trackentry(demuxer, &tracks.track_entry[i]);
682 talloc_free(parse_ctx.talloc_ctx);
683 return 0;
686 static int demux_mkv_read_cues(demuxer_t *demuxer)
688 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
689 stream_t *s = demuxer->stream;
691 if (index_mode == 0 || index_mode == 2) {
692 ebml_read_skip(s, NULL);
693 return 0;
696 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
697 struct ebml_cues cues = {};
698 struct ebml_parse_ctx parse_ctx = {};
699 if (ebml_read_element(s, &parse_ctx, &cues, &ebml_cues_desc) < 0)
700 goto out;
701 for (int i = 0; i < cues.n_cue_point; i++) {
702 struct ebml_cue_point *cuepoint = &cues.cue_point[i];
703 if (cuepoint->n_cue_time != 1 || !cuepoint->n_cue_track_positions) {
704 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed CuePoint element\n");
705 continue;
707 uint64_t time = cuepoint->cue_time;
708 for (int i = 0; i < cuepoint->n_cue_track_positions; i++) {
709 struct ebml_cue_track_positions *trackpos =
710 &cuepoint->cue_track_positions[i];
711 uint64_t track = trackpos->cue_track;
712 uint64_t pos = trackpos->cue_cluster_position;
713 mkv_d->indexes =
714 grow_array(mkv_d->indexes, mkv_d->num_indexes,
715 sizeof(mkv_index_t));
716 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
717 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
718 mkv_d->indexes[mkv_d->num_indexes].filepos =
719 mkv_d->segment_start + pos;
720 mp_msg(MSGT_DEMUX, MSGL_DBG2,
721 "[mkv] |+ found cue point for track %" PRIu64
722 ": timecode %" PRIu64 ", filepos: %" PRIu64 "\n", track,
723 time, mkv_d->segment_start + pos);
724 mkv_d->num_indexes++;
728 out:
729 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
730 talloc_free(parse_ctx.talloc_ctx);
731 return 0;
734 static int demux_mkv_read_chapters(struct demuxer *demuxer)
736 struct MPOpts *opts = demuxer->opts;
737 stream_t *s = demuxer->stream;
739 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
740 struct ebml_chapters file_chapters = {};
741 struct ebml_parse_ctx parse_ctx = {};
742 if (ebml_read_element(s, &parse_ctx, &file_chapters,
743 &ebml_chapters_desc) < 0)
744 goto out;
746 int selected_edition = 0;
747 int num_editions = file_chapters.n_edition_entry;
748 struct ebml_edition_entry *editions = file_chapters.edition_entry;
749 if (opts->edition_id >= 0 && opts->edition_id < num_editions) {
750 selected_edition = opts->edition_id;
751 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] User-specified edition: %d\n",
752 selected_edition);
753 } else
754 for (int i = 0; i < num_editions; i++)
755 if (editions[i].edition_flag_default) {
756 selected_edition = i;
757 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition: %d\n", i);
758 break;
760 struct matroska_chapter *m_chapters = NULL;
761 if (editions[selected_edition].edition_flag_ordered) {
762 int count = editions[selected_edition].n_chapter_atom;
763 m_chapters = talloc_array_ptrtype(demuxer, m_chapters, count);
764 demuxer->matroska_data.ordered_chapters = m_chapters;
765 demuxer->matroska_data.num_ordered_chapters = count;
768 for (int idx = 0; idx < num_editions; idx++) {
769 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New edition %d\n", idx);
770 int warn_level = idx == selected_edition ? MSGL_WARN : MSGL_V;
771 if (editions[idx].n_edition_flag_default)
772 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition flag: %"PRIu64
773 "\n", editions[idx].edition_flag_default);
774 if (editions[idx].n_edition_flag_ordered)
775 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Ordered chapter flag: %"PRIu64
776 "\n", editions[idx].edition_flag_ordered);
777 for (int i = 0; i < editions[idx].n_chapter_atom; i++) {
778 struct ebml_chapter_atom *ca = editions[idx].chapter_atom + i;
779 struct matroska_chapter chapter = { };
780 struct bstr name = { "(unnamed)", 9 };
782 if (!ca->n_chapter_time_start)
783 mp_msg(MSGT_DEMUX, warn_level,
784 "[mkv] Chapter lacks start time\n");
785 chapter.start = ca->chapter_time_start;
786 chapter.end = ca->chapter_time_end;
788 if (ca->n_chapter_display) {
789 if (ca->n_chapter_display > 1)
790 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Multiple chapter "
791 "names not supported, picking first\n");
792 if (!ca->chapter_display[0].n_chap_string)
793 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Malformed chapter "
794 "name entry\n");
795 else
796 name = ca->chapter_display[0].chap_string;
799 if (ca->n_chapter_segment_uid) {
800 chapter.has_segment_uid = true;
801 int len = ca->chapter_segment_uid.len;
802 if (len != sizeof(chapter.segment_uid))
803 mp_msg(MSGT_DEMUX, warn_level,
804 "[mkv] Chapter segment uid bad length %d\n", len);
805 else if (ca->n_chapter_segment_edition_uid) {
806 mp_tmsg(MSGT_DEMUX, warn_level, "[mkv] Warning: "
807 "unsupported edition recursion in chapter; "
808 "will skip on playback!\n");
809 } else {
810 memcpy(chapter.segment_uid, ca->chapter_segment_uid.start,
811 len);
812 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter segment uid ");
813 for (int i = 0; i < len; i++)
814 mp_msg(MSGT_DEMUX, MSGL_V, "%02x ",
815 chapter.segment_uid[i]);
816 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
820 mp_msg(MSGT_DEMUX, MSGL_V,
821 "[mkv] Chapter %u from %02d:%02d:%02d.%03d "
822 "to %02d:%02d:%02d.%03d, %.*s\n", i,
823 (int) (chapter.start / 60 / 60 / 1000000000),
824 (int) ((chapter.start / 60 / 1000000000) % 60),
825 (int) ((chapter.start / 1000000000) % 60),
826 (int) (chapter.start % 1000000000),
827 (int) (chapter.end / 60 / 60 / 1000000000),
828 (int) ((chapter.end / 60 / 1000000000) % 60),
829 (int) ((chapter.end / 1000000000) % 60),
830 (int) (chapter.end % 1000000000),
831 BSTR_P(name));
833 if (idx == selected_edition){
834 demuxer_add_chapter(demuxer, name, chapter.start, chapter.end);
835 if (editions[idx].edition_flag_ordered) {
836 chapter.name = talloc_strndup(m_chapters, name.start,
837 name.len);
838 m_chapters[i] = chapter;
843 if (num_editions > 1)
844 mp_msg(MSGT_DEMUX, MSGL_INFO,
845 "[mkv] Found %d editions, will play #%d (first is 0).\n",
846 num_editions, selected_edition);
848 out:
849 talloc_free(parse_ctx.talloc_ctx);
850 mp_msg(MSGT_DEMUX, MSGL_V,
851 "[mkv] \\---- [ parsing chapters ] ---------\n");
852 return 0;
855 static int demux_mkv_read_tags(demuxer_t *demuxer)
857 stream_t *s = demuxer->stream;
859 struct ebml_parse_ctx parse_ctx = {};
860 struct ebml_tags tags = {};
861 if (ebml_read_element(s, &parse_ctx, &tags, &ebml_tags_desc) < 0)
862 return 1;
864 for (int i = 0; i < tags.n_tag; i++) {
865 struct ebml_tag tag = tags.tag[i];
866 if (tag.targets.target_track_uid || tag.targets.target_edition_uid ||
867 tag.targets.target_chapter_uid || tag.targets.target_attachment_uid)
868 continue;
870 for (int j; j < tag.n_simple_tag; j++)
871 demux_info_add_bstr(demuxer, tag.simple_tag[j].tag_name, tag.simple_tag[j].tag_string);
874 return 0;
877 static int demux_mkv_read_attachments(demuxer_t *demuxer)
879 stream_t *s = demuxer->stream;
881 mp_msg(MSGT_DEMUX, MSGL_V,
882 "[mkv] /---- [ parsing attachments ] ---------\n");
884 struct ebml_attachments attachments = {};
885 struct ebml_parse_ctx parse_ctx = {};
886 if (ebml_read_element(s, &parse_ctx, &attachments,
887 &ebml_attachments_desc) < 0)
888 goto out;
890 for (int i = 0; i < attachments.n_attached_file; i++) {
891 struct ebml_attached_file *attachment = &attachments.attached_file[i];
892 if (!attachment->n_file_name || !attachment->n_file_mime_type
893 || !attachment->n_file_data) {
894 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed attachment\n");
895 continue;
897 struct bstr name = attachment->file_name;
898 struct bstr mime = attachment->file_mime_type;
899 demuxer_add_attachment(demuxer, name, mime, attachment->file_data);
900 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Attachment: %.*s, %.*s, %zu bytes\n",
901 BSTR_P(name), BSTR_P(mime), attachment->file_data.len);
904 out:
905 talloc_free(parse_ctx.talloc_ctx);
906 mp_msg(MSGT_DEMUX, MSGL_V,
907 "[mkv] \\---- [ parsing attachments ] ---------\n");
908 return 0;
911 static int read_header_element(struct demuxer *demuxer, uint32_t id,
912 off_t at_filepos);
914 static int demux_mkv_read_seekhead(demuxer_t *demuxer)
916 struct mkv_demuxer *mkv_d = demuxer->priv;
917 struct stream *s = demuxer->stream;
918 int res = 0;
919 struct ebml_seek_head seekhead = {};
920 struct ebml_parse_ctx parse_ctx = {};
922 mp_msg(MSGT_DEMUX, MSGL_V,
923 "[mkv] /---- [ parsing seek head ] ---------\n");
924 if (ebml_read_element(s, &parse_ctx, &seekhead, &ebml_seek_head_desc) < 0) {
925 res = 1;
926 goto out;
928 /* off now holds the position of the next element after the seek head. */
929 off_t off = stream_tell(s);
930 for (int i = 0; i < seekhead.n_seek; i++) {
931 struct ebml_seek *seek = &seekhead.seek[i];
932 if (seek->n_seek_id != 1 || seek->n_seek_position != 1) {
933 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Invalid SeekHead entry\n");
934 continue;
936 uint64_t pos = seek->seek_position + mkv_d->segment_start;
937 if (pos >= demuxer->movi_end) {
938 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] SeekHead position beyond "
939 "end of file - incomplete file?\n");
940 continue;
942 read_header_element(demuxer, seek->seek_id, pos);
944 if (!stream_seek(s, off)) {
945 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Couldn't seek back after "
946 "SeekHead??\n");
947 res = 1;
949 out:
950 mp_msg(MSGT_DEMUX, MSGL_V,
951 "[mkv] \\---- [ parsing seek head ] ---------\n");
952 talloc_free(parse_ctx.talloc_ctx);
953 return res;
956 static bool seek_pos_id(struct stream *s, off_t pos, uint32_t id)
958 if (!stream_seek(s, pos)) {
959 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Failed to seek in file\n");
960 return false;
962 if (ebml_read_id(s, NULL) != id) {
963 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Expected element not found\n");
964 return false;
966 return true;
969 static int read_header_element(struct demuxer *demuxer, uint32_t id,
970 off_t at_filepos)
972 struct mkv_demuxer *mkv_d = demuxer->priv;
973 stream_t *s = demuxer->stream;
974 off_t pos = stream_tell(s) - 4;
976 switch(id) {
977 case MATROSKA_ID_INFO:
978 if (mkv_d->parsed_info)
979 break;
980 if (at_filepos && !seek_pos_id(s, at_filepos, id))
981 return -1;
982 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
983 mkv_d->parsed_info = true;
984 return demux_mkv_read_info(demuxer) ? -1 : 1;
986 case MATROSKA_ID_TRACKS:
987 if (mkv_d->parsed_tracks)
988 break;
989 if (at_filepos && !seek_pos_id(s, at_filepos, id))
990 return -1;
991 mkv_d->parsed_tracks = true;
992 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
993 return demux_mkv_read_tracks(demuxer) ? -1 : 1;
995 case MATROSKA_ID_CUES:
996 if (is_parsed_header(mkv_d, pos))
997 break;
998 if (at_filepos && !seek_pos_id(s, at_filepos, id))
999 return -1;
1000 return demux_mkv_read_cues(demuxer) ? -1 : 1;
1002 case MATROSKA_ID_TAGS:
1003 if (mkv_d->parsed_tags)
1004 break;
1005 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1006 return -1;
1007 mkv_d->parsed_tags = true;
1008 return demux_mkv_read_tags(demuxer) ? -1 : 1;
1010 case MATROSKA_ID_SEEKHEAD:
1011 if (is_parsed_header(mkv_d, pos))
1012 break;
1013 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1014 return -1;
1015 return demux_mkv_read_seekhead(demuxer) ? -1 : 1;
1017 case MATROSKA_ID_CHAPTERS:
1018 if (mkv_d->parsed_chapters)
1019 break;
1020 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1021 return -1;
1022 mkv_d->parsed_chapters = true;
1023 return demux_mkv_read_chapters(demuxer) ? -1 : 1;
1025 case MATROSKA_ID_ATTACHMENTS:
1026 if (mkv_d->parsed_attachments)
1027 break;
1028 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1029 return -1;
1030 mkv_d->parsed_attachments = true;
1031 return demux_mkv_read_attachments(demuxer) ? -1 : 1;
1033 default:
1034 if (!at_filepos)
1035 ebml_read_skip(s, NULL);
1036 return 0;
1038 if (!at_filepos)
1039 ebml_read_skip(s, NULL);
1040 return 1;
1045 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1046 int vid);
1047 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1048 int aid);
1049 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1050 int sid);
1052 static void display_create_tracks(demuxer_t *demuxer)
1054 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1055 int i, vid = 0, aid = 0, sid = 0;
1057 for (i = 0; i < mkv_d->num_tracks; i++) {
1058 char *type = "unknown", str[32];
1059 *str = '\0';
1060 switch (mkv_d->tracks[i]->type) {
1061 case MATROSKA_TRACK_VIDEO:
1062 type = "video";
1063 mkv_d->tracks[i]->id = -1;
1064 if (vid == MAX_V_STREAMS)
1065 break;
1066 mkv_d->tracks[i]->id = vid;
1067 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid);
1068 if (mkv_d->tracks[i]->name)
1069 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", vid,
1070 mkv_d->tracks[i]->name);
1071 sprintf(str, "-vid %u", vid++);
1072 break;
1073 case MATROSKA_TRACK_AUDIO:
1074 type = "audio";
1075 mkv_d->tracks[i]->id = -1;
1076 if (aid == MAX_A_STREAMS)
1077 break;
1078 mkv_d->tracks[i]->id = aid;
1079 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid);
1080 if (mkv_d->tracks[i]->name)
1081 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", aid,
1082 mkv_d->tracks[i]->name);
1083 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", aid,
1084 mkv_d->tracks[i]->language);
1085 sprintf(str, "-aid %u, -alang %.5s", aid++,
1086 mkv_d->tracks[i]->language);
1087 break;
1088 case MATROSKA_TRACK_SUBTITLE:
1089 type = "subtitles";
1090 mkv_d->tracks[i]->id = -1;
1091 if (sid == MAX_S_STREAMS)
1092 break;
1093 mkv_d->tracks[i]->id = sid;
1094 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
1095 if (mkv_d->tracks[i]->name)
1096 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid,
1097 mkv_d->tracks[i]->name);
1098 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid,
1099 mkv_d->tracks[i]->language);
1100 sprintf(str, "-sid %u, -slang %.5s", sid++,
1101 mkv_d->tracks[i]->language);
1102 break;
1104 if (mkv_d->tracks[i]->name)
1105 mp_tmsg(MSGT_DEMUX, MSGL_INFO,
1106 "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1107 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1108 mkv_d->tracks[i]->name, str);
1109 else
1110 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
1111 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1112 str);
1114 mkv_d->num_audio_tracks = aid;
1117 typedef struct {
1118 char *id;
1119 int fourcc;
1120 int extradata;
1121 } videocodec_info_t;
1123 static const videocodec_info_t vinfo[] = {
1124 {MKV_V_MJPEG, mmioFOURCC('m', 'j', 'p', 'g'), 1},
1125 {MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0},
1126 {MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0},
1127 {MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1128 {MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1129 {MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1130 {MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1},
1131 {MKV_V_THEORA, mmioFOURCC('t', 'h', 'e', 'o'), 1},
1132 {MKV_V_VP8, mmioFOURCC('V', 'P', '8', '0'), 0},
1133 {NULL, 0, 0}
1136 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1137 int vid)
1139 BITMAPINFOHEADER *bih;
1140 void *ImageDesc = NULL;
1141 sh_video_t *sh_v;
1143 if (track->ms_compat) { /* MS compatibility mode */
1144 BITMAPINFOHEADER *src;
1146 if (track->private_data == NULL
1147 || track->private_size < sizeof(*bih))
1148 return 1;
1150 src = (BITMAPINFOHEADER *) track->private_data;
1151 bih = calloc(1, track->private_size);
1152 bih->biSize = le2me_32(src->biSize);
1153 bih->biWidth = le2me_32(src->biWidth);
1154 bih->biHeight = le2me_32(src->biHeight);
1155 bih->biPlanes = le2me_16(src->biPlanes);
1156 bih->biBitCount = le2me_16(src->biBitCount);
1157 bih->biCompression = le2me_32(src->biCompression);
1158 bih->biSizeImage = le2me_32(src->biSizeImage);
1159 bih->biXPelsPerMeter = le2me_32(src->biXPelsPerMeter);
1160 bih->biYPelsPerMeter = le2me_32(src->biYPelsPerMeter);
1161 bih->biClrUsed = le2me_32(src->biClrUsed);
1162 bih->biClrImportant = le2me_32(src->biClrImportant);
1163 memcpy(bih + 1,
1164 src + 1,
1165 track->private_size - sizeof(*bih));
1167 if (track->v_width == 0)
1168 track->v_width = bih->biWidth;
1169 if (track->v_height == 0)
1170 track->v_height = bih->biHeight;
1171 } else {
1172 bih = calloc(1, sizeof(*bih));
1173 bih->biSize = sizeof(*bih);
1174 bih->biWidth = track->v_width;
1175 bih->biHeight = track->v_height;
1176 bih->biBitCount = 24;
1177 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
1179 if (track->private_size >= RVPROPERTIES_SIZE
1180 && (!strcmp(track->codec_id, MKV_V_REALV10)
1181 || !strcmp(track->codec_id, MKV_V_REALV20)
1182 || !strcmp(track->codec_id, MKV_V_REALV30)
1183 || !strcmp(track->codec_id, MKV_V_REALV40))) {
1184 unsigned char *dst, *src;
1185 uint32_t type2;
1186 unsigned int cnt;
1188 src = (uint8_t *) track->private_data + RVPROPERTIES_SIZE;
1190 cnt = track->private_size - RVPROPERTIES_SIZE;
1191 bih = realloc(bih, sizeof(*bih) + 8 + cnt);
1192 bih->biSize = 48 + cnt;
1193 bih->biPlanes = 1;
1194 type2 = AV_RB32(src - 4);
1195 if (type2 == 0x10003000 || type2 == 0x10003001)
1196 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
1197 else
1198 bih->biCompression =
1199 mmioFOURCC('R', 'V', track->codec_id[9], '0');
1200 dst = (unsigned char *) (bih + 1);
1201 // copy type1 and type2 info from rv properties
1202 memcpy(dst, src - 8, 8 + cnt);
1203 track->realmedia = 1;
1205 #ifdef CONFIG_QTX_CODECS
1206 } else if (track->private_size >= sizeof(ImageDescription)
1207 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) {
1208 ImageDescriptionPtr idesc;
1210 idesc = (ImageDescriptionPtr) track->private_data;
1211 idesc->idSize = be2me_32(idesc->idSize);
1212 idesc->cType = be2me_32(idesc->cType);
1213 idesc->version = be2me_16(idesc->version);
1214 idesc->revisionLevel = be2me_16(idesc->revisionLevel);
1215 idesc->vendor = be2me_32(idesc->vendor);
1216 idesc->temporalQuality = be2me_32(idesc->temporalQuality);
1217 idesc->spatialQuality = be2me_32(idesc->spatialQuality);
1218 idesc->width = be2me_16(idesc->width);
1219 idesc->height = be2me_16(idesc->height);
1220 idesc->hRes = be2me_32(idesc->hRes);
1221 idesc->vRes = be2me_32(idesc->vRes);
1222 idesc->dataSize = be2me_32(idesc->dataSize);
1223 idesc->frameCount = be2me_16(idesc->frameCount);
1224 idesc->depth = be2me_16(idesc->depth);
1225 idesc->clutID = be2me_16(idesc->clutID);
1226 bih->biPlanes = 1;
1227 bih->biCompression = idesc->cType;
1228 ImageDesc = idesc;
1229 #endif /* CONFIG_QTX_CODECS */
1231 } else {
1232 const videocodec_info_t *vi = vinfo;
1233 while (vi->id && strcmp(vi->id, track->codec_id))
1234 vi++;
1235 bih->biCompression = vi->fourcc;
1236 if (vi->extradata && track->private_data
1237 && (track->private_size > 0)) {
1238 bih->biSize += track->private_size;
1239 bih = realloc(bih, bih->biSize);
1240 memcpy(bih + 1, track->private_data, track->private_size);
1242 if (!vi->id) {
1243 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported "
1244 "CodecID (%s) or missing/bad CodecPrivate\n"
1245 "[mkv] data (track %u).\n",
1246 track->codec_id, track->tnum);
1247 free(bih);
1248 return 1;
1253 sh_v = new_sh_video(demuxer, vid);
1254 sh_v->bih = bih;
1255 sh_v->format = sh_v->bih->biCompression;
1256 if (track->v_frate == 0.0)
1257 track->v_frate = 25.0;
1258 sh_v->fps = track->v_frate;
1259 sh_v->frametime = 1 / track->v_frate;
1260 sh_v->aspect = 0;
1261 if (!track->realmedia) {
1262 sh_v->disp_w = track->v_width;
1263 sh_v->disp_h = track->v_height;
1264 if (track->v_dheight)
1265 sh_v->aspect = (double) track->v_dwidth / track->v_dheight;
1266 } else {
1267 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1268 // disp_w and disp_h from the RealVideo stream contents returned
1269 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1270 // the Matroska file then it has already been set to PixelWidth/Height
1271 // by check_track_information.
1272 sh_v->disp_w = track->v_dwidth;
1273 sh_v->disp_h = track->v_dheight;
1275 sh_v->ImageDesc = ImageDesc;
1276 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
1278 sh_v->ds = demuxer->video;
1279 return 0;
1282 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1283 int aid)
1285 sh_audio_t *sh_a = new_sh_audio(demuxer, aid);
1286 if (!sh_a)
1287 return 1;
1289 if (track->language && (strcmp(track->language, "und") != 0))
1290 sh_a->lang = strdup(track->language);
1291 sh_a->default_track = track->default_track;
1292 sh_a->ds = demuxer->audio;
1293 sh_a->wf = malloc(sizeof(*sh_a->wf));
1294 if (track->ms_compat && (track->private_size >= sizeof(*sh_a->wf))) {
1295 WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data;
1296 sh_a->wf = realloc(sh_a->wf, track->private_size);
1297 sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag);
1298 sh_a->wf->nChannels = le2me_16(wf->nChannels);
1299 sh_a->wf->nSamplesPerSec = le2me_32(wf->nSamplesPerSec);
1300 sh_a->wf->nAvgBytesPerSec = le2me_32(wf->nAvgBytesPerSec);
1301 sh_a->wf->nBlockAlign = le2me_16(wf->nBlockAlign);
1302 sh_a->wf->wBitsPerSample = le2me_16(wf->wBitsPerSample);
1303 sh_a->wf->cbSize = track->private_size - sizeof(*sh_a->wf);
1304 memcpy(sh_a->wf + 1, wf + 1,
1305 track->private_size - sizeof(*sh_a->wf));
1306 if (track->a_sfreq == 0.0)
1307 track->a_sfreq = sh_a->wf->nSamplesPerSec;
1308 if (track->a_channels == 0)
1309 track->a_channels = sh_a->wf->nChannels;
1310 if (track->a_bps == 0)
1311 track->a_bps = sh_a->wf->wBitsPerSample;
1312 track->a_formattag = sh_a->wf->wFormatTag;
1313 } else {
1314 memset(sh_a->wf, 0, sizeof(*sh_a->wf));
1315 if (!strcmp(track->codec_id, MKV_A_MP3)
1316 || !strcmp(track->codec_id, MKV_A_MP2))
1317 track->a_formattag = 0x0055;
1318 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
1319 track->a_formattag = 0x2000;
1320 else if (!strcmp(track->codec_id, MKV_A_DTS))
1321 track->a_formattag = 0x2001;
1322 else if (!strcmp(track->codec_id, MKV_A_PCM)
1323 || !strcmp(track->codec_id, MKV_A_PCM_BE))
1324 track->a_formattag = 0x0001;
1325 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN)
1326 || !strncmp(track->codec_id, MKV_A_AAC_2LC,
1327 strlen(MKV_A_AAC_2LC))
1328 || !strcmp(track->codec_id, MKV_A_AAC_2SSR)
1329 || !strcmp(track->codec_id, MKV_A_AAC_4MAIN)
1330 || !strncmp(track->codec_id, MKV_A_AAC_4LC,
1331 strlen(MKV_A_AAC_4LC))
1332 || !strcmp(track->codec_id, MKV_A_AAC_4SSR)
1333 || !strcmp(track->codec_id, MKV_A_AAC_4LTP)
1334 || !strcmp(track->codec_id, MKV_A_AAC))
1335 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
1336 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
1337 if (track->private_data == NULL)
1338 return 1;
1339 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's');
1340 } else if (!strcmp(track->codec_id, MKV_A_QDMC))
1341 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
1342 else if (!strcmp(track->codec_id, MKV_A_QDMC2))
1343 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
1344 else if (!strcmp(track->codec_id, MKV_A_WAVPACK))
1345 track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K');
1346 else if (!strcmp(track->codec_id, MKV_A_TRUEHD))
1347 track->a_formattag = mmioFOURCC('T', 'R', 'H', 'D');
1348 else if (!strcmp(track->codec_id, MKV_A_FLAC)) {
1349 if (track->private_data == NULL || track->private_size == 0) {
1350 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
1351 "[mkv] FLAC track does not contain valid headers.\n");
1352 return 1;
1354 track->a_formattag = mmioFOURCC('f', 'L', 'a', 'C');
1355 } else if (track->private_size >= RAPROPERTIES4_SIZE) {
1356 if (!strcmp(track->codec_id, MKV_A_REAL28))
1357 track->a_formattag = mmioFOURCC('2', '8', '_', '8');
1358 else if (!strcmp(track->codec_id, MKV_A_REALATRC))
1359 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
1360 else if (!strcmp(track->codec_id, MKV_A_REALCOOK))
1361 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
1362 else if (!strcmp(track->codec_id, MKV_A_REALDNET))
1363 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
1364 else if (!strcmp(track->codec_id, MKV_A_REALSIPR))
1365 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
1366 } else {
1367 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1368 "codec ID '%s' for track %u or missing/faulty\n[mkv] "
1369 "private codec data.\n", track->codec_id, track->tnum);
1370 free_sh_audio(demuxer, track->id);
1371 return 1;
1375 sh_a->format = track->a_formattag;
1376 sh_a->wf->wFormatTag = track->a_formattag;
1377 sh_a->channels = track->a_channels;
1378 sh_a->wf->nChannels = track->a_channels;
1379 sh_a->samplerate = (uint32_t) track->a_sfreq;
1380 sh_a->container_out_samplerate = track->a_osfreq;
1381 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
1382 if (track->a_bps == 0) {
1383 sh_a->samplesize = 2;
1384 sh_a->wf->wBitsPerSample = 16;
1385 } else {
1386 sh_a->samplesize = track->a_bps / 8;
1387 sh_a->wf->wBitsPerSample = track->a_bps;
1389 if (track->a_formattag == 0x0055) { /* MP3 || MP2 */
1390 sh_a->wf->nAvgBytesPerSec = 16000;
1391 sh_a->wf->nBlockAlign = 1152;
1392 } else if ((track->a_formattag == 0x2000) /* AC3 */
1393 || (track->a_formattag == 0x2001)) { /* DTS */
1394 free(sh_a->wf);
1395 sh_a->wf = NULL;
1396 } else if (track->a_formattag == 0x0001) { /* PCM || PCM_BE */
1397 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
1398 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
1399 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
1400 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
1401 } else if (!strcmp(track->codec_id, MKV_A_QDMC)
1402 || !strcmp(track->codec_id, MKV_A_QDMC2)) {
1403 sh_a->wf->nAvgBytesPerSec = 16000;
1404 sh_a->wf->nBlockAlign = 1486;
1405 track->fix_i_bps = 1;
1406 track->qt_last_a_pts = 0.0;
1407 if (track->private_data != NULL) {
1408 sh_a->codecdata = malloc(track->private_size);
1409 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1410 sh_a->codecdata_len = track->private_size;
1412 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
1413 int profile, srate_idx;
1415 sh_a->wf->nAvgBytesPerSec = 16000;
1416 sh_a->wf->nBlockAlign = 1024;
1418 if (!strcmp(track->codec_id, MKV_A_AAC)
1419 && (NULL != track->private_data)) {
1420 sh_a->codecdata = malloc(track->private_size);
1421 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1422 sh_a->codecdata_len = track->private_size;
1423 return 0;
1426 /* Recreate the 'private data' */
1427 /* which faad2 uses in its initialization */
1428 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1429 if (!strncmp(&track->codec_id[12], "MAIN", 4))
1430 profile = 0;
1431 else if (!strncmp(&track->codec_id[12], "LC", 2))
1432 profile = 1;
1433 else if (!strncmp(&track->codec_id[12], "SSR", 3))
1434 profile = 2;
1435 else
1436 profile = 3;
1437 sh_a->codecdata = malloc(5);
1438 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xE) >> 1);
1439 sh_a->codecdata[1] =
1440 ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
1442 if (strstr(track->codec_id, "SBR") != NULL) {
1443 /* HE-AAC (aka SBR AAC) */
1444 sh_a->codecdata_len = 5;
1446 sh_a->samplerate *= 2;
1447 sh_a->wf->nSamplesPerSec *= 2;
1448 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1449 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
1450 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
1451 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
1452 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
1453 } else {
1454 sh_a->codecdata_len = 2;
1455 track->default_duration = 1024.0 / sh_a->samplerate;
1457 } else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) { /* VORBIS */
1458 sh_a->wf->cbSize = track->private_size;
1459 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1460 memcpy((unsigned char *) (sh_a->wf + 1), track->private_data,
1461 sh_a->wf->cbSize);
1462 } else if (track->private_size >= RAPROPERTIES4_SIZE
1463 && !strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
1464 /* Common initialization for all RealAudio codecs */
1465 unsigned char *src = track->private_data;
1466 int codecdata_length, version;
1467 int flavor;
1469 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
1471 version = AV_RB16(src + 4);
1472 flavor = AV_RB16(src + 22);
1473 track->coded_framesize = AV_RB32(src + 24);
1474 track->sub_packet_h = AV_RB16(src + 40);
1475 sh_a->wf->nBlockAlign = track->audiopk_size = AV_RB16(src + 42);
1476 track->sub_packet_size = AV_RB16(src + 44);
1477 if (version == 4) {
1478 src += RAPROPERTIES4_SIZE;
1479 src += src[0] + 1;
1480 src += src[0] + 1;
1481 } else
1482 src += RAPROPERTIES5_SIZE;
1484 src += 3;
1485 if (version == 5)
1486 src++;
1487 codecdata_length = AV_RB32(src);
1488 src += 4;
1489 sh_a->wf->cbSize = codecdata_length;
1490 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1491 memcpy(((char *) (sh_a->wf + 1)), src, codecdata_length);
1493 switch (track->a_formattag) {
1494 case mmioFOURCC('a', 't', 'r', 'c'):
1495 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[flavor];
1496 sh_a->wf->nBlockAlign = track->sub_packet_size;
1497 track->audio_buf =
1498 malloc(track->sub_packet_h * track->audiopk_size);
1499 track->audio_timestamp =
1500 malloc(track->sub_packet_h * sizeof(double));
1501 break;
1502 case mmioFOURCC('c', 'o', 'o', 'k'):
1503 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[flavor];
1504 sh_a->wf->nBlockAlign = track->sub_packet_size;
1505 track->audio_buf =
1506 malloc(track->sub_packet_h * track->audiopk_size);
1507 track->audio_timestamp =
1508 malloc(track->sub_packet_h * sizeof(double));
1509 break;
1510 case mmioFOURCC('s', 'i', 'p', 'r'):
1511 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[flavor];
1512 sh_a->wf->nBlockAlign = track->coded_framesize;
1513 track->audio_buf =
1514 malloc(track->sub_packet_h * track->audiopk_size);
1515 track->audio_timestamp =
1516 malloc(track->sub_packet_h * sizeof(double));
1517 break;
1518 case mmioFOURCC('2', '8', '_', '8'):
1519 sh_a->wf->nAvgBytesPerSec = 3600;
1520 sh_a->wf->nBlockAlign = track->coded_framesize;
1521 track->audio_buf =
1522 malloc(track->sub_packet_h * track->audiopk_size);
1523 track->audio_timestamp =
1524 malloc(track->sub_packet_h * sizeof(double));
1525 break;
1528 track->realmedia = 1;
1529 } else if (!strcmp(track->codec_id, MKV_A_FLAC)
1530 || (track->a_formattag == 0xf1ac)) {
1531 unsigned char *ptr;
1532 int size;
1533 free(sh_a->wf);
1534 sh_a->wf = NULL;
1536 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) {
1537 ptr = track->private_data;
1538 size = track->private_size;
1539 } else {
1540 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
1541 ptr = track->private_data + sizeof(*sh_a->wf);
1542 size = track->private_size - sizeof(*sh_a->wf);
1544 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
1545 || ptr[3] != 'C') {
1546 sh_a->codecdata = malloc(4);
1547 sh_a->codecdata_len = 4;
1548 memcpy(sh_a->codecdata, "fLaC", 4);
1549 } else {
1550 sh_a->codecdata = malloc(size);
1551 sh_a->codecdata_len = size;
1552 memcpy(sh_a->codecdata, ptr, size);
1554 } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */
1555 } else if (!track->ms_compat
1556 || (track->private_size < sizeof(*sh_a->wf))) {
1557 free_sh_audio(demuxer, track->id);
1558 return 1;
1561 return 0;
1564 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1565 int sid)
1567 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) {
1568 int size;
1569 uint8_t *buffer;
1570 sh_sub_t *sh = new_sh_sub(demuxer, sid);
1571 track->sh_sub = sh;
1572 sh->type = 't';
1573 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
1574 sh->type = 'v';
1575 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
1576 sh->type = 'a';
1577 size = track->private_size;
1578 demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
1579 if (buffer && buffer != track->private_data) {
1580 talloc_free(track->private_data);
1581 talloc_steal(track, buffer);
1582 track->private_data = buffer;
1583 track->private_size = size;
1585 sh->extradata = malloc(track->private_size);
1586 memcpy(sh->extradata, track->private_data, track->private_size);
1587 sh->extradata_len = track->private_size;
1588 if (track->language && (strcmp(track->language, "und") != 0))
1589 sh->lang = strdup(track->language);
1590 sh->default_track = track->default_track;
1591 } else {
1592 mp_tmsg(MSGT_DEMUX, MSGL_ERR,
1593 "[mkv] Subtitle type '%s' is not supported.\n",
1594 track->codec_id);
1595 return 1;
1598 return 0;
1601 static int demux_mkv_open(demuxer_t *demuxer)
1603 stream_t *s = demuxer->stream;
1604 mkv_demuxer_t *mkv_d;
1605 mkv_track_t *track;
1606 int i, cont = 0;
1608 stream_seek(s, s->start_pos);
1609 if (ebml_read_id(s, NULL) != EBML_ID_EBML)
1610 return 0;
1611 struct ebml_ebml ebml_master = {};
1612 struct ebml_parse_ctx parse_ctx = { .no_error_messages = true };
1613 if (ebml_read_element(s, &parse_ctx, &ebml_master, &ebml_ebml_desc) < 0)
1614 return 0;
1615 if (ebml_master.doc_type.start == NULL) {
1616 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] File has EBML header but no doctype."
1617 " Assuming \"matroska\".\n");
1618 } else if (bstrcmp(ebml_master.doc_type, BSTR("matroska")) != 0
1619 && bstrcmp(ebml_master.doc_type, BSTR("webm")) != 0) {
1620 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] no head found\n");
1621 talloc_free(parse_ctx.talloc_ctx);
1622 return 0;
1624 if (ebml_master.doc_type_read_version > 2) {
1625 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1626 "but we don't support format version %"PRIu64"\n",
1627 ebml_master.doc_type_read_version);
1628 talloc_free(parse_ctx.talloc_ctx);
1629 return 0;
1631 if ((ebml_master.n_ebml_read_version
1632 && ebml_master.ebml_read_version != EBML_VERSION)
1633 || (ebml_master.n_ebml_max_size_length
1634 && ebml_master.ebml_max_size_length > 8)
1635 || (ebml_master.n_ebml_max_id_length
1636 && ebml_master.ebml_max_id_length != 4)) {
1637 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1638 "but the header has bad parameters\n");
1639 talloc_free(parse_ctx.talloc_ctx);
1640 return 0;
1642 talloc_free(parse_ctx.talloc_ctx);
1644 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
1646 if (ebml_read_id(s, NULL) != MATROSKA_ID_SEGMENT) {
1647 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
1648 return 0;
1650 ebml_read_length(s, NULL); /* return bytes number until EOF */
1652 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
1654 mkv_d = talloc_zero(demuxer, struct mkv_demuxer);
1655 demuxer->priv = mkv_d;
1656 mkv_d->tc_scale = 1000000;
1657 mkv_d->segment_start = stream_tell(s);
1659 while (!cont) {
1660 uint32_t id = ebml_read_id(s, NULL);
1661 switch (id) {
1662 case MATROSKA_ID_CLUSTER:
1663 mp_msg(MSGT_DEMUX, MSGL_V,
1664 "[mkv] |+ found cluster, headers are "
1665 "parsed completely :)\n");
1666 stream_seek(s, stream_tell(s) - 4);
1667 cont = 1;
1668 break;
1670 default:
1671 cont = read_header_element(demuxer, id, 0) < 1;
1672 break;
1673 case EBML_ID_VOID:
1674 ebml_read_skip(s, NULL);
1675 break;
1679 display_create_tracks(demuxer);
1681 /* select video track */
1682 track = NULL;
1683 if (demuxer->video->id == -1) { /* automatically select a video track */
1684 /* search for a video track that has the 'default' flag set */
1685 for (i = 0; i < mkv_d->num_tracks; i++)
1686 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1687 && mkv_d->tracks[i]->default_track) {
1688 track = mkv_d->tracks[i];
1689 break;
1692 if (track == NULL)
1693 /* no track has the 'default' flag set */
1694 /* let's take the first video track */
1695 for (i = 0; i < mkv_d->num_tracks; i++)
1696 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1697 && mkv_d->tracks[i]->id >= 0) {
1698 track = mkv_d->tracks[i];
1699 break;
1701 } else if (demuxer->video->id != -2) /* -2 = no video at all */
1702 track = find_track_by_num(mkv_d, demuxer->video->id,
1703 MATROSKA_TRACK_VIDEO);
1705 if (track && demuxer->v_streams[track->id]) {
1706 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u.\n",
1707 track->tnum);
1708 demuxer->video->id = track->id;
1709 demuxer->video->sh = demuxer->v_streams[track->id];
1710 } else {
1711 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
1712 demuxer->video->id = -2;
1715 /* select audio track */
1716 track = NULL;
1717 if (track == NULL)
1718 /* search for an audio track that has the 'default' flag set */
1719 for (i = 0; i < mkv_d->num_tracks; i++)
1720 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1721 && mkv_d->tracks[i]->default_track) {
1722 track = mkv_d->tracks[i];
1723 break;
1726 if (track == NULL)
1727 /* no track has the 'default' flag set */
1728 /* let's take the first audio track */
1729 for (i = 0; i < mkv_d->num_tracks; i++)
1730 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1731 && mkv_d->tracks[i]->id >= 0) {
1732 track = mkv_d->tracks[i];
1733 break;
1736 if (track && demuxer->a_streams[track->id]) {
1737 demuxer->audio->id = track->id;
1738 demuxer->audio->sh = demuxer->a_streams[track->id];
1739 } else {
1740 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
1741 demuxer->audio->id = -2;
1744 if (s->end_pos == 0)
1745 demuxer->seekable = 0;
1746 else {
1747 demuxer->movi_start = s->start_pos;
1748 demuxer->movi_end = s->end_pos;
1749 demuxer->seekable = 1;
1752 demuxer->accurate_seek = true;
1754 return DEMUXER_TYPE_MATROSKA;
1757 static void demux_close_mkv(demuxer_t *demuxer)
1759 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1761 if (mkv_d) {
1762 int i;
1763 if (mkv_d->tracks) {
1764 for (i = 0; i < mkv_d->num_tracks; i++)
1765 demux_mkv_free_trackentry(mkv_d->tracks[i]);
1767 free(mkv_d->indexes);
1768 free(mkv_d->cluster_positions);
1772 static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
1773 uint8_t *laces,
1774 uint32_t **all_lace_sizes)
1776 uint32_t total = 0;
1777 uint32_t *lace_size = NULL;
1778 uint8_t flags;
1779 int i;
1781 *all_lace_sizes = NULL;
1782 /* lacing flags */
1783 if (*size < 1)
1784 goto error;
1785 flags = *buffer++;
1786 (*size)--;
1788 switch ((flags & 0x06) >> 1) {
1789 case 0: /* no lacing */
1790 *laces = 1;
1791 lace_size = calloc(*laces, sizeof(uint32_t));
1792 lace_size[0] = *size;
1793 break;
1795 case 1: /* xiph lacing */
1796 case 2: /* fixed-size lacing */
1797 case 3: /* EBML lacing */
1798 if (*size < 1)
1799 goto error;
1800 *laces = *buffer++;
1801 (*size)--;
1802 (*laces)++;
1803 lace_size = calloc(*laces, sizeof(uint32_t));
1805 switch ((flags & 0x06) >> 1) {
1806 case 1: /* xiph lacing */
1807 for (i = 0; i < *laces - 1; i++) {
1808 lace_size[i] = 0;
1809 do {
1810 if (!*size)
1811 goto error;
1812 lace_size[i] += *buffer;
1813 (*size)--;
1814 } while (*buffer++ == 0xFF);
1815 if (lace_size[i] > *size - total || total > *size)
1816 goto error;
1817 total += lace_size[i];
1819 lace_size[i] = *size - total;
1820 break;
1822 case 2: /* fixed-size lacing */
1823 for (i = 0; i < *laces; i++)
1824 lace_size[i] = *size / *laces;
1825 break;
1827 case 3:; /* EBML lacing */
1828 int l;
1829 uint64_t num = ebml_read_vlen_uint(buffer, &l);
1830 if (num == EBML_UINT_INVALID)
1831 goto error;
1832 buffer += l;
1833 if (*size < l)
1834 goto error;
1835 *size -= l;
1836 if (num > *size)
1837 goto error;
1839 total = lace_size[0] = num;
1840 for (i = 1; i < *laces - 1; i++) {
1841 int64_t snum = ebml_read_vlen_int(buffer, &l);
1842 if (snum == EBML_INT_INVALID)
1843 goto error;
1844 buffer += l;
1845 if (*size < l)
1846 goto error;
1847 *size -= l;
1848 lace_size[i] = lace_size[i - 1] + snum;
1849 if (lace_size[i] > *size - total || total > *size)
1850 goto error;
1851 total += lace_size[i];
1853 lace_size[i] = *size - total;
1854 break;
1856 break;
1858 *all_lace_sizes = lace_size;
1859 return 0;
1861 error:
1862 free(lace_size);
1863 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Bad input [lacing]\n");
1864 return 1;
1867 static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track,
1868 char *block, int64_t size,
1869 uint64_t block_duration, uint64_t timecode)
1871 demux_packet_t *dp;
1873 if (block_duration == 0) {
1874 mp_msg(MSGT_DEMUX, MSGL_WARN,
1875 "[mkv] Warning: No BlockDuration for subtitle track found.\n");
1876 return;
1879 sub_utf8 = 1;
1880 dp = new_demux_packet(size);
1881 memcpy(dp->buffer, block, size);
1882 dp->pts = timecode / 1e9;
1883 dp->duration = block_duration / 1e9;
1884 ds_add_packet(demuxer->sub, dp);
1887 static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
1888 uint8_t *buffer, uint32_t size, int64_t block_bref)
1890 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1891 demux_packet_t *dp;
1892 uint32_t timestamp = mkv_d->last_pts * 1000;
1894 dp = new_demux_packet(size);
1895 memcpy(dp->buffer, buffer, size);
1897 if (mkv_d->v_skip_to_keyframe) {
1898 dp->pts = mkv_d->last_pts;
1899 track->rv_kf_base = 0;
1900 track->rv_kf_pts = timestamp;
1901 } else
1902 dp->pts =
1903 real_fix_timestamp(dp->buffer, timestamp,
1904 ((sh_video_t *) demuxer->video->sh)->bih->
1905 biCompression, &track->rv_kf_base,
1906 &track->rv_kf_pts, NULL);
1907 dp->pos = demuxer->filepos;
1908 dp->flags = block_bref ? 0 : 0x10;
1910 ds_add_packet(demuxer->video, dp);
1913 static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
1914 uint8_t *buffer, uint32_t size, int64_t block_bref)
1916 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1917 int sps = track->sub_packet_size;
1918 int sph = track->sub_packet_h;
1919 int cfs = track->coded_framesize;
1920 int w = track->audiopk_size;
1921 int spc = track->sub_packet_cnt;
1922 demux_packet_t *dp;
1923 int x;
1925 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8'))
1926 || (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k'))
1927 || (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c'))
1928 || (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) {
1929 // if(!block_bref)
1930 // spc = track->sub_packet_cnt = 0;
1931 switch (track->a_formattag) {
1932 case mmioFOURCC('2', '8', '_', '8'):
1933 for (x = 0; x < sph / 2; x++)
1934 memcpy(track->audio_buf + x * 2 * w + spc * cfs,
1935 buffer + cfs * x, cfs);
1936 break;
1937 case mmioFOURCC('c', 'o', 'o', 'k'):
1938 case mmioFOURCC('a', 't', 'r', 'c'):
1939 for (x = 0; x < w / sps; x++)
1940 memcpy(track->audio_buf +
1941 sps * (sph * x + ((sph + 1) / 2) * (spc & 1) +
1942 (spc >> 1)), buffer + sps * x, sps);
1943 break;
1944 case mmioFOURCC('s', 'i', 'p', 'r'):
1945 memcpy(track->audio_buf + spc * w, buffer, w);
1946 if (spc == sph - 1) {
1947 int n;
1948 int bs = sph * w * 2 / 96; // nibbles per subpacket
1949 // Perform reordering
1950 for (n = 0; n < 38; n++) {
1951 int j;
1952 int i = bs * sipr_swaps[n][0];
1953 int o = bs * sipr_swaps[n][1];
1954 // swap nibbles of block 'i' with 'o' TODO: optimize
1955 for (j = 0; j < bs; j++) {
1956 int x = (i & 1) ?
1957 (track->audio_buf[i >> 1] >> 4) :
1958 (track->audio_buf[i >> 1] & 0x0F);
1959 int y = (o & 1) ?
1960 (track->audio_buf[o >> 1] >> 4) :
1961 (track->audio_buf[o >> 1] & 0x0F);
1962 if (o & 1)
1963 track->audio_buf[o >> 1] =
1964 (track->audio_buf[o >> 1] & 0x0F) | (x << 4);
1965 else
1966 track->audio_buf[o >> 1] =
1967 (track->audio_buf[o >> 1] & 0xF0) | x;
1968 if (i & 1)
1969 track->audio_buf[i >> 1] =
1970 (track->audio_buf[i >> 1] & 0x0F) | (y << 4);
1971 else
1972 track->audio_buf[i >> 1] =
1973 (track->audio_buf[i >> 1] & 0xF0) | y;
1974 ++i;
1975 ++o;
1979 break;
1981 track->audio_timestamp[track->sub_packet_cnt] =
1982 (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
1983 track->ra_pts = mkv_d->last_pts;
1984 if (track->sub_packet_cnt == 0)
1985 track->audio_filepos = demuxer->filepos;
1986 if (++(track->sub_packet_cnt) == sph) {
1987 int apk_usize =
1988 ((sh_audio_t *) demuxer->audio->sh)->wf->nBlockAlign;
1989 track->sub_packet_cnt = 0;
1990 // Release all the audio packets
1991 for (x = 0; x < sph * w / apk_usize; x++) {
1992 dp = new_demux_packet(apk_usize);
1993 memcpy(dp->buffer, track->audio_buf + x * apk_usize,
1994 apk_usize);
1995 /* Put timestamp only on packets that correspond to original
1996 * audio packets in file */
1997 dp->pts = (x * apk_usize % w) ? 0 :
1998 track->audio_timestamp[x * apk_usize / w];
1999 dp->pos = track->audio_filepos; // all equal
2000 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
2001 ds_add_packet(demuxer->audio, dp);
2004 } else { // Not a codec that require reordering
2005 dp = new_demux_packet(size);
2006 memcpy(dp->buffer, buffer, size);
2007 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
2008 dp->pts = 0;
2009 else
2010 dp->pts = mkv_d->last_pts;
2011 track->ra_pts = mkv_d->last_pts;
2013 dp->pos = demuxer->filepos;
2014 dp->flags = block_bref ? 0 : 0x10;
2015 ds_add_packet(demuxer->audio, dp);
2019 static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
2020 uint64_t block_duration, int64_t block_bref,
2021 int64_t block_fref, uint8_t simpleblock)
2023 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2024 mkv_track_t *track = NULL;
2025 demux_stream_t *ds = NULL;
2026 uint64_t old_length;
2027 uint64_t tc;
2028 uint32_t *lace_size;
2029 uint8_t laces, flags;
2030 int i, num, tmp, use_this_block = 1;
2031 double current_pts;
2032 int16_t time;
2034 /* first byte(s): track num */
2035 num = ebml_read_vlen_uint(block, &tmp);
2036 block += tmp;
2037 /* time (relative to cluster time) */
2038 time = block[0] << 8 | block[1];
2039 block += 2;
2040 length -= tmp + 2;
2041 old_length = length;
2042 flags = block[0];
2043 if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
2044 return 0;
2045 block += old_length - length;
2047 tc = time * mkv_d->tc_scale + mkv_d->cluster_tc;
2048 current_pts = tc / 1e9;
2050 for (i = 0; i < mkv_d->num_tracks; i++)
2051 if (mkv_d->tracks[i]->tnum == num) {
2052 track = mkv_d->tracks[i];
2053 break;
2055 if (track == NULL) {
2056 free(lace_size);
2057 return 1;
2059 if (track->type == MATROSKA_TRACK_AUDIO
2060 && track->id == demuxer->audio->id) {
2061 ds = demuxer->audio;
2063 if (mkv_d->a_skip_to_keyframe) {
2064 if (simpleblock) {
2065 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2066 use_this_block = 0;
2067 } else if (block_bref != 0)
2068 use_this_block = 0;
2070 if (mkv_d->v_skip_to_keyframe)
2071 use_this_block = 0;
2073 if (track->fix_i_bps && use_this_block) {
2074 sh_audio_t *sh = (sh_audio_t *) ds->sh;
2076 if (block_duration != 0) {
2077 sh->i_bps = length * 1e9 / block_duration;
2078 track->fix_i_bps = 0;
2079 } else if (track->qt_last_a_pts == 0.0)
2080 track->qt_last_a_pts = current_pts;
2081 else if (track->qt_last_a_pts != current_pts) {
2082 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
2083 track->fix_i_bps = 0;
2086 } else if (tc < mkv_d->skip_to_timecode)
2087 use_this_block = 0;
2088 else if (track->type == MATROSKA_TRACK_VIDEO
2089 && track->id == demuxer->video->id) {
2090 ds = demuxer->video;
2091 if (mkv_d->v_skip_to_keyframe) {
2092 if (simpleblock) {
2093 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2094 use_this_block = 0;
2095 } else if (block_bref != 0 || block_fref != 0)
2096 use_this_block = 0;
2098 } else if (track->type == MATROSKA_TRACK_SUBTITLE
2099 && track->id == demuxer->sub->id) {
2100 ds = demuxer->sub;
2101 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) {
2102 uint8_t *buffer;
2103 int size = length;
2104 demux_mkv_decode(track, block, &buffer, &size, 1);
2105 handle_subtitles(demuxer, track, buffer, size, block_duration, tc);
2106 if (buffer != block)
2107 talloc_free(buffer);
2108 use_this_block = 0;
2110 } else
2111 use_this_block = 0;
2113 if (use_this_block) {
2114 mkv_d->last_pts = current_pts;
2115 mkv_d->last_filepos = demuxer->filepos;
2117 for (i = 0; i < laces; i++) {
2118 if (ds == demuxer->video && track->realmedia)
2119 handle_realvideo(demuxer, track, block, lace_size[i],
2120 block_bref);
2121 else if (ds == demuxer->audio && track->realmedia)
2122 handle_realaudio(demuxer, track, block, lace_size[i],
2123 block_bref);
2124 else {
2125 int size = lace_size[i];
2126 demux_packet_t *dp;
2127 uint8_t *buffer;
2128 demux_mkv_decode(track, block, &buffer, &size, 1);
2129 if (buffer) {
2130 dp = new_demux_packet(size);
2131 memcpy(dp->buffer, buffer, size);
2132 if (buffer != block)
2133 talloc_free(buffer);
2134 dp->flags = (block_bref == 0
2135 && block_fref == 0) ? 0x10 : 0;
2136 /* If default_duration is 0, assume no pts value is known
2137 * for packets after the first one (rather than all pts
2138 * values being the same) */
2139 if (i == 0 || track->default_duration)
2140 dp->pts =
2141 mkv_d->last_pts + i * track->default_duration;
2142 ds_add_packet(ds, dp);
2145 block += lace_size[i];
2148 if (ds == demuxer->video) {
2149 mkv_d->v_skip_to_keyframe = 0;
2150 mkv_d->skip_to_timecode = 0;
2151 } else if (ds == demuxer->audio)
2152 mkv_d->a_skip_to_keyframe = 0;
2154 free(lace_size);
2155 return 1;
2158 free(lace_size);
2159 return 0;
2162 static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
2164 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2165 stream_t *s = demuxer->stream;
2166 uint64_t l;
2167 int il, tmp;
2169 while (1) {
2170 while (mkv_d->cluster_size > 0) {
2171 uint64_t block_duration = 0, block_length = 0;
2172 int64_t block_bref = 0, block_fref = 0;
2173 uint8_t *block = NULL;
2175 while (mkv_d->blockgroup_size > 0) {
2176 switch (ebml_read_id(s, &il)) {
2177 case MATROSKA_ID_BLOCKDURATION:
2178 block_duration = ebml_read_uint(s, &l);
2179 if (block_duration == EBML_UINT_INVALID) {
2180 free(block);
2181 return 0;
2183 block_duration *= mkv_d->tc_scale;
2184 break;
2186 case MATROSKA_ID_BLOCK:
2187 block_length = ebml_read_length(s, &tmp);
2188 free(block);
2189 if (block_length > 500000000)
2190 return 0;
2191 block = malloc(block_length + AV_LZO_INPUT_PADDING);
2192 demuxer->filepos = stream_tell(s);
2193 if (stream_read(s, block, block_length) !=
2194 (int) block_length) {
2195 free(block);
2196 return 0;
2198 l = tmp + block_length;
2199 break;
2201 case MATROSKA_ID_REFERENCEBLOCK:;
2202 int64_t num = ebml_read_int(s, &l);
2203 if (num == EBML_INT_INVALID) {
2204 free(block);
2205 return 0;
2207 if (num <= 0)
2208 block_bref = num;
2209 else
2210 block_fref = num;
2211 break;
2213 case EBML_ID_INVALID:
2214 free(block);
2215 return 0;
2217 default:
2218 ebml_read_skip(s, &l);
2219 break;
2221 mkv_d->blockgroup_size -= l + il;
2222 mkv_d->cluster_size -= l + il;
2225 if (block) {
2226 int res = handle_block(demuxer, block, block_length,
2227 block_duration, block_bref, block_fref,
2229 free(block);
2230 if (res < 0)
2231 return 0;
2232 if (res)
2233 return 1;
2236 if (mkv_d->cluster_size > 0) {
2237 switch (ebml_read_id(s, &il)) {
2238 case MATROSKA_ID_TIMECODE:;
2239 uint64_t num = ebml_read_uint(s, &l);
2240 if (num == EBML_UINT_INVALID)
2241 return 0;
2242 mkv_d->cluster_tc = num * mkv_d->tc_scale;
2243 add_cluster_position(mkv_d, mkv_d->cluster_start,
2244 mkv_d->cluster_tc);
2245 break;
2247 case MATROSKA_ID_BLOCKGROUP:
2248 mkv_d->blockgroup_size = ebml_read_length(s, &tmp);
2249 l = tmp;
2250 break;
2252 case MATROSKA_ID_SIMPLEBLOCK:;
2253 int res;
2254 block_length = ebml_read_length(s, &tmp);
2255 if (block_length > 500000000)
2256 return 0;
2257 block = malloc(block_length);
2258 demuxer->filepos = stream_tell(s);
2259 if (stream_read(s, block, block_length) !=
2260 (int) block_length) {
2261 free(block);
2262 return 0;
2264 l = tmp + block_length;
2265 res = handle_block(demuxer, block, block_length,
2266 block_duration, block_bref,
2267 block_fref, 1);
2268 free(block);
2269 mkv_d->cluster_size -= l + il;
2270 if (res < 0)
2271 return 0;
2272 else if (res)
2273 return 1;
2274 else
2275 mkv_d->cluster_size += l + il;
2276 break;
2278 case EBML_ID_INVALID:
2279 return 0;
2281 default:
2282 ebml_read_skip(s, &l);
2283 break;
2285 mkv_d->cluster_size -= l + il;
2289 while (ebml_read_id(s, &il) != MATROSKA_ID_CLUSTER) {
2290 ebml_read_skip(s, NULL);
2291 if (s->eof)
2292 return 0;
2294 mkv_d->cluster_start = stream_tell(s) - il;
2295 mkv_d->cluster_size = ebml_read_length(s, NULL);
2298 return 0;
2301 static int seek_creating_index(struct demuxer *demuxer, float rel_seek_secs,
2302 int flags)
2304 struct mkv_demuxer *mkv_d = demuxer->priv;
2305 struct stream *s = demuxer->stream;
2306 int64_t target_tc_ns = (int64_t) (rel_seek_secs * 1e9);
2307 if (target_tc_ns < 0)
2308 target_tc_ns = 0;
2309 uint64_t max_filepos = 0;
2310 int64_t max_tc = -1;
2311 int n = mkv_d->num_cluster_pos;
2312 if (n > 0) {
2313 max_filepos = mkv_d->cluster_positions[n - 1].filepos;
2314 max_tc = mkv_d->cluster_positions[n - 1].timecode;
2317 if (target_tc_ns > max_tc) {
2318 if ((off_t) max_filepos > stream_tell(s))
2319 stream_seek(s, max_filepos);
2320 else
2321 stream_seek(s, stream_tell(s) + mkv_d->cluster_size);
2322 /* parse all the clusters upto target_filepos */
2323 while (!s->eof) {
2324 uint64_t start = stream_tell(s);
2325 uint32_t type = ebml_read_id(s, NULL);
2326 uint64_t len = ebml_read_length(s, NULL);
2327 uint64_t end = stream_tell(s) + len;
2328 if (type == MATROSKA_ID_CLUSTER) {
2329 while (!s->eof && stream_tell(s) < end) {
2330 if (ebml_read_id(s, NULL) == MATROSKA_ID_TIMECODE) {
2331 uint64_t tc = ebml_read_uint(s, NULL);
2332 tc *= mkv_d->tc_scale;
2333 add_cluster_position(mkv_d, start, tc);
2334 if (tc >= target_tc_ns)
2335 goto enough_index;
2336 break;
2340 if (s->eof)
2341 break;
2342 stream_seek(s, end);
2344 enough_index:
2345 if (s->eof)
2346 stream_reset(s);
2348 if (!mkv_d->num_cluster_pos) {
2349 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] no target for seek found\n");
2350 return -1;
2352 uint64_t cluster_pos = mkv_d->cluster_positions[0].filepos;
2353 /* Let's find the nearest cluster */
2354 int64_t min_diff = 0xFFFFFFFFFFFFFFF;
2355 for (int i = 0; i < mkv_d->num_cluster_pos; i++) {
2356 int64_t diff = mkv_d->cluster_positions[i].timecode - target_tc_ns;
2357 if (flags & SEEK_BACKWARD && diff < 0 && -diff < min_diff) {
2358 cluster_pos = mkv_d->cluster_positions[i].filepos;
2359 min_diff = -diff;
2360 } else if (flags & SEEK_FORWARD
2361 && (diff < 0 ? -1 * diff : diff) < min_diff) {
2362 cluster_pos = mkv_d->cluster_positions[i].filepos;
2363 min_diff = diff < 0 ? -1 * diff : diff;
2366 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2367 stream_seek(s, cluster_pos);
2368 return 0;
2371 static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
2372 int64_t target_timecode, int flags)
2374 struct mkv_demuxer *mkv_d = demuxer->priv;
2375 struct mkv_index *index = NULL;
2377 /* Find the entry in the index closest to the target timecode in the
2378 * give direction. If there are no such entries - we're trying to seek
2379 * backward from a target time before the first entry or forward from a
2380 * target time after the last entry - then still seek to the first/last
2381 * entry if that's further in the direction wanted than mkv_d->last_pts.
2383 int64_t min_diff = target_timecode - (int64_t)(mkv_d->last_pts * 1e9 + 0.5);
2384 if (flags & SEEK_BACKWARD)
2385 min_diff = -min_diff;
2386 min_diff = FFMAX(min_diff, 1);
2387 for (int i = 0; i < mkv_d->num_indexes; i++)
2388 if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
2389 int64_t diff =
2390 target_timecode -
2391 (int64_t) (mkv_d->indexes[i].timecode * mkv_d->tc_scale);
2392 if (flags & SEEK_BACKWARD)
2393 diff = -diff;
2394 if (diff <= 0) {
2395 if (min_diff <= 0 && diff <= min_diff)
2396 continue;
2397 } else if (diff >= min_diff)
2398 continue;
2399 min_diff = diff;
2400 index = mkv_d->indexes + i;
2403 if (index) { /* We've found an entry. */
2404 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2405 stream_seek(demuxer->stream, index->filepos);
2407 return index;
2410 static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
2411 float audio_delay, int flags)
2413 mkv_demuxer_t *mkv_d = demuxer->priv;
2414 uint64_t v_tnum = -1;
2415 if (demuxer->video->id >= 0)
2416 v_tnum = find_track_by_num(mkv_d, demuxer->video->id,
2417 MATROSKA_TRACK_VIDEO)->tnum;
2418 uint64_t a_tnum = -1;
2419 if (demuxer->audio->id >= 0)
2420 a_tnum = find_track_by_num(mkv_d, demuxer->audio->id,
2421 MATROSKA_TRACK_AUDIO)->tnum;
2422 if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
2423 if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
2424 flags |= SEEK_BACKWARD;
2425 else
2426 flags |= SEEK_FORWARD;
2428 // Adjust the target a little bit to catch cases where the target position
2429 // specifies a keyframe with high, but not perfect, precision.
2430 rel_seek_secs += flags & SEEK_FORWARD ? -0.005 : 0.005;
2432 if (!(flags & SEEK_FACTOR)) { /* time in secs */
2433 mkv_index_t *index = NULL;
2435 if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
2436 rel_seek_secs += mkv_d->last_pts;
2437 rel_seek_secs = FFMAX(rel_seek_secs, 0);
2438 int64_t target_timecode = rel_seek_secs * 1e9 + 0.5;
2440 if (mkv_d->indexes == NULL) { /* no index was found */
2441 if (seek_creating_index(demuxer, rel_seek_secs, flags) < 0)
2442 return;
2443 } else {
2444 int seek_id = (demuxer->video->id < 0) ?
2445 a_tnum : v_tnum;
2446 index = seek_with_cues(demuxer, seek_id, target_timecode, flags);
2447 if (!index)
2448 index = seek_with_cues(demuxer, -1, target_timecode, flags);
2451 if (demuxer->video->id >= 0)
2452 mkv_d->v_skip_to_keyframe = 1;
2453 if (flags & SEEK_FORWARD)
2454 mkv_d->skip_to_timecode = target_timecode;
2455 else
2456 mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale
2457 : 0;
2458 mkv_d->a_skip_to_keyframe = 1;
2460 demux_mkv_fill_buffer(demuxer, NULL);
2461 } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
2462 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2463 else {
2464 stream_t *s = demuxer->stream;
2465 uint64_t target_filepos;
2466 mkv_index_t *index = NULL;
2467 int i;
2469 if (mkv_d->indexes == NULL) { /* not implemented without index */
2470 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2471 return;
2474 target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
2475 for (i = 0; i < mkv_d->num_indexes; i++)
2476 if (mkv_d->indexes[i].tnum == v_tnum)
2477 if ((index == NULL)
2478 || ((mkv_d->indexes[i].filepos >= target_filepos)
2479 && ((index->filepos < target_filepos)
2480 || (mkv_d->indexes[i].filepos < index->filepos))))
2481 index = &mkv_d->indexes[i];
2483 if (!index)
2484 return;
2486 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2487 stream_seek(s, index->filepos);
2489 if (demuxer->video->id >= 0)
2490 mkv_d->v_skip_to_keyframe = 1;
2491 mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale;
2492 mkv_d->a_skip_to_keyframe = 1;
2494 demux_mkv_fill_buffer(demuxer, NULL);
2498 static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
2500 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2502 switch (cmd) {
2503 case DEMUXER_CTRL_CORRECT_PTS:
2504 return DEMUXER_CTRL_OK;
2505 case DEMUXER_CTRL_GET_TIME_LENGTH:
2506 if (mkv_d->duration == 0)
2507 return DEMUXER_CTRL_DONTKNOW;
2509 *((double *) arg) = (double) mkv_d->duration;
2510 return DEMUXER_CTRL_OK;
2512 case DEMUXER_CTRL_GET_PERCENT_POS:
2513 if (mkv_d->duration == 0) {
2514 return DEMUXER_CTRL_DONTKNOW;
2517 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
2518 return DEMUXER_CTRL_OK;
2520 case DEMUXER_CTRL_SWITCH_AUDIO:;
2521 int new_aid = *(int *) arg;
2522 int current_aid = demuxer->audio->id;
2523 if (current_aid < 0)
2524 current_aid = -1;
2525 if (new_aid == -1) // cycle to next
2526 new_aid = (current_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
2527 if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks)
2528 new_aid = -2;
2529 *(int *) arg = new_aid;
2530 if (current_aid != new_aid)
2531 ds_free_packs(demuxer->audio);
2532 demuxer->audio->id = new_aid;
2533 return DEMUXER_CTRL_OK;
2535 default:
2536 return DEMUXER_CTRL_NOTIMPL;
2540 const demuxer_desc_t demuxer_desc_matroska = {
2541 "Matroska demuxer",
2542 "mkv",
2543 "Matroska",
2544 "Aurelien Jacobs",
2546 DEMUXER_TYPE_MATROSKA,
2547 1, // safe autodetect
2548 demux_mkv_open,
2549 demux_mkv_fill_buffer,
2550 NULL,
2551 demux_close_mkv,
2552 demux_mkv_seek,
2553 demux_mkv_control