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.
34 #include "stream/stream.h"
44 #include "subreader.h"
45 #include "libvo/sub.h"
49 #include "libavutil/common.h"
51 #ifdef CONFIG_QTX_CODECS
52 #include "loader/qtx/qtxsdk/components.h"
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},
70 // Map flavour to bytes per second
71 #define SIPR_FLAVORS 4
72 #define ATRC_FLAVORS 8
73 #define COOK_FLAVORS 34
74 static const int sipr_fl2bps
[SIPR_FLAVORS
] = {813, 1062, 625, 2000};
75 static const int atrc_fl2bps
[ATRC_FLAVORS
] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100};
76 static const int cook_fl2bps
[COOK_FLAVORS
] = {
77 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
78 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
79 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
80 12016, 16408, 22911, 33506};
84 uint32_t order
, type
, scope
;
86 uint8_t *comp_settings
;
87 int comp_settings_len
;
88 } mkv_content_encoding_t
;
90 typedef struct mkv_track
101 uint32_t v_width
, v_height
, v_dwidth
, v_dheight
;
104 uint32_t a_formattag
;
105 uint32_t a_channels
, a_bps
;
108 double default_duration
;
112 unsigned char *private_data
;
113 unsigned int private_size
;
115 /* stuff for realmedia */
119 double rv_pts
; /* previous video timestamp */
120 double ra_pts
; /* previous audio timestamp */
122 /** realaudio descrambling */
123 int sub_packet_size
; ///< sub packet size, per stream
124 int sub_packet_h
; ///< number of coded frames per block
125 int coded_framesize
; ///< coded frame size, per stream
126 int audiopk_size
; ///< audio packet size
127 unsigned char *audio_buf
; ///< place to store reordered audio data
128 double *audio_timestamp
; ///< timestamp for each audio packet
129 int sub_packet_cnt
; ///< number of subpacket already received
130 int audio_filepos
; ///< file position of first audio packet in block
132 /* stuff for quicktime */
134 double qt_last_a_pts
;
138 /* The timecodes of video frames might have to be reordered if they're
139 in display order (the timecodes, not the frames themselves!). In this
140 case demux packets have to be cached with the help of these variables. */
141 int reorder_timecodes
;
142 demux_packet_t
**cached_dps
;
143 int num_cached_dps
, num_allocated_dps
;
146 /* generic content encoding support */
147 mkv_content_encoding_t
*encodings
;
150 /* For VobSubs and SSA/ASS */
154 typedef struct mkv_index
157 uint64_t timecode
, filepos
;
160 typedef struct mkv_demuxer
164 double duration
, last_pts
;
165 uint64_t last_filepos
;
167 mkv_track_t
**tracks
;
170 uint64_t tc_scale
, cluster_tc
;
172 uint64_t cluster_size
;
173 uint64_t blockgroup_size
;
175 mkv_index_t
*indexes
;
180 off_t
*parsed_seekhead
;
181 int parsed_seekhead_num
;
183 uint64_t *cluster_positions
;
186 int64_t skip_to_timecode
;
187 int v_skip_to_keyframe
, a_skip_to_keyframe
;
190 int audio_tracks
[MAX_A_STREAMS
];
193 #define REALHEADER_SIZE 16
194 #define RVPROPERTIES_SIZE 34
195 #define RAPROPERTIES4_SIZE 56
196 #define RAPROPERTIES5_SIZE 70
199 * \brief ensures there is space for at least one additional element
200 * \param array array to grow
201 * \param nelem current number of elements in array
202 * \param elsize size of one array element
204 static void *grow_array(void *array
, int nelem
, size_t elsize
) {
206 array
= realloc(array
, (nelem
+ 32) * elsize
);
211 demux_mkv_find_track_by_num (mkv_demuxer_t
*d
, int n
, int type
)
215 for (i
=0, id
=0; i
< d
->num_tracks
; i
++)
216 if (d
->tracks
[i
] != NULL
&& d
->tracks
[i
]->type
== type
)
224 add_cluster_position (mkv_demuxer_t
*mkv_d
, uint64_t position
)
226 int i
= mkv_d
->num_cluster_pos
;
229 if (mkv_d
->cluster_positions
[i
] == position
)
232 mkv_d
->cluster_positions
= grow_array(mkv_d
->cluster_positions
,
233 mkv_d
->num_cluster_pos
,
235 mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
++] = position
;
239 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
241 aac_get_sample_rate_index (uint32_t sample_rate
)
243 if (92017 <= sample_rate
)
245 else if (75132 <= sample_rate
)
247 else if (55426 <= sample_rate
)
249 else if (46009 <= sample_rate
)
251 else if (37566 <= sample_rate
)
253 else if (27713 <= sample_rate
)
255 else if (23004 <= sample_rate
)
257 else if (18783 <= sample_rate
)
259 else if (13856 <= sample_rate
)
261 else if (11502 <= sample_rate
)
263 else if (9391 <= sample_rate
)
269 /** \brief Free cached demux packets
271 * Reordering the timecodes requires caching of demux packets. This function
272 * frees all these cached packets and the memory for the cached pointers
275 * \param demuxer The demuxer for which the cache is to be freed.
278 free_cached_dps (demuxer_t
*demuxer
)
280 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
284 for (k
= 0; k
< mkv_d
->num_tracks
; k
++)
286 track
= mkv_d
->tracks
[k
];
287 for (i
= 0; i
< track
->num_cached_dps
; i
++)
288 free_demux_packet (track
->cached_dps
[i
]);
289 free(track
->cached_dps
);
290 track
->cached_dps
= NULL
;
291 track
->num_cached_dps
= 0;
292 track
->num_allocated_dps
= 0;
298 demux_mkv_decode (mkv_track_t
*track
, uint8_t *src
, uint8_t **dest
,
299 uint32_t *size
, uint32_t type
)
305 if (track
->num_encodings
<= 0)
308 for (i
=0; i
<track
->num_encodings
; i
++)
310 if (!(track
->encodings
[i
].scope
& type
))
314 if (track
->encodings
[i
].comp_algo
== 0)
316 /* zlib encoded track */
319 zstream
.zalloc
= (alloc_func
) 0;
320 zstream
.zfree
= (free_func
) 0;
321 zstream
.opaque
= (voidpf
) 0;
322 if (inflateInit (&zstream
) != Z_OK
)
324 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
325 "[mkv] zlib initialization failed.\n");
328 zstream
.next_in
= (Bytef
*) src
;
329 zstream
.avail_in
= *size
;
333 zstream
.avail_out
= *size
;
336 *dest
= realloc (*dest
, *size
);
337 zstream
.next_out
= (Bytef
*) (*dest
+ zstream
.total_out
);
338 result
= inflate (&zstream
, Z_NO_FLUSH
);
339 if (result
!= Z_OK
&& result
!= Z_STREAM_END
)
341 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
342 "[mkv] zlib decompression failed.\n");
345 inflateEnd (&zstream
);
348 zstream
.avail_out
+= 4000;
349 } while (zstream
.avail_out
== 4000 &&
350 zstream
.avail_in
!= 0 && result
!= Z_STREAM_END
);
352 *size
= zstream
.total_out
;
353 inflateEnd (&zstream
);
356 if (track
->encodings
[i
].comp_algo
== 2)
358 /* lzo encoded track */
359 int dstlen
= *size
* 3;
365 if (dstlen
> SIZE_MAX
- AV_LZO_OUTPUT_PADDING
) goto lzo_fail
;
366 *dest
= realloc (*dest
, dstlen
+ AV_LZO_OUTPUT_PADDING
);
367 result
= av_lzo1x_decode (*dest
, &dstlen
, src
, &srclen
);
370 if (!(result
& AV_LZO_OUTPUT_FULL
))
373 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
374 "[mkv] lzo decompression failed.\n");
379 mp_msg (MSGT_DEMUX
, MSGL_DBG2
,
380 "[mkv] lzo decompression buffer too small.\n");
391 static int demux_mkv_read_info(demuxer_t
*demuxer
)
393 mkv_demuxer_t
*mkv_d
= demuxer
->priv
;
394 stream_t
*s
= demuxer
->stream
;
397 uint64_t tc_scale
= 1000000;
398 long double duration
= 0.;
400 length
= ebml_read_length(s
, NULL
);
402 uint32_t id
= ebml_read_id(s
, &i
);
405 case MATROSKA_ID_TIMECODESCALE
:
406 tc_scale
= ebml_read_uint(s
, &l
);
408 if (tc_scale
== EBML_UINT_INVALID
)
410 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + timecode scale: %"PRIu64
"\n",
414 case MATROSKA_ID_DURATION
:
415 duration
= ebml_read_float(s
, &l
);
417 if (duration
== EBML_FLOAT_INVALID
)
421 case MATROSKA_ID_SEGMENTUID
:;
422 l
= ebml_read_length(s
, &i
);
424 if (l
!= sizeof(demuxer
->matroska_data
.segment_uid
)) {
425 mp_msg(MSGT_DEMUX
, MSGL_INFO
,
426 "[mkv] segment uid invalid length %"PRIu64
"\n", l
);
429 stream_read(s
, demuxer
->matroska_data
.segment_uid
, l
);
430 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + segment uid");
431 for (int i
= 0; i
< l
; i
++)
432 mp_msg(MSGT_DEMUX
, MSGL_V
, " %02x",
433 demuxer
->matroska_data
.segment_uid
[i
]);
434 mp_msg(MSGT_DEMUX
, MSGL_V
, "\n");
440 ebml_read_skip(s
, &l
);
445 mkv_d
->tc_scale
= tc_scale
;
446 mkv_d
->duration
= duration
* tc_scale
/ 1000000000.0;
448 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + duration: %.3fs\n",
455 * \brief free array of kv_content_encoding_t
456 * \param encodings pointer to array
457 * \param numencodings number of encodings in array
460 demux_mkv_free_encodings(mkv_content_encoding_t
*encodings
, int numencodings
)
462 while (numencodings
-- > 0)
463 free(encodings
[numencodings
].comp_settings
);
468 demux_mkv_read_trackencodings (demuxer_t
*demuxer
, mkv_track_t
*track
)
470 stream_t
*s
= demuxer
->stream
;
471 mkv_content_encoding_t
*ce
, e
;
472 uint64_t len
, length
, l
;
475 ce
= malloc (sizeof (*ce
));
478 len
= length
= ebml_read_length (s
, &il
);
482 switch (ebml_read_id (s
, &il
))
484 case MATROSKA_ID_CONTENTENCODING
:
489 memset (&e
, 0, sizeof (e
));
492 len
= ebml_read_length (s
, &i
);
500 switch (ebml_read_id (s
, &il
))
502 case MATROSKA_ID_CONTENTENCODINGORDER
:
503 num
= ebml_read_uint (s
, &l
);
504 if (num
== EBML_UINT_INVALID
)
509 case MATROSKA_ID_CONTENTENCODINGSCOPE
:
510 num
= ebml_read_uint (s
, &l
);
511 if (num
== EBML_UINT_INVALID
)
516 case MATROSKA_ID_CONTENTENCODINGTYPE
:
517 num
= ebml_read_uint (s
, &l
);
518 if (num
== EBML_UINT_INVALID
)
523 case MATROSKA_ID_CONTENTCOMPRESSION
:
527 le
= ebml_read_length (s
, &i
);
535 switch (ebml_read_id (s
, &il
))
537 case MATROSKA_ID_CONTENTCOMPALGO
:
538 num
= ebml_read_uint (s
, &l
);
539 if (num
== EBML_UINT_INVALID
)
544 case MATROSKA_ID_CONTENTCOMPSETTINGS
:
545 l
= ebml_read_length (s
, &i
);
546 e
.comp_settings
= malloc (l
);
547 stream_read (s
, e
.comp_settings
, l
);
548 e
.comp_settings_len
= l
;
553 ebml_read_skip (s
, &l
);
561 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
562 "[mkv] Track number %u has been encrypted and decryption has not yet been\n[mkv] implemented. Skipping track.\n", track
->tnum
);
564 else if (e
.type
!= 0)
566 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
567 "[mkv] Unknown content encoding type for track %u. Skipping track.\n", track
->tnum
);
570 if (e
.comp_algo
!= 0 && e
.comp_algo
!= 2)
572 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
573 "[mkv] Track %u has been compressed with an unknown/unsupported compression\n[mkv] algorithm (%u). Skipping track.\n",
574 track
->tnum
, e
.comp_algo
);
577 else if (e
.comp_algo
== 0)
579 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
580 "[mkv] Track %u was compressed with zlib but mplayer has not been compiled\n[mkv] with support for zlib compression. Skipping track.\n",
589 ebml_read_skip (s
, &l
);
595 if (e
.order
<= ce
[i
].order
)
597 ce
= realloc (ce
, (n
+1) *sizeof (*ce
));
598 memmove (ce
+i
+1, ce
+i
, (n
-i
) * sizeof (*ce
));
599 memcpy (ce
+i
, &e
, sizeof (e
));
605 ebml_read_skip (s
, &l
);
612 track
->encodings
= ce
;
613 track
->num_encodings
= n
;
617 demux_mkv_free_encodings(ce
, n
);
622 demux_mkv_read_trackaudio (demuxer_t
*demuxer
, mkv_track_t
*track
)
624 stream_t
*s
= demuxer
->stream
;
625 uint64_t len
, length
, l
;
628 track
->a_sfreq
= 8000.0;
629 track
->a_channels
= 1;
631 len
= length
= ebml_read_length (s
, &il
);
635 switch (ebml_read_id (s
, &il
))
637 case MATROSKA_ID_AUDIOSAMPLINGFREQ
:
639 long double num
= ebml_read_float (s
, &l
);
640 if (num
== EBML_FLOAT_INVALID
)
642 track
->a_sfreq
= num
;
643 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Sampling frequency: %f\n",
648 case MATROSKA_ID_AUDIOBITDEPTH
:
650 uint64_t num
= ebml_read_uint (s
, &l
);
651 if (num
== EBML_UINT_INVALID
)
654 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Bit depth: %u\n",
659 case MATROSKA_ID_AUDIOCHANNELS
:
661 uint64_t num
= ebml_read_uint (s
, &l
);
662 if (num
== EBML_UINT_INVALID
)
664 track
->a_channels
= num
;
665 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Channels: %u\n",
671 ebml_read_skip (s
, &l
);
680 demux_mkv_read_trackvideo (demuxer_t
*demuxer
, mkv_track_t
*track
)
682 stream_t
*s
= demuxer
->stream
;
683 uint64_t len
, length
, l
;
686 len
= length
= ebml_read_length (s
, &il
);
690 switch (ebml_read_id (s
, &il
))
692 case MATROSKA_ID_VIDEOFRAMERATE
:
694 long double num
= ebml_read_float (s
, &l
);
695 if (num
== EBML_FLOAT_INVALID
)
697 track
->v_frate
= num
;
698 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Frame rate: %f\n",
700 if (track
->v_frate
> 0)
701 track
->default_duration
= 1 / track
->v_frate
;
705 case MATROSKA_ID_VIDEODISPLAYWIDTH
:
707 uint64_t num
= ebml_read_uint (s
, &l
);
708 if (num
== EBML_UINT_INVALID
)
710 track
->v_dwidth
= num
;
711 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display width: %u\n",
716 case MATROSKA_ID_VIDEODISPLAYHEIGHT
:
718 uint64_t num
= ebml_read_uint (s
, &l
);
719 if (num
== EBML_UINT_INVALID
)
721 track
->v_dheight
= num
;
722 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display height: %u\n",
727 case MATROSKA_ID_VIDEOPIXELWIDTH
:
729 uint64_t num
= ebml_read_uint (s
, &l
);
730 if (num
== EBML_UINT_INVALID
)
732 track
->v_width
= num
;
733 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel width: %u\n",
738 case MATROSKA_ID_VIDEOPIXELHEIGHT
:
740 uint64_t num
= ebml_read_uint (s
, &l
);
741 if (num
== EBML_UINT_INVALID
)
743 track
->v_height
= num
;
744 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel height: %u\n",
750 ebml_read_skip (s
, &l
);
759 * \brief free any data associated with given track
760 * \param track track of which to free data
763 demux_mkv_free_trackentry(mkv_track_t
*track
) {
765 free (track
->codec_id
);
766 free (track
->language
);
767 free (track
->private_data
);
768 free (track
->audio_buf
);
769 free (track
->audio_timestamp
);
770 demux_mkv_free_encodings(track
->encodings
, track
->num_encodings
);
775 demux_mkv_read_trackentry (demuxer_t
*demuxer
)
777 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
778 stream_t
*s
= demuxer
->stream
;
780 uint64_t len
, length
, l
;
783 track
= calloc (1, sizeof (*track
));
784 /* set default values */
785 track
->default_track
= 1;
787 track
->language
= strdup("eng");
789 len
= length
= ebml_read_length (s
, &il
);
793 switch (ebml_read_id (s
, &il
))
795 case MATROSKA_ID_TRACKNUMBER
:
797 uint64_t num
= ebml_read_uint (s
, &l
);
798 if (num
== EBML_UINT_INVALID
)
801 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track number: %u\n",
806 case MATROSKA_ID_TRACKNAME
:
808 track
->name
= ebml_read_utf8 (s
, &l
);
809 if (track
->name
== NULL
)
811 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Name: %s\n",
816 case MATROSKA_ID_TRACKTYPE
:
818 uint64_t num
= ebml_read_uint (s
, &l
);
819 if (num
== EBML_UINT_INVALID
)
822 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track type: ");
825 case MATROSKA_TRACK_AUDIO
:
826 mp_msg (MSGT_DEMUX
, MSGL_V
, "Audio\n");
828 case MATROSKA_TRACK_VIDEO
:
829 mp_msg (MSGT_DEMUX
, MSGL_V
, "Video\n");
831 case MATROSKA_TRACK_SUBTITLE
:
832 mp_msg (MSGT_DEMUX
, MSGL_V
, "Subtitle\n");
835 mp_msg (MSGT_DEMUX
, MSGL_V
, "unknown\n");
841 case MATROSKA_ID_TRACKAUDIO
:
842 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Audio track\n");
843 l
= demux_mkv_read_trackaudio (demuxer
, track
);
848 case MATROSKA_ID_TRACKVIDEO
:
849 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Video track\n");
850 l
= demux_mkv_read_trackvideo (demuxer
, track
);
855 case MATROSKA_ID_CODECID
:
856 track
->codec_id
= ebml_read_ascii (s
, &l
);
857 if (track
->codec_id
== NULL
)
859 if (!strcmp (track
->codec_id
, MKV_V_MSCOMP
) ||
860 !strcmp (track
->codec_id
, MKV_A_ACM
))
861 track
->ms_compat
= 1;
862 else if (!strcmp (track
->codec_id
, MKV_S_VOBSUB
))
863 track
->subtitle_type
= MATROSKA_SUBTYPE_VOBSUB
;
864 else if (!strcmp (track
->codec_id
, MKV_S_TEXTSSA
)
865 || !strcmp (track
->codec_id
, MKV_S_TEXTASS
)
866 || !strcmp (track
->codec_id
, MKV_S_SSA
)
867 || !strcmp (track
->codec_id
, MKV_S_ASS
))
869 track
->subtitle_type
= MATROSKA_SUBTYPE_SSA
;
871 else if (!strcmp (track
->codec_id
, MKV_S_TEXTASCII
))
872 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
873 if (!strcmp (track
->codec_id
, MKV_S_TEXTUTF8
))
875 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
877 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Codec ID: %s\n",
881 case MATROSKA_ID_CODECPRIVATE
:
884 uint64_t num
= ebml_read_length (s
, &x
);
885 // audit: cheap guard against overflows later..
886 if (num
> SIZE_MAX
- 1000) return 0;
888 track
->private_data
= malloc (num
+ AV_LZO_INPUT_PADDING
);
889 if (stream_read(s
, track
->private_data
, num
) != (int) num
)
891 track
->private_size
= num
;
892 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + CodecPrivate, length "
893 "%u\n", track
->private_size
);
897 case MATROSKA_ID_TRACKLANGUAGE
:
898 free(track
->language
);
899 track
->language
= ebml_read_utf8 (s
, &l
);
900 if (track
->language
== NULL
)
902 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Language: %s\n",
906 case MATROSKA_ID_TRACKFLAGDEFAULT
:
908 uint64_t num
= ebml_read_uint (s
, &l
);
909 if (num
== EBML_UINT_INVALID
)
911 track
->default_track
= num
;
912 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default flag: %u\n",
913 track
->default_track
);
917 case MATROSKA_ID_TRACKDEFAULTDURATION
:
919 uint64_t num
= ebml_read_uint (s
, &l
);
920 if (num
== EBML_UINT_INVALID
)
923 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: 0");
926 track
->v_frate
= 1000000000.0 / num
;
927 track
->default_duration
= num
/ 1000000000.0;
928 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: "
929 "%.3fms ( = %.3f fps)\n",num
/1000000.0,track
->v_frate
);
934 case MATROSKA_ID_TRACKENCODINGS
:
935 l
= demux_mkv_read_trackencodings (demuxer
, track
);
941 ebml_read_skip (s
, &l
);
947 mkv_d
->tracks
[mkv_d
->num_tracks
++] = track
;
951 demux_mkv_free_trackentry(track
);
956 demux_mkv_read_tracks (demuxer_t
*demuxer
)
958 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
959 stream_t
*s
= demuxer
->stream
;
963 mkv_d
->tracks
= malloc (sizeof (*mkv_d
->tracks
));
964 mkv_d
->num_tracks
= 0;
966 length
= ebml_read_length (s
, NULL
);
969 switch (ebml_read_id (s
, &il
))
971 case MATROSKA_ID_TRACKENTRY
:
972 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + a track...\n");
973 mkv_d
->tracks
= realloc (mkv_d
->tracks
,
974 (mkv_d
->num_tracks
+1)
975 *sizeof (*mkv_d
->tracks
));
976 l
= demux_mkv_read_trackentry (demuxer
);
982 ebml_read_skip (s
, &l
);
991 demux_mkv_read_cues (demuxer_t
*demuxer
)
993 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
994 stream_t
*s
= demuxer
->stream
;
995 uint64_t length
, l
, time
, track
, pos
;
999 if (index_mode
== 0) {
1000 ebml_read_skip (s
, NULL
);
1003 off
= stream_tell (s
);
1004 for (i
=0; i
<mkv_d
->parsed_cues_num
; i
++)
1005 if (mkv_d
->parsed_cues
[i
] == off
)
1007 ebml_read_skip (s
, NULL
);
1010 mkv_d
->parsed_cues
= realloc (mkv_d
->parsed_cues
,
1011 (mkv_d
->parsed_cues_num
+1)
1013 mkv_d
->parsed_cues
[mkv_d
->parsed_cues_num
++] = off
;
1015 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing cues ] -----------\n");
1016 length
= ebml_read_length (s
, NULL
);
1020 time
= track
= pos
= EBML_UINT_INVALID
;
1022 switch (ebml_read_id (s
, &il
))
1024 case MATROSKA_ID_POINTENTRY
:
1028 len
= ebml_read_length (s
, &i
);
1036 switch (ebml_read_id (s
, &il
))
1038 case MATROSKA_ID_CUETIME
:
1039 time
= ebml_read_uint (s
, &l
);
1042 case MATROSKA_ID_CUETRACKPOSITION
:
1046 le
= ebml_read_length (s
, &i
);
1054 switch (ebml_read_id (s
, &il
))
1056 case MATROSKA_ID_CUETRACK
:
1057 track
= ebml_read_uint (s
, &l
);
1060 case MATROSKA_ID_CUECLUSTERPOSITION
:
1061 pos
= ebml_read_uint (s
, &l
);
1065 ebml_read_skip (s
, &l
);
1074 ebml_read_skip (s
, &l
);
1083 ebml_read_skip (s
, &l
);
1089 if (time
!= EBML_UINT_INVALID
&& track
!= EBML_UINT_INVALID
1090 && pos
!= EBML_UINT_INVALID
)
1092 mkv_d
->indexes
= grow_array(mkv_d
->indexes
, mkv_d
->num_indexes
,
1093 sizeof(mkv_index_t
));
1094 mkv_d
->indexes
[mkv_d
->num_indexes
].tnum
= track
;
1095 mkv_d
->indexes
[mkv_d
->num_indexes
].timecode
= time
;
1096 mkv_d
->indexes
[mkv_d
->num_indexes
].filepos
=mkv_d
->segment_start
+pos
;
1097 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] |+ found cue point "
1098 "for track %"PRIu64
": timecode %"PRIu64
", filepos: %"PRIu64
"\n",
1099 track
, time
, mkv_d
->segment_start
+ pos
);
1100 mkv_d
->num_indexes
++;
1104 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing cues ] -----------\n");
1108 static uint64_t read_one_chapter(struct demuxer
*demuxer
, stream_t
*s
)
1111 uint64_t start
= 0, end
= 0;
1112 struct matroska_chapter chapter
= {};
1117 len
= ebml_read_length(s
, &i
);
1118 uint64_t bytes_read
= len
+ i
;
1121 id
= ebml_read_id(s
, &i
);
1124 case MATROSKA_ID_CHAPTERTIMESTART
:
1125 start
= ebml_read_uint(s
, &l
) / 1000000;
1129 case MATROSKA_ID_CHAPTERTIMEEND
:
1130 end
= ebml_read_uint(s
, &l
) / 1000000;
1134 case MATROSKA_ID_CHAPTERDISPLAY
:;
1135 uint64_t displaylen
= ebml_read_length(s
, &i
);
1136 len
-= displaylen
+ i
;
1137 while (displaylen
> 0) {
1138 id
= ebml_read_id(s
, &i
);
1141 case MATROSKA_ID_CHAPSTRING
:
1142 name
= ebml_read_utf8(s
, &l
);
1145 ebml_read_skip(s
, &l
);
1152 case MATROSKA_ID_CHAPTERSEGMENTUID
:
1153 l
= ebml_read_length(s
, &i
);
1155 if (l
!= sizeof(chapter
.segment_uid
)) {
1156 mp_msg(MSGT_DEMUX
, MSGL_INFO
,
1157 "[mkv] chapter segment uid invalid length %"PRIu64
"\n",
1161 stream_read(s
, chapter
.segment_uid
, l
);
1162 chapter
.has_segment_uid
= true;
1163 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Chapter segment uid ");
1164 for (int i
= 0; i
< l
; i
++)
1165 mp_msg(MSGT_DEMUX
, MSGL_V
, "%02x ", chapter
.segment_uid
[i
]);
1166 mp_msg(MSGT_DEMUX
, MSGL_V
, "\n");
1171 ebml_read_skip(s
, &l
);
1178 name
= strdup("(unnamed)");
1180 int cid
= demuxer_add_chapter(demuxer
, name
, start
, end
);
1181 struct matroska_data
*m
= &demuxer
->matroska_data
;
1182 m
->ordered_chapters
= talloc_realloc(demuxer
, m
->ordered_chapters
,
1183 struct matroska_chapter
,
1184 m
->num_ordered_chapters
+ 1);
1185 chapter
.start
= start
;
1187 chapter
.name
= talloc_strdup(m
->ordered_chapters
, name
);
1188 // Will be undone later if this is a normal chapter rather than ordered
1189 m
->ordered_chapters
[m
->num_ordered_chapters
] = chapter
;
1190 m
->num_ordered_chapters
++;
1192 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Chapter %u from %02d:%02d:%02d."
1193 "%03d to %02d:%02d:%02d.%03d, %s\n",
1195 (int) (start
/ 60 / 60 / 1000),
1196 (int) ((start
/ 60 / 1000) % 60),
1197 (int) ((start
/ 1000) % 60),
1198 (int) (start
% 1000),
1199 (int) (end
/ 60 / 60 / 1000),
1200 (int) ((end
/ 60 / 1000) % 60),
1201 (int) ((end
/ 1000) % 60),
1202 (int) (end
% 1000), name
);
1208 static int demux_mkv_read_chapters(struct demuxer
*demuxer
)
1210 stream_t
*s
= demuxer
->stream
;
1215 if (demuxer
->chapters
) {
1216 ebml_read_skip(s
, NULL
);
1220 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing chapters ] ---------\n");
1221 length
= ebml_read_length(s
, NULL
);
1223 bool have_edition
= false;
1224 while (length
> 0) {
1225 id
= ebml_read_id(s
, &i
);
1228 case MATROSKA_ID_EDITIONENTRY
:
1230 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Multiple edition entries"
1231 " - ignoring all but first!\n");
1232 ebml_read_skip(s
, &l
);
1236 have_edition
= true;
1237 uint64_t editionlen
= ebml_read_length(s
, &i
);
1238 length
-= editionlen
+ i
;
1239 bool ordered
= false;
1240 while (editionlen
> 0) {
1241 id
= ebml_read_id(s
, &i
);
1244 case MATROSKA_ID_CHAPTERATOM
:
1245 l
= read_one_chapter(demuxer
, s
);
1247 case MATROSKA_ID_EDITIONFLAGORDERED
:
1248 ordered
= ebml_read_uint(s
, &l
);
1249 mp_msg(MSGT_DEMUX
, MSGL_V
,
1250 "[mkv] Ordered chapter flag: %d\n", ordered
);
1254 ebml_read_skip(s
, &l
);
1260 // The chapters should be interpreted as normal ones,
1261 // so undo the addition of this information.
1262 talloc_free(demuxer
->matroska_data
.ordered_chapters
);
1263 demuxer
->matroska_data
.ordered_chapters
= NULL
;
1264 demuxer
->matroska_data
.num_ordered_chapters
= 0;
1269 ebml_read_skip(s
, &l
);
1275 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing chapters ] ---------\n");
1280 demux_mkv_read_tags (demuxer_t
*demuxer
)
1282 ebml_read_skip (demuxer
->stream
, NULL
);
1287 demux_mkv_read_attachments (demuxer_t
*demuxer
)
1289 stream_t
*s
= demuxer
->stream
;
1293 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing attachments ] ---------\n");
1294 length
= ebml_read_length (s
, NULL
);
1298 switch (ebml_read_id (s
, &il
))
1300 case MATROSKA_ID_ATTACHEDFILE
:
1309 len
= ebml_read_length (s
, &i
);
1312 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + an attachment...\n");
1319 switch (ebml_read_id (s
, &il
))
1321 case MATROSKA_ID_FILENAME
:
1322 name
= ebml_read_utf8 (s
, &l
);
1325 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileName: %s\n",
1329 case MATROSKA_ID_FILEMIMETYPE
:
1330 mime
= ebml_read_ascii (s
, &l
);
1333 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileMimeType: %s\n",
1337 case MATROSKA_ID_FILEDATA
:
1340 uint64_t num
= ebml_read_length (s
, &x
);
1343 data
= malloc (num
);
1344 if (stream_read(s
, data
, num
) != (int) num
)
1350 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileData, length "
1356 ebml_read_skip (s
, &l
);
1362 demuxer_add_attachment(demuxer
, name
, mime
, data
, data_size
);
1363 mp_msg(MSGT_DEMUX
, MSGL_V
,
1364 "[mkv] Attachment: %s, %s, %u bytes\n",
1365 name
, mime
, data_size
);
1370 ebml_read_skip (s
, &l
);
1376 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing attachments ] ---------\n");
1381 demux_mkv_read_seekhead (demuxer_t
*demuxer
)
1383 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1384 stream_t
*s
= demuxer
->stream
;
1385 uint64_t length
, l
, seek_pos
, saved_pos
, num
;
1390 off
= stream_tell (s
);
1391 for (i
=0; i
<mkv_d
->parsed_seekhead_num
; i
++)
1392 if (mkv_d
->parsed_seekhead
[i
] == off
)
1394 ebml_read_skip (s
, NULL
);
1397 mkv_d
->parsed_seekhead
= realloc (mkv_d
->parsed_seekhead
,
1398 (mkv_d
->parsed_seekhead_num
+1)
1400 mkv_d
->parsed_seekhead
[mkv_d
->parsed_seekhead_num
++] = off
;
1402 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing seek head ] ---------\n");
1403 length
= ebml_read_length (s
, NULL
);
1404 /* off now holds the position of the next element after the seek head. */
1405 off
= stream_tell (s
) + length
;
1406 while (length
> 0 && !res
)
1410 seek_pos
= EBML_UINT_INVALID
;
1412 switch (ebml_read_id (s
, &il
))
1414 case MATROSKA_ID_SEEKENTRY
:
1418 len
= ebml_read_length (s
, &i
);
1426 switch (ebml_read_id (s
, &il
))
1428 case MATROSKA_ID_SEEKID
:
1429 num
= ebml_read_uint (s
, &l
);
1430 if (num
!= EBML_UINT_INVALID
)
1434 case MATROSKA_ID_SEEKPOSITION
:
1435 seek_pos
= ebml_read_uint (s
, &l
);
1439 ebml_read_skip (s
, &l
);
1449 ebml_read_skip (s
, &l
);
1454 if (seek_id
== 0 || seek_id
== MATROSKA_ID_CLUSTER
1455 || seek_pos
== EBML_UINT_INVALID
||
1456 ((mkv_d
->segment_start
+ seek_pos
) >= (uint64_t)demuxer
->movi_end
))
1459 saved_pos
= stream_tell (s
);
1460 if (!stream_seek (s
, mkv_d
->segment_start
+ seek_pos
))
1464 if (ebml_read_id (s
, &il
) != seek_id
)
1469 case MATROSKA_ID_CUES
:
1470 if (demux_mkv_read_cues (demuxer
))
1474 case MATROSKA_ID_TAGS
:
1475 if (demux_mkv_read_tags (demuxer
))
1479 case MATROSKA_ID_SEEKHEAD
:
1480 if (demux_mkv_read_seekhead (demuxer
))
1484 case MATROSKA_ID_CHAPTERS
:
1485 if (demux_mkv_read_chapters (demuxer
))
1491 stream_seek (s
, saved_pos
);
1495 /* If there was an error then try to skip this seek head. */
1496 if (stream_seek (s
, off
))
1501 stream_seek (s
, stream_tell (s
) + length
);
1502 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing seek head ] ---------\n");
1507 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
);
1509 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
);
1511 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
);
1514 display_create_tracks (demuxer_t
*demuxer
)
1516 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*)demuxer
->priv
;
1517 int i
, vid
=0, aid
=0, sid
=0;
1519 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
1521 char *type
= "unknown", str
[32];
1523 switch (mkv_d
->tracks
[i
]->type
)
1525 case MATROSKA_TRACK_VIDEO
:
1527 demux_mkv_open_video(demuxer
, mkv_d
->tracks
[i
], vid
);
1528 if (mkv_d
->tracks
[i
]->name
)
1529 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VID_%d_NAME=%s\n", vid
, mkv_d
->tracks
[i
]->name
);
1530 sprintf (str
, "-vid %u", vid
++);
1532 case MATROSKA_TRACK_AUDIO
:
1534 demux_mkv_open_audio(demuxer
, mkv_d
->tracks
[i
], aid
);
1535 if (mkv_d
->tracks
[i
]->name
)
1536 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_NAME=%s\n", aid
, mkv_d
->tracks
[i
]->name
);
1537 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_LANG=%s\n", aid
, mkv_d
->tracks
[i
]->language
);
1538 sprintf (str
, "-aid %u, -alang %.5s",aid
++,mkv_d
->tracks
[i
]->language
);
1540 case MATROSKA_TRACK_SUBTITLE
:
1542 demux_mkv_open_sub(demuxer
, mkv_d
->tracks
[i
], sid
);
1543 if (mkv_d
->tracks
[i
]->name
)
1544 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_NAME=%s\n", sid
, mkv_d
->tracks
[i
]->name
);
1545 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_LANG=%s\n", sid
, mkv_d
->tracks
[i
]->language
);
1546 sprintf (str
, "-sid %u, -slang %.5s",sid
++,mkv_d
->tracks
[i
]->language
);
1549 if (mkv_d
->tracks
[i
]->name
)
1550 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1551 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, mkv_d
->tracks
[i
]->name
, str
);
1553 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] Track ID %u: %s (%s), %s\n",
1554 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, str
);
1562 } videocodec_info_t
;
1564 static const videocodec_info_t vinfo
[] = {
1565 { MKV_V_MPEG1
, mmioFOURCC('m', 'p', 'g', '1'), 0 },
1566 { MKV_V_MPEG2
, mmioFOURCC('m', 'p', 'g', '2'), 0 },
1567 { MKV_V_MPEG4_SP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1568 { MKV_V_MPEG4_ASP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1569 { MKV_V_MPEG4_AP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1570 { MKV_V_MPEG4_AVC
, mmioFOURCC('a', 'v', 'c', '1'), 1 },
1571 { MKV_V_THEORA
, mmioFOURCC('t', 'h', 'e', 'o'), 1 },
1576 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
)
1578 struct MPOpts
*opts
= demuxer
->opts
;
1579 BITMAPINFOHEADER
*bih
;
1580 void *ImageDesc
= NULL
;
1583 if (track
->ms_compat
) /* MS compatibility mode */
1585 BITMAPINFOHEADER
*src
;
1587 if (track
->private_data
== NULL
1588 || track
->private_size
< sizeof (BITMAPINFOHEADER
))
1591 src
= (BITMAPINFOHEADER
*) track
->private_data
;
1592 bih
= calloc (1, track
->private_size
);
1593 bih
->biSize
= le2me_32 (src
->biSize
);
1594 bih
->biWidth
= le2me_32 (src
->biWidth
);
1595 bih
->biHeight
= le2me_32 (src
->biHeight
);
1596 bih
->biPlanes
= le2me_16 (src
->biPlanes
);
1597 bih
->biBitCount
= le2me_16 (src
->biBitCount
);
1598 bih
->biCompression
= le2me_32 (src
->biCompression
);
1599 bih
->biSizeImage
= le2me_32 (src
->biSizeImage
);
1600 bih
->biXPelsPerMeter
= le2me_32 (src
->biXPelsPerMeter
);
1601 bih
->biYPelsPerMeter
= le2me_32 (src
->biYPelsPerMeter
);
1602 bih
->biClrUsed
= le2me_32 (src
->biClrUsed
);
1603 bih
->biClrImportant
= le2me_32 (src
->biClrImportant
);
1604 memcpy((char *) bih
+ sizeof (BITMAPINFOHEADER
),
1605 (char *) src
+ sizeof (BITMAPINFOHEADER
),
1606 track
->private_size
- sizeof (BITMAPINFOHEADER
));
1608 if (track
->v_width
== 0)
1609 track
->v_width
= bih
->biWidth
;
1610 if (track
->v_height
== 0)
1611 track
->v_height
= bih
->biHeight
;
1615 bih
= calloc (1, sizeof (BITMAPINFOHEADER
));
1616 bih
->biSize
= sizeof (BITMAPINFOHEADER
);
1617 bih
->biWidth
= track
->v_width
;
1618 bih
->biHeight
= track
->v_height
;
1619 bih
->biBitCount
= 24;
1620 bih
->biSizeImage
= bih
->biWidth
* bih
->biHeight
* bih
->biBitCount
/8;
1622 if (track
->private_size
>= RVPROPERTIES_SIZE
1623 && (!strcmp (track
->codec_id
, MKV_V_REALV10
)
1624 || !strcmp (track
->codec_id
, MKV_V_REALV20
)
1625 || !strcmp (track
->codec_id
, MKV_V_REALV30
)
1626 || !strcmp (track
->codec_id
, MKV_V_REALV40
)))
1628 unsigned char *dst
, *src
;
1632 src
= track
->private_data
+ RVPROPERTIES_SIZE
;
1634 cnt
= track
->private_size
- RVPROPERTIES_SIZE
;
1635 bih
= realloc(bih
, sizeof (BITMAPINFOHEADER
)+8+cnt
);
1636 bih
->biSize
= 48+cnt
;
1638 type2
= AV_RB32(src
- 4);
1639 if (type2
== 0x10003000 || type2
== 0x10003001)
1640 bih
->biCompression
=mmioFOURCC('R','V','1','3');
1642 bih
->biCompression
=mmioFOURCC('R','V',track
->codec_id
[9],'0');
1643 dst
= (unsigned char *) (bih
+ 1);
1644 // copy type1 and type2 info from rv properties
1645 memcpy(dst
, src
- 8, 8);
1646 stream_read(demuxer
->stream
, dst
+8, cnt
);
1647 track
->realmedia
= 1;
1649 #ifdef CONFIG_QTX_CODECS
1651 else if (track
->private_size
>= sizeof (ImageDescription
)
1652 && !strcmp(track
->codec_id
, MKV_V_QUICKTIME
))
1654 ImageDescriptionPtr idesc
;
1656 idesc
= (ImageDescriptionPtr
) track
->private_data
;
1657 idesc
->idSize
= be2me_32 (idesc
->idSize
);
1658 idesc
->cType
= be2me_32 (idesc
->cType
);
1659 idesc
->version
= be2me_16 (idesc
->version
);
1660 idesc
->revisionLevel
= be2me_16 (idesc
->revisionLevel
);
1661 idesc
->vendor
= be2me_32 (idesc
->vendor
);
1662 idesc
->temporalQuality
= be2me_32 (idesc
->temporalQuality
);
1663 idesc
->spatialQuality
= be2me_32 (idesc
->spatialQuality
);
1664 idesc
->width
= be2me_16 (idesc
->width
);
1665 idesc
->height
= be2me_16 (idesc
->height
);
1666 idesc
->hRes
= be2me_32 (idesc
->hRes
);
1667 idesc
->vRes
= be2me_32 (idesc
->vRes
);
1668 idesc
->dataSize
= be2me_32 (idesc
->dataSize
);
1669 idesc
->frameCount
= be2me_16 (idesc
->frameCount
);
1670 idesc
->depth
= be2me_16 (idesc
->depth
);
1671 idesc
->clutID
= be2me_16 (idesc
->clutID
);
1673 bih
->biCompression
= idesc
->cType
;
1675 #endif /* CONFIG_QTX_CODECS */
1680 const videocodec_info_t
*vi
= vinfo
;
1681 while (vi
->id
&& strcmp(vi
->id
, track
->codec_id
)) vi
++;
1682 bih
->biCompression
= vi
->fourcc
;
1683 if (vi
->extradata
&& track
->private_data
&& (track
->private_size
> 0))
1685 bih
->biSize
+= track
->private_size
;
1686 bih
= realloc (bih
, bih
->biSize
);
1687 memcpy (bih
+ 1, track
->private_data
, track
->private_size
);
1689 track
->reorder_timecodes
= opts
->user_correct_pts
== 0;
1691 mp_tmsg (MSGT_DEMUX
,MSGL_WARN
, "[mkv] Unknown/unsupported CodecID (%s) or missing/bad CodecPrivate\n[mkv] data (track %u).\n",
1692 track
->codec_id
, track
->tnum
);
1699 sh_v
= new_sh_video_vid (demuxer
, track
->tnum
, vid
);
1701 sh_v
->format
= sh_v
->bih
->biCompression
;
1702 if (track
->v_frate
== 0.0)
1703 track
->v_frate
= 25.0;
1704 sh_v
->fps
= track
->v_frate
;
1705 sh_v
->frametime
= 1 / track
->v_frate
;
1707 if (!track
->realmedia
)
1709 sh_v
->disp_w
= track
->v_width
;
1710 sh_v
->disp_h
= track
->v_height
;
1711 if (track
->v_dheight
)
1712 sh_v
->aspect
= (double)track
->v_dwidth
/ track
->v_dheight
;
1716 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1717 // disp_w and disp_h from the RealVideo stream contents returned
1718 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1719 // the Matroska file then it has already been set to PixelWidth/Height
1720 // by check_track_information.
1721 sh_v
->disp_w
= track
->v_dwidth
;
1722 sh_v
->disp_h
= track
->v_dheight
;
1724 sh_v
->ImageDesc
= ImageDesc
;
1725 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Aspect: %f\n", sh_v
->aspect
);
1727 sh_v
->ds
= demuxer
->video
;
1732 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
)
1734 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1735 sh_audio_t
*sh_a
= new_sh_audio_aid(demuxer
, track
->tnum
, aid
);
1738 mkv_d
->audio_tracks
[mkv_d
->last_aid
] = track
->tnum
;
1740 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
1741 sh_a
->lang
= strdup(track
->language
);
1742 sh_a
->default_track
= track
->default_track
;
1743 sh_a
->ds
= demuxer
->audio
;
1744 sh_a
->wf
= malloc (sizeof (WAVEFORMATEX
));
1745 if (track
->ms_compat
&& (track
->private_size
>= sizeof(WAVEFORMATEX
)))
1747 WAVEFORMATEX
*wf
= (WAVEFORMATEX
*)track
->private_data
;
1748 sh_a
->wf
= realloc(sh_a
->wf
, track
->private_size
);
1749 sh_a
->wf
->wFormatTag
= le2me_16 (wf
->wFormatTag
);
1750 sh_a
->wf
->nChannels
= le2me_16 (wf
->nChannels
);
1751 sh_a
->wf
->nSamplesPerSec
= le2me_32 (wf
->nSamplesPerSec
);
1752 sh_a
->wf
->nAvgBytesPerSec
= le2me_32 (wf
->nAvgBytesPerSec
);
1753 sh_a
->wf
->nBlockAlign
= le2me_16 (wf
->nBlockAlign
);
1754 sh_a
->wf
->wBitsPerSample
= le2me_16 (wf
->wBitsPerSample
);
1755 sh_a
->wf
->cbSize
= track
->private_size
- sizeof(WAVEFORMATEX
);
1756 memcpy(sh_a
->wf
+ 1, wf
+ 1, track
->private_size
- sizeof(WAVEFORMATEX
));
1757 if (track
->a_sfreq
== 0.0)
1758 track
->a_sfreq
= sh_a
->wf
->nSamplesPerSec
;
1759 if (track
->a_channels
== 0)
1760 track
->a_channels
= sh_a
->wf
->nChannels
;
1761 if (track
->a_bps
== 0)
1762 track
->a_bps
= sh_a
->wf
->wBitsPerSample
;
1763 track
->a_formattag
= sh_a
->wf
->wFormatTag
;
1767 memset(sh_a
->wf
, 0, sizeof (WAVEFORMATEX
));
1768 if (!strcmp(track
->codec_id
, MKV_A_MP3
) ||
1769 !strcmp(track
->codec_id
, MKV_A_MP2
))
1770 track
->a_formattag
= 0x0055;
1771 else if (!strncmp(track
->codec_id
, MKV_A_AC3
, strlen(MKV_A_AC3
)))
1772 track
->a_formattag
= 0x2000;
1773 else if (!strcmp(track
->codec_id
, MKV_A_DTS
))
1774 track
->a_formattag
= 0x2001;
1775 else if (!strcmp(track
->codec_id
, MKV_A_PCM
) ||
1776 !strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1777 track
->a_formattag
= 0x0001;
1778 else if (!strcmp(track
->codec_id
, MKV_A_AAC_2MAIN
) ||
1779 !strncmp(track
->codec_id
, MKV_A_AAC_2LC
,
1780 strlen(MKV_A_AAC_2LC
)) ||
1781 !strcmp(track
->codec_id
, MKV_A_AAC_2SSR
) ||
1782 !strcmp(track
->codec_id
, MKV_A_AAC_4MAIN
) ||
1783 !strncmp(track
->codec_id
, MKV_A_AAC_4LC
,
1784 strlen(MKV_A_AAC_4LC
)) ||
1785 !strcmp(track
->codec_id
, MKV_A_AAC_4SSR
) ||
1786 !strcmp(track
->codec_id
, MKV_A_AAC_4LTP
) ||
1787 !strcmp(track
->codec_id
, MKV_A_AAC
))
1788 track
->a_formattag
= mmioFOURCC('M', 'P', '4', 'A');
1789 else if (!strcmp(track
->codec_id
, MKV_A_VORBIS
))
1791 if (track
->private_data
== NULL
)
1793 track
->a_formattag
= mmioFOURCC('v', 'r', 'b', 's');
1795 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
))
1796 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', 'C');
1797 else if (!strcmp(track
->codec_id
, MKV_A_QDMC2
))
1798 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', '2');
1799 else if (!strcmp(track
->codec_id
, MKV_A_WAVPACK
))
1800 track
->a_formattag
= mmioFOURCC('W', 'V', 'P', 'K');
1801 else if (!strcmp(track
->codec_id
, MKV_A_TRUEHD
))
1802 track
->a_formattag
= mmioFOURCC('T', 'R', 'H', 'D');
1803 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
))
1805 if (track
->private_data
== NULL
|| track
->private_size
== 0)
1807 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
,
1808 "[mkv] FLAC track does not contain valid headers.\n");
1811 track
->a_formattag
= mmioFOURCC ('f', 'L', 'a', 'C');
1813 else if (track
->private_size
>= RAPROPERTIES4_SIZE
)
1815 if (!strcmp(track
->codec_id
, MKV_A_REAL28
))
1816 track
->a_formattag
= mmioFOURCC('2', '8', '_', '8');
1817 else if (!strcmp(track
->codec_id
, MKV_A_REALATRC
))
1818 track
->a_formattag
= mmioFOURCC('a', 't', 'r', 'c');
1819 else if (!strcmp(track
->codec_id
, MKV_A_REALCOOK
))
1820 track
->a_formattag
= mmioFOURCC('c', 'o', 'o', 'k');
1821 else if (!strcmp(track
->codec_id
, MKV_A_REALDNET
))
1822 track
->a_formattag
= mmioFOURCC('d', 'n', 'e', 't');
1823 else if (!strcmp(track
->codec_id
, MKV_A_REALSIPR
))
1824 track
->a_formattag
= mmioFOURCC('s', 'i', 'p', 'r');
1828 mp_tmsg (MSGT_DEMUX
, MSGL_WARN
, "[mkv] Unknown/unsupported audio codec ID '%s' for track %u or missing/faulty\n[mkv] private codec data.\n",
1829 track
->codec_id
, track
->tnum
);
1830 free_sh_audio(demuxer
, track
->tnum
);
1835 sh_a
->format
= track
->a_formattag
;
1836 sh_a
->wf
->wFormatTag
= track
->a_formattag
;
1837 sh_a
->channels
= track
->a_channels
;
1838 sh_a
->wf
->nChannels
= track
->a_channels
;
1839 sh_a
->samplerate
= (uint32_t) track
->a_sfreq
;
1840 sh_a
->wf
->nSamplesPerSec
= (uint32_t) track
->a_sfreq
;
1841 if (track
->a_bps
== 0)
1843 sh_a
->samplesize
= 2;
1844 sh_a
->wf
->wBitsPerSample
= 16;
1848 sh_a
->samplesize
= track
->a_bps
/ 8;
1849 sh_a
->wf
->wBitsPerSample
= track
->a_bps
;
1851 if (track
->a_formattag
== 0x0055) /* MP3 || MP2 */
1853 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1854 sh_a
->wf
->nBlockAlign
= 1152;
1856 else if ((track
->a_formattag
== 0x2000) || /* AC3 */
1857 (track
->a_formattag
== 0x2001)) /* DTS */
1862 else if (track
->a_formattag
== 0x0001) /* PCM || PCM_BE */
1864 sh_a
->wf
->nAvgBytesPerSec
= sh_a
->channels
* sh_a
->samplerate
*2;
1865 sh_a
->wf
->nBlockAlign
= sh_a
->wf
->nAvgBytesPerSec
;
1866 if (!strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1867 sh_a
->format
= mmioFOURCC('t', 'w', 'o', 's');
1869 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
) ||
1870 !strcmp(track
->codec_id
, MKV_A_QDMC2
))
1872 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1873 sh_a
->wf
->nBlockAlign
= 1486;
1874 track
->fix_i_bps
= 1;
1875 track
->qt_last_a_pts
= 0.0;
1876 if (track
->private_data
!= NULL
)
1878 sh_a
->codecdata
=malloc(track
->private_size
);
1879 memcpy (sh_a
->codecdata
, track
->private_data
,
1880 track
->private_size
);
1881 sh_a
->codecdata_len
= track
->private_size
;
1884 else if (track
->a_formattag
== mmioFOURCC('M', 'P', '4', 'A'))
1886 int profile
, srate_idx
;
1888 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1889 sh_a
->wf
->nBlockAlign
= 1024;
1891 if (!strcmp (track
->codec_id
, MKV_A_AAC
) &&
1892 (NULL
!= track
->private_data
))
1894 sh_a
->codecdata
=malloc(track
->private_size
);
1895 memcpy (sh_a
->codecdata
, track
->private_data
,
1896 track
->private_size
);
1897 sh_a
->codecdata_len
= track
->private_size
;
1901 /* Recreate the 'private data' */
1902 /* which faad2 uses in its initialization */
1903 srate_idx
= aac_get_sample_rate_index (sh_a
->samplerate
);
1904 if (!strncmp (&track
->codec_id
[12], "MAIN", 4))
1906 else if (!strncmp (&track
->codec_id
[12], "LC", 2))
1908 else if (!strncmp (&track
->codec_id
[12], "SSR", 3))
1912 sh_a
->codecdata
= malloc (5);
1913 sh_a
->codecdata
[0] = ((profile
+1) << 3) | ((srate_idx
&0xE) >> 1);
1914 sh_a
->codecdata
[1] = ((srate_idx
&0x1)<<7)|(track
->a_channels
<<3);
1916 if (strstr(track
->codec_id
, "SBR") != NULL
)
1918 /* HE-AAC (aka SBR AAC) */
1919 sh_a
->codecdata_len
= 5;
1921 sh_a
->samplerate
*= 2;
1922 sh_a
->wf
->nSamplesPerSec
*= 2;
1923 srate_idx
= aac_get_sample_rate_index(sh_a
->samplerate
);
1924 sh_a
->codecdata
[2] = AAC_SYNC_EXTENSION_TYPE
>> 3;
1925 sh_a
->codecdata
[3] = ((AAC_SYNC_EXTENSION_TYPE
&0x07)<<5) | 5;
1926 sh_a
->codecdata
[4] = (1 << 7) | (srate_idx
<< 3);
1927 track
->default_duration
= 1024.0 / (sh_a
->samplerate
/ 2);
1931 sh_a
->codecdata_len
= 2;
1932 track
->default_duration
= 1024.0 / sh_a
->samplerate
;
1935 else if (track
->a_formattag
== mmioFOURCC('v', 'r', 'b', 's')) /* VORBIS */
1937 sh_a
->wf
->cbSize
= track
->private_size
;
1938 sh_a
->wf
= realloc(sh_a
->wf
, sizeof(WAVEFORMATEX
) + sh_a
->wf
->cbSize
);
1939 memcpy((unsigned char *) (sh_a
->wf
+1), track
->private_data
, sh_a
->wf
->cbSize
);
1941 else if (track
->private_size
>= RAPROPERTIES4_SIZE
1942 && !strncmp (track
->codec_id
, MKV_A_REALATRC
, 7))
1944 /* Common initialization for all RealAudio codecs */
1945 unsigned char *src
= track
->private_data
;
1946 int codecdata_length
, version
;
1949 sh_a
->wf
->nAvgBytesPerSec
= 0; /* FIXME !? */
1951 version
= AV_RB16(src
+ 4);
1952 flavor
= AV_RB16(src
+ 22);
1953 track
->coded_framesize
= AV_RB32(src
+ 24);
1954 track
->sub_packet_h
= AV_RB16(src
+ 40);
1955 sh_a
->wf
->nBlockAlign
=
1956 track
->audiopk_size
= AV_RB16(src
+ 42);
1957 track
->sub_packet_size
= AV_RB16(src
+ 44);
1960 src
+= RAPROPERTIES4_SIZE
;
1965 src
+= RAPROPERTIES5_SIZE
;
1970 codecdata_length
= AV_RB32(src
);
1972 sh_a
->wf
->cbSize
= codecdata_length
;
1973 sh_a
->wf
= realloc (sh_a
->wf
,
1974 sizeof (WAVEFORMATEX
) +
1976 memcpy(((char *)(sh_a
->wf
+ 1)), src
, codecdata_length
);
1978 switch (track
->a_formattag
) {
1979 case mmioFOURCC('a', 't', 'r', 'c'):
1980 sh_a
->wf
->nAvgBytesPerSec
= atrc_fl2bps
[flavor
];
1981 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1982 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1983 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(double));
1985 case mmioFOURCC('c', 'o', 'o', 'k'):
1986 sh_a
->wf
->nAvgBytesPerSec
= cook_fl2bps
[flavor
];
1987 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1988 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1989 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(double));
1991 case mmioFOURCC('s', 'i', 'p', 'r'):
1992 sh_a
->wf
->nAvgBytesPerSec
= sipr_fl2bps
[flavor
];
1993 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
1994 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1995 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(double));
1997 case mmioFOURCC('2', '8', '_', '8'):
1998 sh_a
->wf
->nAvgBytesPerSec
= 3600;
1999 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
2000 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
2001 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(double));
2005 track
->realmedia
= 1;
2007 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
) ||
2008 (track
->a_formattag
== 0xf1ac))
2015 if (track
->a_formattag
== mmioFOURCC('f', 'L', 'a', 'C'))
2017 ptr
= track
->private_data
;
2018 size
= track
->private_size
;
2022 sh_a
->format
= mmioFOURCC('f', 'L', 'a', 'C');
2023 ptr
= track
->private_data
2024 + sizeof (WAVEFORMATEX
);
2025 size
= track
->private_size
- sizeof (WAVEFORMATEX
);
2027 if (size
< 4 || ptr
[0] != 'f' || ptr
[1] != 'L' ||
2028 ptr
[2] != 'a' || ptr
[3] != 'C')
2030 dp
= new_demux_packet (4);
2031 memcpy (dp
->buffer
, "fLaC", 4);
2035 dp
= new_demux_packet (size
);
2036 memcpy (dp
->buffer
, ptr
, size
);
2040 ds_add_packet (demuxer
->audio
, dp
);
2042 else if (track
->a_formattag
== mmioFOURCC('W', 'V', 'P', 'K') ||
2043 track
->a_formattag
== mmioFOURCC('T', 'R', 'H', 'D'))
2044 { /* do nothing, still works */ }
2045 else if (!track
->ms_compat
|| (track
->private_size
< sizeof(WAVEFORMATEX
)))
2047 free_sh_audio(demuxer
, track
->tnum
);
2055 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
)
2057 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_UNKNOWN
)
2061 sh_sub_t
*sh
= new_sh_sub_sid(demuxer
, track
->tnum
, sid
);
2064 if (track
->subtitle_type
== MATROSKA_SUBTYPE_VOBSUB
)
2066 if (track
->subtitle_type
== MATROSKA_SUBTYPE_SSA
)
2068 size
= track
->private_size
;
2069 m
= demux_mkv_decode (track
,track
->private_data
,&buffer
,&size
,2);
2072 free (track
->private_data
);
2073 track
->private_data
= buffer
;
2074 track
->private_size
= size
;
2076 sh
->extradata
=malloc(track
->private_size
);
2077 memcpy (sh
->extradata
, track
->private_data
,
2078 track
->private_size
);
2079 sh
->extradata_len
= track
->private_size
;
2080 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
2081 sh
->lang
= strdup(track
->language
);
2082 sh
->default_track
= track
->default_track
;
2086 mp_tmsg (MSGT_DEMUX
, MSGL_ERR
, "[mkv] Subtitle type '%s' is not supported.\n",
2095 demux_mkv_open (demuxer_t
*demuxer
)
2097 stream_t
*s
= demuxer
->stream
;
2098 mkv_demuxer_t
*mkv_d
;
2100 int i
, version
, cont
= 0;
2103 stream_seek(s
, s
->start_pos
);
2104 str
= ebml_read_header (s
, &version
);
2105 if (str
== NULL
|| strcmp (str
, "matroska") || version
> 2)
2107 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] no head found\n");
2112 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Found the head...\n");
2114 if (ebml_read_id (s
, NULL
) != MATROSKA_ID_SEGMENT
)
2116 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] but no segment :(\n");
2119 ebml_read_length (s
, NULL
); /* return bytes number until EOF */
2121 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] + a segment...\n");
2123 mkv_d
= calloc (1, sizeof (mkv_demuxer_t
));
2124 demuxer
->priv
= mkv_d
;
2125 mkv_d
->tc_scale
= 1000000;
2126 mkv_d
->segment_start
= stream_tell (s
);
2127 mkv_d
->parsed_cues
= malloc (sizeof (off_t
));
2128 mkv_d
->parsed_seekhead
= malloc (sizeof (off_t
));
2132 switch (ebml_read_id (s
, NULL
))
2134 case MATROSKA_ID_INFO
:
2135 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment information...\n");
2136 cont
= demux_mkv_read_info (demuxer
);
2139 case MATROSKA_ID_TRACKS
:
2140 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment tracks...\n");
2141 cont
= demux_mkv_read_tracks (demuxer
);
2144 case MATROSKA_ID_CUES
:
2145 cont
= demux_mkv_read_cues (demuxer
);
2148 case MATROSKA_ID_TAGS
:
2149 cont
= demux_mkv_read_tags (demuxer
);
2152 case MATROSKA_ID_SEEKHEAD
:
2153 cont
= demux_mkv_read_seekhead (demuxer
);
2156 case MATROSKA_ID_CHAPTERS
:
2157 cont
= demux_mkv_read_chapters (demuxer
);
2160 case MATROSKA_ID_ATTACHMENTS
:
2161 cont
= demux_mkv_read_attachments (demuxer
);
2164 case MATROSKA_ID_CLUSTER
:
2167 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ found cluster, headers are "
2168 "parsed completely :)\n");
2169 /* get the first cluster timecode */
2171 l
= ebml_read_length (s
, NULL
);
2172 while (ebml_read_id (s
, NULL
) != MATROSKA_ID_CLUSTERTIMECODE
)
2174 ebml_read_skip (s
, NULL
);
2175 if (stream_tell (s
) >= p
+ l
)
2178 if (stream_tell (s
) < p
+ l
)
2180 uint64_t num
= ebml_read_uint (s
, NULL
);
2181 if (num
== EBML_UINT_INVALID
)
2184 stream_seek (s
, p
- 4);
2192 ebml_read_skip (s
, NULL
);
2197 display_create_tracks (demuxer
);
2199 /* select video track */
2201 if (demuxer
->video
->id
== -1) /* automatically select a video track */
2203 /* search for a video track that has the 'default' flag set */
2204 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2205 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
2206 && mkv_d
->tracks
[i
]->default_track
)
2208 track
= mkv_d
->tracks
[i
];
2213 /* no track has the 'default' flag set */
2214 /* let's take the first video track */
2215 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2216 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
)
2218 track
= mkv_d
->tracks
[i
];
2222 else if (demuxer
->video
->id
!= -2) /* -2 = no video at all */
2223 track
= demux_mkv_find_track_by_num (mkv_d
, demuxer
->video
->id
,
2224 MATROSKA_TRACK_VIDEO
);
2226 if (track
&& demuxer
->v_streams
[track
->tnum
])
2228 mp_tmsg (MSGT_DEMUX
, MSGL_INFO
,
2229 "[mkv] Will play video track %u.\n", track
->tnum
);
2230 demuxer
->video
->id
= track
->tnum
;
2231 demuxer
->video
->sh
= demuxer
->v_streams
[track
->tnum
];
2235 mp_tmsg (MSGT_DEMUX
, MSGL_INFO
, "[mkv] No video track found/wanted.\n");
2236 demuxer
->video
->id
= -2;
2239 /* select audio track */
2242 /* search for an audio track that has the 'default' flag set */
2243 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2244 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
2245 && mkv_d
->tracks
[i
]->default_track
)
2247 track
= mkv_d
->tracks
[i
];
2252 /* no track has the 'default' flag set */
2253 /* let's take the first audio track */
2254 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2255 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
)
2257 track
= mkv_d
->tracks
[i
];
2261 if (track
&& demuxer
->a_streams
[track
->tnum
])
2263 demuxer
->audio
->id
= track
->tnum
;
2264 demuxer
->audio
->sh
= demuxer
->a_streams
[track
->tnum
];
2268 mp_tmsg (MSGT_DEMUX
, MSGL_INFO
, "[mkv] No audio track found/wanted.\n");
2269 demuxer
->audio
->id
= -2;
2273 if(demuxer
->audio
->id
!= -2)
2274 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2276 if(mkv_d
->tracks
[i
]->type
!= MATROSKA_TRACK_AUDIO
)
2278 if(demuxer
->a_streams
[track
->tnum
])
2281 if(mkv_d
->last_aid
== MAX_A_STREAMS
)
2286 if (s
->end_pos
== 0 || (mkv_d
->indexes
== NULL
&& index_mode
< 0))
2287 demuxer
->seekable
= 0;
2290 demuxer
->movi_start
= s
->start_pos
;
2291 demuxer
->movi_end
= s
->end_pos
;
2292 demuxer
->seekable
= 1;
2295 demuxer
->accurate_seek
= true;
2297 return DEMUXER_TYPE_MATROSKA
;
2301 demux_close_mkv (demuxer_t
*demuxer
)
2303 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2308 free_cached_dps (demuxer
);
2311 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2312 demux_mkv_free_trackentry(mkv_d
->tracks
[i
]);
2313 free (mkv_d
->tracks
);
2315 free (mkv_d
->indexes
);
2316 free (mkv_d
->cluster_positions
);
2317 free (mkv_d
->parsed_cues
);
2318 free (mkv_d
->parsed_seekhead
);
2324 demux_mkv_read_block_lacing (uint8_t *buffer
, uint64_t *size
,
2325 uint8_t *laces
, uint32_t **all_lace_sizes
)
2327 uint32_t total
= 0, *lace_size
;
2331 *all_lace_sizes
= NULL
;
2337 switch ((flags
& 0x06) >> 1)
2339 case 0: /* no lacing */
2341 lace_size
= calloc(*laces
, sizeof(uint32_t));
2342 lace_size
[0] = *size
;
2345 case 1: /* xiph lacing */
2346 case 2: /* fixed-size lacing */
2347 case 3: /* EBML lacing */
2351 lace_size
= calloc(*laces
, sizeof(uint32_t));
2353 switch ((flags
& 0x06) >> 1)
2355 case 1: /* xiph lacing */
2356 for (i
=0; i
< *laces
-1; i
++)
2361 lace_size
[i
] += *buffer
;
2363 } while (*buffer
++ == 0xFF);
2364 total
+= lace_size
[i
];
2366 lace_size
[i
] = *size
- total
;
2369 case 2: /* fixed-size lacing */
2370 for (i
=0; i
< *laces
; i
++)
2371 lace_size
[i
] = *size
/ *laces
;
2374 case 3: /* EBML lacing */
2377 uint64_t num
= ebml_read_vlen_uint (buffer
, &l
);
2378 if (num
== EBML_UINT_INVALID
) {
2385 total
= lace_size
[0] = num
;
2386 for (i
=1; i
< *laces
-1; i
++)
2389 snum
= ebml_read_vlen_int (buffer
, &l
);
2390 if (snum
== EBML_INT_INVALID
) {
2396 lace_size
[i
] = lace_size
[i
-1] + snum
;
2397 total
+= lace_size
[i
];
2399 lace_size
[i
] = *size
- total
;
2405 *all_lace_sizes
= lace_size
;
2410 handle_subtitles(demuxer_t
*demuxer
, mkv_track_t
*track
, char *block
,
2411 int64_t size
, uint64_t block_duration
, uint64_t timecode
)
2415 if (block_duration
== 0)
2417 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
2418 "[mkv] Warning: No BlockDuration for subtitle track found.\n");
2423 dp
= new_demux_packet(size
);
2424 memcpy(dp
->buffer
, block
, size
);
2425 dp
->pts
= timecode
/ 1000.0;
2426 dp
->endpts
= (timecode
+ block_duration
) / 1000.0;
2427 ds_add_packet(demuxer
->sub
, dp
);
2430 double real_fix_timestamp(unsigned char *buf
, unsigned int timestamp
, unsigned int format
, int64_t *kf_base
, int *kf_pts
, double *pts
);
2433 handle_realvideo (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2434 uint32_t size
, int block_bref
)
2436 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2438 uint32_t timestamp
= mkv_d
->last_pts
* 1000;
2440 dp
= new_demux_packet (size
);
2441 memcpy (dp
->buffer
, buffer
, size
);
2443 if (mkv_d
->v_skip_to_keyframe
)
2445 dp
->pts
= mkv_d
->last_pts
;
2446 track
->rv_kf_base
= 0;
2447 track
->rv_kf_pts
= timestamp
;
2450 dp
->pts
= real_fix_timestamp (dp
->buffer
, timestamp
,
2451 ((sh_video_t
*)demuxer
->video
->sh
)->bih
->biCompression
,
2452 &track
->rv_kf_base
, &track
->rv_kf_pts
, NULL
);
2453 dp
->pos
= demuxer
->filepos
;
2454 dp
->flags
= block_bref
? 0 : 0x10;
2456 ds_add_packet(demuxer
->video
, dp
);
2460 handle_realaudio (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2461 uint32_t size
, int block_bref
)
2463 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2464 int sps
= track
->sub_packet_size
;
2465 int sph
= track
->sub_packet_h
;
2466 int cfs
= track
->coded_framesize
;
2467 int w
= track
->audiopk_size
;
2468 int spc
= track
->sub_packet_cnt
;
2472 if ((track
->a_formattag
== mmioFOURCC('2', '8', '_', '8')) ||
2473 (track
->a_formattag
== mmioFOURCC('c', 'o', 'o', 'k')) ||
2474 (track
->a_formattag
== mmioFOURCC('a', 't', 'r', 'c')) ||
2475 (track
->a_formattag
== mmioFOURCC('s', 'i', 'p', 'r')))
2478 // spc = track->sub_packet_cnt = 0;
2479 switch (track
->a_formattag
) {
2480 case mmioFOURCC('2', '8', '_', '8'):
2481 for (x
= 0; x
< sph
/ 2; x
++)
2482 memcpy(track
->audio_buf
+ x
* 2 * w
+ spc
* cfs
, buffer
+ cfs
* x
, cfs
);
2484 case mmioFOURCC('c', 'o', 'o', 'k'):
2485 case mmioFOURCC('a', 't', 'r', 'c'):
2486 for (x
= 0; x
< w
/ sps
; x
++)
2487 memcpy(track
->audio_buf
+ sps
* (sph
* x
+ ((sph
+ 1) / 2) * (spc
& 1) + (spc
>> 1)), buffer
+ sps
* x
, sps
);
2489 case mmioFOURCC('s', 'i', 'p', 'r'):
2490 memcpy(track
->audio_buf
+ spc
* w
, buffer
, w
);
2494 int bs
= sph
* w
* 2 / 96; // nibbles per subpacket
2495 // Perform reordering
2496 for(n
=0; n
< 38; n
++)
2499 int i
= bs
* sipr_swaps
[n
][0];
2500 int o
= bs
* sipr_swaps
[n
][1];
2501 // swap nibbles of block 'i' with 'o' TODO: optimize
2502 for(j
= 0;j
< bs
; j
++)
2504 int x
= (i
& 1) ? (track
->audio_buf
[i
>> 1] >> 4) : (track
->audio_buf
[i
>> 1] & 0x0F);
2505 int y
= (o
& 1) ? (track
->audio_buf
[o
>> 1] >> 4) : (track
->audio_buf
[o
>> 1] & 0x0F);
2507 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0x0F) | (x
<< 4);
2509 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0xF0) | x
;
2511 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0x0F) | (y
<< 4);
2513 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0xF0) | y
;
2520 track
->audio_timestamp
[track
->sub_packet_cnt
] = (track
->ra_pts
== mkv_d
->last_pts
) ? 0 : (mkv_d
->last_pts
);
2521 track
->ra_pts
= mkv_d
->last_pts
;
2522 if (track
->sub_packet_cnt
== 0)
2523 track
->audio_filepos
= demuxer
->filepos
;
2524 if (++(track
->sub_packet_cnt
) == sph
)
2526 int apk_usize
= ((WAVEFORMATEX
*)((sh_audio_t
*)demuxer
->audio
->sh
)->wf
)->nBlockAlign
;
2527 track
->sub_packet_cnt
= 0;
2528 // Release all the audio packets
2529 for (x
= 0; x
< sph
*w
/apk_usize
; x
++)
2531 dp
= new_demux_packet(apk_usize
);
2532 memcpy(dp
->buffer
, track
->audio_buf
+ x
* apk_usize
, apk_usize
);
2533 /* Put timestamp only on packets that correspond to original audio packets in file */
2534 dp
->pts
= (x
* apk_usize
% w
) ? 0 : track
->audio_timestamp
[x
* apk_usize
/ w
];
2535 dp
->pos
= track
->audio_filepos
; // all equal
2536 dp
->flags
= x
? 0 : 0x10; // Mark first packet as keyframe
2537 ds_add_packet(demuxer
->audio
, dp
);
2540 } else { // Not a codec that require reordering
2541 dp
= new_demux_packet (size
);
2542 memcpy(dp
->buffer
, buffer
, size
);
2543 if (track
->ra_pts
== mkv_d
->last_pts
&& !mkv_d
->a_skip_to_keyframe
)
2546 dp
->pts
= mkv_d
->last_pts
;
2547 track
->ra_pts
= mkv_d
->last_pts
;
2549 dp
->pos
= demuxer
->filepos
;
2550 dp
->flags
= block_bref
? 0 : 0x10;
2551 ds_add_packet (demuxer
->audio
, dp
);
2555 /** Reorder timecodes and add cached demux packets to the queues.
2557 * Timecode reordering is needed if a video track contains B frames that
2558 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2559 * MPlayer doesn't like timestamps in display order. This function adjusts
2560 * the timestamp of cached frames (which are exactly one I/P frame followed
2561 * by one or more B frames) so that they are in coding order again.
2563 * Example: The track with 25 FPS contains four frames with the timecodes
2564 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2565 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2566 * B at 80ms and B at 120ms.
2568 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2570 * \param demuxer The Matroska demuxer struct for this instance.
2571 * \param track The track structure whose cache should be handled.
2574 flush_cached_dps (demuxer_t
*demuxer
, mkv_track_t
*track
)
2578 if (track
->num_cached_dps
== 0)
2583 for (i
= 1; i
< track
->num_cached_dps
; i
++)
2584 if (track
->cached_dps
[i
- 1]->pts
> track
->cached_dps
[i
]->pts
) {
2585 double tmp_pts
= track
->cached_dps
[i
- 1]->pts
;
2586 track
->cached_dps
[i
- 1]->pts
= track
->cached_dps
[i
]->pts
;
2587 track
->cached_dps
[i
]->pts
= tmp_pts
;
2592 for (i
= 0; i
< track
->num_cached_dps
; i
++)
2593 ds_add_packet (demuxer
->video
, track
->cached_dps
[i
]);
2594 track
->num_cached_dps
= 0;
2597 /** Cache video frames if timecodes have to be reordered.
2599 * Timecode reordering is needed if a video track contains B frames that
2600 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2601 * This function takes in a Matroska block read from the file, allocates a
2602 * demux packet for it, fills in its values, allocates space for storing
2603 * pointers to the cached demux packets and adds the packet to it. If
2604 * the packet contains an I or a P frame then ::flush_cached_dps is called
2605 * in order to send the old cached frames downstream.
2607 * \param demuxer The Matroska demuxer struct for this instance.
2608 * \param track The packet is meant for this track.
2609 * \param buffer The actual frame contents.
2610 * \param size The frame size in bytes.
2611 * \param block_bref A relative timecode (backward reference). If it is \c 0
2612 * then the frame is an I frame.
2613 * \param block_fref A relative timecode (forward reference). If it is \c 0
2614 * then the frame is either an I frame or a P frame depending on the value
2615 * of \a block_bref. Otherwise it's a B frame.
2618 handle_video_bframes (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2619 uint32_t size
, int block_bref
, int block_fref
)
2621 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2624 dp
= new_demux_packet (size
);
2625 memcpy(dp
->buffer
, buffer
, size
);
2626 dp
->pos
= demuxer
->filepos
;
2627 dp
->pts
= mkv_d
->last_pts
;
2628 if ((track
->num_cached_dps
> 0) && (dp
->pts
< track
->max_pts
))
2630 if (block_fref
== 0) /* I or P frame */
2631 flush_cached_dps (demuxer
, track
);
2632 if (block_bref
!= 0) /* I frame, don't cache it */
2634 if ((track
->num_cached_dps
+ 1) > track
->num_allocated_dps
)
2636 track
->cached_dps
= (demux_packet_t
**)
2637 realloc(track
->cached_dps
, (track
->num_cached_dps
+ 10) *
2638 sizeof(demux_packet_t
*));
2639 track
->num_allocated_dps
+= 10;
2641 track
->cached_dps
[track
->num_cached_dps
] = dp
;
2642 track
->num_cached_dps
++;
2643 if (dp
->pts
> track
->max_pts
)
2644 track
->max_pts
= dp
->pts
;
2648 handle_block (demuxer_t
*demuxer
, uint8_t *block
, uint64_t length
,
2649 uint64_t block_duration
, int64_t block_bref
, int64_t block_fref
, uint8_t simpleblock
)
2651 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2652 mkv_track_t
*track
= NULL
;
2653 demux_stream_t
*ds
= NULL
;
2654 uint64_t old_length
;
2656 uint32_t *lace_size
;
2657 uint8_t laces
, flags
;
2658 int i
, num
, tmp
, use_this_block
= 1;
2662 /* first byte(s): track num */
2663 num
= ebml_read_vlen_uint (block
, &tmp
);
2665 /* time (relative to cluster time) */
2666 time
= block
[0] << 8 | block
[1];
2669 old_length
= length
;
2671 if (demux_mkv_read_block_lacing (block
, &length
, &laces
, &lace_size
))
2673 block
+= old_length
- length
;
2675 tc
= (time
*mkv_d
->tc_scale
+mkv_d
->cluster_tc
) / 1000000.0 + 0.5;
2678 current_pts
= tc
/ 1000.0;
2680 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2681 if (mkv_d
->tracks
[i
]->tnum
== num
) {
2682 track
= mkv_d
->tracks
[i
];
2690 if (num
== demuxer
->audio
->id
)
2692 ds
= demuxer
->audio
;
2694 if (mkv_d
->a_skip_to_keyframe
)
2698 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2701 else if (block_bref
!= 0)
2704 else if (mkv_d
->v_skip_to_keyframe
)
2707 if (track
->fix_i_bps
&& use_this_block
)
2709 sh_audio_t
*sh
= (sh_audio_t
*) ds
->sh
;
2711 if (block_duration
!= 0)
2713 sh
->i_bps
= length
* 1000 / block_duration
;
2714 track
->fix_i_bps
= 0;
2716 else if (track
->qt_last_a_pts
== 0.0)
2717 track
->qt_last_a_pts
= current_pts
;
2718 else if(track
->qt_last_a_pts
!= current_pts
)
2720 sh
->i_bps
= length
/ (current_pts
- track
->qt_last_a_pts
);
2721 track
->fix_i_bps
= 0;
2725 else if (tc
< mkv_d
->skip_to_timecode
)
2727 else if (num
== demuxer
->video
->id
)
2729 ds
= demuxer
->video
;
2730 if (mkv_d
->v_skip_to_keyframe
)
2734 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2737 else if (block_bref
!= 0 || block_fref
!= 0)
2741 else if (num
== demuxer
->sub
->id
)
2744 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_VOBSUB
)
2746 if (!mkv_d
->v_skip_to_keyframe
)
2747 handle_subtitles (demuxer
, track
, block
, length
,
2748 block_duration
, tc
);
2757 mkv_d
->last_pts
= current_pts
;
2758 mkv_d
->last_filepos
= demuxer
->filepos
;
2760 for (i
=0; i
< laces
; i
++)
2762 if (ds
== demuxer
->video
&& track
->realmedia
)
2763 handle_realvideo (demuxer
, track
, block
, lace_size
[i
], block_bref
);
2764 else if (ds
== demuxer
->audio
&& track
->realmedia
)
2765 handle_realaudio (demuxer
, track
, block
, lace_size
[i
], block_bref
);
2766 else if (ds
== demuxer
->video
&& track
->reorder_timecodes
)
2767 handle_video_bframes (demuxer
, track
, block
, lace_size
[i
],
2768 block_bref
, block_fref
);
2771 int modified
, size
= lace_size
[i
];
2774 modified
= demux_mkv_decode (track
, block
, &buffer
, &size
, 1);
2777 dp
= new_demux_packet (size
);
2778 memcpy (dp
->buffer
, buffer
, size
);
2781 dp
->flags
= (block_bref
== 0 && block_fref
== 0) ? 0x10 : 0;
2782 /* If default_duration is 0, assume no pts value is known
2783 * for packets after the first one (rather than all pts
2784 * values being the same) */
2785 if (i
== 0 || track
->default_duration
)
2786 dp
->pts
= mkv_d
->last_pts
+ i
* track
->default_duration
;
2787 ds_add_packet (ds
, dp
);
2790 block
+= lace_size
[i
];
2793 if (ds
== demuxer
->video
)
2795 mkv_d
->v_skip_to_keyframe
= 0;
2796 mkv_d
->skip_to_timecode
= 0;
2798 else if (ds
== demuxer
->audio
)
2799 mkv_d
->a_skip_to_keyframe
= 0;
2810 demux_mkv_fill_buffer (demuxer_t
*demuxer
, demux_stream_t
*ds
)
2812 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2813 stream_t
*s
= demuxer
->stream
;
2819 while (mkv_d
->cluster_size
> 0)
2821 uint64_t block_duration
= 0, block_length
= 0;
2822 int64_t block_bref
= 0, block_fref
= 0;
2823 uint8_t *block
= NULL
;
2825 while (mkv_d
->blockgroup_size
> 0)
2827 switch (ebml_read_id (s
, &il
))
2829 case MATROSKA_ID_BLOCKDURATION
:
2831 block_duration
= ebml_read_uint (s
, &l
);
2832 if (block_duration
== EBML_UINT_INVALID
) {
2836 block_duration
*= mkv_d
->tc_scale
/ 1000000.0;
2840 case MATROSKA_ID_BLOCK
:
2841 block_length
= ebml_read_length (s
, &tmp
);
2843 if (block_length
> SIZE_MAX
- AV_LZO_INPUT_PADDING
) return 0;
2844 block
= malloc (block_length
+ AV_LZO_INPUT_PADDING
);
2845 demuxer
->filepos
= stream_tell (s
);
2846 if (stream_read (s
,block
,block_length
) != (int) block_length
)
2851 l
= tmp
+ block_length
;
2854 case MATROSKA_ID_REFERENCEBLOCK
:
2856 int64_t num
= ebml_read_int (s
, &l
);
2857 if (num
== EBML_INT_INVALID
) {
2868 case EBML_ID_INVALID
:
2873 ebml_read_skip (s
, &l
);
2876 mkv_d
->blockgroup_size
-= l
+ il
;
2877 mkv_d
->cluster_size
-= l
+ il
;
2882 int res
= handle_block (demuxer
, block
, block_length
,
2883 block_duration
, block_bref
, block_fref
, 0);
2891 if (mkv_d
->cluster_size
> 0)
2893 switch (ebml_read_id (s
, &il
))
2895 case MATROSKA_ID_CLUSTERTIMECODE
:
2897 uint64_t num
= ebml_read_uint (s
, &l
);
2898 if (num
== EBML_UINT_INVALID
)
2900 mkv_d
->cluster_tc
= num
* mkv_d
->tc_scale
;
2904 case MATROSKA_ID_BLOCKGROUP
:
2905 mkv_d
->blockgroup_size
= ebml_read_length (s
, &tmp
);
2909 case MATROSKA_ID_SIMPLEBLOCK
:
2912 block_length
= ebml_read_length (s
, &tmp
);
2913 block
= malloc (block_length
);
2914 demuxer
->filepos
= stream_tell (s
);
2915 if (stream_read (s
,block
,block_length
) != (int) block_length
)
2920 l
= tmp
+ block_length
;
2921 res
= handle_block (demuxer
, block
, block_length
,
2922 block_duration
, block_bref
, block_fref
, 1);
2924 mkv_d
->cluster_size
-= l
+ il
;
2929 else mkv_d
->cluster_size
+= l
+ il
;
2932 case EBML_ID_INVALID
:
2936 ebml_read_skip (s
, &l
);
2939 mkv_d
->cluster_size
-= l
+ il
;
2943 if (ebml_read_id (s
, &il
) != MATROSKA_ID_CLUSTER
)
2945 add_cluster_position(mkv_d
, stream_tell(s
)-il
);
2946 mkv_d
->cluster_size
= ebml_read_length (s
, NULL
);
2953 demux_mkv_seek (demuxer_t
*demuxer
, float rel_seek_secs
, float audio_delay
, int flags
)
2955 if (!(flags
& (SEEK_BACKWARD
| SEEK_FORWARD
))) {
2956 if (flags
& SEEK_ABSOLUTE
|| rel_seek_secs
< 0)
2957 flags
|= SEEK_BACKWARD
;
2959 flags
|= SEEK_FORWARD
;
2961 // Adjust the target a little bit to catch cases where the target position
2962 // specifies a keyframe with high, but not perfect, precision.
2963 rel_seek_secs
+= flags
& SEEK_FORWARD
? -0.005 : 0.005;
2965 free_cached_dps (demuxer
);
2966 if (!(flags
& SEEK_FACTOR
)) /* time in secs */
2968 mkv_index_t
*index
= NULL
;
2969 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2970 stream_t
*s
= demuxer
->stream
;
2971 int64_t target_timecode
= 0, diff
, min_diff
=0xFFFFFFFFFFFFFFFLL
;
2974 if (!(flags
& SEEK_ABSOLUTE
)) /* relative seek */
2975 target_timecode
= (int64_t) (mkv_d
->last_pts
* 1000.0);
2976 target_timecode
+= (int64_t)(rel_seek_secs
* 1000.0);
2977 if (target_timecode
< 0)
2978 target_timecode
= 0;
2980 if (mkv_d
->indexes
== NULL
) /* no index was found */
2982 uint64_t target_filepos
, cluster_pos
, max_pos
;
2984 target_filepos
= (uint64_t) (target_timecode
* mkv_d
->last_filepos
2985 / (mkv_d
->last_pts
* 1000.0));
2987 max_pos
= mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
-1];
2988 if (target_filepos
> max_pos
)
2990 if ((off_t
) max_pos
> stream_tell (s
))
2991 stream_seek (s
, max_pos
);
2993 stream_seek (s
, stream_tell (s
) + mkv_d
->cluster_size
);
2994 /* parse all the clusters upto target_filepos */
2995 while (!s
->eof
&& stream_tell(s
) < (off_t
) target_filepos
)
2997 switch (ebml_read_id (s
, &i
))
2999 case MATROSKA_ID_CLUSTER
:
3000 add_cluster_position(mkv_d
, (uint64_t) stream_tell(s
)-i
);
3003 case MATROSKA_ID_CUES
:
3004 demux_mkv_read_cues (demuxer
);
3007 ebml_read_skip (s
, NULL
);
3013 if (mkv_d
->indexes
== NULL
)
3015 cluster_pos
= mkv_d
->cluster_positions
[0];
3016 /* Let's find the nearest cluster */
3017 for (i
=0; i
< mkv_d
->num_cluster_pos
; i
++)
3019 diff
= mkv_d
->cluster_positions
[i
] - target_filepos
;
3020 if (flags
& SEEK_BACKWARD
&& diff
< 0 && -diff
< min_diff
)
3022 cluster_pos
= mkv_d
->cluster_positions
[i
];
3025 else if (flags
& SEEK_FORWARD
3026 && (diff
< 0 ? -1 * diff
: diff
) < min_diff
)
3028 cluster_pos
= mkv_d
->cluster_positions
[i
];
3029 min_diff
= diff
< 0 ? -1 * diff
: diff
;
3032 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3033 stream_seek (s
, cluster_pos
);
3038 int seek_id
= (demuxer
->video
->id
< 0) ? demuxer
->audio
->id
: demuxer
->video
->id
;
3040 /* let's find the entry in the indexes with the smallest */
3041 /* difference to the wanted timecode. */
3042 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
3043 if (mkv_d
->indexes
[i
].tnum
== seek_id
)
3045 diff
= target_timecode
-
3046 (int64_t)(mkv_d
->indexes
[i
].timecode
* mkv_d
->tc_scale
3049 if (flags
& SEEK_BACKWARD
) {
3050 // Seek backward: find the last index position
3051 // before target time
3052 if (diff
< 0 || diff
>= min_diff
)
3056 // Seek forward: find the first index position
3057 // after target time. If no such index exists, find last
3058 // position between current position and target time.
3060 if (min_diff
<= 0 && diff
<= min_diff
)
3063 else if (diff
>= FFMIN(target_timecode
- mkv_d
->last_pts
,
3068 index
= mkv_d
->indexes
+ i
;
3071 if (index
) /* We've found an entry. */
3073 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3074 stream_seek (s
, index
->filepos
);
3078 if (demuxer
->video
->id
>= 0)
3079 mkv_d
->v_skip_to_keyframe
= 1;
3080 if (flags
& SEEK_FORWARD
)
3081 mkv_d
->skip_to_timecode
= target_timecode
;
3083 mkv_d
->skip_to_timecode
= index
? index
->timecode
: 0;
3084 mkv_d
->a_skip_to_keyframe
= 1;
3086 demux_mkv_fill_buffer(demuxer
, NULL
);
3088 else if ((demuxer
->movi_end
<= 0) || !(flags
& SEEK_ABSOLUTE
))
3089 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3092 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3093 stream_t
*s
= demuxer
->stream
;
3094 uint64_t target_filepos
;
3095 mkv_index_t
*index
= NULL
;
3098 if (mkv_d
->indexes
== NULL
) /* no index was found */
3100 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3104 target_filepos
= (uint64_t)(demuxer
->movi_end
* rel_seek_secs
);
3105 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
3106 if (mkv_d
->indexes
[i
].tnum
== demuxer
->video
->id
)
3107 if ((index
== NULL
) ||
3108 ((mkv_d
->indexes
[i
].filepos
>= target_filepos
) &&
3109 ((index
->filepos
< target_filepos
) ||
3110 (mkv_d
->indexes
[i
].filepos
< index
->filepos
))))
3111 index
= &mkv_d
->indexes
[i
];
3116 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3117 stream_seek (s
, index
->filepos
);
3119 if (demuxer
->video
->id
>= 0)
3120 mkv_d
->v_skip_to_keyframe
= 1;
3121 mkv_d
->skip_to_timecode
= index
->timecode
;
3122 mkv_d
->a_skip_to_keyframe
= 1;
3124 demux_mkv_fill_buffer(demuxer
, NULL
);
3129 demux_mkv_control (demuxer_t
*demuxer
, int cmd
, void *arg
)
3131 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3135 case DEMUXER_CTRL_CORRECT_PTS
:
3136 return DEMUXER_CTRL_OK
;
3137 case DEMUXER_CTRL_GET_TIME_LENGTH
:
3138 if (mkv_d
->duration
== 0)
3139 return DEMUXER_CTRL_DONTKNOW
;
3141 *((double *)arg
) = (double)mkv_d
->duration
;
3142 return DEMUXER_CTRL_OK
;
3144 case DEMUXER_CTRL_GET_PERCENT_POS
:
3145 if (mkv_d
->duration
== 0)
3147 return DEMUXER_CTRL_DONTKNOW
;
3150 *((int *) arg
) = (int) (100 * mkv_d
->last_pts
/ mkv_d
->duration
);
3151 return DEMUXER_CTRL_OK
;
3153 case DEMUXER_CTRL_SWITCH_AUDIO
:
3154 if (demuxer
->audio
&& demuxer
->audio
->sh
) {
3155 sh_audio_t
*sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3156 int aid
= *(int*)arg
;
3158 aid
= (sh
->aid
+ 1) % mkv_d
->last_aid
;
3159 if (aid
!= sh
->aid
) {
3160 mkv_track_t
*track
= demux_mkv_find_track_by_num (mkv_d
, aid
, MATROSKA_TRACK_AUDIO
);
3162 demuxer
->audio
->id
= track
->tnum
;
3163 sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3164 ds_free_packs(demuxer
->audio
);
3167 *(int*)arg
= sh
->aid
;
3170 return DEMUXER_CTRL_OK
;
3173 return DEMUXER_CTRL_NOTIMPL
;
3177 const demuxer_desc_t demuxer_desc_matroska
= {
3183 DEMUXER_TYPE_MATROSKA
,
3184 1, // safe autodetect
3186 demux_mkv_fill_buffer
,