demux_mkv: fix seeks to before the first index entry
[mplayer/glamo.git] / libmpdemux / demux_mkv.c
blob91fb4a2bf40498efb185c18014d90560a80c88d3
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 "vobsub.h"
45 #include "subreader.h"
46 #include "libvo/sub.h"
48 #include "ass_mp.h"
50 #include "libavutil/common.h"
52 #ifdef CONFIG_QTX_CODECS
53 #include "loader/qtx/qtxsdk/components.h"
54 #endif
56 #if CONFIG_ZLIB
57 #include <zlib.h>
58 #endif
60 #include "libavutil/lzo.h"
61 #include "ffmpeg_files/intreadwrite.h"
62 #include "libavutil/avstring.h"
64 static const unsigned char sipr_swaps[38][2] = {
65 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
66 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
67 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
68 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
69 {77,80}
72 // Map flavour to bytes per second
73 #define SIPR_FLAVORS 4
74 #define ATRC_FLAVORS 8
75 #define COOK_FLAVORS 34
76 static const int sipr_fl2bps[SIPR_FLAVORS] = { 813, 1062, 625, 2000 };
77 static const int atrc_fl2bps[ATRC_FLAVORS] = {
78 8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100 };
79 static const int cook_fl2bps[COOK_FLAVORS] = {
80 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
81 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
82 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
83 12016, 16408, 22911, 33506
86 typedef struct mkv_content_encoding {
87 uint64_t order, type, scope;
88 uint64_t comp_algo;
89 uint8_t *comp_settings;
90 int comp_settings_len;
91 } mkv_content_encoding_t;
93 typedef struct mkv_track {
94 int tnum;
95 char *name;
96 int id; // -aid / -sid / -vid option value
98 char *codec_id;
99 int ms_compat;
100 char *language;
102 int type;
104 uint32_t v_width, v_height, v_dwidth, v_dheight;
105 double v_frate;
107 uint32_t a_formattag;
108 uint32_t a_channels, a_bps;
109 float a_sfreq;
110 float a_osfreq;
112 double default_duration;
114 int default_track;
116 unsigned char *private_data;
117 unsigned int private_size;
119 /* stuff for realmedia */
120 int realmedia;
121 int64_t rv_kf_base;
122 int rv_kf_pts;
123 double rv_pts; /* previous video timestamp */
124 double ra_pts; /* previous audio timestamp */
126 /** realaudio descrambling */
127 int sub_packet_size; ///< sub packet size, per stream
128 int sub_packet_h; ///< number of coded frames per block
129 int coded_framesize; ///< coded frame size, per stream
130 int audiopk_size; ///< audio packet size
131 unsigned char *audio_buf; ///< place to store reordered audio data
132 double *audio_timestamp; ///< timestamp for each audio packet
133 int sub_packet_cnt; ///< number of subpacket already received
134 int audio_filepos; ///< file position of first audio packet in block
136 /* stuff for quicktime */
137 int fix_i_bps;
138 double qt_last_a_pts;
140 int subtitle_type;
142 /* The timecodes of video frames might have to be reordered if they're
143 in display order (the timecodes, not the frames themselves!). In this
144 case demux packets have to be cached with the help of these variables. */
145 int reorder_timecodes;
146 demux_packet_t **cached_dps;
147 int num_cached_dps, num_allocated_dps;
148 double max_pts;
150 /* generic content encoding support */
151 mkv_content_encoding_t *encodings;
152 int num_encodings;
154 /* For VobSubs and SSA/ASS */
155 sh_sub_t *sh_sub;
156 } mkv_track_t;
158 typedef struct mkv_index {
159 int tnum;
160 uint64_t timecode, filepos;
161 } mkv_index_t;
163 typedef struct mkv_demuxer {
164 off_t segment_start;
166 double duration, last_pts;
167 uint64_t last_filepos;
169 mkv_track_t **tracks;
170 int num_tracks;
172 uint64_t tc_scale, cluster_tc;
174 uint64_t cluster_start;
175 uint64_t cluster_size;
176 uint64_t blockgroup_size;
178 mkv_index_t *indexes;
179 int num_indexes;
181 off_t *parsed_pos;
182 int num_parsed_pos;
183 bool parsed_info;
184 bool parsed_tracks;
185 bool parsed_tags;
186 bool parsed_chapters;
187 bool parsed_attachments;
189 struct cluster_pos {
190 uint64_t filepos;
191 uint64_t timecode;
192 } *cluster_positions;
193 int num_cluster_pos;
195 int64_t skip_to_timecode;
196 int v_skip_to_keyframe, a_skip_to_keyframe;
198 int num_audio_tracks;
199 } mkv_demuxer_t;
201 #define REALHEADER_SIZE 16
202 #define RVPROPERTIES_SIZE 34
203 #define RAPROPERTIES4_SIZE 56
204 #define RAPROPERTIES5_SIZE 70
207 * \brief ensures there is space for at least one additional element
208 * \param array array to grow
209 * \param nelem current number of elements in array
210 * \param elsize size of one array element
212 static void *grow_array(void *array, int nelem, size_t elsize)
214 if (!(nelem & 31))
215 array = realloc(array, (nelem + 32) * elsize);
216 return array;
219 static bool is_parsed_header(struct mkv_demuxer *mkv_d, off_t pos)
221 int low = 0;
222 int high = mkv_d->num_parsed_pos;
223 while (high > low + 1) {
224 int mid = high + low >> 1;
225 if (mkv_d->parsed_pos[mid] > pos)
226 high = mid;
227 else
228 low = mid;
230 if (mkv_d->num_parsed_pos && mkv_d->parsed_pos[low] == pos)
231 return true;
232 if (!(mkv_d->num_parsed_pos & 31))
233 mkv_d->parsed_pos = talloc_realloc(mkv_d, mkv_d->parsed_pos, off_t,
234 mkv_d->num_parsed_pos + 32);
235 mkv_d->num_parsed_pos++;
236 for (int i = mkv_d->num_parsed_pos - 1; i > low; i--)
237 mkv_d->parsed_pos[i] = mkv_d->parsed_pos[i - 1];
238 mkv_d->parsed_pos[low] = pos;
239 return false;
242 static mkv_track_t *find_track_by_num(struct mkv_demuxer *d, int n, int type)
244 for (int i = 0; i < d->num_tracks; i++)
245 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
246 if (d->tracks[i]->id == n)
247 return d->tracks[i];
249 return NULL;
252 static void add_cluster_position(mkv_demuxer_t *mkv_d, uint64_t filepos,
253 uint64_t timecode)
255 if (mkv_d->indexes)
256 return;
258 int n = mkv_d->num_cluster_pos;
259 if (n > 0 && mkv_d->cluster_positions[n-1].filepos >= filepos)
260 return;
262 mkv_d->cluster_positions =
263 grow_array(mkv_d->cluster_positions, mkv_d->num_cluster_pos,
264 sizeof(*mkv_d->cluster_positions));
265 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = (struct cluster_pos){
266 .filepos = filepos,
267 .timecode = timecode,
272 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
273 static int aac_get_sample_rate_index(uint32_t sample_rate)
275 static const int srates[] = {
276 92017, 75132, 55426, 46009, 37566, 27713,
277 23004, 18783, 13856, 11502, 9391, 0
279 int i = 0;
280 while (sample_rate < srates[i])
281 i++;
282 return i;
285 /** \brief Free cached demux packets
287 * Reordering the timecodes requires caching of demux packets. This function
288 * frees all these cached packets and the memory for the cached pointers
289 * itself.
291 * \param demuxer The demuxer for which the cache is to be freed.
293 static void free_cached_dps(demuxer_t *demuxer)
295 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
296 mkv_track_t *track;
297 int i, k;
299 for (k = 0; k < mkv_d->num_tracks; k++) {
300 track = mkv_d->tracks[k];
301 for (i = 0; i < track->num_cached_dps; i++)
302 free_demux_packet(track->cached_dps[i]);
303 free(track->cached_dps);
304 track->cached_dps = NULL;
305 track->num_cached_dps = 0;
306 track->num_allocated_dps = 0;
307 track->max_pts = 0;
311 static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
312 uint8_t **dest, uint32_t *size, uint32_t type)
314 uint8_t *orig_src = src;
316 *dest = src;
318 for (int i = 0; i < track->num_encodings; i++) {
319 struct mkv_content_encoding *enc = track->encodings + i;
320 if (!(enc->scope & type))
321 continue;
323 if (src != *dest && src != orig_src)
324 talloc_free(src);
325 src = *dest; // output from last iteration is new source
327 if (enc->comp_algo == 0) {
328 #if CONFIG_ZLIB
329 /* zlib encoded track */
331 if (*size == 0)
332 continue;
334 z_stream zstream;
336 zstream.zalloc = (alloc_func) 0;
337 zstream.zfree = (free_func) 0;
338 zstream.opaque = (voidpf) 0;
339 if (inflateInit(&zstream) != Z_OK) {
340 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
341 "[mkv] zlib initialization failed.\n");
342 goto error;
344 zstream.next_in = (Bytef *) src;
345 zstream.avail_in = *size;
347 *dest = NULL;
348 zstream.avail_out = *size;
349 int result;
350 do {
351 *size += 4000;
352 *dest = talloc_realloc_size(NULL, *dest, *size);
353 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
354 result = inflate(&zstream, Z_NO_FLUSH);
355 if (result != Z_OK && result != Z_STREAM_END) {
356 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
357 "[mkv] zlib decompression failed.\n");
358 talloc_free(*dest);
359 *dest = NULL;
360 inflateEnd(&zstream);
361 goto error;
363 zstream.avail_out += 4000;
364 } while (zstream.avail_out == 4000 && zstream.avail_in != 0
365 && result != Z_STREAM_END);
367 *size = zstream.total_out;
368 inflateEnd(&zstream);
369 #endif
370 } else if (enc->comp_algo == 2) {
371 /* lzo encoded track */
372 int out_avail;
373 int dstlen = *size * 3;
375 *dest = NULL;
376 while (1) {
377 int srclen = *size;
378 *dest = talloc_realloc_size(NULL, *dest,
379 dstlen + AV_LZO_OUTPUT_PADDING);
380 out_avail = dstlen;
381 int result = av_lzo1x_decode(*dest, &out_avail, src, &srclen);
382 if (result == 0)
383 break;
384 if (!(result & AV_LZO_OUTPUT_FULL)) {
385 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
386 "[mkv] lzo decompression failed.\n");
387 talloc_free(*dest);
388 *dest = NULL;
389 goto error;
391 mp_msg(MSGT_DEMUX, MSGL_DBG2,
392 "[mkv] lzo decompression buffer too small.\n");
393 dstlen *= 2;
395 *size = dstlen - out_avail;
396 } else if (enc->comp_algo == 3) {
397 *dest = talloc_size(NULL, *size + enc->comp_settings_len);
398 memcpy(*dest, enc->comp_settings, enc->comp_settings_len);
399 memcpy(*dest + enc->comp_settings_len, src, *size);
400 *size += enc->comp_settings_len;
404 error:
405 if (src != *dest && src != orig_src)
406 talloc_free(src);
410 static int demux_mkv_read_info(demuxer_t *demuxer)
412 mkv_demuxer_t *mkv_d = demuxer->priv;
413 stream_t *s = demuxer->stream;
415 mkv_d->tc_scale = 1000000;
416 mkv_d->duration = 0;
418 struct ebml_info info = {};
419 struct ebml_parse_ctx parse_ctx = {};
420 if (ebml_read_element(s, &parse_ctx, &info, &ebml_info_desc) < 0)
421 return 1;
422 if (info.n_timecode_scale) {
423 mkv_d->tc_scale = info.timecode_scale;
424 mp_msg(MSGT_DEMUX, MSGL_V,
425 "[mkv] | + timecode scale: %" PRIu64 "\n", mkv_d->tc_scale);
427 if (info.n_duration) {
428 mkv_d->duration = info.duration * mkv_d->tc_scale / 1e9;
429 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
430 mkv_d->duration);
432 if (info.n_segment_uid) {
433 int len = info.segment_uid.len;
434 if (len != sizeof(demuxer->matroska_data.segment_uid)) {
435 mp_msg(MSGT_DEMUX, MSGL_INFO,
436 "[mkv] segment uid invalid length %d\n", len);
437 } else {
438 memcpy(demuxer->matroska_data.segment_uid, info.segment_uid.start,
439 len);
440 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + segment uid");
441 for (int i = 0; i < len; i++)
442 mp_msg(MSGT_DEMUX, MSGL_V, " %02x",
443 demuxer->matroska_data.segment_uid[i]);
444 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
447 talloc_free(parse_ctx.talloc_ctx);
448 return 0;
451 static void parse_trackencodings(struct demuxer *demuxer,
452 struct mkv_track *track,
453 struct ebml_content_encodings *encodings)
455 // initial allocation to be a non-NULL context before realloc
456 mkv_content_encoding_t *ce = talloc_size(track, 1);
458 for (int n_enc = 0; n_enc < encodings->n_content_encoding; n_enc++) {
459 struct ebml_content_encoding *enc = encodings->content_encoding + n_enc;
460 struct mkv_content_encoding e = {};
461 e.order = enc->content_encoding_order;
462 if (enc->n_content_encoding_scope)
463 e.scope = enc->content_encoding_scope;
464 else
465 e.scope = 1;
466 e.type = enc->content_encoding_type;
468 if (enc->n_content_compression) {
469 struct ebml_content_compression *z = &enc->content_compression;
470 e.comp_algo = z->content_comp_algo;
471 if (z->n_content_comp_settings) {
472 int sz = z->content_comp_settings.len;
473 e.comp_settings = talloc_size(ce, sz);
474 memcpy(e.comp_settings, z->content_comp_settings.start, sz);
475 e.comp_settings_len = sz;
479 if (e.type == 1) {
480 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track "
481 "number %u has been encrypted and "
482 "decryption has not yet been\n"
483 "[mkv] implemented. Skipping track.\n",
484 track->tnum);
485 } else if (e.type != 0) {
486 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
487 "[mkv] Unknown content encoding type for "
488 "track %u. Skipping track.\n",
489 track->tnum);
490 } else if (e.comp_algo != 0 && e.comp_algo != 2 && e.comp_algo != 3) {
491 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
492 "[mkv] Track %u has been compressed with "
493 "an unknown/unsupported compression\n"
494 "[mkv] algorithm (%" PRIu64 "). Skipping track.\n",
495 track->tnum, e.comp_algo);
497 #if !CONFIG_ZLIB
498 else if (e.comp_algo == 0) {
499 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
500 "[mkv] Track %u was compressed with zlib "
501 "but mplayer has not been compiled\n"
502 "[mkv] with support for zlib compression. "
503 "Skipping track.\n",
504 track->tnum);
506 #endif
507 int i;
508 for (i = 0; i < n_enc; i++)
509 if (e.order >= ce[i].order)
510 break;
511 ce = talloc_realloc_size(track, ce, (n_enc + 1) * sizeof(*ce));
512 memmove(ce + i + 1, ce + i, (n_enc - i) * sizeof(*ce));
513 memcpy(ce + i, &e, sizeof(e));
516 track->encodings = ce;
517 track->num_encodings = encodings->n_content_encoding;
520 static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track,
521 struct ebml_audio *audio)
523 if (audio->n_sampling_frequency) {
524 track->a_sfreq = audio->sampling_frequency;
525 mp_msg(MSGT_DEMUX, MSGL_V,
526 "[mkv] | + Sampling frequency: %f\n", track->a_sfreq);
527 } else
528 track->a_sfreq = 8000;
529 if (audio->n_output_sampling_frequency) {
530 track->a_osfreq = audio->output_sampling_frequency;
531 mp_msg(MSGT_DEMUX, MSGL_V,
532 "[mkv] | + Output sampling frequency: %f\n", track->a_osfreq);
533 } else
534 track->a_osfreq = track->a_sfreq;
535 if (audio->n_bit_depth) {
536 track->a_bps = audio->bit_depth;
537 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
538 track->a_bps);
540 if (audio->n_channels) {
541 track->a_channels = audio->channels;
542 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
543 track->a_channels);
544 } else
545 track->a_channels = 1;
548 static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track,
549 struct ebml_video *video)
551 if (video->n_frame_rate) {
552 track->v_frate = video->frame_rate;
553 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
554 track->v_frate);
555 if (track->v_frate > 0)
556 track->default_duration = 1 / track->v_frate;
558 if (video->n_display_width) {
559 track->v_dwidth = video->display_width;
560 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
561 track->v_dwidth);
563 if (video->n_display_height) {
564 track->v_dheight = video->display_height;
565 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
566 track->v_dheight);
568 if (video->n_pixel_width) {
569 track->v_width = video->pixel_width;
570 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
571 track->v_width);
573 if (video->n_pixel_height) {
574 track->v_height = video->pixel_height;
575 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
576 track->v_height);
581 * \brief free any data associated with given track
582 * \param track track of which to free data
584 static void demux_mkv_free_trackentry(mkv_track_t *track)
586 free(track->audio_buf);
587 free(track->audio_timestamp);
588 talloc_free(track);
591 static void parse_trackentry(struct demuxer *demuxer,
592 struct ebml_track_entry *entry)
594 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
595 struct mkv_track *track = talloc_zero_size(NULL, sizeof(*track));
597 track->tnum = entry->track_number;
598 if (track->tnum)
599 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
600 track->tnum);
601 else
602 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing track number!\n");
604 if (entry->n_name) {
605 track->name = talloc_strndup(track, entry->name.start,
606 entry->name.len);
607 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
608 track->name);
611 track->type = entry->track_type;
612 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
613 switch (track->type) {
614 case MATROSKA_TRACK_AUDIO:
615 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
616 break;
617 case MATROSKA_TRACK_VIDEO:
618 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
619 break;
620 case MATROSKA_TRACK_SUBTITLE:
621 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
622 break;
623 default:
624 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
625 break;
628 if (entry->n_audio) {
629 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
630 parse_trackaudio(demuxer, track, &entry->audio);
633 if (entry->n_video) {
634 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
635 parse_trackvideo(demuxer, track, &entry->video);
638 if (entry->n_codec_id) {
639 track->codec_id = talloc_strndup(track, entry->codec_id.start,
640 entry->codec_id.len);
641 if (!strcmp(track->codec_id, MKV_V_MSCOMP)
642 || !strcmp(track->codec_id, MKV_A_ACM))
643 track->ms_compat = 1;
644 else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
645 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB;
646 else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
647 || !strcmp(track->codec_id, MKV_S_TEXTASS)
648 || !strcmp(track->codec_id, MKV_S_SSA)
649 || !strcmp(track->codec_id, MKV_S_ASS)) {
650 track->subtitle_type = MATROSKA_SUBTYPE_SSA;
651 } else if (!strcmp(track->codec_id, MKV_S_TEXTASCII))
652 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
653 if (!strcmp(track->codec_id, MKV_S_TEXTUTF8)) {
654 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
656 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
657 track->codec_id);
658 } else
659 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Missing codec ID!\n");
661 if (entry->n_codec_private) {
662 int len = entry->codec_private.len;
663 track->private_data = talloc_size(track, len + AV_LZO_INPUT_PADDING);
664 memcpy(track->private_data, entry->codec_private.start, len);
665 track->private_size = len;
666 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length %u\n",
667 track->private_size);
670 if (entry->n_language) {
671 track->language = talloc_strndup(track, entry->language.start,
672 entry->language.len);
673 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
674 track->language);
675 } else
676 track->language = talloc_strdup(track, "eng");
678 if (entry->n_flag_default) {
679 track->default_track = entry->flag_default;
680 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
681 track->default_track);
682 } else
683 track->default_track = 1;
685 if (entry->n_default_duration) {
686 track->default_duration = entry->default_duration / 1e9;
687 if (entry->default_duration == 0)
688 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
689 else {
690 if (!track->v_frate)
691 track->v_frate = 1e9 / entry->default_duration;
692 mp_msg(MSGT_DEMUX, MSGL_V,
693 "[mkv] | + Default duration: %.3fms ( = %.3f fps)\n",
694 entry->default_duration / 1000000.0, track->v_frate);
698 if (entry->n_content_encodings)
699 parse_trackencodings(demuxer, track, &entry->content_encodings);
701 mkv_d->tracks[mkv_d->num_tracks++] = track;
704 static int demux_mkv_read_tracks(demuxer_t *demuxer)
706 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
707 stream_t *s = demuxer->stream;
709 struct ebml_tracks tracks = {};
710 struct ebml_parse_ctx parse_ctx = {};
711 if (ebml_read_element(s, &parse_ctx, &tracks, &ebml_tracks_desc) < 0)
712 return 1;
714 mkv_d->tracks = talloc_size(mkv_d,
715 tracks.n_track_entry * sizeof(*mkv_d->tracks));
716 for (int i = 0; i < tracks.n_track_entry; i++) {
717 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
718 parse_trackentry(demuxer, &tracks.track_entry[i]);
720 talloc_free(parse_ctx.talloc_ctx);
721 return 0;
724 static int demux_mkv_read_cues(demuxer_t *demuxer)
726 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
727 stream_t *s = demuxer->stream;
729 if (index_mode == 0 || index_mode == 2) {
730 ebml_read_skip(s, NULL);
731 return 0;
734 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
735 struct ebml_cues cues = {};
736 struct ebml_parse_ctx parse_ctx = {};
737 if (ebml_read_element(s, &parse_ctx, &cues, &ebml_cues_desc) < 0)
738 goto out;
739 for (int i = 0; i < cues.n_cue_point; i++) {
740 struct ebml_cue_point *cuepoint = &cues.cue_point[i];
741 if (cuepoint->n_cue_time != 1 || !cuepoint->n_cue_track_positions) {
742 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed CuePoint element\n");
743 continue;
745 uint64_t time = cuepoint->cue_time;
746 for (int i = 0; i < cuepoint->n_cue_track_positions; i++) {
747 struct ebml_cue_track_positions *trackpos =
748 &cuepoint->cue_track_positions[i];
749 uint64_t track = trackpos->cue_track;
750 uint64_t pos = trackpos->cue_cluster_position;
751 mkv_d->indexes =
752 grow_array(mkv_d->indexes, mkv_d->num_indexes,
753 sizeof(mkv_index_t));
754 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
755 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
756 mkv_d->indexes[mkv_d->num_indexes].filepos =
757 mkv_d->segment_start + pos;
758 mp_msg(MSGT_DEMUX, MSGL_DBG2,
759 "[mkv] |+ found cue point for track %" PRIu64
760 ": timecode %" PRIu64 ", filepos: %" PRIu64 "\n", track,
761 time, mkv_d->segment_start + pos);
762 mkv_d->num_indexes++;
766 out:
767 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
768 talloc_free(parse_ctx.talloc_ctx);
769 return 0;
772 static int demux_mkv_read_chapters(struct demuxer *demuxer)
774 struct MPOpts *opts = demuxer->opts;
775 stream_t *s = demuxer->stream;
777 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
778 struct ebml_chapters file_chapters = {};
779 struct ebml_parse_ctx parse_ctx = {};
780 if (ebml_read_element(s, &parse_ctx, &file_chapters,
781 &ebml_chapters_desc) < 0)
782 goto out;
784 int selected_edition = 0;
785 int num_editions = file_chapters.n_edition_entry;
786 struct ebml_edition_entry *editions = file_chapters.edition_entry;
787 if (opts->edition_id >= 0 && opts->edition_id < num_editions) {
788 selected_edition = opts->edition_id;
789 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] User-specified edition: %d\n",
790 selected_edition);
791 } else
792 for (int i = 0; i < num_editions; i++)
793 if (editions[i].edition_flag_default) {
794 selected_edition = i;
795 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition: %d\n", i);
796 break;
798 struct matroska_chapter *m_chapters = NULL;
799 if (editions[selected_edition].edition_flag_ordered) {
800 int count = editions[selected_edition].n_chapter_atom;
801 m_chapters = talloc_array_ptrtype(demuxer, m_chapters, count);
802 demuxer->matroska_data.ordered_chapters = m_chapters;
803 demuxer->matroska_data.num_ordered_chapters = count;
806 for (int idx = 0; idx < num_editions; idx++) {
807 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New edition %d\n", idx);
808 int warn_level = idx == selected_edition ? MSGL_WARN : MSGL_V;
809 if (editions[idx].n_edition_flag_default)
810 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Default edition flag: %"PRIu64
811 "\n", editions[idx].edition_flag_default);
812 if (editions[idx].n_edition_flag_ordered)
813 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Ordered chapter flag: %"PRIu64
814 "\n", editions[idx].edition_flag_ordered);
815 for (int i = 0; i < editions[idx].n_chapter_atom; i++) {
816 struct ebml_chapter_atom *ca = editions[idx].chapter_atom + i;
817 struct matroska_chapter chapter = { };
818 struct bstr name = { "(unnamed)", 9 };
820 if (!ca->n_chapter_time_start)
821 mp_msg(MSGT_DEMUX, warn_level,
822 "[mkv] Chapter lacks start time\n");
823 chapter.start = ca->chapter_time_start / 1000000;
824 chapter.end = ca->chapter_time_end / 1000000;
826 if (ca->n_chapter_display) {
827 if (ca->n_chapter_display > 1)
828 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Multiple chapter "
829 "names not supported, picking first\n");
830 if (!ca->chapter_display[0].n_chap_string)
831 mp_msg(MSGT_DEMUX, warn_level, "[mkv] Malformed chapter "
832 "name entry\n");
833 else
834 name = ca->chapter_display[0].chap_string;
837 if (ca->n_chapter_segment_uid) {
838 chapter.has_segment_uid = true;
839 int len = ca->chapter_segment_uid.len;
840 if (len != sizeof(chapter.segment_uid))
841 mp_msg(MSGT_DEMUX, warn_level,
842 "[mkv] Chapter segment uid bad length %d\n", len);
843 else if (ca->n_chapter_segment_edition_uid) {
844 mp_tmsg(MSGT_DEMUX, warn_level, "[mkv] Warning: "
845 "unsupported edition recursion in chapter; "
846 "will skip on playback!\n");
847 } else {
848 memcpy(chapter.segment_uid, ca->chapter_segment_uid.start,
849 len);
850 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter segment uid ");
851 for (int i = 0; i < len; i++)
852 mp_msg(MSGT_DEMUX, MSGL_V, "%02x ",
853 chapter.segment_uid[i]);
854 mp_msg(MSGT_DEMUX, MSGL_V, "\n");
858 mp_msg(MSGT_DEMUX, MSGL_V,
859 "[mkv] Chapter %u from %02d:%02d:%02d.%03d "
860 "to %02d:%02d:%02d.%03d, %.*s\n", i,
861 (int) (chapter.start / 60 / 60 / 1000),
862 (int) ((chapter.start / 60 / 1000) % 60),
863 (int) ((chapter.start / 1000) % 60),
864 (int) (chapter.start % 1000),
865 (int) (chapter.end / 60 / 60 / 1000),
866 (int) ((chapter.end / 60 / 1000) % 60),
867 (int) ((chapter.end / 1000) % 60),
868 (int) (chapter.end % 1000),
869 BSTR_P(name));
871 if (idx == selected_edition){
872 demuxer_add_chapter(demuxer, name, chapter.start, chapter.end);
873 if (editions[idx].edition_flag_ordered) {
874 chapter.name = talloc_strndup(m_chapters, name.start,
875 name.len);
876 m_chapters[i] = chapter;
881 if (num_editions > 1)
882 mp_msg(MSGT_DEMUX, MSGL_INFO,
883 "[mkv] Found %d editions, will play #%d (first is 0).\n",
884 num_editions, selected_edition);
886 out:
887 talloc_free(parse_ctx.talloc_ctx);
888 mp_msg(MSGT_DEMUX, MSGL_V,
889 "[mkv] \\---- [ parsing chapters ] ---------\n");
890 return 0;
893 static int demux_mkv_read_tags(demuxer_t *demuxer)
895 stream_t *s = demuxer->stream;
897 struct ebml_parse_ctx parse_ctx = {};
898 struct ebml_tags tags = {};
899 if (ebml_read_element(s, &parse_ctx, &tags, &ebml_tags_desc) < 0)
900 return 1;
902 for (int i = 0; i < tags.n_tag; i++) {
903 struct ebml_tag tag = tags.tag[i];
904 if (tag.targets.target_track_uid || tag.targets.target_edition_uid ||
905 tag.targets.target_chapter_uid || tag.targets.target_attachment_uid)
906 continue;
908 for (int j; j < tag.n_simple_tag; j++)
909 demux_info_add_bstr(demuxer, tag.simple_tag[j].tag_name, tag.simple_tag[j].tag_string);
912 return 0;
915 static int demux_mkv_read_attachments(demuxer_t *demuxer)
917 stream_t *s = demuxer->stream;
919 mp_msg(MSGT_DEMUX, MSGL_V,
920 "[mkv] /---- [ parsing attachments ] ---------\n");
922 struct ebml_attachments attachments = {};
923 struct ebml_parse_ctx parse_ctx = {};
924 if (ebml_read_element(s, &parse_ctx, &attachments,
925 &ebml_attachments_desc) < 0)
926 goto out;
928 for (int i = 0; i < attachments.n_attached_file; i++) {
929 struct ebml_attached_file *attachment = &attachments.attached_file[i];
930 if (!attachment->n_file_name || !attachment->n_file_mime_type
931 || !attachment->n_file_data) {
932 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed attachment\n");
933 continue;
935 struct bstr name = attachment->file_name;
936 struct bstr mime = attachment->file_mime_type;
937 demuxer_add_attachment(demuxer, name, mime, attachment->file_data);
938 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Attachment: %.*s, %.*s, %zu bytes\n",
939 BSTR_P(name), BSTR_P(mime), attachment->file_data.len);
942 out:
943 talloc_free(parse_ctx.talloc_ctx);
944 mp_msg(MSGT_DEMUX, MSGL_V,
945 "[mkv] \\---- [ parsing attachments ] ---------\n");
946 return 0;
949 static int read_header_element(struct demuxer *demuxer, uint32_t id,
950 off_t at_filepos);
952 static int demux_mkv_read_seekhead(demuxer_t *demuxer)
954 struct mkv_demuxer *mkv_d = demuxer->priv;
955 struct stream *s = demuxer->stream;
956 int res = 0;
957 struct ebml_seek_head seekhead = {};
958 struct ebml_parse_ctx parse_ctx = {};
960 mp_msg(MSGT_DEMUX, MSGL_V,
961 "[mkv] /---- [ parsing seek head ] ---------\n");
962 if (ebml_read_element(s, &parse_ctx, &seekhead, &ebml_seek_head_desc) < 0) {
963 res = 1;
964 goto out;
966 /* off now holds the position of the next element after the seek head. */
967 off_t off = stream_tell(s);
968 for (int i = 0; i < seekhead.n_seek; i++) {
969 struct ebml_seek *seek = &seekhead.seek[i];
970 if (seek->n_seek_id != 1 || seek->n_seek_position != 1) {
971 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Invalid SeekHead entry\n");
972 continue;
974 uint64_t pos = seek->seek_position + mkv_d->segment_start;
975 if (pos >= demuxer->movi_end) {
976 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] SeekHead position beyond "
977 "end of file - incomplete file?\n");
978 continue;
980 read_header_element(demuxer, seek->seek_id, pos);
982 if (!stream_seek(s, off)) {
983 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Couldn't seek back after "
984 "SeekHead??\n");
985 res = 1;
987 out:
988 mp_msg(MSGT_DEMUX, MSGL_V,
989 "[mkv] \\---- [ parsing seek head ] ---------\n");
990 talloc_free(parse_ctx.talloc_ctx);
991 return res;
994 static bool seek_pos_id(struct stream *s, off_t pos, uint32_t id)
996 if (!stream_seek(s, pos)) {
997 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Failed to seek in file\n");
998 return false;
1000 if (ebml_read_id(s, NULL) != id) {
1001 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Expected element not found\n");
1002 return false;
1004 return true;
1007 static int read_header_element(struct demuxer *demuxer, uint32_t id,
1008 off_t at_filepos)
1010 struct mkv_demuxer *mkv_d = demuxer->priv;
1011 stream_t *s = demuxer->stream;
1012 off_t pos = stream_tell(s) - 4;
1014 switch(id) {
1015 case MATROSKA_ID_INFO:
1016 if (mkv_d->parsed_info)
1017 break;
1018 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1019 return -1;
1020 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
1021 mkv_d->parsed_info = true;
1022 return demux_mkv_read_info(demuxer) ? -1 : 1;
1024 case MATROSKA_ID_TRACKS:
1025 if (mkv_d->parsed_tracks)
1026 break;
1027 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1028 return -1;
1029 mkv_d->parsed_tracks = true;
1030 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
1031 return demux_mkv_read_tracks(demuxer) ? -1 : 1;
1033 case MATROSKA_ID_CUES:
1034 if (is_parsed_header(mkv_d, pos))
1035 break;
1036 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1037 return -1;
1038 return demux_mkv_read_cues(demuxer) ? -1 : 1;
1040 case MATROSKA_ID_TAGS:
1041 if (mkv_d->parsed_tags)
1042 break;
1043 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1044 return -1;
1045 mkv_d->parsed_tags = true;
1046 return demux_mkv_read_tags(demuxer) ? -1 : 1;
1048 case MATROSKA_ID_SEEKHEAD:
1049 if (is_parsed_header(mkv_d, pos))
1050 break;
1051 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1052 return -1;
1053 return demux_mkv_read_seekhead(demuxer) ? -1 : 1;
1055 case MATROSKA_ID_CHAPTERS:
1056 if (mkv_d->parsed_chapters)
1057 break;
1058 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1059 return -1;
1060 mkv_d->parsed_chapters = true;
1061 return demux_mkv_read_chapters(demuxer) ? -1 : 1;
1063 case MATROSKA_ID_ATTACHMENTS:
1064 if (mkv_d->parsed_attachments)
1065 break;
1066 if (at_filepos && !seek_pos_id(s, at_filepos, id))
1067 return -1;
1068 mkv_d->parsed_attachments = true;
1069 return demux_mkv_read_attachments(demuxer) ? -1 : 1;
1071 default:
1072 if (!at_filepos)
1073 ebml_read_skip(s, NULL);
1074 return 0;
1076 if (!at_filepos)
1077 ebml_read_skip(s, NULL);
1078 return 1;
1083 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1084 int vid);
1085 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1086 int aid);
1087 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1088 int sid);
1090 static void display_create_tracks(demuxer_t *demuxer)
1092 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1093 int i, vid = 0, aid = 0, sid = 0;
1095 for (i = 0; i < mkv_d->num_tracks; i++) {
1096 char *type = "unknown", str[32];
1097 *str = '\0';
1098 switch (mkv_d->tracks[i]->type) {
1099 case MATROSKA_TRACK_VIDEO:
1100 type = "video";
1101 mkv_d->tracks[i]->id = -1;
1102 if (vid == MAX_V_STREAMS)
1103 break;
1104 mkv_d->tracks[i]->id = vid;
1105 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid);
1106 if (mkv_d->tracks[i]->name)
1107 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", vid,
1108 mkv_d->tracks[i]->name);
1109 sprintf(str, "-vid %u", vid++);
1110 break;
1111 case MATROSKA_TRACK_AUDIO:
1112 type = "audio";
1113 mkv_d->tracks[i]->id = -1;
1114 if (aid == MAX_A_STREAMS)
1115 break;
1116 mkv_d->tracks[i]->id = aid;
1117 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid);
1118 if (mkv_d->tracks[i]->name)
1119 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", aid,
1120 mkv_d->tracks[i]->name);
1121 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", aid,
1122 mkv_d->tracks[i]->language);
1123 sprintf(str, "-aid %u, -alang %.5s", aid++,
1124 mkv_d->tracks[i]->language);
1125 break;
1126 case MATROSKA_TRACK_SUBTITLE:
1127 type = "subtitles";
1128 mkv_d->tracks[i]->id = -1;
1129 if (sid == MAX_S_STREAMS)
1130 break;
1131 mkv_d->tracks[i]->id = sid;
1132 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
1133 if (mkv_d->tracks[i]->name)
1134 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid,
1135 mkv_d->tracks[i]->name);
1136 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid,
1137 mkv_d->tracks[i]->language);
1138 sprintf(str, "-sid %u, -slang %.5s", sid++,
1139 mkv_d->tracks[i]->language);
1140 break;
1142 if (mkv_d->tracks[i]->name)
1143 mp_tmsg(MSGT_DEMUX, MSGL_INFO,
1144 "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1145 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1146 mkv_d->tracks[i]->name, str);
1147 else
1148 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
1149 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
1150 str);
1152 mkv_d->num_audio_tracks = aid;
1155 typedef struct {
1156 char *id;
1157 int fourcc;
1158 int extradata;
1159 } videocodec_info_t;
1161 static const videocodec_info_t vinfo[] = {
1162 {MKV_V_MJPEG, mmioFOURCC('m', 'j', 'p', 'g'), 1},
1163 {MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0},
1164 {MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0},
1165 {MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1166 {MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1167 {MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1},
1168 {MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1},
1169 {MKV_V_THEORA, mmioFOURCC('t', 'h', 'e', 'o'), 1},
1170 {MKV_V_VP8, mmioFOURCC('V', 'P', '8', '0'), 0},
1171 {NULL, 0, 0}
1174 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
1175 int vid)
1177 struct MPOpts *opts = demuxer->opts;
1178 BITMAPINFOHEADER *bih;
1179 void *ImageDesc = NULL;
1180 sh_video_t *sh_v;
1182 if (track->ms_compat) { /* MS compatibility mode */
1183 BITMAPINFOHEADER *src;
1185 if (track->private_data == NULL
1186 || track->private_size < sizeof(*bih))
1187 return 1;
1189 src = (BITMAPINFOHEADER *) track->private_data;
1190 bih = calloc(1, track->private_size);
1191 bih->biSize = le2me_32(src->biSize);
1192 bih->biWidth = le2me_32(src->biWidth);
1193 bih->biHeight = le2me_32(src->biHeight);
1194 bih->biPlanes = le2me_16(src->biPlanes);
1195 bih->biBitCount = le2me_16(src->biBitCount);
1196 bih->biCompression = le2me_32(src->biCompression);
1197 bih->biSizeImage = le2me_32(src->biSizeImage);
1198 bih->biXPelsPerMeter = le2me_32(src->biXPelsPerMeter);
1199 bih->biYPelsPerMeter = le2me_32(src->biYPelsPerMeter);
1200 bih->biClrUsed = le2me_32(src->biClrUsed);
1201 bih->biClrImportant = le2me_32(src->biClrImportant);
1202 memcpy(bih + 1,
1203 src + 1,
1204 track->private_size - sizeof(*bih));
1206 if (track->v_width == 0)
1207 track->v_width = bih->biWidth;
1208 if (track->v_height == 0)
1209 track->v_height = bih->biHeight;
1210 } else {
1211 bih = calloc(1, sizeof(*bih));
1212 bih->biSize = sizeof(*bih);
1213 bih->biWidth = track->v_width;
1214 bih->biHeight = track->v_height;
1215 bih->biBitCount = 24;
1216 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
1218 if (track->private_size >= RVPROPERTIES_SIZE
1219 && (!strcmp(track->codec_id, MKV_V_REALV10)
1220 || !strcmp(track->codec_id, MKV_V_REALV20)
1221 || !strcmp(track->codec_id, MKV_V_REALV30)
1222 || !strcmp(track->codec_id, MKV_V_REALV40))) {
1223 unsigned char *dst, *src;
1224 uint32_t type2;
1225 unsigned int cnt;
1227 src = (uint8_t *) track->private_data + RVPROPERTIES_SIZE;
1229 cnt = track->private_size - RVPROPERTIES_SIZE;
1230 bih = realloc(bih, sizeof(*bih) + 8 + cnt);
1231 bih->biSize = 48 + cnt;
1232 bih->biPlanes = 1;
1233 type2 = AV_RB32(src - 4);
1234 if (type2 == 0x10003000 || type2 == 0x10003001)
1235 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
1236 else
1237 bih->biCompression =
1238 mmioFOURCC('R', 'V', track->codec_id[9], '0');
1239 dst = (unsigned char *) (bih + 1);
1240 // copy type1 and type2 info from rv properties
1241 memcpy(dst, src - 8, 8 + cnt);
1242 track->realmedia = 1;
1244 #ifdef CONFIG_QTX_CODECS
1245 } else if (track->private_size >= sizeof(ImageDescription)
1246 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) {
1247 ImageDescriptionPtr idesc;
1249 idesc = (ImageDescriptionPtr) track->private_data;
1250 idesc->idSize = be2me_32(idesc->idSize);
1251 idesc->cType = be2me_32(idesc->cType);
1252 idesc->version = be2me_16(idesc->version);
1253 idesc->revisionLevel = be2me_16(idesc->revisionLevel);
1254 idesc->vendor = be2me_32(idesc->vendor);
1255 idesc->temporalQuality = be2me_32(idesc->temporalQuality);
1256 idesc->spatialQuality = be2me_32(idesc->spatialQuality);
1257 idesc->width = be2me_16(idesc->width);
1258 idesc->height = be2me_16(idesc->height);
1259 idesc->hRes = be2me_32(idesc->hRes);
1260 idesc->vRes = be2me_32(idesc->vRes);
1261 idesc->dataSize = be2me_32(idesc->dataSize);
1262 idesc->frameCount = be2me_16(idesc->frameCount);
1263 idesc->depth = be2me_16(idesc->depth);
1264 idesc->clutID = be2me_16(idesc->clutID);
1265 bih->biPlanes = 1;
1266 bih->biCompression = idesc->cType;
1267 ImageDesc = idesc;
1268 #endif /* CONFIG_QTX_CODECS */
1270 } else {
1271 const videocodec_info_t *vi = vinfo;
1272 while (vi->id && strcmp(vi->id, track->codec_id))
1273 vi++;
1274 bih->biCompression = vi->fourcc;
1275 if (vi->extradata && track->private_data
1276 && (track->private_size > 0)) {
1277 bih->biSize += track->private_size;
1278 bih = realloc(bih, bih->biSize);
1279 memcpy(bih + 1, track->private_data, track->private_size);
1281 track->reorder_timecodes = opts->user_correct_pts == 0;
1282 if (!vi->id) {
1283 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported "
1284 "CodecID (%s) or missing/bad CodecPrivate\n"
1285 "[mkv] data (track %u).\n",
1286 track->codec_id, track->tnum);
1287 free(bih);
1288 return 1;
1293 sh_v = new_sh_video(demuxer, vid);
1294 sh_v->bih = bih;
1295 sh_v->format = sh_v->bih->biCompression;
1296 if (track->v_frate == 0.0)
1297 track->v_frate = 25.0;
1298 sh_v->fps = track->v_frate;
1299 sh_v->frametime = 1 / track->v_frate;
1300 sh_v->aspect = 0;
1301 if (!track->realmedia) {
1302 sh_v->disp_w = track->v_width;
1303 sh_v->disp_h = track->v_height;
1304 if (track->v_dheight)
1305 sh_v->aspect = (double) track->v_dwidth / track->v_dheight;
1306 } else {
1307 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1308 // disp_w and disp_h from the RealVideo stream contents returned
1309 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1310 // the Matroska file then it has already been set to PixelWidth/Height
1311 // by check_track_information.
1312 sh_v->disp_w = track->v_dwidth;
1313 sh_v->disp_h = track->v_dheight;
1315 sh_v->ImageDesc = ImageDesc;
1316 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
1318 sh_v->ds = demuxer->video;
1319 return 0;
1322 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
1323 int aid)
1325 sh_audio_t *sh_a = new_sh_audio(demuxer, aid);
1326 if (!sh_a)
1327 return 1;
1329 if (track->language && (strcmp(track->language, "und") != 0))
1330 sh_a->lang = strdup(track->language);
1331 sh_a->default_track = track->default_track;
1332 sh_a->ds = demuxer->audio;
1333 sh_a->wf = malloc(sizeof(*sh_a->wf));
1334 if (track->ms_compat && (track->private_size >= sizeof(*sh_a->wf))) {
1335 WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data;
1336 sh_a->wf = realloc(sh_a->wf, track->private_size);
1337 sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag);
1338 sh_a->wf->nChannels = le2me_16(wf->nChannels);
1339 sh_a->wf->nSamplesPerSec = le2me_32(wf->nSamplesPerSec);
1340 sh_a->wf->nAvgBytesPerSec = le2me_32(wf->nAvgBytesPerSec);
1341 sh_a->wf->nBlockAlign = le2me_16(wf->nBlockAlign);
1342 sh_a->wf->wBitsPerSample = le2me_16(wf->wBitsPerSample);
1343 sh_a->wf->cbSize = track->private_size - sizeof(*sh_a->wf);
1344 memcpy(sh_a->wf + 1, wf + 1,
1345 track->private_size - sizeof(*sh_a->wf));
1346 if (track->a_sfreq == 0.0)
1347 track->a_sfreq = sh_a->wf->nSamplesPerSec;
1348 if (track->a_channels == 0)
1349 track->a_channels = sh_a->wf->nChannels;
1350 if (track->a_bps == 0)
1351 track->a_bps = sh_a->wf->wBitsPerSample;
1352 track->a_formattag = sh_a->wf->wFormatTag;
1353 } else {
1354 memset(sh_a->wf, 0, sizeof(*sh_a->wf));
1355 if (!strcmp(track->codec_id, MKV_A_MP3)
1356 || !strcmp(track->codec_id, MKV_A_MP2))
1357 track->a_formattag = 0x0055;
1358 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
1359 track->a_formattag = 0x2000;
1360 else if (!strcmp(track->codec_id, MKV_A_DTS))
1361 track->a_formattag = 0x2001;
1362 else if (!strcmp(track->codec_id, MKV_A_PCM)
1363 || !strcmp(track->codec_id, MKV_A_PCM_BE))
1364 track->a_formattag = 0x0001;
1365 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN)
1366 || !strncmp(track->codec_id, MKV_A_AAC_2LC,
1367 strlen(MKV_A_AAC_2LC))
1368 || !strcmp(track->codec_id, MKV_A_AAC_2SSR)
1369 || !strcmp(track->codec_id, MKV_A_AAC_4MAIN)
1370 || !strncmp(track->codec_id, MKV_A_AAC_4LC,
1371 strlen(MKV_A_AAC_4LC))
1372 || !strcmp(track->codec_id, MKV_A_AAC_4SSR)
1373 || !strcmp(track->codec_id, MKV_A_AAC_4LTP)
1374 || !strcmp(track->codec_id, MKV_A_AAC))
1375 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
1376 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
1377 if (track->private_data == NULL)
1378 return 1;
1379 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's');
1380 } else if (!strcmp(track->codec_id, MKV_A_QDMC))
1381 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
1382 else if (!strcmp(track->codec_id, MKV_A_QDMC2))
1383 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
1384 else if (!strcmp(track->codec_id, MKV_A_WAVPACK))
1385 track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K');
1386 else if (!strcmp(track->codec_id, MKV_A_TRUEHD))
1387 track->a_formattag = mmioFOURCC('T', 'R', 'H', 'D');
1388 else if (!strcmp(track->codec_id, MKV_A_FLAC)) {
1389 if (track->private_data == NULL || track->private_size == 0) {
1390 mp_tmsg(MSGT_DEMUX, MSGL_WARN,
1391 "[mkv] FLAC track does not contain valid headers.\n");
1392 return 1;
1394 track->a_formattag = mmioFOURCC('f', 'L', 'a', 'C');
1395 } else if (track->private_size >= RAPROPERTIES4_SIZE) {
1396 if (!strcmp(track->codec_id, MKV_A_REAL28))
1397 track->a_formattag = mmioFOURCC('2', '8', '_', '8');
1398 else if (!strcmp(track->codec_id, MKV_A_REALATRC))
1399 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
1400 else if (!strcmp(track->codec_id, MKV_A_REALCOOK))
1401 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
1402 else if (!strcmp(track->codec_id, MKV_A_REALDNET))
1403 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
1404 else if (!strcmp(track->codec_id, MKV_A_REALSIPR))
1405 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
1406 } else {
1407 mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1408 "codec ID '%s' for track %u or missing/faulty\n[mkv] "
1409 "private codec data.\n", track->codec_id, track->tnum);
1410 free_sh_audio(demuxer, track->id);
1411 return 1;
1415 sh_a->format = track->a_formattag;
1416 sh_a->wf->wFormatTag = track->a_formattag;
1417 sh_a->channels = track->a_channels;
1418 sh_a->wf->nChannels = track->a_channels;
1419 sh_a->samplerate = (uint32_t) track->a_sfreq;
1420 sh_a->container_out_samplerate = track->a_osfreq;
1421 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
1422 if (track->a_bps == 0) {
1423 sh_a->samplesize = 2;
1424 sh_a->wf->wBitsPerSample = 16;
1425 } else {
1426 sh_a->samplesize = track->a_bps / 8;
1427 sh_a->wf->wBitsPerSample = track->a_bps;
1429 if (track->a_formattag == 0x0055) { /* MP3 || MP2 */
1430 sh_a->wf->nAvgBytesPerSec = 16000;
1431 sh_a->wf->nBlockAlign = 1152;
1432 } else if ((track->a_formattag == 0x2000) /* AC3 */
1433 || (track->a_formattag == 0x2001)) { /* DTS */
1434 free(sh_a->wf);
1435 sh_a->wf = NULL;
1436 } else if (track->a_formattag == 0x0001) { /* PCM || PCM_BE */
1437 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
1438 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
1439 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
1440 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
1441 } else if (!strcmp(track->codec_id, MKV_A_QDMC)
1442 || !strcmp(track->codec_id, MKV_A_QDMC2)) {
1443 sh_a->wf->nAvgBytesPerSec = 16000;
1444 sh_a->wf->nBlockAlign = 1486;
1445 track->fix_i_bps = 1;
1446 track->qt_last_a_pts = 0.0;
1447 if (track->private_data != NULL) {
1448 sh_a->codecdata = malloc(track->private_size);
1449 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1450 sh_a->codecdata_len = track->private_size;
1452 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
1453 int profile, srate_idx;
1455 sh_a->wf->nAvgBytesPerSec = 16000;
1456 sh_a->wf->nBlockAlign = 1024;
1458 if (!strcmp(track->codec_id, MKV_A_AAC)
1459 && (NULL != track->private_data)) {
1460 sh_a->codecdata = malloc(track->private_size);
1461 memcpy(sh_a->codecdata, track->private_data, track->private_size);
1462 sh_a->codecdata_len = track->private_size;
1463 return 0;
1466 /* Recreate the 'private data' */
1467 /* which faad2 uses in its initialization */
1468 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1469 if (!strncmp(&track->codec_id[12], "MAIN", 4))
1470 profile = 0;
1471 else if (!strncmp(&track->codec_id[12], "LC", 2))
1472 profile = 1;
1473 else if (!strncmp(&track->codec_id[12], "SSR", 3))
1474 profile = 2;
1475 else
1476 profile = 3;
1477 sh_a->codecdata = malloc(5);
1478 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xE) >> 1);
1479 sh_a->codecdata[1] =
1480 ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
1482 if (strstr(track->codec_id, "SBR") != NULL) {
1483 /* HE-AAC (aka SBR AAC) */
1484 sh_a->codecdata_len = 5;
1486 sh_a->samplerate *= 2;
1487 sh_a->wf->nSamplesPerSec *= 2;
1488 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
1489 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
1490 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
1491 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
1492 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
1493 } else {
1494 sh_a->codecdata_len = 2;
1495 track->default_duration = 1024.0 / sh_a->samplerate;
1497 } else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) { /* VORBIS */
1498 sh_a->wf->cbSize = track->private_size;
1499 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1500 memcpy((unsigned char *) (sh_a->wf + 1), track->private_data,
1501 sh_a->wf->cbSize);
1502 } else if (track->private_size >= RAPROPERTIES4_SIZE
1503 && !strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
1504 /* Common initialization for all RealAudio codecs */
1505 unsigned char *src = track->private_data;
1506 int codecdata_length, version;
1507 int flavor;
1509 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
1511 version = AV_RB16(src + 4);
1512 flavor = AV_RB16(src + 22);
1513 track->coded_framesize = AV_RB32(src + 24);
1514 track->sub_packet_h = AV_RB16(src + 40);
1515 sh_a->wf->nBlockAlign = track->audiopk_size = AV_RB16(src + 42);
1516 track->sub_packet_size = AV_RB16(src + 44);
1517 if (version == 4) {
1518 src += RAPROPERTIES4_SIZE;
1519 src += src[0] + 1;
1520 src += src[0] + 1;
1521 } else
1522 src += RAPROPERTIES5_SIZE;
1524 src += 3;
1525 if (version == 5)
1526 src++;
1527 codecdata_length = AV_RB32(src);
1528 src += 4;
1529 sh_a->wf->cbSize = codecdata_length;
1530 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
1531 memcpy(((char *) (sh_a->wf + 1)), src, codecdata_length);
1533 switch (track->a_formattag) {
1534 case mmioFOURCC('a', 't', 'r', 'c'):
1535 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[flavor];
1536 sh_a->wf->nBlockAlign = track->sub_packet_size;
1537 track->audio_buf =
1538 malloc(track->sub_packet_h * track->audiopk_size);
1539 track->audio_timestamp =
1540 malloc(track->sub_packet_h * sizeof(double));
1541 break;
1542 case mmioFOURCC('c', 'o', 'o', 'k'):
1543 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[flavor];
1544 sh_a->wf->nBlockAlign = track->sub_packet_size;
1545 track->audio_buf =
1546 malloc(track->sub_packet_h * track->audiopk_size);
1547 track->audio_timestamp =
1548 malloc(track->sub_packet_h * sizeof(double));
1549 break;
1550 case mmioFOURCC('s', 'i', 'p', 'r'):
1551 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[flavor];
1552 sh_a->wf->nBlockAlign = track->coded_framesize;
1553 track->audio_buf =
1554 malloc(track->sub_packet_h * track->audiopk_size);
1555 track->audio_timestamp =
1556 malloc(track->sub_packet_h * sizeof(double));
1557 break;
1558 case mmioFOURCC('2', '8', '_', '8'):
1559 sh_a->wf->nAvgBytesPerSec = 3600;
1560 sh_a->wf->nBlockAlign = track->coded_framesize;
1561 track->audio_buf =
1562 malloc(track->sub_packet_h * track->audiopk_size);
1563 track->audio_timestamp =
1564 malloc(track->sub_packet_h * sizeof(double));
1565 break;
1568 track->realmedia = 1;
1569 } else if (!strcmp(track->codec_id, MKV_A_FLAC)
1570 || (track->a_formattag == 0xf1ac)) {
1571 unsigned char *ptr;
1572 int size;
1573 free(sh_a->wf);
1574 sh_a->wf = NULL;
1576 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) {
1577 ptr = track->private_data;
1578 size = track->private_size;
1579 } else {
1580 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
1581 ptr = track->private_data + sizeof(*sh_a->wf);
1582 size = track->private_size - sizeof(*sh_a->wf);
1584 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
1585 || ptr[3] != 'C') {
1586 sh_a->codecdata = malloc(4);
1587 sh_a->codecdata_len = 4;
1588 memcpy(sh_a->codecdata, "fLaC", 4);
1589 } else {
1590 sh_a->codecdata = malloc(size);
1591 sh_a->codecdata_len = size;
1592 memcpy(sh_a->codecdata, ptr, size);
1594 } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */
1595 } else if (!track->ms_compat
1596 || (track->private_size < sizeof(*sh_a->wf))) {
1597 free_sh_audio(demuxer, track->id);
1598 return 1;
1601 return 0;
1604 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
1605 int sid)
1607 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) {
1608 int size;
1609 uint8_t *buffer;
1610 sh_sub_t *sh = new_sh_sub(demuxer, sid);
1611 track->sh_sub = sh;
1612 sh->type = 't';
1613 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
1614 sh->type = 'v';
1615 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
1616 sh->type = 'a';
1617 size = track->private_size;
1618 demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
1619 if (buffer && buffer != track->private_data) {
1620 talloc_free(track->private_data);
1621 talloc_steal(track, buffer);
1622 track->private_data = buffer;
1623 track->private_size = size;
1625 sh->extradata = malloc(track->private_size);
1626 memcpy(sh->extradata, track->private_data, track->private_size);
1627 sh->extradata_len = track->private_size;
1628 if (track->language && (strcmp(track->language, "und") != 0))
1629 sh->lang = strdup(track->language);
1630 sh->default_track = track->default_track;
1631 } else {
1632 mp_tmsg(MSGT_DEMUX, MSGL_ERR,
1633 "[mkv] Subtitle type '%s' is not supported.\n",
1634 track->codec_id);
1635 return 1;
1638 return 0;
1641 static int demux_mkv_open(demuxer_t *demuxer)
1643 stream_t *s = demuxer->stream;
1644 mkv_demuxer_t *mkv_d;
1645 mkv_track_t *track;
1646 int i, cont = 0;
1648 stream_seek(s, s->start_pos);
1649 if (ebml_read_id(s, NULL) != EBML_ID_EBML)
1650 return 0;
1651 struct ebml_ebml ebml_master = {};
1652 struct ebml_parse_ctx parse_ctx = { .no_error_messages = true };
1653 if (ebml_read_element(s, &parse_ctx, &ebml_master, &ebml_ebml_desc) < 0)
1654 return 0;
1655 if (ebml_master.doc_type.start == NULL) {
1656 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] File has EBML header but no doctype."
1657 " Assuming \"matroska\".\n");
1658 } else if (bstrcmp(ebml_master.doc_type, BSTR("matroska")) != 0
1659 && bstrcmp(ebml_master.doc_type, BSTR("webm")) != 0) {
1660 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] no head found\n");
1661 talloc_free(parse_ctx.talloc_ctx);
1662 return 0;
1664 if (ebml_master.doc_type_read_version > 2) {
1665 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1666 "but we don't support format version %"PRIu64"\n",
1667 ebml_master.doc_type_read_version);
1668 talloc_free(parse_ctx.talloc_ctx);
1669 return 0;
1671 if ((ebml_master.n_ebml_read_version
1672 && ebml_master.ebml_read_version != EBML_VERSION)
1673 || (ebml_master.n_ebml_max_size_length
1674 && ebml_master.ebml_max_size_length > 8)
1675 || (ebml_master.n_ebml_max_id_length
1676 && ebml_master.ebml_max_id_length != 4)) {
1677 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] This looks like a Matroska file, "
1678 "but the header has bad parameters\n");
1679 talloc_free(parse_ctx.talloc_ctx);
1680 return 0;
1682 talloc_free(parse_ctx.talloc_ctx);
1684 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
1686 if (ebml_read_id(s, NULL) != MATROSKA_ID_SEGMENT) {
1687 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
1688 return 0;
1690 ebml_read_length(s, NULL); /* return bytes number until EOF */
1692 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
1694 mkv_d = talloc_zero(demuxer, struct mkv_demuxer);
1695 demuxer->priv = mkv_d;
1696 mkv_d->tc_scale = 1000000;
1697 mkv_d->segment_start = stream_tell(s);
1699 while (!cont) {
1700 uint32_t id = ebml_read_id(s, NULL);
1701 switch (id) {
1702 case MATROSKA_ID_CLUSTER:
1703 mp_msg(MSGT_DEMUX, MSGL_V,
1704 "[mkv] |+ found cluster, headers are "
1705 "parsed completely :)\n");
1706 stream_seek(s, stream_tell(s) - 4);
1707 cont = 1;
1708 break;
1710 default:
1711 cont = read_header_element(demuxer, id, 0) < 1;
1712 break;
1713 case EBML_ID_VOID:
1714 ebml_read_skip(s, NULL);
1715 break;
1719 display_create_tracks(demuxer);
1721 /* select video track */
1722 track = NULL;
1723 if (demuxer->video->id == -1) { /* automatically select a video track */
1724 /* search for a video track that has the 'default' flag set */
1725 for (i = 0; i < mkv_d->num_tracks; i++)
1726 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1727 && mkv_d->tracks[i]->default_track) {
1728 track = mkv_d->tracks[i];
1729 break;
1732 if (track == NULL)
1733 /* no track has the 'default' flag set */
1734 /* let's take the first video track */
1735 for (i = 0; i < mkv_d->num_tracks; i++)
1736 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
1737 && mkv_d->tracks[i]->id >= 0) {
1738 track = mkv_d->tracks[i];
1739 break;
1741 } else if (demuxer->video->id != -2) /* -2 = no video at all */
1742 track = find_track_by_num(mkv_d, demuxer->video->id,
1743 MATROSKA_TRACK_VIDEO);
1745 if (track && demuxer->v_streams[track->id]) {
1746 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u.\n",
1747 track->tnum);
1748 demuxer->video->id = track->id;
1749 demuxer->video->sh = demuxer->v_streams[track->id];
1750 } else {
1751 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
1752 demuxer->video->id = -2;
1755 /* select audio track */
1756 track = NULL;
1757 if (track == NULL)
1758 /* search for an audio track that has the 'default' flag set */
1759 for (i = 0; i < mkv_d->num_tracks; i++)
1760 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1761 && mkv_d->tracks[i]->default_track) {
1762 track = mkv_d->tracks[i];
1763 break;
1766 if (track == NULL)
1767 /* no track has the 'default' flag set */
1768 /* let's take the first audio track */
1769 for (i = 0; i < mkv_d->num_tracks; i++)
1770 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
1771 && mkv_d->tracks[i]->id >= 0) {
1772 track = mkv_d->tracks[i];
1773 break;
1776 if (track && demuxer->a_streams[track->id]) {
1777 demuxer->audio->id = track->id;
1778 demuxer->audio->sh = demuxer->a_streams[track->id];
1779 } else {
1780 mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
1781 demuxer->audio->id = -2;
1784 if (s->end_pos == 0)
1785 demuxer->seekable = 0;
1786 else {
1787 demuxer->movi_start = s->start_pos;
1788 demuxer->movi_end = s->end_pos;
1789 demuxer->seekable = 1;
1792 demuxer->accurate_seek = true;
1794 return DEMUXER_TYPE_MATROSKA;
1797 static void demux_close_mkv(demuxer_t *demuxer)
1799 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1801 if (mkv_d) {
1802 int i;
1803 free_cached_dps(demuxer);
1804 if (mkv_d->tracks) {
1805 for (i = 0; i < mkv_d->num_tracks; i++)
1806 demux_mkv_free_trackentry(mkv_d->tracks[i]);
1808 free(mkv_d->indexes);
1809 free(mkv_d->cluster_positions);
1813 static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
1814 uint8_t *laces,
1815 uint32_t **all_lace_sizes)
1817 uint32_t total = 0;
1818 uint32_t *lace_size = NULL;
1819 uint8_t flags;
1820 int i;
1822 *all_lace_sizes = NULL;
1823 /* lacing flags */
1824 if (*size < 1)
1825 goto error;
1826 flags = *buffer++;
1827 (*size)--;
1829 switch ((flags & 0x06) >> 1) {
1830 case 0: /* no lacing */
1831 *laces = 1;
1832 lace_size = calloc(*laces, sizeof(uint32_t));
1833 lace_size[0] = *size;
1834 break;
1836 case 1: /* xiph lacing */
1837 case 2: /* fixed-size lacing */
1838 case 3: /* EBML lacing */
1839 if (*size < 1)
1840 goto error;
1841 *laces = *buffer++;
1842 (*size)--;
1843 (*laces)++;
1844 lace_size = calloc(*laces, sizeof(uint32_t));
1846 switch ((flags & 0x06) >> 1) {
1847 case 1: /* xiph lacing */
1848 for (i = 0; i < *laces - 1; i++) {
1849 lace_size[i] = 0;
1850 do {
1851 if (!*size)
1852 goto error;
1853 lace_size[i] += *buffer;
1854 (*size)--;
1855 } while (*buffer++ == 0xFF);
1856 if (lace_size[i] > *size - total || total > *size)
1857 goto error;
1858 total += lace_size[i];
1860 lace_size[i] = *size - total;
1861 break;
1863 case 2: /* fixed-size lacing */
1864 for (i = 0; i < *laces; i++)
1865 lace_size[i] = *size / *laces;
1866 break;
1868 case 3:; /* EBML lacing */
1869 int l;
1870 uint64_t num = ebml_read_vlen_uint(buffer, &l);
1871 if (num == EBML_UINT_INVALID)
1872 goto error;
1873 buffer += l;
1874 if (*size < l)
1875 goto error;
1876 *size -= l;
1877 if (num > *size)
1878 goto error;
1880 total = lace_size[0] = num;
1881 for (i = 1; i < *laces - 1; i++) {
1882 int64_t snum = ebml_read_vlen_int(buffer, &l);
1883 if (snum == EBML_INT_INVALID)
1884 goto error;
1885 buffer += l;
1886 if (*size < l)
1887 goto error;
1888 *size -= l;
1889 lace_size[i] = lace_size[i - 1] + snum;
1890 if (lace_size[i] > *size - total || total > *size)
1891 goto error;
1892 total += lace_size[i];
1894 lace_size[i] = *size - total;
1895 break;
1897 break;
1899 *all_lace_sizes = lace_size;
1900 return 0;
1902 error:
1903 free(lace_size);
1904 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Bad input [lacing]\n");
1905 return 1;
1908 static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track,
1909 char *block, int64_t size,
1910 uint64_t block_duration, uint64_t timecode)
1912 demux_packet_t *dp;
1914 if (block_duration == 0) {
1915 mp_msg(MSGT_DEMUX, MSGL_WARN,
1916 "[mkv] Warning: No BlockDuration for subtitle track found.\n");
1917 return;
1920 sub_utf8 = 1;
1921 dp = new_demux_packet(size);
1922 memcpy(dp->buffer, block, size);
1923 dp->pts = timecode / 1000.0;
1924 dp->endpts = (timecode + block_duration) / 1000.0;
1925 ds_add_packet(demuxer->sub, dp);
1928 static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
1929 uint8_t *buffer, uint32_t size, int block_bref)
1931 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1932 demux_packet_t *dp;
1933 uint32_t timestamp = mkv_d->last_pts * 1000;
1935 dp = new_demux_packet(size);
1936 memcpy(dp->buffer, buffer, size);
1938 if (mkv_d->v_skip_to_keyframe) {
1939 dp->pts = mkv_d->last_pts;
1940 track->rv_kf_base = 0;
1941 track->rv_kf_pts = timestamp;
1942 } else
1943 dp->pts =
1944 real_fix_timestamp(dp->buffer, timestamp,
1945 ((sh_video_t *) demuxer->video->sh)->bih->
1946 biCompression, &track->rv_kf_base,
1947 &track->rv_kf_pts, NULL);
1948 dp->pos = demuxer->filepos;
1949 dp->flags = block_bref ? 0 : 0x10;
1951 ds_add_packet(demuxer->video, dp);
1954 static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
1955 uint8_t *buffer, uint32_t size, int block_bref)
1957 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
1958 int sps = track->sub_packet_size;
1959 int sph = track->sub_packet_h;
1960 int cfs = track->coded_framesize;
1961 int w = track->audiopk_size;
1962 int spc = track->sub_packet_cnt;
1963 demux_packet_t *dp;
1964 int x;
1966 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8'))
1967 || (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k'))
1968 || (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c'))
1969 || (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) {
1970 // if(!block_bref)
1971 // spc = track->sub_packet_cnt = 0;
1972 switch (track->a_formattag) {
1973 case mmioFOURCC('2', '8', '_', '8'):
1974 for (x = 0; x < sph / 2; x++)
1975 memcpy(track->audio_buf + x * 2 * w + spc * cfs,
1976 buffer + cfs * x, cfs);
1977 break;
1978 case mmioFOURCC('c', 'o', 'o', 'k'):
1979 case mmioFOURCC('a', 't', 'r', 'c'):
1980 for (x = 0; x < w / sps; x++)
1981 memcpy(track->audio_buf +
1982 sps * (sph * x + ((sph + 1) / 2) * (spc & 1) +
1983 (spc >> 1)), buffer + sps * x, sps);
1984 break;
1985 case mmioFOURCC('s', 'i', 'p', 'r'):
1986 memcpy(track->audio_buf + spc * w, buffer, w);
1987 if (spc == sph - 1) {
1988 int n;
1989 int bs = sph * w * 2 / 96; // nibbles per subpacket
1990 // Perform reordering
1991 for (n = 0; n < 38; n++) {
1992 int j;
1993 int i = bs * sipr_swaps[n][0];
1994 int o = bs * sipr_swaps[n][1];
1995 // swap nibbles of block 'i' with 'o' TODO: optimize
1996 for (j = 0; j < bs; j++) {
1997 int x = (i & 1) ?
1998 (track->audio_buf[i >> 1] >> 4) :
1999 (track->audio_buf[i >> 1] & 0x0F);
2000 int y = (o & 1) ?
2001 (track->audio_buf[o >> 1] >> 4) :
2002 (track->audio_buf[o >> 1] & 0x0F);
2003 if (o & 1)
2004 track->audio_buf[o >> 1] =
2005 (track->audio_buf[o >> 1] & 0x0F) | (x << 4);
2006 else
2007 track->audio_buf[o >> 1] =
2008 (track->audio_buf[o >> 1] & 0xF0) | x;
2009 if (i & 1)
2010 track->audio_buf[i >> 1] =
2011 (track->audio_buf[i >> 1] & 0x0F) | (y << 4);
2012 else
2013 track->audio_buf[i >> 1] =
2014 (track->audio_buf[i >> 1] & 0xF0) | y;
2015 ++i;
2016 ++o;
2020 break;
2022 track->audio_timestamp[track->sub_packet_cnt] =
2023 (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
2024 track->ra_pts = mkv_d->last_pts;
2025 if (track->sub_packet_cnt == 0)
2026 track->audio_filepos = demuxer->filepos;
2027 if (++(track->sub_packet_cnt) == sph) {
2028 int apk_usize =
2029 ((sh_audio_t *) demuxer->audio->sh)->wf->nBlockAlign;
2030 track->sub_packet_cnt = 0;
2031 // Release all the audio packets
2032 for (x = 0; x < sph * w / apk_usize; x++) {
2033 dp = new_demux_packet(apk_usize);
2034 memcpy(dp->buffer, track->audio_buf + x * apk_usize,
2035 apk_usize);
2036 /* Put timestamp only on packets that correspond to original
2037 * audio packets in file */
2038 dp->pts = (x * apk_usize % w) ? 0 :
2039 track->audio_timestamp[x * apk_usize / w];
2040 dp->pos = track->audio_filepos; // all equal
2041 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
2042 ds_add_packet(demuxer->audio, dp);
2045 } else { // Not a codec that require reordering
2046 dp = new_demux_packet(size);
2047 memcpy(dp->buffer, buffer, size);
2048 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
2049 dp->pts = 0;
2050 else
2051 dp->pts = mkv_d->last_pts;
2052 track->ra_pts = mkv_d->last_pts;
2054 dp->pos = demuxer->filepos;
2055 dp->flags = block_bref ? 0 : 0x10;
2056 ds_add_packet(demuxer->audio, dp);
2060 /** Reorder timecodes and add cached demux packets to the queues.
2062 * Timecode reordering is needed if a video track contains B frames that
2063 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2064 * MPlayer doesn't like timestamps in display order. This function adjusts
2065 * the timestamp of cached frames (which are exactly one I/P frame followed
2066 * by one or more B frames) so that they are in coding order again.
2068 * Example: The track with 25 FPS contains four frames with the timecodes
2069 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2070 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2071 * B at 80ms and B at 120ms.
2073 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2075 * \param demuxer The Matroska demuxer struct for this instance.
2076 * \param track The track structure whose cache should be handled.
2078 static void flush_cached_dps(demuxer_t *demuxer, mkv_track_t *track)
2080 int i, ok;
2082 if (track->num_cached_dps == 0)
2083 return;
2085 do {
2086 ok = 1;
2087 for (i = 1; i < track->num_cached_dps; i++)
2088 if (track->cached_dps[i - 1]->pts > track->cached_dps[i]->pts) {
2089 double tmp_pts = track->cached_dps[i - 1]->pts;
2090 track->cached_dps[i - 1]->pts = track->cached_dps[i]->pts;
2091 track->cached_dps[i]->pts = tmp_pts;
2092 ok = 0;
2094 } while (!ok);
2096 for (i = 0; i < track->num_cached_dps; i++)
2097 ds_add_packet(demuxer->video, track->cached_dps[i]);
2098 track->num_cached_dps = 0;
2101 /** Cache video frames if timecodes have to be reordered.
2103 * Timecode reordering is needed if a video track contains B frames that
2104 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2105 * This function takes in a Matroska block read from the file, allocates a
2106 * demux packet for it, fills in its values, allocates space for storing
2107 * pointers to the cached demux packets and adds the packet to it. If
2108 * the packet contains an I or a P frame then ::flush_cached_dps is called
2109 * in order to send the old cached frames downstream.
2111 * \param demuxer The Matroska demuxer struct for this instance.
2112 * \param track The packet is meant for this track.
2113 * \param buffer The actual frame contents.
2114 * \param size The frame size in bytes.
2115 * \param block_bref A relative timecode (backward reference). If it is \c 0
2116 * then the frame is an I frame.
2117 * \param block_fref A relative timecode (forward reference). If it is \c 0
2118 * then the frame is either an I frame or a P frame depending on the value
2119 * of \a block_bref. Otherwise it's a B frame.
2121 static void handle_video_bframes(demuxer_t *demuxer, mkv_track_t *track,
2122 uint8_t *buffer, uint32_t size,
2123 int block_bref, int block_fref)
2125 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2126 demux_packet_t *dp;
2128 dp = new_demux_packet(size);
2129 memcpy(dp->buffer, buffer, size);
2130 dp->pos = demuxer->filepos;
2131 dp->pts = mkv_d->last_pts;
2132 if ((track->num_cached_dps > 0) && (dp->pts < track->max_pts))
2133 block_fref = 1;
2134 if (block_fref == 0) /* I or P frame */
2135 flush_cached_dps(demuxer, track);
2136 if (block_bref != 0) /* I frame, don't cache it */
2137 dp->flags = 0x10;
2138 if ((track->num_cached_dps + 1) > track->num_allocated_dps) {
2139 track->cached_dps = (demux_packet_t **)
2140 realloc(track->cached_dps,
2141 (track->num_cached_dps + 10) * sizeof(demux_packet_t *));
2142 track->num_allocated_dps += 10;
2144 track->cached_dps[track->num_cached_dps] = dp;
2145 track->num_cached_dps++;
2146 if (dp->pts > track->max_pts)
2147 track->max_pts = dp->pts;
2150 static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
2151 uint64_t block_duration, int64_t block_bref,
2152 int64_t block_fref, uint8_t simpleblock)
2154 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2155 mkv_track_t *track = NULL;
2156 demux_stream_t *ds = NULL;
2157 uint64_t old_length;
2158 int64_t tc;
2159 uint32_t *lace_size;
2160 uint8_t laces, flags;
2161 int i, num, tmp, use_this_block = 1;
2162 double current_pts;
2163 int16_t time;
2165 /* first byte(s): track num */
2166 num = ebml_read_vlen_uint(block, &tmp);
2167 block += tmp;
2168 /* time (relative to cluster time) */
2169 time = block[0] << 8 | block[1];
2170 block += 2;
2171 length -= tmp + 2;
2172 old_length = length;
2173 flags = block[0];
2174 if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
2175 return 0;
2176 block += old_length - length;
2178 tc = (time * mkv_d->tc_scale + mkv_d->cluster_tc) / 1000000.0 + 0.5;
2179 if (tc < 0)
2180 tc = 0;
2181 current_pts = tc / 1000.0;
2183 for (i = 0; i < mkv_d->num_tracks; i++)
2184 if (mkv_d->tracks[i]->tnum == num) {
2185 track = mkv_d->tracks[i];
2186 break;
2188 if (track == NULL) {
2189 free(lace_size);
2190 return 1;
2192 if (track->type == MATROSKA_TRACK_AUDIO
2193 && track->id == demuxer->audio->id) {
2194 ds = demuxer->audio;
2196 if (mkv_d->a_skip_to_keyframe) {
2197 if (simpleblock) {
2198 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2199 use_this_block = 0;
2200 } else if (block_bref != 0)
2201 use_this_block = 0;
2203 if (mkv_d->v_skip_to_keyframe)
2204 use_this_block = 0;
2206 if (track->fix_i_bps && use_this_block) {
2207 sh_audio_t *sh = (sh_audio_t *) ds->sh;
2209 if (block_duration != 0) {
2210 sh->i_bps = length * 1000 / block_duration;
2211 track->fix_i_bps = 0;
2212 } else if (track->qt_last_a_pts == 0.0)
2213 track->qt_last_a_pts = current_pts;
2214 else if (track->qt_last_a_pts != current_pts) {
2215 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
2216 track->fix_i_bps = 0;
2219 } else if (tc < mkv_d->skip_to_timecode)
2220 use_this_block = 0;
2221 else if (track->type == MATROSKA_TRACK_VIDEO
2222 && track->id == demuxer->video->id) {
2223 ds = demuxer->video;
2224 if (mkv_d->v_skip_to_keyframe) {
2225 if (simpleblock) {
2226 if (!(flags & 0x80)) /*current frame isn't a keyframe */
2227 use_this_block = 0;
2228 } else if (block_bref != 0 || block_fref != 0)
2229 use_this_block = 0;
2231 } else if (track->type == MATROSKA_TRACK_SUBTITLE
2232 && track->id == demuxer->sub->id) {
2233 ds = demuxer->sub;
2234 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) {
2235 uint8_t *buffer;
2236 int size = length;
2237 demux_mkv_decode(track, block, &buffer, &size, 1);
2238 handle_subtitles(demuxer, track, buffer, size, block_duration, tc);
2239 if (buffer != block)
2240 talloc_free(buffer);
2241 use_this_block = 0;
2243 } else
2244 use_this_block = 0;
2246 if (use_this_block) {
2247 mkv_d->last_pts = current_pts;
2248 mkv_d->last_filepos = demuxer->filepos;
2250 for (i = 0; i < laces; i++) {
2251 if (ds == demuxer->video && track->realmedia)
2252 handle_realvideo(demuxer, track, block, lace_size[i],
2253 block_bref);
2254 else if (ds == demuxer->audio && track->realmedia)
2255 handle_realaudio(demuxer, track, block, lace_size[i],
2256 block_bref);
2257 else if (ds == demuxer->video && track->reorder_timecodes)
2258 handle_video_bframes(demuxer, track, block, lace_size[i],
2259 block_bref, block_fref);
2260 else {
2261 int size = lace_size[i];
2262 demux_packet_t *dp;
2263 uint8_t *buffer;
2264 demux_mkv_decode(track, block, &buffer, &size, 1);
2265 if (buffer) {
2266 dp = new_demux_packet(size);
2267 memcpy(dp->buffer, buffer, size);
2268 if (buffer != block)
2269 talloc_free(buffer);
2270 dp->flags = (block_bref == 0
2271 && block_fref == 0) ? 0x10 : 0;
2272 /* If default_duration is 0, assume no pts value is known
2273 * for packets after the first one (rather than all pts
2274 * values being the same) */
2275 if (i == 0 || track->default_duration)
2276 dp->pts =
2277 mkv_d->last_pts + i * track->default_duration;
2278 ds_add_packet(ds, dp);
2281 block += lace_size[i];
2284 if (ds == demuxer->video) {
2285 mkv_d->v_skip_to_keyframe = 0;
2286 mkv_d->skip_to_timecode = 0;
2287 } else if (ds == demuxer->audio)
2288 mkv_d->a_skip_to_keyframe = 0;
2290 free(lace_size);
2291 return 1;
2294 free(lace_size);
2295 return 0;
2298 static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
2300 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2301 stream_t *s = demuxer->stream;
2302 uint64_t l;
2303 int il, tmp;
2305 while (1) {
2306 while (mkv_d->cluster_size > 0) {
2307 uint64_t block_duration = 0, block_length = 0;
2308 int64_t block_bref = 0, block_fref = 0;
2309 uint8_t *block = NULL;
2311 while (mkv_d->blockgroup_size > 0) {
2312 switch (ebml_read_id(s, &il)) {
2313 case MATROSKA_ID_BLOCKDURATION:
2314 block_duration = ebml_read_uint(s, &l);
2315 if (block_duration == EBML_UINT_INVALID) {
2316 free(block);
2317 return 0;
2319 block_duration =
2320 block_duration * mkv_d->tc_scale / 1000000.0 + 0.5;
2321 break;
2323 case MATROSKA_ID_BLOCK:
2324 block_length = ebml_read_length(s, &tmp);
2325 free(block);
2326 if (block_length > 500000000)
2327 return 0;
2328 block = malloc(block_length + AV_LZO_INPUT_PADDING);
2329 demuxer->filepos = stream_tell(s);
2330 if (stream_read(s, block, block_length) !=
2331 (int) block_length) {
2332 free(block);
2333 return 0;
2335 l = tmp + block_length;
2336 break;
2338 case MATROSKA_ID_REFERENCEBLOCK:;
2339 int64_t num = ebml_read_int(s, &l);
2340 if (num == EBML_INT_INVALID) {
2341 free(block);
2342 return 0;
2344 if (num <= 0)
2345 block_bref = num;
2346 else
2347 block_fref = num;
2348 break;
2350 case EBML_ID_INVALID:
2351 free(block);
2352 return 0;
2354 default:
2355 ebml_read_skip(s, &l);
2356 break;
2358 mkv_d->blockgroup_size -= l + il;
2359 mkv_d->cluster_size -= l + il;
2362 if (block) {
2363 int res = handle_block(demuxer, block, block_length,
2364 block_duration, block_bref, block_fref,
2366 free(block);
2367 if (res < 0)
2368 return 0;
2369 if (res)
2370 return 1;
2373 if (mkv_d->cluster_size > 0) {
2374 switch (ebml_read_id(s, &il)) {
2375 case MATROSKA_ID_TIMECODE:;
2376 uint64_t num = ebml_read_uint(s, &l);
2377 if (num == EBML_UINT_INVALID)
2378 return 0;
2379 mkv_d->cluster_tc = num * mkv_d->tc_scale;
2380 add_cluster_position(mkv_d, mkv_d->cluster_start,
2381 mkv_d->cluster_tc);
2382 break;
2384 case MATROSKA_ID_BLOCKGROUP:
2385 mkv_d->blockgroup_size = ebml_read_length(s, &tmp);
2386 l = tmp;
2387 break;
2389 case MATROSKA_ID_SIMPLEBLOCK:;
2390 int res;
2391 block_length = ebml_read_length(s, &tmp);
2392 if (block_length > 500000000)
2393 return 0;
2394 block = malloc(block_length);
2395 demuxer->filepos = stream_tell(s);
2396 if (stream_read(s, block, block_length) !=
2397 (int) block_length) {
2398 free(block);
2399 return 0;
2401 l = tmp + block_length;
2402 res = handle_block(demuxer, block, block_length,
2403 block_duration, block_bref,
2404 block_fref, 1);
2405 free(block);
2406 mkv_d->cluster_size -= l + il;
2407 if (res < 0)
2408 return 0;
2409 else if (res)
2410 return 1;
2411 else
2412 mkv_d->cluster_size += l + il;
2413 break;
2415 case EBML_ID_INVALID:
2416 return 0;
2418 default:
2419 ebml_read_skip(s, &l);
2420 break;
2422 mkv_d->cluster_size -= l + il;
2426 while (ebml_read_id(s, &il) != MATROSKA_ID_CLUSTER) {
2427 ebml_read_skip(s, NULL);
2428 if (s->eof)
2429 return 0;
2431 mkv_d->cluster_start = stream_tell(s) - il;
2432 mkv_d->cluster_size = ebml_read_length(s, NULL);
2435 return 0;
2438 static int seek_creating_index(struct demuxer *demuxer, float rel_seek_secs,
2439 int flags)
2441 struct mkv_demuxer *mkv_d = demuxer->priv;
2442 struct stream *s = demuxer->stream;
2443 int64_t target_tc_ns = (int64_t) (rel_seek_secs * 1e9);
2444 if (target_tc_ns < 0)
2445 target_tc_ns = 0;
2446 uint64_t max_filepos = 0;
2447 int64_t max_tc = -1;
2448 int n = mkv_d->num_cluster_pos;
2449 if (n > 0) {
2450 max_filepos = mkv_d->cluster_positions[n - 1].filepos;
2451 max_tc = mkv_d->cluster_positions[n - 1].timecode;
2454 if (target_tc_ns > max_tc) {
2455 if ((off_t) max_filepos > stream_tell(s))
2456 stream_seek(s, max_filepos);
2457 else
2458 stream_seek(s, stream_tell(s) + mkv_d->cluster_size);
2459 /* parse all the clusters upto target_filepos */
2460 while (!s->eof) {
2461 uint64_t start = stream_tell(s);
2462 uint32_t type = ebml_read_id(s, NULL);
2463 uint64_t len = ebml_read_length(s, NULL);
2464 uint64_t end = stream_tell(s) + len;
2465 if (type == MATROSKA_ID_CLUSTER) {
2466 while (!s->eof && stream_tell(s) < end) {
2467 if (ebml_read_id(s, NULL) == MATROSKA_ID_TIMECODE) {
2468 uint64_t tc = ebml_read_uint(s, NULL);
2469 tc *= mkv_d->tc_scale;
2470 add_cluster_position(mkv_d, start, tc);
2471 if (tc >= target_tc_ns)
2472 goto enough_index;
2473 break;
2477 if (s->eof)
2478 break;
2479 stream_seek(s, end);
2481 enough_index:
2482 if (s->eof)
2483 stream_reset(s);
2485 if (!mkv_d->num_cluster_pos) {
2486 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] no target for seek found\n");
2487 return -1;
2489 uint64_t cluster_pos = mkv_d->cluster_positions[0].filepos;
2490 /* Let's find the nearest cluster */
2491 int64_t min_diff = 0xFFFFFFFFFFFFFFF;
2492 for (int i = 0; i < mkv_d->num_cluster_pos; i++) {
2493 int64_t diff = mkv_d->cluster_positions[i].timecode - target_tc_ns;
2494 if (flags & SEEK_BACKWARD && diff < 0 && -diff < min_diff) {
2495 cluster_pos = mkv_d->cluster_positions[i].filepos;
2496 min_diff = -diff;
2497 } else if (flags & SEEK_FORWARD
2498 && (diff < 0 ? -1 * diff : diff) < min_diff) {
2499 cluster_pos = mkv_d->cluster_positions[i].filepos;
2500 min_diff = diff < 0 ? -1 * diff : diff;
2503 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2504 stream_seek(s, cluster_pos);
2505 return 0;
2508 static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
2509 int64_t target_timecode, int flags)
2511 struct mkv_demuxer *mkv_d = demuxer->priv;
2512 struct mkv_index *index = NULL;
2514 /* Find the entry in the index closest to the target timecode in the
2515 * give direction. If there are no such entries - we're trying to seek
2516 * backward from a target time before the first entry or forward from a
2517 * target time after the last entry - then still seek to the first/last
2518 * entry if that's further in the direction wanted than mkv_d->last_pts.
2520 int64_t min_diff = target_timecode - mkv_d->last_pts * 1000;
2521 if (flags & SEEK_BACKWARD)
2522 min_diff = -min_diff;
2523 min_diff = FFMAX(min_diff, 1);
2524 for (int i = 0; i < mkv_d->num_indexes; i++)
2525 if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
2526 int64_t diff =
2527 target_timecode -
2528 (int64_t) (mkv_d->indexes[i].timecode *
2529 mkv_d->tc_scale / 1000000.0 + 0.5);
2530 if (flags & SEEK_BACKWARD)
2531 diff = -diff;
2532 if (diff <= 0) {
2533 if (min_diff <= 0 && diff <= min_diff)
2534 continue;
2535 } else if (diff >= min_diff)
2536 continue;
2537 min_diff = diff;
2538 index = mkv_d->indexes + i;
2541 if (index) { /* We've found an entry. */
2542 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2543 stream_seek(demuxer->stream, index->filepos);
2545 return index;
2548 static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
2549 float audio_delay, int flags)
2551 mkv_demuxer_t *mkv_d = demuxer->priv;
2552 uint64_t v_tnum = -1;
2553 if (demuxer->video->id >= 0)
2554 v_tnum = find_track_by_num(mkv_d, demuxer->video->id,
2555 MATROSKA_TRACK_VIDEO)->tnum;
2556 uint64_t a_tnum = -1;
2557 if (demuxer->audio->id >= 0)
2558 a_tnum = find_track_by_num(mkv_d, demuxer->audio->id,
2559 MATROSKA_TRACK_AUDIO)->tnum;
2560 if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
2561 if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
2562 flags |= SEEK_BACKWARD;
2563 else
2564 flags |= SEEK_FORWARD;
2566 // Adjust the target a little bit to catch cases where the target position
2567 // specifies a keyframe with high, but not perfect, precision.
2568 rel_seek_secs += flags & SEEK_FORWARD ? -0.005 : 0.005;
2570 free_cached_dps(demuxer);
2571 if (!(flags & SEEK_FACTOR)) { /* time in secs */
2572 mkv_index_t *index = NULL;
2574 if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
2575 rel_seek_secs += mkv_d->last_pts;
2576 int64_t target_timecode = rel_seek_secs * 1000.0;
2577 if (target_timecode < 0)
2578 target_timecode = 0;
2580 if (mkv_d->indexes == NULL) { /* no index was found */
2581 if (seek_creating_index(demuxer, rel_seek_secs, flags) < 0)
2582 return;
2583 } else {
2584 int seek_id = (demuxer->video->id < 0) ?
2585 a_tnum : v_tnum;
2586 index = seek_with_cues(demuxer, seek_id, target_timecode, flags);
2587 if (!index)
2588 index = seek_with_cues(demuxer, -1, target_timecode, flags);
2591 if (demuxer->video->id >= 0)
2592 mkv_d->v_skip_to_keyframe = 1;
2593 if (flags & SEEK_FORWARD)
2594 mkv_d->skip_to_timecode = target_timecode;
2595 else
2596 mkv_d->skip_to_timecode = index ? index->timecode : 0;
2597 mkv_d->a_skip_to_keyframe = 1;
2599 demux_mkv_fill_buffer(demuxer, NULL);
2600 } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
2601 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2602 else {
2603 stream_t *s = demuxer->stream;
2604 uint64_t target_filepos;
2605 mkv_index_t *index = NULL;
2606 int i;
2608 if (mkv_d->indexes == NULL) { /* not implemented without index */
2609 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
2610 return;
2613 target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
2614 for (i = 0; i < mkv_d->num_indexes; i++)
2615 if (mkv_d->indexes[i].tnum == v_tnum)
2616 if ((index == NULL)
2617 || ((mkv_d->indexes[i].filepos >= target_filepos)
2618 && ((index->filepos < target_filepos)
2619 || (mkv_d->indexes[i].filepos < index->filepos))))
2620 index = &mkv_d->indexes[i];
2622 if (!index)
2623 return;
2625 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
2626 stream_seek(s, index->filepos);
2628 if (demuxer->video->id >= 0)
2629 mkv_d->v_skip_to_keyframe = 1;
2630 mkv_d->skip_to_timecode = index->timecode;
2631 mkv_d->a_skip_to_keyframe = 1;
2633 demux_mkv_fill_buffer(demuxer, NULL);
2637 static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
2639 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
2641 switch (cmd) {
2642 case DEMUXER_CTRL_CORRECT_PTS:
2643 return DEMUXER_CTRL_OK;
2644 case DEMUXER_CTRL_GET_TIME_LENGTH:
2645 if (mkv_d->duration == 0)
2646 return DEMUXER_CTRL_DONTKNOW;
2648 *((double *) arg) = (double) mkv_d->duration;
2649 return DEMUXER_CTRL_OK;
2651 case DEMUXER_CTRL_GET_PERCENT_POS:
2652 if (mkv_d->duration == 0) {
2653 return DEMUXER_CTRL_DONTKNOW;
2656 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
2657 return DEMUXER_CTRL_OK;
2659 case DEMUXER_CTRL_SWITCH_AUDIO:;
2660 int new_aid = *(int *) arg;
2661 int current_aid = demuxer->audio->id;
2662 if (current_aid < 0)
2663 current_aid = -1;
2664 if (new_aid == -1) // cycle to next
2665 new_aid = (current_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
2666 if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks)
2667 new_aid = -2;
2668 *(int *) arg = new_aid;
2669 if (current_aid != new_aid)
2670 ds_free_packs(demuxer->audio);
2671 demuxer->audio->id = new_aid;
2672 return DEMUXER_CTRL_OK;
2674 default:
2675 return DEMUXER_CTRL_NOTIMPL;
2679 const demuxer_desc_t demuxer_desc_matroska = {
2680 "Matroska demuxer",
2681 "mkv",
2682 "Matroska",
2683 "Aurelien Jacobs",
2685 DEMUXER_TYPE_MATROSKA,
2686 1, // safe autodetect
2687 demux_mkv_open,
2688 demux_mkv_fill_buffer,
2689 NULL,
2690 demux_close_mkv,
2691 demux_mkv_seek,
2692 demux_mkv_control