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